From 9d0df0de3d8dfd1087f7b6dcb1ffb311f6e8b6ef Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 4 Oct 2016 15:02:51 -0700 Subject: [PATCH 001/100] Sync and fine grained notifications --- .dir-locals.el | 7 + .gitignore | 1 + .gitmodules | 4 +- README.md | 11 +- .../xcshareddata/Realm.xcscmblueprint | 11 +- binding.gyp | 105 +++++ docs/realm.js | 4 + docs/sync.js | 93 +++++ examples/ReactExample/components/realm.js | 1 + examples/ReactExample/components/todo-app.js | 19 +- examples/sync.js | 46 +++ lib/index.js | 16 +- lib/sync.js | 143 +++++++ package.json | 21 +- scripts/build-node-pre-gyp.sh | 46 +++ scripts/download-core.sh | 2 +- scripts/test.sh | 34 +- src/RealmJS.xcodeproj/project.pbxproj | 92 +++-- .../xcshareddata/xcschemes/RealmNode.xcscheme | 63 +-- src/js_collection.hpp | 37 +- src/js_list.hpp | 73 +++- src/js_observable.hpp | 35 ++ src/js_realm.hpp | 15 +- src/js_results.hpp | 82 +++- src/js_sync.hpp | 226 +++++++++++ src/js_types.hpp | 9 + src/jsc/jsc_protected.hpp | 26 ++ src/jsc/jsc_types.hpp | 1 + src/node/binding.gyp | 85 ----- src/node/build-node.sh | 28 -- src/node/gyp/realm.gyp | 89 +++++ src/node/gyp/target_defaults.gypi | 42 ++ src/node/node_init.cpp | 1 + src/node/node_init.hpp | 2 - src/node/node_protected.hpp | 8 +- src/node/node_sync_logger.cpp | 94 +++++ src/node/node_sync_logger.hpp | 89 +++++ src/node/node_types.hpp | 1 + src/node/node_uv_async.hpp | 104 +++++ src/node/node_value.hpp | 2 +- test.js | 85 +++++ tests/.gitignore | 2 + tests/index.js | 7 +- tests/ios/RJSModuleLoader.h | 1 + tests/ios/RJSModuleLoader.m | 12 + tests/ios/RealmJSCoreTests.m | 64 +++- tests/js/async-tests.js | 360 ++++++++++++++++++ tests/js/package.json | 5 +- tests/js/realm-tests.js | 2 +- tests/js/worker-tests-script.js | 41 +- tests/js/worker-tests.js | 76 ---- tests/js/worker.js | 4 +- tests/package.json | 16 + tests/react-test-app/index.ios.js | 30 ++ .../xcschemes/ReactTestApp.xcscheme | 7 + tests/react-test-app/package.json | 8 +- tests/spec/helpers/reporters.js | 9 + tests/spec/support/jasmine.json | 11 + tests/spec/sync_integration_tests.js | 99 +++++ tests/spec/unit_tests.js | 79 ++++ vendor/.gitignore | 1 + 61 files changed, 2327 insertions(+), 360 deletions(-) create mode 100644 .dir-locals.el create mode 100644 binding.gyp create mode 100644 docs/sync.js create mode 100644 examples/sync.js create mode 100644 lib/sync.js create mode 100755 scripts/build-node-pre-gyp.sh create mode 100644 src/js_observable.hpp create mode 100644 src/js_sync.hpp delete mode 100644 src/node/binding.gyp delete mode 100755 src/node/build-node.sh create mode 100644 src/node/gyp/realm.gyp create mode 100644 src/node/gyp/target_defaults.gypi create mode 100644 src/node/node_sync_logger.cpp create mode 100644 src/node/node_sync_logger.hpp create mode 100644 src/node/node_uv_async.hpp create mode 100644 test.js create mode 100644 tests/.gitignore create mode 100644 tests/js/async-tests.js delete mode 100644 tests/js/worker-tests.js create mode 100644 tests/package.json create mode 100644 tests/spec/helpers/reporters.js create mode 100644 tests/spec/support/jasmine.json create mode 100644 tests/spec/sync_integration_tests.js create mode 100644 tests/spec/unit_tests.js create mode 100644 vendor/.gitignore diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 00000000..b2e4be37 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,7 @@ +;; Project specific Emacs settings +((nil . ((c-basic-offset . 4) + (indent-tabs-mode . nil) + (fill-column . 80) + (c-file-style . "ellemtel") + (c-file-offsets . ((innamespace . 0))) + (show-trailing-whitespace . t)))) diff --git a/.gitignore b/.gitignore index 5d675635..c585b641 100644 --- a/.gitignore +++ b/.gitignore @@ -98,6 +98,7 @@ build/ # node.js node_modules/ npm-debug.log +/compiled/ # Android/IJ /android/ diff --git a/.gitmodules b/.gitmodules index 1475d7b4..af4fc586 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,5 +6,5 @@ url = https://github.com/realm/realm-jsdoc.git [submodule "src/object-store"] path = src/object-store - url = https://github.com/realm/realm-object-store.git - branch = js + url = git@github.com:realm/realm-object-store-private.git + branch = js-sync diff --git a/README.md b/README.md index f918c851..4bc70c95 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Prerequisites: First clone this repository: ``` -git clone https://github.com/realm/realm-js.git +git clone https://github.com/realm/realm-js-private.git ``` Then in the cloned directory: @@ -60,6 +60,15 @@ To build for Android: - `./gradlew publishAndroid` - The compiled version of the Android module is here: `/android` +To build for Node: +- `REALM_CORE_PREFIX=/path/to/realm-core REALM_SYNC_PREFIX=/path/to/realm-sync npm install` + +The `REALM_*_PREFIX` paths need to be absolute. Make sure to run `sh build.sh build-node` in both core and sync. Optionally export `REALMJS_USE_DEBUG_CORE=true` to link against the debug version of the realm binaries. + +To build the Developer Edition of the module, pass `--developer_edition` to `npm install` or change the default value in `binding.gyp`. + +`node-pre-gyp` is used for packaging. Run `scripts/build-node-pre-gyp.sh` with the same arguments and environment variables as `npm install` on all platforms (e.g. Linux and Darwin). Then, edit `package.json` to remove the `--build-from-source` option from the install script and run `npm pack`. Lastly, either create a fat package by merging all the tarballs created so far into one, or upload the `node-pre-gyp` tarballs to the CDN the `binary` section of `package.json` points to. + ## Code of Conduct This project adheres to the Contributor Covenant [code of conduct](https://realm.io/conduct/). diff --git a/Realm.xcworkspace/xcshareddata/Realm.xcscmblueprint b/Realm.xcworkspace/xcshareddata/Realm.xcscmblueprint index 3a7fb82e..ab8ab04a 100644 --- a/Realm.xcworkspace/xcshareddata/Realm.xcscmblueprint +++ b/Realm.xcworkspace/xcshareddata/Realm.xcscmblueprint @@ -5,12 +5,14 @@ }, "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { "40F53A12E4AE40C654358321B91166ABD3E910A6" : 0, - "F6F96CA34C5878B0A9123C7C37855491A5E599DA" : 0 + "F6F96CA34C5878B0A9123C7C37855491A5E599DA" : 0, + "8F3C415DA79CDA7D23734F285B95F9F9A3C0CB81" : 0 }, "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "5EE721F9-041C-4877-9E73-A925C9DB080A", "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { "40F53A12E4AE40C654358321B91166ABD3E910A6" : "realm-js\/", - "F6F96CA34C5878B0A9123C7C37855491A5E599DA" : "realm-js\/vendor\/GCDWebServer\/" + "F6F96CA34C5878B0A9123C7C37855491A5E599DA" : "realm-js\/vendor\/GCDWebServer\/", + "8F3C415DA79CDA7D23734F285B95F9F9A3C0CB81" : "realm-js\/src\/object-store\/" }, "DVTSourceControlWorkspaceBlueprintNameKey" : "Realm", "DVTSourceControlWorkspaceBlueprintVersion" : 204, @@ -21,6 +23,11 @@ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "40F53A12E4AE40C654358321B91166ABD3E910A6" }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/realm\/realm-object-store.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "8F3C415DA79CDA7D23734F285B95F9F9A3C0CB81" + }, { "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/swisspol\/GCDWebServer.git", "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 00000000..9570c888 --- /dev/null +++ b/binding.gyp @@ -0,0 +1,105 @@ +{ + "includes": [ + "src/node/gyp/target_defaults.gypi", + "src/node/gyp/realm.gyp" + ], + "targets": [ + { + "variables": { + "developer_edition%": "0" + }, + "target_name": "realm", + "dependencies": [ + "object-store" + ], + "sources": [ + "src/node/node_sync_logger.cpp", + "src/node/node_init.cpp", + "src/node/platform.cpp", + "src/js_realm.cpp" + ], + "include_dirs": [ + "src" + ], + "defines": [ "REALM_DEVELOPER_EDITION=<(developer_edition)" ], + "link_settings": { + "ldflags": [ + "-Wl,--exclude-libs=ALL" + ] + }, + "xcode_settings": { + "OTHER_LDFLAGS": [ "-Xlinker -unexported_symbol -Xlinker '*'" ] + } + }, + { + "variables": { + "object-store-include-dirs": [ + "src/object-store/src", + "src/object-store/src/impl", + "src/object-store/src/impl/apple", + "src/object-store/src/parser", + "src/object-store/external/pegtl" + ] + }, + "target_name": "object-store", + "dependencies": [ "realm-sync" ], # sync also includes core + "type": "static_library", + "include_dirs": [ "<@(object-store-include-dirs)" ], + "sources": [ + "src/object-store/src/collection_notifications.cpp", + "src/object-store/src/index_set.cpp", + "src/object-store/src/list.cpp", + "src/object-store/src/object_schema.cpp", + "src/object-store/src/object_store.cpp", + "src/object-store/src/results.cpp", + "src/object-store/src/schema.cpp", + "src/object-store/src/shared_realm.cpp", + "src/object-store/src/sync_manager.cpp", + "src/object-store/src/sync_session.cpp", + "src/object-store/src/thread_confined.cpp", + "src/object-store/src/global_notifier.cpp", + "src/object-store/src/impl/collection_change_builder.cpp", + "src/object-store/src/impl/collection_notifier.cpp", + "src/object-store/src/impl/handover.cpp", + "src/object-store/src/impl/list_notifier.cpp", + "src/object-store/src/impl/realm_coordinator.cpp", + "src/object-store/src/impl/results_notifier.cpp", + "src/object-store/src/impl/transact_log_handler.cpp", + "src/object-store/src/impl/weak_realm_notifier.cpp", + "src/object-store/src/parser/parser.cpp", + "src/object-store/src/parser/query_builder.cpp", + "src/object-store/src/util/format.cpp", + "src/object-store/src/util/thread_id.cpp" + ], + "conditions": [ + ["OS=='linux'", { + "sources": [ + "src/object-store/src/impl/android/external_commit_helper.cpp", + ] + }], + ["OS=='mac'", { + "sources": [ + "src/object-store/src/impl/apple/external_commit_helper.cpp" + ] + }] + ], + "all_dependent_settings": { + "include_dirs": [ "<@(object-store-include-dirs)" ] + }, + "export_dependent_settings": [ + "<@(_dependencies)" # re-export settings related to linking the realm binaries + ] + }, + { + "target_name": "action_after_build", + "type": "none", + "dependencies": [ "<(module_name)" ], + "copies": [ + { + "files": [ "<(PRODUCT_DIR)/<(module_name).node" ], + "destination": "<(module_path)" + } + ] + } + ] +} diff --git a/docs/realm.js b/docs/realm.js index c721a571..87beb336 100644 --- a/docs/realm.js +++ b/docs/realm.js @@ -189,6 +189,10 @@ Realm.defaultPath; * object types in this Realm. **Required** when first creating a Realm at this `path`. * @property {number} [schemaVersion] - **Required** (and must be incremented) after * changing the `schema`. + * @property {Object} [sync] - Sync configuration parameters with the following + * child properties: + * - `user` - A `User` object obtained by calling `Realm.Sync.User.login` + * - `url` - A `string` which contains a valid Realm Sync url */ /** diff --git a/docs/sync.js b/docs/sync.js new file mode 100644 index 00000000..bb113d40 --- /dev/null +++ b/docs/sync.js @@ -0,0 +1,93 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +/** + * @memberof Realm + */ +class Sync { +} + +/** + * Set a global listener function. + * @param {string} local_path - The path to the directory where realm files are stored [deprecated] + * @param {string} server_url - The sync server to listen to + * @param {SyncUser} admin_user - An admin user obtained by calling `new Realm.Sync.User.Admin` + * @param {function(realm_name)} filter_callback - Return true to recieve changes for the given realm + * @param {function(realm_name, realm, change_set)} change_callback - called on any realm changes with + * the following arguments: + * - `realm_name` - path of the Realm on which changes occurred + * - `realm` - a `Realm` object for the changed Realm + * - `change_set` - a dictionary of object names to arays of indexes indicating the indexes of objects of each type + * which have been added, removed, or modified + */ +Sync.setGlobalListener = function(local_path, server_url, admin_user, filter_callback, change_callback) {}; + +/** + * Set the sync log level. + * @param {string} log_level + */ +Sync.setLogLevel = function(log_level) {}; + +/** + * @typedef Realm.Sync~LogLevel + * @type {("error"|"info"|"debug")} + */ + +/** + * Class for logging in and managing Sync users. + * @memberof Realm.Sync + */ +class User { + /** + * Login a sync user with username and password. + * @param {string} server - authentication server + * @param {string} username + * @param {string} password + * @param {function(error, user)} callback - called with the following arguments: + * - `error` - an Error object is provided on failure + * - `user` - a valid User object on success + */ + login(server, username, password, callback) {} + /** + * Login a sync user using an external login provider. + * @param {string} server - authentication server + * @param {string} provider - The provider type + * @param {string} providerToken - The access token for the given provider + * @param {function(error, User)} callback - called with the following arguments: + * - `error` - an Error object is provided on failure + * - `user` - a valid User object on success + */ + loginWithProvider(server, provider, providerToken, callback) {} + /** + * Create a new user using the username/password provider + * @param {string} server - authentication server + * @param {string} username + * @param {string} password + * @param {function(error, User)} callback - called with the following arguments: + * - `error` - an Error object is provided on failure + * - `user` - a valid User object on success + */ + create(server, username, password, callback) {} + /** + * Create an admin user for the given authentication server with an existing token + * @param {string} server - authentication server + * @param {string} adminToken - existing admin token + * @return {User} - admin user populated with the given token and server + */ + adminUser(server, adminToken) {} +} diff --git a/examples/ReactExample/components/realm.js b/examples/ReactExample/components/realm.js index 13d042ad..6e71639a 100644 --- a/examples/ReactExample/components/realm.js +++ b/examples/ReactExample/components/realm.js @@ -34,6 +34,7 @@ TodoList.schema = { name: 'TodoList', properties: { name: 'string', + creationDate: 'date', items: {type: 'list', objectType: 'Todo'}, }, }; diff --git a/examples/ReactExample/components/todo-app.js b/examples/ReactExample/components/todo-app.js index c0d03f70..d2ff4fe4 100644 --- a/examples/ReactExample/components/todo-app.js +++ b/examples/ReactExample/components/todo-app.js @@ -38,15 +38,18 @@ export default class TodoApp extends React.Component { constructor(props) { super(props); - let todoLists = realm.objects('TodoList'); - if (todoLists.length < 1) { + // This is a Results object, which will live-update. + this.todoLists = realm.objects('TodoList').sorted('creationDate'); + if (this.todoLists.length < 1) { realm.write(() => { - realm.create('TodoList', {name: 'Todo List'}); + realm.create('TodoList', {name: 'Todo List', creationDate: new Date()}); }); } + this.todoLists.addListener((name, changes) => { + console.log("changed: " + JSON.stringify(changes)); + }); + console.log("registered listener"); - // This is a Results object, which will live-update. - this.todoLists = todoLists; // Bind all the methods that we will be passing as props. this.renderScene = this.renderScene.bind(this); @@ -79,7 +82,6 @@ export default class TodoApp extends React.Component { component: TodoListView, passProps: { ref: 'listView', - items: this.todoLists, extraItems: extraItems, onPressItem: this._onPressTodoList, }, @@ -105,7 +107,8 @@ export default class TodoApp extends React.Component { } renderScene(route) { - return + console.log(this.todoLists); + return } _addNewTodoItem(list) { @@ -128,7 +131,7 @@ export default class TodoApp extends React.Component { } realm.write(() => { - realm.create('TodoList', {name: ''}); + realm.create('TodoList', {name: '', creationDate: new Date()}); }); this._setEditingRow(items.length - 1); diff --git a/examples/sync.js b/examples/sync.js new file mode 100644 index 00000000..6ddbf945 --- /dev/null +++ b/examples/sync.js @@ -0,0 +1,46 @@ +'use strict'; + +var Realm = require('..'); + +var filename = "sync.realm"; +var syncUrl = "realm://127.0.0.1/nodejs/sync.realm"; +var syncUserToken = "eyJpZGVudGl0eSI6Im5vZGVqcy1kZW1vIn0K"; + +function Foo() {} +Foo.schema = { + name: 'Foo', + properties: { + name: Realm.Types.STRING, + number: Realm.Types.INT, + } +}; + +var realm = new Realm({ + path: filename, + syncUrl: syncUrl, + syncUserToken: syncUserToken, + schema: [Foo] +}); + +console.log('Starting...'); + +var prompt = require('prompt'); +prompt.start(); + +var run = true; +var my_prompt = function() { + prompt.get(['command'], function (err, result) { + if (err) { return onErr(err); } + console.log('Command: ' + result.command); + if (result.command == 'exit') { + run = false; + } + + if (run) { + my_prompt(); + } + }); +}; + +my_prompt(); + diff --git a/lib/index.js b/lib/index.js index 6f91fa5b..69643e20 100644 --- a/lib/index.js +++ b/lib/index.js @@ -18,7 +18,10 @@ 'use strict'; -var arrayMethods = require('./collection-methods'); +function node_require(module) { + return require(module); +} + var realmConstructor; if (typeof Realm != 'undefined') { @@ -31,14 +34,19 @@ if (typeof Realm != 'undefined') { // eslint-disable-next-line } else if (typeof process == 'object' && (('' + process) == '[object process]' || typeof jest == 'object')) { // Prevent React Native packager from seeing this module. - var bindings = 'bindings'; - realmConstructor = require(bindings)('realm').Realm; + var binary = node_require('node-pre-gyp'); + var path = node_require('path'); + var binding_path = binary.find(path.resolve(path.join(__dirname,'../package.json'))); + realmConstructor = require(binding_path).Realm; } else { throw new Error('Missing Realm constructor - please ensure RealmReact framework is included!'); } // Add the specified Array methods to the Collection prototype. -Object.defineProperties(realmConstructor.Collection.prototype, arrayMethods); +Object.defineProperties(realmConstructor.Collection.prototype, require('./collection-methods')); + +// Add sync methods +realmConstructor.Sync.User = require('./sync').User; // TODO: Remove this now useless object. var types = Object.freeze({ diff --git a/lib/sync.js b/lib/sync.js new file mode 100644 index 00000000..2cd0c5aa --- /dev/null +++ b/lib/sync.js @@ -0,0 +1,143 @@ +'use strict'; + +function node_require(module) { + return require(module); +} + +var post; +if (typeof fetch != 'undefined') { + post = function(options, callback) { + options.method = 'POST'; + fetch(options.url, options) + .then((response) => { + if (response.status != 200) { + callback(undefined, {statusCode: response.status}); + } + else { + return response.text(); + } + }) + .then((body) => { + callback(undefined, {statusCode: 200}, body) + }) + .catch((error) => { + callback(error); + }); + } +} +else { + post = node_require('request').post; +} + +const url = require("url"); + +const postHeaders = { + 'content-type': 'application/json;charset=utf-8', + 'accept': 'application/json' +}; + +function _authenticate(server, json, callback) { + json.app_id = ''; + var options = { + url: server + 'auth', + body: JSON.stringify(json), + headers: postHeaders + }; + post(options, function(error, response, body) { + if (error) { + console.log(error); + callback(error); + } + else if (response.statusCode != 200) { + console.log('Bad response: ' + response.statusCode); + callback(new Error('Bad response: ' + response.statusCode)); + } + else { + var rjson = JSON.parse(body); + // TODO: validate JSON + + const token = rjson.refresh_token.token; + const identity = rjson.refresh_token.token_data.identity; + callback(undefined, new User(server, identity, token)); + } + }); +} + +function User(server, identity, token) { + this.server = server; + this.identity = identity; + this.token = token; + this.isAdmin = false; + + User.activeUsers[identity] = this; +} + +User.adminUser = function(server, token) { + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + var user = new User(server, uuid, token); + user.isAdmin = true; + return user; +} + +User.activeUsers = {}; + +User.login = function(server, username, password, callback) { + _authenticate(server, { + provider: 'password', + user_info: { password: password }, + data: username + }, callback); +} + +User.loginWithProvider = function(server, provider, providerToken, callback) { + _authenticate(server, { + provider: provider, + data: providerToken + }, callback); +} + +User.create = function(server, username, password, callback) { + _authenticate(server, { + provider: 'password', + user_info: { password: password, register: true }, + data: username + }, callback); +} + +User.authenticateRealm = function(fileUrl, realmUrl, callback) { + var options = { + url: this.server + 'auth', + body: JSON.stringify({ + data: this.token, + path: url.parse(realmUrl).path, + provider: 'realm', + app_id: '' + }), + headers: postHeaders + }; + post(options, function(error, response, body) { + if (error) { + console.log(error); + callback(error); + } + else if (response.statusCode != 200) { + console.log('Bad response: ' + response.statusCode + body); + callback(new Error('Bad response: ' + response.statusCode)); + } + else { + var json = JSON.parse(body); + // TODO: validate JSON + + callback(undefined, { + token: json.access_token.token, + file_url: url.parse(fileUrl).path, + resolved_realm_url: 'realm://' + url.parse(realmUrl).host + json.access_token.token_data.path + }); + } + }); +} + +exports['User'] = User; diff --git a/package.json b/package.json index f9e97acd..4cc27420 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "realm", "description": "Realm is a mobile database: an alternative to SQLite and key-value stores", - "version": "0.14.3", + "version": "0.14.3-6", "license": "Apache-2.0", "homepage": "https://realm.io", "keywords": [ @@ -35,7 +35,8 @@ "react-native", "scripts", "src", - "vendor" + "vendor", + "binding.gyp" ], "scripts": { "get-version": "echo $npm_package_version", @@ -44,20 +45,20 @@ "jsdoc": "rm -rf docs/output && jsdoc -c docs/conf.json", "lint": "eslint", "test": "scripts/test.sh", - "prepublish": "scripts/prepublish.sh" + "install": "node-pre-gyp install --build-from-source" }, "dependencies": { - "bindings": "^1.2.1", "nan": "^2.3.3", - "node-gyp": "^3.3.1", - "sync-request": "^3.0.1" + "node-pre-gyp": "^0.6.30", + "request": "^2.74.0", + "sync-request": "^3.0.1", + "url": "^0.11.0" }, "devDependencies": { "babel-eslint": "^6.0.4", "eslint": "^2.10.2", "eslint-plugin-react": "^5.1.1", "jsdoc": "^3.4.0", - "mockery": "^1.7.0", "semver": "^5.1.0" }, "rnpm": { @@ -71,5 +72,11 @@ }, "engines": { "node": ">=4" + }, + "binary": { + "module_name": "realm", + "module_path": "./compiled/{node_abi}_{platform}_{arch}/", + "host": "https://static.realm.io", + "remote_path": "/node-pre-gyp" } } diff --git a/scripts/build-node-pre-gyp.sh b/scripts/build-node-pre-gyp.sh new file mode 100755 index 00000000..569f2acb --- /dev/null +++ b/scripts/build-node-pre-gyp.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +node_versions=${@:-4.4.7 5.12.0 6.5.0} + +topdir=$(cd $(dirname "$0")/..; pwd) + +die() { + echo $1 + exit 1 +} + +. ${topdir}/dependencies.list + +mkdir -p ${topdir}/out +: ${NVM_DIR=$topdir/.nvm} + +if [ ! -d "$NVM_DIR" ]; then + ( + git clone https://github.com/creationix/nvm.git "$NVM_DIR" + cd "$NVM_DIR" + git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" origin` + ) +fi + +if [ -f "$NVM_DIR/nvm.sh" ]; then + . "$NVM_DIR/nvm.sh" +else + # we must be on mac and nvm was installed with brew + # TODO: change the mac slaves to use manual nvm installation + . "$(brew --prefix nvm)/nvm.sh" +fi + +for node_version in ${node_versions}; do + ( + rm -rf node_modules build + + nvm install ${node_version} || die "Could not install nodejs v${node_version}" + nvm use ${node_version} || die "Could not load nodejs v${node_version}" + + npm install "$EXTRA_NPM_ARGUMENTS" || die "Could not build module" + #./scripts/test.sh node || die "Unit tests for nodejs v${node_version} failed" + ./node_modules/.bin/node-pre-gyp package || die "Could not package module" + cp build/stage/node-pre-gyp/*.tar.gz ${topdir}/out/ + ) +done + diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 2adf4b57..4723a701 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -4,7 +4,7 @@ set -e set -o pipefail # Set to "latest" for the latest build. -: ${REALM_CORE_VERSION:=1.5.0} +: ${REALM_CORE_VERSION:=2.0.0-rc4} if [ "$1" = '--version' ]; then echo "$REALM_CORE_VERSION" diff --git a/scripts/test.sh b/scripts/test.sh index c6f74f3f..6fffa740 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -154,21 +154,16 @@ case "$TARGET" in cat tests.xml ;; "node") - npm install - scripts/download-core.sh node - src/node/build-node.sh $CONFIGURATION - # Change to a temp directory. cd "$(mktemp -q -d -t realm.node.XXXXXX)" trap "rm -rf '$PWD'" EXIT - node "$SRCROOT/tests" + pushd "$SRCROOT/tests" + npm install + npm test + popd ;; "test-runners") - npm install - scripts/download-core.sh node - src/node/build-node.sh $CONFIGURATION - for runner in ava mocha jest; do pushd "$SRCROOT/tests/test-runners/$runner" npm install @@ -181,6 +176,27 @@ case "$TARGET" in cmake -DCMAKE_BUILD_TYPE=$CONFIGURATION . make run-tests ;; +"download-object-server") + . dependencies.list + + object_server_bundle="realm-object-server-bundled_node_darwin-$REALM_OBJECT_SERVER_VERSION.tar.gz" + curl -f -L "https://static.realm.io/downloads/object-server/$object_server_bundle" -o "$object_server_bundle" + rm -rf tests/sync-bundle + mkdir -p tests/sync-bundle + tar -C tests/sync-bundle -xf "$object_server_bundle" + rm "$object_server_bundle" + + echo -e "enterprise:\n skip_setup: true\n" >> "tests/sync-bundle/object-server/configuration.yml" + touch "tests/sync-bundle/object-server/do_not_open_browser" + ;; +"object-server-integration") + echo -e "yes\n" | ./tests/sync-bundle/reset-server-realms.command + + pushd "$SRCROOT/tests" + npm install + npm run test-sync + popd + ;; *) echo "Invalid target '${TARGET}'" exit 1 diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 0ccdd01c..0f025d37 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 020229861D9EEB39000F0C4F /* global_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 020229661D9DBF02000F0C4F /* global_notifier.cpp */; }; + 020229871D9EEB39000F0C4F /* sync_metadata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 020229801D9EEAF2000F0C4F /* sync_metadata.cpp */; }; + 020229881D9EEB39000F0C4F /* sync_session.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 020229821D9EEAF2000F0C4F /* sync_session.cpp */; }; 02409DC21BCF11D6005F3B3E /* RealmJSCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */; }; 02414B881CE68CA200A8669F /* dates-v5.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02414B871CE68CA200A8669F /* dates-v5.realm */; }; 02414BA51CE6ABCF00A8669F /* collection_change_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B991CE6AAEF00A8669F /* collection_change_builder.cpp */; }; @@ -14,6 +17,8 @@ 02414BA71CE6ABCF00A8669F /* list_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B9D1CE6AAEF00A8669F /* list_notifier.cpp */; }; 02414BA81CE6ABCF00A8669F /* results_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B9F1CE6AAEF00A8669F /* results_notifier.cpp */; }; 02414BA91CE6ABCF00A8669F /* collection_notifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B961CE6AADD00A8669F /* collection_notifications.cpp */; }; + 02443E391D8AF936007B0DF4 /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02443E361D8AF8FB007B0DF4 /* sync_manager.cpp */; }; + 02443E421D8AFB74007B0DF4 /* weak_realm_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02443E401D8AFB5F007B0DF4 /* weak_realm_notifier.cpp */; }; 0270BC821B7D020100010E03 /* RealmJSTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC7B1B7D020100010E03 /* RealmJSTests.mm */; }; 027A23131CD3E379000543AE /* libRealmJS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */; }; 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02D041F61CE11159000E4250 /* dates-v3.realm */; }; @@ -29,9 +34,9 @@ 02F59ECA1C88F190007F774C /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EC61C88F190007F774C /* parser.cpp */; }; 02F59ECB1C88F190007F774C /* query_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EC81C88F190007F774C /* query_builder.cpp */; }; 02F59ED41C88F1B6007F774C /* external_commit_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59ECF1C88F1B6007F774C /* external_commit_helper.cpp */; }; - 02F59ED51C88F1B6007F774C /* weak_realm_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59ED11C88F1B6007F774C /* weak_realm_notifier.cpp */; }; 02F59EE21C88F2BB007F774C /* realm_coordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EDB1C88F2BA007F774C /* realm_coordinator.cpp */; }; 02F59EE31C88F2BB007F774C /* transact_log_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */; }; + 5D25F5A11D6284FD00EBBB30 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF3301C16434400B3B8E0 /* libz.tbd */; }; 5DC74A781D623C9800D77A4F /* handover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A751D623C8700D77A4F /* handover.cpp */; }; 5DC74A791D623CA200D77A4F /* handover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A751D623C8700D77A4F /* handover.cpp */; }; 5DC74A7A1D623CA800D77A4F /* thread_confined.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A721D623C7A00D77A4F /* thread_confined.cpp */; }; @@ -53,7 +58,6 @@ F61378791C18EAC5008BFC51 /* js in Resources */ = {isa = PBXBuildFile; fileRef = F61378781C18EAAC008BFC51 /* js */; }; F620F0581CB766DA0082977B /* node_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F620F0571CB766DA0082977B /* node_init.cpp */; }; F620F0751CB9F60C0082977B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F620F0741CB9F60C0082977B /* CoreFoundation.framework */; }; - F63117F01CEB0D5F00ECB2DE /* weak_realm_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F63117EE1CEB0D5900ECB2DE /* weak_realm_notifier.cpp */; }; F63FF2C61C12469E00B3B8E0 /* jsc_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029048011C0428DF00ABDED4 /* jsc_init.cpp */; }; F63FF2C91C12469E00B3B8E0 /* js_realm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029048071C0428DF00ABDED4 /* js_realm.cpp */; }; F63FF2CD1C12469E00B3B8E0 /* rpc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0290480F1C0428DF00ABDED4 /* rpc.cpp */; }; @@ -98,6 +102,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 020229661D9DBF02000F0C4F /* global_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = global_notifier.cpp; path = src/global_notifier.cpp; sourceTree = ""; }; + 020229671D9DBF02000F0C4F /* global_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = global_notifier.hpp; path = src/global_notifier.hpp; sourceTree = ""; }; + 020229801D9EEAF2000F0C4F /* sync_metadata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_metadata.cpp; path = src/sync_metadata.cpp; sourceTree = ""; }; + 020229811D9EEAF2000F0C4F /* sync_metadata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_metadata.hpp; path = src/sync_metadata.hpp; sourceTree = ""; }; + 020229821D9EEAF2000F0C4F /* sync_session.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_session.cpp; path = src/sync_session.cpp; sourceTree = ""; }; + 020229831D9EEAF2000F0C4F /* sync_session.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_session.hpp; path = src/sync_session.hpp; sourceTree = ""; }; 02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RealmJSCoreTests.m; path = ios/RealmJSCoreTests.m; sourceTree = ""; }; 02414B871CE68CA200A8669F /* dates-v5.realm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "dates-v5.realm"; sourceTree = ""; }; 02414B961CE6AADD00A8669F /* collection_notifications.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = collection_notifications.cpp; path = src/collection_notifications.cpp; sourceTree = ""; }; @@ -110,6 +120,12 @@ 02414B9E1CE6AAEF00A8669F /* list_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = list_notifier.hpp; sourceTree = ""; }; 02414B9F1CE6AAEF00A8669F /* results_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = results_notifier.cpp; sourceTree = ""; }; 02414BA01CE6AAEF00A8669F /* results_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = results_notifier.hpp; sourceTree = ""; }; + 02443E351D8AF8FB007B0DF4 /* sync_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_config.hpp; path = src/sync_config.hpp; sourceTree = ""; }; + 02443E361D8AF8FB007B0DF4 /* sync_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_manager.cpp; path = src/sync_manager.cpp; sourceTree = ""; }; + 02443E371D8AF8FB007B0DF4 /* sync_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_manager.hpp; path = src/sync_manager.hpp; sourceTree = ""; }; + 02443E3A1D8AFAD1007B0DF4 /* sync_client.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sync_client.hpp; sourceTree = ""; }; + 02443E401D8AFB5F007B0DF4 /* weak_realm_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weak_realm_notifier.cpp; sourceTree = ""; }; + 0250D9C01D7647E00012C20C /* js_sync.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = js_sync.hpp; sourceTree = ""; }; 025678951CAB392000FB8501 /* jsc_types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = jsc_types.hpp; sourceTree = ""; }; 0270BC5A1B7CFC1300010E03 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 0270BC781B7D020100010E03 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ios/Info.plist; sourceTree = ""; }; @@ -127,6 +143,7 @@ 029048101C0428DF00ABDED4 /* rpc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rpc.hpp; sourceTree = ""; }; 029048351C042A3C00ABDED4 /* platform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = platform.hpp; sourceTree = ""; }; 029048381C042A8F00ABDED4 /* platform.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = platform.mm; sourceTree = ""; }; + 0290934A1CEFA9170009769E /* js_observable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = js_observable.hpp; sourceTree = ""; }; 02A3C7A41BC4341500B1A7BE /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RealmJSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; @@ -157,14 +174,12 @@ 02F59EC91C88F190007F774C /* query_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = query_builder.hpp; sourceTree = ""; }; 02F59ECF1C88F1B6007F774C /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; 02F59ED01C88F1B6007F774C /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; - 02F59ED11C88F1B6007F774C /* weak_realm_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weak_realm_notifier.cpp; sourceTree = ""; }; - 02F59ED21C88F1B6007F774C /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; 02F59EDA1C88F2BA007F774C /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; 02F59EDB1C88F2BA007F774C /* realm_coordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = realm_coordinator.cpp; sourceTree = ""; }; 02F59EDC1C88F2BB007F774C /* realm_coordinator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = realm_coordinator.hpp; sourceTree = ""; }; 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transact_log_handler.cpp; sourceTree = ""; }; 02F59EDE1C88F2BB007F774C /* transact_log_handler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transact_log_handler.hpp; sourceTree = ""; }; - 02F59EDF1C88F2BB007F774C /* weak_realm_notifier_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier_base.hpp; sourceTree = ""; }; + 02F59EDF1C88F2BB007F774C /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; 02F59EE01C88F2BB007F774C /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; 5DC74A721D623C7A00D77A4F /* thread_confined.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thread_confined.cpp; path = src/thread_confined.cpp; sourceTree = ""; }; 5DC74A731D623C7A00D77A4F /* thread_confined.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = thread_confined.hpp; path = src/thread_confined.hpp; sourceTree = ""; }; @@ -204,15 +219,10 @@ F6267BC91CADC30000AC36B1 /* js_util.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = js_util.hpp; sourceTree = ""; }; F6267BCA1CADC49200AC36B1 /* node_dummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node_dummy.cpp; sourceTree = ""; }; F62BF8FB1CAC71780022BCDC /* libRealmNode.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libRealmNode.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; - F63117EE1CEB0D5900ECB2DE /* weak_realm_notifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = weak_realm_notifier.cpp; sourceTree = ""; }; - F63117EF1CEB0D5900ECB2DE /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; F63118431CEBA7B700ECB2DE /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; F63118441CEBA7B700ECB2DE /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; - F63118451CEBA7B700ECB2DE /* weak_realm_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weak_realm_notifier.cpp; sourceTree = ""; }; - F63118461CEBA7B700ECB2DE /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; F631184A1CEBA7D800ECB2DE /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; F631184B1CEBA7D800ECB2DE /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; - F631184C1CEBA7D800ECB2DE /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRealmJS.a; sourceTree = BUILT_PRODUCTS_DIR; }; F63FF2F01C16405C00B3B8E0 /* libGCDWebServers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGCDWebServers.a; sourceTree = BUILT_PRODUCTS_DIR; }; F63FF2FD1C1642BB00B3B8E0 /* GCDWebServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServer.h; sourceTree = ""; }; @@ -266,6 +276,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 5D25F5A11D6284FD00EBBB30 /* libz.tbd in Frameworks */, 027A23131CD3E379000543AE /* libRealmJS.a in Frameworks */, 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */, ); @@ -297,11 +308,13 @@ F6874A441CAD2ACD00EEEE36 /* JSC */, F62BF9001CAC72C40022BCDC /* Node */, F62A35141C18E783004A917D /* Object Store */, + 0290934A1CEFA9170009769E /* js_observable.hpp */, F60102F71CBDA6D400EC01BA /* js_collection.hpp */, 029048041C0428DF00ABDED4 /* js_list.hpp */, 029048061C0428DF00ABDED4 /* js_realm_object.hpp */, 029048071C0428DF00ABDED4 /* js_realm.cpp */, 029048081C0428DF00ABDED4 /* js_realm.hpp */, + 0250D9C01D7647E00012C20C /* js_sync.hpp */, 0290480A1C0428DF00ABDED4 /* js_results.hpp */, 0290480C1C0428DF00ABDED4 /* js_schema.hpp */, F620F0521CAF0B600082977B /* js_class.hpp */, @@ -414,6 +427,8 @@ 02F59EAE1C88F17D007F774C /* binding_context.hpp */, 02F59EAF1C88F17D007F774C /* index_set.cpp */, 02F59EB01C88F17D007F774C /* index_set.hpp */, + 020229661D9DBF02000F0C4F /* global_notifier.cpp */, + 020229671D9DBF02000F0C4F /* global_notifier.hpp */, 02F59EB11C88F17D007F774C /* list.cpp */, 02F59EB21C88F17D007F774C /* list.hpp */, 02F59EB31C88F17D007F774C /* object_accessor.hpp */, @@ -430,6 +445,13 @@ 02F59EBE1C88F17D007F774C /* shared_realm.hpp */, 5DC74A721D623C7A00D77A4F /* thread_confined.cpp */, 5DC74A731D623C7A00D77A4F /* thread_confined.hpp */, + 02443E351D8AF8FB007B0DF4 /* sync_config.hpp */, + 02443E361D8AF8FB007B0DF4 /* sync_manager.cpp */, + 02443E371D8AF8FB007B0DF4 /* sync_manager.hpp */, + 020229801D9EEAF2000F0C4F /* sync_metadata.cpp */, + 020229811D9EEAF2000F0C4F /* sync_metadata.hpp */, + 020229821D9EEAF2000F0C4F /* sync_session.cpp */, + 020229831D9EEAF2000F0C4F /* sync_session.hpp */, ); name = "Object Store"; path = "object-store"; @@ -464,7 +486,6 @@ F63118421CEBA7A100ECB2DE /* android */, F63117EB1CEB0C1B00ECB2DE /* apple */, F63118491CEBA7BD00ECB2DE /* generic */, - F63117ED1CEB0CC600ECB2DE /* node */, 02414B991CE6AAEF00A8669F /* collection_change_builder.cpp */, 02414B9A1CE6AAEF00A8669F /* collection_change_builder.hpp */, 02414B9B1CE6AAEF00A8669F /* collection_notifier.cpp */, @@ -478,9 +499,11 @@ 02F59EDA1C88F2BA007F774C /* external_commit_helper.hpp */, 02F59EDB1C88F2BA007F774C /* realm_coordinator.cpp */, 02F59EDC1C88F2BB007F774C /* realm_coordinator.hpp */, + 02443E3A1D8AFAD1007B0DF4 /* sync_client.hpp */, 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */, 02F59EDE1C88F2BB007F774C /* transact_log_handler.hpp */, - 02F59EDF1C88F2BB007F774C /* weak_realm_notifier_base.hpp */, + 02F59EDF1C88F2BB007F774C /* weak_realm_notifier.hpp */, + 02443E401D8AFB5F007B0DF4 /* weak_realm_notifier.cpp */, 02F59EE01C88F2BB007F774C /* weak_realm_notifier.hpp */, ); name = impl; @@ -492,8 +515,6 @@ children = ( 02F59ECF1C88F1B6007F774C /* external_commit_helper.cpp */, 02F59ED01C88F1B6007F774C /* external_commit_helper.hpp */, - 02F59ED11C88F1B6007F774C /* weak_realm_notifier.cpp */, - 02F59ED21C88F1B6007F774C /* weak_realm_notifier.hpp */, ); path = apple; sourceTree = ""; @@ -510,22 +531,11 @@ path = src/parser; sourceTree = ""; }; - F63117ED1CEB0CC600ECB2DE /* node */ = { - isa = PBXGroup; - children = ( - F63117EE1CEB0D5900ECB2DE /* weak_realm_notifier.cpp */, - F63117EF1CEB0D5900ECB2DE /* weak_realm_notifier.hpp */, - ); - path = node; - sourceTree = ""; - }; F63118421CEBA7A100ECB2DE /* android */ = { isa = PBXGroup; children = ( F63118431CEBA7B700ECB2DE /* external_commit_helper.cpp */, F63118441CEBA7B700ECB2DE /* external_commit_helper.hpp */, - F63118451CEBA7B700ECB2DE /* weak_realm_notifier.cpp */, - F63118461CEBA7B700ECB2DE /* weak_realm_notifier.hpp */, ); path = android; sourceTree = ""; @@ -535,7 +545,6 @@ children = ( F631184A1CEBA7D800ECB2DE /* external_commit_helper.cpp */, F631184B1CEBA7D800ECB2DE /* external_commit_helper.hpp */, - F631184C1CEBA7D800ECB2DE /* weak_realm_notifier.hpp */, ); path = generic; sourceTree = ""; @@ -849,7 +858,6 @@ F6E931BC1CFEAE340016AF14 /* collection_notifier.cpp in Sources */, F60102DC1CBB96C900EC01BA /* query_builder.cpp in Sources */, F60102DD1CBB96CC00EC01BA /* external_commit_helper.cpp in Sources */, - F63117F01CEB0D5F00ECB2DE /* weak_realm_notifier.cpp in Sources */, F60102E11CBB96DD00EC01BA /* transact_log_handler.cpp in Sources */, F6E931BE1CFEAE3A0016AF14 /* results_notifier.cpp in Sources */, F60102D71CBB96B800EC01BA /* object_store.cpp in Sources */, @@ -870,6 +878,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 020229861D9EEB39000F0C4F /* global_notifier.cpp in Sources */, + 020229871D9EEB39000F0C4F /* sync_metadata.cpp in Sources */, + 020229881D9EEB39000F0C4F /* sync_session.cpp in Sources */, + 02443E421D8AFB74007B0DF4 /* weak_realm_notifier.cpp in Sources */, + 02443E391D8AF936007B0DF4 /* sync_manager.cpp in Sources */, 02E008D51D10ABB600F3AA37 /* format.cpp in Sources */, 5DC74A7A1D623CA800D77A4F /* thread_confined.cpp in Sources */, 02414BA51CE6ABCF00A8669F /* collection_change_builder.cpp in Sources */, @@ -887,7 +900,6 @@ 02F59ECA1C88F190007F774C /* parser.cpp in Sources */, 02F59EC01C88F17D007F774C /* list.cpp in Sources */, 02F59EBF1C88F17D007F774C /* index_set.cpp in Sources */, - 02F59ED51C88F1B6007F774C /* weak_realm_notifier.cpp in Sources */, F63FF2C91C12469E00B3B8E0 /* js_realm.cpp in Sources */, 02F59EC51C88F17D007F774C /* shared_realm.cpp in Sources */, 02F59ECB1C88F190007F774C /* query_builder.cpp in Sources */, @@ -1145,12 +1157,21 @@ isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + REALM_DEBUG, + REALM_HAVE_CONFIG, + __ASSERTMACROS__, + REALM_ENABLE_SYNC, + ); OTHER_CPLUSPLUSFLAGS = ( "$(inherited)", "-isystem", - ../core/include, + "../../realm-core/ios-lib/include", + "-isystem", + "../../realm-sync/src", ); - OTHER_LIBTOOLFLAGS = "$(SRCROOT)/../core/librealm-ios-dbg.a"; + OTHER_LIBTOOLFLAGS = "$(SRCROOT)/../../realm-core/ios-lib/librealm-ios-dbg.a $(SRCROOT)/../../realm-sync/src/realm/librealm-sync-iphonesimulator-dbg.a"; PRODUCT_NAME = RealmJS; SKIP_INSTALL = YES; }; @@ -1159,12 +1180,19 @@ F63FF2B91C1241E500B3B8E0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + REALM_HAVE_CONFIG, + __ASSERTMACROS__, + REALM_ENABLE_SYNC, + ); OTHER_CPLUSPLUSFLAGS = ( "$(inherited)", "-isystem", - ../core/include, + "../../realm-core/ios-lib/include", + "-isystem", + "../../realm-sync/src", ); - OTHER_LIBTOOLFLAGS = "$(SRCROOT)/../core/librealm-ios.a"; + OTHER_LIBTOOLFLAGS = "$(SRCROOT)/../../realm-core/ios-lib/librealm-ios.a $(SRCROOT)/../../realm-sync/src/realm/librealm-sync-iphonesimulator.a"; PRODUCT_NAME = RealmJS; SKIP_INSTALL = YES; }; diff --git a/src/RealmJS.xcodeproj/xcshareddata/xcschemes/RealmNode.xcscheme b/src/RealmJS.xcodeproj/xcshareddata/xcschemes/RealmNode.xcscheme index 590746e9..200fcccc 100644 --- a/src/RealmJS.xcodeproj/xcshareddata/xcschemes/RealmNode.xcscheme +++ b/src/RealmJS.xcodeproj/xcshareddata/xcschemes/RealmNode.xcscheme @@ -5,22 +5,6 @@ - - - - - - - - - - - - + + + + + + @@ -71,15 +55,6 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - - - - diff --git a/src/js_collection.hpp b/src/js_collection.hpp index 510333a7..9a758d18 100644 --- a/src/js_collection.hpp +++ b/src/js_collection.hpp @@ -19,6 +19,10 @@ #pragma once #include "js_class.hpp" +#include "js_types.hpp" +#include "js_observable.hpp" + +#include "collection_notifications.hpp" namespace realm { namespace js { @@ -27,9 +31,40 @@ namespace js { class Collection {}; template -struct CollectionClass : ClassDefinition { +struct CollectionClass : ClassDefinition> { + using ContextType = typename T::Context; + using ValueType = typename T::Value; + using ObjectType = typename T::Object; + using Object = js::Object; + using Value = js::Value; + std::string const name = "Collection"; + + static inline ValueType create_collection_change_set(ContextType ctx, const CollectionChangeSet &change_set); }; +template +typename T::Value CollectionClass::create_collection_change_set(ContextType ctx, const CollectionChangeSet &change_set) +{ + ObjectType object = Object::create_empty(ctx); + std::vector deletions, insertions, modifications; + for (auto index : change_set.deletions.as_indexes()) { + deletions.push_back(Value::from_number(ctx, index)); + } + Object::set_property(ctx, object, "deletions", Object::create_array(ctx, deletions)); + + for (auto index : change_set.insertions.as_indexes()) { + insertions.push_back(Value::from_number(ctx, index)); + } + Object::set_property(ctx, object, "insertions", Object::create_array(ctx, insertions)); + + for (auto index : change_set.modifications.as_indexes()) { + modifications.push_back(Value::from_number(ctx, index)); + } + Object::set_property(ctx, object, "modifications", Object::create_array(ctx, modifications)); + + return object; +} + } // js } // realm diff --git a/src/js_list.hpp b/src/js_list.hpp index 35c632e1..a730ad04 100644 --- a/src/js_list.hpp +++ b/src/js_list.hpp @@ -33,10 +33,20 @@ namespace realm { namespace js { template -struct ListClass : ClassDefinition> { +class List : public realm::List { + public: + List(std::shared_ptr r, const ObjectSchema& s, LinkViewRef l) noexcept : realm::List(r, l) {} + List(const realm::List &l) : realm::List(l) {} + + std::vector, NotificationToken>> m_notification_tokens; +}; + +template +struct ListClass : ClassDefinition, CollectionClass> { using ContextType = typename T::Context; using ObjectType = typename T::Object; using ValueType = typename T::Value; + using FunctionType = typename T::Function; using Object = js::Object; using Value = js::Value; using ReturnValue = js::ReturnValue; @@ -58,7 +68,12 @@ struct ListClass : ClassDefinition> { static void filtered(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void sorted(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void is_valid(ContextType, ObjectType, size_t, const ValueType [], ReturnValue &); - + + // observable + static void add_listener(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void remove_listener(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void remove_all_listeners(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + std::string const name = "List"; MethodMap const methods = { @@ -71,6 +86,9 @@ struct ListClass : ClassDefinition> { {"filtered", wrap}, {"sorted", wrap}, {"isValid", wrap}, + {"addListener", wrap}, + {"removeListener", wrap}, + {"removeAllListeners", wrap}, }; PropertyMap const properties = { @@ -82,7 +100,7 @@ struct ListClass : ClassDefinition> { template typename T::Object ListClass::create_instance(ContextType ctx, realm::List list) { - return create_object>(ctx, new realm::List(std::move(list))); + return create_object>(ctx, new realm::js::List(std::move(list))); } template @@ -230,6 +248,55 @@ template void ListClass::is_valid(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { return_value.set(get_internal>(this_object)->is_valid()); } + +template +void ListClass::add_listener(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + + auto list = get_internal>(this_object); + auto callback = Value::validated_to_function(ctx, arguments[0]); + Protected protected_callback(ctx, callback); + Protected protected_this(ctx, this_object); + Protected protected_ctx(Context::get_global_context(ctx)); + + auto token = list->add_notification_callback([=](CollectionChangeSet change_set, std::exception_ptr exception) { + typename T::HandleScope scope; + + ValueType arguments[2]; + arguments[0] = static_cast(protected_this); + arguments[1] = CollectionClass::create_collection_change_set(protected_ctx, change_set); + Function::call(protected_ctx, protected_callback, protected_this, 2, arguments); + }); + list->m_notification_tokens.emplace_back(protected_callback, std::move(token)); +} + +template +void ListClass::remove_listener(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + + auto list = get_internal>(this_object); + auto callback = Value::validated_to_function(ctx, arguments[0]); + auto protected_function = Protected(ctx, callback); + + auto iter = list->m_notification_tokens.begin(); + typename Protected::Comparator compare; + while (iter != list->m_notification_tokens.end()) { + if(compare(iter->first, protected_function)) { + iter = list->m_notification_tokens.erase(iter); + } + else { + iter++; + } + } +} + +template +void ListClass::remove_all_listeners(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 0); + + auto list = get_internal>(this_object); + list->m_notification_tokens.clear(); +} } // js } // realm diff --git a/src/js_observable.hpp b/src/js_observable.hpp new file mode 100644 index 00000000..a49a1d0e --- /dev/null +++ b/src/js_observable.hpp @@ -0,0 +1,35 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "js_class.hpp" + +namespace realm { +namespace js { + +// Empty class that merely serves as useful type for now. +class Observable {}; + +template +struct ObservableClass : ClassDefinition { + std::string const name = "Observable"; +}; + +} // js +} // realm diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 06821ac3..642b3b4a 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -28,11 +28,14 @@ #include "js_list.hpp" #include "js_results.hpp" #include "js_schema.hpp" +#include "js_observable.hpp" +#include "js_sync.hpp" #include "shared_realm.hpp" #include "binding_context.hpp" #include "object_accessor.hpp" #include "platform.hpp" +#include "sync_config.hpp" namespace realm { namespace js { @@ -99,8 +102,10 @@ class RealmDelegate : public BindingContext { Protected m_context; std::list> m_notifications; std::weak_ptr m_realm; - + void notify(const char *notification_name) { + typename T::HandleScope scope; + SharedRealm realm = m_realm.lock(); if (!realm) { throw std::runtime_error("Realm no longer exists"); @@ -124,7 +129,7 @@ void set_default_path(std::string path); void delete_all_realms(); template -class RealmClass : public ClassDefinition { +class RealmClass : public ClassDefinition> { using GlobalContextType = typename T::GlobalContext; using ContextType = typename T::Context; using FunctionType = typename T::Function; @@ -162,7 +167,7 @@ public: static void schema_version(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void clear_test_state(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void copy_bundled_realm_files(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); - + // static properties static void get_default_path(ContextType, ObjectType, ReturnValue &); static void set_default_path(ContextType, ObjectType, ValueType value); @@ -254,12 +259,14 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { FunctionType list_constructor = ObjectWrap>::create_constructor(ctx); FunctionType results_constructor = ObjectWrap>::create_constructor(ctx); FunctionType realm_object_constructor = ObjectWrap>::create_constructor(ctx); + FunctionType sync_constructor = SyncClass::create_constructor(ctx); PropertyAttributes attributes = ReadOnly | DontEnum | DontDelete; Object::set_property(ctx, realm_constructor, "Collection", collection_constructor, attributes); Object::set_property(ctx, realm_constructor, "List", list_constructor, attributes); Object::set_property(ctx, realm_constructor, "Results", results_constructor, attributes); Object::set_property(ctx, realm_constructor, "Object", realm_object_constructor, attributes); + Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); return realm_constructor; } @@ -376,6 +383,8 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t std::string encryption_key = NativeAccessor::to_binary(ctx, encryption_key_value); config.encryption_key = std::vector(encryption_key.begin(), encryption_key.end()); } + + SyncClass::populate_sync_config(ctx, object, config); } } else { diff --git a/src/js_results.hpp b/src/js_results.hpp index 37d2cde9..2b8f58d4 100644 --- a/src/js_results.hpp +++ b/src/js_results.hpp @@ -31,10 +31,25 @@ namespace realm { namespace js { template -struct ResultsClass : ClassDefinition> { +class Results : public realm::Results { + public: + Results(Results const& r) : realm::Results(r) {}; + Results(realm::Results const& r) : realm::Results(r) {}; + Results(Results&&) = default; + Results& operator=(Results&&) = default; + Results& operator=(Results const&) = default; + + using realm::Results::Results; + + std::vector, NotificationToken>> m_notification_tokens; +}; + +template +struct ResultsClass : ClassDefinition, CollectionClass> { using ContextType = typename T::Context; using ObjectType = typename T::Object; using ValueType = typename T::Value; + using FunctionType = typename T::Function; using Object = js::Object; using Value = js::Value; using ReturnValue = js::ReturnValue; @@ -56,6 +71,11 @@ struct ResultsClass : ClassDefinition> { static void sorted(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void is_valid(ContextType, ObjectType, size_t, const ValueType [], ReturnValue &); + // observable + static void add_listener(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void remove_listener(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void remove_all_listeners(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + std::string const name = "Results"; MethodMap const methods = { @@ -63,6 +83,9 @@ struct ResultsClass : ClassDefinition> { {"filtered", wrap}, {"sorted", wrap}, {"isValid", wrap}, + {"addListener", wrap}, + {"removeListener", wrap}, + {"removeAllListeners", wrap}, }; PropertyMap const properties = { @@ -74,13 +97,13 @@ struct ResultsClass : ClassDefinition> { template typename T::Object ResultsClass::create_instance(ContextType ctx, realm::Results results) { - return create_object>(ctx, new realm::Results(std::move(results))); + return create_object>(ctx, new realm::js::Results(std::move(results))); } template typename T::Object ResultsClass::create_instance(ContextType ctx, SharedRealm realm, const ObjectSchema &object_schema) { auto table = ObjectStore::table_for_object_type(realm->read_group(), object_schema.name); - return create_object>(ctx, new realm::Results(realm, *table)); + return create_object>(ctx, new realm::js::Results(realm, *table)); } template @@ -155,8 +178,8 @@ typename T::Object ResultsClass::create_sorted(ContextType ctx, const U &coll } auto table = realm::ObjectStore::table_for_object_type(realm->read_group(), object_schema.name); - auto results = new realm::Results(realm, collection.get_query(), - {*table, std::move(columns), std::move(ascending)}); + auto results = new realm::js::Results(realm, collection.get_query(), + {*table, std::move(columns), std::move(ascending)}); return create_object>(ctx, results); } @@ -209,6 +232,55 @@ template void ResultsClass::is_valid(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { return_value.set(get_internal>(this_object)->is_valid()); } + +template +void ResultsClass::add_listener(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + + auto results = get_internal>(this_object); + auto callback = Value::validated_to_function(ctx, arguments[0]); + Protected protected_callback(ctx, callback); + Protected protected_this(ctx, this_object); + Protected protected_ctx(Context::get_global_context(ctx)); + + auto token = results->add_notification_callback([=](CollectionChangeSet change_set, std::exception_ptr exception) { + typename T::HandleScope scope; + ValueType arguments[2]; + arguments[0] = static_cast(protected_this); + arguments[1] = CollectionClass::create_collection_change_set(protected_ctx, change_set); + Function::call(protected_ctx, protected_callback, protected_this, 2, arguments); + }); + results->m_notification_tokens.emplace_back(protected_callback, std::move(token)); +} + +template +void ResultsClass::remove_listener(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + + auto results = get_internal>(this_object); + auto callback = Value::validated_to_function(ctx, arguments[0]); + auto protected_function = Protected(ctx, callback); + + auto iter = results->m_notification_tokens.begin(); + typename Protected::Comparator compare; + while (iter != results->m_notification_tokens.end()) { + if(compare(iter->first, protected_function)) { + iter = results->m_notification_tokens.erase(iter); + } + else { + iter++; + } + } +} + +template +void ResultsClass::remove_all_listeners(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 0); + + auto results = get_internal>(this_object); + results->m_notification_tokens.clear(); +} + } // js } // realm diff --git a/src/js_sync.hpp b/src/js_sync.hpp new file mode 100644 index 00000000..cb560d1e --- /dev/null +++ b/src/js_sync.hpp @@ -0,0 +1,226 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include + +#include "js_class.hpp" +#include "js_collection.hpp" +#include "sync_manager.hpp" +#include "sync_config.hpp" +#include "sync_session.hpp" +#include "realm/util/logger.hpp" +#include "realm/util/uri.hpp" + +#if REALM_PLATFORM_NODE +#include "node/node_sync_logger.hpp" +#endif + +#if !REALM_DEVELOPER_EDITION +#include "js_enterprise.hpp" +#endif + +namespace realm { +namespace js { + +template +class SyncClass : public ClassDefinition { + using GlobalContextType = typename T::GlobalContext; + using ContextType = typename T::Context; + using FunctionType = typename T::Function; + using ObjectType = typename T::Object; + using ValueType = typename T::Value; + using String = js::String; + using Object = js::Object; + using Value = js::Value; + using Function = js::Function; + using ReturnValue = js::ReturnValue; + using NativeAccessor = realm::NativeAccessor; + +public: + std::string const name = "Sync"; + + static FunctionType create_constructor(ContextType); + + static void set_sync_log_level(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void set_verify_servers_ssl_certificate(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + +#if REALM_PLATFORM_NODE + static void set_sync_logger(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); +#endif + + // private + static void refresh_access_token(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + static void populate_sync_config(ContextType, ObjectType config_object, Realm::Config&); + + // static properties + static void get_is_developer_edition(ContextType, ObjectType, ReturnValue &); + + MethodMap const static_methods = { + {"refreshAccessToken", wrap}, + {"setLogLevel", wrap}, + {"setVerifyServersSslCertificate", wrap}, +#if REALM_PLATFORM_NODE + {"setSyncLogger", wrap}, +#endif + }; + + PropertyMap const static_properties { + {"isDeveloperEdition", {wrap, nullptr}} + }; +}; + +template +inline typename T::Function SyncClass::create_constructor(ContextType ctx) { + FunctionType sync_constructor = ObjectWrap>::create_constructor(ctx); + + Protected refresh(ctx, Object::validated_get_function(ctx, sync_constructor, std::string("refreshAccessToken"))); + Protected protected_sync(ctx, sync_constructor); + Protected protected_ctx(Context::get_global_context(ctx)); + + realm::SyncManager::shared().set_login_function([=](const std::string& path, const realm::SyncConfig& config) { + typename T::HandleScope handle_scope; + + FunctionType user_constructor = Object::validated_get_function(protected_ctx, protected_sync, std::string("User")); + FunctionType authenticate = Object::validated_get_function(protected_ctx, user_constructor, "authenticateRealm"); + ObjectType users = Object::validated_get_object(protected_ctx, user_constructor, std::string("activeUsers")); + ObjectType user = Object::validated_get_object(protected_ctx, users, config.user_tag.c_str(), "Invalid user identity"); + + if (Object::validated_get_boolean(protected_ctx, user, "isAdmin")) { + std::string token = Object::validated_get_string(protected_ctx, user, "token"); + + // FIXME: This log-in callback is called while the object store still holds some sync-related locks. + // Notify the object store of the access token asynchronously to avoid the deadlock that would result + // from reentering the object store here. + auto thread = std::thread([path, config, token]{ + auto session = SyncManager::shared().get_existing_active_session(path); + session->refresh_access_token(token, config.realm_url); + }); + thread.detach(); + } + else { + ValueType arguments[3]; + arguments[0] = Value::from_string(protected_ctx, path.c_str()); + arguments[1] = Value::from_string(protected_ctx, config.realm_url.c_str()); + arguments[2] = refresh; + Function::call(protected_ctx, authenticate, user, 3, arguments); + } + }); + + realm::SyncManager::shared().set_error_handler([=](int error_code, std::string message) { + std::cout << error_code << " " << message << std::endl; + }); + +#if REALM_PLATFORM_NODE + // AtExit is called before the V8 VM is disposed. We use it to clean the captured JS objects in the login function. + // Should they be destructed after the VM is disposed, there will be a segmentation fault during node's shutdown. + ::node::AtExit([](void*) { + realm::SyncManager::shared().set_login_function(nullptr); + }); +#endif + +#if !REALM_DEVELOPER_EDITION + SyncEnterpriseClass::add_methods(ctx, sync_constructor); +#endif + + return sync_constructor; +} + +template +void SyncClass::set_sync_log_level(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + std::string log_level = Value::validated_to_string(ctx, arguments[0]); + std::istringstream in(log_level); // Throws + in.imbue(std::locale::classic()); // Throws + in.unsetf(std::ios_base::skipws); + util::Logger::Level log_level_2 = util::Logger::Level(); + in >> log_level_2; // Throws + if (!in || !in.eof()) + throw std::runtime_error("Bad log level"); + realm::SyncManager::shared().set_log_level(log_level_2); +} + +template +void SyncClass::set_verify_servers_ssl_certificate(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + bool verify_servers_ssl_certificate = Value::validated_to_boolean(ctx, arguments[0]); + realm::SyncManager::shared().set_client_should_validate_ssl(verify_servers_ssl_certificate); +} + +#if REALM_HAVE_NODE_SYNC_LOGGER +template +void SyncClass::set_sync_logger(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 1); + auto callback = Value::validated_to_function(ctx, arguments[0]); + node::SyncLoggerFactory *factory = new node::SyncLoggerFactory(ctx, this_object, callback); // Throws + realm::SyncManager::shared().set_logger_factory(*factory); +} +#endif + +template +void SyncClass::refresh_access_token(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 2); + + static const String token_string = "token"; + static const String file_url_string = "file_url"; + static const String realm_url_string = "resolved_realm_url"; + + ObjectType json_arguments = Value::validated_to_object(ctx, arguments[1]); + std::string token = Object::validated_get_string(ctx, json_arguments, token_string); + std::string file_url = Object::validated_get_string(ctx, json_arguments, file_url_string); + std::string realm_url = Object::validated_get_string(ctx, json_arguments, realm_url_string); + + if (auto session = SyncManager::shared().get_existing_active_session(file_url)) { + session->refresh_access_token(token, realm_url); + return_value.set(true); + } + else { + return_value.set(false); + } +} + +template +void SyncClass::populate_sync_config(ContextType ctx, ObjectType config_object, Realm::Config& config) { + ValueType sync_config_value = Object::get_property(ctx, config_object, "sync"); + if (!Value::is_undefined(ctx, sync_config_value)) { + auto sync_config_object = Value::validated_to_object(ctx, sync_config_value); + + ObjectType user = Object::validated_get_object(ctx, sync_config_object, "user"); + config.sync_config = std::shared_ptr( + new SyncConfig(Object::validated_get_string(ctx, user, "identity"), + Object::validated_get_string(ctx, sync_config_object, "url"), + {}, SyncSessionStopPolicy::AfterChangesUploaded) + ); + config.schema_mode = SchemaMode::Additive; + } +} + +template +void SyncClass::get_is_developer_edition(ContextType ctx, ObjectType object, ReturnValue &return_value) { +#if REALM_DEVELOPER_EDITION + return_value.set(true); +#else + return_value.set(false); +#endif +} + +} // js +} // realm diff --git a/src/js_types.hpp b/src/js_types.hpp index 2b1f1fbc..6c2e78a1 100644 --- a/src/js_types.hpp +++ b/src/js_types.hpp @@ -133,6 +133,11 @@ struct Function { using ValueType = typename T::Value; static ValueType call(ContextType, const FunctionType &, const ObjectType &, size_t, const ValueType[]); + template static ValueType call(ContextType ctx, const FunctionType &function, + const ObjectType &this_object, const ValueType (&arguments)[N]) + { + return call(ctx, function, this_object, N, arguments); + } static ValueType call(ContextType ctx, const FunctionType &function, size_t argument_count, const ValueType arguments[]) { return call(ctx, function, {}, argument_count, arguments); } @@ -247,6 +252,10 @@ class Protected { bool operator!=(const ValueType &) const; bool operator==(const Protected &) const; bool operator!=(const Protected &) const; + + struct Comparator { + bool operator()(const Protected& a, const Protected& b) const; + }; }; template diff --git a/src/jsc/jsc_protected.hpp b/src/jsc/jsc_protected.hpp index 6c20d039..07229f9b 100644 --- a/src/jsc/jsc_protected.hpp +++ b/src/jsc/jsc_protected.hpp @@ -47,6 +47,12 @@ class Protected { operator bool() const { return m_context != nullptr; } + + struct Comparator { + bool operator() (const Protected& a, const Protected& b) const { + return a.m_context == b.m_context; + } + }; }; template<> @@ -75,6 +81,21 @@ class Protected { operator bool() const { return m_value != nullptr; } + + struct Comparator { + bool operator() (const Protected& a, const Protected& b) const { + if (a.m_context != b.m_context) { + return false; + } + return JSValueIsStrictEqual(a.m_context, a.m_value, b.m_value); + } + }; + + Protected& operator=(Protected other) { + std::swap(m_context, other.m_context); + std::swap(m_value, other.m_value); + return *this; + } }; template<> @@ -89,6 +110,11 @@ class Protected : public Protected { JSValueRef value = static_cast(*this); return (JSObjectRef)value; } + + Protected& operator=(Protected other) { + std::swap(*this, other); + return *this; + } }; } // js diff --git a/src/jsc/jsc_types.hpp b/src/jsc/jsc_types.hpp index 9eca89cd..e7b9a868 100644 --- a/src/jsc/jsc_types.hpp +++ b/src/jsc/jsc_types.hpp @@ -34,6 +34,7 @@ struct Types { using Object = JSObjectRef; using String = JSStringRef; using Function = JSObjectRef; + using HandleScope = void *; using ConstructorCallback = JSObjectCallAsConstructorCallback; using FunctionCallback = JSObjectCallAsFunctionCallback; diff --git a/src/node/binding.gyp b/src/node/binding.gyp deleted file mode 100644 index 6e82813a..00000000 --- a/src/node/binding.gyp +++ /dev/null @@ -1,85 +0,0 @@ -{ - "targets": [ - { - "target_name": "realm", - "sources": [ - "node_init.cpp", - "platform.cpp", - "../js_realm.cpp", - "../object-store/src/collection_notifications.cpp", - "../object-store/src/index_set.cpp", - "../object-store/src/list.cpp", - "../object-store/src/object_schema.cpp", - "../object-store/src/object_store.cpp", - "../object-store/src/results.cpp", - "../object-store/src/schema.cpp", - "../object-store/src/shared_realm.cpp", - "../object-store/src/thread_confined.cpp", - "../object-store/src/impl/collection_change_builder.cpp", - "../object-store/src/impl/collection_notifier.cpp", - "../object-store/src/impl/handover.cpp", - "../object-store/src/impl/list_notifier.cpp", - "../object-store/src/impl/realm_coordinator.cpp", - "../object-store/src/impl/results_notifier.cpp", - "../object-store/src/impl/transact_log_handler.cpp", - "../object-store/src/impl/node/weak_realm_notifier.cpp", - "../object-store/src/parser/parser.cpp", - "../object-store/src/parser/query_builder.cpp", - "../object-store/src/util/format.cpp", - "../object-store/src/util/thread_id.cpp" - ], - "include_dirs": [ - "..", - "../object-store/src", - "../object-store/src/impl", - "../object-store/src/impl/apple", - "../object-store/src/parser", - "../object-store/external/pegtl", - "../../core-node/include", - "() const { return Nan::New(m_value); } - operator bool() const { + explicit operator bool() const { return m_value.isEmpty(); } bool operator==(const v8::Local &other) const { @@ -50,6 +50,12 @@ class Protected { bool operator!=(const Protected &other) const { return m_value != other.m_value; } + + struct Comparator { + bool operator()(const Protected& a, const Protected& b) const { + return Nan::New(a.m_value)->StrictEquals(Nan::New(b.m_value)); + } + }; }; } // node diff --git a/src/node/node_sync_logger.cpp b/src/node/node_sync_logger.cpp new file mode 100644 index 00000000..5d66bbc6 --- /dev/null +++ b/src/node/node_sync_logger.cpp @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +#include "node_init.hpp" +#include "node_class.hpp" +#include "js_realm.hpp" +#include "node_types.hpp" +#include "node_sync_logger.hpp" + +namespace realm { +namespace node { + +SyncLoggerQueue::~SyncLoggerQueue() noexcept +{ + m_callback_this_object.Reset(); + m_callback.Reset(); +} + +void SyncLoggerQueue::log_uv_callback() +{ + // This function is always executed by the Node.js event loop + // thread. + Nan::HandleScope scope; + v8::Local this_object = Nan::New(m_callback_this_object); + v8::Local callback = Nan::New(m_callback); + + std::queue popped; + { + std::lock_guard lock(m_mutex); // Throws + popped.swap(m_log_queue); + } + + for (;;) { + if (popped.empty()) + break; + + Nan::TryCatch trycatch; + v8::Local argv[] = { + Nan::New((int)(popped.front().m_level)), + Nan::New(popped.front().m_message).ToLocalChecked() + }; + Nan::MakeCallback(this_object, callback, 2, argv); + if (trycatch.HasCaught()) { + throw node::Exception(m_v8_isolate, trycatch.Exception()); + } + popped.pop(); + } +} + +void SyncLogger::do_log(realm::util::Logger::Level level, std::string message) +{ + std::lock_guard lock(m_mutex); // Throws + m_log_queue.emplace(level, message); + m_log_uv_async.send(); +} + +SyncLoggerFactory::~SyncLoggerFactory() noexcept +{ + m_callback_this_object.Reset(); + m_callback.Reset(); +} + +std::unique_ptr SyncLoggerFactory::make_logger(util::Logger::Level level) +{ + v8::Local this_object = Nan::New(m_callback_this_object); + v8::Local callback = Nan::New(m_callback); + + SyncLogger *logger = new SyncLogger(m_v8_isolate, this_object, callback); // Throws + logger->set_level_threshold(level); + + return std::unique_ptr(logger); +} + +} // namespace node +} // namespace realm diff --git a/src/node/node_sync_logger.hpp b/src/node/node_sync_logger.hpp new file mode 100644 index 00000000..aec87cbd --- /dev/null +++ b/src/node/node_sync_logger.hpp @@ -0,0 +1,89 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +#ifndef REALM_NODE_GLOBAL_LOGGER_HPP +#define REALM_NODE_GLOBAL_LOGGER_HPP + +#include +#include +#include + +#include + +#include "node_uv_async.hpp" + +namespace realm { +namespace node { + + struct SyncLoggerMessage { + std::string m_message; + realm::util::Logger::Level m_level; + SyncLoggerMessage(realm::util::Logger::Level level, std::string message): + m_message(message), + m_level(level) { } + }; + + class SyncLoggerQueue { + public: + SyncLoggerQueue(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : + m_log_uv_async([this] { log_uv_callback(); }), // Throws + m_v8_isolate(v8_isolate), + m_callback_this_object(callback_this_object), + m_callback(callback) { } + ~SyncLoggerQueue() noexcept; + + protected: + void log_uv_callback(); + std::queue m_log_queue; + std::mutex m_mutex; + UvAsync m_log_uv_async; + + private: + v8::Isolate* m_v8_isolate; + Nan::Persistent m_callback_this_object; + Nan::Persistent m_callback; + }; + + class SyncLogger: public realm::util::RootLogger, public SyncLoggerQueue { + public: + SyncLogger(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : + SyncLoggerQueue(v8_isolate, callback_this_object, callback) { } + + protected: + void do_log(realm::util::Logger::Level, std::string) override final; + }; + + class SyncLoggerFactory : public realm::SyncLoggerFactory { + public: + SyncLoggerFactory(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : + m_v8_isolate(v8_isolate), + m_callback_this_object(callback_this_object), + m_callback(callback) { } + ~SyncLoggerFactory() noexcept; + + virtual std::unique_ptr make_logger(util::Logger::Level level); + private: + v8::Isolate* m_v8_isolate; + Nan::Persistent m_callback_this_object; + Nan::Persistent m_callback; + }; + +} // namespace node +} // namespace realm + +#endif // REALM_NODE_GLOBAL_LOGGER_HPP diff --git a/src/node/node_types.hpp b/src/node/node_types.hpp index 4220c173..f38b8c16 100644 --- a/src/node/node_types.hpp +++ b/src/node/node_types.hpp @@ -41,6 +41,7 @@ struct Types { using Object = v8::Local; using String = v8::Local; using Function = v8::Local; + using HandleScope = Nan::HandleScope; using ConstructorCallback = Nan::FunctionCallback; using FunctionCallback = Nan::FunctionCallback; diff --git a/src/node/node_uv_async.hpp b/src/node/node_uv_async.hpp new file mode 100644 index 00000000..05c14949 --- /dev/null +++ b/src/node/node_uv_async.hpp @@ -0,0 +1,104 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +#ifndef REALM_NODE_UV_ASYNC_HPP +#define REALM_NODE_UV_ASYNC_HPP + +#include +#include +#include +#include + +#include + +namespace realm { +namespace node { + +// Must be created and destroyed by the thread that is associated with the +// specified libuv event loop. +class UvAsync { +public: + UvAsync(std::function func, uv_loop_t* = uv_default_loop()); + ~UvAsync() noexcept; + + /// Schedule the associated callback function to be executed by the + /// associated libuv event loop. May be called by any thread. + void send(); + +private: + struct Rep; + + Rep* m_rep; + + static void exec(uv_async_t* handle) noexcept; + static void close(uv_handle_t* handle) noexcept; +}; + + + + +// implementation + +struct UvAsync::Rep { + uv_async_t handle; + std::function func; +}; + +inline UvAsync::UvAsync(std::function func, uv_loop_t* loop) +{ + std::unique_ptr rep(new Rep); + rep->handle.data = &*rep; + rep->func = std::move(func); + int ret = uv_async_init(loop, &rep->handle, &UvAsync::exec); + if (ret < 0) + throw std::runtime_error("uv_async_init() failed"); + m_rep = rep.release(); +} + +inline UvAsync::~UvAsync() noexcept +{ + m_rep->func = std::function(); + uv_close(reinterpret_cast(&m_rep->handle), &UvAsync::close); +} + +inline void UvAsync::send() +{ + int ret = uv_async_send(&m_rep->handle); + if (ret < 0) + throw std::runtime_error("uv_async_send() failed"); +} + +inline void UvAsync::exec(uv_async_t* handle) noexcept +{ + Rep* rep = static_cast(handle->data); + if (rep->func) + rep->func(); // Throws + + // FIXME: How to deal with C++ exceptions here? +} + +inline void UvAsync::close(uv_handle_t* handle) noexcept +{ + Rep* rep = static_cast(handle->data); + delete rep; +} + +} // namespace node +} // namespace realm + +#endif // REALM_NODE_UV_ASYNC_HPP diff --git a/src/node/node_value.hpp b/src/node/node_value.hpp index 0a25ad7f..6909eb80 100644 --- a/src/node/node_value.hpp +++ b/src/node/node_value.hpp @@ -129,7 +129,7 @@ inline bool node::Value::to_boolean(v8::Isolate* isolate, const v8::Local inline double node::Value::to_number(v8::Isolate* isolate, const v8::Local &value) { double number = Nan::To(value).FromMaybe(NAN); - if (isnan(number)) { + if (std::isnan(number)) { throw std::invalid_argument("Value not convertible to a number."); } return number; diff --git a/test.js b/test.js new file mode 100644 index 00000000..d8d33135 --- /dev/null +++ b/test.js @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +'use strict'; + +const Realm = require('.'); +const prompt = require('prompt'); +const mkdirp = require('mkdirp'); +const wildcard = require('wildcard'); + +// User.loginWithProvider('http://127.0.0.1:8080/', 'debug', 'abcd', function(error, user) { +// console.log(user); +// }); + +Realm.Sync.User.create('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { + +var notifier_dir = './notifier'; +mkdirp.sync(notifier_dir); + +var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIsICJkb3dubG9hZCIsICJtYW5hZ2UiXQp9Cg==:DlFksxA+cJyEOc9bu6JwBUfDi4fJCagjAcIPPsoisjqfmOzSrk5Omuw0IkxCRU534p2+CAAj5IOH47DfObPtAA8q2DHguYDOKWYxyktS/6doPCqDHYN7k9EgUHdPTkESNkuPZbaVfXZTGzocB8m7+MaEXJde7FGPbh1sBz/+sPldnlAhnOqO5QbWzIEyoGHiOSg3V7UCh2H8kalr3tef7fkE2X65OBMgcarPvM5M6sPijOx2N5zrVrjL2wvguP9zS+g2ybFPUqV3DGv3S8cnGA+wVId/jCfGc2ujNhecunJdENH+/pL+0BTYHCFEWkY1WP1NUyti60FwRaXAtcYxeA=='; +var admin_user = new Realm.Sync.User.adminUser('http://127.0.0.1:9080/', access_token); + +Realm.Sync.setLogLevel('error'); +Realm.Sync.setGlobalListener(notifier_dir, 'realm://127.0.0.1:9080', admin_user, + (name) => { + console.log('filter: ' + name); + return true; + }, + (name, realm, changes) => { + console.log('change: ' + name); + console.log(changes); + } +); +console.log('global notifier listening...'); + +Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { + console.log(user); + + var realm = new Realm({ + sync: { + user: user, + url: 'realm://127.0.0.1:9080/~/demo/realm1' + }, + schema: [{ + name: 'IntObject', + properties: { + int: 'int' + } + }] + }); + + function create(err, result) { + if (err) { + exit(); + } + if (!err) { + realm.write(() => { + realm.create('IntObject', {int: parseInt(result.int)}); + }); + console.log(realm.objects('IntObject')); + } + + prompt.get(['int'], create); + } + prompt.start(); + prompt.get(['int'], create); +}); + +}); + diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 00000000..56b36ece --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,2 @@ +/sync-bundle/ +/junitresults-*.xml \ No newline at end of file diff --git a/tests/index.js b/tests/index.js index e22b797a..09fd9a9d 100644 --- a/tests/index.js +++ b/tests/index.js @@ -23,14 +23,13 @@ const fs = require('fs'); const path = require('path'); -const mockery = require('mockery'); function runTests() { const Realm = require('realm'); const RealmTests = require('./js'); RealmTests.registerTests({ - WorkerTests: require('./js/worker-tests'), + AsyncTests: require('./js/async-tests'), }); const testNames = RealmTests.getTestNames(); @@ -79,10 +78,6 @@ function runTests() { } if (require.main == module) { - mockery.enable(); - mockery.warnOnUnregistered(false); - mockery.registerMock('realm', require('..')); - runTests().then( (passed) => { if (!passed) { diff --git a/tests/ios/RJSModuleLoader.h b/tests/ios/RJSModuleLoader.h index 91ab5bac..a9c8f77c 100644 --- a/tests/ios/RJSModuleLoader.h +++ b/tests/ios/RJSModuleLoader.h @@ -27,5 +27,6 @@ - (JSValue *)loadModuleFromURL:(NSURL *)url error:(NSError **)error; - (JSValue *)loadJSONFromURL:(NSURL *)url error:(NSError **)error; +- (JSValue *)loadGlobalModule:(NSString *)name relativeToURL:(NSURL *)url error:(NSError **)error; @end diff --git a/tests/ios/RJSModuleLoader.m b/tests/ios/RJSModuleLoader.m index 3c0613a9..39cbb066 100644 --- a/tests/ios/RJSModuleLoader.m +++ b/tests/ios/RJSModuleLoader.m @@ -195,6 +195,18 @@ static NSString * const RJSModuleLoaderErrorDomain = @"RJSModuleLoaderErrorDomai BOOL isDirectory; if ([fileManager fileExistsAtPath:moduleURL.path isDirectory:&isDirectory] && isDirectory) { + NSURL *packageURL = [moduleURL URLByAppendingPathComponent:@"package.json"]; + NSDictionary *package; + + if ([fileManager fileExistsAtPath:packageURL.path]) { + NSError *error; + NSData *data = [NSData dataWithContentsOfURL:packageURL options:0 error:&error]; + + package = data ? [NSJSONSerialization JSONObjectWithData:data options:0 error:&error] : nil; + NSAssert(package, @"%@", error); + } + + moduleURL = [moduleURL URLByAppendingPathComponent:package[@"main"] ?: @"index.js"]; return [self loadModuleFromURL:moduleURL error:error]; } diff --git a/tests/ios/RealmJSCoreTests.m b/tests/ios/RealmJSCoreTests.m index d3bf62c9..5fd0cf91 100644 --- a/tests/ios/RealmJSCoreTests.m +++ b/tests/ios/RealmJSCoreTests.m @@ -31,12 +31,23 @@ + (XCTestSuite *)defaultTestSuite { XCTestSuite *suite = [super defaultTestSuite]; - JSContext *context = [[JSContext alloc] init]; + + // We need a JS context from a UIWebView so it has setTimeout, Promise, etc. + UIWebView *webView = [[UIWebView alloc] init]; + JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; RJSModuleLoader *moduleLoader = [[RJSModuleLoader alloc] initWithContext:context]; NSURL *realmURL = [[NSBundle bundleForClass:self] URLForResource:@"index" withExtension:@"js" subdirectory:@"lib"]; NSURL *scriptURL = [[NSBundle bundleForClass:self] URLForResource:@"index" withExtension:@"js" subdirectory:@"js"]; NSError *error; + // The ES6 global Promise constructor was added in iOS 8. + if (![context[@"Promise"] isObject]) { + JSValue *promiseModule = [moduleLoader loadGlobalModule:@"es6-promise" relativeToURL:scriptURL error:&error]; + NSAssert(promiseModule, @"%@", error); + + context[@"Promise"] = promiseModule[@"Promise"]; + } + // Create Realm constructor in the JS context. RJSInitializeInContext(context.JSGlobalContextRef); @@ -73,25 +84,46 @@ JSContext *context = testObject.context; context.exception = nil; - [testObject invokeMethod:@"runTest" withArguments:@[NSStringFromClass(self.class), method]]; + JSValue *promise = [testObject invokeMethod:@"runTest" withArguments:@[NSStringFromClass(self.class), method]]; - JSValue *exception = context.exception; - if (exception) { - JSValue *message = [exception hasProperty:@"message"] ? exception[@"message"] : exception; - NSString *source = [exception hasProperty:@"sourceURL"] ? [exception[@"sourceURL"] toString] : nil; - NSUInteger line = [exception hasProperty:@"line"] ? [exception[@"line"] toUInt32] - 1 : 0; - NSURL *sourceURL = nil; + if (context.exception) { + [self recordException:context.exception]; + return; + } - if (source) { - NSString *path = [NSString pathWithComponents:@[[@(__FILE__) stringByDeletingLastPathComponent], @"..", @"js", source.lastPathComponent]]; - sourceURL = [NSURL URLWithString:path]; - } + if ([promise isObject]) { + XCTestExpectation *expectation = [self expectationWithDescription:@"Promise resolved or rejected"]; - [self recordFailureWithDescription:message.description - inFile:sourceURL ? sourceURL.absoluteString : @(__FILE__) - atLine:sourceURL ? line : __LINE__ - expected:YES]; + JSValue *onFulfilled = [JSValue valueWithObject:^() { + [expectation fulfill]; + } inContext:context]; + + JSValue *onRejected = [JSValue valueWithObject:^(JSValue *error) { + [self recordException:error]; + [expectation fulfill]; + } inContext:context]; + + [promise invokeMethod:@"then" withArguments:@[onFulfilled, onRejected]]; + + [self waitForExpectationsWithTimeout:5.0 handler:NULL]; } } +- (void)recordException:(JSValue *)exception { + JSValue *message = [exception hasProperty:@"message"] ? exception[@"message"] : exception; + NSString *source = [exception hasProperty:@"sourceURL"] ? [exception[@"sourceURL"] toString] : nil; + NSUInteger line = [exception hasProperty:@"line"] ? [exception[@"line"] toUInt32] - 1 : 0; + NSURL *sourceURL = nil; + + if (source) { + NSString *path = [NSString pathWithComponents:@[[@(__FILE__) stringByDeletingLastPathComponent], @"..", @"js", source.lastPathComponent]]; + sourceURL = [NSURL URLWithString:path]; + } + + [self recordFailureWithDescription:message.description + inFile:sourceURL ? sourceURL.absoluteString : @(__FILE__) + atLine:sourceURL ? line : __LINE__ + expected:YES]; +} + @end diff --git a/tests/js/async-tests.js b/tests/js/async-tests.js new file mode 100644 index 00000000..a9db9c61 --- /dev/null +++ b/tests/js/async-tests.js @@ -0,0 +1,360 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +/* eslint-env es6, node */ + +'use strict'; + +const Realm = require('realm'); +const TestCase = require('./asserts'); +const schemas = require('./schemas'); +const Worker = require('./worker'); + +function createNotificationTest(config, getObservable, addListener, removeListener, messages, expectedCount) { + return new Promise((resolve, reject) => { + let realm = new Realm(config); + let observable = getObservable(realm); + let worker = new Worker(__dirname + '/worker-tests-script.js'); + + // Test will fail if it does not receive a change event within a second. + let timer = setTimeout(() => { + reject(new Error('Timed out waiting for change notification')); + }, 5000); + + let cleanup = () => { + clearTimeout(timer); + worker.terminate(); + }; + + var count = 0; + var listener = addListener(observable, () => count++, resolve, reject, cleanup); + + messages.push(['echo', 'resolve']); + var messageIndex = 0; + + worker.onmessage = (message) => { + if (message.error) { + reject(message.error); + cleanup(); + } + else if (message.result == 'resolve') { + if (count != expectedCount) { + reject('Notification count ' + count + ' not equal to expected count ' + expectedCount); + } + else { + resolve(); + } + cleanup(); + } + else { + if (message.result == 'removeListener') { + removeListener(observable, listener); + } + worker.postMessage(messages[messageIndex++]); + } + }; + + worker.postMessage(messages[messageIndex++]); + }); +}; + +function createCollectionChangeTest(config, createCollection, messages, expected, removeAll) { + return createNotificationTest( + config, + createCollection, + (collection, increment, resolve, reject, cleanup) => { + var listener = (object, changes) => { + try { + var notificationCount = increment(); + TestCase.assertArraysEqual(changes.insertions, expected[notificationCount][0]); + TestCase.assertArraysEqual(changes.deletions, expected[notificationCount][1]); + TestCase.assertArraysEqual(changes.modifications, expected[notificationCount][2]); + } catch (e) { + reject(e); + cleanup(); + } + }; + collection.addListener(listener); + return listener; + }, + removeAll ? (observable) => observable.removeAllListeners() : + (observable, listener) => observable.removeListener(listener), + messages, + expected.length + ); +}; + +const ListObject = { + name: 'ListObject', + properties: { + list: {type: 'list', objectType: 'TestObject'}, + } +}; + +const PrimaryListObject = { + name: 'PrimaryListObject', + properties: { + list: {type: 'list', objectType: 'IntPrimaryObject'}, + } +}; + +module.exports = { + testChangeNotifications() { + var config = { schema: [schemas.TestObject] }; + return createNotificationTest( + config, + (realm) => realm, + (realm, increment, resolve, reject, cleanup) => realm.addListener('change', () => { + try { + var objects = realm.objects('TestObject'); + TestCase.assertEqual(objects.length, 1); + TestCase.assertEqual(objects[0].doubleCol, 42); + increment(); + } catch (e) { + reject(e); + cleanup(); + } + }), + undefined, + [[config, 'create', 'TestObject', [{doubleCol: 42}]]], + 1 + ); + }, + + testResultsAddNotifications() { + var config = { schema: [schemas.TestObject] }; + return createCollectionChangeTest( + config, + (realm) => realm.objects('TestObject'), + [ + [config, 'create', 'TestObject', [{ doubleCol: 1 }]], + [config, 'create', 'TestObject', [{ doubleCol: 2 }, { doubleCol: 3 }]] + ], + [ + [[], [], []], + [[0], [], []], + [[1, 2], [], []], + ] + ); + }, + + testResultsRemoveNotifications() { + var config = { schema: [schemas.TestObject] }; + return createCollectionChangeTest( + config, + (realm) => realm.objects('TestObject'), + [ + [config, 'create', 'TestObject', [{ doubleCol: 1 }]], + ['echo', 'removeListener'], + [config, 'create', 'TestObject', [{ doubleCol: 2 }, { doubleCol: 3 }]] + ], + [ + [[], [], []], + [[0], [], []], + ] + ); + }, + + testResultsRemoveAllNotifications() { + var config = { schema: [schemas.TestObject] }; + return createCollectionChangeTest( + config, + (realm) => realm.objects('TestObject'), + [ + [config, 'create', 'TestObject', [{ doubleCol: 1 }]], + ['echo', 'removeListener'], + [config, 'create', 'TestObject', [{ doubleCol: 2 }, { doubleCol: 3 }]] + ], + [ + [[], [], []], + [[0], [], []], + ], + true + ); + }, + + testResultsDeleteNotifications() { + var config = { schema: [schemas.TestObject] }; + return createCollectionChangeTest( + config, + function(realm) { + return realm.objects('TestObject'); + }, + [ + [config, 'create', 'TestObject', [[0], [1], [2], [3], [4]]], + [config, 'delete', 'TestObject', [4]], + [config, 'delete', 'TestObject', [0, 2]] + ], + [ + [[], [], []], + [[0, 1, 2, 3, 4], [], []], + [[], [4], []], + [[0], [0, 2, 3], []] + ] + ); + }, + + testResultsUpdateNotifications() { + var config = { schema: [schemas.IntPrimary] }; + return createCollectionChangeTest( + config, + (realm) => realm.objects('IntPrimaryObject'), + [ + [config, 'create', 'IntPrimaryObject', [[0, '0'], [1, '1'], [2, '2']]], + [config, 'update', 'IntPrimaryObject', [[0, '00'], [2, '22']]] + ], + [ + [[], [], []], + [[0, 1, 2], [], []], + [[], [], [0, 2]] + ] + ); + }, + + testListAddNotifications() { + var config = { schema: [schemas.TestObject, ListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('ListObject', {list: []}) + }); + return listObject.list; + }, + [ + [config, 'list_method', 'ListObject', 'list', 'push', {doubleCol: 0}, {doubleCol: 1}] + ], + [ + [[], [], []], + [[0, 1], [], []] + ] + ); + }, + + testListRemoveNotifications() { + var config = { schema: [schemas.TestObject, ListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('ListObject', {list: []}) + }); + return listObject.list; + }, + [ + [config, 'list_method', 'ListObject', 'list', 'push', {doubleCol: 0}, {doubleCol: 1}], + ['echo', 'removeListener'], + [config, 'list_method', 'ListObject', 'list', 'push', {doubleCol: 0}, {doubleCol: 1}], + ], + [ + [[], [], []], + [[0, 1], [], []] + ] + ); + }, + + testListRemoveAllNotifications() { + var config = { schema: [schemas.TestObject, ListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('ListObject', {list: []}) + }); + return listObject.list; + }, + [ + [config, 'list_method', 'ListObject', 'list', 'push', {doubleCol: 0}, {doubleCol: 1}], + ['echo', 'removeListener'], + [config, 'list_method', 'ListObject', 'list', 'push', {doubleCol: 0}, {doubleCol: 1}], + ], + [ + [[], [], []], + [[0, 1], [], []] + ], + true + ); + }, + + testListDeleteNotifications() { + var config = { schema: [schemas.TestObject, ListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('ListObject', {list: [[0], [1], [2]]}) + }); + return listObject.list; + }, + [ + [config, 'list_method', 'ListObject', 'list', 'splice', 1, 2] + ], + [ + [[], [], []], + [[], [1, 2], []] + ] + ); + }, + + testListSpliceNotifications() { + var config = { schema: [schemas.TestObject, ListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('ListObject', {list: [[0], [1], [2]]}) + }); + return listObject.list; + }, + [ + [config, 'list_method', 'ListObject', 'list', 'splice', 1, 1, [2]] + ], + [ + [[], [], []], + [[1], [1], []] + ] + ); + }, + + testListUpdateNotifications() { + var config = { schema: [schemas.IntPrimary, PrimaryListObject] }; + return createCollectionChangeTest( + config, + function(realm) { + let listObject; + realm.write(() => { + listObject = realm.create('PrimaryListObject', {list: [[0, '0'], [1, '1']]}) + }); + return listObject.list; + }, + [ + [config, 'update', 'IntPrimaryObject', [[1, '11']]] + ], + [ + [[], [], []], + [[], [], [1]] + ] + ); + }, +}; + diff --git a/tests/js/package.json b/tests/js/package.json index 07bbe26a..c7afa5d5 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -1,5 +1,8 @@ { "name": "realm-tests", "version": "0.0.1", - "private": true + "private": true, + "dependencies": { + "es6-promise": "^3.2.1" + } } diff --git a/tests/js/realm-tests.js b/tests/js/realm-tests.js index a9fca21e..406b88b7 100644 --- a/tests/js/realm-tests.js +++ b/tests/js/realm-tests.js @@ -33,7 +33,7 @@ module.exports = { testRealmConstructorPath: function() { TestCase.assertThrows(function() { - new Realm('/invalidpath'); + new Realm(''); }, 'Realm cannot be created with an invalid path'); TestCase.assertThrows(function() { new Realm('test1.realm', 'invalidArgument'); diff --git a/tests/js/worker-tests-script.js b/tests/js/worker-tests-script.js index ec16d13b..9fa29a05 100644 --- a/tests/js/worker-tests-script.js +++ b/tests/js/worker-tests-script.js @@ -23,30 +23,39 @@ const Realm = require('../..'); -const handlers = { - create(options) { - let realm = new Realm(options.config); - - realm.write(() => { - realm.create(options.type, options.properties); - }); - } -}; - process.on('message', (message) => { process.send(handleMessage(message)); }); function handleMessage(message) { let error, result; + if (message[0] == 'echo') { + return {result: message[1]} + } try { - let handler = handlers[message.action]; - if (handler) { - result = handler(message); - } else { - throw new Error('Unknown worker action: ' + message.action); - } + let realm = new Realm(message[0]); + realm.write(() => { + if (message[1] == 'create') { + result = message[3].map((value) => realm.create(message[2], value)); + } + else if (message[1] == 'delete') { + let objects = realm.objects(message[2]); + objects = message[3].map((index) => objects[index]); + realm.delete(objects); + } + else if (message[1] == 'update') { + result = message[3].map((value) => realm.create(message[2], value, true)); + } + else if (message[1] == 'list_method') { + var listObject = realm.objects(message[2])[0]; + var list = listObject[message[3]]; + result = list[message[4]].apply(list, message.slice(5)); + } + else { + throw new Error('Unknown realm method: ' + message[1]); + } + }); } catch (e) { console.warn(e); error = e.message; diff --git a/tests/js/worker-tests.js b/tests/js/worker-tests.js deleted file mode 100644 index d3bbba4f..00000000 --- a/tests/js/worker-tests.js +++ /dev/null @@ -1,76 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// 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. -// -//////////////////////////////////////////////////////////////////////////// - -/* eslint-env es6, node */ - -'use strict'; - -const Realm = require('realm'); -const TestCase = require('./asserts'); -const schemas = require('./schemas'); -const Worker = require('./worker'); - -module.exports = { - testChangeNotifications() { - return new Promise((resolve, reject) => { - let config = {schema: [schemas.TestObject]}; - let realm = new Realm(config); - let objects = realm.objects('TestObject'); - let worker = new Worker(__dirname + '/worker-tests-script.js'); - - // Test will fail if it does not receive a change event within a second. - let timer = setTimeout(() => { - reject(new Error('Timed out waiting for change notification')); - }, 1000); - - let cleanup = () => { - clearTimeout(timer); - worker.terminate(); - }; - - // Test will pass if it receives a change event and the Realm changed. - realm.addListener('change', () => { - try { - TestCase.assertEqual(objects.length, 1); - TestCase.assertEqual(objects[0].doubleCol, 42); - resolve(); - } catch (e) { - reject(e); - } finally { - cleanup(); - } - }); - - worker.onmessage = (message) => { - if (message.error) { - cleanup(); - reject(message.error); - } - }; - - worker.postMessage({ - action: 'create', - config: config, - type: 'TestObject', - properties: { - doubleCol: 42, - } - }); - }); - } -}; diff --git a/tests/js/worker.js b/tests/js/worker.js index 86b1b6f0..0cf290b3 100644 --- a/tests/js/worker.js +++ b/tests/js/worker.js @@ -31,7 +31,9 @@ class Worker { }); } postMessage(message) { - this._process.send(message); + if (this._process) { + this._process.send(message); + } } terminate() { if (this._process) { diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 00000000..682f5733 --- /dev/null +++ b/tests/package.json @@ -0,0 +1,16 @@ +{ + "name": "realm-tests-jasmine", + "version": "0.0.1", + "private": true, + "dependencies": { + "es6-promise": "^3.2.1", + "jasmine": "^2.5.1", + "jasmine-console-reporter": "^1.2.7", + "jasmine-reporters": "^2.2.0" + }, + "scripts": { + "test": "jasmine spec/unit_tests.js", + "test-sync": "jasmine spec/sync_integration_tests.js", + "postinstall": "rm -f node_modules/realm && ln -s ../.. node_modules/realm" + } +} diff --git a/tests/react-test-app/index.ios.js b/tests/react-test-app/index.ios.js index d1aaaa7b..8f3b7c67 100644 --- a/tests/react-test-app/index.ios.js +++ b/tests/react-test-app/index.ios.js @@ -28,6 +28,36 @@ import { import React from 'react'; import { runTests } from './tests'; +const Realm = require('realm'); + +Realm.Sync.setLogLevel('error'); +var realm; +Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { + console.log(user); + + realm = new Realm({ + sync: { + user: user, + url: 'realm://127.0.0.1:9080/~/demo/realm1' + }, + schema: [{ + name: 'IntObject', + properties: { + int: 'int' + } + }] + }); + + realm.addListener('change', () => { + console.log(realm.objects('IntObject')); + }); + + realm.write(() => { + realm.create('IntObject', {int: realm.objects('IntObject').length}); + }); +}); + + class ReactTests extends React.Component { render() { return ( diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme b/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme index dfdb9ee4..c3a683d9 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme @@ -91,6 +91,13 @@ ReferencedContainer = "container:ReactTests.xcodeproj"> + + + + diff --git a/tests/react-test-app/package.json b/tests/react-test-app/package.json index 1799ba2c..4319ee6d 100644 --- a/tests/react-test-app/package.json +++ b/tests/react-test-app/package.json @@ -6,11 +6,11 @@ "start": "react-native start" }, "dependencies": { - "react": "~15.2.0", - "react-native": "^0.31.0", + "react": "~15.3.1", + "react-native": "^0.34.0", "react-native-fs": "^1.1.0", - "xmlbuilder": "^4.2.1", "realm": "file:../..", - "realm-tests": "file:../js" + "realm-tests": "file:../js", + "xmlbuilder": "^4.2.1" } } diff --git a/tests/spec/helpers/reporters.js b/tests/spec/helpers/reporters.js new file mode 100644 index 00000000..5e56821a --- /dev/null +++ b/tests/spec/helpers/reporters.js @@ -0,0 +1,9 @@ +var jasmineReporters = require('jasmine-reporters'); +var junitReporter = new jasmineReporters.JUnitXmlReporter({ + savePath: '.', + consolidateAll: false +}); +jasmine.getEnv().addReporter(junitReporter); + +var JasmineConsoleReporter = require('jasmine-console-reporter'); +jasmine.getEnv().addReporter(new JasmineConsoleReporter()); \ No newline at end of file diff --git a/tests/spec/support/jasmine.json b/tests/spec/support/jasmine.json new file mode 100644 index 00000000..3ea31669 --- /dev/null +++ b/tests/spec/support/jasmine.json @@ -0,0 +1,11 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "**/*[sS]pec.js" + ], + "helpers": [ + "helpers/**/*.js" + ], + "stopSpecOnExpectationFailure": false, + "random": false +} diff --git a/tests/spec/sync_integration_tests.js b/tests/spec/sync_integration_tests.js new file mode 100644 index 00000000..c4ac38fd --- /dev/null +++ b/tests/spec/sync_integration_tests.js @@ -0,0 +1,99 @@ +"use strict"; + +const spawn = require("child_process").spawn; +const readline = require("readline"); +const fs = require("fs"); +const Realm = require("realm"); + +jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; + +beforeEach(function(done) { + this.objectServer = spawn("sync-bundle/start-object-server.command"); + this.objectServer.once("close", (code) => { + if (typeof code === "number" && code != 0) { + console.error(`Object Server exited with code ${code}`); + process.exit(-1); + } + }); + + this.rl = readline.createInterface({ input: this.objectServer.stdout }); + this.rl.on("line", (line) => { + var match; + if ((match = line.match(/Connection\[1\]: Session\[1\]: Received: BIND\(server_path='\/(.+)',/))) { + var adminUser = Realm.Sync.User.adminUser('http://127.0.0.1:9080/', + fs.readFileSync("sync-bundle/admin_token.base64", "utf-8")); + this.adminRealmPath = match[1]; + this.adminRealm = new Realm({ + path: "__admin.realm", + sync: { + user: adminUser, + url: `realm://127.0.0.1:9080/${this.adminRealmPath}` + }, + schema: [ + { + name: "RealmFile", + properties: { + id: 'string', + path: 'string' + } + } + ] + }); + + done(); + } + }); +}); + +afterEach(function(done) { + this.rl.close(); + this.objectServer.kill('SIGKILL'); + this.adminRealm.close(); + + let reset = spawn("sync-bundle/reset-server-realms.command"); + reset.once("close", done); + reset.stdin.write("yes\n"); + + Realm.clearTestState(); +}); + +describe("Sync", function() { + it("should work", function(done) { + Realm.Sync.User.create('http://127.0.0.1:9080/', 'foo', 'bar', function(error) { + if (error) { + fail(error); + return; + } + + Realm.Sync.User.login('http://127.0.0.1:9080/', 'foo', 'bar', function(error, user) { + if (error) { + fail(error); + return; + } + + var realm = new Realm({ + syncConfig: { + identity: user.identity, + url: 'realm://127.0.0.1:9080/~/demo/realm1' + }, + schema: [ + { + name: 'IntObject', + properties: { + int: 'int' + } + } + ] + }); + }); + }); + + var realms = this.adminRealm.objects("RealmFile"); + realms.addListener((sender, changeset) => { + if (changeset.insertions.length === 1) { + expect(realms[changeset.insertions[0]].path).toMatch(/demo\/realm1$/); + done(); + } + }); + }); +}); \ No newline at end of file diff --git a/tests/spec/unit_tests.js b/tests/spec/unit_tests.js new file mode 100644 index 00000000..91ecec09 --- /dev/null +++ b/tests/spec/unit_tests.js @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +/* eslint-env es6, node */ +/* eslint-disable no-console */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const Realm = require('../..'); +const RealmTests = require('../js'); + +// Create this method with appropriate implementation for Node testing. +Realm.copyBundledRealmFiles = function() { + let sourceDir = path.join(__dirname, '../data'); + let destinationDir = path.dirname(Realm.defaultPath); + + for (let filename of fs.readdirSync(sourceDir)) { + let src = path.join(sourceDir, filename); + let dest = path.join(destinationDir, filename); + + // If the destination file already exists, then don't overwrite it. + try { + fs.accessSync(dest); + continue; + } catch (e) {} + + fs.writeFileSync(dest, fs.readFileSync(src)); + } +}; + +const tests = RealmTests.getTestNames(); +for (const suiteName in tests) { + describe(suiteName, () => { + beforeEach(() => RealmTests.runTest(suiteName, 'beforeEach')); + + for (const testName of tests[suiteName]) { + it(testName, () => { + try { + RealmTests.runTest(suiteName, testName) + } + catch (e) { + fail(e); + } + + }); + } + + afterEach(() => RealmTests.runTest(suiteName, 'afterEach')); + }); +} + +const asyncTests = require('../js/async-tests'); +describe('AsyncTests', () => { + beforeEach(() => Realm.clearTestState()); + + for (const testName in asyncTests) { + it(testName, (done) => asyncTests[testName]().catch((e) => fail(e)).then(done)); + } + + afterEach(() => Realm.clearTestState()); +}); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..5b026cbf --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1 @@ +/realm/ From 857369f5a42442c9a0c4516cabcc70e7d6b0f145 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 4 Oct 2016 17:27:09 -0700 Subject: [PATCH 002/100] download core and sync and get the test app running on sync --- .../ios/RealmReact.xcodeproj/project.pbxproj | 6 +- .../xcschemes/RealmReact.xcscheme | 2 +- scripts/download-core.sh | 94 +++++--- src/RealmJS.xcodeproj/project.pbxproj | 222 ++++++++++-------- .../xcschemes/GCDWebServers.xcscheme | 2 +- .../xcshareddata/xcschemes/RealmJS.xcscheme | 2 +- .../xcshareddata/xcschemes/RealmNode.xcscheme | 2 +- src/js_sync.hpp | 10 +- src/object-store | 2 +- .../ios/ReactTests.xcodeproj/project.pbxproj | 27 ++- .../xcschemes/ReactTestApp.xcscheme | 2 +- 11 files changed, 230 insertions(+), 141 deletions(-) diff --git a/react-native/ios/RealmReact.xcodeproj/project.pbxproj b/react-native/ios/RealmReact.xcodeproj/project.pbxproj index 91604d5c..1818e93b 100644 --- a/react-native/ios/RealmReact.xcodeproj/project.pbxproj +++ b/react-native/ios/RealmReact.xcodeproj/project.pbxproj @@ -341,11 +341,12 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../src/**", - "$(SRCROOT)/../../vendor", + "$(SRCROOT)/../../vendor/core/include", "$(SRCROOT)/../../vendor/GCDWebServer/GCDWebServer/**", "$(SRCROOT)/../../../react-native/React/**", "$(SRCROOT)/../../tests/react-test-app/node_modules/react-native/React/**", "$(SRCROOT)/../../examples/ReactExample/node_modules/react-native/React/**", + "$(SRCROOT)/../../vendor", ); OTHER_LIBTOOLFLAGS = "$(BUILT_PRODUCTS_DIR)/libRealmJS.a $(BUILT_PRODUCTS_DIR)/libGCDWebServers.a"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -359,11 +360,12 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../src/**", - "$(SRCROOT)/../../vendor", + "$(SRCROOT)/../../vendor/core/include", "$(SRCROOT)/../../vendor/GCDWebServer/GCDWebServer/**", "$(SRCROOT)/../../../react-native/React/**", "$(SRCROOT)/../../tests/react-test-app/node_modules/react-native/React/**", "$(SRCROOT)/../../examples/ReactExample/node_modules/react-native/React/**", + "$(SRCROOT)/../../vendor", ); OTHER_LIBTOOLFLAGS = "$(BUILT_PRODUCTS_DIR)/libRealmJS.a"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/react-native/ios/RealmReact.xcodeproj/xcshareddata/xcschemes/RealmReact.xcscheme b/react-native/ios/RealmReact.xcodeproj/xcshareddata/xcschemes/RealmReact.xcscheme index 3a668563..d884d069 100644 --- a/react-native/ios/RealmReact.xcodeproj/xcshareddata/xcschemes/RealmReact.xcscheme +++ b/react-native/ios/RealmReact.xcodeproj/xcshareddata/xcschemes/RealmReact.xcscheme @@ -1,6 +1,6 @@ ::create_constructor(ContextType ctx) { }); #endif -#if !REALM_DEVELOPER_EDITION +#if REALM_ENTERPRISE_EDITION SyncEnterpriseClass::add_methods(ctx, sync_constructor); #endif @@ -215,10 +215,10 @@ void SyncClass::populate_sync_config(ContextType ctx, ObjectType config_objec template void SyncClass::get_is_developer_edition(ContextType ctx, ObjectType object, ReturnValue &return_value) { -#if REALM_DEVELOPER_EDITION - return_value.set(true); -#else +#if REALM_ENTERPRISE_EDITION return_value.set(false); +#else + return_value.set(true); #endif } diff --git a/src/object-store b/src/object-store index c3e4be6d..8d891030 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit c3e4be6d6cd0bf3e010e169b9793087e60eb52bb +Subproject commit 8d8910304befb991331fda8c2aa286415fa38cee diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index 7f3be991..83846488 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -73,6 +73,13 @@ remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = ReactTests; }; + 02022A7E1DA47F06000F0C4F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F60690521CA2831E0003FB26 /* RealmReact.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = F60690121CA2766F0003FB26; + remoteInfo = RealmReact; + }; 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; @@ -378,6 +385,7 @@ buildRules = ( ); dependencies = ( + 02022A7F1DA47F06000F0C4F /* PBXTargetDependency */, ); name = ReactTestApp; productName = "Hello World"; @@ -390,7 +398,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = Realm; TargetAttributes = { 00E356ED1AD99517003FC87E = { @@ -578,7 +586,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\" \nif [ -z \"$TEST_SCRIPT\" ]; then\n npm install realm realm-tests\nfi\ncp ../../../src/object-store/tests/query.json ../node_modules/realm-tests/query-tests.json\n"; + shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\" \nif [ -z \"$TEST_SCRIPT\" ]; then\n #npm install realm realm-tests\n echo a\nfi\ncp ../../../src/object-store/tests/query.json ../node_modules/realm-tests/query-tests.json\n"; }; F6EDE5BF1C49007200B1085F /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; @@ -623,6 +631,11 @@ target = 13B07F861A680F5B00A75B9A /* ReactTestApp */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; + 02022A7F1DA47F06000F0C4F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RealmReact; + targetProxy = 02022A7E1DA47F06000F0C4F /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -713,8 +726,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -723,6 +738,7 @@ ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -741,7 +757,7 @@ "$(SRCROOT)/../node_modules/react-native/React/Base/**", "$(SRCROOT)/../node_modules/react-native/React/Modules", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "io.realm.$(PRODUCT_NAME:rfc1034identifier)"; @@ -762,8 +778,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -771,6 +789,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -783,7 +802,7 @@ "$(SRCROOT)/../node_modules/react-native/React/Base/**", "$(SRCROOT)/../node_modules/react-native/React/Modules", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "io.realm.$(PRODUCT_NAME:rfc1034identifier)"; SDKROOT = iphoneos; diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme b/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme index c3a683d9..8b4f45ce 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/xcshareddata/xcschemes/ReactTestApp.xcscheme @@ -1,6 +1,6 @@ Date: Sat, 8 Oct 2016 19:36:03 +0200 Subject: [PATCH 003/100] prepare for the glorious future --- binding.gyp | 8 ++---- package.json | 2 +- scripts/build-node-pre-gyp.sh | 4 +-- src/js_sync.hpp | 23 +--------------- src/node/gyp/realm.gyp | 46 ------------------------------- src/node/gyp/target_defaults.gypi | 4 ++- src/node/node_types.hpp | 3 ++ 7 files changed, 11 insertions(+), 79 deletions(-) diff --git a/binding.gyp b/binding.gyp index 9570c888..ae4a3510 100644 --- a/binding.gyp +++ b/binding.gyp @@ -5,9 +5,6 @@ ], "targets": [ { - "variables": { - "developer_edition%": "0" - }, "target_name": "realm", "dependencies": [ "object-store" @@ -21,14 +18,13 @@ "include_dirs": [ "src" ], - "defines": [ "REALM_DEVELOPER_EDITION=<(developer_edition)" ], "link_settings": { "ldflags": [ - "-Wl,--exclude-libs=ALL" + "-Wl,--whole-archive,-lrealm-node,--no-whole-archive" ] }, "xcode_settings": { - "OTHER_LDFLAGS": [ "-Xlinker -unexported_symbol -Xlinker '*'" ] + "OTHER_LDFLAGS": [ "-all_load", "-lrealm-node" ] } }, { diff --git a/package.json b/package.json index 4cc27420..4a2de659 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "jsdoc": "rm -rf docs/output && jsdoc -c docs/conf.json", "lint": "eslint", "test": "scripts/test.sh", - "install": "node-pre-gyp install --build-from-source" + "install": "node-pre-gyp install --fallback-to-build" }, "dependencies": { "nan": "^2.3.3", diff --git a/scripts/build-node-pre-gyp.sh b/scripts/build-node-pre-gyp.sh index 569f2acb..ba0998b7 100755 --- a/scripts/build-node-pre-gyp.sh +++ b/scripts/build-node-pre-gyp.sh @@ -9,8 +9,6 @@ die() { exit 1 } -. ${topdir}/dependencies.list - mkdir -p ${topdir}/out : ${NVM_DIR=$topdir/.nvm} @@ -37,7 +35,7 @@ for node_version in ${node_versions}; do nvm install ${node_version} || die "Could not install nodejs v${node_version}" nvm use ${node_version} || die "Could not load nodejs v${node_version}" - npm install "$EXTRA_NPM_ARGUMENTS" || die "Could not build module" + npm install --build-from-source "$EXTRA_NPM_ARGUMENTS" || die "Could not build module" #./scripts/test.sh node || die "Unit tests for nodejs v${node_version} failed" ./node_modules/.bin/node-pre-gyp package || die "Could not package module" cp build/stage/node-pre-gyp/*.tar.gz ${topdir}/out/ diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 40739a57..d859b783 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -34,10 +34,6 @@ #include "node/node_sync_logger.hpp" #endif -#if REALM_ENTERPRISE_EDITION -#include "js_enterprise.hpp" -#endif - namespace realm { namespace js { @@ -82,10 +78,6 @@ public: {"setSyncLogger", wrap}, #endif }; - - PropertyMap const static_properties { - {"isDeveloperEdition", {wrap, nullptr}} - }; }; template @@ -137,10 +129,6 @@ inline typename T::Function SyncClass::create_constructor(ContextType ctx) { }); #endif -#if REALM_ENTERPRISE_EDITION - SyncEnterpriseClass::add_methods(ctx, sync_constructor); -#endif - return sync_constructor; } @@ -165,7 +153,7 @@ void SyncClass::set_verify_servers_ssl_certificate(ContextType ctx, ObjectTyp realm::SyncManager::shared().set_client_should_validate_ssl(verify_servers_ssl_certificate); } -#if REALM_HAVE_NODE_SYNC_LOGGER +#if REALM_PLATFORM_NODE template void SyncClass::set_sync_logger(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 1); @@ -213,14 +201,5 @@ void SyncClass::populate_sync_config(ContextType ctx, ObjectType config_objec } } -template -void SyncClass::get_is_developer_edition(ContextType ctx, ObjectType object, ReturnValue &return_value) { -#if REALM_ENTERPRISE_EDITION - return_value.set(false); -#else - return_value.set(true); -#endif -} - } // js } // realm diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index 09b57ca9..2f48ba83 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -1,21 +1,8 @@ { - "variables": { - "use_realm_debug": " #include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wundef" #include +#pragma GCC diagnostic pop #include "js_types.hpp" From 0ff7357cc3cce2ccfd38668f4a677bb131324015 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Mon, 10 Oct 2016 14:20:33 +0200 Subject: [PATCH 004/100] Build for node without sync --- lib/index.js | 4 +++- src/js_realm.hpp | 13 ++++++++++--- src/object-store | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/index.js b/lib/index.js index 69643e20..37304227 100644 --- a/lib/index.js +++ b/lib/index.js @@ -46,7 +46,9 @@ if (typeof Realm != 'undefined') { Object.defineProperties(realmConstructor.Collection.prototype, require('./collection-methods')); // Add sync methods -realmConstructor.Sync.User = require('./sync').User; +if (realmConstructor.Sync) { + realmConstructor.Sync.User = require('./sync').User; +} // TODO: Remove this now useless object. var types = Object.freeze({ diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 642b3b4a..31cc2448 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -29,13 +29,16 @@ #include "js_results.hpp" #include "js_schema.hpp" #include "js_observable.hpp" + +#if REALM_ENABLE_SYNC #include "js_sync.hpp" +#include "sync_config.hpp" +#endif #include "shared_realm.hpp" #include "binding_context.hpp" #include "object_accessor.hpp" #include "platform.hpp" -#include "sync_config.hpp" namespace realm { namespace js { @@ -259,14 +262,17 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { FunctionType list_constructor = ObjectWrap>::create_constructor(ctx); FunctionType results_constructor = ObjectWrap>::create_constructor(ctx); FunctionType realm_object_constructor = ObjectWrap>::create_constructor(ctx); - FunctionType sync_constructor = SyncClass::create_constructor(ctx); PropertyAttributes attributes = ReadOnly | DontEnum | DontDelete; Object::set_property(ctx, realm_constructor, "Collection", collection_constructor, attributes); Object::set_property(ctx, realm_constructor, "List", list_constructor, attributes); Object::set_property(ctx, realm_constructor, "Results", results_constructor, attributes); Object::set_property(ctx, realm_constructor, "Object", realm_object_constructor, attributes); + +#if REALM_ENABLE_SYNC + FunctionType sync_constructor = SyncClass::create_constructor(ctx); Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); +#endif return realm_constructor; } @@ -383,8 +389,9 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t std::string encryption_key = NativeAccessor::to_binary(ctx, encryption_key_value); config.encryption_key = std::vector(encryption_key.begin(), encryption_key.end()); } - +#if REALM_ENABLE_SYNC SyncClass::populate_sync_config(ctx, object, config); +#endif } } else { diff --git a/src/object-store b/src/object-store index 8d891030..23ce6be5 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 8d8910304befb991331fda8c2aa286415fa38cee +Subproject commit 23ce6be5d581488887909ea57764369708cf267b From 28924b4f992f05f8f05e53e066ccd4fab853cd03 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Mon, 10 Oct 2016 14:20:54 +0200 Subject: [PATCH 005/100] Build the node addon as a static library --- binding.gyp | 89 +++++++++++++++++++------------ src/node/gyp/realm.gyp | 51 +++++++++++++++++- src/node/gyp/target_defaults.gypi | 5 -- 3 files changed, 104 insertions(+), 41 deletions(-) diff --git a/binding.gyp b/binding.gyp index ae4a3510..c98dd836 100644 --- a/binding.gyp +++ b/binding.gyp @@ -1,4 +1,7 @@ { + "variables": { + "realm_node_build_as_library%": "0" + }, "includes": [ "src/node/gyp/target_defaults.gypi", "src/node/gyp/realm.gyp" @@ -10,37 +13,39 @@ "object-store" ], "sources": [ - "src/node/node_sync_logger.cpp", - "src/node/node_init.cpp", "src/node/platform.cpp", "src/js_realm.cpp" ], "include_dirs": [ "src" ], - "link_settings": { - "ldflags": [ - "-Wl,--whole-archive,-lrealm-node,--no-whole-archive" - ] - }, - "xcode_settings": { - "OTHER_LDFLAGS": [ "-all_load", "-lrealm-node" ] - } + "conditions": [ + ["realm_node_build_as_library", { + "type": "static_library", + "export_dependent_settings": [ "object-store" ] + }, { + "sources": [ + "src/node/node_init.cpp" + ] + }], + ["realm_enable_sync", { + "sources": [ + "src/node/node_sync_logger.cpp" + ] + }] + ] }, { - "variables": { - "object-store-include-dirs": [ - "src/object-store/src", - "src/object-store/src/impl", - "src/object-store/src/impl/apple", - "src/object-store/src/parser", - "src/object-store/external/pegtl" - ] - }, "target_name": "object-store", - "dependencies": [ "realm-sync" ], # sync also includes core + "dependencies": [ "realm-core" ], "type": "static_library", - "include_dirs": [ "<@(object-store-include-dirs)" ], + "include_dirs": [ + "src/object-store/src", + "src/object-store/src/impl", + "src/object-store/src/impl/apple", + "src/object-store/src/parser", + "src/object-store/external/pegtl" + ], "sources": [ "src/object-store/src/collection_notifications.cpp", "src/object-store/src/index_set.cpp", @@ -50,10 +55,7 @@ "src/object-store/src/results.cpp", "src/object-store/src/schema.cpp", "src/object-store/src/shared_realm.cpp", - "src/object-store/src/sync_manager.cpp", - "src/object-store/src/sync_session.cpp", "src/object-store/src/thread_confined.cpp", - "src/object-store/src/global_notifier.cpp", "src/object-store/src/impl/collection_change_builder.cpp", "src/object-store/src/impl/collection_notifier.cpp", "src/object-store/src/impl/handover.cpp", @@ -77,25 +79,44 @@ "sources": [ "src/object-store/src/impl/apple/external_commit_helper.cpp" ] + }], + ["realm_enable_sync", { + "dependencies": [ "realm-sync" ], + "sources": [ + "src/object-store/src/sync_manager.cpp", + "src/object-store/src/sync_session.cpp" + ] }] ], "all_dependent_settings": { - "include_dirs": [ "<@(object-store-include-dirs)" ] + "include_dirs": [ + "src/object-store/src", + "src/object-store/src/impl", + "src/object-store/src/impl/apple", + "src/object-store/src/parser", + "src/object-store/external/pegtl" + ] }, "export_dependent_settings": [ "<@(_dependencies)" # re-export settings related to linking the realm binaries ] - }, - { - "target_name": "action_after_build", - "type": "none", - "dependencies": [ "<(module_name)" ], - "copies": [ + } + ], + "conditions": [ + ["not realm_node_build_as_library", { + "targets": [ { - "files": [ "<(PRODUCT_DIR)/<(module_name).node" ], - "destination": "<(module_path)" + "target_name": "action_after_build", + "type": "none", + "dependencies": [ "<(module_name)" ], + "copies": [ + { + "files": [ "<(PRODUCT_DIR)/<(module_name).node" ], + "destination": "<(module_path)" + } + ] } ] - } + }] ] } diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index 2f48ba83..d2871740 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -1,10 +1,24 @@ { + "variables": { + "use_realm_debug": " Date: Mon, 10 Oct 2016 16:17:05 +0200 Subject: [PATCH 006/100] refactor Realm constructor wireup --- lib/index.js | 40 +-------------------------------- lib/wireup.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 39 deletions(-) create mode 100644 lib/wireup.js diff --git a/lib/index.js b/lib/index.js index 37304227..8b3623a5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,44 +42,6 @@ if (typeof Realm != 'undefined') { throw new Error('Missing Realm constructor - please ensure RealmReact framework is included!'); } -// Add the specified Array methods to the Collection prototype. -Object.defineProperties(realmConstructor.Collection.prototype, require('./collection-methods')); - -// Add sync methods -if (realmConstructor.Sync) { - realmConstructor.Sync.User = require('./sync').User; -} - -// TODO: Remove this now useless object. -var types = Object.freeze({ - 'BOOL': 'bool', - 'INT': 'int', - 'FLOAT': 'float', - 'DOUBLE': 'double', - 'STRING': 'string', - 'DATE': 'date', - 'DATA': 'data', - 'OBJECT': 'object', - 'LIST': 'list', -}); -Object.defineProperty(realmConstructor, 'Types', { - get: function() { - if (typeof console != 'undefined') { - /* global console */ - /* eslint-disable no-console */ - var stack = new Error().stack.split("\n").slice(2).join("\n"); - var msg = '`Realm.Types` is deprecated! Please specify the type name as lowercase string instead!\n'+stack; - if (console.warn != undefined) { - console.warn(msg); - } - else { - console.log(msg); - } - /* eslint-enable no-console */ - } - return types; - }, - configurable: true -}); +require('./wireup')(realmConstructor); module.exports = realmConstructor; diff --git a/lib/wireup.js b/lib/wireup.js new file mode 100644 index 00000000..09c456df --- /dev/null +++ b/lib/wireup.js @@ -0,0 +1,61 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +'use strict'; + +module.exports = function(realmConstructor) { + // Add the specified Array methods to the Collection prototype. + Object.defineProperties(realmConstructor.Collection.prototype, require('./collection-methods')); + + // Add sync methods + if (realmConstructor.Sync) { + realmConstructor.Sync.User = require('./sync').User; + } + + // TODO: Remove this now useless object. + var types = Object.freeze({ + 'BOOL': 'bool', + 'INT': 'int', + 'FLOAT': 'float', + 'DOUBLE': 'double', + 'STRING': 'string', + 'DATE': 'date', + 'DATA': 'data', + 'OBJECT': 'object', + 'LIST': 'list', + }); + Object.defineProperty(realmConstructor, 'Types', { + get: function() { + if (typeof console != 'undefined') { + /* global console */ + /* eslint-disable no-console */ + var stack = new Error().stack.split("\n").slice(2).join("\n"); + var msg = '`Realm.Types` is deprecated! Please specify the type name as lowercase string instead!\n'+stack; + if (console.warn != undefined) { + console.warn(msg); + } + else { + console.log(msg); + } + /* eslint-enable no-console */ + } + return types; + }, + configurable: true + }); +} \ No newline at end of file From 3a8ed6cbe6381635b5d575b6ae24c50b95443965 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Mon, 10 Oct 2016 18:09:25 +0200 Subject: [PATCH 007/100] fix linux build. again. --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index 23ce6be5..44979ba8 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 23ce6be5d581488887909ea57764369708cf267b +Subproject commit 44979ba8f0cb897e9410a7dbf86a0d19db236449 From 245328009a217ae7a4711d293f23dd6156c4229d Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 11 Oct 2016 00:38:32 +0200 Subject: [PATCH 008/100] expose the node class constructor --- src/node/gyp/target_defaults.gypi | 1 + src/node/node_class.hpp | 57 ++++++++++++++++--------------- src/node/node_return_value.hpp | 4 +-- src/node/node_types.hpp | 18 +++++----- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/node/gyp/target_defaults.gypi b/src/node/gyp/target_defaults.gypi index fbc7667c..76d6149e 100644 --- a/src/node/gyp/target_defaults.gypi +++ b/src/node/gyp/target_defaults.gypi @@ -5,6 +5,7 @@ "-Wno-missing-field-initializers", "-Wno-return-type", "-Wno-unused-result", + "-Wno-deprecated-declarations", "-Wundef" ] }, diff --git a/src/node/node_class.hpp b/src/node/node_class.hpp index 4072cd3e..fa10fc7c 100644 --- a/src/node/node_class.hpp +++ b/src/node/node_class.hpp @@ -49,6 +49,8 @@ class ObjectWrap : public Nan::ObjectWrap { return Nan::New(js_template); } + static void construct(const v8::FunctionCallbackInfo&); + static bool has_instance(v8::Isolate* isolate, const v8::Local &value) { return get_template()->HasInstance(value); } @@ -73,27 +75,26 @@ class ObjectWrap : public Nan::ObjectWrap { static v8::Local create_template(); - static void setup_method(v8::Local, const std::string &, Nan::FunctionCallback); - static void setup_static_method(v8::Local, const std::string &, Nan::FunctionCallback); + static void setup_method(v8::Local, const std::string &, v8::FunctionCallback); + static void setup_static_method(v8::Local, const std::string &, v8::FunctionCallback); template static void setup_property(v8::Local, const std::string &, const PropertyType &); - static void construct(Nan::NAN_METHOD_ARGS_TYPE); - static void get_indexes(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE); - static void set_property(v8::Local, v8::Local, Nan::NAN_PROPERTY_SETTER_ARGS_TYPE); + static void get_indexes(const v8::PropertyCallbackInfo&); + static void set_property(v8::Local, v8::Local, const v8::PropertyCallbackInfo&); - static void set_readonly_property(v8::Local property, v8::Local value, Nan::NAN_SETTER_ARGS_TYPE info) { + static void set_readonly_property(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info) { std::string message = std::string("Cannot assign to read only property '") + std::string(String(property)) + "'"; Nan::ThrowError(message.c_str()); } - static void set_readonly_index(uint32_t index, v8::Local value, Nan::NAN_INDEX_SETTER_ARGS_TYPE info) { + static void set_readonly_index(uint32_t index, v8::Local value, const v8::PropertyCallbackInfo& info) { std::string message = std::string("Cannot assign to read only index ") + util::to_string(index); Nan::ThrowError(message.c_str()); } - static void get_nonexistent_property(v8::Local, Nan::NAN_PROPERTY_GETTER_ARGS_TYPE) { + static void get_nonexistent_property(v8::Local, const v8::PropertyCallbackInfo&) { // Do nothing. This function exists only to prevent a crash where it is used. } }; @@ -109,7 +110,7 @@ class ObjectWrap { }; // This helper function is needed outside the scope of the ObjectWrap class as well. -static inline std::vector> get_arguments(const Nan::FunctionCallbackInfo &info) { +static inline std::vector> get_arguments(const v8::FunctionCallbackInfo &info) { int count = info.Length(); std::vector> arguments; arguments.reserve(count); @@ -156,7 +157,7 @@ template inline v8::Local ObjectWrap::create_template() { Nan::EscapableHandleScope scope; - v8::Local tpl = Nan::New(construct); + v8::Local tpl = v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), construct); v8::Local instance_tpl = tpl->InstanceTemplate(); v8::Local name = Nan::New(s_class.name).ToLocalChecked(); @@ -181,21 +182,21 @@ inline v8::Local ObjectWrap::create_template() if (s_class.index_accessor.getter) { auto &index_accessor = s_class.index_accessor; - Nan::SetIndexedPropertyHandler(instance_tpl, index_accessor.getter, index_accessor.setter ?: set_readonly_index, 0, 0, get_indexes); + instance_tpl->SetIndexedPropertyHandler(index_accessor.getter, index_accessor.setter ?: set_readonly_index, 0, 0, get_indexes); } if (s_class.string_accessor.getter || s_class.index_accessor.getter || s_class.index_accessor.setter) { // Use our own wrapper for the setter since we want to throw for negative indices. auto &string_accessor = s_class.string_accessor; - Nan::SetNamedPropertyHandler(instance_tpl, string_accessor.getter ?: get_nonexistent_property, set_property, 0, 0, string_accessor.enumerator); + instance_tpl->SetNamedPropertyHandler(string_accessor.getter ?: get_nonexistent_property, set_property, 0, 0, string_accessor.enumerator); } return scope.Escape(tpl); } template -inline void ObjectWrap::setup_method(v8::Local tpl, const std::string &name, Nan::FunctionCallback callback) { +inline void ObjectWrap::setup_method(v8::Local tpl, const std::string &name, v8::FunctionCallback callback) { v8::Local signature = Nan::New(tpl); - v8::Local fn_tpl = Nan::New(callback, v8::Local(), signature); + v8::Local fn_tpl = v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), callback, v8::Local(), signature); v8::Local fn_name = Nan::New(name).ToLocalChecked(); // The reason we use this rather than Nan::SetPrototypeMethod is DontEnum. @@ -204,8 +205,8 @@ inline void ObjectWrap::setup_method(v8::Local } template -inline void ObjectWrap::setup_static_method(v8::Local tpl, const std::string &name, Nan::FunctionCallback callback) { - v8::Local fn_tpl = Nan::New(callback); +inline void ObjectWrap::setup_static_method(v8::Local tpl, const std::string &name, v8::FunctionCallback callback) { + v8::Local fn_tpl = v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), callback); v8::Local fn_name = Nan::New(name).ToLocalChecked(); tpl->Set(fn_name, fn_tpl, v8::PropertyAttribute::DontEnum); @@ -218,11 +219,11 @@ inline void ObjectWrap::setup_property(v8::Local target, v8::Local prop_name = Nan::New(name).ToLocalChecked(); v8::PropertyAttribute attributes = v8::PropertyAttribute(v8::DontEnum | v8::DontDelete); - Nan::SetAccessor(target, prop_name, property.getter, property.setter ?: set_readonly_property, v8::Local(), v8::DEFAULT, attributes); + target->SetAccessor(prop_name, property.getter, property.setter ?: set_readonly_property, v8::Local(), v8::DEFAULT, attributes); } template -inline void ObjectWrap::construct(Nan::NAN_METHOD_ARGS_TYPE info) { +inline void ObjectWrap::construct(const v8::FunctionCallbackInfo& info) { if (!info.IsConstructCall()) { Nan::ThrowError("Constructor must be called with new"); } @@ -248,7 +249,7 @@ inline void ObjectWrap::construct(Nan::NAN_METHOD_ARGS_TYPE info) { } template -inline void ObjectWrap::get_indexes(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info) { +inline void ObjectWrap::get_indexes(const v8::PropertyCallbackInfo& info) { uint32_t length; try { length = Object::validated_get_length(info.GetIsolate(), info.This()); @@ -267,7 +268,7 @@ inline void ObjectWrap::get_indexes(Nan::NAN_INDEX_ENUMERATOR_ARGS_TY } template -inline void ObjectWrap::set_property(v8::Local property, v8::Local value, Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info) { +inline void ObjectWrap::set_property(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info) { if (s_class.index_accessor.getter || s_class.index_accessor.setter) { try { // Negative indices are passed into this string property interceptor, so check for them here. @@ -294,7 +295,7 @@ template class ObjectWrap : public node::ObjectWrap {}; template -void wrap(Nan::NAN_METHOD_ARGS_TYPE info) { +void wrap(const v8::FunctionCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); node::ReturnValue return_value(info.GetReturnValue()); auto arguments = node::get_arguments(info); @@ -308,7 +309,7 @@ void wrap(Nan::NAN_METHOD_ARGS_TYPE info) { } template -void wrap(v8::Local property, Nan::NAN_GETTER_ARGS_TYPE info) { +void wrap(v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); node::ReturnValue return_value(info.GetReturnValue()); try { @@ -320,7 +321,7 @@ void wrap(v8::Local property, Nan::NAN_GETTER_ARGS_TYPE info) { } template -void wrap(v8::Local property, v8::Local value, Nan::NAN_SETTER_ARGS_TYPE info) { +void wrap(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); try { F(isolate, info.This(), value); @@ -331,7 +332,7 @@ void wrap(v8::Local property, v8::Local value, Nan::NAN_S } template -void wrap(uint32_t index, Nan::NAN_INDEX_GETTER_ARGS_TYPE info) { +void wrap(uint32_t index, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); node::ReturnValue return_value(info.GetReturnValue()); try { @@ -347,7 +348,7 @@ void wrap(uint32_t index, Nan::NAN_INDEX_GETTER_ARGS_TYPE info) { } template -void wrap(uint32_t index, v8::Local value, Nan::NAN_INDEX_SETTER_ARGS_TYPE info) { +void wrap(uint32_t index, v8::Local value, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); try { if (F(isolate, info.This(), index, value)) { @@ -361,7 +362,7 @@ void wrap(uint32_t index, v8::Local value, Nan::NAN_INDEX_SETTER_ARGS } template -void wrap(v8::Local property, Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info) { +void wrap(v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); node::ReturnValue return_value(info.GetReturnValue()); try { @@ -373,7 +374,7 @@ void wrap(v8::Local property, Nan::NAN_PROPERTY_GETTER_ARGS_TYPE inf } template -void wrap(v8::Local property, v8::Local value, Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info) { +void wrap(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); try { if (F(isolate, info.This(), property, value)) { @@ -387,7 +388,7 @@ void wrap(v8::Local property, v8::Local value, Nan::NAN_P } template -void wrap(Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info) { +void wrap(const v8::PropertyCallbackInfo& info) { auto names = F(info.GetIsolate(), info.This()); int count = (int)names.size(); v8::Local array = Nan::New(count); diff --git a/src/node/node_return_value.hpp b/src/node/node_return_value.hpp index 310cc854..a6986f1e 100644 --- a/src/node/node_return_value.hpp +++ b/src/node/node_return_value.hpp @@ -25,10 +25,10 @@ namespace js { template<> class ReturnValue { - Nan::ReturnValue m_value; + v8::ReturnValue m_value; public: - ReturnValue(Nan::ReturnValue value) : m_value(value) {} + ReturnValue(v8::ReturnValue value) : m_value(value) {} void set(const v8::Local &value) { m_value.Set(value); diff --git a/src/node/node_types.hpp b/src/node/node_types.hpp index 8a189105..66799887 100644 --- a/src/node/node_types.hpp +++ b/src/node/node_types.hpp @@ -46,15 +46,15 @@ struct Types { using Function = v8::Local; using HandleScope = Nan::HandleScope; - using ConstructorCallback = Nan::FunctionCallback; - using FunctionCallback = Nan::FunctionCallback; - using PropertyGetterCallback = Nan::GetterCallback; - using PropertySetterCallback = Nan::SetterCallback; - using IndexPropertyGetterCallback = Nan::IndexGetterCallback; - using IndexPropertySetterCallback = Nan::IndexSetterCallback; - using StringPropertyGetterCallback = Nan::PropertyGetterCallback; - using StringPropertySetterCallback = Nan::PropertySetterCallback; - using StringPropertyEnumeratorCallback = Nan::PropertyEnumeratorCallback; + using ConstructorCallback = v8::FunctionCallback; + using FunctionCallback = v8::FunctionCallback; + using PropertyGetterCallback = v8::AccessorGetterCallback; + using PropertySetterCallback = v8::AccessorSetterCallback; + using IndexPropertyGetterCallback = v8::IndexedPropertyGetterCallback; + using IndexPropertySetterCallback = v8::IndexedPropertySetterCallback; + using StringPropertyGetterCallback = v8::NamedPropertyGetterCallback; + using StringPropertySetterCallback = v8::NamedPropertySetterCallback; + using StringPropertyEnumeratorCallback = v8::NamedPropertyEnumeratorCallback; }; template From 3dc968cfe28c1f3f001af7cbd1ee3e098685f346 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 11 Oct 2016 00:45:01 +0200 Subject: [PATCH 009/100] rename wireup --- lib/{wireup.js => extensions.js} | 0 lib/index.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename lib/{wireup.js => extensions.js} (100%) diff --git a/lib/wireup.js b/lib/extensions.js similarity index 100% rename from lib/wireup.js rename to lib/extensions.js diff --git a/lib/index.js b/lib/index.js index 8b3623a5..0e5fe471 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,6 +42,6 @@ if (typeof Realm != 'undefined') { throw new Error('Missing Realm constructor - please ensure RealmReact framework is included!'); } -require('./wireup')(realmConstructor); +require('./extensions')(realmConstructor); module.exports = realmConstructor; From 33b87e658214877de9a46e8b19c73947ae778af5 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 11 Oct 2016 01:33:10 +0200 Subject: [PATCH 010/100] remove the node sync logger --- binding.gyp | 5 -- src/js_sync.hpp | 23 +-------- src/node/node_sync_logger.cpp | 94 ----------------------------------- src/node/node_sync_logger.hpp | 89 --------------------------------- 4 files changed, 1 insertion(+), 210 deletions(-) delete mode 100644 src/node/node_sync_logger.cpp delete mode 100644 src/node/node_sync_logger.hpp diff --git a/binding.gyp b/binding.gyp index c98dd836..55075262 100644 --- a/binding.gyp +++ b/binding.gyp @@ -27,11 +27,6 @@ "sources": [ "src/node/node_init.cpp" ] - }], - ["realm_enable_sync", { - "sources": [ - "src/node/node_sync_logger.cpp" - ] }] ] }, diff --git a/src/js_sync.hpp b/src/js_sync.hpp index d859b783..ac50d786 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -30,10 +30,6 @@ #include "realm/util/logger.hpp" #include "realm/util/uri.hpp" -#if REALM_PLATFORM_NODE -#include "node/node_sync_logger.hpp" -#endif - namespace realm { namespace js { @@ -59,10 +55,6 @@ public: static void set_sync_log_level(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void set_verify_servers_ssl_certificate(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); -#if REALM_PLATFORM_NODE - static void set_sync_logger(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); -#endif - // private static void refresh_access_token(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); static void populate_sync_config(ContextType, ObjectType config_object, Realm::Config&); @@ -73,10 +65,7 @@ public: MethodMap const static_methods = { {"refreshAccessToken", wrap}, {"setLogLevel", wrap}, - {"setVerifyServersSslCertificate", wrap}, -#if REALM_PLATFORM_NODE - {"setSyncLogger", wrap}, -#endif + {"setVerifyServersSslCertificate", wrap} }; }; @@ -153,16 +142,6 @@ void SyncClass::set_verify_servers_ssl_certificate(ContextType ctx, ObjectTyp realm::SyncManager::shared().set_client_should_validate_ssl(verify_servers_ssl_certificate); } -#if REALM_PLATFORM_NODE -template -void SyncClass::set_sync_logger(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { - validate_argument_count(argc, 1); - auto callback = Value::validated_to_function(ctx, arguments[0]); - node::SyncLoggerFactory *factory = new node::SyncLoggerFactory(ctx, this_object, callback); // Throws - realm::SyncManager::shared().set_logger_factory(*factory); -} -#endif - template void SyncClass::refresh_access_token(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 2); diff --git a/src/node/node_sync_logger.cpp b/src/node/node_sync_logger.cpp deleted file mode 100644 index 5d66bbc6..00000000 --- a/src/node/node_sync_logger.cpp +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// 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. -// -//////////////////////////////////////////////////////////////////////////// - -#include -#include -#include - -#include "node_init.hpp" -#include "node_class.hpp" -#include "js_realm.hpp" -#include "node_types.hpp" -#include "node_sync_logger.hpp" - -namespace realm { -namespace node { - -SyncLoggerQueue::~SyncLoggerQueue() noexcept -{ - m_callback_this_object.Reset(); - m_callback.Reset(); -} - -void SyncLoggerQueue::log_uv_callback() -{ - // This function is always executed by the Node.js event loop - // thread. - Nan::HandleScope scope; - v8::Local this_object = Nan::New(m_callback_this_object); - v8::Local callback = Nan::New(m_callback); - - std::queue popped; - { - std::lock_guard lock(m_mutex); // Throws - popped.swap(m_log_queue); - } - - for (;;) { - if (popped.empty()) - break; - - Nan::TryCatch trycatch; - v8::Local argv[] = { - Nan::New((int)(popped.front().m_level)), - Nan::New(popped.front().m_message).ToLocalChecked() - }; - Nan::MakeCallback(this_object, callback, 2, argv); - if (trycatch.HasCaught()) { - throw node::Exception(m_v8_isolate, trycatch.Exception()); - } - popped.pop(); - } -} - -void SyncLogger::do_log(realm::util::Logger::Level level, std::string message) -{ - std::lock_guard lock(m_mutex); // Throws - m_log_queue.emplace(level, message); - m_log_uv_async.send(); -} - -SyncLoggerFactory::~SyncLoggerFactory() noexcept -{ - m_callback_this_object.Reset(); - m_callback.Reset(); -} - -std::unique_ptr SyncLoggerFactory::make_logger(util::Logger::Level level) -{ - v8::Local this_object = Nan::New(m_callback_this_object); - v8::Local callback = Nan::New(m_callback); - - SyncLogger *logger = new SyncLogger(m_v8_isolate, this_object, callback); // Throws - logger->set_level_threshold(level); - - return std::unique_ptr(logger); -} - -} // namespace node -} // namespace realm diff --git a/src/node/node_sync_logger.hpp b/src/node/node_sync_logger.hpp deleted file mode 100644 index aec87cbd..00000000 --- a/src/node/node_sync_logger.hpp +++ /dev/null @@ -1,89 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// 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. -// -//////////////////////////////////////////////////////////////////////////// - -#ifndef REALM_NODE_GLOBAL_LOGGER_HPP -#define REALM_NODE_GLOBAL_LOGGER_HPP - -#include -#include -#include - -#include - -#include "node_uv_async.hpp" - -namespace realm { -namespace node { - - struct SyncLoggerMessage { - std::string m_message; - realm::util::Logger::Level m_level; - SyncLoggerMessage(realm::util::Logger::Level level, std::string message): - m_message(message), - m_level(level) { } - }; - - class SyncLoggerQueue { - public: - SyncLoggerQueue(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : - m_log_uv_async([this] { log_uv_callback(); }), // Throws - m_v8_isolate(v8_isolate), - m_callback_this_object(callback_this_object), - m_callback(callback) { } - ~SyncLoggerQueue() noexcept; - - protected: - void log_uv_callback(); - std::queue m_log_queue; - std::mutex m_mutex; - UvAsync m_log_uv_async; - - private: - v8::Isolate* m_v8_isolate; - Nan::Persistent m_callback_this_object; - Nan::Persistent m_callback; - }; - - class SyncLogger: public realm::util::RootLogger, public SyncLoggerQueue { - public: - SyncLogger(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : - SyncLoggerQueue(v8_isolate, callback_this_object, callback) { } - - protected: - void do_log(realm::util::Logger::Level, std::string) override final; - }; - - class SyncLoggerFactory : public realm::SyncLoggerFactory { - public: - SyncLoggerFactory(v8::Isolate* v8_isolate, v8::Local callback_this_object, v8::Local callback) : - m_v8_isolate(v8_isolate), - m_callback_this_object(callback_this_object), - m_callback(callback) { } - ~SyncLoggerFactory() noexcept; - - virtual std::unique_ptr make_logger(util::Logger::Level level); - private: - v8::Isolate* m_v8_isolate; - Nan::Persistent m_callback_this_object; - Nan::Persistent m_callback; - }; - -} // namespace node -} // namespace realm - -#endif // REALM_NODE_GLOBAL_LOGGER_HPP From a37fe03e20c5e9e66dcd61545f441d9214f352c4 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 11 Oct 2016 22:30:39 +0200 Subject: [PATCH 011/100] bring back node ci --- scripts/download-core.sh | 7 +++---- scripts/test.sh | 4 ++++ src/node/gyp/realm.gyp | 43 ++++++++++++++++++++++++---------------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 4f4bf00f..50b965be 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -15,7 +15,6 @@ fi # The 'node' argument will result in realm-node build being downloaded. if [ "$1" = 'node' ]; then CORE_DIR="core-node" - SYNC_DIR="sync-node" if [ "$(uname)" = 'Darwin' ]; then PLATFORM_TAG="node-osx-" @@ -29,11 +28,10 @@ else SYNC_DIR='sync' PLATFORM_TAG="" SYNC_PLATFORM_TAG="cocoa-" + CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" + SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" fi -CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" -SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" - # Start current working directory at the root of the project. cd "$(dirname "$0")/.." @@ -105,6 +103,7 @@ else echo "The core library seems to be up to date." fi +[ -z "$SYNC_DIR" ] && exit 0 # not downloading sync if [ ! -e "vendor/$SYNC_DIR" ]; then download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync diff --git a/scripts/test.sh b/scripts/test.sh index 6fffa740..e72ddf5f 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -154,6 +154,8 @@ case "$TARGET" in cat tests.xml ;; "node") + npm install --build-from-source + # Change to a temp directory. cd "$(mktemp -q -d -t realm.node.XXXXXX)" trap "rm -rf '$PWD'" EXIT @@ -164,6 +166,8 @@ case "$TARGET" in popd ;; "test-runners") + npm install --build-from-source + for runner in ava mocha jest; do pushd "$SRCROOT/tests/test-runners/$runner" npm install diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index d2871740..e11d2232 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -32,11 +32,7 @@ "library_dirs": [ "<(prefix)/src/realm" ] } }, { - "conditions": [ - ["OS=='mac'", { - "dependencies": [ "vendored-realm" ] - }] - ] + "dependencies": [ "vendored-realm" ] }] ] }, @@ -65,26 +61,39 @@ "direct_dependent_settings": { "library_dirs": [ "<(prefix)/src/realm" ] } - }, - { - "conditions": [ - ["OS=='mac'", { - "dependencies": [ "vendored-realm" ] - }] - ] + }, { + "dependencies": [ "vendored-realm" ] }] ], }, { "variables": { - "realm_vendor_dir%": "<(module_root_dir)/vendor", + "vendor_dir%": "<(module_root_dir)/vendor", }, "target_name": "vendored-realm", "type": "none", - "all_dependent_settings": { - "include_dirs": [ "<(realm_vendor_dir)/realm-sync/include" ], - "library_dirs": [ "<(realm_vendor_dir)/realm-sync/osx" ] - } + "conditions": [ + ["realm_enable_sync", { + "all_dependent_settings": { + "include_dirs": [ "<(module_root_dir)/vendor/realm-sync/include" ], + "library_dirs": [ "<(module_root_dir)/vendor/realm-sync/osx" ] + } + }, { + "all_dependent_settings": { + "include_dirs": [ "<(module_root_dir)/vendor/core-node/include" ], + "library_dirs": [ "<(module_root_dir)/vendor/core-node" ] + }, + "actions": [ + { + "action_name": "download-realm", + "inputs": [ ], + "outputs": [ "<(module_root_dir)/vendor/core-node" ], + "action": [ "<(module_root_dir)/scripts/download-core.sh", "node" ] + } + ] + }] + ] + } ] } \ No newline at end of file From f5d396a93cb2f24521b901e7c00d97afdf4549ba Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Wed, 12 Oct 2016 00:54:13 +0200 Subject: [PATCH 012/100] remove the global notifier from object store --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index 44979ba8..97a6faeb 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 44979ba8f0cb897e9410a7dbf86a0d19db236449 +Subproject commit 97a6faebe5f14b46c291d33c4268a8eb1f1011cb From b2d7d66b907a297600ea9b63164b25c9f0cd196c Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Wed, 12 Oct 2016 01:15:27 +0200 Subject: [PATCH 013/100] remove UvAsync --- src/node/node_uv_async.hpp | 104 ------------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 src/node/node_uv_async.hpp diff --git a/src/node/node_uv_async.hpp b/src/node/node_uv_async.hpp deleted file mode 100644 index 05c14949..00000000 --- a/src/node/node_uv_async.hpp +++ /dev/null @@ -1,104 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// 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. -// -//////////////////////////////////////////////////////////////////////////// - -#ifndef REALM_NODE_UV_ASYNC_HPP -#define REALM_NODE_UV_ASYNC_HPP - -#include -#include -#include -#include - -#include - -namespace realm { -namespace node { - -// Must be created and destroyed by the thread that is associated with the -// specified libuv event loop. -class UvAsync { -public: - UvAsync(std::function func, uv_loop_t* = uv_default_loop()); - ~UvAsync() noexcept; - - /// Schedule the associated callback function to be executed by the - /// associated libuv event loop. May be called by any thread. - void send(); - -private: - struct Rep; - - Rep* m_rep; - - static void exec(uv_async_t* handle) noexcept; - static void close(uv_handle_t* handle) noexcept; -}; - - - - -// implementation - -struct UvAsync::Rep { - uv_async_t handle; - std::function func; -}; - -inline UvAsync::UvAsync(std::function func, uv_loop_t* loop) -{ - std::unique_ptr rep(new Rep); - rep->handle.data = &*rep; - rep->func = std::move(func); - int ret = uv_async_init(loop, &rep->handle, &UvAsync::exec); - if (ret < 0) - throw std::runtime_error("uv_async_init() failed"); - m_rep = rep.release(); -} - -inline UvAsync::~UvAsync() noexcept -{ - m_rep->func = std::function(); - uv_close(reinterpret_cast(&m_rep->handle), &UvAsync::close); -} - -inline void UvAsync::send() -{ - int ret = uv_async_send(&m_rep->handle); - if (ret < 0) - throw std::runtime_error("uv_async_send() failed"); -} - -inline void UvAsync::exec(uv_async_t* handle) noexcept -{ - Rep* rep = static_cast(handle->data); - if (rep->func) - rep->func(); // Throws - - // FIXME: How to deal with C++ exceptions here? -} - -inline void UvAsync::close(uv_handle_t* handle) noexcept -{ - Rep* rep = static_cast(handle->data); - delete rep; -} - -} // namespace node -} // namespace realm - -#endif // REALM_NODE_UV_ASYNC_HPP From a66198fe46262f3a09e6b2379a050f8ed1083aea Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Thu, 13 Oct 2016 16:09:14 +0200 Subject: [PATCH 014/100] make tests require the symlinked realm module --- tests/js/worker-tests-script.js | 2 +- tests/spec/unit_tests.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/js/worker-tests-script.js b/tests/js/worker-tests-script.js index 9fa29a05..64daf8e5 100644 --- a/tests/js/worker-tests-script.js +++ b/tests/js/worker-tests-script.js @@ -21,7 +21,7 @@ 'use strict'; -const Realm = require('../..'); +const Realm = require('realm'); process.on('message', (message) => { process.send(handleMessage(message)); diff --git a/tests/spec/unit_tests.js b/tests/spec/unit_tests.js index 91ecec09..d21efd8c 100644 --- a/tests/spec/unit_tests.js +++ b/tests/spec/unit_tests.js @@ -24,7 +24,7 @@ const fs = require('fs'); const path = require('path'); -const Realm = require('../..'); +const Realm = require('realm'); const RealmTests = require('../js'); // Create this method with appropriate implementation for Node testing. From 622482029a4b855aae6fe9613292fa5b9f7e7725 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 25 Oct 2016 00:12:12 +0200 Subject: [PATCH 015/100] Pass AuthError in Realm.Sync.User methods callbacks (#619) * Pass AuthError in Realm.Sync.User methods callbacks The new Realm.Sync.AuthError class exposes properties common to the Problem family of classes in the Realm Object Server * extract AuthError in a separate file * whitespace --- docs/sync.js | 18 ++++++++++++++++++ lib/errors.js | 28 ++++++++++++++++++++++++++++ lib/extensions.js | 1 + lib/sync.js | 16 +++++++--------- 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 lib/errors.js diff --git a/docs/sync.js b/docs/sync.js index bb113d40..41dd0409 100644 --- a/docs/sync.js +++ b/docs/sync.js @@ -48,6 +48,24 @@ Sync.setLogLevel = function(log_level) {}; * @type {("error"|"info"|"debug")} */ +/** + * Class that describes authentication errors in the Realm Object Server + * @memberof Realm.Sync + */ +class AuthError extends Error { + /** + * The numerical code for this error. + * @type {number} + */ + get code() {} + + /** + * The unique help URI that describes this error. + * @type {string} + */ + get type() {} +} + /** * Class for logging in and managing Sync users. * @memberof Realm.Sync diff --git a/lib/errors.js b/lib/errors.js new file mode 100644 index 00000000..0486cebf --- /dev/null +++ b/lib/errors.js @@ -0,0 +1,28 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +'use strict'; + +class AuthError extends Error { + constructor(problem) { + super(problem.title); + Object.assign(this, problem); + } +} + +exports['AuthError'] = AuthError; diff --git a/lib/extensions.js b/lib/extensions.js index 09c456df..3ef13113 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -25,6 +25,7 @@ module.exports = function(realmConstructor) { // Add sync methods if (realmConstructor.Sync) { realmConstructor.Sync.User = require('./sync').User; + realmConstructor.Sync.AuthError = require('./errors').AuthError; } // TODO: Remove this now useless object. diff --git a/lib/sync.js b/lib/sync.js index 2cd0c5aa..29b4bac3 100644 --- a/lib/sync.js +++ b/lib/sync.js @@ -1,5 +1,7 @@ 'use strict'; +const AuthError = require('./errors').AuthError; + function node_require(module) { return require(module); } @@ -39,21 +41,19 @@ const postHeaders = { function _authenticate(server, json, callback) { json.app_id = ''; var options = { - url: server + 'auth', + url: server + '/auth', body: JSON.stringify(json), headers: postHeaders }; post(options, function(error, response, body) { if (error) { - console.log(error); callback(error); } else if (response.statusCode != 200) { - console.log('Bad response: ' + response.statusCode); - callback(new Error('Bad response: ' + response.statusCode)); + callback(new AuthError(JSON.parse(body))); } else { - var rjson = JSON.parse(body); + let rjson = JSON.parse(body); // TODO: validate JSON const token = rjson.refresh_token.token; @@ -109,7 +109,7 @@ User.create = function(server, username, password, callback) { User.authenticateRealm = function(fileUrl, realmUrl, callback) { var options = { - url: this.server + 'auth', + url: this.server + '/auth', body: JSON.stringify({ data: this.token, path: url.parse(realmUrl).path, @@ -120,12 +120,10 @@ User.authenticateRealm = function(fileUrl, realmUrl, callback) { }; post(options, function(error, response, body) { if (error) { - console.log(error); callback(error); } else if (response.statusCode != 200) { - console.log('Bad response: ' + response.statusCode + body); - callback(new Error('Bad response: ' + response.statusCode)); + callback(new AuthError(JSON.parse(body))); } else { var json = JSON.parse(body); From c3e082616e299eacd9173fc0c89bae0f8edd5a58 Mon Sep 17 00:00:00 2001 From: Yavor Georgiev Date: Tue, 25 Oct 2016 00:27:58 +0200 Subject: [PATCH 016/100] Use latest object store --- .gitmodules | 4 ++-- src/object-store | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index af4fc586..1475d7b4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,5 +6,5 @@ url = https://github.com/realm/realm-jsdoc.git [submodule "src/object-store"] path = src/object-store - url = git@github.com:realm/realm-object-store-private.git - branch = js-sync + url = https://github.com/realm/realm-object-store.git + branch = js diff --git a/src/object-store b/src/object-store index 97a6faeb..f6d64f03 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 97a6faebe5f14b46c291d33c4268a8eb1f1011cb +Subproject commit f6d64f03c5fd4a1a78770455d5b3dc0f5d2c900d From d76ec0934e72e15fe80b1aeef6b6bf8efa8ba10f Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 25 Oct 2016 09:36:44 -0700 Subject: [PATCH 017/100] revert download core changes --- scripts/download-core.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 50b965be..4f4bf00f 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -15,6 +15,7 @@ fi # The 'node' argument will result in realm-node build being downloaded. if [ "$1" = 'node' ]; then CORE_DIR="core-node" + SYNC_DIR="sync-node" if [ "$(uname)" = 'Darwin' ]; then PLATFORM_TAG="node-osx-" @@ -28,10 +29,11 @@ else SYNC_DIR='sync' PLATFORM_TAG="" SYNC_PLATFORM_TAG="cocoa-" - CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" - SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" fi +CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" +SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" + # Start current working directory at the root of the project. cd "$(dirname "$0")/.." @@ -103,7 +105,6 @@ else echo "The core library seems to be up to date." fi -[ -z "$SYNC_DIR" ] && exit 0 # not downloading sync if [ ! -e "vendor/$SYNC_DIR" ]; then download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync From 0d74c05366e82238295d33f5e9105ffeb2de7ad2 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 25 Oct 2016 15:04:58 -0700 Subject: [PATCH 018/100] add sync cleanup method --- lib/extensions.js | 4 ++++ src/object-store | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/extensions.js b/lib/extensions.js index 3ef13113..a7419ea4 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -26,6 +26,10 @@ module.exports = function(realmConstructor) { if (realmConstructor.Sync) { realmConstructor.Sync.User = require('./sync').User; realmConstructor.Sync.AuthError = require('./errors').AuthError; + + if (realmConstructor.Sync.cleanup) { + process.on('exit', () => realmConstructor.Sync.cleanup()); + } } // TODO: Remove this now useless object. diff --git a/src/object-store b/src/object-store index f6d64f03..543f9bc7 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit f6d64f03c5fd4a1a78770455d5b3dc0f5d2c900d +Subproject commit 543f9bc748e14b74ee280c50c7a85b74cabaaea5 From e05ef29e4f5b6a472d0fc7d7146c7344e24eb0d4 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 26 Oct 2016 16:30:00 -0700 Subject: [PATCH 019/100] update object store --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index 543f9bc7..8fbe8149 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 543f9bc748e14b74ee280c50c7a85b74cabaaea5 +Subproject commit 8fbe81491ff80575dd682405426c15a6bb070de8 From 18c419fb9672f6c49444be3f93adcac9396ae131 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 18 Oct 2016 15:08:02 -0700 Subject: [PATCH 020/100] don't set version to 0 when not set --- src/js_realm.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 31cc2448..f1e37fc9 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -351,9 +351,6 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t if (!Value::is_undefined(ctx, version_value)) { config.schema_version = Value::validated_to_number(ctx, version_value, "schemaVersion"); } - else { - config.schema_version = 0; - } static const String migration_string = "migration"; ValueType migration_value = Object::get_property(ctx, object, migration_string); From 5e1ecdf19e49512734940604548a441f03eeec0e Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 19 Oct 2016 09:59:20 -0700 Subject: [PATCH 021/100] default the schema version to 0 when a schema is provided --- src/js_realm.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index f1e37fc9..df164677 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -351,6 +351,9 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t if (!Value::is_undefined(ctx, version_value)) { config.schema_version = Value::validated_to_number(ctx, version_value, "schemaVersion"); } + else if (schema_updated) { + config.schema_version = 0; + } static const String migration_string = "migration"; ValueType migration_value = Object::get_property(ctx, object, migration_string); From c49727913cc608f08c62521d067f9a0d8f0ca393 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 19 Oct 2016 13:16:08 -0700 Subject: [PATCH 022/100] update to public object store --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index 8fbe8149..158a45a7 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 8fbe81491ff80575dd682405426c15a6bb070de8 +Subproject commit 158a45a7a50ff2273c70e75d84d15a6a9d51402b From 92adb669d54ecb7f39ba41ca43e11584edff6094 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 19 Oct 2016 17:55:46 -0700 Subject: [PATCH 023/100] hook up new object store apis --- binding.gyp | 17 +- lib/extensions.js | 2 +- lib/sync.js | 141 - lib/user-methods.js | 138 + src/RealmJS.xcodeproj/project.pbxproj | 70 +- src/js_realm.hpp | 9 +- src/js_sync.hpp | 171 +- src/jsc/jsc_protected.hpp | 4 +- src/node/gyp/realm.gyp | 4 +- src/object-store | 2 +- test.js | 24 +- tests/js/query-tests.json | 1 - .../ios/ReactTests.xcodeproj/project.pbxproj | 2 +- tests/react-test-app/yarn.lock | 4735 +++++++++++++++++ 14 files changed, 5078 insertions(+), 242 deletions(-) delete mode 100644 lib/sync.js create mode 100644 lib/user-methods.js delete mode 120000 tests/js/query-tests.json create mode 100644 tests/react-test-app/yarn.lock diff --git a/binding.gyp b/binding.gyp index 55075262..a0ce0f6f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -32,7 +32,7 @@ }, { "target_name": "object-store", - "dependencies": [ "realm-core" ], + "dependencies": [ "realm-core", "realm-sync" ], "type": "static_library", "include_dirs": [ "src/object-store/src", @@ -62,7 +62,13 @@ "src/object-store/src/parser/parser.cpp", "src/object-store/src/parser/query_builder.cpp", "src/object-store/src/util/format.cpp", - "src/object-store/src/util/thread_id.cpp" + "src/object-store/src/util/thread_id.cpp", + "src/object-store/src/sync/sync_manager.cpp", + "src/object-store/src/sync/sync_user.cpp", + "src/object-store/src/sync/sync_session.cpp", + "src/object-store/src/sync/impl/sync_file.cpp", + "src/object-store/src/sync/impl/sync_metadata.cpp", + "src/object-store/src/impl/apple/keychain_helper.cpp" ], "conditions": [ ["OS=='linux'", { @@ -74,13 +80,6 @@ "sources": [ "src/object-store/src/impl/apple/external_commit_helper.cpp" ] - }], - ["realm_enable_sync", { - "dependencies": [ "realm-sync" ], - "sources": [ - "src/object-store/src/sync_manager.cpp", - "src/object-store/src/sync_session.cpp" - ] }] ], "all_dependent_settings": { diff --git a/lib/extensions.js b/lib/extensions.js index a7419ea4..f9ceb48b 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -24,7 +24,7 @@ module.exports = function(realmConstructor) { // Add sync methods if (realmConstructor.Sync) { - realmConstructor.Sync.User = require('./sync').User; + Object.defineProperties(realmConstructor.Sync.User, require('./user-methods')(realmConstructor)); realmConstructor.Sync.AuthError = require('./errors').AuthError; if (realmConstructor.Sync.cleanup) { diff --git a/lib/sync.js b/lib/sync.js deleted file mode 100644 index 29b4bac3..00000000 --- a/lib/sync.js +++ /dev/null @@ -1,141 +0,0 @@ -'use strict'; - -const AuthError = require('./errors').AuthError; - -function node_require(module) { - return require(module); -} - -var post; -if (typeof fetch != 'undefined') { - post = function(options, callback) { - options.method = 'POST'; - fetch(options.url, options) - .then((response) => { - if (response.status != 200) { - callback(undefined, {statusCode: response.status}); - } - else { - return response.text(); - } - }) - .then((body) => { - callback(undefined, {statusCode: 200}, body) - }) - .catch((error) => { - callback(error); - }); - } -} -else { - post = node_require('request').post; -} - -const url = require("url"); - -const postHeaders = { - 'content-type': 'application/json;charset=utf-8', - 'accept': 'application/json' -}; - -function _authenticate(server, json, callback) { - json.app_id = ''; - var options = { - url: server + '/auth', - body: JSON.stringify(json), - headers: postHeaders - }; - post(options, function(error, response, body) { - if (error) { - callback(error); - } - else if (response.statusCode != 200) { - callback(new AuthError(JSON.parse(body))); - } - else { - let rjson = JSON.parse(body); - // TODO: validate JSON - - const token = rjson.refresh_token.token; - const identity = rjson.refresh_token.token_data.identity; - callback(undefined, new User(server, identity, token)); - } - }); -} - -function User(server, identity, token) { - this.server = server; - this.identity = identity; - this.token = token; - this.isAdmin = false; - - User.activeUsers[identity] = this; -} - -User.adminUser = function(server, token) { - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); - var user = new User(server, uuid, token); - user.isAdmin = true; - return user; -} - -User.activeUsers = {}; - -User.login = function(server, username, password, callback) { - _authenticate(server, { - provider: 'password', - user_info: { password: password }, - data: username - }, callback); -} - -User.loginWithProvider = function(server, provider, providerToken, callback) { - _authenticate(server, { - provider: provider, - data: providerToken - }, callback); -} - -User.create = function(server, username, password, callback) { - _authenticate(server, { - provider: 'password', - user_info: { password: password, register: true }, - data: username - }, callback); -} - -User.authenticateRealm = function(fileUrl, realmUrl, callback) { - var options = { - url: this.server + '/auth', - body: JSON.stringify({ - data: this.token, - path: url.parse(realmUrl).path, - provider: 'realm', - app_id: '' - }), - headers: postHeaders - }; - post(options, function(error, response, body) { - if (error) { - callback(error); - } - else if (response.statusCode != 200) { - callback(new AuthError(JSON.parse(body))); - } - else { - var json = JSON.parse(body); - // TODO: validate JSON - - callback(undefined, { - token: json.access_token.token, - file_url: url.parse(fileUrl).path, - resolved_realm_url: 'realm://' + url.parse(realmUrl).host + json.access_token.token_data.path - }); - } - }); -} - -exports['User'] = User; diff --git a/lib/user-methods.js b/lib/user-methods.js new file mode 100644 index 00000000..db93c236 --- /dev/null +++ b/lib/user-methods.js @@ -0,0 +1,138 @@ +'use strict'; + +function node_require(module) { + return require(module); +} + +var post; +if (typeof fetch != 'undefined') { + post = function(options, callback) { + options.method = 'POST'; + fetch(options.url, options) + .then((response) => { + if (response.status != 200) { + callback(undefined, {statusCode: response.status}); + } + else { + return response.text(); + } + }) + .then((body) => { + callback(undefined, {statusCode: 200}, body) + }) + .catch((error) => { + callback(error); + }); + } +} +else { + post = node_require('request').post; +} + +const url = require("url"); + +const postHeaders = { + 'content-type': 'application/json;charset=utf-8', + 'accept': 'application/json' +}; + +module.exports = function(realmConstructor) { + function _authenticate(server, json, callback) { + json.app_id = ''; + var options = { + url: server + 'auth', + body: JSON.stringify(json), + headers: postHeaders + }; + post(options, function(error, response, body) { + if (error) { + console.log(error); + callback(error); + } + else if (response.statusCode != 200) { + console.log('Bad response: ' + response.statusCode); + callback(new Error('Bad response: ' + response.statusCode)); + } + else { + var rjson = JSON.parse(body); + // TODO: validate JSON + + const token = rjson.refresh_token.token; + const identity = rjson.refresh_token.token_data.identity; + callback(undefined, realmConstructor.Sync.User.createUser(server, identity, token, false)); + } + }); + } + + var methods = {}; + methods['adminUser'] = function(server, token) { + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + var user = realmConstructor.Sync.User.createUser(server, uuid, token, true); + return user; + } + + methods['login'] = function(server, username, password, callback) { + _authenticate(server, { + provider: 'password', + user_info: { password: password }, + data: username + }, callback); + } + + methods['loginWithProvider'] = function(server, provider, providerToken, callback) { + _authenticate(server, { + provider: provider, + data: providerToken + }, callback); + } + + methods['create'] = function(server, username, password, callback) { + _authenticate(server, { + provider: 'password', + user_info: { password: password, register: true }, + data: username + }, callback); + } + + methods['_authenticateRealm'] = function(fileUrl, realmUrl, callback) { + var options = { + url: this.server + 'auth', + body: JSON.stringify({ + data: this.token, + path: url.parse(realmUrl).path, + provider: 'realm', + app_id: '' + }), + headers: postHeaders + }; + post(options, function(error, response, body) { + if (error) { + console.log(error); + callback(error); + } + else if (response.statusCode != 200) { + console.log('Bad response: ' + response.statusCode + body); + callback(new Error('Bad response: ' + response.statusCode)); + } + else { + var json = JSON.parse(body); + // TODO: validate JSON + + callback(undefined, { + token: json.access_token.token, + file_url: url.parse(fileUrl).path, + resolved_realm_url: 'realm://' + url.parse(realmUrl).host + json.access_token.token_data.path + }); + } + }); + } + + for (var name in methods) { + methods[name] = {value: methods[name], configurable: true, writable: true} + } + + return methods; +} \ No newline at end of file diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 3a1e0c84..9a41d42f 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -10,9 +10,6 @@ 02022A581DA476CD000F0C4F /* external_commit_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A411DA47489000F0C4F /* external_commit_helper.cpp */; }; 02022A5A1DA476CD000F0C4F /* weak_realm_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A4A1DA475A9000F0C4F /* weak_realm_notifier.cpp */; }; 02022A5B1DA476CD000F0C4F /* placeholder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A4C1DA475C0000F0C4F /* placeholder.cpp */; }; - 02022A5C1DA476CD000F0C4F /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A4E1DA475C0000F0C4F /* sync_manager.cpp */; }; - 02022A5D1DA476CD000F0C4F /* sync_metadata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A501DA475C0000F0C4F /* sync_metadata.cpp */; }; - 02022A5E1DA476CD000F0C4F /* sync_session.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A521DA475C0000F0C4F /* sync_session.cpp */; }; 02022A671DA47BD7000F0C4F /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A611DA47B8B000F0C4F /* parser.cpp */; }; 02022A681DA47BD7000F0C4F /* query_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A631DA47B8B000F0C4F /* query_builder.cpp */; }; 02022A7C1DA47EC8000F0C4F /* format.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02022A731DA47EC8000F0C4F /* format.cpp */; }; @@ -28,6 +25,12 @@ 027A23131CD3E379000543AE /* libRealmJS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */; }; 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02D041F61CE11159000E4250 /* dates-v3.realm */; }; 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; + 02E315C91DB80DDD00555337 /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C31DB80DDD00555337 /* sync_manager.cpp */; }; + 02E315CA1DB80DDD00555337 /* sync_session.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C51DB80DDD00555337 /* sync_session.cpp */; }; + 02E315CB1DB80DDD00555337 /* sync_user.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C71DB80DDD00555337 /* sync_user.cpp */; }; + 02E315D21DB80DF200555337 /* sync_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315CE1DB80DF200555337 /* sync_file.cpp */; }; + 02E315D31DB80DF200555337 /* sync_metadata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315D01DB80DF200555337 /* sync_metadata.cpp */; }; + 02E315E01DB8233E00555337 /* keychain_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315DE1DB8233E00555337 /* keychain_helper.cpp */; }; 02F59EBF1C88F17D007F774C /* index_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EAF1C88F17D007F774C /* index_set.cpp */; }; 02F59EC01C88F17D007F774C /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB11C88F17D007F774C /* list.cpp */; }; 02F59EC11C88F17D007F774C /* object_schema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB41C88F17D007F774C /* object_schema.cpp */; }; @@ -100,16 +103,8 @@ 02022A411DA47489000F0C4F /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; 02022A421DA47489000F0C4F /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; 02022A481DA474A7000F0C4F /* weak_realm_notifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = weak_realm_notifier.hpp; sourceTree = ""; }; - 02022A491DA475A9000F0C4F /* sync_client.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sync_client.hpp; sourceTree = ""; }; 02022A4A1DA475A9000F0C4F /* weak_realm_notifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weak_realm_notifier.cpp; sourceTree = ""; }; 02022A4C1DA475C0000F0C4F /* placeholder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = placeholder.cpp; path = src/placeholder.cpp; sourceTree = ""; }; - 02022A4D1DA475C0000F0C4F /* sync_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_config.hpp; path = src/sync_config.hpp; sourceTree = ""; }; - 02022A4E1DA475C0000F0C4F /* sync_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_manager.cpp; path = src/sync_manager.cpp; sourceTree = ""; }; - 02022A4F1DA475C0000F0C4F /* sync_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_manager.hpp; path = src/sync_manager.hpp; sourceTree = ""; }; - 02022A501DA475C0000F0C4F /* sync_metadata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_metadata.cpp; path = src/sync_metadata.cpp; sourceTree = ""; }; - 02022A511DA475C0000F0C4F /* sync_metadata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_metadata.hpp; path = src/sync_metadata.hpp; sourceTree = ""; }; - 02022A521DA475C0000F0C4F /* sync_session.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_session.cpp; path = src/sync_session.cpp; sourceTree = ""; }; - 02022A531DA475C0000F0C4F /* sync_session.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_session.hpp; path = src/sync_session.hpp; sourceTree = ""; }; 02022A611DA47B8B000F0C4F /* parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cpp; sourceTree = ""; }; 02022A621DA47B8B000F0C4F /* parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parser.hpp; sourceTree = ""; }; 02022A631DA47B8B000F0C4F /* query_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = query_builder.cpp; sourceTree = ""; }; @@ -161,6 +156,20 @@ 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RealmJSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 02D041F61CE11159000E4250 /* dates-v3.realm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "dates-v3.realm"; sourceTree = ""; }; + 02E315C21DB80DDD00555337 /* sync_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_config.hpp; path = src/sync/sync_config.hpp; sourceTree = ""; }; + 02E315C31DB80DDD00555337 /* sync_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_manager.cpp; path = src/sync/sync_manager.cpp; sourceTree = ""; }; + 02E315C41DB80DDD00555337 /* sync_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_manager.hpp; path = src/sync/sync_manager.hpp; sourceTree = ""; }; + 02E315C51DB80DDD00555337 /* sync_session.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_session.cpp; path = src/sync/sync_session.cpp; sourceTree = ""; }; + 02E315C61DB80DDD00555337 /* sync_session.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_session.hpp; path = src/sync/sync_session.hpp; sourceTree = ""; }; + 02E315C71DB80DDD00555337 /* sync_user.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_user.cpp; path = src/sync/sync_user.cpp; sourceTree = ""; }; + 02E315C81DB80DDD00555337 /* sync_user.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_user.hpp; path = src/sync/sync_user.hpp; sourceTree = ""; }; + 02E315CD1DB80DF200555337 /* sync_client.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_client.hpp; path = src/sync/impl/sync_client.hpp; sourceTree = ""; }; + 02E315CE1DB80DF200555337 /* sync_file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_file.cpp; path = src/sync/impl/sync_file.cpp; sourceTree = ""; }; + 02E315CF1DB80DF200555337 /* sync_file.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_file.hpp; path = src/sync/impl/sync_file.hpp; sourceTree = ""; }; + 02E315D01DB80DF200555337 /* sync_metadata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_metadata.cpp; path = src/sync/impl/sync_metadata.cpp; sourceTree = ""; }; + 02E315D11DB80DF200555337 /* sync_metadata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_metadata.hpp; path = src/sync/impl/sync_metadata.hpp; sourceTree = ""; }; + 02E315DE1DB8233E00555337 /* keychain_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = keychain_helper.cpp; sourceTree = ""; }; + 02E315DF1DB8233E00555337 /* keychain_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = keychain_helper.hpp; sourceTree = ""; }; 02F59EAE1C88F17D007F774C /* binding_context.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = binding_context.hpp; path = src/binding_context.hpp; sourceTree = ""; }; 02F59EAF1C88F17D007F774C /* index_set.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = index_set.cpp; path = src/index_set.cpp; sourceTree = ""; }; 02F59EB01C88F17D007F774C /* index_set.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = index_set.hpp; path = src/index_set.hpp; sourceTree = ""; }; @@ -441,6 +450,25 @@ path = data; sourceTree = ""; }; + 02E315CC1DB80DE000555337 /* sync */ = { + isa = PBXGroup; + children = ( + 02E315CD1DB80DF200555337 /* sync_client.hpp */, + 02E315CE1DB80DF200555337 /* sync_file.cpp */, + 02E315CF1DB80DF200555337 /* sync_file.hpp */, + 02E315D01DB80DF200555337 /* sync_metadata.cpp */, + 02E315D11DB80DF200555337 /* sync_metadata.hpp */, + 02E315C21DB80DDD00555337 /* sync_config.hpp */, + 02E315C31DB80DDD00555337 /* sync_manager.cpp */, + 02E315C41DB80DDD00555337 /* sync_manager.hpp */, + 02E315C51DB80DDD00555337 /* sync_session.cpp */, + 02E315C61DB80DDD00555337 /* sync_session.hpp */, + 02E315C71DB80DDD00555337 /* sync_user.cpp */, + 02E315C81DB80DDD00555337 /* sync_user.hpp */, + ); + name = sync; + sourceTree = ""; + }; F62A35131C18E6E2004A917D /* iOS */ = { isa = PBXGroup; children = ( @@ -454,6 +482,7 @@ F62A35141C18E783004A917D /* Object Store */ = { isa = PBXGroup; children = ( + 02E315CC1DB80DE000555337 /* sync */, 02022A6B1DA47EC8000F0C4F /* util */, F63117EA1CEB0BFA00ECB2DE /* impl */, F63117EC1CEB0C8100ECB2DE /* parser */, @@ -470,13 +499,6 @@ 02F59EB61C88F17D007F774C /* object_store.cpp */, 02F59EB71C88F17D007F774C /* object_store.hpp */, 02022A4C1DA475C0000F0C4F /* placeholder.cpp */, - 02022A4D1DA475C0000F0C4F /* sync_config.hpp */, - 02022A4E1DA475C0000F0C4F /* sync_manager.cpp */, - 02022A4F1DA475C0000F0C4F /* sync_manager.hpp */, - 02022A501DA475C0000F0C4F /* sync_metadata.cpp */, - 02022A511DA475C0000F0C4F /* sync_metadata.hpp */, - 02022A521DA475C0000F0C4F /* sync_session.cpp */, - 02022A531DA475C0000F0C4F /* sync_session.hpp */, 02F59EB81C88F17D007F774C /* property.hpp */, 02F59EB91C88F17D007F774C /* results.cpp */, 02F59EBA1C88F17D007F774C /* results.hpp */, @@ -536,7 +558,6 @@ 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */, 02F59EDE1C88F2BB007F774C /* transact_log_handler.hpp */, 02022A481DA474A7000F0C4F /* weak_realm_notifier.hpp */, - 02022A491DA475A9000F0C4F /* sync_client.hpp */, 02022A4A1DA475A9000F0C4F /* weak_realm_notifier.cpp */, ); name = impl; @@ -546,6 +567,8 @@ F63117EB1CEB0C1B00ECB2DE /* apple */ = { isa = PBXGroup; children = ( + 02E315DE1DB8233E00555337 /* keychain_helper.cpp */, + 02E315DF1DB8233E00555337 /* keychain_helper.hpp */, 02022A411DA47489000F0C4F /* external_commit_helper.cpp */, 02022A421DA47489000F0C4F /* external_commit_helper.hpp */, ); @@ -906,14 +929,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 02E315C91DB80DDD00555337 /* sync_manager.cpp in Sources */, 02022A671DA47BD7000F0C4F /* parser.cpp in Sources */, 02022A681DA47BD7000F0C4F /* query_builder.cpp in Sources */, + 02E315E01DB8233E00555337 /* keychain_helper.cpp in Sources */, 02022A581DA476CD000F0C4F /* external_commit_helper.cpp in Sources */, 02022A5A1DA476CD000F0C4F /* weak_realm_notifier.cpp in Sources */, 02022A5B1DA476CD000F0C4F /* placeholder.cpp in Sources */, - 02022A5C1DA476CD000F0C4F /* sync_manager.cpp in Sources */, - 02022A5D1DA476CD000F0C4F /* sync_metadata.cpp in Sources */, - 02022A5E1DA476CD000F0C4F /* sync_session.cpp in Sources */, 5DC74A7A1D623CA800D77A4F /* thread_confined.cpp in Sources */, 02414BA51CE6ABCF00A8669F /* collection_change_builder.cpp in Sources */, 02414BA61CE6ABCF00A8669F /* collection_notifier.cpp in Sources */, @@ -923,6 +945,7 @@ 02F59EE31C88F2BB007F774C /* transact_log_handler.cpp in Sources */, 5DC74A781D623C9800D77A4F /* handover.cpp in Sources */, F63FF2E81C159C4B00B3B8E0 /* platform.mm in Sources */, + 02E315CA1DB80DDD00555337 /* sync_session.cpp in Sources */, 02F59EC31C88F17D007F774C /* results.cpp in Sources */, F63FF2E21C15921A00B3B8E0 /* base64.cpp in Sources */, F63FF2C61C12469E00B3B8E0 /* jsc_init.cpp in Sources */, @@ -933,9 +956,12 @@ 02F59EE21C88F2BB007F774C /* realm_coordinator.cpp in Sources */, 02F59EC41C88F17D007F774C /* schema.cpp in Sources */, F63FF2CD1C12469E00B3B8E0 /* rpc.cpp in Sources */, + 02E315D21DB80DF200555337 /* sync_file.cpp in Sources */, 02F59EC21C88F17D007F774C /* object_store.cpp in Sources */, 02022A7C1DA47EC8000F0C4F /* format.cpp in Sources */, 02022A7D1DA47EC8000F0C4F /* thread_id.cpp in Sources */, + 02E315CB1DB80DDD00555337 /* sync_user.cpp in Sources */, + 02E315D31DB80DF200555337 /* sync_metadata.cpp in Sources */, 02F59EC11C88F17D007F774C /* object_schema.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/src/js_realm.hpp b/src/js_realm.hpp index df164677..d270d953 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -32,7 +32,7 @@ #if REALM_ENABLE_SYNC #include "js_sync.hpp" -#include "sync_config.hpp" +#include "sync/sync_config.hpp" #endif #include "shared_realm.hpp" @@ -146,6 +146,7 @@ class RealmClass : public ClassDefinition> { public: static FunctionType create_constructor(ContextType); + static Protected s_constructor; // methods static void objects(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); @@ -255,6 +256,9 @@ public: } }; +template +Protected RealmClass::s_constructor; + template inline typename T::Function RealmClass::create_constructor(ContextType ctx) { FunctionType realm_constructor = ObjectWrap>::create_constructor(ctx); @@ -274,6 +278,7 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); #endif + s_constructor = Protected(ctx, realm_constructor); return realm_constructor; } @@ -390,7 +395,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t config.encryption_key = std::vector(encryption_key.begin(), encryption_key.end()); } #if REALM_ENABLE_SYNC - SyncClass::populate_sync_config(ctx, object, config); + SyncClass::populate_sync_config(ctx, s_constructor, object, config); #endif } } diff --git a/src/js_sync.hpp b/src/js_sync.hpp index ac50d786..bf758f53 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -22,17 +22,93 @@ #include #include +#include "platform.hpp" #include "js_class.hpp" #include "js_collection.hpp" -#include "sync_manager.hpp" -#include "sync_config.hpp" -#include "sync_session.hpp" +#include "sync/sync_manager.hpp" +#include "sync/sync_config.hpp" +#include "sync/sync_session.hpp" +#include "sync/sync_user.hpp" #include "realm/util/logger.hpp" #include "realm/util/uri.hpp" namespace realm { namespace js { +using SharedUser = std::shared_ptr; + +template +class UserClass : public ClassDefinition { + using GlobalContextType = typename T::GlobalContext; + using ContextType = typename T::Context; + using FunctionType = typename T::Function; + using ObjectType = typename T::Object; + using ValueType = typename T::Value; + using String = js::String; + using Object = js::Object; + using Value = js::Value; + using Function = js::Function; + using ReturnValue = js::ReturnValue; + using NativeAccessor = realm::NativeAccessor; + +public: + std::string const name = "User"; + + static FunctionType create_constructor(ContextType); + + static void get_server(ContextType, ObjectType, ReturnValue &); + static void get_identity(ContextType, ObjectType, ReturnValue &); + static void get_token(ContextType, ObjectType, ReturnValue &); + static void is_admin(ContextType, ObjectType, ReturnValue &); + + PropertyMap const properties = { + {"server", {wrap, nullptr}}, + {"identity", {wrap, nullptr}}, + {"token", {wrap, nullptr}}, + {"isAdmin", {wrap, nullptr}}, + }; + + static void create_user(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + + MethodMap const static_methods = { + {"createUser", wrap} + }; +}; + +template +void UserClass::get_server(ContextType ctx, ObjectType object, ReturnValue &return_value) { + std::string server = get_internal>(object)->get()->server_url; + return_value.set(server); +} + +template +void UserClass::get_identity(ContextType ctx, ObjectType object, ReturnValue &return_value) { + std::string identity = get_internal>(object)->get()->identity(); + return_value.set(identity); +} + +template +void UserClass::get_token(ContextType ctx, ObjectType object, ReturnValue &return_value) { + std::string token = get_internal>(object)->get()->refresh_token(); + return_value.set(token); +} + +template +void UserClass::is_admin(ContextType ctx, ObjectType object, ReturnValue &return_value) { + return_value.set(get_internal>(object)->get()->is_admin()); +} + +template +void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { + validate_argument_count(argc, 3, 4); + + SharedUser *user = new SharedUser(SyncManager::shared().get_user(Value::validated_to_string(ctx, arguments[1]), + Value::validated_to_string(ctx, arguments[2]), + Value::validated_to_boolean(ctx, arguments[3]))); + user->get()->server_url = Value::validated_to_string(ctx, arguments[0]); + return_value.set(create_object>(ctx, user)); +} + template class SyncClass : public ClassDefinition { using GlobalContextType = typename T::GlobalContext; @@ -57,7 +133,7 @@ public: // private static void refresh_access_token(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); - static void populate_sync_config(ContextType, ObjectType config_object, Realm::Config&); + static void populate_sync_config(ContextType, FunctionType realm_constructor, ObjectType config_object, Realm::Config&); // static properties static void get_is_developer_edition(ContextType, ObjectType, ReturnValue &); @@ -71,53 +147,19 @@ public: template inline typename T::Function SyncClass::create_constructor(ContextType ctx) { + // setup synced realmFile paths + ensure_directory_exists_for_file(default_realm_file_directory()); + SyncManager::shared().configure_file_system(default_realm_file_directory(), SyncManager::MetadataMode::NoEncryption); + FunctionType sync_constructor = ObjectWrap>::create_constructor(ctx); - Protected refresh(ctx, Object::validated_get_function(ctx, sync_constructor, std::string("refreshAccessToken"))); - Protected protected_sync(ctx, sync_constructor); - Protected protected_ctx(Context::get_global_context(ctx)); - - realm::SyncManager::shared().set_login_function([=](const std::string& path, const realm::SyncConfig& config) { - typename T::HandleScope handle_scope; - - FunctionType user_constructor = Object::validated_get_function(protected_ctx, protected_sync, std::string("User")); - FunctionType authenticate = Object::validated_get_function(protected_ctx, user_constructor, "authenticateRealm"); - ObjectType users = Object::validated_get_object(protected_ctx, user_constructor, std::string("activeUsers")); - ObjectType user = Object::validated_get_object(protected_ctx, users, config.user_tag.c_str(), "Invalid user identity"); - - if (Object::validated_get_boolean(protected_ctx, user, "isAdmin")) { - std::string token = Object::validated_get_string(protected_ctx, user, "token"); - - // FIXME: This log-in callback is called while the object store still holds some sync-related locks. - // Notify the object store of the access token asynchronously to avoid the deadlock that would result - // from reentering the object store here. - auto thread = std::thread([path, config, token]{ - auto session = SyncManager::shared().get_existing_active_session(path); - session->refresh_access_token(token, config.realm_url); - }); - thread.detach(); - } - else { - ValueType arguments[3]; - arguments[0] = Value::from_string(protected_ctx, path.c_str()); - arguments[1] = Value::from_string(protected_ctx, config.realm_url.c_str()); - arguments[2] = refresh; - Function::call(protected_ctx, authenticate, user, 3, arguments); - } - }); + PropertyAttributes attributes = ReadOnly | DontEnum | DontDelete; + Object::set_property(ctx, sync_constructor, "User", ObjectWrap>::create_constructor(ctx), attributes); realm::SyncManager::shared().set_error_handler([=](int error_code, std::string message) { std::cout << error_code << " " << message << std::endl; }); -#if REALM_PLATFORM_NODE - // AtExit is called before the V8 VM is disposed. We use it to clean the captured JS objects in the login function. - // Should they be destructed after the VM is disposed, there will be a segmentation fault during node's shutdown. - ::node::AtExit([](void*) { - realm::SyncManager::shared().set_login_function(nullptr); - }); -#endif - return sync_constructor; } @@ -165,18 +207,51 @@ void SyncClass::refresh_access_token(ContextType ctx, ObjectType this_object, } template -void SyncClass::populate_sync_config(ContextType ctx, ObjectType config_object, Realm::Config& config) { +void SyncClass::populate_sync_config(ContextType ctx, FunctionType realm_constructor, ObjectType config_object, Realm::Config& config) { ValueType sync_config_value = Object::get_property(ctx, config_object, "sync"); if (!Value::is_undefined(ctx, sync_config_value)) { auto sync_config_object = Value::validated_to_object(ctx, sync_config_value); + ObjectType sync_constructor = Object::validated_get_object(ctx, realm_constructor, std::string("Sync")); + Protected refresh(ctx, Object::validated_get_function(ctx, sync_constructor, std::string("refreshAccessToken"))); + Protected protected_sync(ctx, sync_constructor); + Protected protected_ctx(Context::get_global_context(ctx)); + + auto handler = [=](const std::string& path, const realm::SyncConfig& config, std::shared_ptr) { + typename T::HandleScope handle_scope; + if (config.user->is_admin()) { + // FIXME: This log-in callback is called while the object store still holds some sync-related locks. + // Notify the object store of the access token asynchronously to avoid the deadlock that would result + // from reentering the object store here. + auto thread = std::thread([path, config]{ + auto session = SyncManager::shared().get_existing_active_session(path); + session->refresh_access_token(config.user->refresh_token(), config.realm_url); + }); + thread.detach(); + } + else { + ObjectType user_constructor = Object::validated_get_object(ctx, protected_sync, std::string("User")); + FunctionType authenticate = Object::validated_get_function(ctx, user_constructor, std::string("_authenticateRealm")); + + ValueType arguments[3]; + arguments[0] = Value::from_string(protected_ctx, path.c_str()); + arguments[1] = Value::from_string(protected_ctx, config.realm_url.c_str()); + arguments[2] = refresh; + ObjectType user = create_object>(ctx, new SharedUser(config.user)); + Function::call(protected_ctx, authenticate, user, 3, arguments); + } + }; + ObjectType user = Object::validated_get_object(ctx, sync_config_object, "user"); + SharedUser shared_user = *get_internal>(user); + std::string raw_realm_url = Object::validated_get_string(ctx, sync_config_object, "url"); + + // FIXME - use make_shared config.sync_config = std::shared_ptr( - new SyncConfig(Object::validated_get_string(ctx, user, "identity"), - Object::validated_get_string(ctx, sync_config_object, "url"), - {}, SyncSessionStopPolicy::AfterChangesUploaded) + new SyncConfig(shared_user, raw_realm_url, SyncSessionStopPolicy::AfterChangesUploaded, handler) ); config.schema_mode = SchemaMode::Additive; + config.path = realm::SyncManager::shared().path_for_realm(shared_user->identity(), raw_realm_url); } } diff --git a/src/jsc/jsc_protected.hpp b/src/jsc/jsc_protected.hpp index 07229f9b..10c25fa1 100644 --- a/src/jsc/jsc_protected.hpp +++ b/src/jsc/jsc_protected.hpp @@ -57,6 +57,7 @@ class Protected { template<> class Protected { + protected: JSGlobalContextRef m_context; JSValueRef m_value; @@ -112,7 +113,8 @@ class Protected : public Protected { } Protected& operator=(Protected other) { - std::swap(*this, other); + std::swap(m_context, other.m_context); + std::swap(m_value, other.m_value); return *this; } }; diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index e11d2232..baeea330 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -18,7 +18,7 @@ ] }, "all_dependent_settings": { - "defines": [ "REALM_HAVE_CONFIG", "REALM_PLATFORM_NODE=1", "REALM_ENABLE_SYNC=<(realm_enable_sync)" ] + "defines": [ "REALM_HAVE_CONFIG", "REALM_PLATFORM_NODE=1", "REALM_ENABLE_SYNC=1" ] }, "variables": { "prefix": " { - console.log('filter: ' + name); - return true; - }, - (name, realm, changes) => { - console.log('change: ' + name); - console.log(changes); - } -); -console.log('global notifier listening...'); +// Realm.Sync.setGlobalListener(notifier_dir, 'realm://127.0.0.1:9080', admin_user, +// (name) => { +// console.log('filter: ' + name); +// return true; +// }, +// (name, realm, changes) => { +// console.log('change: ' + name); +// console.log(changes); +// } +// ); +// console.log('global notifier listening...'); Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { - console.log(user); - var realm = new Realm({ sync: { user: user, diff --git a/tests/js/query-tests.json b/tests/js/query-tests.json deleted file mode 120000 index cb35905f..00000000 --- a/tests/js/query-tests.json +++ /dev/null @@ -1 +0,0 @@ -../../src/object-store/tests/query.json \ No newline at end of file diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index 83846488..ef9dd461 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -586,7 +586,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\" \nif [ -z \"$TEST_SCRIPT\" ]; then\n #npm install realm realm-tests\n echo a\nfi\ncp ../../../src/object-store/tests/query.json ../node_modules/realm-tests/query-tests.json\n"; + shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\" \nif [ -z \"$TEST_SCRIPT\" ]; then\n #npm install realm realm-tests\n echo a\nfi\ncp \"${SRCROOT}/../../../src/object-store/tests/query.json\" \"${SRCROOT}/../node_modules/realm-tests/query-tests.json\"\n"; }; F6EDE5BF1C49007200B1085F /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; diff --git a/tests/react-test-app/yarn.lock b/tests/react-test-app/yarn.lock new file mode 100644 index 00000000..2b0da9ef --- /dev/null +++ b/tests/react-test-app/yarn.lock @@ -0,0 +1,4735 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + +accepts@~1.2.12, accepts@~1.2.13: + version "1.2.13" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" + dependencies: + mime-types "~2.1.6" + negotiator "0.5.3" + +accepts@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn@^1.0.3: + version "1.2.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.0" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi@^0.3.0, ansi@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +archive-type@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" + dependencies: + file-type "^3.1.0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +art@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/art/-/art-0.10.1.tgz#38541883e399225c5e193ff246e8f157cf7b2146" + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +ast-query@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ast-query/-/ast-query-1.2.0.tgz#4b725e9f3922a5edc41dc669c87bbfbfd20171a2" + dependencies: + class-extend "^0.1.1" + escodegen "^1.6.0" + esprima "^2.0.0" + lodash "^4.6.1" + traverse "^0.6.6" + +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-code-frame@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core@^6.10.4, babel-core@^6.16.0, babel-core@^6.7.2: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" + dependencies: + babel-code-frame "^6.16.0" + babel-generator "^6.17.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.16.0" + babel-runtime "^6.9.1" + babel-template "^6.16.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.4.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.16.0" + detect-indent "^3.0.1" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-builder-react-jsx@^6.8.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.9.0.tgz#a633978d669c4c9dcad716cc577ee3e0bb8ae723" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.9.0" + esutils "^2.0.0" + lodash "^4.2.0" + +babel-helper-call-delegate@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.8.0.tgz#9d283e7486779b6b0481864a11b371ea5c01fa64" + dependencies: + babel-helper-hoist-variables "^6.8.0" + babel-runtime "^6.0.0" + babel-traverse "^6.8.0" + babel-types "^6.8.0" + +babel-helper-define-map@^6.8.0, babel-helper-define-map@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.9.0.tgz#6629f9b2a7e58e18e8379a57d1e6fbb2969902fb" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + lodash "^4.2.0" + +babel-helper-function-name@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.8.0.tgz#a0336ba14526a075cdf502fc52d3fe84b12f7a34" + dependencies: + babel-helper-get-function-arity "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-traverse "^6.8.0" + babel-types "^6.8.0" + +babel-helper-get-function-arity@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.8.0.tgz#88276c24bd251cdf6f61b6f89f745f486ced92af" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-helper-hoist-variables@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz#8b0766dc026ea9ea423bc2b34e665a4da7373aaf" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-helper-optimise-call-expression@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.8.0.tgz#4175628e9c89fc36174904f27070f29d38567f06" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-helper-regex@^6.8.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.9.0.tgz#c74265fde180ff9a16735fee05e63cadb9e0b057" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.9.0" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.14.0, babel-helper-replace-supers@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.16.0.tgz#21c97623cc7e430855753f252740122626a39e6b" + dependencies: + babel-helper-optimise-call-expression "^6.8.0" + babel-messages "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-check-es2015-constants@^6.5.0, babel-plugin-check-es2015-constants@^6.7.2, babel-plugin-check-es2015-constants@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-external-helpers@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.8.0.tgz#febfe50cec910b6dfcbc6caaabddd99f72b12697" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-react-transform@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz#515bbfa996893981142d90b1f9b1635de2995109" + dependencies: + lodash "^4.6.1" + +babel-plugin-syntax-async-functions@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.13.0.tgz#9af0cd396087bf7677053e1afa52f206c0416f17" + +babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.13.0.tgz#e741ff3992c578310be45c571bcd90a2f9c5586e" + +babel-plugin-syntax-object-rest-spread@^6.5.0, babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.5.0, babel-plugin-syntax-trailing-function-commas@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" + +babel-plugin-transform-class-properties@^6.5.0, babel-plugin-transform-class-properties@^6.6.0, babel-plugin-transform-class-properties@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.16.0.tgz#969bca24d34e401d214f36b8af5c1346859bc904" + dependencies: + babel-helper-function-name "^6.8.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + +babel-plugin-transform-es2015-arrow-functions@^6.5.0, babel-plugin-transform-es2015-arrow-functions@^6.5.2, babel-plugin-transform-es2015-arrow-functions@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.6.5, babel-plugin-transform-es2015-block-scoped-functions@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoping@^6.5.0, babel-plugin-transform-es2015-block-scoping@^6.7.1, babel-plugin-transform-es2015-block-scoping@^6.8.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.15.0.tgz#5b443ca142be8d1db6a8c2ae42f51958b66b70f6" + dependencies: + babel-runtime "^6.9.0" + babel-template "^6.15.0" + babel-traverse "^6.15.0" + babel-types "^6.15.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.5.0, babel-plugin-transform-es2015-classes@^6.6.5, babel-plugin-transform-es2015-classes@^6.8.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.14.0.tgz#87d5149ee91fb475922409f9af5b2ba5d1e39287" + dependencies: + babel-helper-define-map "^6.9.0" + babel-helper-function-name "^6.8.0" + babel-helper-optimise-call-expression "^6.8.0" + babel-helper-replace-supers "^6.14.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.14.0" + babel-traverse "^6.14.0" + babel-types "^6.14.0" + +babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform-es2015-computed-properties@^6.6.5, babel-plugin-transform-es2015-computed-properties@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + dependencies: + babel-helper-define-map "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-destructuring@^6.5.0, babel-plugin-transform-es2015-destructuring@^6.6.5, babel-plugin-transform-es2015-destructuring@^6.8.0, babel-plugin-transform-es2015-destructuring@6.x: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.16.0.tgz#050fe0866f5d53b36062ee10cdf5bfe64f929627" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-es2015-for-of@^6.5.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.8.0.tgz#82eda139ba4270dda135c3ec1b1f2813fa62f23c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-function-name@^6.5.0, babel-plugin-transform-es2015-function-name@^6.8.0, babel-plugin-transform-es2015-function-name@6.x: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + +babel-plugin-transform-es2015-literals@^6.5.0, babel-plugin-transform-es2015-literals@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.5.0, babel-plugin-transform-es2015-modules-commonjs@^6.7.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0, babel-plugin-transform-es2015-modules-commonjs@6.x: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.16.0.tgz#0a34b447bc88ad1a70988b6d199cca6d0b96c892" + dependencies: + babel-plugin-transform-strict-mode "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-types "^6.16.0" + +babel-plugin-transform-es2015-object-super@^6.6.5, babel-plugin-transform-es2015-object-super@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + dependencies: + babel-helper-replace-supers "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-parameters@^6.5.0, babel-plugin-transform-es2015-parameters@^6.7.0, babel-plugin-transform-es2015-parameters@^6.8.0, babel-plugin-transform-es2015-parameters@6.x: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.17.0.tgz#e06d30cef897f46adb4734707bbe128a0d427d58" + dependencies: + babel-helper-call-delegate "^6.8.0" + babel-helper-get-function-arity "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.16.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.5.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0, babel-plugin-transform-es2015-shorthand-properties@6.x: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.8.0.tgz#f0a4c5fd471630acf333c2d99c3d677bf0952149" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-spread@^6.5.0, babel-plugin-transform-es2015-spread@^6.6.5, babel-plugin-transform-es2015-spread@^6.8.0, babel-plugin-transform-es2015-spread@6.x: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-sticky-regex@6.x: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-template-literals@^6.5.0, babel-plugin-transform-es2015-template-literals@^6.6.5, babel-plugin-transform-es2015-template-literals@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-unicode-regex@6.x: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-es3-member-expression-literals@^6.5.0, babel-plugin-transform-es3-member-expression-literals@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.8.0.tgz#180796863e2eddc4b48561d0c228369b05b722e2" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es3-property-literals@^6.5.0, babel-plugin-transform-es3-property-literals@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.8.0.tgz#8e7cc50cfe060b7c487ae33c501a4f659133bade" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-flow-strip-types@^6.5.0, babel-plugin-transform-flow-strip-types@^6.6.5, babel-plugin-transform-flow-strip-types@^6.7.0, babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.14.0.tgz#35ceb03f8770934044bab1a76f7e4ee0aa9220f9" + dependencies: + babel-plugin-syntax-flow "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-assign@^6.5.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.8.0.tgz#76e17f2dc0f36f14f548b9afd7aaef58d29ebb75" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread@^6.5.0, babel-plugin-transform-object-rest-spread@^6.6.5, babel-plugin-transform-object-rest-spread@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-react-display-name@^6.5.0, babel-plugin-transform-react-display-name@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-react-jsx-source@^6.5.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.9.0" + +babel-plugin-transform-react-jsx@^6.5.0, babel-plugin-transform-react-jsx@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" + dependencies: + babel-helper-builder-react-jsx "^6.8.0" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-regenerator@^6.5.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.16.0" + private "~0.1.5" + +babel-plugin-transform-strict-mode@^6.8.0: + version "6.11.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.11.3.tgz#183741325126bc7ec9cf4c0fc257d3e7ca5afd40" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-polyfill@^6.9.1: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + dependencies: + babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-preset-es2015-node@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz#60b23157024b0cfebf3a63554cb05ee035b4e55f" + dependencies: + babel-plugin-transform-es2015-destructuring "6.x" + babel-plugin-transform-es2015-function-name "6.x" + babel-plugin-transform-es2015-modules-commonjs "6.x" + babel-plugin-transform-es2015-parameters "6.x" + babel-plugin-transform-es2015-shorthand-properties "6.x" + babel-plugin-transform-es2015-spread "6.x" + babel-plugin-transform-es2015-sticky-regex "6.x" + babel-plugin-transform-es2015-unicode-regex "6.x" + semver "5.x" + +babel-preset-fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-1.0.0.tgz#c972e5c9b301d4ec9e7971f4aec3e14ac017a8b0" + dependencies: + babel-plugin-check-es2015-constants "^6.7.2" + babel-plugin-syntax-flow "^6.5.0" + babel-plugin-syntax-object-rest-spread "^6.5.0" + babel-plugin-syntax-trailing-function-commas "^6.5.0" + babel-plugin-transform-class-properties "^6.6.0" + babel-plugin-transform-es2015-arrow-functions "^6.5.2" + babel-plugin-transform-es2015-block-scoped-functions "^6.6.5" + babel-plugin-transform-es2015-block-scoping "^6.7.1" + babel-plugin-transform-es2015-classes "^6.6.5" + babel-plugin-transform-es2015-computed-properties "^6.6.5" + babel-plugin-transform-es2015-destructuring "^6.6.5" + babel-plugin-transform-es2015-for-of "^6.6.0" + babel-plugin-transform-es2015-literals "^6.5.0" + babel-plugin-transform-es2015-modules-commonjs "^6.7.0" + babel-plugin-transform-es2015-object-super "^6.6.5" + babel-plugin-transform-es2015-parameters "^6.7.0" + babel-plugin-transform-es2015-shorthand-properties "^6.5.0" + babel-plugin-transform-es2015-spread "^6.6.5" + babel-plugin-transform-es2015-template-literals "^6.6.5" + babel-plugin-transform-es3-member-expression-literals "^6.5.0" + babel-plugin-transform-es3-property-literals "^6.5.0" + babel-plugin-transform-flow-strip-types "^6.7.0" + babel-plugin-transform-object-rest-spread "^6.6.5" + object-assign "^4.0.1" + +babel-preset-fbjs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.0.tgz#1a8d4cacbac7c5a9194ce3b8475ffab33ed524fb" + dependencies: + babel-plugin-check-es2015-constants "^6.8.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-plugin-syntax-flow "^6.8.0" + babel-plugin-syntax-jsx "^6.8.0" + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-plugin-syntax-trailing-function-commas "^6.8.0" + babel-plugin-transform-class-properties "^6.8.0" + babel-plugin-transform-es2015-arrow-functions "^6.8.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.8.0" + babel-plugin-transform-es2015-block-scoping "^6.8.0" + babel-plugin-transform-es2015-classes "^6.8.0" + babel-plugin-transform-es2015-computed-properties "^6.8.0" + babel-plugin-transform-es2015-destructuring "^6.8.0" + babel-plugin-transform-es2015-for-of "^6.8.0" + babel-plugin-transform-es2015-function-name "^6.8.0" + babel-plugin-transform-es2015-literals "^6.8.0" + babel-plugin-transform-es2015-modules-commonjs "^6.8.0" + babel-plugin-transform-es2015-object-super "^6.8.0" + babel-plugin-transform-es2015-parameters "^6.8.0" + babel-plugin-transform-es2015-shorthand-properties "^6.8.0" + babel-plugin-transform-es2015-spread "^6.8.0" + babel-plugin-transform-es2015-template-literals "^6.8.0" + babel-plugin-transform-es3-member-expression-literals "^6.8.0" + babel-plugin-transform-es3-property-literals "^6.8.0" + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-plugin-transform-object-rest-spread "^6.8.0" + babel-plugin-transform-react-display-name "^6.8.0" + babel-plugin-transform-react-jsx "^6.8.0" + +babel-preset-react-native@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-1.9.0.tgz#035fc06c65f4f2a02d0336a100b2da142f36dab1" + dependencies: + babel-plugin-check-es2015-constants "^6.5.0" + babel-plugin-react-transform "2.0.2" + babel-plugin-syntax-async-functions "^6.5.0" + babel-plugin-syntax-class-properties "^6.5.0" + babel-plugin-syntax-flow "^6.5.0" + babel-plugin-syntax-jsx "^6.5.0" + babel-plugin-syntax-trailing-function-commas "^6.5.0" + babel-plugin-transform-class-properties "^6.5.0" + babel-plugin-transform-es2015-arrow-functions "^6.5.0" + babel-plugin-transform-es2015-block-scoping "^6.5.0" + babel-plugin-transform-es2015-classes "^6.5.0" + babel-plugin-transform-es2015-computed-properties "^6.5.0" + babel-plugin-transform-es2015-destructuring "^6.5.0" + babel-plugin-transform-es2015-for-of "^6.5.0" + babel-plugin-transform-es2015-function-name "^6.5.0" + babel-plugin-transform-es2015-literals "^6.5.0" + babel-plugin-transform-es2015-modules-commonjs "^6.5.0" + babel-plugin-transform-es2015-parameters "^6.5.0" + babel-plugin-transform-es2015-shorthand-properties "^6.5.0" + babel-plugin-transform-es2015-spread "^6.5.0" + babel-plugin-transform-es2015-template-literals "^6.5.0" + babel-plugin-transform-flow-strip-types "^6.5.0" + babel-plugin-transform-object-assign "^6.5.0" + babel-plugin-transform-object-rest-spread "^6.5.0" + babel-plugin-transform-react-display-name "^6.5.0" + babel-plugin-transform-react-jsx "^6.5.0" + babel-plugin-transform-react-jsx-source "^6.5.0" + babel-plugin-transform-regenerator "^6.5.0" + react-transform-hmr "^1.0.4" + +babel-register@^6.16.0, babel-register@^6.6.0: + version "6.16.3" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" + dependencies: + babel-core "^6.16.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^1.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + path-exists "^1.0.0" + source-map-support "^0.4.2" + +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.11.6" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.14.0, babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.16.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^8.3.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.6.4, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.8.2: + version "6.12.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.12.0.tgz#953e6202e58062f7f5041fc8037e4bd4e17140a9" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + +base62@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/base62/-/base62-1.1.1.tgz#974e82c11bd5e00816b508a7ed9c7b9086c9db6b" + +base64-js@^0.0.8, base64-js@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + +base64-url@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78" + +base64-url@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.2.tgz#90af26ef8b0b67bc801b05eccf943345649008b3" + +basic-auth-connect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" + +basic-auth@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.0.tgz#9ee6fc1ce7f54feaace7ce73588b056037866a2c" + +binaryextensions@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" + +bl@^1.0.0, bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.9.25: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +body-parser@~1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97" + dependencies: + bytes "2.1.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.0.1" + http-errors "~1.3.1" + iconv-lite "0.4.11" + on-finished "~2.3.0" + qs "4.0.0" + raw-body "~2.1.2" + type-is "~1.6.6" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bplist-creator@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.4.tgz#4ac0496782e127a85c1d2026a4f5eb22a7aff991" + dependencies: + stream-buffers "~0.2.3" + +bplist-parser@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.0.6.tgz#38da3471817df9d44ab3892e27707bbbd75a11b9" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.7.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.5.tgz#db003ac2671e62ebd6ece78ea2c2e1b405736e91" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer-to-vinyl@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" + dependencies: + file-type "^3.1.0" + readable-stream "^2.0.2" + uuid "^2.0.1" + vinyl "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bytes@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0, camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caw@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" + dependencies: + get-proxy "^1.0.1" + is-obj "^1.0.0" + object-assign "^3.0.0" + tunnel-agent "^0.4.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +cheerio@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" + dependencies: + css-select "~1.0.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^3.2.0" + +class-extend@^0.1.0, class-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/class-extend/-/class-extend-0.1.2.tgz#8057a82b00f53f82a5d62c50ef8cffdec6fabc34" + dependencies: + object-assign "^2.0.0" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + +code-point-at@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" + dependencies: + number-is-nan "^1.0.0" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.5.0, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +commoner@^0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.4.tgz#98f3333dd3ad399596bb2d384a783bb7213d68f8" + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.10.0" + +compressible@~2.0.5: + version "2.0.8" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.8.tgz#7162e6c46d3b9d200ffb45cb4e4a0f7832732503" + dependencies: + mime-db ">= 1.23.0 < 2" + +compression@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395" + dependencies: + accepts "~1.2.12" + bytes "2.1.0" + compressible "~2.0.5" + debug "~2.2.0" + on-headers "~1.0.0" + vary "~1.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6, concat-stream@^1.4.7: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +concat-stream@~1.4.5: + version "1.4.10" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.9" + typedarray "~0.0.5" + +connect-timeout@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e" + dependencies: + debug "~2.2.0" + http-errors "~1.3.1" + ms "0.7.1" + on-headers "~1.0.0" + +connect@^2.8.3: + version "2.30.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609" + dependencies: + basic-auth-connect "1.0.0" + body-parser "~1.13.3" + bytes "2.1.0" + compression "~1.5.2" + connect-timeout "~1.6.2" + content-type "~1.0.1" + cookie "0.1.3" + cookie-parser "~1.3.5" + cookie-signature "1.0.6" + csurf "~1.8.3" + debug "~2.2.0" + depd "~1.0.1" + errorhandler "~1.4.2" + express-session "~1.11.3" + finalhandler "0.4.0" + fresh "0.3.0" + http-errors "~1.3.1" + method-override "~2.3.5" + morgan "~1.6.1" + multiparty "3.3.2" + on-headers "~1.0.0" + parseurl "~1.3.0" + pause "0.1.0" + qs "4.0.0" + response-time "~2.3.1" + serve-favicon "~2.3.0" + serve-index "~1.7.2" + serve-static "~1.10.0" + type-is "~1.6.6" + utils-merge "1.0.0" + vhost "~3.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0, convert-source-map@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +cookie-parser@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.2.2, core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +crc@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn-async@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.4.tgz#c9a8d8e9a06502c7a46296e33a1a054b5d2f1812" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + +cross-spawn@^2.0.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-2.2.3.tgz#fac56202dfd3d0dd861778f2da203bf434bb821c" + dependencies: + cross-spawn-async "^2.2.2" + spawn-sync "^1.0.15" + +cross-spawn@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +csrf@~3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.3.tgz#69d13220de95762808bb120f7533a994fc4293b5" + dependencies: + base64-url "1.2.2" + rndm "1.2.0" + tsscmp "1.0.5" + uid-safe "2.1.1" + +css-select@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" + dependencies: + boolbase "~1.0.0" + css-what "1.0" + domutils "1.4" + nth-check "~1.0.0" + +css-what@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" + +csurf@~1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + csrf "~3.0.0" + http-errors "~1.3.1" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dargs@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + dependencies: + number-is-nan "^1.0.0" + +dashdash@^1.12.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" + dependencies: + assert-plus "^1.0.0" + +dateformat@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decompress-tar@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" + dependencies: + is-tar "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tarbz2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" + dependencies: + is-bzip2 "^1.0.0" + object-assign "^2.0.0" + seek-bzip "^1.0.3" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-targz@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" + dependencies: + is-gzip "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-unzip@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" + dependencies: + is-zip "^1.0.0" + read-all-stream "^3.0.0" + stat-mode "^0.2.0" + strip-dirs "^1.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + yauzl "^2.2.1" + +decompress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" + dependencies: + buffer-to-vinyl "^1.0.0" + concat-stream "^1.4.6" + decompress-tar "^3.0.0" + decompress-tarbz2 "^3.0.0" + decompress-targz "^3.0.0" + decompress-unzip "^3.0.0" + stream-combiner2 "^1.1.1" + vinyl-assign "^1.0.1" + vinyl-fs "^2.2.0" + +deep-equal@~0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" + +deep-extend@^0.4.0, deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + +depd@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-conflict@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" + +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-newline@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-1.0.3.tgz#e97b1003877d70c09af1af35bfadff168de4920d" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + +detective@^4.0.0, detective@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.1.tgz#9fb06dd1ee8f0ea4dbcc607cda39d9ce1d4f726f" + dependencies: + acorn "^1.0.3" + defined "^1.0.0" + +diff@^2.1.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + +dom-serializer@~0.1.0, dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@1.4: + version "1.4.3" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +download@^4.1.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" + dependencies: + caw "^1.0.1" + concat-stream "^1.4.7" + each-async "^1.0.0" + filenamify "^1.0.1" + got "^5.0.0" + gulp-decompress "^1.2.0" + gulp-rename "^1.2.0" + is-url "^1.2.0" + object-assign "^4.0.1" + read-all-stream "^3.0.0" + readable-stream "^2.0.2" + stream-combiner2 "^1.1.1" + vinyl "^1.0.0" + vinyl-fs "^2.2.0" + ware "^1.2.0" + +duplexer2@^0.1.4, duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer2@~0.0.2, duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexify@^3.2.0: + version "3.4.6" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.4.6.tgz#1e586a13028caf31d5144a059813f9b071fec557" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-async@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" + dependencies: + onetime "^1.0.0" + set-immediate-shim "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.3.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.2.tgz#21444ba09386f0c65b6eafb96a3d51bcb3be80d1" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + dependencies: + once "~1.3.0" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + dependencies: + is-arrayish "^0.2.1" + +errorhandler@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f" + dependencies: + accepts "~1.3.0" + escape-html "~1.0.3" + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-html@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima-fb@^15001.1.0-dev-harmony-fb: + version "15001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima@^2.0.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-target-shim@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express-session@~1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + crc "3.3.0" + debug "~2.2.0" + depd "~1.0.1" + on-headers "~1.0.0" + parseurl "~1.3.0" + uid-safe "~2.0.0" + utils-merge "1.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fancy-log@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.2.0.tgz#d5a51b53e9ab22ca07d558f2b67ae55fdb5fcbd8" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + +fb-watchman@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" + dependencies: + bser "^1.0.2" + +fbjs-scripts@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-0.7.1.tgz#4f115e218e243e3addbf0eddaac1e3c62f703fac" + dependencies: + babel-core "^6.7.2" + babel-preset-fbjs "^1.0.0" + core-js "^1.0.0" + cross-spawn "^3.0.1" + gulp-util "^3.0.4" + object-assign "^4.0.1" + semver "^5.1.0" + through2 "^2.0.0" + +fbjs@^0.8.3, fbjs@^0.8.4: + version "0.8.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.5.tgz#f69ba8a876096cb1b9bffe4d7c1e71c19d39d008" + dependencies: + core-js "^1.0.0" + immutable "^3.7.6" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + ua-parser-js "^0.7.9" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + +filenamify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b" + dependencies: + debug "~2.2.0" + escape-html "1.0.2" + on-finished "~2.3.0" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + dependencies: + readable-stream "^2.0.2" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs-extra@^0.26.2: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-proxy@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" + dependencies: + rc "^1.1.2" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +gh-got@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-2.4.0.tgz#aa51418911ca5e4f92437114cd1209383a4aa019" + dependencies: + got "^5.2.0" + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +github-username@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/github-username/-/github-username-2.1.0.tgz#200e5a104af42ba08a54096c708d4b6ec2fa256b" + dependencies: + gh-got "^2.2.0" + meow "^3.5.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.0.1.tgz#60021327cc963ddc3b5f085764f500479ecd82ff" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob@^5.0.15, glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^8.3.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" + +globby@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^6.0.1" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +got@^5.0.0, got@^5.2.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-5.6.0.tgz#bb1d7ee163b78082bbc8eb836f3f395004ea6fbf" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-plain-obj "^1.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^2.0.0" + unzip-response "^1.0.0" + url-parse-lax "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: + version "4.1.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +grouped-queue@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.2.tgz#1005f70ece919eccbb37a318f84af99fd6c4eb5c" + dependencies: + lodash "^3.10.1" + +gruntfile-editor@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gruntfile-editor/-/gruntfile-editor-1.2.0.tgz#169cc7ff532f0b2eb900eec351f7a2bf668302d0" + dependencies: + ast-query "^1.0.1" + lodash "^4.6.1" + +gulp-decompress@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" + dependencies: + archive-type "^3.0.0" + decompress "^3.0.0" + gulp-util "^3.0.1" + readable-stream "^2.0.2" + +gulp-rename@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-util@^3.0.1, gulp-util@^3.0.4: + version "3.0.7" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^1.0.11" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +html-wiring@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-wiring/-/html-wiring-1.2.0.tgz#c5f90a776e0a27241dc6df9022c37186d0270f9e" + dependencies: + cheerio "^0.19.0" + detect-newline "^1.0.3" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-basic@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-2.5.1.tgz#8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb" + dependencies: + caseless "~0.11.0" + concat-stream "^1.4.6" + http-response-object "^1.0.0" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-response-object@^1.0.0, http-response-object@^1.0.1, http-response-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-1.1.0.tgz#a7c4e75aae82f3bb4904e4f43f615673b4d518c3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +i@0.3.x: + version "0.3.5" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" + +iconv-lite@^0.4.5, iconv-lite@~0.4.13, iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade" + +image-size@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.3.5.tgz#83240eab2fb5b00b04aab8c74b0471e9cba7ad8c" + +immutable@^3.7.6: + version "3.8.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" + +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.11.4.tgz#81e3374e8361beaff2d97016206d359d0b32fa4d" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^1.0.1" + figures "^1.3.5" + lodash "^3.3.1" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +invariant@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-absolute@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + dependencies: + is-relative "^0.1.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-bzip2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-natural-number@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-tar@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-url@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is-zip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" + +isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isemail@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2, isstream@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" + dependencies: + binaryextensions "~1.0.0" + textextensions "~1.0.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +joi@^6.6.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" + dependencies: + hoek "2.x.x" + isemail "1.x.x" + moment "2.x.x" + topo "1.x.x" + +js-tokens@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +JSONStream@^1.0.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.2.1.tgz#32aa5790e799481083b49b4b7fa94e23bae69bf9" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jstransform@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" + dependencies: + base62 "^1.1.0" + commoner "^0.10.1" + esprima-fb "^15001.1.0-dev-harmony-fb" + object-assign "^2.0.0" + source-map "^0.4.2" + +kind-of@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.0.tgz#8857bfbc1d824badf13d3d0241d8bbe46fb12f73" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash@^3.1.0, lodash@^3.10.1, lodash@^3.2.0, lodash@^3.3.1, lodash@^3.5.0, lodash@^3.6.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: + version "4.16.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" + +log-symbols@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f" + dependencies: + js-tokens "^1.0.1" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.0, lru-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem-fs-editor@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-2.3.0.tgz#42a0ae1f55e76fd03f09e7c7b15b6307bdf5cb13" + dependencies: + commondir "^1.0.1" + deep-extend "^0.4.0" + ejs "^2.3.1" + glob "^7.0.3" + globby "^4.0.0" + mkdirp "^0.5.0" + multimatch "^2.0.0" + rimraf "^2.2.8" + through2 "^2.0.0" + vinyl "^1.1.0" + +mem-fs@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" + dependencies: + through2 "^2.0.0" + vinyl "^1.1.0" + vinyl-file "^2.0.0" + +meow@^3.1.0, meow@^3.3.0, meow@^3.5.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.0.tgz#9cfd156fef35421e2b5403ce11dc6eb1962b026e" + dependencies: + readable-stream "^2.0.1" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +method-override@~2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.6.tgz#209261cc588d45d9d5a022ff20d7d5eb8e92179e" + dependencies: + debug "~2.2.0" + methods "~1.1.2" + parseurl "~1.3.1" + vary "~1.1.0" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.23.0 < 2", mime-db@~1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" + +mime-db@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" + +mime-types@^2.1.11, mime-types@~2.1.11, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: + version "2.1.12" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" + dependencies: + mime-db "~1.24.0" + +mime-types@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" + dependencies: + mime-db "~1.23.0" + +mime@^1.3.4, mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@0.x.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +module-deps@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" + dependencies: + browser-resolve "^1.7.0" + concat-stream "~1.4.5" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "0.0.2" + inherits "^2.0.1" + JSONStream "^1.0.3" + parents "^1.0.0" + readable-stream "^1.1.13" + resolve "^1.1.3" + stream-combiner2 "~1.0.0" + subarg "^1.0.0" + through2 "^1.0.0" + xtend "^4.0.0" + +moment@2.x.x: + version "2.15.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.1.tgz#e979c2a29e22888e60f396f2220a6118f85cd94c" + +morgan@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2" + dependencies: + basic-auth "~1.0.3" + debug "~2.2.0" + depd "~1.0.1" + on-finished "~2.3.0" + on-headers "~1.0.0" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multiparty@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f" + dependencies: + readable-stream "~1.1.9" + stream-counter "~0.2.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.3.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +ncp@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" + +negotiator@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-fetch@^1.0.1, node-fetch@^1.3.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-pre-gyp@^0.6.30: + version "0.6.30" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" + dependencies: + mkdirp "~0.5.0" + nopt "~3.0.1" + npmlog "4.x" + rc "~1.1.0" + request "2.x" + rimraf "~2.5.0" + semver "~5.3.0" + tar "~2.2.0" + tar-pack "~3.1.0" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + +node-uuid@~1.4.7, node-uuid@1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" + +nopt@^3.0.0, nopt@~3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" + dependencies: + ansi "~0.3.1" + are-we-there-yet "~1.1.2" + gauge "~1.2.5" + +npmlog@4.x: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +nth-check@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" + dependencies: + for-own "^0.1.3" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +opn@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" + dependencies: + object-assign "^4.0.1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +parents@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + dependencies: + path-platform "~0.11.15" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.1.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parseurl@~1.3.0, parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + +path-exists@^2.0.0, path-exists@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74" + +pegjs@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.9.0.tgz#f6aefa2e3ce56169208e52179dfe41f89141a369" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +pkginfo@0.x.x: + version "0.4.0" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" + +plist@^1.2.0, plist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593" + dependencies: + base64-js "0.0.8" + util-deprecate "1.0.2" + xmlbuilder "4.0.0" + xmldom "0.1.x" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-bytes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-2.0.1.tgz#155ec4d0036f41391e7045d6dbe4963d525d264f" + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + number-is-nan "^1.0.0" + +private@^0.1.6, private@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + dependencies: + asap "~2.0.3" + +prompt@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" + dependencies: + colors "^1.1.2" + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.3.x" + winston "2.1.x" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +q@^1.1.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +qs@^6.1.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +qs@~6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" + +qs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + +randomatic@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" + +raw-body@~2.1.2: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@^1.1.2, rc@~1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +react-clone-referenced-element@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682" + +react-deep-force-update@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7" + +react-native-fs@^1.1.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-1.5.1.tgz#5f98a3d59eb6d27d1217b720a31d10fe576b57c4" + dependencies: + base-64 "^0.1.0" + bluebird "^2.9.25" + utf8 "^2.1.1" + +react-native@^0.34.0: + version "0.34.1" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.34.1.tgz#a88370bd5f0f74831605415a302395eb5b376917" + dependencies: + absolute-path "^0.0.0" + art "^0.10.0" + babel-core "^6.10.4" + babel-plugin-external-helpers "^6.8.0" + babel-plugin-syntax-trailing-function-commas "^6.5.0" + babel-plugin-transform-flow-strip-types "^6.6.5" + babel-plugin-transform-object-rest-spread "^6.6.5" + babel-polyfill "^6.9.1" + babel-preset-es2015-node "^6.1.0" + babel-preset-fbjs "^2.0.0" + babel-preset-react-native "^1.9.0" + babel-register "^6.6.0" + babel-types "^6.6.4" + babylon "^6.8.2" + base64-js "^0.0.8" + bser "^1.0.2" + chalk "^1.1.1" + commander "^2.9.0" + connect "^2.8.3" + core-js "^2.2.2" + debug "^2.2.0" + denodeify "^1.2.1" + event-target-shim "^1.0.5" + fbjs "^0.8.3" + fbjs-scripts "^0.7.0" + fs-extra "^0.26.2" + glob "^5.0.15" + graceful-fs "^4.1.3" + image-size "^0.3.5" + immutable "~3.7.6" + inquirer "^0.12.0" + joi "^6.6.1" + json-stable-stringify "^1.0.1" + json5 "^0.4.0" + jstransform "^11.0.3" + lodash "^3.10.1" + mime "^1.3.4" + mime-types "2.1.11" + minimist "^1.2.0" + mkdirp "^0.5.1" + module-deps "^3.9.1" + node-fetch "^1.3.3" + npmlog "^2.0.4" + opn "^3.0.2" + optimist "^0.6.1" + plist "^1.2.0" + progress "^1.1.8" + promise "^7.1.1" + react-clone-referenced-element "^1.0.1" + react-timer-mixin "^0.13.2" + react-transform-hmr "^1.0.4" + rebound "^0.0.13" + regenerator-runtime "^0.9.5" + sane "~1.4.1" + semver "^5.0.3" + source-map "^0.4.4" + stacktrace-parser "^0.1.3" + temp "0.8.3" + uglify-js "^2.6.2" + whatwg-fetch "^1.0.0" + wordwrap "^1.0.0" + worker-farm "^1.3.1" + ws "^1.1.0" + xcode "^0.8.9" + xmldoc "^0.4.0" + yargs "^3.24.0" + yeoman-environment "1.5.3" + yeoman-generator "0.21.2" + +react-proxy@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" + dependencies: + lodash "^4.6.1" + react-deep-force-update "^1.0.0" + +react-timer-mixin@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.3.tgz#0da8b9f807ec07dc3e854d082c737c65605b3d22" + +react-transform-hmr@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" + dependencies: + global "^4.3.0" + react-proxy "^1.1.7" + +react@~15.3.1: + version "15.3.2" + resolved "https://registry.yarnpkg.com/react/-/react-15.3.2.tgz#a7bccd2fee8af126b0317e222c28d1d54528d09e" + dependencies: + fbjs "^0.8.4" + loose-envify "^1.1.0" + object-assign "^4.1.0" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-chunk@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read@1.0.x: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +readable-stream@^1.1.13, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0, readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +"realm-tests@file:../js": + version "0.0.1" + dependencies: + es6-promise "^3.2.1" + +"realm@file:../..": + version "0.14.3-6" + dependencies: + nan "^2.3.3" + node-pre-gyp "^0.6.30" + request "^2.74.0" + sync-request "^3.0.1" + url "^0.11.0" + +rebound@^0.0.13: + version "0.0.13" + resolved "https://registry.yarnpkg.com/rebound/-/rebound-0.0.13.tgz#4a225254caf7da756797b19c5817bf7a7941fac1" + +recast@^0.10.0: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" + +regenerator-runtime@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.5.4" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +request@^2.74.0, request@2.x: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.0.0" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +resolve@^1.1.3, resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +response-time@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.1.tgz#2bde19181de6c81ab95e3207a28d61d965b31797" + dependencies: + depd "~1.0.1" + on-headers "~1.0.0" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +revalidator@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.0, rimraf@^2.2.8, rimraf@~2.5.0, rimraf@~2.5.1, rimraf@2, rimraf@2.x.x: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +rndm@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" + +seek-bzip@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + dependencies: + commander "~2.8.1" + +semver@^5.0.3, semver@^5.1.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", semver@5.x: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.3.1" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.0.3" + statuses "~1.2.1" + +serve-favicon@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.0.tgz#aed36cc6834069a6f189cc7222c6a1a811dc5b39" + dependencies: + etag "~1.7.0" + fresh "0.3.0" + ms "0.7.1" + parseurl "~1.3.0" + +serve-index@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2" + dependencies: + accepts "~1.2.13" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.3.1" + mime-types "~2.1.9" + parseurl "~1.3.1" + +serve-static@~1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" + dependencies: + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.13.2" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" + +signal-exit@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" + +simple-plist@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.1.4.tgz#10eb51b47e33c556eb8ec46d5ee64d64e717db5d" + dependencies: + bplist-creator "0.0.4" + bplist-parser "0.0.6" + plist "1.2.0" + +sinon@^1.9.1: + version "1.17.6" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" + dependencies: + source-map "^0.5.3" + +source-map@^0.4.2, source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +stacktrace-parser@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +statuses@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" + +statuses@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" + +stream-buffers@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-0.2.6.tgz#181c08d5bb3690045f69401b9ae6a7a0cf3313fc" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner2@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671" + dependencies: + duplexer2 "~0.0.2" + through2 "~0.5.1" + +stream-counter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de" + dependencies: + readable-stream "~1.1.8" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" + dependencies: + first-chunk-stream "^2.0.0" + strip-bom "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-dirs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + is-absolute "^0.1.5" + is-natural-number "^2.0.0" + minimist "^1.1.0" + sum-up "^1.0.1" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-outer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8" + dependencies: + escape-string-regexp "^1.0.2" + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +sync-request@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-3.0.1.tgz#caa1235aaf889ba501076a1834c436830a82fb73" + dependencies: + concat-stream "^1.4.7" + http-response-object "^1.0.1" + then-request "^2.0.1" + +tar-pack@~3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.1.4.tgz#bc8cf9a22f5832739f12f3910dac1eb97b49708c" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar-stream@^1.1.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@~2.2.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textextensions@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" + +then-request@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/then-request/-/then-request-2.2.0.tgz#6678b32fa0ca218fe569981bbd8871b594060d81" + dependencies: + caseless "~0.11.0" + concat-stream "^1.4.7" + http-basic "^2.5.1" + http-response-object "^1.1.0" + promise "^7.1.1" + qs "^6.1.0" + +through@^2.3.6, "through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^0.6.0, through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" + dependencies: + readable-stream "~2.0.0" + xtend "~4.0.0" + +through2@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +time-stamp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +topo@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" + dependencies: + hoek "2.x.x" + +tough-cookie@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" + +traverse@^0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + dependencies: + escape-string-regexp "^1.0.2" + +tsscmp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" + +tunnel-agent@^0.4.0, tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.6: + version "1.6.13" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.11" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@^0.7.9: + version "0.7.10" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" + +uglify-js@^2.6.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.3.tgz#39b3a7329b89f5ec507e344c6e22568698ef4868" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uid-safe@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137" + dependencies: + base64-url "1.2.1" + +uid-safe@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.1.tgz#3dbf9436b528be9f52882c05a6216c3763db3666" + dependencies: + base64-url "1.2.2" + random-bytes "~1.0.0" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +underscore.string@^3.0.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + dependencies: + sprintf-js "^1.0.3" + util-deprecate "^1.0.2" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +untildify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + dependencies: + os-homedir "^1.0.0" + +unzip-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.1.tgz#4a73959f2989470fa503791cefb54e1dbbc68412" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +utf8@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" + +util-deprecate@^1.0.2, util-deprecate@~1.0.1, util-deprecate@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +"util@>=0.10.3 <1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utile@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" + dependencies: + async "~0.9.0" + deep-equal "~0.2.1" + i "0.3.x" + mkdirp "0.x.x" + ncp "1.0.x" + rimraf "2.x.x" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vary@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" + +vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vhost@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" + +vinyl-assign@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" + dependencies: + object-assign "^4.0.1" + readable-stream "^2.0.0" + +vinyl-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" + dependencies: + graceful-fs "^4.1.2" + pify "^2.3.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + strip-bom-stream "^2.0.0" + vinyl "^1.1.0" + +vinyl-fs@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0, vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +ware@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + dependencies: + wrap-fn "^0.1.0" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +whatwg-fetch@^1.0.0, whatwg-fetch@>=0.10.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz#01c2ac4df40e236aaa18480e3be74bd5c8eb798e" + +which@^1.2.8, which@^1.2.9: + version "1.2.11" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +wildcard@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" + dependencies: + string-width "^1.0.1" + +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + dependencies: + co "3.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +xcode@^0.8.9: + version "0.8.9" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.9.tgz#ec6765f70e9dccccc9f6e9a5b9b4e7e814b4cf35" + dependencies: + node-uuid "1.4.7" + pegjs "0.9.0" + simple-plist "0.1.4" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xmlbuilder@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" + dependencies: + lodash "^4.0.0" + +xmlbuilder@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3" + dependencies: + lodash "^3.5.0" + +xmldoc@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" + dependencies: + sax "~1.1.1" + +xmldom@0.1.x: + version "0.1.22" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.22.tgz#10de4e5e964981f03c8cc72fadc08d14b6c3aa26" + +xtend@^4.0.0, "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" + +yargs@^3.24.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@^2.2.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.6.0.tgz#40894d4587bb125500d05df45471cd5e114a76f9" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.0.1" + +yeoman-assert@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yeoman-assert/-/yeoman-assert-2.2.1.tgz#524bff6b2a83d344a7a24ea825c5eb16504396f5" + dependencies: + lodash "^3.6.0" + path-exists "^2.1.0" + +yeoman-environment@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-1.5.3.tgz#76f0d14bd2529ca912bd6d20bcb717f8cd1a9ce7" + dependencies: + chalk "^1.0.0" + debug "^2.0.0" + diff "^2.1.2" + escape-string-regexp "^1.0.2" + globby "^4.0.0" + grouped-queue "^0.3.0" + inquirer "^0.11.0" + lodash "^3.1.0" + log-symbols "^1.0.1" + mem-fs "^1.1.0" + text-table "^0.2.0" + untildify "^2.0.0" + +yeoman-generator@0.21.2: + version "0.21.2" + resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-0.21.2.tgz#3e2e32fe59442ddab33924e16f4cb621f0bd1d06" + dependencies: + async "^1.4.2" + chalk "^1.0.0" + class-extend "^0.1.0" + cli-table "^0.3.1" + cross-spawn "^2.0.0" + dargs "^4.0.0" + dateformat "^1.0.11" + debug "^2.1.0" + detect-conflict "^1.0.0" + download "^4.1.2" + find-up "^1.0.0" + github-username "^2.0.0" + glob "^5.0.3" + gruntfile-editor "^1.0.0" + html-wiring "^1.0.0" + inquirer "^0.11.0" + istextorbinary "^1.0.2" + lodash "^3.5.0" + mem-fs-editor "^2.0.0" + mkdirp "^0.5.0" + nopt "^3.0.0" + path-exists "^2.0.0" + path-is-absolute "^1.0.0" + pretty-bytes "^2.0.1" + read-chunk "^1.0.1" + read-pkg-up "^1.0.1" + rimraf "^2.2.0" + shelljs "^0.5.0" + sinon "^1.9.1" + text-table "^0.2.0" + through2 "^2.0.0" + underscore.string "^3.0.3" + user-home "^2.0.0" + xdg-basedir "^2.0.0" + yeoman-assert "^2.0.0" + yeoman-environment "1.5.3" + yeoman-welcome "^1.0.0" + +yeoman-welcome@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/yeoman-welcome/-/yeoman-welcome-1.0.1.tgz#f6cf198fd4fba8a771672c26cdfb8a64795c84ec" + dependencies: + chalk "^1.0.0" + From d987c7db7b7c7b05feadc4a908798ff98330b7d0 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 19 Oct 2016 18:59:59 -0700 Subject: [PATCH 024/100] add api for all users --- src/js_sync.hpp | 16 ++++++++++++++++ test.js | 32 +++++++++++++++++++------------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/js_sync.hpp b/src/js_sync.hpp index bf758f53..bfdde397 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -73,6 +73,13 @@ public: MethodMap const static_methods = { {"createUser", wrap} }; + + static void all_users(ContextType ctx, ObjectType object, ReturnValue &return_value); + + PropertyMap const static_properties = { + {"all", {wrap, nullptr}}, + }; + }; template @@ -109,6 +116,15 @@ void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t a return_value.set(create_object>(ctx, user)); } +template +void UserClass::all_users(ContextType ctx, ObjectType object, ReturnValue &return_value) { + std::vector user_vector; + for (auto user : SyncManager::shared().all_users()) { + user_vector.push_back(create_object>(ctx, new SharedUser(user))); + } + return_value.set(Object::create_array(ctx, user_vector)); +} + template class SyncClass : public ClassDefinition { using GlobalContextType = typename T::GlobalContext; diff --git a/test.js b/test.js index 97d3857c..0985b301 100644 --- a/test.js +++ b/test.js @@ -23,19 +23,12 @@ const prompt = require('prompt'); const mkdirp = require('mkdirp'); const wildcard = require('wildcard'); -// User.loginWithProvider('http://127.0.0.1:8080/', 'debug', 'abcd', function(error, user) { -// console.log(user); -// }); - -Realm.Sync.User.create('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { - var notifier_dir = './notifier'; mkdirp.sync(notifier_dir); var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIsICJkb3dubG9hZCIsICJtYW5hZ2UiXQp9Cg==:DlFksxA+cJyEOc9bu6JwBUfDi4fJCagjAcIPPsoisjqfmOzSrk5Omuw0IkxCRU534p2+CAAj5IOH47DfObPtAA8q2DHguYDOKWYxyktS/6doPCqDHYN7k9EgUHdPTkESNkuPZbaVfXZTGzocB8m7+MaEXJde7FGPbh1sBz/+sPldnlAhnOqO5QbWzIEyoGHiOSg3V7UCh2H8kalr3tef7fkE2X65OBMgcarPvM5M6sPijOx2N5zrVrjL2wvguP9zS+g2ybFPUqV3DGv3S8cnGA+wVId/jCfGc2ujNhecunJdENH+/pL+0BTYHCFEWkY1WP1NUyti60FwRaXAtcYxeA=='; -var admin_user = new Realm.Sync.User.adminUser('http://127.0.0.1:9080/', access_token); - -Realm.Sync.setLogLevel('error'); +// var admin_user = new Realm.Sync.User.adminUser('http://127.0.0.1:9080/', access_token); +// Realm.Sync.setLogLevel('error'); // Realm.Sync.setGlobalListener(notifier_dir, 'realm://127.0.0.1:9080', admin_user, // (name) => { // console.log('filter: ' + name); @@ -48,7 +41,11 @@ Realm.Sync.setLogLevel('error'); // ); // console.log('global notifier listening...'); -Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { +function createObjects(error, user) { + console.log(user.server); + console.log(user.token); + console.log(user.identity); + var realm = new Realm({ sync: { user: user, @@ -77,7 +74,16 @@ Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, us } prompt.start(); prompt.get(['int'], create); -}); - -}); +} +console.log(Realm.Sync.User.all); +if (Realm.Sync.User.all.length) { + console.log('Using persisted user'); + createObjects(undefined, Realm.Sync.User.all[0]); + //Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); +} +else { + console.log('Logging in'); + Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); + //Realm.Sync.User.create('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); +} From dfc10a5a420f553ef53f5492cb175ef4b404f73f Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 19 Oct 2016 20:25:10 -0700 Subject: [PATCH 025/100] update to latest object store changes/bugfixes --- src/js_sync.hpp | 4 ++-- src/object-store | 2 +- test.js | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js_sync.hpp b/src/js_sync.hpp index bfdde397..2ea518f3 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -84,7 +84,7 @@ public: template void UserClass::get_server(ContextType ctx, ObjectType object, ReturnValue &return_value) { - std::string server = get_internal>(object)->get()->server_url; + std::string server = get_internal>(object)->get()->server_url(); return_value.set(server); } @@ -111,8 +111,8 @@ void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t a SharedUser *user = new SharedUser(SyncManager::shared().get_user(Value::validated_to_string(ctx, arguments[1]), Value::validated_to_string(ctx, arguments[2]), + (std::string)Value::validated_to_string(ctx, arguments[0]), Value::validated_to_boolean(ctx, arguments[3]))); - user->get()->server_url = Value::validated_to_string(ctx, arguments[0]); return_value.set(create_object>(ctx, user)); } diff --git a/src/object-store b/src/object-store index d2ccd87a..1cf28ec0 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit d2ccd87ac6312f3a75eaae3725892c89937f2207 +Subproject commit 1cf28ec004b20353c175feb669c8d84943282035 diff --git a/test.js b/test.js index 0985b301..035cfc14 100644 --- a/test.js +++ b/test.js @@ -26,9 +26,8 @@ const wildcard = require('wildcard'); var notifier_dir = './notifier'; mkdirp.sync(notifier_dir); -var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIsICJkb3dubG9hZCIsICJtYW5hZ2UiXQp9Cg==:DlFksxA+cJyEOc9bu6JwBUfDi4fJCagjAcIPPsoisjqfmOzSrk5Omuw0IkxCRU534p2+CAAj5IOH47DfObPtAA8q2DHguYDOKWYxyktS/6doPCqDHYN7k9EgUHdPTkESNkuPZbaVfXZTGzocB8m7+MaEXJde7FGPbh1sBz/+sPldnlAhnOqO5QbWzIEyoGHiOSg3V7UCh2H8kalr3tef7fkE2X65OBMgcarPvM5M6sPijOx2N5zrVrjL2wvguP9zS+g2ybFPUqV3DGv3S8cnGA+wVId/jCfGc2ujNhecunJdENH+/pL+0BTYHCFEWkY1WP1NUyti60FwRaXAtcYxeA=='; +// var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIsICJkb3dubG9hZCIsICJtYW5hZ2UiXQp9Cg==:DlFksxA+cJyEOc9bu6JwBUfDi4fJCagjAcIPPsoisjqfmOzSrk5Omuw0IkxCRU534p2+CAAj5IOH47DfObPtAA8q2DHguYDOKWYxyktS/6doPCqDHYN7k9EgUHdPTkESNkuPZbaVfXZTGzocB8m7+MaEXJde7FGPbh1sBz/+sPldnlAhnOqO5QbWzIEyoGHiOSg3V7UCh2H8kalr3tef7fkE2X65OBMgcarPvM5M6sPijOx2N5zrVrjL2wvguP9zS+g2ybFPUqV3DGv3S8cnGA+wVId/jCfGc2ujNhecunJdENH+/pL+0BTYHCFEWkY1WP1NUyti60FwRaXAtcYxeA=='; // var admin_user = new Realm.Sync.User.adminUser('http://127.0.0.1:9080/', access_token); -// Realm.Sync.setLogLevel('error'); // Realm.Sync.setGlobalListener(notifier_dir, 'realm://127.0.0.1:9080', admin_user, // (name) => { // console.log('filter: ' + name); @@ -41,6 +40,8 @@ var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIs // ); // console.log('global notifier listening...'); +Realm.Sync.setLogLevel('error'); + function createObjects(error, user) { console.log(user.server); console.log(user.token); @@ -76,7 +77,6 @@ function createObjects(error, user) { prompt.get(['int'], create); } -console.log(Realm.Sync.User.all); if (Realm.Sync.User.all.length) { console.log('Using persisted user'); createObjects(undefined, Realm.Sync.User.all[0]); From e52351fc50deb62f8c739923fbcdbfe1f9c9e71d Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 20 Oct 2016 13:07:45 -0700 Subject: [PATCH 026/100] add support for logging out --- src/js_sync.hpp | 19 +++++++++++++++---- src/object-store | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 2ea518f3..990b04d8 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -80,6 +80,11 @@ public: {"all", {wrap, nullptr}}, }; + static void logout(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); + + MethodMap const methods = { + {"logout", wrap} + }; }; template @@ -109,10 +114,11 @@ template void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 3, 4); - SharedUser *user = new SharedUser(SyncManager::shared().get_user(Value::validated_to_string(ctx, arguments[1]), - Value::validated_to_string(ctx, arguments[2]), - (std::string)Value::validated_to_string(ctx, arguments[0]), - Value::validated_to_boolean(ctx, arguments[3]))); + SharedUser *user = new SharedUser(SyncManager::shared().get_user( + Value::validated_to_string(ctx, arguments[1]), + Value::validated_to_string(ctx, arguments[2]), + (std::string)Value::validated_to_string(ctx, arguments[0]), + Value::validated_to_boolean(ctx, arguments[3]))); return_value.set(create_object>(ctx, user)); } @@ -125,6 +131,11 @@ void UserClass::all_users(ContextType ctx, ObjectType object, ReturnValue &re return_value.set(Object::create_array(ctx, user_vector)); } +template +void UserClass::logout(ContextType ctx, ObjectType object, size_t, const ValueType[], ReturnValue &) { + get_internal>(object)->get()->log_out(); +} + template class SyncClass : public ClassDefinition { using GlobalContextType = typename T::GlobalContext; diff --git a/src/object-store b/src/object-store index 1cf28ec0..e4a0ff94 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 1cf28ec004b20353c175feb669c8d84943282035 +Subproject commit e4a0ff9493c1559fae7ec64a42fa87dc52be8fd2 From 60d9da1b4435d812a1e4fc12b19a65a51273f7fb Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 26 Oct 2016 17:20:34 -0700 Subject: [PATCH 027/100] remove unneded server argument for adminUser, update care and sync dependencies --- lib/user-methods.js | 4 ++-- scripts/download-core.sh | 9 +++++---- src/object-store | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/user-methods.js b/lib/user-methods.js index db93c236..58e7bed5 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -65,12 +65,12 @@ module.exports = function(realmConstructor) { } var methods = {}; - methods['adminUser'] = function(server, token) { + methods['adminUser'] = function(token) { var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); - var user = realmConstructor.Sync.User.createUser(server, uuid, token, true); + var user = realmConstructor.Sync.User.createUser('', uuid, token, true); return user; } diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 4f4bf00f..99eeef8f 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -5,7 +5,7 @@ set -o pipefail # Set to "latest" for the latest build. : ${REALM_CORE_VERSION:=2.1.0} -: ${REALM_SYNC_VERSION:=1.0.0-BETA-2.0} +: ${REALM_SYNC_VERSION:=1.0.0-BETA-3.3} if [ "$1" = '--version' ]; then echo "$REALM_CORE_VERSION" @@ -15,7 +15,6 @@ fi # The 'node' argument will result in realm-node build being downloaded. if [ "$1" = 'node' ]; then CORE_DIR="core-node" - SYNC_DIR="sync-node" if [ "$(uname)" = 'Darwin' ]; then PLATFORM_TAG="node-osx-" @@ -26,11 +25,12 @@ if [ "$1" = 'node' ]; then fi else CORE_DIR='core' - SYNC_DIR='sync' PLATFORM_TAG="" - SYNC_PLATFORM_TAG="cocoa-" fi +SYNC_DIR='sync' +SYNC_PLATFORM_TAG="cocoa-" + CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" @@ -56,6 +56,7 @@ download_core() { mkdir -p "$TMP_DIR" if [ ! -f "$TAR" ]; then + echo "https://static.realm.io/downloads/$SERVER_DIR/$DOWNLOAD_FILE" curl -f -L -s "https://static.realm.io/downloads/$SERVER_DIR/$DOWNLOAD_FILE" -o "$TMP_TAR" || die "Downloading $DIR failed. Please try again once you have an Internet connection." mv "$TMP_TAR" "$TAR" diff --git a/src/object-store b/src/object-store index e4a0ff94..d8f5765c 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit e4a0ff9493c1559fae7ec64a42fa87dc52be8fd2 +Subproject commit d8f5765c574357635e09e25cb2bad58c68d08939 From 5a49dbc3256dc7f6196fa2cf1d2b2b6c81d4b0c7 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 27 Oct 2016 13:49:41 -0700 Subject: [PATCH 028/100] make sync work with RealmJS tests --- lib/user-methods.js | 24 +++++++++++++----------- package.json | 5 ++--- scripts/download-core.sh | 2 +- src/RealmJS.xcodeproj/project.pbxproj | 23 +++++++++++++++++++++++ src/js_sync.hpp | 11 +++++++++++ tests/ios/RJSModuleLoader.m | 8 +++++++- 6 files changed, 57 insertions(+), 16 deletions(-) diff --git a/lib/user-methods.js b/lib/user-methods.js index 58e7bed5..01c4f7f7 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -26,7 +26,9 @@ if (typeof fetch != 'undefined') { } } else { - post = node_require('request').post; + post = function(options, callback) { + node_require('needle').post(options.url, options.body, options, callback); + } } const url = require("url"); @@ -74,7 +76,15 @@ module.exports = function(realmConstructor) { return user; } - methods['login'] = function(server, username, password, callback) { + methods['register'] = function(server, username, password, callback) { + _authenticate(server, { + provider: 'password', + user_info: { password: password, register: true }, + data: username + }, callback); + } + + methods['registerExisting'] = function(server, username, password, callback) { _authenticate(server, { provider: 'password', user_info: { password: password }, @@ -82,21 +92,13 @@ module.exports = function(realmConstructor) { }, callback); } - methods['loginWithProvider'] = function(server, provider, providerToken, callback) { + methods['registerWithProvider'] = function(server, provider, providerToken, callback) { _authenticate(server, { provider: provider, data: providerToken }, callback); } - methods['create'] = function(server, username, password, callback) { - _authenticate(server, { - provider: 'password', - user_info: { password: password, register: true }, - data: username - }, callback); - } - methods['_authenticateRealm'] = function(fileUrl, realmUrl, callback) { var options = { url: this.server + 'auth', diff --git a/package.json b/package.json index 4a2de659..bfc8a2f1 100644 --- a/package.json +++ b/package.json @@ -49,10 +49,9 @@ }, "dependencies": { "nan": "^2.3.3", + "needle": "^1.3.0", "node-pre-gyp": "^0.6.30", - "request": "^2.74.0", - "sync-request": "^3.0.1", - "url": "^0.11.0" + "sync-request": "^3.0.1" }, "devDependencies": { "babel-eslint": "^6.0.4", diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 99eeef8f..1efe8ebf 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -4,7 +4,7 @@ set -e set -o pipefail # Set to "latest" for the latest build. -: ${REALM_CORE_VERSION:=2.1.0} +: ${REALM_CORE_VERSION:=2.1.4} : ${REALM_SYNC_VERSION:=1.0.0-BETA-3.3} if [ "$1" = '--version' ]; then diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 9a41d42f..b0ecb740 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -23,8 +23,10 @@ 02414BA91CE6ABCF00A8669F /* collection_notifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B961CE6AADD00A8669F /* collection_notifications.cpp */; }; 0270BC821B7D020100010E03 /* RealmJSTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC7B1B7D020100010E03 /* RealmJSTests.mm */; }; 027A23131CD3E379000543AE /* libRealmJS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */; }; + 02879D8C1DC29D5600777A5D /* package.json in Resources */ = {isa = PBXBuildFile; fileRef = 02879D8B1DC29D5600777A5D /* package.json */; }; 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02D041F61CE11159000E4250 /* dates-v3.realm */; }; 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; + 02E265691DC1896100BBDB04 /* request in Resources */ = {isa = PBXBuildFile; fileRef = 02E265681DC1896100BBDB04 /* request */; }; 02E315C91DB80DDD00555337 /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C31DB80DDD00555337 /* sync_manager.cpp */; }; 02E315CA1DB80DDD00555337 /* sync_session.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C51DB80DDD00555337 /* sync_session.cpp */; }; 02E315CB1DB80DDD00555337 /* sync_user.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C71DB80DDD00555337 /* sync_user.cpp */; }; @@ -139,6 +141,7 @@ 0270BC781B7D020100010E03 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ios/Info.plist; sourceTree = ""; }; 0270BC7A1B7D020100010E03 /* RealmJSTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealmJSTests.h; path = ios/RealmJSTests.h; sourceTree = ""; }; 0270BC7B1B7D020100010E03 /* RealmJSTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RealmJSTests.mm; path = ios/RealmJSTests.mm; sourceTree = ""; }; + 02879D8B1DC29D5600777A5D /* package.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = package.json; path = ../package.json; sourceTree = ""; }; 029048011C0428DF00ABDED4 /* jsc_init.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jsc_init.cpp; sourceTree = ""; }; 029048021C0428DF00ABDED4 /* jsc_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jsc_init.h; sourceTree = ""; }; 029048041C0428DF00ABDED4 /* js_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = js_list.hpp; sourceTree = ""; }; @@ -156,6 +159,7 @@ 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RealmJSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 02D041F61CE11159000E4250 /* dates-v3.realm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "dates-v3.realm"; sourceTree = ""; }; + 02E265681DC1896100BBDB04 /* request */ = {isa = PBXFileReference; lastKnownFileType = folder; name = request; path = "../tests/react-test-app/node_modules/request"; sourceTree = ""; }; 02E315C21DB80DDD00555337 /* sync_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_config.hpp; path = src/sync/sync_config.hpp; sourceTree = ""; }; 02E315C31DB80DDD00555337 /* sync_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_manager.cpp; path = src/sync/sync_manager.cpp; sourceTree = ""; }; 02E315C41DB80DDD00555337 /* sync_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_manager.hpp; path = src/sync/sync_manager.hpp; sourceTree = ""; }; @@ -363,6 +367,7 @@ isa = PBXGroup; children = ( F6BCCFDF1C83809A00FE31AE /* lib */, + 02879D8B1DC29D5600777A5D /* package.json */, F62A35131C18E6E2004A917D /* iOS */, F6874A441CAD2ACD00EEEE36 /* JSC */, F62BF9001CAC72C40022BCDC /* Node */, @@ -391,6 +396,7 @@ 02B58CA71AE99CEB009B348C = { isa = PBXGroup; children = ( + 02E265681DC1896100BBDB04 /* request */, 02B58CCF1AE99D8C009B348C /* Frameworks */, F6C3FBB41BF680D000E6FFD4 /* Vendor */, 0270BC3D1B7CFBFD00010E03 /* RealmJS */, @@ -710,6 +716,7 @@ 02B58CB91AE99CEC009B348C /* Frameworks */, 02B58CBA1AE99CEC009B348C /* Resources */, F613787A1C18F003008BFC51 /* Copy Query Tests */, + 02879D8D1DC29F2000777A5D /* Install Node Modules */, ); buildRules = ( ); @@ -821,7 +828,9 @@ files = ( 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */, F6BCCFE21C8380A400FE31AE /* lib in Resources */, + 02879D8C1DC29D5600777A5D /* package.json in Resources */, 02414B881CE68CA200A8669F /* dates-v5.realm in Resources */, + 02E265691DC1896100BBDB04 /* request in Resources */, F61378791C18EAC5008BFC51 /* js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -829,6 +838,20 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 02879D8D1DC29F2000777A5D /* Install Node Modules */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Install Node Modules"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH\"\nyarn install "; + }; F613787A1C18F003008BFC51 /* Copy Query Tests */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 990b04d8..83f00903 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -74,9 +74,11 @@ public: {"createUser", wrap} }; + static void current_user(ContextType ctx, ObjectType object, ReturnValue &return_value); static void all_users(ContextType ctx, ObjectType object, ReturnValue &return_value); PropertyMap const static_properties = { + {"current", {wrap, nullptr}}, {"all", {wrap, nullptr}}, }; @@ -131,6 +133,15 @@ void UserClass::all_users(ContextType ctx, ObjectType object, ReturnValue &re return_value.set(Object::create_array(ctx, user_vector)); } +template +void UserClass::current_user(ContextType ctx, ObjectType object, ReturnValue &return_value) { + auto users = SyncManager::shared().all_users(); + if (users.size() != 1) { + throw std::runtime_error("No current user"); + } + return_value.set(create_object>(ctx, new SharedUser(users[0]))); +} + template void UserClass::logout(ContextType ctx, ObjectType object, size_t, const ValueType[], ReturnValue &) { get_internal>(object)->get()->log_out(); diff --git a/tests/ios/RJSModuleLoader.m b/tests/ios/RJSModuleLoader.m index 39cbb066..fa330947 100644 --- a/tests/ios/RJSModuleLoader.m +++ b/tests/ios/RJSModuleLoader.m @@ -75,6 +75,9 @@ static NSString * const RJSModuleLoaderErrorDomain = @"RJSModuleLoaderErrorDomai - (JSValue *)loadModuleFromURL:(NSURL *)url error:(NSError **)error { url = url.absoluteURL; url = url.standardizedURL ?: url; + if (url.pathExtension.length == 0) { + url = [url URLByAppendingPathExtension:@"js"]; + } NSString *path = url.path; JSValue *exports = self.modules[path]; @@ -156,7 +159,10 @@ static NSString * const RJSModuleLoaderErrorDomain = @"RJSModuleLoaderErrorDomai - (JSValue *)loadJSONFromURL:(NSURL *)url error:(NSError **)error { url = url.absoluteURL; url = url.standardizedURL ?: url; - + if (url.pathExtension.length == 0) { + url = [url URLByAppendingPathExtension:@"js"]; + } + NSString *path = url.path; JSValue *exports = self.modules[path]; if (exports) { From fde1c5d00d11cbd93ef0fcc41bfb1180ef6bc76a Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 8 Nov 2016 08:59:30 -0800 Subject: [PATCH 029/100] start implementing sync tests --- .gitignore | 1 + dependencies.list | 4 + lib/user-methods.js | 43 +- scripts/download-core.sh | 2 +- scripts/download-object-server.sh | 25 + tests/js/query-tests.json | 381 +++++++ tests/js/user-tests.js | 85 ++ tests/package.json | 12 +- tests/react-test-app/index.ios.js | 2 +- .../ios/ReactTests.xcodeproj/project.pbxproj | 107 +- tests/react-test-app/package.json | 6 +- tests/react-test-app/yarn.lock | 981 ++++++++++-------- tests/spec/unit_tests.js | 16 +- 13 files changed, 1217 insertions(+), 448 deletions(-) create mode 100644 dependencies.list create mode 100755 scripts/download-object-server.sh create mode 100644 tests/js/query-tests.json create mode 100644 tests/js/user-tests.js diff --git a/.gitignore b/.gitignore index c585b641..f7027826 100644 --- a/.gitignore +++ b/.gitignore @@ -99,6 +99,7 @@ build/ node_modules/ npm-debug.log /compiled/ +*.lock # Android/IJ /android/ diff --git a/dependencies.list b/dependencies.list new file mode 100644 index 00000000..a19e1436 --- /dev/null +++ b/dependencies.list @@ -0,0 +1,4 @@ +PACKAGE_NAME=realm-js +VERSION=1.0.0-BETA-1.0 +REALM_SYNC_VERSION=1.0.0-BETA-3.1 +REALM_OBJECT_SERVER_VERSION=1.0.0-BETA-2.1 diff --git a/lib/user-methods.js b/lib/user-methods.js index 01c4f7f7..0df502d8 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -1,5 +1,7 @@ 'use strict'; +const AuthError = require('./errors').AuthError; + function node_require(module) { return require(module); } @@ -18,7 +20,7 @@ if (typeof fetch != 'undefined') { } }) .then((body) => { - callback(undefined, {statusCode: 200}, body) + callback(undefined, {statusCode: 200}, JSON.parse(body)) }) .catch((error) => { callback(error); @@ -31,36 +33,40 @@ else { } } -const url = require("url"); +const url_parse = require("url-parse"); const postHeaders = { 'content-type': 'application/json;charset=utf-8', 'accept': 'application/json' }; +function auth_url(server) { + if (server.charAt(server.length-1) != '/') { + return server + '/auth'; + } + return server + 'auth'; +} + module.exports = function(realmConstructor) { function _authenticate(server, json, callback) { json.app_id = ''; var options = { - url: server + 'auth', + url: auth_url(server), body: JSON.stringify(json), headers: postHeaders }; post(options, function(error, response, body) { if (error) { - console.log(error); callback(error); } else if (response.statusCode != 200) { - console.log('Bad response: ' + response.statusCode); - callback(new Error('Bad response: ' + response.statusCode)); + console.log(response.statusCode); + callback(new AuthError('Bad response: ' + response.statusCode)); } else { - var rjson = JSON.parse(body); // TODO: validate JSON - - const token = rjson.refresh_token.token; - const identity = rjson.refresh_token.token_data.identity; + const token = body.refresh_token.token; + const identity = body.refresh_token.token_data.identity; callback(undefined, realmConstructor.Sync.User.createUser(server, identity, token, false)); } }); @@ -84,7 +90,7 @@ module.exports = function(realmConstructor) { }, callback); } - methods['registerExisting'] = function(server, username, password, callback) { + methods['login'] = function(server, username, password, callback) { _authenticate(server, { provider: 'password', user_info: { password: password }, @@ -101,10 +107,10 @@ module.exports = function(realmConstructor) { methods['_authenticateRealm'] = function(fileUrl, realmUrl, callback) { var options = { - url: this.server + 'auth', + url: auth_url(this.server), body: JSON.stringify({ data: this.token, - path: url.parse(realmUrl).path, + path: url_parse(realmUrl).pathname, provider: 'realm', app_id: '' }), @@ -112,21 +118,18 @@ module.exports = function(realmConstructor) { }; post(options, function(error, response, body) { if (error) { - console.log(error); callback(error); } else if (response.statusCode != 200) { - console.log('Bad response: ' + response.statusCode + body); - callback(new Error('Bad response: ' + response.statusCode)); + callback(new AuthError('Bad response: ' + response.statusCode)); } else { - var json = JSON.parse(body); // TODO: validate JSON callback(undefined, { - token: json.access_token.token, - file_url: url.parse(fileUrl).path, - resolved_realm_url: 'realm://' + url.parse(realmUrl).host + json.access_token.token_data.path + token: body.access_token.token, + file_url: url_parse(fileUrl).pathname, + resolved_realm_url: 'realm://' + url_parse(realmUrl).host + body.access_token.token_data.path }); } }); diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 1efe8ebf..aedfa411 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -26,12 +26,12 @@ if [ "$1" = 'node' ]; then else CORE_DIR='core' PLATFORM_TAG="" + CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" fi SYNC_DIR='sync' SYNC_PLATFORM_TAG="cocoa-" -CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" # Start current working directory at the root of the project. diff --git a/scripts/download-object-server.sh b/scripts/download-object-server.sh new file mode 100755 index 00000000..ddb98c1b --- /dev/null +++ b/scripts/download-object-server.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -eo pipefail + +[ "$(uname -s)" != "Darwin" ] && exit + +. dependencies.list + +if [ -f object-server-for-testing/node_modules/realm-object-server/CHANGELOG.md ]; then + current_version=$(head -n1 object-server-for-testing/node_modules/realm-object-server/CHANGELOG.md | cut -d" " -f2) + if [ "$REALM_OBJECT_SERVER_VERSION" = "$current_version" ]; then + echo -e "yes\n" | object-server-for-testing/reset-server-realms.command + exit + fi +fi + +object_server_bundle="realm-object-server-bundled_node_darwin-$REALM_OBJECT_SERVER_VERSION.tar.gz" +curl -f -L "https://static.realm.io/downloads/object-server/$object_server_bundle" -o "$object_server_bundle" +rm -rf object-server-for-testing +mkdir object-server-for-testing +tar -C object-server-for-testing -xf "$object_server_bundle" +rm "$object_server_bundle" + +echo -e "enterprise:\n skip_setup: true\n" >> "object-server-for-testing/object-server/configuration.yml" +touch "object-server-for-testing/object-server/do_not_open_browser" \ No newline at end of file diff --git a/tests/js/query-tests.json b/tests/js/query-tests.json new file mode 100644 index 00000000..6cbbee55 --- /dev/null +++ b/tests/js/query-tests.json @@ -0,0 +1,381 @@ +{ + +"dateTests" : { + "schema" : [{ + "name": "DateObject", + "properties": [{ "name": "date", "type": "date" }] + }], + "objects": [ + { "type": "DateObject", "value": [10000] }, + { "type": "DateObject", "value": [10001] }, + { "type": "DateObject", "value": [10002] } + ], + "tests": [ + ["QueryCount", 2, "DateObject", "date < $0", [2, "date"]], + ["QueryCount", 3, "DateObject", "date <= $0", [2, "date"]], + ["QueryCount", 2, "DateObject", "date > $0", [0, "date"]], + ["QueryCount", 3, "DateObject", "date >= $0", [0, "date"]], + ["QueryCount", 1, "DateObject", "date == $0", [0, "date"]], + ["QueryCount", 2, "DateObject", "date != $0", [0, "date"]], + + ["QueryThrows", "DateObject", "date == 'not a date'"], + ["QueryThrows", "DateObject", "date == 1"], + ["QueryThrows", "DateObject", "date == $0", 1] + ] +}, + +"boolTests" : { + "schema" : [{ + "name": "BoolObject", + "properties": [{ "name": "boolCol", "type": "bool" }] + }], + "objects": [ + { "type": "BoolObject", "value": [false] }, + { "type": "BoolObject", "value": [true] }, + { "type": "BoolObject", "value": [true] } + ], + "tests": [ + ["QueryCount", 2, "BoolObject", "boolCol == true"], + ["QueryCount", 1, "BoolObject", "boolCol==false"], + ["QueryCount", 1, "BoolObject", "boolCol != true"], + ["QueryCount", 2, "BoolObject", "true == boolCol"], + ["QueryCount", 2, "BoolObject", "boolCol == TRUE"], + ["QueryCount", 1, "BoolObject", "boolCol == FALSE"], + ["QueryCount", 2, "BoolObject", "boolCol == $0", true], + ["QueryCount", 1, "BoolObject", "boolCol == $0", false], + ["QueryCount", 0, "BoolObject", "boolCol == true && boolCol == false"], + ["QueryCount", 3, "BoolObject", "boolCol == true || boolCol == false"], + + ["QueryThrows", "BoolObject", "boolCol == 0"], + ["QueryThrows", "BoolObject", "boolCol == 1"], + ["QueryThrows", "BoolObject", "boolCol == 'not a bool'"], + ["QueryThrows", "BoolObject", "boolCol == $0", "not a bool"], + ["QueryThrows", "BoolObject", "boolCol > true"], + ["QueryThrows", "BoolObject", "boolCol >= true"], + ["QueryThrows", "BoolObject", "boolCol < true"], + ["QueryThrows", "BoolObject", "boolCol <= true"], + ["QueryThrows", "BoolObject", "boolCol BEGINSWITH true"], + ["QueryThrows", "BoolObject", "boolCol CONTAINS true"], + ["QueryThrows", "BoolObject", "boolCol ENDSWITH true"] + ] +}, + +"intTests" : { + "schema" : [{ + "name": "IntObject", + "properties": [{ "name": "intCol", "type": "int" }] + }], + "objects": [ + { "type": "IntObject", "value": [-1] }, + { "type": "IntObject", "value": [0] }, + { "type": "IntObject", "value": [100] } + ], + "tests": [ + ["QueryCount", 1, "IntObject", "intCol == -1"], + ["QueryCount", 1, "IntObject", "intCol==0"], + ["QueryCount", 0, "IntObject", "1 == intCol"], + ["QueryCount", 2, "IntObject", "intCol != 0"], + ["QueryCount", 2, "IntObject", "intCol > -1"], + ["QueryCount", 3, "IntObject", "intCol >= -1"], + ["QueryCount", 2, "IntObject", "intCol < 100"], + ["QueryCount", 3, "IntObject", "intCol <= 100"], + ["QueryCount", 1, "IntObject", "intCol > 0x1F"], + ["QueryCount", 1, "IntObject", "intCol == $0", 100], + + ["QueryThrows", "IntObject", "intCol == 'not an int'"], + ["QueryThrows", "IntObject", "intCol == true"], + ["QueryThrows", "IntObject", "intCol == $0", "not an int"], + ["QueryThrows", "IntObject", "intCol BEGINSWITH 1"], + ["QueryThrows", "IntObject", "intCol CONTAINS 1"], + ["QueryThrows", "IntObject", "intCol ENDSWITH 1"] + ] +}, + +"floatTests" : { + "schema" : [{ + "name": "FloatObject", + "properties": [{ "name": "floatCol", "type": "float" }] + }], + "objects": [ + { "type": "FloatObject", "value": [-1.001] }, + { "type": "FloatObject", "value": [0.0] }, + { "type": "FloatObject", "value": [100.2] } + ], + "tests": [ + ["QueryCount", 1, "FloatObject", "floatCol == -1.001"], + ["QueryCount", 1, "FloatObject", "floatCol = 0"], + ["QueryCount", 0, "FloatObject", "1 == floatCol"], + ["QueryCount", 2, "FloatObject", "floatCol != 0"], + ["QueryCount", 2, "FloatObject", "floatCol > -1.001"], + ["QueryCount", 3, "FloatObject", "floatCol >= -1.001"], + ["QueryCount", 2, "FloatObject", "floatCol < 100.2"], + ["QueryCount", 3, "FloatObject", "floatCol <= 100.2"], + ["QueryCount", 1, "FloatObject", "floatCol > 0x1F"], + ["QueryCount", 1, "FloatObject", "floatCol == $0", 100.2], + + ["QueryThrows", "FloatObject", "floatCol == 'not a float'"], + ["QueryThrows", "FloatObject", "floatCol == true"], + ["QueryThrows", "FloatObject", "floatCol == $0", "not a float"], + ["QueryThrows", "FloatObject", "floatCol BEGINSWITH 1"], + ["QueryThrows", "FloatObject", "floatCol CONTAINS 1"], + ["QueryThrows", "FloatObject", "floatCol ENDSWITH 1"], + + ["Disabled", "QueryThrows", "FloatObject", "floatCol = 3.5e+38"], + ["Disabled", "QueryThrows", "FloatObject", "floatCol = -3.5e+38"] + ] +}, + +"doubleTests" : { + "schema" : [{ + "name": "DoubleObject", + "properties": [{ "name": "doubleCol", "type": "double" }] + }], + "objects": [ + { "type": "DoubleObject", "value": [-1.001] }, + { "type": "DoubleObject", "value": [0.0] }, + { "type": "DoubleObject", "value": [100.2] } + ], + "tests": [ + ["QueryCount", 1, "DoubleObject", "doubleCol == -1.001"], + ["QueryCount", 1, "DoubleObject", "doubleCol == 0"], + ["QueryCount", 0, "DoubleObject", "1 == doubleCol"], + ["QueryCount", 2, "DoubleObject", "doubleCol != 0"], + ["QueryCount", 2, "DoubleObject", "doubleCol > -1.001"], + ["QueryCount", 3, "DoubleObject", "doubleCol >= -1.001"], + ["QueryCount", 2, "DoubleObject", "doubleCol < 100.2"], + ["QueryCount", 3, "DoubleObject", "doubleCol <= 100.2"], + ["QueryCount", 1, "DoubleObject", "doubleCol > 0x1F"], + ["QueryCount", 1, "DoubleObject", "doubleCol == $0", 100.2], + + ["QueryThrows", "DoubleObject", "doubleCol == 'not a double'"], + ["QueryThrows", "DoubleObject", "doubleCol == true"], + ["QueryThrows", "DoubleObject", "doubleCol == $0", "not a double"], + ["QueryThrows", "DoubleObject", "doubleCol BEGINSWITH 1"], + ["QueryThrows", "DoubleObject", "doubleCol CONTAINS 1"], + ["QueryThrows", "DoubleObject", "doubleCol ENDSWITH 1"] + ] +}, + +"stringTests" : { + "schema" : [{ + "name": "StringObject", + "properties": [{ "name": "stringCol", "type": "string" }] + }], + "objects": [ + { "type": "StringObject", "value": ["A"] }, + { "type": "StringObject", "value": ["a"] }, + { "type": "StringObject", "value": ["a"] }, + { "type": "StringObject", "value": ["C"] }, + { "type": "StringObject", "value": ["c"] }, + { "type": "StringObject", "value": ["abc"] }, + { "type": "StringObject", "value": ["ABC"] }, + { "type": "StringObject", "value": [""] }, + { "type": "StringObject", "value": ["\\\"\\n\\0\\r\\\\'"] } + ], + "tests": [ + ["QueryCount", 2, "StringObject", "stringCol == 'a'"], + ["QueryCount", 1, "StringObject", "'c' == stringCol"], + ["QueryCount", 2, "StringObject", "stringCol == \"a\""], + ["QueryCount", 1, "StringObject", "stringCol=='abc'"], + ["QueryCount", 1, "StringObject", "stringCol == ''"], + ["QueryCount", 8, "StringObject", "stringCol != ''"], + ["QueryCount", 1, "StringObject", "stringCol == \"\\\"\\n\\0\\r\\\\'\""], + ["QueryCount", 3, "StringObject", "stringCol BEGINSWITH 'a'"], + ["QueryCount", 1, "StringObject", "stringCol beginswith 'ab'"], + ["QueryCount", 0, "StringObject", "stringCol BEGINSWITH 'abcd'"], + ["QueryCount", 2, "StringObject", "stringCol BEGINSWITH 'A'"], + ["QueryCount", 2, "StringObject", "stringCol ENDSWITH 'c'"], + ["QueryCount", 1, "StringObject", "stringCol endswith 'bc'"], + ["QueryCount", 9, "StringObject", "stringCol ENDSWITH ''"], + ["QueryCount", 1, "StringObject", "stringCol CONTAINS 'b'"], + ["QueryCount", 2, "StringObject", "stringCol contains 'c'"], + ["QueryCount", 9, "StringObject", "stringCol CONTAINS ''"], + ["QueryCount", 2, "StringObject", "stringCol == $0", "a"], + ["QueryCount", 2, "StringObject", "stringCol ENDSWITH $0", "c"], + + ["QueryThrows", "StringObject", "stringCol == true"], + ["QueryThrows", "StringObject", "stringCol == 123"], + ["QueryThrows", "StringObject", "stringCol CONTAINS $0", 1], + + ["QueryCount", 3, "StringObject", "stringCol ==[c] 'a'"], + ["QueryCount", 5, "StringObject", "stringCol BEGINSWITH[c] 'A'"], + ["QueryCount", 4, "StringObject", "stringCol ENDSWITH[c] 'c'"], + ["QueryCount", 2, "StringObject", "stringCol CONTAINS[c] 'B'"] + ] +}, + +"binaryTests" : { + "schema" : [{ + "name": "BinaryObject", + "properties": [{ "name": "binaryCol", "type": "data" }] + }], + "objects": [ + { "type": "BinaryObject", "value": [[1, 100, 233, 255, 0]] }, + { "type": "BinaryObject", "value": [[1, 100]] }, + { "type": "BinaryObject", "value": [[100]] }, + { "type": "BinaryObject", "value": [[]] }, + { "type": "BinaryObject", "value": [[255, 0]] } + ], + "tests": [ + ["QueryCount", 1, "BinaryObject", "binaryCol == $0", [1, "binaryCol"]], + ["QueryCount", 1, "BinaryObject", "$0 == binaryCol", [2, "binaryCol"]], + ["QueryCount", 4, "BinaryObject", "binaryCol != $0", [0, "binaryCol"]], + ["QueryCount", 1, "BinaryObject", "binaryCol BEGINSWITH $0", [0, "binaryCol"]], + ["QueryCount", 2, "BinaryObject", "binaryCol BEGINSWITH $0", [1, "binaryCol"]], + ["QueryCount", 2, "BinaryObject", "binaryCol ENDSWITH $0", [4, "binaryCol"]], + ["QueryCount", 3, "BinaryObject", "binaryCol CONTAINS $0", [2, "binaryCol"]] + ] +}, + +"objectTests" : { + "schema" : [ + { "name": "IntObject", "properties": [ + { "name": "intCol", "type": "int" } + ]}, + { "name": "LinkObject", "properties": [ + { "name": "linkCol", "type": "object", "objectType": "IntObject" } + ]} + ], + "objects": [ + { "type": "LinkObject", "value": [[1]] }, + { "type": "LinkObject", "value": [[2]] }, + { "type": "LinkObject", "value": [null] } + ], + "tests": [ + ["QueryCount", 1, "LinkObject", "linkCol == $0", [0, "linkCol"]], + ["QueryCount", 1, "LinkObject", "$0 == linkCol", [1, "linkCol"]], + ["QueryCount", 2, "LinkObject", "linkCol != $0", [0, "linkCol"]], + ["QueryCount", 1, "LinkObject", "linkCol = null"], + ["QueryCount", 2, "LinkObject", "linkCol != NULL"], + ["QueryCount", 1, "LinkObject", "linkCol = $0", null], + + ["QueryThrows", "LinkObject", "linkCol > $0", [0, "linkCol"]], + ["QueryThrows", "LinkObject", "intCol = $0", [0, "linkCol"]] + ] +}, + +"compoundTests" : { + "schema" : [ + { "name": "IntObject", + "properties": [{ "name": "intCol", "type": "int" }], + "primaryKey" : "intCol" } + ], + "objects": [ + { "type": "IntObject", "value": [0] }, + { "type": "IntObject", "value": [1] }, + { "type": "IntObject", "value": [2] }, + { "type": "IntObject", "value": [3] } + ], + "tests": [ + ["ObjectSet", [], "IntObject", "intCol == 0 && intCol == 1"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 0 || intCol == 1"], + ["ObjectSet", [0], "IntObject", "intCol == 0 && intCol != 1"], + ["ObjectSet", [2, 3], "IntObject", "intCol >= 2 && intCol < 4"], + ["ObjectSet", [0], "IntObject", "intCol == 0 && NOT intCol != 0"], + ["ObjectSet", [0, 3], "IntObject", "intCol == 0 || NOT (intCol == 1 || intCol == 2)"], + ["ObjectSet", [1], "IntObject", "(intCol == 0 || intCol == 1) && intCol >= 1"], + ["ObjectSet", [1], "IntObject", "intCol >= 1 && (intCol == 0 || intCol == 1)"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 0 || (intCol == 1 && intCol >= 1)"], + ["ObjectSet", [0, 1], "IntObject", "(intCol == 1 && intCol >= 1) || intCol == 0"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 0 || intCol == 1 && intCol >= 1"], + ["ObjectSet", [0, 1, 2],"IntObject", "intCol == 0 || intCol == 1 || intCol <= 2"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 1 && intCol >= 1 || intCol == 0"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 1 || intCol == 0 && intCol <= 0 && intCol >= 0"], + ["ObjectSet", [0, 1], "IntObject", "intCol == 0 || NOT (intCol == 3 && intCol >= 0) && intCol == 1"] + ] +}, + +"keyPathTests" : { + "schema" : [ + { + "name": "BasicTypesObject", + "properties": [ + { "name": "intCol", "type": "int" }, + { "name": "floatCol", "type": "float" }, + { "name": "doubleCol", "type": "double" }, + { "name": "stringCol", "type": "string" }, + { "name": "dateCol", "type": "date" }, + { "name": "dataCol", "type": "data" } + ] + }, + { + "name": "LinkTypesObject", + "primaryKey": "primaryKey", + "properties": [ + { "name": "primaryKey", "type": "int" }, + { "name": "basicLink", "type": "object", "objectType": "BasicTypesObject" }, + { "name": "linkLink", "type": "object", "objectType": "LinkTypesObject" } + ] + }], + "objects": [ + { "type": "LinkTypesObject", "value": [0, [1, 0.1, 0.001, "1", 1, [1, 10, 100]], null] }, + { "type": "LinkTypesObject", "value": [1, null, [2, [1, 0.1, 0.001, "1", 1, [1, 10, 100]], null]] }, + { "type": "LinkTypesObject", "value": [3, null, [4, [2, 0.2, 0.002, "2", 2, [2, 20, 200]], null]] } + ], + "tests": [ + ["ObjectSet", [0, 2], "LinkTypesObject", "basicLink.intCol == 1"], + ["ObjectSet", [1], "LinkTypesObject", "linkLink.basicLink.intCol == 1"], + ["ObjectSet", [1, 3], "LinkTypesObject", "linkLink.basicLink.intCol > 0"], + ["ObjectSet", [0, 2], "LinkTypesObject", "basicLink.floatCol == 0.1"], + ["ObjectSet", [1], "LinkTypesObject", "linkLink.basicLink.floatCol == 0.1"], + ["ObjectSet", [1, 3], "LinkTypesObject", "linkLink.basicLink.floatCol > 0"] + ] +}, + +"optionalTests" : { + "schema" : [ + { + "name": "OptionalTypesObject", + "primaryKey": "primaryKey", + "properties": [ + { "name": "primaryKey", "type": "int" }, + { "name": "intCol", "type": "int", "optional": true }, + { "name": "floatCol", "type": "float", "optional": true }, + { "name": "doubleCol", "type": "double", "optional": true }, + { "name": "stringCol", "type": "string", "optional": true }, + { "name": "dateCol", "type": "date", "optional": true }, + { "name": "dataCol", "type": "data", "optional": true } + ] + }, + { + "name": "LinkTypesObject", + "primaryKey": "primaryKey", + "properties": [ + { "name": "primaryKey", "type": "int" }, + { "name": "basicLink", "type": "object", "objectType": "OptionalTypesObject" } + ] + }], + "objects": [ + { "type": "LinkTypesObject", "value": [0, [0, 1, 0.1, 0.001, "1", 1, [1, 10, 100]]] }, + { "type": "LinkTypesObject", "value": [1, [1, null, null, null, null, null, null]] } + ], + "tests": [ + ["ObjectSet", [1], "OptionalTypesObject", "intCol == null"], + ["ObjectSet", [1], "OptionalTypesObject", "null == intCol"], + ["ObjectSet", [0], "OptionalTypesObject", "intCol != null"], + ["ObjectSet", [1], "OptionalTypesObject", "floatCol == null"], + ["ObjectSet", [0], "OptionalTypesObject", "floatCol != null"], + ["ObjectSet", [1], "OptionalTypesObject", "doubleCol == null"], + ["ObjectSet", [0], "OptionalTypesObject", "doubleCol != null"], + ["ObjectSet", [1], "OptionalTypesObject", "stringCol == null"], + ["ObjectSet", [0], "OptionalTypesObject", "stringCol != null"], + ["ObjectSet", [1], "OptionalTypesObject", "dateCol == null"], + ["ObjectSet", [0], "OptionalTypesObject", "dateCol != null"], + ["ObjectSet", [1], "OptionalTypesObject", "dataCol == null"], + ["ObjectSet", [0], "OptionalTypesObject", "dataCol != null"], + + ["ObjectSet", [1], "LinkTypesObject", "basicLink.intCol == null"], + ["ObjectSet", [0], "LinkTypesObject", "basicLink.intCol != null"], + ["ObjectSet", [1], "LinkTypesObject", "basicLink.floatCol == null"], + ["ObjectSet", [0], "LinkTypesObject", "basicLink.floatCol != null"], + ["ObjectSet", [1], "LinkTypesObject", "basicLink.doubleCol == null"], + ["ObjectSet", [0], "LinkTypesObject", "basicLink.doubleCol != null"], + ["ObjectSet", [1], "LinkTypesObject", "basicLink.stringCol == null"], + ["ObjectSet", [0], "LinkTypesObject", "basicLink.stringCol != null"], + ["ObjectSet", [1], "LinkTypesObject", "basicLink.dateCol == null"], + ["ObjectSet", [0], "LinkTypesObject", "basicLink.dateCol != null"], + ["QueryThrows", "LinkTypesObject", "basicLink.dataCol == null"] + ] +} + +} diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js new file mode 100644 index 00000000..384c6be7 --- /dev/null +++ b/tests/js/user-tests.js @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +/* eslint-env es6, node */ + +'use strict'; + +const Realm = require('realm'); +const TestCase = require('./asserts'); +const schemas = require('./schemas'); + +function uuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); +} + +module.exports = { + testRegisterUser() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + TestCase.assertEqual(typeof user, 'object'); + TestCase.assertEqual(typeof user.token, 'string'); + TestCase.assertEqual(typeof user.identity, 'string'); + TestCase.assertEqual(user.isAdmin, false); + + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertNotEqual(realm instanceof Realm); + resolve(); + }); + }); + }, + + testRegisterExistingUser() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + TestCase.assertEqual(typeof user, 'object'); + + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + TestCase.assertTrue(error instanceof Realm.Sync.AuthError); + TestCase.assertEqual(error.code, 613); + TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/existing-account'); + TestCase.assertEqual(user, undefined); + resolve(); + }); + }); + }); + }, + + testRegisterInvalidUsername() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { + TestCase.assertEqual(typeof user, 'object'); + + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + TestCase.assertTrue(error instanceof Realm.Sync.AuthError); + TestCase.assertEqual(error.code, 602); + TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertEqual(user, undefined); + resolve(); + }); + }); + }); + }, +}; + diff --git a/tests/package.json b/tests/package.json index 682f5733..4dea192f 100644 --- a/tests/package.json +++ b/tests/package.json @@ -6,11 +6,15 @@ "es6-promise": "^3.2.1", "jasmine": "^2.5.1", "jasmine-console-reporter": "^1.2.7", - "jasmine-reporters": "^2.2.0" + "jasmine-reporters": "^2.2.0", + "needle": "^1.3.0", + "terminate": "^1.0.8", + "tmp": "^0.0.30", + "url-parse": "^1.1.7" }, "scripts": { - "test": "jasmine spec/unit_tests.js", - "test-sync": "jasmine spec/sync_integration_tests.js", - "postinstall": "rm -f node_modules/realm && ln -s ../.. node_modules/realm" + "test": "jasmine spec/unit_tests.js", + "test-sync": "jasmine spec/sync_integration_tests.js", + "postinstall": "rm -f node_modules/realm && ln -s ../.. node_modules/realm" } } diff --git a/tests/react-test-app/index.ios.js b/tests/react-test-app/index.ios.js index 8f3b7c67..eac96ec5 100644 --- a/tests/react-test-app/index.ios.js +++ b/tests/react-test-app/index.ios.js @@ -32,7 +32,7 @@ const Realm = require('realm'); Realm.Sync.setLogLevel('error'); var realm; -Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { +Realm.Sync.User.register('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { console.log(user); realm = new Realm({ diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index ef9dd461..28412ea9 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -80,6 +80,55 @@ remoteGlobalIDString = F60690121CA2766F0003FB26; remoteInfo = RealmReact; }; + 02CBBBEF1DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 02CBBBF31DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 02CBBBF71DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 02CBBBFB1DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 02CBBBFF1DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 02CBBC041DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 02CBBC081DC2B3C00057A570 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; @@ -217,6 +266,7 @@ isa = PBXGroup; children = ( 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 02CBBBF01DC2B3C00057A570 /* libRCTImage-tvOS.a */, ); name = Products; sourceTree = ""; @@ -225,6 +275,7 @@ isa = PBXGroup; children = ( 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 02CBBBF81DC2B3C00057A570 /* libRCTNetwork-tvOS.a */, ); name = Products; sourceTree = ""; @@ -251,6 +302,7 @@ isa = PBXGroup; children = ( 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 02CBBBFC1DC2B3C00057A570 /* libRCTSettings-tvOS.a */, ); name = Products; sourceTree = ""; @@ -259,6 +311,7 @@ isa = PBXGroup; children = ( 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 02CBBC051DC2B3C00057A570 /* libRCTWebSocket-tvOS.a */, ); name = Products; sourceTree = ""; @@ -280,6 +333,7 @@ isa = PBXGroup; children = ( 146834041AC3E56700842450 /* libReact.a */, + 02CBBC091DC2B3C00057A570 /* libReact-tvOS.a */, ); name = Products; sourceTree = ""; @@ -288,6 +342,7 @@ isa = PBXGroup; children = ( 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 02CBBBF41DC2B3C00057A570 /* libRCTLinking-tvOS.a */, ); name = Products; sourceTree = ""; @@ -316,6 +371,7 @@ isa = PBXGroup; children = ( 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 02CBBC001DC2B3C00057A570 /* libRCTText-tvOS.a */, ); name = Products; sourceTree = ""; @@ -508,6 +564,55 @@ remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 02CBBBF01DC2B3C00057A570 /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 02CBBBEF1DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBBF41DC2B3C00057A570 /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 02CBBBF31DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBBF81DC2B3C00057A570 /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 02CBBBF71DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBBFC1DC2B3C00057A570 /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 02CBBBFB1DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBC001DC2B3C00057A570 /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 02CBBBFF1DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBC051DC2B3C00057A570 /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 02CBBC041DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02CBBC091DC2B3C00057A570 /* libReact-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libReact-tvOS.a"; + remoteRef = 02CBBC081DC2B3C00057A570 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -586,7 +691,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\" \nif [ -z \"$TEST_SCRIPT\" ]; then\n #npm install realm realm-tests\n echo a\nfi\ncp \"${SRCROOT}/../../../src/object-store/tests/query.json\" \"${SRCROOT}/../node_modules/realm-tests/query-tests.json\"\n"; + shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\"\n #cp \"${SRCROOT}/../../../src/object-store/tests/query.json\" \"${SRCROOT}/../node_modules/realm-tests/query-tests.json\"\n"; }; F6EDE5BF1C49007200B1085F /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; diff --git a/tests/react-test-app/package.json b/tests/react-test-app/package.json index 4319ee6d..e8a27fbd 100644 --- a/tests/react-test-app/package.json +++ b/tests/react-test-app/package.json @@ -6,11 +6,13 @@ "start": "react-native start" }, "dependencies": { + "needle": "^1.3.0", "react": "~15.3.1", - "react-native": "^0.34.0", + "react-native": "^0.36.0", "react-native-fs": "^1.1.0", - "realm": "file:../..", + "realm": "^0.14.3", "realm-tests": "file:../js", + "url-parse": "^1.1.6", "xmlbuilder": "^4.2.1" } } diff --git a/tests/react-test-app/yarn.lock b/tests/react-test-app/yarn.lock index 2b0da9ef..6c0cb9a9 100644 --- a/tests/react-test-app/yarn.lock +++ b/tests/react-test-app/yarn.lock @@ -22,9 +22,9 @@ accepts@~1.3.0: mime-types "~2.1.11" negotiator "0.6.1" -acorn@^1.0.3: - version "1.2.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" +acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -89,6 +89,13 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-index@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -145,18 +152,16 @@ async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +async@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" + dependencies: + lodash "^4.14.0" + async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" -async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - -async@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -177,120 +182,118 @@ babel-code-frame@^6.16.0: esutils "^2.0.2" js-tokens "^2.0.0" -babel-core@^6.10.4, babel-core@^6.16.0, babel-core@^6.7.2: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" +babel-core@^6.10.4, babel-core@^6.18.0, babel-core@^6.7.2: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.0.tgz#bb5ce9bc0a956e6e94e2f12d597abb3b0b330deb" dependencies: babel-code-frame "^6.16.0" - babel-generator "^6.17.0" + babel-generator "^6.18.0" babel-helpers "^6.16.0" babel-messages "^6.8.0" - babel-register "^6.16.0" + babel-register "^6.18.0" babel-runtime "^6.9.1" babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" babylon "^6.11.0" convert-source-map "^1.1.0" debug "^2.1.1" - json5 "^0.4.0" + json5 "^0.5.0" lodash "^4.2.0" minimatch "^3.0.2" - path-exists "^1.0.0" path-is-absolute "^1.0.0" private "^0.1.6" - shebang-regex "^1.0.0" slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" +babel-generator@^6.14.0, babel-generator@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" dependencies: babel-messages "^6.8.0" babel-runtime "^6.9.0" - babel-types "^6.16.0" - detect-indent "^3.0.1" + babel-types "^6.18.0" + detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" source-map "^0.5.0" babel-helper-builder-react-jsx@^6.8.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.9.0.tgz#a633978d669c4c9dcad716cc577ee3e0bb8ae723" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz#ab02f19a2eb7ace936dd87fa55896d02be59bf71" dependencies: babel-runtime "^6.9.0" - babel-types "^6.9.0" + babel-types "^6.18.0" esutils "^2.0.0" lodash "^4.2.0" -babel-helper-call-delegate@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.8.0.tgz#9d283e7486779b6b0481864a11b371ea5c01fa64" +babel-helper-call-delegate@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" dependencies: - babel-helper-hoist-variables "^6.8.0" + babel-helper-hoist-variables "^6.18.0" babel-runtime "^6.0.0" - babel-traverse "^6.8.0" - babel-types "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" -babel-helper-define-map@^6.8.0, babel-helper-define-map@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.9.0.tgz#6629f9b2a7e58e18e8379a57d1e6fbb2969902fb" +babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" dependencies: - babel-helper-function-name "^6.8.0" + babel-helper-function-name "^6.18.0" babel-runtime "^6.9.0" - babel-types "^6.9.0" + babel-types "^6.18.0" lodash "^4.2.0" -babel-helper-function-name@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.8.0.tgz#a0336ba14526a075cdf502fc52d3fe84b12f7a34" +babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" dependencies: - babel-helper-get-function-arity "^6.8.0" + babel-helper-get-function-arity "^6.18.0" babel-runtime "^6.0.0" babel-template "^6.8.0" - babel-traverse "^6.8.0" - babel-types "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" -babel-helper-get-function-arity@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.8.0.tgz#88276c24bd251cdf6f61b6f89f745f486ced92af" +babel-helper-get-function-arity@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" dependencies: babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-types "^6.18.0" -babel-helper-hoist-variables@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz#8b0766dc026ea9ea423bc2b34e665a4da7373aaf" +babel-helper-hoist-variables@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" dependencies: babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-types "^6.18.0" -babel-helper-optimise-call-expression@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.8.0.tgz#4175628e9c89fc36174904f27070f29d38567f06" +babel-helper-optimise-call-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" dependencies: babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-types "^6.18.0" babel-helper-regex@^6.8.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.9.0.tgz#c74265fde180ff9a16735fee05e63cadb9e0b057" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" dependencies: babel-runtime "^6.9.0" - babel-types "^6.9.0" + babel-types "^6.18.0" lodash "^4.2.0" -babel-helper-replace-supers@^6.14.0, babel-helper-replace-supers@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.16.0.tgz#21c97623cc7e430855753f252740122626a39e6b" +babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" dependencies: - babel-helper-optimise-call-expression "^6.8.0" + babel-helper-optimise-call-expression "^6.18.0" babel-messages "^6.8.0" babel-runtime "^6.0.0" babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" babel-helpers@^6.16.0: version "6.16.0" @@ -312,8 +315,8 @@ babel-plugin-check-es2015-constants@^6.5.0, babel-plugin-check-es2015-constants@ babel-runtime "^6.0.0" babel-plugin-external-helpers@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.8.0.tgz#febfe50cec910b6dfcbc6caaabddd99f72b12697" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.18.0.tgz#c6bbf87a4448eb49616f24a8b8088503863488da" dependencies: babel-runtime "^6.0.0" @@ -331,13 +334,13 @@ babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-propertie version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" -babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.13.0.tgz#9af0cd396087bf7677053e1afa52f206c0416f17" +babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.13.0.tgz#e741ff3992c578310be45c571bcd90a2f9c5586e" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" babel-plugin-syntax-object-rest-spread@^6.5.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" @@ -348,10 +351,10 @@ babel-plugin-syntax-trailing-function-commas@^6.5.0, babel-plugin-syntax-trailin resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" babel-plugin-transform-class-properties@^6.5.0, babel-plugin-transform-class-properties@^6.6.0, babel-plugin-transform-class-properties@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.16.0.tgz#969bca24d34e401d214f36b8af5c1346859bc904" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.18.0.tgz#bc1266a39d4c8726e0bd7b15c56235177e6ede57" dependencies: - babel-helper-function-name "^6.8.0" + babel-helper-function-name "^6.18.0" babel-plugin-syntax-class-properties "^6.8.0" babel-runtime "^6.9.1" @@ -368,28 +371,28 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.6.5, babel-plugin-transf babel-runtime "^6.0.0" babel-plugin-transform-es2015-block-scoping@^6.5.0, babel-plugin-transform-es2015-block-scoping@^6.7.1, babel-plugin-transform-es2015-block-scoping@^6.8.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.15.0.tgz#5b443ca142be8d1db6a8c2ae42f51958b66b70f6" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" dependencies: babel-runtime "^6.9.0" babel-template "^6.15.0" - babel-traverse "^6.15.0" - babel-types "^6.15.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" lodash "^4.2.0" babel-plugin-transform-es2015-classes@^6.5.0, babel-plugin-transform-es2015-classes@^6.6.5, babel-plugin-transform-es2015-classes@^6.8.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.14.0.tgz#87d5149ee91fb475922409f9af5b2ba5d1e39287" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" dependencies: - babel-helper-define-map "^6.9.0" - babel-helper-function-name "^6.8.0" - babel-helper-optimise-call-expression "^6.8.0" - babel-helper-replace-supers "^6.14.0" + babel-helper-define-map "^6.18.0" + babel-helper-function-name "^6.18.0" + babel-helper-optimise-call-expression "^6.18.0" + babel-helper-replace-supers "^6.18.0" babel-messages "^6.8.0" babel-runtime "^6.9.0" babel-template "^6.14.0" - babel-traverse "^6.14.0" - babel-types "^6.14.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform-es2015-computed-properties@^6.6.5, babel-plugin-transform-es2015-computed-properties@^6.8.0: version "6.8.0" @@ -400,14 +403,14 @@ babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform babel-template "^6.8.0" babel-plugin-transform-es2015-destructuring@^6.5.0, babel-plugin-transform-es2015-destructuring@^6.6.5, babel-plugin-transform-es2015-destructuring@^6.8.0, babel-plugin-transform-es2015-destructuring@6.x: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.16.0.tgz#050fe0866f5d53b36062ee10cdf5bfe64f929627" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" dependencies: babel-runtime "^6.9.0" babel-plugin-transform-es2015-for-of@^6.5.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.8.0.tgz#82eda139ba4270dda135c3ec1b1f2813fa62f23c" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" dependencies: babel-runtime "^6.0.0" @@ -426,13 +429,13 @@ babel-plugin-transform-es2015-literals@^6.5.0, babel-plugin-transform-es2015-lit babel-runtime "^6.0.0" babel-plugin-transform-es2015-modules-commonjs@^6.5.0, babel-plugin-transform-es2015-modules-commonjs@^6.7.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0, babel-plugin-transform-es2015-modules-commonjs@6.x: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.16.0.tgz#0a34b447bc88ad1a70988b6d199cca6d0b96c892" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" dependencies: - babel-plugin-transform-strict-mode "^6.8.0" + babel-plugin-transform-strict-mode "^6.18.0" babel-runtime "^6.0.0" babel-template "^6.16.0" - babel-types "^6.16.0" + babel-types "^6.18.0" babel-plugin-transform-es2015-object-super@^6.6.5, babel-plugin-transform-es2015-object-super@^6.8.0: version "6.8.0" @@ -442,22 +445,22 @@ babel-plugin-transform-es2015-object-super@^6.6.5, babel-plugin-transform-es2015 babel-runtime "^6.0.0" babel-plugin-transform-es2015-parameters@^6.5.0, babel-plugin-transform-es2015-parameters@^6.7.0, babel-plugin-transform-es2015-parameters@^6.8.0, babel-plugin-transform-es2015-parameters@6.x: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.17.0.tgz#e06d30cef897f46adb4734707bbe128a0d427d58" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" dependencies: - babel-helper-call-delegate "^6.8.0" - babel-helper-get-function-arity "^6.8.0" + babel-helper-call-delegate "^6.18.0" + babel-helper-get-function-arity "^6.18.0" babel-runtime "^6.9.0" babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" babel-plugin-transform-es2015-shorthand-properties@^6.5.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0, babel-plugin-transform-es2015-shorthand-properties@6.x: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.8.0.tgz#f0a4c5fd471630acf333c2d99c3d677bf0952149" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" dependencies: babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-types "^6.18.0" babel-plugin-transform-es2015-spread@^6.5.0, babel-plugin-transform-es2015-spread@^6.6.5, babel-plugin-transform-es2015-spread@^6.8.0, babel-plugin-transform-es2015-spread@6.x: version "6.8.0" @@ -500,10 +503,10 @@ babel-plugin-transform-es3-property-literals@^6.5.0, babel-plugin-transform-es3- babel-runtime "^6.0.0" babel-plugin-transform-flow-strip-types@^6.5.0, babel-plugin-transform-flow-strip-types@^6.6.5, babel-plugin-transform-flow-strip-types@^6.7.0, babel-plugin-transform-flow-strip-types@^6.8.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.14.0.tgz#35ceb03f8770934044bab1a76f7e4ee0aa9220f9" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" dependencies: - babel-plugin-syntax-flow "^6.8.0" + babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.0.0" babel-plugin-transform-object-assign@^6.5.0: @@ -548,12 +551,12 @@ babel-plugin-transform-regenerator@^6.5.0: babel-types "^6.16.0" private "~0.1.5" -babel-plugin-transform-strict-mode@^6.8.0: - version "6.11.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.11.3.tgz#183741325126bc7ec9cf4c0fc257d3e7ca5afd40" +babel-plugin-transform-strict-mode@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" dependencies: babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-types "^6.18.0" babel-polyfill@^6.9.1: version "6.16.0" @@ -673,22 +676,21 @@ babel-preset-react-native@^1.9.0: babel-plugin-transform-regenerator "^6.5.0" react-transform-hmr "^1.0.4" -babel-register@^6.16.0, babel-register@^6.6.0: - version "6.16.3" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" +babel-register@^6.18.0, babel-register@^6.6.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" dependencies: - babel-core "^6.16.0" + babel-core "^6.18.0" babel-runtime "^6.11.6" core-js "^2.4.0" - home-or-tmp "^1.0.0" + home-or-tmp "^2.0.0" lodash "^4.2.0" mkdirp "^0.5.1" - path-exists "^1.0.0" source-map-support "^0.4.2" babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.11.6" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" dependencies: core-js "^2.4.0" regenerator-runtime "^0.9.5" @@ -703,23 +705,23 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.14.0, babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" +babel-traverse@^6.16.0, babel-traverse@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" dependencies: babel-code-frame "^6.16.0" babel-messages "^6.8.0" babel-runtime "^6.9.0" - babel-types "^6.16.0" + babel-types "^6.18.0" babylon "^6.11.0" debug "^2.2.0" - globals "^8.3.0" + globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.6.4, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.6.4, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" dependencies: babel-runtime "^6.9.1" esutils "^2.0.2" @@ -727,8 +729,8 @@ babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.6. to-fast-properties "^1.0.1" babylon@^6.11.0, babylon@^6.8.2: - version "6.12.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.12.0.tgz#953e6202e58062f7f5041fc8037e4bd4e17140a9" + version "6.13.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" balanced-match@^0.4.1: version "0.4.2" @@ -742,7 +744,15 @@ base62@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/base62/-/base62-1.1.1.tgz#974e82c11bd5e00816b508a7ed9c7b9086c9db6b" -base64-js@^0.0.8, base64-js@0.0.8: +base64-js@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +base64-js@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.6.tgz#7b859f79f0bbbd55867ba67a7fab397e24a20947" + +base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -780,7 +790,11 @@ binaryextensions@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" -bl@^1.0.0, bl@~1.1.2: +bindings@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" + +bl@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" dependencies: @@ -821,6 +835,17 @@ boom@2.x.x: dependencies: hoek "2.x.x" +boxen@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.3.1.tgz#a7d898243ae622f7abb6bb604d740a76c6a5461b" + dependencies: + chalk "^1.1.1" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" + bplist-creator@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.4.tgz#4ac0496782e127a85c1d2026a4f5eb22a7aff991" @@ -1010,11 +1035,7 @@ code-point-at@^1.0.0: dependencies: number-is-nan "^1.0.0" -colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -colors@1.0.3, colors@1.0.x: +colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -1091,6 +1112,20 @@ concat-stream@~1.4.5: readable-stream "~1.1.9" typedarray "~0.0.5" +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + connect-timeout@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e" @@ -1186,8 +1221,8 @@ create-error-class@^3.0.1: capture-stack-trace "^1.0.0" cross-spawn-async@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.4.tgz#c9a8d8e9a06502c7a46296e33a1a054b5d2f1812" + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" dependencies: lru-cache "^4.0.0" which "^1.2.8" @@ -1249,9 +1284,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" dargs@^4.0.0: version "4.1.0" @@ -1272,7 +1309,7 @@ dateformat@^1.0.11: get-stdin "^4.0.1" meow "^3.3.0" -debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: +debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1342,10 +1379,6 @@ decompress@^3.0.0: vinyl-assign "^1.0.1" vinyl-fs "^2.2.0" -deep-equal@~0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" - deep-extend@^0.4.0, deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" @@ -1386,13 +1419,11 @@ detect-conflict@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" -detect-indent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" + repeating "^2.0.0" detect-newline@^1.0.3: version "1.0.3" @@ -1402,10 +1433,10 @@ detect-newline@^1.0.3: minimist "^1.1.0" detective@^4.0.0, detective@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.1.tgz#9fb06dd1ee8f0ea4dbcc607cda39d9ce1d4f726f" + version "4.3.2" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.2.tgz#77697e2e7947ac3fe7c8e26a6d6f115235afa91c" dependencies: - acorn "^1.0.3" + acorn "^3.1.0" defined "^1.0.0" diff@^2.1.2: @@ -1450,6 +1481,12 @@ domutils@1.5: dom-serializer "0" domelementtype "1" +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + download@^4.1.2: version "4.4.3" resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" @@ -1483,8 +1520,8 @@ duplexer2@~0.0.2, duplexer2@0.0.2: readable-stream "~1.1.9" duplexify@^3.2.0: - version "3.4.6" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.4.6.tgz#1e586a13028caf31d5144a059813f9b071fec557" + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" dependencies: end-of-stream "1.0.0" inherits "^2.0.1" @@ -1557,10 +1594,32 @@ errorhandler@~1.4.2: accepts "~1.3.0" escape-html "~1.0.3" +es5-ext@^0.10.7, es5-ext@~0.10.11, es5-ext@~0.10.2: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + es6-promise@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" +es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -1668,10 +1727,6 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - fancy-log@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.2.0.tgz#d5a51b53e9ab22ca07d558f2b67ae55fdb5fcbd8" @@ -1683,7 +1738,7 @@ fast-levenshtein@~2.0.4: version "2.0.5" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" -fb-watchman@^1.8.0: +fb-watchman@^1.8.0, fb-watchman@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" dependencies: @@ -1757,6 +1812,10 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + finalhandler@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b" @@ -1787,7 +1846,7 @@ for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" -for-own@^0.1.3: +for-own@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" dependencies: @@ -1797,13 +1856,13 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" +form-data@~2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.1.tgz#4adf0342e1a79afa1e84c8c320a9ffc82392a1f3" dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" - mime-types "^2.1.11" + mime-types "^2.1.12" formatio@1.1.1: version "1.1.1" @@ -1829,15 +1888,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: +fstream@^1.0.0, fstream@^1.0.2: version "1.0.10" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" dependencies: @@ -1964,7 +2015,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5: +glob@^7.0.0, glob@^7.0.1, glob@^7.0.3, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1982,9 +2033,9 @@ global@^4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^8.3.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" +globals@^9.0.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" globby@^4.0.0: version "4.1.0" @@ -2024,7 +2075,7 @@ got@^5.0.0, got@^5.2.0: unzip-response "^1.0.0" url-parse-lax "^1.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: +graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" @@ -2139,12 +2190,12 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" dependencies: + os-homedir "^1.0.0" os-tmpdir "^1.0.1" - user-home "^1.1.1" hosted-git-info@^2.1.4: version "2.1.5" @@ -2167,14 +2218,6 @@ htmlparser2@~3.8.1: entities "1.0" readable-stream "1.1" -http-basic@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-2.5.1.tgz#8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb" - dependencies: - caseless "~0.11.0" - concat-stream "^1.4.6" - http-response-object "^1.0.0" - http-errors@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" @@ -2182,10 +2225,6 @@ http-errors@~1.3.1: inherits "~2.0.1" statuses "1" -http-response-object@^1.0.0, http-response-object@^1.0.1, http-response-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-1.1.0.tgz#a7c4e75aae82f3bb4904e4f43f615673b4d518c3" - http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2194,11 +2233,7 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -i@0.3.x: - version "0.3.5" - resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" - -iconv-lite@^0.4.5, iconv-lite@~0.4.13, iconv-lite@0.4.13: +iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13, iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" @@ -2218,6 +2253,10 @@ immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -2376,6 +2415,10 @@ is-natural-number@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + is-number@^2.0.2, is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -2471,7 +2514,7 @@ isomorphic-fetch@^2.1.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -isstream@~0.1.2, isstream@0.1.x: +isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2482,6 +2525,15 @@ istextorbinary@^1.0.2: binaryextensions "~1.0.0" textextensions "~1.0.0" +jest-haste-map@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-15.0.1.tgz#1d1c342fa6f6d62d9bc2af76428d2e20f74a44d3" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + multimatch "^2.1.0" + worker-farm "^1.3.1" + jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -2535,6 +2587,10 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" +json5@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -2585,8 +2641,16 @@ kind-of@^3.0.2: is-buffer "^1.0.2" klaw@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.0.tgz#8857bfbc1d824badf13d3d0241d8bbe46fb12f73" + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + dependencies: + package-json "^2.0.0" lazy-cache@^1.0.3: version "1.0.4" @@ -2621,6 +2685,10 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +lodash-node@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash-node/-/lodash-node-2.4.1.tgz#ea82f7b100c733d1a42af76801e506105e2a80ec" + lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" @@ -2724,7 +2792,7 @@ lodash@^3.1.0, lodash@^3.10.1, lodash@^3.2.0, lodash@^3.3.1, lodash@^3.5.0, loda version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: version "4.16.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" @@ -2867,7 +2935,7 @@ mime-db@~1.23.0: version "1.23.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" -mime-types@^2.1.11, mime-types@~2.1.11, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: version "2.1.12" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" dependencies: @@ -2907,12 +2975,23 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@0.x.x: +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0": version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +mock-fs@^3.9.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-3.11.0.tgz#096f21dfe985189a0a6efc4b38ceb404ee8e8911" + dependencies: + rewire "2.5.2" + semver "5.1.1" + +mockery@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/mockery/-/mockery-1.7.0.tgz#f4ede0d8750c1c9727c272ea2c60629e2c9a1c4f" + module-deps@^3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" @@ -2933,8 +3012,8 @@ module-deps@^3.9.1: xtend "^4.0.0" moment@2.x.x: - version "2.15.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.1.tgz#e979c2a29e22888e60f396f2220a6118f85cd94c" + version "2.15.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" morgan@~1.6.1: version "1.6.1" @@ -2950,7 +3029,7 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" -multimatch@^2.0.0: +multimatch@^2.0.0, multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" dependencies: @@ -2972,10 +3051,6 @@ multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" -mute-stream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -2984,9 +3059,12 @@ nan@^2.3.3: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" -ncp@1.0.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" +needle: + version "1.3.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-1.3.0.tgz#d32ff70c37d63411afb313fae517e9157c32e62e" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" negotiator@0.5.3: version "0.5.3" @@ -3003,24 +3081,29 @@ node-fetch@^1.0.1, node-fetch@^1.3.3: encoding "^0.1.11" is-stream "^1.0.1" +node-gyp@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" -node-pre-gyp@^0.6.30: - version "0.6.30" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" - dependencies: - mkdirp "~0.5.0" - nopt "~3.0.1" - npmlog "4.x" - rc "~1.1.0" - request "2.x" - rimraf "~2.5.0" - semver "~5.3.0" - tar "~2.2.0" - tar-pack "~3.1.0" - node-status-codes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" @@ -3029,7 +3112,11 @@ node-uuid@~1.4.7, node-uuid@1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" -nopt@^3.0.0, nopt@~3.0.1: +node-uuid@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.3.3.tgz#d3db4d7b56810d9e4032342766282af07391729b" + +nopt@^3.0.0, "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -3048,7 +3135,7 @@ normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" -npmlog@^2.0.4: +npmlog@^2.0.0, npmlog@^2.0.2, npmlog@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" dependencies: @@ -3056,9 +3143,9 @@ npmlog@^2.0.4: are-we-there-yet "~1.1.2" gauge "~1.2.5" -npmlog@4.x: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" +"npmlog@0 || 1 || 2 || 3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -3092,10 +3179,10 @@ object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" object.omit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" dependencies: - for-own "^0.1.3" + for-own "^0.1.4" is-extendable "^0.1.1" on-finished@~2.3.0: @@ -3114,7 +3201,7 @@ once@^1.3.0: dependencies: wrappy "1" -once@~1.3.0, once@~1.3.3: +once@~1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: @@ -3177,6 +3264,22 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@^0.1.0, osenv@0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +package-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + parents@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -3202,14 +3305,16 @@ parseurl@~1.3.0, parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" + dependencies: + array-index "^1.0.0" + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - path-exists@^2.0.0, path-exists@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -3236,6 +3341,10 @@ pause@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74" +pegjs@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.6.2.tgz#74651f8a800e444db688e4eeae8edb65637a17a5" + pegjs@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.9.0.tgz#f6aefa2e3ce56169208e52179dfe41f89141a369" @@ -3258,14 +3367,6 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkginfo@0.3.x: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - -pkginfo@0.x.x: - version "0.4.0" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" - plist@^1.2.0, plist@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593" @@ -3275,6 +3376,15 @@ plist@^1.2.0, plist@1.2.0: xmlbuilder "4.0.0" xmldom "0.1.x" +plist@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-1.1.0.tgz#ff6708590c97cc438e7bc45de5251bd725f3f89d" + dependencies: + base64-js "0.0.6" + util-deprecate "1.0.0" + xmlbuilder "2.2.1" + xmldom "0.1.x" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3317,17 +3427,6 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prompt@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" - dependencies: - colors "^1.1.2" - pkginfo "0.x.x" - read "1.0.x" - revalidator "0.1.x" - utile "0.3.x" - winston "2.1.x" - prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" @@ -3336,29 +3435,25 @@ pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" q@^1.1.2: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -qs@^6.1.0: +qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" -qs@~6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" - qs@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" random-bytes@~1.0.0: version "1.0.0" @@ -3383,7 +3478,7 @@ raw-body@~2.1.2: iconv-lite "0.4.13" unpipe "1.0.0" -rc@^1.1.2, rc@~1.1.0: +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" dependencies: @@ -3400,21 +3495,15 @@ react-deep-force-update@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7" -react-native-fs@^1.1.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-1.5.1.tgz#5f98a3d59eb6d27d1217b720a31d10fe576b57c4" - dependencies: - base-64 "^0.1.0" - bluebird "^2.9.25" - utf8 "^2.1.1" - -react-native@^0.34.0: - version "0.34.1" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.34.1.tgz#a88370bd5f0f74831605415a302395eb5b376917" +react-native: + version "0.36.0" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.36.0.tgz#3ce19cebcf99e2dc5a889cbb74201ef63ecb6a55" dependencies: absolute-path "^0.0.0" art "^0.10.0" + async "^2.0.1" babel-core "^6.10.4" + babel-generator "^6.14.0" babel-plugin-external-helpers "^6.8.0" babel-plugin-syntax-trailing-function-commas "^6.5.0" babel-plugin-transform-flow-strip-types "^6.6.5" @@ -3426,7 +3515,7 @@ react-native@^0.34.0: babel-register "^6.6.0" babel-types "^6.6.4" babylon "^6.8.2" - base64-js "^0.0.8" + base64-js "^1.1.2" bser "^1.0.2" chalk "^1.1.1" commander "^2.9.0" @@ -3443,6 +3532,7 @@ react-native@^0.34.0: image-size "^0.3.5" immutable "~3.7.6" inquirer "^0.12.0" + jest-haste-map "15.0.1" joi "^6.6.1" json-stable-stringify "^1.0.1" json5 "^0.4.0" @@ -3467,7 +3557,7 @@ react-native@^0.34.0: regenerator-runtime "^0.9.5" sane "~1.4.1" semver "^5.0.3" - source-map "^0.4.4" + source-map "^0.5.6" stacktrace-parser "^0.1.3" temp "0.8.3" uglify-js "^2.6.2" @@ -3481,6 +3571,14 @@ react-native@^0.34.0: yeoman-environment "1.5.3" yeoman-generator "0.21.2" +react-native-fs@^1.1.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-1.5.1.tgz#5f98a3d59eb6d27d1217b720a31d10fe576b57c4" + dependencies: + base-64 "^0.1.0" + bluebird "^2.9.25" + utf8 "^2.1.1" + react-proxy@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" @@ -3533,12 +3631,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read@1.0.x: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - dependencies: - mute-stream "~0.0.4" - readable-stream@^1.1.13, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.8, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -3548,7 +3640,7 @@ readable-stream@^1.1.13, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@ isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@~2.1.4: +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5: version "2.1.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" dependencies: @@ -3597,20 +3689,22 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" +realm: + version "0.14.3" + resolved "https://registry.yarnpkg.com/realm/-/realm-0.14.3.tgz#11f281d7240b14edcbed94d6dd06384dfff58408" + dependencies: + bindings "^1.2.1" + mockery "^1.6.2" + nan "^2.3.3" + node-gyp "^3.3.1" + rnpm "1.6.5" + xcode "0.8.4" + "realm-tests@file:../js": version "0.0.1" dependencies: es6-promise "^3.2.1" -"realm@file:../..": - version "0.14.3-6" - dependencies: - nan "^2.3.3" - node-pre-gyp "^0.6.30" - request "^2.74.0" - sync-request "^3.0.1" - url "^0.11.0" - rebound@^0.0.13: version "0.0.13" resolved "https://registry.yarnpkg.com/rebound/-/rebound-0.0.13.tgz#4a225254caf7da756797b19c5817bf7a7941fac1" @@ -3654,6 +3748,18 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +registry-auth-token@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" + dependencies: + rc "^1.1.6" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -3669,14 +3775,8 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" repeat-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" - -repeating@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" repeating@^2.0.0: version "2.0.1" @@ -3688,18 +3788,17 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@^2.74.0, request@2.x: - version "2.75.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" +request@2: + version "2.76.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" - bl "~1.1.2" caseless "~0.11.0" combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" - form-data "~2.0.0" + form-data "~2.1.1" har-validator "~2.0.6" hawk "~3.1.3" http-signature "~1.1.0" @@ -3709,11 +3808,15 @@ request@^2.74.0, request@2.x: mime-types "~2.1.7" node-uuid "~1.4.7" oauth-sign "~0.8.1" - qs "~6.2.0" + qs "~6.3.0" stringstream "~0.0.4" tough-cookie "~2.3.0" tunnel-agent "~0.4.1" +requires-port@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolve@^1.1.3, resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -3732,9 +3835,9 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" -revalidator@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" +rewire@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.5.2.tgz#6427de7b7feefa7d36401507eb64a5385bc58dc7" right-align@^0.1.1: version "0.1.3" @@ -3742,7 +3845,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.0, rimraf@^2.2.8, rimraf@~2.5.0, rimraf@~2.5.1, rimraf@2, rimraf@2.x.x: +rimraf@^2.2.0, rimraf@^2.2.8, rimraf@2: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -3756,6 +3859,40 @@ rndm@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" +rnpm-plugin-install@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/rnpm-plugin-install/-/rnpm-plugin-install-1.1.0.tgz#5a46cabf2c523e59a6006337c96f46c4f2bfaf69" + dependencies: + npmlog "^2.0.2" + +rnpm-plugin-link@^1.7.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/rnpm-plugin-link/-/rnpm-plugin-link-1.8.0.tgz#57afe5cfc18cca3aee0d8a1dc253d28edafb593c" + dependencies: + fs-extra "^0.26.2" + glob "^7.0.0" + inquirer "^0.12.0" + lodash "^3.10.1" + mime "^1.3.4" + mock-fs "^3.9.0" + npmlog "^2.0.0" + plist "^1.2.0" + semver "^5.1.0" + to-camel-case "^1.0.0" + xcode "^0.8.8" + +rnpm@1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/rnpm/-/rnpm-1.6.5.tgz#d82bdbe3560965c4e5eb81dc51cd947c83f2fd7f" + dependencies: + commander "^2.9.0" + glob "^7.0.1" + lodash "^3.10.1" + rnpm-plugin-install "^1.0.0" + rnpm-plugin-link "^1.7.2" + update-notifier "^0.6.0" + xmldoc "^0.4.0" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -3795,10 +3932,20 @@ seek-bzip@^1.0.3: dependencies: commander "~2.8.1" -semver@^5.0.3, semver@^5.1.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", semver@5.x: +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.x: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +semver@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" + send@0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" @@ -3853,10 +4000,6 @@ set-immediate-shim@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - shelljs@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" @@ -3865,6 +4008,14 @@ signal-exit@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" +simple-plist@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.0.4.tgz#7f863438b63cb75df99dd81b8336d7c5075cfc0b" + dependencies: + bplist-creator "0.0.4" + bplist-parser "0.0.6" + plist "1.1.0" + simple-plist@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.1.4.tgz#10eb51b47e33c556eb8ec46d5ee64d64e717db5d" @@ -3886,6 +4037,10 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -3898,13 +4053,13 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.3" -source-map@^0.4.2, source-map@^0.4.4: +source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -3958,10 +4113,6 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stack-trace@0.0.x: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - stacktrace-parser@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" @@ -4091,27 +4242,6 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -sync-request@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-3.0.1.tgz#caa1235aaf889ba501076a1834c436830a82fb73" - dependencies: - concat-stream "^1.4.7" - http-response-object "^1.0.1" - then-request "^2.0.1" - -tar-pack@~3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.1.4.tgz#bc8cf9a22f5832739f12f3910dac1eb97b49708c" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - tar-stream@^1.1.1: version "1.5.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" @@ -4121,7 +4251,7 @@ tar-stream@^1.1.1: readable-stream "^2.0.0" xtend "^4.0.0" -tar@~2.2.0, tar@~2.2.1: +tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -4144,17 +4274,6 @@ textextensions@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" -then-request@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-2.2.0.tgz#6678b32fa0ca218fe569981bbd8871b594060d81" - dependencies: - caseless "~0.11.0" - concat-stream "^1.4.7" - http-basic "^2.5.1" - http-response-object "^1.1.0" - promise "^7.1.1" - qs "^6.1.0" - through@^2.3.6, "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4212,10 +4331,26 @@ to-absolute-glob@^0.1.1: dependencies: extend-shallow "^2.0.1" +to-camel-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" + dependencies: + to-space-case "^1.0.0" + to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + dependencies: + to-no-case "^1.0.0" + topo@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" @@ -4223,8 +4358,10 @@ topo@1.x.x: hoek "2.x.x" tough-cookie@~2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" traverse@^0.6.6: version "0.6.6" @@ -4274,8 +4411,8 @@ ua-parser-js@^0.7.9: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" uglify-js@^2.6.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.3.tgz#39b3a7329b89f5ec507e344c6e22568698ef4868" + version "2.7.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" dependencies: async "~0.2.6" source-map "~0.5.1" @@ -4286,10 +4423,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uid-number@~0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - uid-safe@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137" @@ -4335,23 +4468,30 @@ unzip-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.1.tgz#4a73959f2989470fa503791cefb54e1dbbc68412" +update-notifier@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.6.3.tgz#776dec8daa13e962a341e8a1d98354306b67ae08" + dependencies: + boxen "^0.3.1" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + semver-diff "^2.0.0" + +url-parse: + version "1.1.6" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.6.tgz#ab8ff5aea1388071961255e2236147c52ca5fc48" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" dependencies: prepend-http "^1.0.1" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -4366,23 +4506,16 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1, util-deprecate@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util-deprecate@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.0.tgz#3007af012c140eae26de05576ec22785cac3abf2" + "util@>=0.10.3 <1": version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: inherits "2.0.1" -utile@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" - dependencies: - async "~0.9.0" - deep-equal "~0.2.1" - i "0.3.x" - mkdirp "0.x.x" - ncp "1.0.x" - rimraf "2.x.x" - utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" @@ -4503,7 +4636,7 @@ whatwg-fetch@^1.0.0, whatwg-fetch@>=0.10.0: version "1.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz#01c2ac4df40e236aaa18480e3be74bd5c8eb798e" -which@^1.2.8, which@^1.2.9: +which@^1.2.8, which@^1.2.9, which@1: version "1.2.11" resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" dependencies: @@ -4515,9 +4648,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.1" -wildcard@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" window-size@^0.1.4: version "0.1.4" @@ -4527,18 +4662,6 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -winston@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" - dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - pkginfo "0.3.x" - stack-trace "0.0.x" - wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4574,6 +4697,14 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + ws@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" @@ -4581,7 +4712,7 @@ ws@^1.1.0: options ">=0.0.5" ultron "1.0.x" -xcode@^0.8.9: +xcode@^0.8.8, xcode@^0.8.9: version "0.8.9" resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.9.tgz#ec6765f70e9dccccc9f6e9a5b9b4e7e814b4cf35" dependencies: @@ -4589,6 +4720,14 @@ xcode@^0.8.9: pegjs "0.9.0" simple-plist "0.1.4" +xcode@0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.4.tgz#e82c64675fcae3cb02e9ceb801d786dd90123604" + dependencies: + node-uuid "1.3.3" + pegjs "0.6.2" + simple-plist "0.0.4" + xdg-basedir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" @@ -4601,6 +4740,12 @@ xmlbuilder@^4.2.1: dependencies: lodash "^4.0.0" +xmlbuilder@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-2.2.1.tgz#9326430f130d87435d4c4086643aa2926e105a32" + dependencies: + lodash-node "~2.4.1" + xmlbuilder@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3" @@ -4655,8 +4800,8 @@ yargs@~3.10.0: window-size "0.1.0" yauzl@^2.2.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.6.0.tgz#40894d4587bb125500d05df45471cd5e114a76f9" + version "2.7.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.7.0.tgz#e21d847868b496fc29eaec23ee87fdd33e9b2bce" dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.0.1" diff --git a/tests/spec/unit_tests.js b/tests/spec/unit_tests.js index d21efd8c..df89587e 100644 --- a/tests/spec/unit_tests.js +++ b/tests/spec/unit_tests.js @@ -59,7 +59,6 @@ for (const suiteName in tests) { catch (e) { fail(e); } - }); } @@ -77,3 +76,18 @@ describe('AsyncTests', () => { afterEach(() => Realm.clearTestState()); }); + +const wn = require("child_process").spawn; +const terminate = require("terminate"); +const readline = require("readline"); +const tmp = require("tmp"); + +const userTests = require('../js/user-tests'); +fdescribe('SyncTests', () => { + beforeEach(() => Realm.clearTestState()); + afterEach(() => Realm.clearTestState()); + + for (const testName in userTests) { + it(testName, (done) => userTests[testName]().catch((e) => fail(e)).then(done)); + } +}); From b2e71a5fb687a64d96ebca70fea9a3b1fab07cd5 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 8 Nov 2016 09:21:27 -0800 Subject: [PATCH 030/100] test fixes --- lib/user-methods.js | 5 ++--- tests/js/user-tests.js | 15 +++++---------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/user-methods.js b/lib/user-methods.js index 0df502d8..626823cb 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -20,7 +20,7 @@ if (typeof fetch != 'undefined') { } }) .then((body) => { - callback(undefined, {statusCode: 200}, JSON.parse(body)) + callback(undefined, {statusCode: 200}, body) }) .catch((error) => { callback(error); @@ -60,8 +60,7 @@ module.exports = function(realmConstructor) { callback(error); } else if (response.statusCode != 200) { - console.log(response.statusCode); - callback(new AuthError('Bad response: ' + response.statusCode)); + callback(new AuthError(JSON.parse(body))); } else { // TODO: validate JSON diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 384c6be7..b0a58c77 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -53,7 +53,6 @@ module.exports = { return new Promise((resolve, reject) => { Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { TestCase.assertEqual(typeof user, 'object'); - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { TestCase.assertTrue(error instanceof Realm.Sync.AuthError); TestCase.assertEqual(error.code, 613); @@ -69,15 +68,11 @@ module.exports = { var username = uuid(); return new Promise((resolve, reject) => { Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { - TestCase.assertEqual(typeof user, 'object'); - - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - TestCase.assertTrue(error instanceof Realm.Sync.AuthError); - TestCase.assertEqual(error.code, 602); - TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertEqual(user, undefined); - resolve(); - }); + TestCase.assertTrue(error instanceof Realm.Sync.AuthError); + TestCase.assertEqual(error.code, 602); + TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertEqual(user, undefined); + resolve(); }); }); }, From 8ce8f521056671b325aa07da214e9c29a65d1306 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 8 Nov 2016 14:07:04 -0800 Subject: [PATCH 031/100] add test for login --- lib/user-methods.js | 3 ++- src/js_realm.hpp | 6 +++++- tests/js/user-tests.js | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/user-methods.js b/lib/user-methods.js index 626823cb..c81853d4 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -53,7 +53,8 @@ module.exports = function(realmConstructor) { var options = { url: auth_url(server), body: JSON.stringify(json), - headers: postHeaders + headers: postHeaders, + open_timeout: 5000 }; post(options, function(error, response, body) { if (error) { diff --git a/src/js_realm.hpp b/src/js_realm.hpp index d270d953..7831419d 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -33,6 +33,7 @@ #if REALM_ENABLE_SYNC #include "js_sync.hpp" #include "sync/sync_config.hpp" +#include "sync/sync_manager.hpp" #endif #include "shared_realm.hpp" @@ -455,9 +456,12 @@ void RealmClass::schema_version(ContextType ctx, ObjectType this_object, size template void RealmClass::clear_test_state(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 0); + for(auto &user : SyncManager::shared().all_users()) { + user->log_out(); + } delete_all_realms(); } - + template void RealmClass::copy_bundled_realm_files(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 0); diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index b0a58c77..91e94512 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -76,5 +76,29 @@ module.exports = { }); }); }, + + testLogin() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + user.logout(); + //TestCase.assertEqual(Realm.Sync.User.all.length, 0); + + Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { + TestCase.assertEqual(typeof user, 'object'); + TestCase.assertEqual(typeof user.token, 'string'); + TestCase.assertEqual(typeof user.identity, 'string'); + TestCase.assertEqual(user.isAdmin, false); + + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertNotEqual(realm instanceof Realm); + + //TestCase.assertEqual(Realm.Sync.User.all.length, 1); + + resolve(); + }); + }); + }); + }, }; From 42cab3a95aeaa06196c08df82a0a948ed8a773a2 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 8 Nov 2016 15:07:57 -0800 Subject: [PATCH 032/100] update submodule --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index d8f5765c..7fa8f419 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit d8f5765c574357635e09e25cb2bad58c68d08939 +Subproject commit 7fa8f41906d4d7e2aa9ab8048eacae3a073e8b7e From d5cd3d7266c9c250632990e4ccfcd882664f1d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Tue, 8 Nov 2016 16:47:20 -0800 Subject: [PATCH 033/100] Download and start ROS before running tests + Run all tests + Run using node4.4.7 --- .gitignore | 6 ++++++ package.json | 3 ++- scripts/test.sh | 31 +++++++++++++++++++++++++++---- tests/spec/unit_tests.js | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index f7027826..b8c72c30 100644 --- a/.gitignore +++ b/.gitignore @@ -110,3 +110,9 @@ local.properties # Visual Studio Code .vscode tsconfig.json + +# Tests +object-server-for-testing/ +tests/realm-object-server/ +vendor/sync +vendor/sync* diff --git a/package.json b/package.json index bfc8a2f1..7fde0825 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "nan": "^2.3.3", "needle": "^1.3.0", "node-pre-gyp": "^0.6.30", - "sync-request": "^3.0.1" + "sync-request": "^3.0.1", + "url-parse": "^1.1.7" }, "devDependencies": { "babel-eslint": "^6.0.4", diff --git a/scripts/test.sh b/scripts/test.sh index e72ddf5f..b5134f89 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -23,12 +23,34 @@ if [[ $TARGET = *-android ]]; then export REALM_BUILD_ANDROID=1 fi +SERVER_PID=0 PACKAGER_OUT="$SRCROOT/packager_out.txt" LOGCAT_OUT="$SRCROOT/logcat_out.txt" + +download_server() { + sh ./scripts/download-object-server.sh +} + +start_server() { + sh ./object-server-for-testing/start-object-server.command & + SERVER_PID=$! +} + +stop_server() { + if [[ ${SERVER_PID} > 0 ]] ; then + kill ${SERVER_PID} + fi +} + cleanup() { - # Kill all child processes. + # Kill started object server + stop_server + + # Kill all other child processes. pkill -P $$ || true + + # Kill react native packager pkill node || true rm -f "$PACKAGER_OUT" "$LOGCAT_OUT" } @@ -58,8 +80,6 @@ start_packager() { } xctest() { - ${SRCROOT}/scripts/reset-simulators.sh - local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test | xcpretty -c --no-utf --report junit --output build/reports/junit.xml @@ -75,7 +95,7 @@ trap cleanup EXIT # Use a consistent version of Node if possible. if [ -s "${HOME}/.nvm/nvm.sh" ]; then . "${HOME}/.nvm/nvm.sh" - nvm use 5.4.0 || true + nvm use 4.4.7 || true fi case "$TARGET" in @@ -154,6 +174,8 @@ case "$TARGET" in cat tests.xml ;; "node") + download_server + start_server npm install --build-from-source # Change to a temp directory. @@ -164,6 +186,7 @@ case "$TARGET" in npm install npm test popd + stop_server ;; "test-runners") npm install --build-from-source diff --git a/tests/spec/unit_tests.js b/tests/spec/unit_tests.js index df89587e..2655924a 100644 --- a/tests/spec/unit_tests.js +++ b/tests/spec/unit_tests.js @@ -83,7 +83,7 @@ const readline = require("readline"); const tmp = require("tmp"); const userTests = require('../js/user-tests'); -fdescribe('SyncTests', () => { +describe('SyncTests', () => { beforeEach(() => Realm.clearTestState()); afterEach(() => Realm.clearTestState()); From ba48933561a85a34a3a34bc2e8aee3b3279eee78 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Wed, 9 Nov 2016 16:47:17 +0100 Subject: [PATCH 034/100] Enable building without sync This is needed because the linux node binding needs to work without sync --- binding.gyp | 21 +++++++++++++-------- src/js_realm.hpp | 37 ++++++++++++++++++++----------------- src/node/gyp/realm.gyp | 4 ++-- 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/binding.gyp b/binding.gyp index a0ce0f6f..bb22d6ae 100644 --- a/binding.gyp +++ b/binding.gyp @@ -32,7 +32,7 @@ }, { "target_name": "object-store", - "dependencies": [ "realm-core", "realm-sync" ], + "dependencies": [ "realm-core" ], "type": "static_library", "include_dirs": [ "src/object-store/src", @@ -63,12 +63,6 @@ "src/object-store/src/parser/query_builder.cpp", "src/object-store/src/util/format.cpp", "src/object-store/src/util/thread_id.cpp", - "src/object-store/src/sync/sync_manager.cpp", - "src/object-store/src/sync/sync_user.cpp", - "src/object-store/src/sync/sync_session.cpp", - "src/object-store/src/sync/impl/sync_file.cpp", - "src/object-store/src/sync/impl/sync_metadata.cpp", - "src/object-store/src/impl/apple/keychain_helper.cpp" ], "conditions": [ ["OS=='linux'", { @@ -80,10 +74,21 @@ "sources": [ "src/object-store/src/impl/apple/external_commit_helper.cpp" ] + }], + ["realm_enable_sync", { + "dependencies": [ "realm-sync" ], + "sources": [ + "src/object-store/src/sync/sync_manager.cpp", + "src/object-store/src/sync/sync_user.cpp", + "src/object-store/src/sync/sync_session.cpp", + "src/object-store/src/sync/impl/sync_file.cpp", + "src/object-store/src/sync/impl/sync_metadata.cpp", + "src/object-store/src/impl/apple/keychain_helper.cpp" + ], }] ], "all_dependent_settings": { - "include_dirs": [ + "include_dirs": [ "src/object-store/src", "src/object-store/src/impl", "src/object-store/src/impl/apple", diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 7831419d..9634a431 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -178,17 +178,17 @@ public: static void set_default_path(ContextType, ObjectType, ValueType value); std::string const name = "Realm"; - + MethodMap const static_methods = { {"schemaVersion", wrap}, {"clearTestState", wrap}, {"copyBundledRealmFiles", wrap}, }; - + PropertyMap const static_properties = { {"defaultPath", {wrap, wrap}}, }; - + MethodMap const methods = { {"objects", wrap}, {"objectForPrimaryKey", wrap}, @@ -201,14 +201,14 @@ public: {"removeAllListeners", wrap}, {"close", wrap}, }; - + PropertyMap const properties = { {"path", {wrap, nullptr}}, {"schemaVersion", {wrap, nullptr}}, {"schema", {wrap, nullptr}}, {"readOnly", {wrap, nullptr}}, }; - + private: static std::string validated_notification_name(ContextType ctx, const ValueType &value) { std::string name = Value::validated_to_string(ctx, value, "notification name"); @@ -217,13 +217,13 @@ public: } return name; } - + static const ObjectSchema& validated_object_schema_for_value(ContextType ctx, const SharedRealm &realm, const ValueType &value) { std::string object_type; if (Value::is_constructor(ctx, value)) { FunctionType constructor = Value::to_constructor(ctx, value); - + auto delegate = get_delegate(realm.get()); for (auto &pair : delegate->m_constructors) { if (FunctionType(pair.second) == constructor) { @@ -248,7 +248,7 @@ public: } return *object_schema; } - + static std::string normalize_path(std::string path) { if (path.size() && path[0] != '/' && path[0] != '.') { return default_realm_file_directory() + "/" + path; @@ -282,7 +282,7 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { s_constructor = Protected(ctx, realm_constructor); return realm_constructor; } - + static inline void convert_outdated_datetime_columns(const SharedRealm &realm) { realm::util::Optional old_file_format_version = realm->file_format_upgraded_from_version(); if (old_file_format_version && old_file_format_version < 5) { @@ -294,7 +294,7 @@ static inline void convert_outdated_datetime_columns(const SharedRealm &realm) { if (!realm->is_in_transaction()) { realm->begin_transaction(); } - + for (size_t row_index = 0; row_index < table->size(); row_index++) { if (table->is_null(property.table_column, row_index)) { continue; @@ -337,7 +337,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t else { config.path = js::default_path(); } - + static const String read_only_string = "readOnly"; ValueType read_only_value = Object::get_property(ctx, object, read_only_string); if (!Value::is_undefined(ctx, read_only_value) && Value::validated_to_boolean(ctx, read_only_value, "readOnly")) { @@ -372,7 +372,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t create_object>(ctx, old_realm_ptr), create_object>(ctx, realm_ptr) }; - + try { Function::call(ctx, migration_function, 2, arguments); } @@ -382,7 +382,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t realm_ptr->reset(); throw; } - + old_realm->close(); old_realm_ptr->reset(); realm_ptr->reset(); @@ -403,7 +403,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t else { throw std::runtime_error("Invalid arguments when constructing 'Realm'"); } - + config.path = normalize_path(config.path); ensure_directory_exists_for_file(config.path); @@ -425,7 +425,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t js_binding_context->m_defaults = std::move(defaults); js_binding_context->m_constructors = std::move(constructors); } - + // Fix for datetime -> timestamp conversion convert_outdated_datetime_columns(realm); @@ -435,7 +435,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t template void RealmClass::schema_version(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 1, 2); - + realm::Realm::Config config; config.path = normalize_path(Value::validated_to_string(ctx, arguments[0])); if (argc == 2) { @@ -443,7 +443,7 @@ void RealmClass::schema_version(ContextType ctx, ObjectType this_object, size std::string encryptionKey = NativeAccessor::to_binary(ctx, encryptionKeyValue); config.encryption_key = std::vector(encryptionKey.begin(), encryptionKey.end()); } - + auto version = realm::Realm::get_schema_version(config); if (version == ObjectStore::NotVersioned) { return_value.set(-1); @@ -453,12 +453,15 @@ void RealmClass::schema_version(ContextType ctx, ObjectType this_object, size } } + template void RealmClass::clear_test_state(ContextType ctx, ObjectType this_object, size_t argc, const ValueType arguments[], ReturnValue &return_value) { validate_argument_count(argc, 0); +#if REALM_ENABLE_SYNC for(auto &user : SyncManager::shared().all_users()) { user->log_out(); } +#endif delete_all_realms(); } diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index baeea330..ad41ad71 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -18,7 +18,7 @@ ] }, "all_dependent_settings": { - "defines": [ "REALM_HAVE_CONFIG", "REALM_PLATFORM_NODE=1", "REALM_ENABLE_SYNC=1" ] + "defines": [ "REALM_HAVE_CONFIG", "REALM_PLATFORM_NODE=1", "REALM_ENABLE_SYNC=<(realm_enable_sync)" ] }, "variables": { "prefix": " Date: Wed, 9 Nov 2016 17:25:25 +0100 Subject: [PATCH 035/100] Fix building with sync --- scripts/download-core.sh | 24 +++++++++++++----------- src/node/gyp/realm.gyp | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index aedfa411..47e14ab0 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -30,9 +30,9 @@ else fi SYNC_DIR='sync' -SYNC_PLATFORM_TAG="cocoa-" +SYNC_PLATFORM_TAG="node-cocoa-" -SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" +SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.zip" # Start current working directory at the root of the project. cd "$(dirname "$0")/.." @@ -47,6 +47,8 @@ download_core() { local VERSION=$2 local DOWNLOAD_FILE=$3 local SERVER_DIR=$4 + local UNTAR=$5 + local UNTARRED_DIR=$6 echo "Downloading dependency: $DIR $VERSION" local TMP_DIR="${TMPDIR:-/tmp}/$DIR" @@ -56,7 +58,7 @@ download_core() { mkdir -p "$TMP_DIR" if [ ! -f "$TAR" ]; then - echo "https://static.realm.io/downloads/$SERVER_DIR/$DOWNLOAD_FILE" + echo "https://static.realm.io/downloads/$SERVER_DIR/$DOWNLOAD_FILE" curl -f -L -s "https://static.realm.io/downloads/$SERVER_DIR/$DOWNLOAD_FILE" -o "$TMP_TAR" || die "Downloading $DIR failed. Please try again once you have an Internet connection." mv "$TMP_TAR" "$TAR" @@ -67,8 +69,8 @@ download_core() { ( cd "$TMP_DIR" rm -rf "$DIR" - tar -xzf "$TAR" - mv core "$DIR-$VERSION" + "$UNTAR" "$TAR" + mv "$UNTARRED_DIR" "$DIR-$VERSION" ) ( @@ -84,7 +86,7 @@ check_release_notes() { } if [ ! -e "vendor/$CORE_DIR" ]; then - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core elif [ -d "vendor/$CORE_DIR" -a -d ../realm-core -a ! -L "vendor/$CORE_DIR" ]; then # Allow newer versions than expected for local builds as testing # with unreleased versions is one of the reasons to use a local build @@ -96,19 +98,19 @@ elif [ -d "vendor/$CORE_DIR" -a -d ../realm-core -a ! -L "vendor/$CORE_DIR" ]; t elif [ ! -L "vendor/$CORE_DIR" ]; then echo "vendor/$CORE_DIR is not a symlink. Deleting..." rm -rf "vendor/$CORE_DIR" - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core # With a prebuilt version we only want to check the first non-empty # line so that checking out an older commit will download the # appropriate version of core if the already-present version is too new elif ! grep -m 1 . "vendor/$CORE_DIR/CHANGELOG.txt" | check_release_notes; then - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core else echo "The core library seems to be up to date." fi if [ ! -e "vendor/$SYNC_DIR" ]; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then # Allow newer versions than expected for local builds as testing # with unreleased versions is one of the reasons to use a local build @@ -120,12 +122,12 @@ elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; t elif [ ! -L "vendor/$SYNC_DIR" ]; then echo "vendor/$SYNC_DIR is not a symlink. Deleting..." rm -rf "vendor/$SYNC_DIR" - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION # With a prebuilt version we only want to check the first non-empty # line so that checking out an older commit will download the # appropriate version of core if the already-present version is too new elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt" | check_release_notes; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION else echo "The sync library seems to be up to date." fi diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index ad41ad71..2472ff5f 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -75,8 +75,8 @@ "conditions": [ ["realm_enable_sync", { "all_dependent_settings": { - "include_dirs": [ "<(module_root_dir)/vendor/realm-sync/include" ], - "library_dirs": [ "<(module_root_dir)/vendor/realm-sync/osx" ] + "include_dirs": [ "<(module_root_dir)/vendor/sync/include" ], + "library_dirs": [ "<(module_root_dir)/vendor/sync/osx" ] } }, { "all_dependent_settings": { From c9579dafd12ab24f828c1d9de96f685be68566f6 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Wed, 9 Nov 2016 17:28:47 +0100 Subject: [PATCH 036/100] Enable build with sync when running tests --- scripts/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index b5134f89..ad4c5747 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -176,7 +176,7 @@ case "$TARGET" in "node") download_server start_server - npm install --build-from-source + npm install --build-from-source --realm_enable_sync # Change to a temp directory. cd "$(mktemp -q -d -t realm.node.XXXXXX)" @@ -217,7 +217,7 @@ case "$TARGET" in touch "tests/sync-bundle/object-server/do_not_open_browser" ;; "object-server-integration") - echo -e "yes\n" | ./tests/sync-bundle/reset-server-realms.command + echo -e "yes\n" | ./tests/sync-bundle/reset-server-realms.command pushd "$SRCROOT/tests" npm install From 397dbbd2e516fb3ff6c5e553c28ec5368973ae90 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Wed, 9 Nov 2016 17:44:37 +0100 Subject: [PATCH 037/100] Download node --- scripts/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/test.sh b/scripts/test.sh index ad4c5747..fc8c9019 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -176,6 +176,7 @@ case "$TARGET" in "node") download_server start_server + bash "$SRCROOT/scripts/download-core.sh" npm install --build-from-source --realm_enable_sync # Change to a temp directory. From b8c5bafd245508776057fbb5f24176fec47c37ae Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Wed, 9 Nov 2016 17:51:19 +0100 Subject: [PATCH 038/100] Fix untarring core --- scripts/download-core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 47e14ab0..ba58a53d 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -69,7 +69,7 @@ download_core() { ( cd "$TMP_DIR" rm -rf "$DIR" - "$UNTAR" "$TAR" + eval "$UNTAR" "$TAR" mv "$UNTARRED_DIR" "$DIR-$VERSION" ) From 9833b8e49048edc7a6a595914a51af17dbdecc7d Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Wed, 9 Nov 2016 19:07:26 +0100 Subject: [PATCH 039/100] Build macOS with sync by default --- scripts/test.sh | 3 +-- src/node/gyp/realm.gyp | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index fc8c9019..29440257 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -176,8 +176,7 @@ case "$TARGET" in "node") download_server start_server - bash "$SRCROOT/scripts/download-core.sh" - npm install --build-from-source --realm_enable_sync + npm install --build-from-source # Change to a temp directory. cd "$(mktemp -q -d -t realm.node.XXXXXX)" diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index 2472ff5f..f1e42955 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -1,8 +1,18 @@ { "variables": { - "use_realm_debug": " Date: Wed, 9 Nov 2016 12:50:19 -0800 Subject: [PATCH 040/100] Make it possible to run test suite with and without sync --- scripts/test.sh | 16 ++++++++++++++-- tests/package.json | 5 +++-- tests/spec/sync_tests.js | 34 ++++++++++++++++++++++++++++++++++ tests/spec/unit_tests.js | 15 --------------- 4 files changed, 51 insertions(+), 19 deletions(-) create mode 100644 tests/spec/sync_tests.js diff --git a/scripts/test.sh b/scripts/test.sh index 29440257..38b47b2f 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -184,10 +184,22 @@ case "$TARGET" in pushd "$SRCROOT/tests" npm install - npm test + npm run test popd stop_server ;; +"node-nosync") + npm install --build-from-source + + # Change to a temp directory. + cd "$(mktemp -q -d -t realm.node.XXXXXX)" + trap "rm -rf '$PWD'" EXIT + + pushd "$SRCROOT/tests" + npm install + npm run test-nosync + popd + ;; "test-runners") npm install --build-from-source @@ -221,7 +233,7 @@ case "$TARGET" in pushd "$SRCROOT/tests" npm install - npm run test-sync + npm run test-sync-integration popd ;; *) diff --git a/tests/package.json b/tests/package.json index 4dea192f..a137ee93 100644 --- a/tests/package.json +++ b/tests/package.json @@ -13,8 +13,9 @@ "url-parse": "^1.1.7" }, "scripts": { - "test": "jasmine spec/unit_tests.js", - "test-sync": "jasmine spec/sync_integration_tests.js", + "test": "jasmine spec/unit_tests.js spec/sync_tests.js", + "test-nosync": "jasmine spec/unit_tests.js", + "test-sync-integration": "jasmine spec/sync_integration_tests.js", "postinstall": "rm -f node_modules/realm && ln -s ../.. node_modules/realm" } } diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js new file mode 100644 index 00000000..ef7206e9 --- /dev/null +++ b/tests/spec/sync_tests.js @@ -0,0 +1,34 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Realm Inc. +// +// 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. +// +//////////////////////////////////////////////////////////////////////////// + +/* eslint-env es6, node */ +/* eslint-disable no-console */ + +'use strict'; + +const Realm = require('realm'); + +const userTests = require('../js/user-tests'); +describe('SyncTests', () => { + beforeEach(() => Realm.clearTestState()); + afterEach(() => Realm.clearTestState()); + + for (const testName in userTests) { + it(testName, (done) => userTests[testName]().catch((e) => fail(e)).then(done)); + } +}); diff --git a/tests/spec/unit_tests.js b/tests/spec/unit_tests.js index 2655924a..593c84dd 100644 --- a/tests/spec/unit_tests.js +++ b/tests/spec/unit_tests.js @@ -76,18 +76,3 @@ describe('AsyncTests', () => { afterEach(() => Realm.clearTestState()); }); - -const wn = require("child_process").spawn; -const terminate = require("terminate"); -const readline = require("readline"); -const tmp = require("tmp"); - -const userTests = require('../js/user-tests'); -describe('SyncTests', () => { - beforeEach(() => Realm.clearTestState()); - afterEach(() => Realm.clearTestState()); - - for (const testName in userTests) { - it(testName, (done) => userTests[testName]().catch((e) => fail(e)).then(done)); - } -}); From 4fc874f35c347a90b744686556e271debda05d7d Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 9 Nov 2016 15:01:42 -0800 Subject: [PATCH 041/100] some small fixes for download-core script --- scripts/download-core.sh | 21 +++++++++++++-------- src/node/gyp/realm.gyp | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index ba58a53d..3aeee2e5 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -15,25 +15,30 @@ fi # The 'node' argument will result in realm-node build being downloaded. if [ "$1" = 'node' ]; then CORE_DIR="core-node" + SYNC_DIR='node-sync' if [ "$(uname)" = 'Darwin' ]; then PLATFORM_TAG="node-osx-" + SYNC_PLATFORM_TAG="node-cocoa-" CORE_DOWNLOAD_FILE="realm-core-node-osx-$REALM_CORE_VERSION.tar.gz" else PLATFORM_TAG="node-linux-" + SYNC_PLATFORM_TAG="node-cocoa-" CORE_DOWNLOAD_FILE="realm-core-node-linux-$REALM_CORE_VERSION.tar.gz" fi + SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.zip" + SYNC_EXTRACT="unzip" + EXTRACTED_DIR="realm-sync-node-cocoa-$REALM_SYNC_VERSION" else CORE_DIR='core' PLATFORM_TAG="" + SYNC_DIR='sync' CORE_DOWNLOAD_FILE="realm-core-$PLATFORM_TAG$REALM_CORE_VERSION.tar.xz" + SYNC_DOWNLOAD_FILE="realm-sync-cocoa-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.tar.xz" + SYNC_EXTRACT="tar -xvf" + EXTRACTED_DIR="core" fi -SYNC_DIR='sync' -SYNC_PLATFORM_TAG="node-cocoa-" - -SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.zip" - # Start current working directory at the root of the project. cd "$(dirname "$0")/.." @@ -110,7 +115,7 @@ fi if [ ! -e "vendor/$SYNC_DIR" ]; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then # Allow newer versions than expected for local builds as testing # with unreleased versions is one of the reasons to use a local build @@ -122,12 +127,12 @@ elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; t elif [ ! -L "vendor/$SYNC_DIR" ]; then echo "vendor/$SYNC_DIR is not a symlink. Deleting..." rm -rf "vendor/$SYNC_DIR" - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR # With a prebuilt version we only want to check the first non-empty # line so that checking out an older commit will download the # appropriate version of core if the already-present version is too new elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt" | check_release_notes; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "unzip" realm-sync-node-cocoa-$REALM_SYNC_VERSION + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR else echo "The sync library seems to be up to date." fi diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index f1e42955..e89775f3 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -93,8 +93,8 @@ "conditions": [ ["realm_enable_sync", { "all_dependent_settings": { - "include_dirs": [ "<(module_root_dir)/vendor/sync/include" ], - "library_dirs": [ "<(module_root_dir)/vendor/sync/osx" ] + "include_dirs": [ "<(module_root_dir)/vendor/node-sync/include" ], + "library_dirs": [ "<(module_root_dir)/vendor/node-sync/osx" ] } }, { "all_dependent_settings": { From 85c655a91c4e140d5d60d1e9f8fc9c79599a29be Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 9 Nov 2016 17:46:26 -0800 Subject: [PATCH 042/100] fix for constructor destruction after timeout --- src/js_realm.hpp | 6 +++--- src/js_types.hpp | 5 +++++ src/jsc/jsc_protected.hpp | 7 +++++++ src/node/node_protected.hpp | 22 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 9634a431..a670224c 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -147,7 +147,7 @@ class RealmClass : public ClassDefinition> { public: static FunctionType create_constructor(ContextType); - static Protected s_constructor; + static Global s_constructor; // methods static void objects(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); @@ -258,7 +258,7 @@ public: }; template -Protected RealmClass::s_constructor; +Global RealmClass::s_constructor; template inline typename T::Function RealmClass::create_constructor(ContextType ctx) { @@ -279,7 +279,7 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); #endif - s_constructor = Protected(ctx, realm_constructor); + s_constructor = Global(ctx, realm_constructor); return realm_constructor; } diff --git a/src/js_types.hpp b/src/js_types.hpp index 6c2e78a1..7cd56b91 100644 --- a/src/js_types.hpp +++ b/src/js_types.hpp @@ -258,6 +258,11 @@ class Protected { }; }; +template +class Global { + operator ValueType() const; +}; + template struct Exception : public std::runtime_error { using ContextType = typename T::Context; diff --git a/src/jsc/jsc_protected.hpp b/src/jsc/jsc_protected.hpp index 10c25fa1..d569fc89 100644 --- a/src/jsc/jsc_protected.hpp +++ b/src/jsc/jsc_protected.hpp @@ -119,5 +119,12 @@ class Protected : public Protected { } }; +template<> +class Global : public Protected { + public: + Global() : Protected() {} + Global(JSContextRef ctx, JSObjectRef value) : Protected(ctx, value) {} +}; + } // js } // realm diff --git a/src/node/node_protected.hpp b/src/node/node_protected.hpp index c48cc027..97ac12da 100644 --- a/src/node/node_protected.hpp +++ b/src/node/node_protected.hpp @@ -94,5 +94,27 @@ class Protected : public node::Protected { Protected(v8::Isolate* isolate, v8::Local object) : node::Protected(object) {} }; +template +struct GlobalCopyablePersistentTraits { + typedef v8::Persistent> CopyablePersistent; + static const bool kResetInDestructor = false; + template + static inline void Copy(const v8::Persistent &source, CopyablePersistent *dest) {} +}; + +template<> +class Global { + // TODO: Figure out why Nan::CopyablePersistentTraits causes a build failure. + Nan::Persistent> m_value; + +public: + Global() {} + Global(v8::Isolate* isolate, v8::Local value) : m_value(value) {} + + operator v8::Local() const { + return Nan::New(m_value); + } +}; + } // js } // realm From 3e37795d62049c8e39be9379f105a068bd54bee4 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Wed, 9 Nov 2016 18:01:56 -0800 Subject: [PATCH 043/100] fix for unregistering notifications in a notification --- src/js_realm.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index a670224c..456abf87 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -120,7 +120,8 @@ class RealmDelegate : public BindingContext { arguments[0] = realm_object; arguments[1] = Value::from_string(m_context, notification_name); - for (auto &callback : m_notifications) { + std::list> notifications_copy(m_notifications); + for (auto &callback : notifications_copy) { Function::call(m_context, callback, realm_object, 2, arguments); } } From c5c451ed18532119b4280b0d055750d1b4a00854 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 04:23:34 -0800 Subject: [PATCH 044/100] remove invalid resource --- src/RealmJS.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index b0ecb740..3a036d4f 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -26,7 +26,6 @@ 02879D8C1DC29D5600777A5D /* package.json in Resources */ = {isa = PBXBuildFile; fileRef = 02879D8B1DC29D5600777A5D /* package.json */; }; 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02D041F61CE11159000E4250 /* dates-v3.realm */; }; 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; - 02E265691DC1896100BBDB04 /* request in Resources */ = {isa = PBXBuildFile; fileRef = 02E265681DC1896100BBDB04 /* request */; }; 02E315C91DB80DDD00555337 /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C31DB80DDD00555337 /* sync_manager.cpp */; }; 02E315CA1DB80DDD00555337 /* sync_session.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C51DB80DDD00555337 /* sync_session.cpp */; }; 02E315CB1DB80DDD00555337 /* sync_user.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C71DB80DDD00555337 /* sync_user.cpp */; }; @@ -159,7 +158,6 @@ 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RealmJSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 02D041F61CE11159000E4250 /* dates-v3.realm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "dates-v3.realm"; sourceTree = ""; }; - 02E265681DC1896100BBDB04 /* request */ = {isa = PBXFileReference; lastKnownFileType = folder; name = request; path = "../tests/react-test-app/node_modules/request"; sourceTree = ""; }; 02E315C21DB80DDD00555337 /* sync_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_config.hpp; path = src/sync/sync_config.hpp; sourceTree = ""; }; 02E315C31DB80DDD00555337 /* sync_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sync_manager.cpp; path = src/sync/sync_manager.cpp; sourceTree = ""; }; 02E315C41DB80DDD00555337 /* sync_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sync_manager.hpp; path = src/sync/sync_manager.hpp; sourceTree = ""; }; @@ -396,7 +394,6 @@ 02B58CA71AE99CEB009B348C = { isa = PBXGroup; children = ( - 02E265681DC1896100BBDB04 /* request */, 02B58CCF1AE99D8C009B348C /* Frameworks */, F6C3FBB41BF680D000E6FFD4 /* Vendor */, 0270BC3D1B7CFBFD00010E03 /* RealmJS */, @@ -830,7 +827,6 @@ F6BCCFE21C8380A400FE31AE /* lib in Resources */, 02879D8C1DC29D5600777A5D /* package.json in Resources */, 02414B881CE68CA200A8669F /* dates-v5.realm in Resources */, - 02E265691DC1896100BBDB04 /* request in Resources */, F61378791C18EAC5008BFC51 /* js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; From dff6c833ff96a1bf56378fe73ff88d2b9ffd29ed Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 04:28:58 -0800 Subject: [PATCH 045/100] hack to install yarn on ci --- scripts/test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/test.sh b/scripts/test.sh index 38b47b2f..952364ae 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -110,6 +110,8 @@ case "$TARGET" in npm run jsdoc ;; "realmjs") + #HACK + brew install yarn pushd src xctest RealmJS ;; From 6a257d594ef977a4f22b116ffbe1b6647b75e3b1 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 04:42:07 -0800 Subject: [PATCH 046/100] only npm install actual dependencies --- src/RealmJS.xcodeproj/project.pbxproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 3a036d4f..8f606d41 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -23,7 +23,6 @@ 02414BA91CE6ABCF00A8669F /* collection_notifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B961CE6AADD00A8669F /* collection_notifications.cpp */; }; 0270BC821B7D020100010E03 /* RealmJSTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC7B1B7D020100010E03 /* RealmJSTests.mm */; }; 027A23131CD3E379000543AE /* libRealmJS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */; }; - 02879D8C1DC29D5600777A5D /* package.json in Resources */ = {isa = PBXBuildFile; fileRef = 02879D8B1DC29D5600777A5D /* package.json */; }; 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */ = {isa = PBXBuildFile; fileRef = 02D041F61CE11159000E4250 /* dates-v3.realm */; }; 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; 02E315C91DB80DDD00555337 /* sync_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02E315C31DB80DDD00555337 /* sync_manager.cpp */; }; @@ -825,7 +824,6 @@ files = ( 02D041F71CE11159000E4250 /* dates-v3.realm in Resources */, F6BCCFE21C8380A400FE31AE /* lib in Resources */, - 02879D8C1DC29D5600777A5D /* package.json in Resources */, 02414B881CE68CA200A8669F /* dates-v5.realm in Resources */, F61378791C18EAC5008BFC51 /* js in Resources */, ); @@ -846,7 +844,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd \"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH\"\nyarn install "; + shellScript = "cd \"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH\"\nyarn add needle url-parse"; }; F613787A1C18F003008BFC51 /* Copy Query Tests */ = { isa = PBXShellScriptBuildPhase; From b38c428e827ba484121ce107e6f0da0f682ba415 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Thu, 10 Nov 2016 13:51:37 +0100 Subject: [PATCH 047/100] Use dependencies.list Fixes #644 --- dependencies.list | 5 +++-- package.json | 3 ++- scripts/download-core.sh | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/dependencies.list b/dependencies.list index a19e1436..6e4c7a6b 100644 --- a/dependencies.list +++ b/dependencies.list @@ -1,4 +1,5 @@ PACKAGE_NAME=realm-js -VERSION=1.0.0-BETA-1.0 -REALM_SYNC_VERSION=1.0.0-BETA-3.1 +VERSION=0.14.3-6 +REALM_CORE_VERSION=2.1.4 +REALM_SYNC_VERSION=1.0.0-BETA-3.3 REALM_OBJECT_SERVER_VERSION=1.0.0-BETA-2.1 diff --git a/package.json b/package.json index 7fde0825..2aaa3fa4 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "scripts", "src", "vendor", - "binding.gyp" + "binding.gyp", + "dependencies.list", ], "scripts": { "get-version": "echo $npm_package_version", diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 3aeee2e5..10f82949 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -3,9 +3,11 @@ set -e set -o pipefail +source_root="$(dirname "$0")" + # Set to "latest" for the latest build. -: ${REALM_CORE_VERSION:=2.1.4} -: ${REALM_SYNC_VERSION:=1.0.0-BETA-3.3} +: ${REALM_CORE_VERSION:=$(sed -n 's/^REALM_CORE_VERSION=\(.*\)$/\1/p' ${source_root}/../dependencies.list)} +: ${REALM_SYNC_VERSION:=$(sed -n 's/^REALM_SYNC_VERSION=\(.*\)$/\1/p' ${source_root}/../dependencies.list)} if [ "$1" = '--version' ]; then echo "$REALM_CORE_VERSION" From 63371d1e2bbb8f94456a7ee4bcb39fbdc37a070d Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Thu, 10 Nov 2016 13:57:06 +0100 Subject: [PATCH 048/100] Fix package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2aaa3fa4..3d0362e3 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "src", "vendor", "binding.gyp", - "dependencies.list", + "dependencies.list" ], "scripts": { "get-version": "echo $npm_package_version", From 8ad43b0505843004f16ca1ca0647c39afed5a91d Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Thu, 10 Nov 2016 14:42:58 +0100 Subject: [PATCH 049/100] Do not use sync on linux --- scripts/download-core.sh | 43 +++++++++++++++++++++------------------- scripts/test.sh | 11 +++++++--- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 10f82949..44d81b77 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -23,12 +23,14 @@ if [ "$1" = 'node' ]; then PLATFORM_TAG="node-osx-" SYNC_PLATFORM_TAG="node-cocoa-" CORE_DOWNLOAD_FILE="realm-core-node-osx-$REALM_CORE_VERSION.tar.gz" + SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.zip" else PLATFORM_TAG="node-linux-" SYNC_PLATFORM_TAG="node-cocoa-" CORE_DOWNLOAD_FILE="realm-core-node-linux-$REALM_CORE_VERSION.tar.gz" + SYNC_DOWNLOAD_FILE="" fi - SYNC_DOWNLOAD_FILE="realm-sync-$SYNC_PLATFORM_TAG$REALM_SYNC_VERSION.zip" + SYNC_EXTRACT="unzip" EXTRACTED_DIR="realm-sync-node-cocoa-$REALM_SYNC_VERSION" else @@ -115,26 +117,27 @@ else echo "The core library seems to be up to date." fi - -if [ ! -e "vendor/$SYNC_DIR" ]; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR -elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then - # Allow newer versions than expected for local builds as testing - # with unreleased versions is one of the reasons to use a local build - if ! check_release_notes "vendor/$SYNC_DIR/version.txt"; then - die "Local build of sync is out of date." +if [ -n "$SYNC_DOWNLOAD_FILE" ];then + if [ ! -e "vendor/$SYNC_DIR" ]; then + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then + # Allow newer versions than expected for local builds as testing + # with unreleased versions is one of the reasons to use a local build + if ! check_release_notes "vendor/$SYNC_DIR/version.txt"; then + die "Local build of sync is out of date." + else + echo "The sync library seems to be up to date." + fi + elif [ ! -L "vendor/$SYNC_DIR" ]; then + echo "vendor/$SYNC_DIR is not a symlink. Deleting..." + rm -rf "vendor/$SYNC_DIR" + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + # With a prebuilt version we only want to check the first non-empty + # line so that checking out an older commit will download the + # appropriate version of core if the already-present version is too new + elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt" | check_release_notes; then + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR else echo "The sync library seems to be up to date." fi -elif [ ! -L "vendor/$SYNC_DIR" ]; then - echo "vendor/$SYNC_DIR is not a symlink. Deleting..." - rm -rf "vendor/$SYNC_DIR" - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR -# With a prebuilt version we only want to check the first non-empty -# line so that checking out an older commit will download the -# appropriate version of core if the already-present version is too new -elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt" | check_release_notes; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR -else - echo "The sync library seems to be up to date." fi diff --git a/scripts/test.sh b/scripts/test.sh index 952364ae..c54937b7 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -176,8 +176,13 @@ case "$TARGET" in cat tests.xml ;; "node") - download_server - start_server + if [ "$(uname)" = 'Darwin' ]; then + download_server + start_server + npm_tests_cmd="npm run test" + else + npm_tests_cmd="npm run test-nosync" + fi npm install --build-from-source # Change to a temp directory. @@ -186,7 +191,7 @@ case "$TARGET" in pushd "$SRCROOT/tests" npm install - npm run test + eval $npm_tests_cmd popd stop_server ;; From e954184d68900c0b68d16e68659a7466455288c7 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 06:46:21 -0800 Subject: [PATCH 050/100] use xcpretty --- scripts/test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/test.sh b/scripts/test.sh index 952364ae..539d6fd0 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -11,6 +11,7 @@ CONFIGURATION="${2:-"Release"}" DESTINATION= PATH="/opt/android-sdk-linux/platform-tools:$PATH" SRCROOT=$(cd "$(dirname "$0")/.." && pwd) +XCPRETTY=true # Start current working directory at the root of the project. cd "$SRCROOT" From 3b91ca94f4ac830d56e3ea0c5ffe052ee8266745 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 06:58:03 -0800 Subject: [PATCH 051/100] use updated object store --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index 7fa8f419..f0301af3 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit 7fa8f41906d4d7e2aa9ab8048eacae3a073e8b7e +Subproject commit f0301af3ece6e2b3cc84a741cfb19ecf9ea20064 From 0495c1f9068b79b64a6c063533d4edd26b9e6ccf Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 08:51:14 -0800 Subject: [PATCH 052/100] fixed object store --- src/object-store | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object-store b/src/object-store index f0301af3..1c2f3a76 160000 --- a/src/object-store +++ b/src/object-store @@ -1 +1 @@ -Subproject commit f0301af3ece6e2b3cc84a741cfb19ecf9ea20064 +Subproject commit 1c2f3a7607467ed904a81a4824d0cbda33cc0ebb From 313ca1c3cfb64e5ec30251875d037281f5099718 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 10:06:48 -0800 Subject: [PATCH 053/100] improved ci script --- scripts/test.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/test.sh b/scripts/test.sh index 539d6fd0..8623f28b 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -83,7 +83,11 @@ start_packager() { xctest() { local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then - xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test | xcpretty -c --no-utf --report junit --output build/reports/junit.xml + mkdir -p build + xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test | tee build/build.log | xcpretty -c --no-utf --report junit --output build/reports/junit.xml || { + echo "The raw xcodebuild output is available in build/build.log" + exit 1 + } else xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test fi From 5080c54b23a19e74efca845777e1782bc762e292 Mon Sep 17 00:00:00 2001 From: Adam Lebsack Date: Thu, 10 Nov 2016 19:12:59 +0100 Subject: [PATCH 054/100] Added docker-test.sh wrapper for running linux tests --- Dockerfile | 41 ++----------- scripts/docker-test.sh | 18 ++++++ scripts/docker_build_wrapper.sh | 103 ++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 35 deletions(-) create mode 100755 scripts/docker-test.sh create mode 100755 scripts/docker_build_wrapper.sh diff --git a/Dockerfile b/Dockerfile index 2cf955cc..fe46cd45 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,8 @@ -FROM node:6 +FROM ubuntu:xenial -# Make debugging quicker. -RUN apt-get update && apt-get install -y gdb vim +RUN apt-get update && \ + apt-get install -y curl && \ + curl -sL https://deb.nodesource.com/setup_4.x | bash - && \ + apt-get install -y nodejs gcc-4.9 python build-essential -# Add non-root user. -RUN useradd -ms /bin/bash user - -# Make our workspace directory and work from there. -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -# Get the node_modules setup before anything else. -COPY package.json . -RUN npm install - -# Make sure core is downloaded. -COPY scripts/download-core.sh scripts/ -RUN scripts/download-core.sh node - -# Copy only what we need to build. -COPY src/ src/ - -# Build the Debug version of the module. -RUN src/node/build-node.sh Debug - -# Copy everything else needed to run tests. -COPY lib/ lib/ -COPY scripts/ scripts/ -COPY tests/ tests/ - -# Switch to the non-root user. -RUN chown -R user . -USER user - -# Default to running the Node tests -CMD ["node", "tests"] +ENV NPM_CONFIG_UNSAFE_PERM true diff --git a/scripts/docker-test.sh b/scripts/docker-test.sh new file mode 100755 index 00000000..d27b5ec1 --- /dev/null +++ b/scripts/docker-test.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# This is a wrapper script around ./scripts/test.sh which uses docker. The +# arguments are the same, as they are passed directly to test.sh. +# It can be used to locally check and debug the linux build process +# outside of CI. + +set -e + +./scripts/docker_build_wrapper.sh ci/realm-js:build . + +exec docker run -it --rm \ + -u $(id -u) \ + -e HOME=/tmp \ + -v $(pwd):/source \ + -w /source \ + ci/realm-js:build \ + ./scripts/test.sh $@ + diff --git a/scripts/docker_build_wrapper.sh b/scripts/docker_build_wrapper.sh new file mode 100755 index 00000000..0bb97de9 --- /dev/null +++ b/scripts/docker_build_wrapper.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# This is a wrapper script around `docker build`. It provides a mechanism +# for using cached image layers from upstream repositories as well as an +# automatic push back to the docker registry. + +set -e + +script_path="$(pushd "$(dirname "$0")" >/dev/null; pwd)" +src_path="$(pushd "${script_path}/.." >/dev/null; pwd)" + +die() { echo "$@" 1>&2 ; exit 1; } +info() { echo "===> $*"; } + +docker_build() { + declare name="$1"; shift + declare path="$1"; shift + declare args="$*" + + if [ "${DOCKER_REGISTRY}" != "" ]; then + remote_name="${DOCKER_REGISTRY}/${name}" + fi + + info "Building ${name} image..." + if [ "${DOCKER_REGISTRY}" != "" ]; then + docker_pull "${remote_name}" && docker tag "${remote_name}" "${name}" || true + fi + + old_id=$(docker images -q "${name}") + info "Old ${name} image id: ${old_id}" + + if [ "${DOCKERFILE}" != "" ]; then + docker build ${args} -t "${name}" -f "${DOCKERFILE}" "${path}" || \ + die "Building ${name} image failed" + else + docker build ${args} -t "${name}" "${path}" || \ + die "Building ${name} image failed" + fi + + new_id=$(docker images -q "${name}") + info "New ${name} image id: ${new_id}" + + if [ "${DEBUG}" ] && [ "${new_id}" != "${old_id}" ]; then + info "History for old id $old_id:" + if [ "${old_id}" != "" ]; then + docker history "$old_id" + fi + + info "History for new id $new_id:" + docker history "$new_id" + fi + + if [ "${DOCKER_PUSH:-0}" != "0" ] && [ "${DOCKER_REGISTRY}" != "" ]; then + docker tag "${name}" "${remote_name}" + docker_push "${remote_name}" + fi +} + +# Due to https://github.com/docker/docker/issues/20316, we use +# https://github.com/tonistiigi/buildcache to generate a cache of the layer +# metadata for later builds. +my_buildcache() { + if [ "$DOCKER_REGISTRY" != "" ]; then + + docker_path="/var/lib/docker" + + # Stupid hack for our AWS nodes, which have docker data on another volume + if [ -d "/mnt/docker" ]; then + docker_path="/mnt/docker" + fi + + docker pull "${DOCKER_REGISTRY}/ci/buildcache" >/dev/null && \ + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v ${docker_path}:/var/lib/docker \ + "${DOCKER_REGISTRY}/ci/buildcache" "$@" + fi +} + +docker_pull() { + info "Attempting to pull '$1' image from registry..." + ( + tmpdir=$(mktemp -d) + docker pull "$1" + ( + # In addition, pull the cached metadata and load it (buildcache) + cd "${tmpdir}" && docker pull "$1-cache" && docker save "$1-cache" | \ + tar -xf - && docker load -i ./*/layer.tar + ) + rm -rf "${tmpdir}" + ) || true +} + +docker_push() { + info "Pushing '$1' image to registry..." + docker push "$1" + # Create a cache of the layer metdata we need and push it as an image + #docker rmi $1-cache 2>/dev/null || true + my_buildcache save -g /var/lib/docker "$1" | gunzip -c | \ + docker import - "$1-cache" && \ + docker push "$1-cache" +} + +docker_build $@ From 97b5101c5e9c92def9fe3dbac9e8de1a24350d7e Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 10:19:46 -0800 Subject: [PATCH 055/100] no xcpretty --- scripts/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test.sh b/scripts/test.sh index 8623f28b..9c5b98a0 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -11,7 +11,7 @@ CONFIGURATION="${2:-"Release"}" DESTINATION= PATH="/opt/android-sdk-linux/platform-tools:$PATH" SRCROOT=$(cd "$(dirname "$0")/.." && pwd) -XCPRETTY=true +#XCPRETTY=true # Start current working directory at the root of the project. cd "$SRCROOT" From 6b8fa6bf160c4edcf5d7579e37b59b822ce59998 Mon Sep 17 00:00:00 2001 From: Adam Lebsack Date: Thu, 10 Nov 2016 19:28:39 +0100 Subject: [PATCH 056/100] Do not run docker interactively --- scripts/docker-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker-test.sh b/scripts/docker-test.sh index d27b5ec1..0a5f6f9d 100755 --- a/scripts/docker-test.sh +++ b/scripts/docker-test.sh @@ -8,7 +8,7 @@ set -e ./scripts/docker_build_wrapper.sh ci/realm-js:build . -exec docker run -it --rm \ +exec docker run --rm \ -u $(id -u) \ -e HOME=/tmp \ -v $(pwd):/source \ From 5b3825092d518928972eb4fe36a7e02af767165c Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 10:32:59 -0800 Subject: [PATCH 057/100] updated simulator script --- scripts/reset-simulators.sh | 68 +++++++++++++++---------------------- scripts/test.sh | 4 +++ 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/scripts/reset-simulators.sh b/scripts/reset-simulators.sh index 3404b145..d7045a0a 100755 --- a/scripts/reset-simulators.sh +++ b/scripts/reset-simulators.sh @@ -3,57 +3,45 @@ set -o pipefail set -e +source "$(dirname "$0")/swift-version.sh" + while pgrep -q Simulator; do # Kill all the current simulator processes as they may be from a # different Xcode version pkill Simulator 2>/dev/null || true # CoreSimulatorService doesn't exit when sent SIGTERM pkill -9 Simulator 2>/dev/null || true - done - -# Shut down simulators until there's no booted ones left -# Only do one at a time because devices sometimes show up multiple times -while xcrun simctl list | grep -q Booted; do - xcrun simctl list | grep Booted | sed 's/.* (\(.*\)) (Booted)/\1/' | head -n 1 | xargs xcrun simctl shutdown done -# Clean up all available simulators -( - previous_device='' - IFS=$'\n' # make newlines the only separator - for LINE in $(xcrun simctl list); do - if [[ $LINE =~ unavailable || $LINE =~ disconnected ]]; then - # skip unavailable simulators - continue - fi +# Run until we get a result since switching simulator versions often causes CoreSimulatorService to throw an exception. +devices="" +until [ "$devices" != "" ]; do + devices="$(xcrun simctl list devices -j || true)" +done - if [[ $LINE =~ "--" ]]; then - # Reset the last seen device so we won't consider devices with the same name to be duplicates - # if they appear in different sections. - previous_device="" - continue - fi +# Shut down booted simulators +echo "$devices" | ruby -rjson -e 'puts JSON.parse($stdin.read)["devices"].flat_map { |d| d[1] }.select { |d| d["state"] == "Booted" && d["availability"] == "(available)" }.map { |d| d["udid"] }' | while read udid; do + echo "shutting down simulator with ID: $udid" + xcrun simctl shutdown $udid +done - regex='^(.*) [(]([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})[)]' - if [[ $LINE =~ $regex ]]; then - device="${BASH_REMATCH[1]}" - guid="${BASH_REMATCH[2]}" +# Erase all available simulators +echo "erasing simulators" +echo "$devices" | ruby -rjson -e 'puts JSON.parse($stdin.read)["devices"].flat_map { |d| d[1] }.select { |d| d["availability"] == "(available)" }.map { |d| d["udid"] }' | while read udid; do + xcrun simctl erase $udid & +done +wait - # Delete the simulator if it's a duplicate of the last seen one - # Otherwise delete all contents and settings for it - if [[ $device == $previous_device ]]; then - xcrun simctl delete $guid - else - xcrun simctl erase $guid - previous_device="$device" - fi - fi - done -) - -if [[ -a "${DEVELOPER_DIR}/Applications/iOS Simulator.app" ]]; then - open "${DEVELOPER_DIR}/Applications/iOS Simulator.app" -elif [[ -a "${DEVELOPER_DIR}/Applications/Simulator.app" ]]; then +if [[ -a "${DEVELOPER_DIR}/Applications/Simulator.app" ]]; then open "${DEVELOPER_DIR}/Applications/Simulator.app" fi +# Wait until the boot completes +echo "waiting for simulator to boot..." +until xcrun simctl list devices -j | ruby -rjson -e 'exit JSON.parse($stdin.read)["devices"].flat_map { |d| d[1] }.any? { |d| d["availability"] == "(available)" && d["state"] == "Booted" }'; do + sleep 1 +done + +# Wait until the simulator is fully booted by waiting for it to launch SpringBoard +xcrun simctl launch booted com.apple.springboard >/dev/null 2>&1 || true +echo "simulator booted" \ No newline at end of file diff --git a/scripts/test.sh b/scripts/test.sh index 9c5b98a0..d64502ab 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -81,6 +81,10 @@ start_packager() { } xctest() { + if ! [ -z "${JENKINS_HOME}" ]; then + ${SRCROOT}/scripts/reset-simulators.sh + fi + local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then mkdir -p build From 164ea8ec7918654c0e640da5b129b84f2a4d9e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Thu, 10 Nov 2016 10:34:39 -0800 Subject: [PATCH 058/100] Port over remaining tests for Realm.Sync.User --- tests/js/asserts.js | 16 ++++- tests/js/user-tests.js | 139 +++++++++++++++++++++++++++++++-------- tests/spec/sync_tests.js | 1 + 3 files changed, 129 insertions(+), 27 deletions(-) diff --git a/tests/js/asserts.js b/tests/js/asserts.js index fae31ea6..59f374fb 100644 --- a/tests/js/asserts.js +++ b/tests/js/asserts.js @@ -106,10 +106,24 @@ module.exports = { assertTrue: function(condition, errorMessage) { if (!condition) { - throw new TestFailureError(errorMessage || 'Condition expected to be true'); + throw new TestFailureError(errorMessage || `Condition ${condition} expected to be true`); } }, + assertInstanceOf: function(object, type, errorMessage) { + if (!(object instanceof type)) { + throw new TestFailureError(errorMessage || `Object ${object} expected to be of type ${type}`); + } + }, + + assertType: function(value, type) { + this.assertEqual(typeof value, type, `Value ${value} expected to be of type ${type}`); + }, + + assertUndefined: function(value) { + this.assertEqual(value, undefined, `Value ${value} expected to be undefined`); + }, + isNode: function() { // eslint-disable-next-line no-undef return typeof process == 'object' && Object.prototype.toString.call(process) == '[object process]'; diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 91e94512..2c5763c0 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -31,18 +31,46 @@ function uuid() { }); } +function assertIsUser(user, isAdmin) { + TestCase.assertType(user, 'object'); + TestCase.assertType(user.token, 'string'); + TestCase.assertType(user.identity, 'string'); + TestCase.assertInstanceOf(user, Realm.Sync.User); + if (isAdmin !== undefined) { + TestCase.assertEqual(user.isAdmin, isAdmin); + } +} + +function assertIsError(error, code) { + TestCase.assertInstanceOf(error, Error, 'The API should return an Error'); + if (code) { + TestCase.assertEqual(error.code, code); + } +} + +function assertIsAuthError(error, code, type) { + TestCase.assertInstanceOf(error, Realm.Sync.AuthError, 'The API should return an AuthError'); + if (code) { + TestCase.assertEqual(error.code, code); + } + if (type) { + TestCase.assertEqual(error.type, type); + } +} + module.exports = { testRegisterUser() { var username = uuid(); return new Promise((resolve, reject) => { Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - TestCase.assertEqual(typeof user, 'object'); - TestCase.assertEqual(typeof user.token, 'string'); - TestCase.assertEqual(typeof user.identity, 'string'); - TestCase.assertEqual(user.isAdmin, false); + if (error) { + reject(error); + } + assertIsUser(user); + // Can we open a realm with the registered user? var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertNotEqual(realm instanceof Realm); + TestCase.assertInstanceOf(realm, Realm); resolve(); }); }); @@ -52,26 +80,48 @@ module.exports = { var username = uuid(); return new Promise((resolve, reject) => { Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - TestCase.assertEqual(typeof user, 'object'); + if (error) { + reject(error); + } + assertIsUser(user); + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - TestCase.assertTrue(error instanceof Realm.Sync.AuthError); - TestCase.assertEqual(error.code, 613); - TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/existing-account'); - TestCase.assertEqual(user, undefined); + assertIsAuthError(error, 613, 'https://realm.io/docs/object-server/problems/existing-account'); + TestCase.assertUndefined(user); resolve(); }); }); }); }, - testRegisterInvalidUsername() { - var username = uuid(); + testRegisterMissingUsername() { return new Promise((resolve, reject) => { Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { - TestCase.assertTrue(error instanceof Realm.Sync.AuthError); - TestCase.assertEqual(error.code, 602); - TestCase.assertEqual(error.type, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertEqual(user, undefined); + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testRegisterMissingPassword() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, undefined, (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testRegisterServerOffline() { + var username = uuid(); + return new Promise((resolve, reject) => { + // Because it waits for answer this takes some time.. + Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); resolve(); }); }); @@ -80,25 +130,62 @@ module.exports = { testLogin() { var username = uuid(); return new Promise((resolve, reject) => { + // Create user, logout the new user, then login Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { user.logout(); - //TestCase.assertEqual(Realm.Sync.User.all.length, 0); - Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { - TestCase.assertEqual(typeof user, 'object'); - TestCase.assertEqual(typeof user.token, 'string'); - TestCase.assertEqual(typeof user.identity, 'string'); - TestCase.assertEqual(user.isAdmin, false); + assertIsUser(user); var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertNotEqual(realm instanceof Realm); - - //TestCase.assertEqual(Realm.Sync.User.all.length, 1); - + TestCase.assertInstanceOf(realm, Realm); resolve(); }); }); }); }, + + testLoginMissingUsername() { + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', undefined, 'password', (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testLoginMissingPassword() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', username, undefined, (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testLoginNonExistingUser() { + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', 'does_not', 'exist', (error, user) => { + assertIsAuthError(error, 612, 'https://realm.io/docs/object-server/problems/unknown-account'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testLoginServerOffline() { + var username = uuid(); + return new Promise((resolve, reject) => { + // Because it waits for answer this takes some time.. + Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + }; diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js index ef7206e9..6c4a086b 100644 --- a/tests/spec/sync_tests.js +++ b/tests/spec/sync_tests.js @@ -25,6 +25,7 @@ const Realm = require('realm'); const userTests = require('../js/user-tests'); describe('SyncTests', () => { + jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; beforeEach(() => Realm.clearTestState()); afterEach(() => Realm.clearTestState()); From a47d6b12c00df18626b269d11f7b57c570fd126d Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 10:47:31 -0800 Subject: [PATCH 059/100] fix for reset script --- scripts/reset-simulators.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/reset-simulators.sh b/scripts/reset-simulators.sh index d7045a0a..c86fe860 100755 --- a/scripts/reset-simulators.sh +++ b/scripts/reset-simulators.sh @@ -3,7 +3,10 @@ set -o pipefail set -e -source "$(dirname "$0")/swift-version.sh" +export REALM_SWIFT_VERSION=3.0.1 +if [[ -z "$DEVELOPER_DIR" ]]; then + export DEVELOPER_DIR="$(xcode-select -p)" +fi while pgrep -q Simulator; do # Kill all the current simulator processes as they may be from a From 219947db9ebc1f49f7305a1f57f741abc7cecb0c Mon Sep 17 00:00:00 2001 From: JP Simard Date: Thu, 10 Nov 2016 11:26:27 -0800 Subject: [PATCH 060/100] try to work around failure to run the tests --- scripts/reset-simulators.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/reset-simulators.sh b/scripts/reset-simulators.sh index c86fe860..157eb80d 100755 --- a/scripts/reset-simulators.sh +++ b/scripts/reset-simulators.sh @@ -35,6 +35,8 @@ echo "$devices" | ruby -rjson -e 'puts JSON.parse($stdin.read)["devices"].flat_m done wait +xcrun simctl boot "iPhone 5" # React Native seems to want to test with this device + if [[ -a "${DEVELOPER_DIR}/Applications/Simulator.app" ]]; then open "${DEVELOPER_DIR}/Applications/Simulator.app" fi From aeea153a0699b72bbbfe9725bee98062afc74031 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 11:44:57 -0800 Subject: [PATCH 061/100] don't reset simulators --- scripts/test.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index 9edff4b9..d71dd6a8 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -81,9 +81,9 @@ start_packager() { } xctest() { - if ! [ -z "${JENKINS_HOME}" ]; then - ${SRCROOT}/scripts/reset-simulators.sh - fi +# if ! [ -z "${JENKINS_HOME}" ]; then +# ${SRCROOT}/scripts/reset-simulators.sh +# fi local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then From fb47fb10cc2ee38eb711f5a3d8648395ce6cf13b Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 11:51:37 -0800 Subject: [PATCH 062/100] remove sync test code from test app --- tests/react-test-app/index.ios.js | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/tests/react-test-app/index.ios.js b/tests/react-test-app/index.ios.js index eac96ec5..b9a3dc40 100644 --- a/tests/react-test-app/index.ios.js +++ b/tests/react-test-app/index.ios.js @@ -30,34 +30,6 @@ import { runTests } from './tests'; const Realm = require('realm'); -Realm.Sync.setLogLevel('error'); -var realm; -Realm.Sync.User.register('http://127.0.0.1:9080/', 'ari', 'aaa', function(error, user) { - console.log(user); - - realm = new Realm({ - sync: { - user: user, - url: 'realm://127.0.0.1:9080/~/demo/realm1' - }, - schema: [{ - name: 'IntObject', - properties: { - int: 'int' - } - }] - }); - - realm.addListener('change', () => { - console.log(realm.objects('IntObject')); - }); - - realm.write(() => { - realm.create('IntObject', {int: realm.objects('IntObject').length}); - }); -}); - - class ReactTests extends React.Component { render() { return ( From 448f68a787009d726958528f8a3e043600ddbd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Thu, 10 Nov 2016 10:45:43 -0800 Subject: [PATCH 063/100] Reformat code, 2 spaces --- tests/js/user-tests.js | 280 ++++++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 2c5763c0..f1f62a12 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -25,167 +25,167 @@ const TestCase = require('./asserts'); const schemas = require('./schemas'); function uuid() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); } function assertIsUser(user, isAdmin) { - TestCase.assertType(user, 'object'); - TestCase.assertType(user.token, 'string'); - TestCase.assertType(user.identity, 'string'); - TestCase.assertInstanceOf(user, Realm.Sync.User); - if (isAdmin !== undefined) { - TestCase.assertEqual(user.isAdmin, isAdmin); - } + TestCase.assertType(user, 'object'); + TestCase.assertType(user.token, 'string'); + TestCase.assertType(user.identity, 'string'); + TestCase.assertInstanceOf(user, Realm.Sync.User); + if (isAdmin !== undefined) { + TestCase.assertEqual(user.isAdmin, isAdmin); + } } function assertIsError(error, code) { - TestCase.assertInstanceOf(error, Error, 'The API should return an Error'); - if (code) { - TestCase.assertEqual(error.code, code); - } + TestCase.assertInstanceOf(error, Error, 'The API should return an Error'); + if (code) { + TestCase.assertEqual(error.code, code); + } } function assertIsAuthError(error, code, type) { - TestCase.assertInstanceOf(error, Realm.Sync.AuthError, 'The API should return an AuthError'); - if (code) { - TestCase.assertEqual(error.code, code); - } - if (type) { - TestCase.assertEqual(error.type, type); - } + TestCase.assertInstanceOf(error, Realm.Sync.AuthError, 'The API should return an AuthError'); + if (code) { + TestCase.assertEqual(error.code, code); + } + if (type) { + TestCase.assertEqual(error.type, type); + } } module.exports = { - testRegisterUser() { - var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - if (error) { - reject(error); - } - assertIsUser(user); + testRegisterUser() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + if (error) { + reject(error); + } + assertIsUser(user); - // Can we open a realm with the registered user? - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertInstanceOf(realm, Realm); - resolve(); - }); + // Can we open a realm with the registered user? + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertInstanceOf(realm, Realm); + resolve(); + }); + }); + }, + + testRegisterExistingUser() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + if (error) { + reject(error); + } + assertIsUser(user); + + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + assertIsAuthError(error, 613, 'https://realm.io/docs/object-server/problems/existing-account'); + TestCase.assertUndefined(user); + resolve(); }); - }, + }); + }); + }, - testRegisterExistingUser() { - var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - if (error) { - reject(error); - } - assertIsUser(user); + testRegisterMissingUsername() { + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - assertIsAuthError(error, 613, 'https://realm.io/docs/object-server/problems/existing-account'); - TestCase.assertUndefined(user); - resolve(); - }); - }); + testRegisterMissingPassword() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.register('http://localhost:9080', username, undefined, (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testRegisterServerOffline() { + var username = uuid(); + return new Promise((resolve, reject) => { + // Because it waits for answer this takes some time.. + Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, + + testLogin() { + var username = uuid(); + return new Promise((resolve, reject) => { + // Create user, logout the new user, then login + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + user.logout(); + Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { + assertIsUser(user); + + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertInstanceOf(realm, Realm); + resolve(); }); - }, + }); + }); + }, - testRegisterMissingUsername() { - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, + testLoginMissingUsername() { + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', undefined, 'password', (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, - testRegisterMissingPassword() { - var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, undefined, (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, + testLoginMissingPassword() { + var username = uuid(); + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', username, undefined, (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, - testRegisterServerOffline() { - var username = uuid(); - return new Promise((resolve, reject) => { - // Because it waits for answer this takes some time.. - Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { - assertIsError(error, 'ECONNRESET'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, + testLoginNonExistingUser() { + return new Promise((resolve, reject) => { + Realm.Sync.User.login('http://localhost:9080', 'does_not', 'exist', (error, user) => { + assertIsAuthError(error, 612, 'https://realm.io/docs/object-server/problems/unknown-account'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, - testLogin() { - var username = uuid(); - return new Promise((resolve, reject) => { - // Create user, logout the new user, then login - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - user.logout(); - Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { - assertIsUser(user); - - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertInstanceOf(realm, Realm); - resolve(); - }); - }); - }); - }, - - testLoginMissingUsername() { - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', undefined, 'password', (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, - - testLoginMissingPassword() { - var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', username, undefined, (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, - - testLoginNonExistingUser() { - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', 'does_not', 'exist', (error, user) => { - assertIsAuthError(error, 612, 'https://realm.io/docs/object-server/problems/unknown-account'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, - - testLoginServerOffline() { - var username = uuid(); - return new Promise((resolve, reject) => { - // Because it waits for answer this takes some time.. - Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { - assertIsError(error, 'ECONNRESET'); - TestCase.assertUndefined(user); - resolve(); - }); - }); - }, + testLoginServerOffline() { + var username = uuid(); + return new Promise((resolve, reject) => { + // Because it waits for answer this takes some time.. + Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); + resolve(); + }); + }); + }, }; From 87b30fb4ecf0bd5491e071edf86a40f0fc15f39f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Thu, 10 Nov 2016 12:53:36 -0800 Subject: [PATCH 064/100] Add tests of Realm.Sync.User.all and Realm.Sync.User.current. Fix both to only return active (logged-in) users. Fix current return values: Throws if >1 user logged in, returns undefined if no logged in. --- src/js_sync.hpp | 24 ++++++++++++++++---- tests/js/asserts.js | 13 +++++++++++ tests/js/user-tests.js | 49 ++++++++++++++++++++++++++++++++++++++++ tests/spec/sync_tests.js | 7 +++++- 4 files changed, 87 insertions(+), 6 deletions(-) diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 83f00903..21e0967f 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -127,19 +127,33 @@ void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t a template void UserClass::all_users(ContextType ctx, ObjectType object, ReturnValue &return_value) { std::vector user_vector; + // TODO: This method should return a dictionary of shape {userid->user} for (auto user : SyncManager::shared().all_users()) { - user_vector.push_back(create_object>(ctx, new SharedUser(user))); + if (user->state() == SyncUser::State::Active) { + user_vector.push_back(create_object>(ctx, new SharedUser(user))); + } } return_value.set(Object::create_array(ctx, user_vector)); } template void UserClass::current_user(ContextType ctx, ObjectType object, ReturnValue &return_value) { - auto users = SyncManager::shared().all_users(); - if (users.size() != 1) { - throw std::runtime_error("No current user"); + SharedUser *current = nullptr; + for (auto user : SyncManager::shared().all_users()) { + if (user->state() == SyncUser::State::Active) { + if (current != nullptr) { + throw std::runtime_error("More than one user logged in currently."); + } + current = new SharedUser(user); + } + } + + if (current != nullptr) { + return_value.set(create_object>(ctx, current)); + } + else { + return_value.set_undefined(); } - return_value.set(create_object>(ctx, new SharedUser(users[0]))); } template diff --git a/tests/js/asserts.js b/tests/js/asserts.js index 59f374fb..acc9a7e5 100644 --- a/tests/js/asserts.js +++ b/tests/js/asserts.js @@ -49,6 +49,19 @@ module.exports = { } }, + assertArray: function(value, length, errorMessage) { + if (!Array.isArray(value)) { + throw new TestFailureError(errorMessage || `Value ${value} is not an array`); + } + }, + + assertArrayLength: function(value, length, errorMessage) { + this.assertArray(value); + if (value.length !== length) { + throw new TestFailureError(errorMessage || `Value ${value} is not an array of length ${length}`); + } + }, + assertArraysEqual: function(val1, val2, errorMessage) { var len1 = val1.length; var len2 = val2.length; diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index f1f62a12..def89e43 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -41,6 +41,13 @@ function assertIsUser(user, isAdmin) { } } +function assertIsSameUser(value, user) { + assertIsUser(value); + TestCase.assertEqual(value.token, user.token); + TestCase.assertEqual(value.identity, user.identity); + TestCase.assertEqual(value.isAdmin, user.isAdmin); +} + function assertIsError(error, code) { TestCase.assertInstanceOf(error, Error, 'The API should return an Error'); if (code) { @@ -59,6 +66,7 @@ function assertIsAuthError(error, code, type) { } module.exports = { + testRegisterUser() { var username = uuid(); return new Promise((resolve, reject) => { @@ -187,5 +195,46 @@ module.exports = { }); }, + testAll() { + return new Promise((resolve, reject) => { + let all; + all = Realm.Sync.User.all; + TestCase.assertArrayLength(all, 0); + + Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user1) => { + all = Realm.Sync.User.all; + TestCase.assertArrayLength(all, 1); + assertIsSameUser(all[0], user1); + + Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { + all = Realm.Sync.User.all; + TestCase.assertArrayLength(all, 2); + // NOTE: the list of users is in latest-first order. + assertIsSameUser(all[0], user2); + assertIsSameUser(all[1], user1); + resolve(); + }); + }); + }); + }, + + testCurrent() { + return new Promise((resolve, reject) => { + let current; + current = Realm.Sync.User.current; + TestCase.assertUndefined(current); + + Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user1) => { + current = Realm.Sync.User.current; + assertIsSameUser(current, user1); + + Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { + TestCase.assertThrows(() => Realm.Sync.User.current, 'We expect Realm.Sync.User.current to throw if > 1 user.'); + resolve(); + }); + }); + }); + }, + }; diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js index 6c4a086b..bad62e00 100644 --- a/tests/spec/sync_tests.js +++ b/tests/spec/sync_tests.js @@ -27,7 +27,12 @@ const userTests = require('../js/user-tests'); describe('SyncTests', () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; beforeEach(() => Realm.clearTestState()); - afterEach(() => Realm.clearTestState()); + afterEach(() => { + Realm.clearTestState(); + Realm.Sync.User.all.forEach((user) => { + user.logout(); + }); + }); for (const testName in userTests) { it(testName, (done) => userTests[testName]().catch((e) => fail(e)).then(done)); From 6d485866f633e61d5026313456600154b15b7aef Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 13:55:22 -0800 Subject: [PATCH 065/100] all users should return a dictionary --- src/js_sync.hpp | 7 +++---- tests/js/user-tests.js | 12 ++++++------ tests/spec/sync_tests.js | 5 +++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 21e0967f..ab279673 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -126,14 +126,13 @@ void UserClass::create_user(ContextType ctx, ObjectType this_object, size_t a template void UserClass::all_users(ContextType ctx, ObjectType object, ReturnValue &return_value) { - std::vector user_vector; - // TODO: This method should return a dictionary of shape {userid->user} + auto users = Object::create_empty(ctx); for (auto user : SyncManager::shared().all_users()) { if (user->state() == SyncUser::State::Active) { - user_vector.push_back(create_object>(ctx, new SharedUser(user))); + Object::set_property(ctx, users, user->identity(), create_object>(ctx, new SharedUser(user)), ReadOnly | DontDelete); } } - return_value.set(Object::create_array(ctx, user_vector)); + return_value.set(users); } template diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index def89e43..fc0236fb 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -199,19 +199,19 @@ module.exports = { return new Promise((resolve, reject) => { let all; all = Realm.Sync.User.all; - TestCase.assertArrayLength(all, 0); + TestCase.assertArrayLength(Object.keys(all), 0); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user1) => { all = Realm.Sync.User.all; - TestCase.assertArrayLength(all, 1); - assertIsSameUser(all[0], user1); + TestCase.assertArrayLength(Object.keys(all), 1); + assertIsSameUser(all[user1.identity], user1); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { all = Realm.Sync.User.all; - TestCase.assertArrayLength(all, 2); + TestCase.assertArrayLength(Object.keys(all), 2); // NOTE: the list of users is in latest-first order. - assertIsSameUser(all[0], user2); - assertIsSameUser(all[1], user1); + assertIsSameUser(all[user2.identity], user2); + assertIsSameUser(all[user1.identity], user1); resolve(); }); }); diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js index bad62e00..2f4fdd2a 100644 --- a/tests/spec/sync_tests.js +++ b/tests/spec/sync_tests.js @@ -29,8 +29,9 @@ describe('SyncTests', () => { beforeEach(() => Realm.clearTestState()); afterEach(() => { Realm.clearTestState(); - Realm.Sync.User.all.forEach((user) => { - user.logout(); + let users = Realm.Sync.User.all; + Object.keys(users).forEach((identity) => { + users[identity].logout(); }); }); From babd9b6c3d7a5316ed361756a3a910efad292c75 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 14:29:28 -0800 Subject: [PATCH 066/100] don't unzip sync zip when not needed --- scripts/download-core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 44d81b77..8c1d7b22 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -135,7 +135,7 @@ if [ -n "$SYNC_DOWNLOAD_FILE" ];then # With a prebuilt version we only want to check the first non-empty # line so that checking out an older commit will download the # appropriate version of core if the already-present version is too new - elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt" | check_release_notes; then + elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt"; then download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR else echo "The sync library seems to be up to date." From 30679c2470698069c0ee5675d36946df7095de7b Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 15:54:24 -0800 Subject: [PATCH 067/100] remove unneeded script phases --- src/RealmJS.xcodeproj/project.pbxproj | 15 --------------- .../ios/ReactTests.xcodeproj/project.pbxproj | 15 --------------- 2 files changed, 30 deletions(-) diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 8f606d41..85437a4e 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -711,7 +711,6 @@ 02B58CB81AE99CEC009B348C /* Sources */, 02B58CB91AE99CEC009B348C /* Frameworks */, 02B58CBA1AE99CEC009B348C /* Resources */, - F613787A1C18F003008BFC51 /* Copy Query Tests */, 02879D8D1DC29F2000777A5D /* Install Node Modules */, ); buildRules = ( @@ -846,20 +845,6 @@ shellPath = /bin/sh; shellScript = "cd \"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH\"\nyarn add needle url-parse"; }; - F613787A1C18F003008BFC51 /* Copy Query Tests */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Query Tests"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "DEST=\"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH/js/query-tests.json\"\nrm -f \"$DEST\"\ncp object-store/tests/query.json \"$DEST\""; - }; F63117A41CEA911000ECB2DE /* Build with node-gyp */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index 28412ea9..cb29d2cf 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -431,7 +431,6 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactTestApp" */; buildPhases = ( - F65C4BCA1BC72C5A000A1793 /* Install Realm Node Modules */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, @@ -679,20 +678,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - F65C4BCA1BC72C5A000A1793 /* Install Realm Node Modules */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Install Realm Node Modules"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "[ -s \"${HOME}/.nvm/nvm.sh\" ] && . \"${HOME}/.nvm/nvm.sh\"\n #cp \"${SRCROOT}/../../../src/object-store/tests/query.json\" \"${SRCROOT}/../node_modules/realm-tests/query-tests.json\"\n"; - }; F6EDE5BF1C49007200B1085F /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 88aae657214a1faeec3ff37ebe7af44df3f6459b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Thu, 10 Nov 2016 18:06:06 -0800 Subject: [PATCH 068/100] Test logout, slightly better test scaffolding (so now we run tests to completion on the outer level of callbacks). --- tests/js/asserts.js | 6 +- tests/js/user-tests.js | 202 +++++++++++++++++++++++---------------- tests/spec/sync_tests.js | 6 +- 3 files changed, 129 insertions(+), 85 deletions(-) diff --git a/tests/js/asserts.js b/tests/js/asserts.js index acc9a7e5..f8633842 100644 --- a/tests/js/asserts.js +++ b/tests/js/asserts.js @@ -133,8 +133,10 @@ module.exports = { this.assertEqual(typeof value, type, `Value ${value} expected to be of type ${type}`); }, - assertUndefined: function(value) { - this.assertEqual(value, undefined, `Value ${value} expected to be undefined`); + assertUndefined: function(value, errorMessage) { + if (value !== undefined) { + throw new TestFailureError(errorMessage || `Value ${value} expected to be undefined`); + } }, isNode: function() { diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index fc0236fb..66a8680f 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -65,133 +65,151 @@ function assertIsAuthError(error, code, type) { } } +function rejectOnError(error, reject) { + if (error) { + reject(error); + } +} + +function failOnError(error) { + if (error) { + throw new Error(`Error ${error} was not expected`); + } +} + +// Test the given requestFunc, passing it the given callback after it's been wrapped appropriately. +// This function makes sure that errors thrown in the async callback rejects the promise (making tests actually run). +function callbackTest(requestFunc, callback) { + return new Promise((resolve, reject) => { + function callbackWrapper() { + try { + callback.apply(this, Array.from(arguments)); + resolve(); + } + catch (e) { + reject(e); + } + } + requestFunc(callbackWrapper); + }); +} + + module.exports = { + testLogout() { + var username = uuid(); + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', username, 'password', callback), (error, user) => { + failOnError(error); + assertIsUser(user); + + assertIsSameUser(user, Realm.Sync.User.current); + user.logout(); + + // Is now logged out. + TestCase.assertUndefined(Realm.Sync.User.current); + + // Can we open a realm with the registered user? + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertUndefined(realm); + }) + }, testRegisterUser() { var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - if (error) { - reject(error); - } - assertIsUser(user); + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', username, 'password', callback), (error, user) => { + failOnError(error); + assertIsUser(user); - // Can we open a realm with the registered user? - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertInstanceOf(realm, Realm); - resolve(); - }); + // Can we open a realm with the registered user? + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertInstanceOf(realm, Realm); }); }, testRegisterExistingUser() { var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - if (error) { - reject(error); - } - assertIsUser(user); + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', username, 'password', callback), (error, user) => { + failOnError(error); + assertIsUser(user); - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - assertIsAuthError(error, 613, 'https://realm.io/docs/object-server/problems/existing-account'); - TestCase.assertUndefined(user); - resolve(); - }); + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { + assertIsAuthError(error, 613, 'https://realm.io/docs/object-server/problems/existing-account'); + TestCase.assertUndefined(user); }); }); }, testRegisterMissingUsername() { - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', undefined, 'password', (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', undefined, 'password', callback), (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); }); }, testRegisterMissingPassword() { var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.register('http://localhost:9080', username, undefined, (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', username, undefined, callback), (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); }); }, testRegisterServerOffline() { var username = uuid(); - return new Promise((resolve, reject) => { - // Because it waits for answer this takes some time.. - Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { - assertIsError(error, 'ECONNRESET'); - TestCase.assertUndefined(user); - resolve(); - }); + // Because it waits for answer this takes some time.. + return callbackTest((callback) => Realm.Sync.User.register('http://fake_host.local', username, 'password', callback), (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); }); }, testLogin() { var username = uuid(); - return new Promise((resolve, reject) => { - // Create user, logout the new user, then login - Realm.Sync.User.register('http://localhost:9080', username, 'password', (error, user) => { - user.logout(); - Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { - assertIsUser(user); + // Create user, logout the new user, then login + return callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', username, 'password', callback), (error, user) => { + failOnError(error); + user.logout(); - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertInstanceOf(realm, Realm); - resolve(); - }); + Realm.Sync.User.login('http://localhost:9080', username, 'password', (error, user) => { + failOnError(error); + assertIsUser(user); + + // Can we open a realm with the logged-in user? + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + TestCase.assertInstanceOf(realm, Realm); + realm.close(); }); }); }, testLoginMissingUsername() { - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', undefined, 'password', (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.login('http://localhost:9080', undefined, 'password', callback), (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); }); }, testLoginMissingPassword() { var username = uuid(); - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', username, undefined, (error, user) => { - assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.login('http://localhost:9080', username, undefined, callback), (error, user) => { + assertIsAuthError(error, 602, 'https://realm.io/docs/object-server/problems/missing-parameters'); + TestCase.assertUndefined(user); }); }, testLoginNonExistingUser() { - return new Promise((resolve, reject) => { - Realm.Sync.User.login('http://localhost:9080', 'does_not', 'exist', (error, user) => { - assertIsAuthError(error, 612, 'https://realm.io/docs/object-server/problems/unknown-account'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.login('http://localhost:9080', 'does_not', 'exist', callback), (error, user) => { + assertIsAuthError(error, 612, 'https://realm.io/docs/object-server/problems/unknown-account'); + TestCase.assertUndefined(user); }); }, testLoginServerOffline() { var username = uuid(); - return new Promise((resolve, reject) => { // Because it waits for answer this takes some time.. - Realm.Sync.User.register('http://fake_host.local', username, 'password', (error, user) => { - assertIsError(error, 'ECONNRESET'); - TestCase.assertUndefined(user); - resolve(); - }); + return callbackTest((callback) => Realm.Sync.User.register('http://fake_host.local', username, 'password', callback), (error, user) => { + assertIsError(error, 'ECONNRESET'); + TestCase.assertUndefined(user); }); }, @@ -201,17 +219,31 @@ module.exports = { all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 0); - Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user1) => { + callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', callback), (error, user1) => { + rejectOnError(error, reject); + all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 1); assertIsSameUser(all[user1.identity], user1); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { + rejectOnError(error, reject); + all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 2); // NOTE: the list of users is in latest-first order. assertIsSameUser(all[user2.identity], user2); assertIsSameUser(all[user1.identity], user1); + + user2.logout(); + all = Realm.Sync.User.all; + TestCase.assertArrayLength(Object.keys(all), 1); + assertIsSameUser(all[user1.identity], user1); + + user1.logout(); + all = Realm.Sync.User.all; + TestCase.assertArrayLength(Object.keys(all), 0); + resolve(); }); }); @@ -220,16 +252,22 @@ module.exports = { testCurrent() { return new Promise((resolve, reject) => { - let current; - current = Realm.Sync.User.current; - TestCase.assertUndefined(current); + TestCase.assertUndefined(Realm.Sync.User.current); - Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user1) => { - current = Realm.Sync.User.current; - assertIsSameUser(current, user1); + callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', callback), (error, user1) => { + rejectOnError(error, reject); + assertIsSameUser(Realm.Sync.User.current, user1); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { + rejectOnError(error, reject); TestCase.assertThrows(() => Realm.Sync.User.current, 'We expect Realm.Sync.User.current to throw if > 1 user.'); + user2.logout(); + + assertIsSameUser(Realm.Sync.User.current, user1); + + user1.logout(); + TestCase.assertUndefined(Realm.Sync.User.current); + resolve(); }); }); diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js index 2f4fdd2a..18e74934 100644 --- a/tests/spec/sync_tests.js +++ b/tests/spec/sync_tests.js @@ -36,6 +36,10 @@ describe('SyncTests', () => { }); for (const testName in userTests) { - it(testName, (done) => userTests[testName]().catch((e) => fail(e)).then(done)); + it(testName, (done) => { + userTests[testName]() + .catch((e) => fail(e)) + .then(done); + }); } }); From 81402f890bd32fce5bd2f29011d0cb3365feaddd Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 23:11:31 -0800 Subject: [PATCH 069/100] use yarn and fix for test app package.json --- scripts/test.sh | 5 +- tests/react-test-app/package.json | 4 +- tests/react-test-app/yarn.lock | 4880 ----------------------------- 3 files changed, 5 insertions(+), 4884 deletions(-) delete mode 100644 tests/react-test-app/yarn.lock diff --git a/scripts/test.sh b/scripts/test.sh index d71dd6a8..3c2f2015 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -107,6 +107,9 @@ if [ -s "${HOME}/.nvm/nvm.sh" ]; then nvm use 4.4.7 || true fi +# Remove cached packages +rm -rf ~/.yarn-cache/npm-realm-* + case "$TARGET" in "eslint") [[ $CONFIGURATION == 'Debug' ]] && exit 0 @@ -131,7 +134,7 @@ case "$TARGET" in unzip -q ../../target=node_modules/react_tests_node_modules.zip fi - npm install + yarn install open_chrome start_packager diff --git a/tests/react-test-app/package.json b/tests/react-test-app/package.json index e8a27fbd..021d5add 100644 --- a/tests/react-test-app/package.json +++ b/tests/react-test-app/package.json @@ -6,13 +6,11 @@ "start": "react-native start" }, "dependencies": { - "needle": "^1.3.0", "react": "~15.3.1", "react-native": "^0.36.0", "react-native-fs": "^1.1.0", - "realm": "^0.14.3", + "realm": "file:../..", "realm-tests": "file:../js", - "url-parse": "^1.1.6", "xmlbuilder": "^4.2.1" } } diff --git a/tests/react-test-app/yarn.lock b/tests/react-test-app/yarn.lock deleted file mode 100644 index 6c0cb9a9..00000000 --- a/tests/react-test-app/yarn.lock +++ /dev/null @@ -1,4880 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 -abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - -accepts@~1.2.12, accepts@~1.2.13: - version "1.2.13" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" - dependencies: - mime-types "~2.1.6" - negotiator "0.5.3" - -accepts@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - -acorn@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi@^0.3.0, ansi@~0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" - -aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" - -archive-type@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" - dependencies: - file-type "^3.1.0" - -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-index@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" - dependencies: - debug "^2.2.0" - es6-symbol "^3.0.2" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -art@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/art/-/art-0.10.1.tgz#38541883e399225c5e193ff246e8f157cf7b2146" - -asap@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -ast-query@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ast-query/-/ast-query-1.2.0.tgz#4b725e9f3922a5edc41dc669c87bbfbfd20171a2" - dependencies: - class-extend "^0.1.1" - escodegen "^1.6.0" - esprima "^2.0.0" - lodash "^4.6.1" - traverse "^0.6.6" - -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" - -async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.0.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" - dependencies: - lodash "^4.14.0" - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" - -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-core@^6.10.4, babel-core@^6.18.0, babel-core@^6.7.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.0.tgz#bb5ce9bc0a956e6e94e2f12d597abb3b0b330deb" - dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.18.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.18.0" - babel-runtime "^6.9.1" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" - -babel-generator@^6.14.0, babel-generator@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" - dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - -babel-helper-builder-react-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz#ab02f19a2eb7ace936dd87fa55896d02be59bf71" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - esutils "^2.0.0" - lodash "^4.2.0" - -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" - dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" - dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" - dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" - dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" - -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-check-es2015-constants@^6.5.0, babel-plugin-check-es2015-constants@^6.7.2, babel-plugin-check-es2015-constants@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-external-helpers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.18.0.tgz#c6bbf87a4448eb49616f24a8b8088503863488da" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-react-transform@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz#515bbfa996893981142d90b1f9b1635de2995109" - dependencies: - lodash "^4.6.1" - -babel-plugin-syntax-async-functions@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.5.0, babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.5.0, babel-plugin-syntax-trailing-function-commas@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" - -babel-plugin-transform-class-properties@^6.5.0, babel-plugin-transform-class-properties@^6.6.0, babel-plugin-transform-class-properties@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.18.0.tgz#bc1266a39d4c8726e0bd7b15c56235177e6ede57" - dependencies: - babel-helper-function-name "^6.18.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" - -babel-plugin-transform-es2015-arrow-functions@^6.5.0, babel-plugin-transform-es2015-arrow-functions@^6.5.2, babel-plugin-transform-es2015-arrow-functions@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.6.5, babel-plugin-transform-es2015-block-scoped-functions@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoping@^6.5.0, babel-plugin-transform-es2015-block-scoping@^6.7.1, babel-plugin-transform-es2015-block-scoping@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" - dependencies: - babel-runtime "^6.9.0" - babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.5.0, babel-plugin-transform-es2015-classes@^6.6.5, babel-plugin-transform-es2015-classes@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform-es2015-computed-properties@^6.6.5, babel-plugin-transform-es2015-computed-properties@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" - dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-destructuring@^6.5.0, babel-plugin-transform-es2015-destructuring@^6.6.5, babel-plugin-transform-es2015-destructuring@^6.8.0, babel-plugin-transform-es2015-destructuring@6.x: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" - dependencies: - babel-runtime "^6.9.0" - -babel-plugin-transform-es2015-for-of@^6.5.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-function-name@^6.5.0, babel-plugin-transform-es2015-function-name@^6.8.0, babel-plugin-transform-es2015-function-name@6.x: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" - dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" - -babel-plugin-transform-es2015-literals@^6.5.0, babel-plugin-transform-es2015-literals@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.5.0, babel-plugin-transform-es2015-modules-commonjs@^6.7.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0, babel-plugin-transform-es2015-modules-commonjs@6.x: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" - dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-object-super@^6.6.5, babel-plugin-transform-es2015-object-super@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" - dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-parameters@^6.5.0, babel-plugin-transform-es2015-parameters@^6.7.0, babel-plugin-transform-es2015-parameters@^6.8.0, babel-plugin-transform-es2015-parameters@6.x: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" - dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-shorthand-properties@^6.5.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0, babel-plugin-transform-es2015-shorthand-properties@6.x: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-spread@^6.5.0, babel-plugin-transform-es2015-spread@^6.6.5, babel-plugin-transform-es2015-spread@^6.8.0, babel-plugin-transform-es2015-spread@6.x: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-sticky-regex@6.x: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-plugin-transform-es2015-template-literals@^6.5.0, babel-plugin-transform-es2015-template-literals@^6.6.5, babel-plugin-transform-es2015-template-literals@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-unicode-regex@6.x: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-es3-member-expression-literals@^6.5.0, babel-plugin-transform-es3-member-expression-literals@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.8.0.tgz#180796863e2eddc4b48561d0c228369b05b722e2" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es3-property-literals@^6.5.0, babel-plugin-transform-es3-property-literals@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.8.0.tgz#8e7cc50cfe060b7c487ae33c501a4f659133bade" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-flow-strip-types@^6.5.0, babel-plugin-transform-flow-strip-types@^6.6.5, babel-plugin-transform-flow-strip-types@^6.7.0, babel-plugin-transform-flow-strip-types@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-object-assign@^6.5.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.8.0.tgz#76e17f2dc0f36f14f548b9afd7aaef58d29ebb75" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-object-rest-spread@^6.5.0, babel-plugin-transform-object-rest-spread@^6.6.5, babel-plugin-transform-object-rest-spread@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-react-display-name@^6.5.0, babel-plugin-transform-react-display-name@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-react-jsx-source@^6.5.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" - -babel-plugin-transform-react-jsx@^6.5.0, babel-plugin-transform-react-jsx@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" - dependencies: - babel-helper-builder-react-jsx "^6.8.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-regenerator@^6.5.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" - -babel-plugin-transform-strict-mode@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-polyfill@^6.9.1: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" - dependencies: - babel-runtime "^6.9.1" - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-preset-es2015-node@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz#60b23157024b0cfebf3a63554cb05ee035b4e55f" - dependencies: - babel-plugin-transform-es2015-destructuring "6.x" - babel-plugin-transform-es2015-function-name "6.x" - babel-plugin-transform-es2015-modules-commonjs "6.x" - babel-plugin-transform-es2015-parameters "6.x" - babel-plugin-transform-es2015-shorthand-properties "6.x" - babel-plugin-transform-es2015-spread "6.x" - babel-plugin-transform-es2015-sticky-regex "6.x" - babel-plugin-transform-es2015-unicode-regex "6.x" - semver "5.x" - -babel-preset-fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-1.0.0.tgz#c972e5c9b301d4ec9e7971f4aec3e14ac017a8b0" - dependencies: - babel-plugin-check-es2015-constants "^6.7.2" - babel-plugin-syntax-flow "^6.5.0" - babel-plugin-syntax-object-rest-spread "^6.5.0" - babel-plugin-syntax-trailing-function-commas "^6.5.0" - babel-plugin-transform-class-properties "^6.6.0" - babel-plugin-transform-es2015-arrow-functions "^6.5.2" - babel-plugin-transform-es2015-block-scoped-functions "^6.6.5" - babel-plugin-transform-es2015-block-scoping "^6.7.1" - babel-plugin-transform-es2015-classes "^6.6.5" - babel-plugin-transform-es2015-computed-properties "^6.6.5" - babel-plugin-transform-es2015-destructuring "^6.6.5" - babel-plugin-transform-es2015-for-of "^6.6.0" - babel-plugin-transform-es2015-literals "^6.5.0" - babel-plugin-transform-es2015-modules-commonjs "^6.7.0" - babel-plugin-transform-es2015-object-super "^6.6.5" - babel-plugin-transform-es2015-parameters "^6.7.0" - babel-plugin-transform-es2015-shorthand-properties "^6.5.0" - babel-plugin-transform-es2015-spread "^6.6.5" - babel-plugin-transform-es2015-template-literals "^6.6.5" - babel-plugin-transform-es3-member-expression-literals "^6.5.0" - babel-plugin-transform-es3-property-literals "^6.5.0" - babel-plugin-transform-flow-strip-types "^6.7.0" - babel-plugin-transform-object-rest-spread "^6.6.5" - object-assign "^4.0.1" - -babel-preset-fbjs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.0.tgz#1a8d4cacbac7c5a9194ce3b8475ffab33ed524fb" - dependencies: - babel-plugin-check-es2015-constants "^6.8.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-plugin-syntax-flow "^6.8.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-plugin-syntax-trailing-function-commas "^6.8.0" - babel-plugin-transform-class-properties "^6.8.0" - babel-plugin-transform-es2015-arrow-functions "^6.8.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.8.0" - babel-plugin-transform-es2015-block-scoping "^6.8.0" - babel-plugin-transform-es2015-classes "^6.8.0" - babel-plugin-transform-es2015-computed-properties "^6.8.0" - babel-plugin-transform-es2015-destructuring "^6.8.0" - babel-plugin-transform-es2015-for-of "^6.8.0" - babel-plugin-transform-es2015-function-name "^6.8.0" - babel-plugin-transform-es2015-literals "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.8.0" - babel-plugin-transform-es2015-object-super "^6.8.0" - babel-plugin-transform-es2015-parameters "^6.8.0" - babel-plugin-transform-es2015-shorthand-properties "^6.8.0" - babel-plugin-transform-es2015-spread "^6.8.0" - babel-plugin-transform-es2015-template-literals "^6.8.0" - babel-plugin-transform-es3-member-expression-literals "^6.8.0" - babel-plugin-transform-es3-property-literals "^6.8.0" - babel-plugin-transform-flow-strip-types "^6.8.0" - babel-plugin-transform-object-rest-spread "^6.8.0" - babel-plugin-transform-react-display-name "^6.8.0" - babel-plugin-transform-react-jsx "^6.8.0" - -babel-preset-react-native@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-1.9.0.tgz#035fc06c65f4f2a02d0336a100b2da142f36dab1" - dependencies: - babel-plugin-check-es2015-constants "^6.5.0" - babel-plugin-react-transform "2.0.2" - babel-plugin-syntax-async-functions "^6.5.0" - babel-plugin-syntax-class-properties "^6.5.0" - babel-plugin-syntax-flow "^6.5.0" - babel-plugin-syntax-jsx "^6.5.0" - babel-plugin-syntax-trailing-function-commas "^6.5.0" - babel-plugin-transform-class-properties "^6.5.0" - babel-plugin-transform-es2015-arrow-functions "^6.5.0" - babel-plugin-transform-es2015-block-scoping "^6.5.0" - babel-plugin-transform-es2015-classes "^6.5.0" - babel-plugin-transform-es2015-computed-properties "^6.5.0" - babel-plugin-transform-es2015-destructuring "^6.5.0" - babel-plugin-transform-es2015-for-of "^6.5.0" - babel-plugin-transform-es2015-function-name "^6.5.0" - babel-plugin-transform-es2015-literals "^6.5.0" - babel-plugin-transform-es2015-modules-commonjs "^6.5.0" - babel-plugin-transform-es2015-parameters "^6.5.0" - babel-plugin-transform-es2015-shorthand-properties "^6.5.0" - babel-plugin-transform-es2015-spread "^6.5.0" - babel-plugin-transform-es2015-template-literals "^6.5.0" - babel-plugin-transform-flow-strip-types "^6.5.0" - babel-plugin-transform-object-assign "^6.5.0" - babel-plugin-transform-object-rest-spread "^6.5.0" - babel-plugin-transform-react-display-name "^6.5.0" - babel-plugin-transform-react-jsx "^6.5.0" - babel-plugin-transform-react-jsx-source "^6.5.0" - babel-plugin-transform-regenerator "^6.5.0" - react-transform-hmr "^1.0.4" - -babel-register@^6.18.0, babel-register@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" - dependencies: - babel-core "^6.18.0" - babel-runtime "^6.11.6" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" - -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" - dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.6.4, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" - dependencies: - babel-runtime "^6.9.1" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.11.0, babylon@^6.8.2: - version "6.13.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" - -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - -base62@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/base62/-/base62-1.1.1.tgz#974e82c11bd5e00816b508a7ed9c7b9086c9db6b" - -base64-js@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - -base64-js@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.6.tgz#7b859f79f0bbbd55867ba67a7fab397e24a20947" - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - -base64-url@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78" - -base64-url@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.2.tgz#90af26ef8b0b67bc801b05eccf943345649008b3" - -basic-auth-connect@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" - -basic-auth@~1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" - -batch@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" - -bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.0.tgz#9ee6fc1ce7f54feaace7ce73588b056037866a2c" - -binaryextensions@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" - -bindings@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" - -bl@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - dependencies: - readable-stream "~2.0.5" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^2.9.25: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -body-parser@~1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97" - dependencies: - bytes "2.1.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.0.1" - http-errors "~1.3.1" - iconv-lite "0.4.11" - on-finished "~2.3.0" - qs "4.0.0" - raw-body "~2.1.2" - type-is "~1.6.6" - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boxen@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.3.1.tgz#a7d898243ae622f7abb6bb604d740a76c6a5461b" - dependencies: - chalk "^1.1.1" - filled-array "^1.0.0" - object-assign "^4.0.1" - repeating "^2.0.0" - string-width "^1.0.1" - widest-line "^1.0.0" - -bplist-creator@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.4.tgz#4ac0496782e127a85c1d2026a4f5eb22a7aff991" - dependencies: - stream-buffers "~0.2.3" - -bplist-parser@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.0.6.tgz#38da3471817df9d44ab3892e27707bbbd75a11b9" - -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -browser-resolve@^1.7.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - -bser@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" - dependencies: - node-int64 "^0.4.0" - -buffer-crc32@~0.2.3: - version "0.2.5" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.5.tgz#db003ac2671e62ebd6ece78ea2c2e1b405736e91" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -buffer-to-vinyl@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" - dependencies: - file-type "^3.1.0" - readable-stream "^2.0.2" - uuid "^2.0.1" - vinyl "^1.0.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -bytes@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0, camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - -caw@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" - dependencies: - get-proxy "^1.0.1" - is-obj "^1.0.0" - object-assign "^3.0.0" - tunnel-agent "^0.4.0" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -cheerio@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" - dependencies: - css-select "~1.0.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "~3.8.1" - lodash "^3.2.0" - -class-extend@^0.1.0, class-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/class-extend/-/class-extend-0.1.2.tgz#8057a82b00f53f82a5d62c50ef8cffdec6fabc34" - dependencies: - object-assign "^2.0.0" - -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - dependencies: - colors "1.0.3" - -cli-width@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -co@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" - -code-point-at@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" - dependencies: - number-is-nan "^1.0.0" - -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.5.0, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -commoner@^0.10.1: - version "0.10.4" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.4.tgz#98f3333dd3ad399596bb2d384a783bb7213d68f8" - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.10.0" - -compressible@~2.0.5: - version "2.0.8" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.8.tgz#7162e6c46d3b9d200ffb45cb4e4a0f7832732503" - dependencies: - mime-db ">= 1.23.0 < 2" - -compression@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395" - dependencies: - accepts "~1.2.12" - bytes "2.1.0" - compressible "~2.0.5" - debug "~2.2.0" - on-headers "~1.0.0" - vary "~1.0.1" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.6, concat-stream@^1.4.7: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - -concat-stream@~1.4.5: - version "1.4.10" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" - dependencies: - inherits "~2.0.1" - readable-stream "~1.1.9" - typedarray "~0.0.5" - -configstore@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" - dependencies: - dot-prop "^3.0.0" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" - -connect-timeout@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e" - dependencies: - debug "~2.2.0" - http-errors "~1.3.1" - ms "0.7.1" - on-headers "~1.0.0" - -connect@^2.8.3: - version "2.30.2" - resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609" - dependencies: - basic-auth-connect "1.0.0" - body-parser "~1.13.3" - bytes "2.1.0" - compression "~1.5.2" - connect-timeout "~1.6.2" - content-type "~1.0.1" - cookie "0.1.3" - cookie-parser "~1.3.5" - cookie-signature "1.0.6" - csurf "~1.8.3" - debug "~2.2.0" - depd "~1.0.1" - errorhandler "~1.4.2" - express-session "~1.11.3" - finalhandler "0.4.0" - fresh "0.3.0" - http-errors "~1.3.1" - method-override "~2.3.5" - morgan "~1.6.1" - multiparty "3.3.2" - on-headers "~1.0.0" - parseurl "~1.3.0" - pause "0.1.0" - qs "4.0.0" - response-time "~2.3.1" - serve-favicon "~2.3.0" - serve-index "~1.7.2" - serve-static "~1.10.0" - type-is "~1.6.6" - utils-merge "1.0.0" - vhost "~3.0.1" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -content-type@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" - -convert-source-map@^1.1.0, convert-source-map@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" - -cookie-parser@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356" - dependencies: - cookie "0.1.3" - cookie-signature "1.0.6" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.2.2, core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -crc@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba" - -create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn-async@^2.2.2: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - -cross-spawn@^2.0.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-2.2.3.tgz#fac56202dfd3d0dd861778f2da203bf434bb821c" - dependencies: - cross-spawn-async "^2.2.2" - spawn-sync "^1.0.15" - -cross-spawn@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -csrf@~3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.3.tgz#69d13220de95762808bb120f7533a994fc4293b5" - dependencies: - base64-url "1.2.2" - rndm "1.2.0" - tsscmp "1.0.5" - uid-safe "2.1.1" - -css-select@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" - dependencies: - boolbase "~1.0.0" - css-what "1.0" - domutils "1.4" - nth-check "~1.0.0" - -css-what@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" - -csurf@~1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a" - dependencies: - cookie "0.1.3" - cookie-signature "1.0.6" - csrf "~3.0.0" - http-errors "~1.3.1" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" - -dargs@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - dependencies: - number-is-nan "^1.0.0" - -dashdash@^1.12.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" - dependencies: - assert-plus "^1.0.0" - -dateformat@^1.0.11: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decompress-tar@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" - dependencies: - is-tar "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-tarbz2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" - dependencies: - is-bzip2 "^1.0.0" - object-assign "^2.0.0" - seek-bzip "^1.0.3" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-targz@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" - dependencies: - is-gzip "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-unzip@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" - dependencies: - is-zip "^1.0.0" - read-all-stream "^3.0.0" - stat-mode "^0.2.0" - strip-dirs "^1.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - yauzl "^2.2.1" - -decompress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" - dependencies: - buffer-to-vinyl "^1.0.0" - concat-stream "^1.4.6" - decompress-tar "^3.0.0" - decompress-tarbz2 "^3.0.0" - decompress-targz "^3.0.0" - decompress-unzip "^3.0.0" - stream-combiner2 "^1.1.1" - vinyl-assign "^1.0.1" - vinyl-fs "^2.2.0" - -deep-extend@^0.4.0, deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - -depd@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" - -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-conflict@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-newline@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-1.0.3.tgz#e97b1003877d70c09af1af35bfadff168de4920d" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - -detective@^4.0.0, detective@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.2.tgz#77697e2e7947ac3fe7c8e26a6d6f115235afa91c" - dependencies: - acorn "^3.1.0" - defined "^1.0.0" - -diff@^2.1.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" - -dom-serializer@~0.1.0, dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domelementtype@1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domhandler@2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - dependencies: - domelementtype "1" - -domutils@1.4: - version "1.4.3" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" - dependencies: - domelementtype "1" - -domutils@1.5: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - dependencies: - is-obj "^1.0.0" - -download@^4.1.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" - dependencies: - caw "^1.0.1" - concat-stream "^1.4.7" - each-async "^1.0.0" - filenamify "^1.0.1" - got "^5.0.0" - gulp-decompress "^1.2.0" - gulp-rename "^1.2.0" - is-url "^1.2.0" - object-assign "^4.0.1" - read-all-stream "^3.0.0" - readable-stream "^2.0.2" - stream-combiner2 "^1.1.1" - vinyl "^1.0.0" - vinyl-fs "^2.2.0" - ware "^1.2.0" - -duplexer2@^0.1.4, duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer2@~0.0.2, duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" - dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -each-async@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" - dependencies: - onetime "^1.0.0" - set-immediate-shim "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -ejs@^2.3.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.2.tgz#21444ba09386f0c65b6eafb96a3d51bcb3be80d1" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" - dependencies: - once "~1.3.0" - -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - -entities@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" - -"errno@>=0.1.1 <0.2.0-0": - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" - dependencies: - prr "~0.0.0" - -error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" - dependencies: - is-arrayish "^0.2.1" - -errorhandler@~1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f" - dependencies: - accepts "~1.3.0" - escape-html "~1.0.3" - -es5-ext@^0.10.7, es5-ext@~0.10.11, es5-ext@~0.10.2: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" - dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" - -es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - -es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-html@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escodegen@^1.6.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -esprima-fb@^15001.1.0-dev-harmony-fb: - version "15001.1.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" - -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - -esprima@^2.0.0, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-target-shim@^1.0.5: - version "1.1.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" - -exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" - dependencies: - merge "^1.1.3" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -express-session@~1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af" - dependencies: - cookie "0.1.3" - cookie-signature "1.0.6" - crc "3.3.0" - debug "~2.2.0" - depd "~1.0.1" - on-headers "~1.0.0" - parseurl "~1.3.0" - uid-safe "~2.0.0" - utils-merge "1.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fancy-log@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.2.0.tgz#d5a51b53e9ab22ca07d558f2b67ae55fdb5fcbd8" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" - -fb-watchman@^1.8.0, fb-watchman@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" - dependencies: - bser "^1.0.2" - -fbjs-scripts@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-0.7.1.tgz#4f115e218e243e3addbf0eddaac1e3c62f703fac" - dependencies: - babel-core "^6.7.2" - babel-preset-fbjs "^1.0.0" - core-js "^1.0.0" - cross-spawn "^3.0.1" - gulp-util "^3.0.4" - object-assign "^4.0.1" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^0.8.3, fbjs@^0.8.4: - version "0.8.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.5.tgz#f69ba8a876096cb1b9bffe4d7c1e71c19d39d008" - dependencies: - core-js "^1.0.0" - immutable "^3.7.6" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - ua-parser-js "^0.7.9" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -file-type@^3.1.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" - -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - -filenamify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -filled-array@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" - -finalhandler@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b" - dependencies: - debug "~2.2.0" - escape-html "1.0.2" - on-finished "~2.3.0" - unpipe "~1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -first-chunk-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" - dependencies: - readable-stream "^2.0.2" - -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" - -for-own@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" - dependencies: - for-in "^0.1.5" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.1.tgz#4adf0342e1a79afa1e84c8c320a9ffc82392a1f3" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" - dependencies: - samsam "~1.1" - -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" - -fs-extra@^0.26.2: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -gauge@~1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" - dependencies: - ansi "^0.3.0" - has-unicode "^2.0.0" - lodash.pad "^4.1.0" - lodash.padend "^4.1.0" - lodash.padstart "^4.1.0" - -gauge@~2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-color "^0.1.7" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -get-proxy@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" - dependencies: - rc "^1.1.2" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" - dependencies: - assert-plus "^1.0.0" - -gh-got@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-2.4.0.tgz#aa51418911ca5e4f92437114cd1209383a4aa019" - dependencies: - got "^5.2.0" - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -github-username@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/github-username/-/github-username-2.1.0.tgz#200e5a104af42ba08a54096c708d4b6ec2fa256b" - dependencies: - gh-got "^2.2.0" - meow "^3.5.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.0.1.tgz#60021327cc963ddc3b5f085764f500479ecd82ff" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob@^5.0.15, glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.1, glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^9.0.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" - -globby@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^6.0.1" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -got@^5.0.0, got@^5.2.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-5.6.0.tgz#bb1d7ee163b78082bbc8eb836f3f395004ea6fbf" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-plain-obj "^1.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^2.0.0" - unzip-response "^1.0.0" - url-parse-lax "^1.0.0" - -graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -grouped-queue@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.2.tgz#1005f70ece919eccbb37a318f84af99fd6c4eb5c" - dependencies: - lodash "^3.10.1" - -gruntfile-editor@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gruntfile-editor/-/gruntfile-editor-1.2.0.tgz#169cc7ff532f0b2eb900eec351f7a2bf668302d0" - dependencies: - ast-query "^1.0.1" - lodash "^4.6.1" - -gulp-decompress@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" - dependencies: - archive-type "^3.0.0" - decompress "^3.0.0" - gulp-util "^3.0.1" - readable-stream "^2.0.2" - -gulp-rename@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-util@^3.0.1, gulp-util@^3.0.4: - version "3.0.7" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^1.0.11" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-color@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" - -html-wiring@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/html-wiring/-/html-wiring-1.2.0.tgz#c5f90a776e0a27241dc6df9022c37186d0270f9e" - dependencies: - cheerio "^0.19.0" - detect-newline "^1.0.3" - -htmlparser2@~3.8.1: - version "3.8.3" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" - dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" - -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - dependencies: - inherits "~2.0.1" - statuses "1" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13, iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@0.4.11: - version "0.4.11" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade" - -image-size@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.3.5.tgz#83240eab2fb5b00b04aab8c74b0471e9cba7ad8c" - -immutable@^3.7.6: - version "3.8.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" - -immutable@~3.7.6: - version "3.7.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.11.4.tgz#81e3374e8361beaff2d97016206d359d0b32fa4d" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^1.0.1" - figures "^1.3.5" - lodash "^3.3.1" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -invariant@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-absolute@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - dependencies: - is-relative "^0.1.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-bzip2@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" - -is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" - -is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-natural-number@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-tar@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-url@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - -is-zip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" - -isarray@~1.0.0, isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isemail@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" - -isexe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istextorbinary@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" - dependencies: - binaryextensions "~1.0.0" - textextensions "~1.0.0" - -jest-haste-map@15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-15.0.1.tgz#1d1c342fa6f6d62d9bc2af76428d2e20f74a44d3" - dependencies: - fb-watchman "^1.9.0" - graceful-fs "^4.1.6" - multimatch "^2.1.0" - worker-farm "^1.3.1" - -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -joi@^6.6.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" - dependencies: - hoek "2.x.x" - isemail "1.x.x" - moment "2.x.x" - topo "1.x.x" - -js-tokens@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" - -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" - -jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - -json5@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonparse@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" - -jsonpointer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" - -JSONStream@^1.0.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.2.1.tgz#32aa5790e799481083b49b4b7fa94e23bae69bf9" - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" - dependencies: - extsprintf "1.0.2" - json-schema "0.2.3" - verror "1.3.6" - -jstransform@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" - dependencies: - base62 "^1.1.0" - commoner "^0.10.1" - esprima-fb "^15001.1.0-dev-harmony-fb" - object-assign "^2.0.0" - source-map "^0.4.2" - -kind-of@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" - dependencies: - is-buffer "^1.0.2" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - -latest-version@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" - dependencies: - package-json "^2.0.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -lodash-node@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash-node/-/lodash-node-2.4.1.tgz#ea82f7b100c733d1a42af76801e506105e2a80ec" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.pad@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - -lodash.padend@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - -lodash.padstart@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash@^3.1.0, lodash@^3.10.1, lodash@^3.2.0, lodash@^3.3.1, lodash@^3.5.0, lodash@^3.6.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: - version "4.16.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" - -log-symbols@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - -lolex@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, loose-envify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f" - dependencies: - js-tokens "^1.0.1" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@^4.0.0, lru-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -mem-fs-editor@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-2.3.0.tgz#42a0ae1f55e76fd03f09e7c7b15b6307bdf5cb13" - dependencies: - commondir "^1.0.1" - deep-extend "^0.4.0" - ejs "^2.3.1" - glob "^7.0.3" - globby "^4.0.0" - mkdirp "^0.5.0" - multimatch "^2.0.0" - rimraf "^2.2.8" - through2 "^2.0.0" - vinyl "^1.1.0" - -mem-fs@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" - dependencies: - through2 "^2.0.0" - vinyl "^1.1.0" - vinyl-file "^2.0.0" - -meow@^3.1.0, meow@^3.3.0, meow@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.0.tgz#9cfd156fef35421e2b5403ce11dc6eb1962b026e" - dependencies: - readable-stream "^2.0.1" - -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - -method-override@~2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.6.tgz#209261cc588d45d9d5a022ff20d7d5eb8e92179e" - dependencies: - debug "~2.2.0" - methods "~1.1.2" - parseurl "~1.3.1" - vary "~1.1.0" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -"mime-db@>= 1.23.0 < 2", mime-db@~1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" - -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: - version "2.1.12" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" - dependencies: - mime-db "~1.24.0" - -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - dependencies: - mime-db "~1.23.0" - -mime@^1.3.4, mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - -minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mock-fs@^3.9.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-3.11.0.tgz#096f21dfe985189a0a6efc4b38ceb404ee8e8911" - dependencies: - rewire "2.5.2" - semver "5.1.1" - -mockery@^1.6.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/mockery/-/mockery-1.7.0.tgz#f4ede0d8750c1c9727c272ea2c60629e2c9a1c4f" - -module-deps@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" - dependencies: - browser-resolve "^1.7.0" - concat-stream "~1.4.5" - defined "^1.0.0" - detective "^4.0.0" - duplexer2 "0.0.2" - inherits "^2.0.1" - JSONStream "^1.0.3" - parents "^1.0.0" - readable-stream "^1.1.13" - resolve "^1.1.3" - stream-combiner2 "~1.0.0" - subarg "^1.0.0" - through2 "^1.0.0" - xtend "^4.0.0" - -moment@2.x.x: - version "2.15.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" - -morgan@~1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2" - dependencies: - basic-auth "~1.0.3" - debug "~2.2.0" - depd "~1.0.1" - on-finished "~2.3.0" - on-headers "~1.0.0" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -multimatch@^2.0.0, multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multiparty@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f" - dependencies: - readable-stream "~1.1.9" - stream-counter "~0.2.0" - -multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -nan@^2.3.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" - -needle: - version "1.3.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-1.3.0.tgz#d32ff70c37d63411afb313fae517e9157c32e62e" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - -negotiator@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -node-fetch@^1.0.1, node-fetch@^1.3.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-gyp@^3.3.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - minimatch "^3.0.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3" - osenv "0" - path-array "^1.0.0" - request "2" - rimraf "2" - semver "2.x || 3.x || 4 || 5" - tar "^2.0.0" - which "1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - -node-uuid@~1.4.7, node-uuid@1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -node-uuid@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.3.3.tgz#d3db4d7b56810d9e4032342766282af07391729b" - -nopt@^3.0.0, "nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - -npmlog@^2.0.0, npmlog@^2.0.2, npmlog@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" - dependencies: - ansi "~0.3.1" - are-we-there-yet "~1.1.2" - gauge "~1.2.5" - -"npmlog@0 || 1 || 2 || 3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.6.0" - set-blocking "~2.0.0" - -nth-check@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" - dependencies: - boolbase "~1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -opn@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" - dependencies: - object-assign "^4.0.1" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.0, osenv@0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -package-json@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" - dependencies: - got "^5.0.0" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parents@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" - dependencies: - path-platform "~0.11.15" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.1.0, parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parseurl@~1.3.0, parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" - -path-array@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" - dependencies: - array-index "^1.0.0" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0, path-exists@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-platform@~0.11.15: - version "0.11.15" - resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pause@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74" - -pegjs@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.6.2.tgz#74651f8a800e444db688e4eeae8edb65637a17a5" - -pegjs@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.9.0.tgz#f6aefa2e3ce56169208e52179dfe41f89141a369" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -plist@^1.2.0, plist@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593" - dependencies: - base64-js "0.0.8" - util-deprecate "1.0.2" - xmlbuilder "4.0.0" - xmldom "0.1.x" - -plist@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-1.1.0.tgz#ff6708590c97cc438e7bc45de5251bd725f3f89d" - dependencies: - base64-js "0.0.6" - util-deprecate "1.0.0" - xmlbuilder "2.2.1" - xmldom "0.1.x" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-bytes@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-2.0.1.tgz#155ec4d0036f41391e7045d6dbe4963d525d264f" - dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" - number-is-nan "^1.0.0" - -private@^0.1.6, private@~0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -promise@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" - dependencies: - asap "~2.0.3" - -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -q@^1.1.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - -qs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" - -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -random-bytes@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" - -randomatic@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - -range-parser@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" - -raw-body@~2.1.2: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~1.0.4" - -react-clone-referenced-element@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682" - -react-deep-force-update@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7" - -react-native: - version "0.36.0" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.36.0.tgz#3ce19cebcf99e2dc5a889cbb74201ef63ecb6a55" - dependencies: - absolute-path "^0.0.0" - art "^0.10.0" - async "^2.0.1" - babel-core "^6.10.4" - babel-generator "^6.14.0" - babel-plugin-external-helpers "^6.8.0" - babel-plugin-syntax-trailing-function-commas "^6.5.0" - babel-plugin-transform-flow-strip-types "^6.6.5" - babel-plugin-transform-object-rest-spread "^6.6.5" - babel-polyfill "^6.9.1" - babel-preset-es2015-node "^6.1.0" - babel-preset-fbjs "^2.0.0" - babel-preset-react-native "^1.9.0" - babel-register "^6.6.0" - babel-types "^6.6.4" - babylon "^6.8.2" - base64-js "^1.1.2" - bser "^1.0.2" - chalk "^1.1.1" - commander "^2.9.0" - connect "^2.8.3" - core-js "^2.2.2" - debug "^2.2.0" - denodeify "^1.2.1" - event-target-shim "^1.0.5" - fbjs "^0.8.3" - fbjs-scripts "^0.7.0" - fs-extra "^0.26.2" - glob "^5.0.15" - graceful-fs "^4.1.3" - image-size "^0.3.5" - immutable "~3.7.6" - inquirer "^0.12.0" - jest-haste-map "15.0.1" - joi "^6.6.1" - json-stable-stringify "^1.0.1" - json5 "^0.4.0" - jstransform "^11.0.3" - lodash "^3.10.1" - mime "^1.3.4" - mime-types "2.1.11" - minimist "^1.2.0" - mkdirp "^0.5.1" - module-deps "^3.9.1" - node-fetch "^1.3.3" - npmlog "^2.0.4" - opn "^3.0.2" - optimist "^0.6.1" - plist "^1.2.0" - progress "^1.1.8" - promise "^7.1.1" - react-clone-referenced-element "^1.0.1" - react-timer-mixin "^0.13.2" - react-transform-hmr "^1.0.4" - rebound "^0.0.13" - regenerator-runtime "^0.9.5" - sane "~1.4.1" - semver "^5.0.3" - source-map "^0.5.6" - stacktrace-parser "^0.1.3" - temp "0.8.3" - uglify-js "^2.6.2" - whatwg-fetch "^1.0.0" - wordwrap "^1.0.0" - worker-farm "^1.3.1" - ws "^1.1.0" - xcode "^0.8.9" - xmldoc "^0.4.0" - yargs "^3.24.0" - yeoman-environment "1.5.3" - yeoman-generator "0.21.2" - -react-native-fs@^1.1.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-1.5.1.tgz#5f98a3d59eb6d27d1217b720a31d10fe576b57c4" - dependencies: - base-64 "^0.1.0" - bluebird "^2.9.25" - utf8 "^2.1.1" - -react-proxy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - dependencies: - lodash "^4.6.1" - react-deep-force-update "^1.0.0" - -react-timer-mixin@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.3.tgz#0da8b9f807ec07dc3e854d082c737c65605b3d22" - -react-transform-hmr@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - dependencies: - global "^4.3.0" - react-proxy "^1.1.7" - -react@~15.3.1: - version "15.3.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.3.2.tgz#a7bccd2fee8af126b0317e222c28d1d54528d09e" - dependencies: - fbjs "^0.8.4" - loose-envify "^1.1.0" - object-assign "^4.1.0" - -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -read-chunk@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^1.1.13, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.8, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.0.0, readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -realm: - version "0.14.3" - resolved "https://registry.yarnpkg.com/realm/-/realm-0.14.3.tgz#11f281d7240b14edcbed94d6dd06384dfff58408" - dependencies: - bindings "^1.2.1" - mockery "^1.6.2" - nan "^2.3.3" - node-gyp "^3.3.1" - rnpm "1.6.5" - xcode "0.8.4" - -"realm-tests@file:../js": - version "0.0.1" - dependencies: - es6-promise "^3.2.1" - -rebound@^0.0.13: - version "0.0.13" - resolved "https://registry.yarnpkg.com/rebound/-/rebound-0.0.13.tgz#4a225254caf7da756797b19c5817bf7a7941fac1" - -recast@^0.10.0: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regenerate@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" - -regenerator-runtime@^0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-auth-token@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" - dependencies: - rc "^1.1.6" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -request@2: - version "2.76.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - -requires-port@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -resolve@^1.1.3, resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -response-time@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.1.tgz#2bde19181de6c81ab95e3207a28d61d965b31797" - dependencies: - depd "~1.0.1" - on-headers "~1.0.0" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - -rewire@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.5.2.tgz#6427de7b7feefa7d36401507eb64a5385bc58dc7" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.2.0, rimraf@^2.2.8, rimraf@2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" - dependencies: - glob "^7.0.5" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - -rndm@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" - -rnpm-plugin-install@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/rnpm-plugin-install/-/rnpm-plugin-install-1.1.0.tgz#5a46cabf2c523e59a6006337c96f46c4f2bfaf69" - dependencies: - npmlog "^2.0.2" - -rnpm-plugin-link@^1.7.2: - version "1.8.0" - resolved "https://registry.yarnpkg.com/rnpm-plugin-link/-/rnpm-plugin-link-1.8.0.tgz#57afe5cfc18cca3aee0d8a1dc253d28edafb593c" - dependencies: - fs-extra "^0.26.2" - glob "^7.0.0" - inquirer "^0.12.0" - lodash "^3.10.1" - mime "^1.3.4" - mock-fs "^3.9.0" - npmlog "^2.0.0" - plist "^1.2.0" - semver "^5.1.0" - to-camel-case "^1.0.0" - xcode "^0.8.8" - -rnpm@1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/rnpm/-/rnpm-1.6.5.tgz#d82bdbe3560965c4e5eb81dc51cd947c83f2fd7f" - dependencies: - commander "^2.9.0" - glob "^7.0.1" - lodash "^3.10.1" - rnpm-plugin-install "^1.0.0" - rnpm-plugin-link "^1.7.2" - update-notifier "^0.6.0" - xmldoc "^0.4.0" - -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -samsam@~1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" - -samsam@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" - -sane@~1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" - dependencies: - exec-sh "^0.2.0" - fb-watchman "^1.8.0" - minimatch "^3.0.2" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.10.0" - -sax@~1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" - -seek-bzip@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - dependencies: - commander "~2.8.1" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -semver@^5.0.3, semver@^5.1.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.x: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" - -send@0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.3.1" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.0.3" - statuses "~1.2.1" - -serve-favicon@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.0.tgz#aed36cc6834069a6f189cc7222c6a1a811dc5b39" - dependencies: - etag "~1.7.0" - fresh "0.3.0" - ms "0.7.1" - parseurl "~1.3.0" - -serve-index@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2" - dependencies: - accepts "~1.2.13" - batch "0.5.3" - debug "~2.2.0" - escape-html "~1.0.3" - http-errors "~1.3.1" - mime-types "~2.1.9" - parseurl "~1.3.1" - -serve-static@~1.10.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" - dependencies: - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.13.2" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -shelljs@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" - -signal-exit@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" - -simple-plist@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.0.4.tgz#7f863438b63cb75df99dd81b8336d7c5075cfc0b" - dependencies: - bplist-creator "0.0.4" - bplist-parser "0.0.6" - plist "1.1.0" - -simple-plist@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.1.4.tgz#10eb51b47e33c556eb8ec46d5ee64d64e717db5d" - dependencies: - bplist-creator "0.0.4" - bplist-parser "0.0.6" - plist "1.2.0" - -sinon@^1.9.1: - version "1.17.6" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" - dependencies: - formatio "1.1.1" - lolex "1.3.2" - samsam "1.1.2" - util ">=0.10.3 <1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-map-support@^0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" - dependencies: - source-map "^0.5.3" - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - dependencies: - amdefine ">=0.0.4" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -sprintf-js@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stacktrace-parser@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -statuses@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" - -statuses@1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" - -stream-buffers@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-0.2.6.tgz#181c08d5bb3690045f69401b9ae6a7a0cf3313fc" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-combiner2@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671" - dependencies: - duplexer2 "~0.0.2" - through2 "~0.5.1" - -stream-counter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de" - dependencies: - readable-stream "~1.1.8" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" - dependencies: - first-chunk-stream "^2.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-dirs@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" - dependencies: - chalk "^1.0.0" - get-stdin "^4.0.1" - is-absolute "^0.1.5" - is-natural-number "^2.0.0" - minimist "^1.1.0" - sum-up "^1.0.1" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - -strip-outer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8" - dependencies: - escape-string-regexp "^1.0.2" - -subarg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - dependencies: - minimist "^1.1.0" - -sum-up@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - dependencies: - chalk "^1.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -tar-stream@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -textextensions@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" - -through@^2.3.6, "through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^0.6.0, through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" - dependencies: - readable-stream ">=1.1.13-1 <1.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" - dependencies: - readable-stream "~2.0.0" - xtend "~4.0.0" - -through2@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -time-stamp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" - -timed-out@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - dependencies: - extend-shallow "^2.0.1" - -to-camel-case@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" - dependencies: - to-space-case "^1.0.0" - -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - -to-no-case@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" - -to-space-case@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" - dependencies: - to-no-case "^1.0.0" - -topo@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" - dependencies: - hoek "2.x.x" - -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -traverse@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - dependencies: - escape-string-regexp "^1.0.2" - -tsscmp@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" - -tunnel-agent@^0.4.0, tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.6: - version "1.6.13" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.11" - -typedarray@~0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -ua-parser-js@^0.7.9: - version "0.7.10" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" - -uglify-js@^2.6.2: - version "2.7.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uid-safe@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137" - dependencies: - base64-url "1.2.1" - -uid-safe@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.1.tgz#3dbf9436b528be9f52882c05a6216c3763db3666" - dependencies: - base64-url "1.2.2" - random-bytes "~1.0.0" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - -underscore.string@^3.0.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - dependencies: - sprintf-js "^1.0.3" - util-deprecate "^1.0.2" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -unpipe@~1.0.0, unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -untildify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" - dependencies: - os-homedir "^1.0.0" - -unzip-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.1.tgz#4a73959f2989470fa503791cefb54e1dbbc68412" - -update-notifier@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.6.3.tgz#776dec8daa13e962a341e8a1d98354306b67ae08" - dependencies: - boxen "^0.3.1" - chalk "^1.0.0" - configstore "^2.0.0" - is-npm "^1.0.0" - latest-version "^2.0.0" - semver-diff "^2.0.0" - -url-parse: - version "1.1.6" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.6.tgz#ab8ff5aea1388071961255e2236147c52ca5fc48" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -utf8@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - -util-deprecate@^1.0.2, util-deprecate@~1.0.1, util-deprecate@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util-deprecate@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.0.tgz#3007af012c140eae26de05576ec22785cac3abf2" - -"util@>=0.10.3 <1": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -vary@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" - -vary@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" - -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" - -vhost@~3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" - -vinyl-assign@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" - dependencies: - object-assign "^4.0.1" - readable-stream "^2.0.0" - -vinyl-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" - dependencies: - graceful-fs "^4.1.2" - pify "^2.3.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - strip-bom-stream "^2.0.0" - vinyl "^1.1.0" - -vinyl-fs@^2.2.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^1.0.0, vinyl@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -ware@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" - dependencies: - wrap-fn "^0.1.0" - -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - -whatwg-fetch@^1.0.0, whatwg-fetch@>=0.10.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz#01c2ac4df40e236aaa18480e3be74bd5c8eb798e" - -which@^1.2.8, which@^1.2.9, which@1: - version "1.2.11" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" - dependencies: - isexe "^1.1.1" - -wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" - dependencies: - string-width "^1.0.1" - -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@^1.0.0, wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -worker-farm@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" - dependencies: - errno ">=0.1.1 <0.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - -wrap-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" - dependencies: - string-width "^1.0.1" - -wrap-fn@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" - dependencies: - co "3.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" - dependencies: - graceful-fs "^4.1.2" - imurmurhash "^0.1.4" - slide "^1.1.5" - -ws@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -xcode@^0.8.8, xcode@^0.8.9: - version "0.8.9" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.9.tgz#ec6765f70e9dccccc9f6e9a5b9b4e7e814b4cf35" - dependencies: - node-uuid "1.4.7" - pegjs "0.9.0" - simple-plist "0.1.4" - -xcode@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.8.4.tgz#e82c64675fcae3cb02e9ceb801d786dd90123604" - dependencies: - node-uuid "1.3.3" - pegjs "0.6.2" - simple-plist "0.0.4" - -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - dependencies: - os-homedir "^1.0.0" - -xmlbuilder@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" - dependencies: - lodash "^4.0.0" - -xmlbuilder@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-2.2.1.tgz#9326430f130d87435d4c4086643aa2926e105a32" - dependencies: - lodash-node "~2.4.1" - -xmlbuilder@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3" - dependencies: - lodash "^3.5.0" - -xmldoc@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" - dependencies: - sax "~1.1.1" - -xmldom@0.1.x: - version "0.1.22" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.22.tgz#10de4e5e964981f03c8cc72fadc08d14b6c3aa26" - -xtend@^4.0.0, "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" - -yargs@^3.24.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yauzl@^2.2.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.7.0.tgz#e21d847868b496fc29eaec23ee87fdd33e9b2bce" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - -yeoman-assert@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/yeoman-assert/-/yeoman-assert-2.2.1.tgz#524bff6b2a83d344a7a24ea825c5eb16504396f5" - dependencies: - lodash "^3.6.0" - path-exists "^2.1.0" - -yeoman-environment@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-1.5.3.tgz#76f0d14bd2529ca912bd6d20bcb717f8cd1a9ce7" - dependencies: - chalk "^1.0.0" - debug "^2.0.0" - diff "^2.1.2" - escape-string-regexp "^1.0.2" - globby "^4.0.0" - grouped-queue "^0.3.0" - inquirer "^0.11.0" - lodash "^3.1.0" - log-symbols "^1.0.1" - mem-fs "^1.1.0" - text-table "^0.2.0" - untildify "^2.0.0" - -yeoman-generator@0.21.2: - version "0.21.2" - resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-0.21.2.tgz#3e2e32fe59442ddab33924e16f4cb621f0bd1d06" - dependencies: - async "^1.4.2" - chalk "^1.0.0" - class-extend "^0.1.0" - cli-table "^0.3.1" - cross-spawn "^2.0.0" - dargs "^4.0.0" - dateformat "^1.0.11" - debug "^2.1.0" - detect-conflict "^1.0.0" - download "^4.1.2" - find-up "^1.0.0" - github-username "^2.0.0" - glob "^5.0.3" - gruntfile-editor "^1.0.0" - html-wiring "^1.0.0" - inquirer "^0.11.0" - istextorbinary "^1.0.2" - lodash "^3.5.0" - mem-fs-editor "^2.0.0" - mkdirp "^0.5.0" - nopt "^3.0.0" - path-exists "^2.0.0" - path-is-absolute "^1.0.0" - pretty-bytes "^2.0.1" - read-chunk "^1.0.1" - read-pkg-up "^1.0.1" - rimraf "^2.2.0" - shelljs "^0.5.0" - sinon "^1.9.1" - text-table "^0.2.0" - through2 "^2.0.0" - underscore.string "^3.0.3" - user-home "^2.0.0" - xdg-basedir "^2.0.0" - yeoman-assert "^2.0.0" - yeoman-environment "1.5.3" - yeoman-welcome "^1.0.0" - -yeoman-welcome@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/yeoman-welcome/-/yeoman-welcome-1.0.1.tgz#f6cf198fd4fba8a771672c26cdfb8a64795c84ec" - dependencies: - chalk "^1.0.0" - From 08ffc3bf15cf9fd64954afa7c5d77febeb6aab66 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Thu, 10 Nov 2016 23:55:26 -0800 Subject: [PATCH 070/100] ccache support --- .../ios/ReactExample.xcodeproj/project.pbxproj | 2 ++ .../ios/RealmReact.xcodeproj/project.pbxproj | 2 ++ scripts/ccache-clang++.sh | 11 +++++++++++ scripts/ccache-clang.sh | 11 +++++++++++ scripts/test.sh | 12 +----------- src/RealmJS.xcodeproj/project.pbxproj | 2 ++ .../ios/ReactTests.xcodeproj/project.pbxproj | 2 ++ 7 files changed, 31 insertions(+), 11 deletions(-) create mode 100755 scripts/ccache-clang++.sh create mode 100755 scripts/ccache-clang.sh diff --git a/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj b/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj index e7fa3424..15c72b0d 100644 --- a/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj +++ b/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj @@ -717,6 +717,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../../scripts/ccache-clang"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -764,6 +765,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../../scripts/ccache-clang"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; diff --git a/react-native/ios/RealmReact.xcodeproj/project.pbxproj b/react-native/ios/RealmReact.xcodeproj/project.pbxproj index 1818e93b..ce266297 100644 --- a/react-native/ios/RealmReact.xcodeproj/project.pbxproj +++ b/react-native/ios/RealmReact.xcodeproj/project.pbxproj @@ -247,6 +247,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../scripts/ccache-clang.sh"; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; @@ -296,6 +297,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../scripts/ccache-clang.sh"; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; diff --git a/scripts/ccache-clang++.sh b/scripts/ccache-clang++.sh new file mode 100755 index 00000000..b2bb5160 --- /dev/null +++ b/scripts/ccache-clang++.sh @@ -0,0 +1,11 @@ +#!/bin/sh +if type -p /usr/local/bin/ccache >/dev/null 2>&1; then + export CCACHE_MAXSIZE=10G + export CCACHE_CPP2=true + export CCACHE_HARDLINK=true + export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches + exec /usr/local/bin/ccache /usr/bin/clang++ "$@" +else + exec clang++ "$@" +fi + diff --git a/scripts/ccache-clang.sh b/scripts/ccache-clang.sh new file mode 100755 index 00000000..f0be481a --- /dev/null +++ b/scripts/ccache-clang.sh @@ -0,0 +1,11 @@ +#!/bin/sh +if type -p /usr/local/bin/ccache >/dev/null 2>&1; then + export CCACHE_MAXSIZE=10G + export CCACHE_CPP2=true + export CCACHE_HARDLINK=true + export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches + exec /usr/local/bin/ccache /usr/bin/clang "$@" +else + exec clang "$@" +fi + diff --git a/scripts/test.sh b/scripts/test.sh index 3c2f2015..e6c607b2 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -122,19 +122,13 @@ case "$TARGET" in npm run jsdoc ;; "realmjs") - #HACK - brew install yarn pushd src xctest RealmJS ;; "react-tests") pushd tests/react-test-app - if [ -f ../../target=node_modules/react_tests_node_modules.zip ]; then - unzip -q ../../target=node_modules/react_tests_node_modules.zip - fi - - yarn install + npm install open_chrome start_packager @@ -144,10 +138,6 @@ case "$TARGET" in "react-example") pushd examples/ReactExample - if [ -f ../../target=node_modules/react_example_node_modules.zip ]; then - unzip -q ../../target=node_modules/react_example_node_modules.zip - fi - npm install open_chrome start_packager diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 85437a4e..04b2f057 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -995,6 +995,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -1056,6 +1057,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index cb29d2cf..a2935579 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -807,6 +807,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -859,6 +860,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; From d229cd61308db05b2cb40bac27040d24dca25c00 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 00:14:52 -0800 Subject: [PATCH 071/100] throw exception when trying to open a realm with an invalid user --- react-native/ios/RealmReact.xcodeproj/project.pbxproj | 2 ++ src/RealmJS.xcodeproj/project.pbxproj | 2 ++ src/js_sync.hpp | 4 ++++ tests/js/user-tests.js | 5 +++-- .../react-test-app/ios/ReactTests.xcodeproj/project.pbxproj | 2 ++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/react-native/ios/RealmReact.xcodeproj/project.pbxproj b/react-native/ios/RealmReact.xcodeproj/project.pbxproj index ce266297..56a96405 100644 --- a/react-native/ios/RealmReact.xcodeproj/project.pbxproj +++ b/react-native/ios/RealmReact.xcodeproj/project.pbxproj @@ -264,6 +264,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CXX = "$(SRCROOT)/../../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -314,6 +315,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CXX = "$(SRCROOT)/../../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 04b2f057..fb10cd2c 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -1012,6 +1012,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 0.14.3; + CXX = "$(SRCROOT)/../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -1074,6 +1075,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 0.14.3; + CXX = "$(SRCROOT)/../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; diff --git a/src/js_sync.hpp b/src/js_sync.hpp index ab279673..941a7078 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -295,6 +295,10 @@ void SyncClass::populate_sync_config(ContextType ctx, FunctionType realm_cons ObjectType user = Object::validated_get_object(ctx, sync_config_object, "user"); SharedUser shared_user = *get_internal>(user); + if (shared_user->state() != SyncUser::State::Active) { + throw std::runtime_error("User is no longer valid."); + } + std::string raw_realm_url = Object::validated_get_string(ctx, sync_config_object, "url"); // FIXME - use make_shared diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 66a8680f..83202b62 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -109,8 +109,9 @@ module.exports = { TestCase.assertUndefined(Realm.Sync.User.current); // Can we open a realm with the registered user? - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); - TestCase.assertUndefined(realm); + TestCase.assertThrows(function() { + var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + }); }) }, diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index a2935579..d23f43b4 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -825,6 +825,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -878,6 +879,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; From 900827d72f13f647c5af18112765985e92e5d51c Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Fri, 11 Nov 2016 14:46:16 +0100 Subject: [PATCH 072/100] Skip the download if PREFIX env variables are defined --- scripts/download-core.sh | 82 ++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 8c1d7b22..4d0ab6c9 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -94,50 +94,58 @@ check_release_notes() { grep -Fqi "$REALM_CORE_VERSION RELEASE NOTES" "$@" } -if [ ! -e "vendor/$CORE_DIR" ]; then - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core -elif [ -d "vendor/$CORE_DIR" -a -d ../realm-core -a ! -L "vendor/$CORE_DIR" ]; then - # Allow newer versions than expected for local builds as testing - # with unreleased versions is one of the reasons to use a local build - if ! check_release_notes "vendor/$CORE_DIR/CHANGELOG.txt"; then - die "Local build of core is out of date." - else - echo "The core library seems to be up to date." - fi -elif [ ! -L "vendor/$CORE_DIR" ]; then - echo "vendor/$CORE_DIR is not a symlink. Deleting..." - rm -rf "vendor/$CORE_DIR" - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core -# With a prebuilt version we only want to check the first non-empty -# line so that checking out an older commit will download the -# appropriate version of core if the already-present version is too new -elif ! grep -m 1 . "vendor/$CORE_DIR/CHANGELOG.txt" | check_release_notes; then - download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core -else - echo "The core library seems to be up to date." -fi - -if [ -n "$SYNC_DOWNLOAD_FILE" ];then - if [ ! -e "vendor/$SYNC_DIR" ]; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR - elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then +if [ -z "$REALM_CORE_PREFIX" ]; then + if [ ! -e "vendor/$CORE_DIR" ]; then + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core + elif [ -d "vendor/$CORE_DIR" -a -d ../realm-core -a ! -L "vendor/$CORE_DIR" ]; then # Allow newer versions than expected for local builds as testing # with unreleased versions is one of the reasons to use a local build - if ! check_release_notes "vendor/$SYNC_DIR/version.txt"; then - die "Local build of sync is out of date." + if ! check_release_notes "vendor/$CORE_DIR/CHANGELOG.txt"; then + die "Local build of core is out of date." else - echo "The sync library seems to be up to date." + echo "The core library seems to be up to date." fi - elif [ ! -L "vendor/$SYNC_DIR" ]; then - echo "vendor/$SYNC_DIR is not a symlink. Deleting..." - rm -rf "vendor/$SYNC_DIR" - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + elif [ ! -L "vendor/$CORE_DIR" ]; then + echo "vendor/$CORE_DIR is not a symlink. Deleting..." + rm -rf "vendor/$CORE_DIR" + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core # With a prebuilt version we only want to check the first non-empty # line so that checking out an older commit will download the # appropriate version of core if the already-present version is too new - elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt"; then - download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + elif ! grep -m 1 . "vendor/$CORE_DIR/CHANGELOG.txt" | check_release_notes; then + download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core else - echo "The sync library seems to be up to date." + echo "The core library seems to be up to date." fi +else + echo "Skipping core the download because REALM_CORE_PREFIX is defined." +fi + +if [ -z "$REALM_SYNC_PREFIX" ]; then + if [ -n "$SYNC_DOWNLOAD_FILE" ];then + if [ ! -e "vendor/$SYNC_DIR" ]; then + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + elif [ -d "vendor/$SYNC_DIR" -a -d ../realm-sync -a ! -L "vendor/$SYNC_DIR" ]; then + # Allow newer versions than expected for local builds as testing + # with unreleased versions is one of the reasons to use a local build + if ! check_release_notes "vendor/$SYNC_DIR/version.txt"; then + die "Local build of sync is out of date." + else + echo "The sync library seems to be up to date." + fi + elif [ ! -L "vendor/$SYNC_DIR" ]; then + echo "vendor/$SYNC_DIR is not a symlink. Deleting..." + rm -rf "vendor/$SYNC_DIR" + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + # With a prebuilt version we only want to check the first non-empty + # line so that checking out an older commit will download the + # appropriate version of core if the already-present version is too new + elif ! grep -m 1 . "vendor/$SYNC_DIR/version.txt"; then + download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR + else + echo "The sync library seems to be up to date." + fi + fi +else + echo "Skipping the sync download because REALM_SYNC_PREFIX is defined." fi From e268cfef58ba2e370d62a8a29cd61a253f180414 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Fri, 11 Nov 2016 17:39:07 +0100 Subject: [PATCH 073/100] Add variable to enable skipping the download --- binding.gyp | 3 ++- src/node/gyp/realm.gyp | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/binding.gyp b/binding.gyp index bb22d6ae..cdbcc274 100644 --- a/binding.gyp +++ b/binding.gyp @@ -1,6 +1,7 @@ { "variables": { - "realm_node_build_as_library%": "0" + "realm_node_build_as_library%": "0", + "realm_download_binaries%": "1" }, "includes": [ "src/node/gyp/target_defaults.gypi", diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index e89775f3..96c200f4 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -82,14 +82,6 @@ }, "target_name": "vendored-realm", "type": "none", - "actions": [ - { - "action_name": "download-realm", - "inputs": [ ], - "outputs": [ "<(module_root_dir)/vendor/core-node" ], - "action": [ "<(module_root_dir)/scripts/download-core.sh", "node" ] - } - ], "conditions": [ ["realm_enable_sync", { "all_dependent_settings": { @@ -102,9 +94,18 @@ "library_dirs": [ "<(module_root_dir)/vendor/core-node" ] }, + }], + ["realm_download_binaries", { + "actions": [ + { + "action_name": "download-realm", + "inputs": [ ], + "outputs": [ "<(module_root_dir)/vendor/core-node" ], + "action": [ "<(module_root_dir)/scripts/download-core.sh", "node", "<(realm_enable_sync)" ] + } + ] }] ] - } ] } From 0b9cca78d6ca82dbad19fb35d28bae37c9aec971 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Fri, 11 Nov 2016 17:42:35 +0100 Subject: [PATCH 074/100] Download core OR sync No need to download both --- scripts/download-core.sh | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 4d0ab6c9..6c83d962 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -16,6 +16,7 @@ fi # The 'node' argument will result in realm-node build being downloaded. if [ "$1" = 'node' ]; then + ENABLE_SYNC="$2" CORE_DIR="core-node" SYNC_DIR='node-sync' @@ -34,6 +35,8 @@ if [ "$1" = 'node' ]; then SYNC_EXTRACT="unzip" EXTRACTED_DIR="realm-sync-node-cocoa-$REALM_SYNC_VERSION" else + ENABLE_SYNC="yes" # FIXME: This means that both core and sync will be downloaded for non "node" targets. + # Should be 0 or 1. We do not need to download both CORE_DIR='core' PLATFORM_TAG="" SYNC_DIR='sync' @@ -94,7 +97,19 @@ check_release_notes() { grep -Fqi "$REALM_CORE_VERSION RELEASE NOTES" "$@" } -if [ -z "$REALM_CORE_PREFIX" ]; then +DOWNLOAD_CORE=1 + +if ! [ -z "$REALM_CORE_PREFIX" ]; then +DOWNLOAD_CORE=0 +echo "Skipping the core download because REALM_CORE_PREFIX is defined." +fi + +if [ "$ENABLE_SYNC" == 1 ]; then +DOWNLOAD_CORE=0 +echo "Skipping the core download because ENABLE_SYNC is true." +fi + +if [ "$DOWNLOAD_CORE" == 1 ]; then if [ ! -e "vendor/$CORE_DIR" ]; then download_core $CORE_DIR $REALM_CORE_VERSION $CORE_DOWNLOAD_FILE core "tar -xzf" core elif [ -d "vendor/$CORE_DIR" -a -d ../realm-core -a ! -L "vendor/$CORE_DIR" ]; then @@ -117,11 +132,20 @@ if [ -z "$REALM_CORE_PREFIX" ]; then else echo "The core library seems to be up to date." fi -else - echo "Skipping core the download because REALM_CORE_PREFIX is defined." fi -if [ -z "$REALM_SYNC_PREFIX" ]; then +DOWNLOAD_SYNC=1 +if ! [ -z "$REALM_SYNC_PREFIX" ]; then +DOWNLOAD_SYNC=0 +echo "Skipping the sync download because REALM_SYNC_PREFIX is defined." +fi + +if [ "$ENABLE_SYNC" == 0 ]; then +DOWNLOAD_SYNC=0 +echo "Skipping the sync download because ENABLE_SYNC is false." +fi + +if [ "$DOWNLOAD_SYNC" == 1 ]; then if [ -n "$SYNC_DOWNLOAD_FILE" ];then if [ ! -e "vendor/$SYNC_DIR" ]; then download_core $SYNC_DIR $REALM_SYNC_VERSION $SYNC_DOWNLOAD_FILE sync "$SYNC_EXTRACT" $EXTRACTED_DIR @@ -146,6 +170,4 @@ if [ -z "$REALM_SYNC_PREFIX" ]; then echo "The sync library seems to be up to date." fi fi -else - echo "Skipping the sync download because REALM_SYNC_PREFIX is defined." fi From 7970e9d575ab74ee9062e1302cc522d4b5faded2 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 11:12:46 -0800 Subject: [PATCH 075/100] remove outdated/out of place examples --- examples/sync.js | 46 ------------------------- test.js | 89 ------------------------------------------------ 2 files changed, 135 deletions(-) delete mode 100644 examples/sync.js delete mode 100644 test.js diff --git a/examples/sync.js b/examples/sync.js deleted file mode 100644 index 6ddbf945..00000000 --- a/examples/sync.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -var Realm = require('..'); - -var filename = "sync.realm"; -var syncUrl = "realm://127.0.0.1/nodejs/sync.realm"; -var syncUserToken = "eyJpZGVudGl0eSI6Im5vZGVqcy1kZW1vIn0K"; - -function Foo() {} -Foo.schema = { - name: 'Foo', - properties: { - name: Realm.Types.STRING, - number: Realm.Types.INT, - } -}; - -var realm = new Realm({ - path: filename, - syncUrl: syncUrl, - syncUserToken: syncUserToken, - schema: [Foo] -}); - -console.log('Starting...'); - -var prompt = require('prompt'); -prompt.start(); - -var run = true; -var my_prompt = function() { - prompt.get(['command'], function (err, result) { - if (err) { return onErr(err); } - console.log('Command: ' + result.command); - if (result.command == 'exit') { - run = false; - } - - if (run) { - my_prompt(); - } - }); -}; - -my_prompt(); - diff --git a/test.js b/test.js deleted file mode 100644 index 035cfc14..00000000 --- a/test.js +++ /dev/null @@ -1,89 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// 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. -// -//////////////////////////////////////////////////////////////////////////// - -'use strict'; - -const Realm = require('.'); -const prompt = require('prompt'); -const mkdirp = require('mkdirp'); -const wildcard = require('wildcard'); - -var notifier_dir = './notifier'; -mkdirp.sync(notifier_dir); - -// var access_token = 'ewoJImlkZW50aXR5IjogImFkbWluIiwKCSJhY2Nlc3MiOiBbInVwbG9hZCIsICJkb3dubG9hZCIsICJtYW5hZ2UiXQp9Cg==:DlFksxA+cJyEOc9bu6JwBUfDi4fJCagjAcIPPsoisjqfmOzSrk5Omuw0IkxCRU534p2+CAAj5IOH47DfObPtAA8q2DHguYDOKWYxyktS/6doPCqDHYN7k9EgUHdPTkESNkuPZbaVfXZTGzocB8m7+MaEXJde7FGPbh1sBz/+sPldnlAhnOqO5QbWzIEyoGHiOSg3V7UCh2H8kalr3tef7fkE2X65OBMgcarPvM5M6sPijOx2N5zrVrjL2wvguP9zS+g2ybFPUqV3DGv3S8cnGA+wVId/jCfGc2ujNhecunJdENH+/pL+0BTYHCFEWkY1WP1NUyti60FwRaXAtcYxeA=='; -// var admin_user = new Realm.Sync.User.adminUser('http://127.0.0.1:9080/', access_token); -// Realm.Sync.setGlobalListener(notifier_dir, 'realm://127.0.0.1:9080', admin_user, -// (name) => { -// console.log('filter: ' + name); -// return true; -// }, -// (name, realm, changes) => { -// console.log('change: ' + name); -// console.log(changes); -// } -// ); -// console.log('global notifier listening...'); - -Realm.Sync.setLogLevel('error'); - -function createObjects(error, user) { - console.log(user.server); - console.log(user.token); - console.log(user.identity); - - var realm = new Realm({ - sync: { - user: user, - url: 'realm://127.0.0.1:9080/~/demo/realm1' - }, - schema: [{ - name: 'IntObject', - properties: { - int: 'int' - } - }] - }); - - function create(err, result) { - if (err) { - exit(); - } - if (!err) { - realm.write(() => { - realm.create('IntObject', {int: parseInt(result.int)}); - }); - console.log(realm.objects('IntObject')); - } - - prompt.get(['int'], create); - } - prompt.start(); - prompt.get(['int'], create); -} - -if (Realm.Sync.User.all.length) { - console.log('Using persisted user'); - createObjects(undefined, Realm.Sync.User.all[0]); - //Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); -} -else { - console.log('Logging in'); - Realm.Sync.User.login('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); - //Realm.Sync.User.create('http://127.0.0.1:9080/', 'ari', 'aaa', createObjects); -} From 588fc50e9f4e8b290243cb4b51c0a08be619938a Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 11:24:35 -0800 Subject: [PATCH 076/100] try to build then test --- scripts/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index e6c607b2..87b4c693 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -88,12 +88,12 @@ xctest() { local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then mkdir -p build - xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test | tee build/build.log | xcpretty -c --no-utf --report junit --output build/reports/junit.xml || { + xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" build test | tee build/build.log | xcpretty -c --no-utf --report junit --output build/reports/junit.xml || { echo "The raw xcodebuild output is available in build/build.log" exit 1 } else - xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" test + xcodebuild -scheme "$1" -configuration "$CONFIGURATION" -sdk iphonesimulator -destination id="$dest" build test fi } From 7683d1185a44495a3ee46399280401ee3d3362cd Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 11:31:00 -0800 Subject: [PATCH 077/100] rerun tests on failure --- scripts/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index 87b4c693..380ab6d8 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -11,7 +11,7 @@ CONFIGURATION="${2:-"Release"}" DESTINATION= PATH="/opt/android-sdk-linux/platform-tools:$PATH" SRCROOT=$(cd "$(dirname "$0")/.." && pwd) -#XCPRETTY=true +XCPRETTY=true # Start current working directory at the root of the project. cd "$SRCROOT" @@ -133,7 +133,7 @@ case "$TARGET" in start_packager pushd ios - xctest ReactTestApp + xctest ReactTestApp || xctest ReactTestApp ;; "react-example") pushd examples/ReactExample From b2077910a4f699f99bc2fa01d932338e1401871f Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 11:41:27 -0800 Subject: [PATCH 078/100] fix for handle scope warning --- src/js_list.hpp | 2 +- src/js_realm.hpp | 2 +- src/js_results.hpp | 2 +- src/js_sync.hpp | 2 +- src/jsc/jsc_types.hpp | 3 ++- src/node/node_types.hpp | 3 ++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/js_list.hpp b/src/js_list.hpp index a730ad04..86a248e9 100644 --- a/src/js_list.hpp +++ b/src/js_list.hpp @@ -260,7 +260,7 @@ void ListClass::add_listener(ContextType ctx, ObjectType this_object, size_t Protected protected_ctx(Context::get_global_context(ctx)); auto token = list->add_notification_callback([=](CollectionChangeSet change_set, std::exception_ptr exception) { - typename T::HandleScope scope; + HANDLESCOPE ValueType arguments[2]; arguments[0] = static_cast(protected_this); diff --git a/src/js_realm.hpp b/src/js_realm.hpp index 456abf87..f1b06498 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -108,7 +108,7 @@ class RealmDelegate : public BindingContext { std::weak_ptr m_realm; void notify(const char *notification_name) { - typename T::HandleScope scope; + HANDLESCOPE SharedRealm realm = m_realm.lock(); if (!realm) { diff --git a/src/js_results.hpp b/src/js_results.hpp index 2b8f58d4..cc5caa72 100644 --- a/src/js_results.hpp +++ b/src/js_results.hpp @@ -244,7 +244,7 @@ void ResultsClass::add_listener(ContextType ctx, ObjectType this_object, size Protected protected_ctx(Context::get_global_context(ctx)); auto token = results->add_notification_callback([=](CollectionChangeSet change_set, std::exception_ptr exception) { - typename T::HandleScope scope; + HANDLESCOPE ValueType arguments[2]; arguments[0] = static_cast(protected_this); diff --git a/src/js_sync.hpp b/src/js_sync.hpp index 941a7078..b9b38430 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -269,7 +269,7 @@ void SyncClass::populate_sync_config(ContextType ctx, FunctionType realm_cons Protected protected_ctx(Context::get_global_context(ctx)); auto handler = [=](const std::string& path, const realm::SyncConfig& config, std::shared_ptr) { - typename T::HandleScope handle_scope; + HANDLESCOPE if (config.user->is_admin()) { // FIXME: This log-in callback is called while the object store still holds some sync-related locks. // Notify the object store of the access token asynchronously to avoid the deadlock that would result diff --git a/src/jsc/jsc_types.hpp b/src/jsc/jsc_types.hpp index e7b9a868..a01913ff 100644 --- a/src/jsc/jsc_types.hpp +++ b/src/jsc/jsc_types.hpp @@ -24,6 +24,8 @@ #include "js_types.hpp" +#define HANDLESCOPE + namespace realm { namespace jsc { @@ -34,7 +36,6 @@ struct Types { using Object = JSObjectRef; using String = JSStringRef; using Function = JSObjectRef; - using HandleScope = void *; using ConstructorCallback = JSObjectCallAsConstructorCallback; using FunctionCallback = JSObjectCallAsFunctionCallback; diff --git a/src/node/node_types.hpp b/src/node/node_types.hpp index 66799887..a07947e5 100644 --- a/src/node/node_types.hpp +++ b/src/node/node_types.hpp @@ -34,6 +34,8 @@ #define REALM_V8_ARRAY_BUFFER_API 1 #endif +#define HANDLESCOPE Nan::HandleScope handle_scope; + namespace realm { namespace node { @@ -44,7 +46,6 @@ struct Types { using Object = v8::Local; using String = v8::Local; using Function = v8::Local; - using HandleScope = Nan::HandleScope; using ConstructorCallback = v8::FunctionCallback; using FunctionCallback = v8::FunctionCallback; From bb7e98cbbe2608f49a8e50dd82175a7d6ae9e921 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 12:01:31 -0800 Subject: [PATCH 079/100] use latest rn version --- .gitignore | 2 ++ examples/ReactExample/package.json | 4 ++-- tests/react-test-app/package.json | 5 ++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b8c72c30..fccadf5b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ # core core core-* +sync +sync-* # sh build.sh config /Realm/config.mk diff --git a/examples/ReactExample/package.json b/examples/ReactExample/package.json index 5e4829c6..76a04539 100644 --- a/examples/ReactExample/package.json +++ b/examples/ReactExample/package.json @@ -6,8 +6,8 @@ "start": "react-native start" }, "dependencies": { - "react": "~15.2.0", - "react-native": "^0.31.0", + "react": "15.3.2", + "react-native": "^0.37.0", "realm": "file:../.." } } diff --git a/tests/react-test-app/package.json b/tests/react-test-app/package.json index 021d5add..10e94d1e 100644 --- a/tests/react-test-app/package.json +++ b/tests/react-test-app/package.json @@ -6,9 +6,8 @@ "start": "react-native start" }, "dependencies": { - "react": "~15.3.1", - "react-native": "^0.36.0", - "react-native-fs": "^1.1.0", + "react": "15.3.2", + "react-native": "^0.37.0", "realm": "file:../..", "realm-tests": "file:../js", "xmlbuilder": "^4.2.1" From d9398a0bb94a6032aa3af462f426a227506ecb5b Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 12:32:20 -0800 Subject: [PATCH 080/100] restart simulators --- scripts/test.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index 380ab6d8..3a7cf4e5 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -81,10 +81,6 @@ start_packager() { } xctest() { -# if ! [ -z "${JENKINS_HOME}" ]; then -# ${SRCROOT}/scripts/reset-simulators.sh -# fi - local dest="$(xcrun simctl list devices | grep -v unavailable | grep -m 1 -o '[0-9A-F\-]\{36\}')" if [ -n "$XCPRETTY" ]; then mkdir -p build @@ -126,6 +122,10 @@ case "$TARGET" in xctest RealmJS ;; "react-tests") + if ! [ -z "${JENKINS_HOME}" ]; then + ${SRCROOT}/scripts/reset-simulators.sh + fi + pushd tests/react-test-app npm install @@ -136,6 +136,10 @@ case "$TARGET" in xctest ReactTestApp || xctest ReactTestApp ;; "react-example") + if ! [ -z "${JENKINS_HOME}" ]; then + ${SRCROOT}/scripts/reset-simulators.sh + fi + pushd examples/ReactExample npm install From 14e75f12bceef3093a52e94226313ad935552291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Thu, 10 Nov 2016 18:21:57 -0800 Subject: [PATCH 081/100] Documentation for .all and .current --- docs/sync.js | 17 +++++++++++++++++ tests/js/user-tests.js | 14 ++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/docs/sync.js b/docs/sync.js index 41dd0409..4bdbe4fa 100644 --- a/docs/sync.js +++ b/docs/sync.js @@ -81,6 +81,7 @@ class User { * - `user` - a valid User object on success */ login(server, username, password, callback) {} + /** * Login a sync user using an external login provider. * @param {string} server - authentication server @@ -91,6 +92,7 @@ class User { * - `user` - a valid User object on success */ loginWithProvider(server, provider, providerToken, callback) {} + /** * Create a new user using the username/password provider * @param {string} server - authentication server @@ -101,6 +103,7 @@ class User { * - `user` - a valid User object on success */ create(server, username, password, callback) {} + /** * Create an admin user for the given authentication server with an existing token * @param {string} server - authentication server @@ -108,4 +111,18 @@ class User { * @return {User} - admin user populated with the given token and server */ adminUser(server, adminToken) {} + + /** + * A dictionary containing users that are currently logged in. + * The keys in the dictionary are user identities, values are corresponding User objects. + * @type {object} + */ + get all() {}; + + /** + * Get the currently logged in user. + * Throws error if > 1 user logged in, returns undefined if no users logged in. + * @type {User} + */ + get current() {}; } diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 83202b62..a8f4031a 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -65,12 +65,6 @@ function assertIsAuthError(error, code, type) { } } -function rejectOnError(error, reject) { - if (error) { - reject(error); - } -} - function failOnError(error) { if (error) { throw new Error(`Error ${error} was not expected`); @@ -221,14 +215,14 @@ module.exports = { TestCase.assertArrayLength(Object.keys(all), 0); callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', callback), (error, user1) => { - rejectOnError(error, reject); + failOnError(error); all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 1); assertIsSameUser(all[user1.identity], user1); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { - rejectOnError(error, reject); + failOnError(error); all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 2); @@ -256,11 +250,11 @@ module.exports = { TestCase.assertUndefined(Realm.Sync.User.current); callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', callback), (error, user1) => { - rejectOnError(error, reject); + failOnError(error); assertIsSameUser(Realm.Sync.User.current, user1); Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', (error, user2) => { - rejectOnError(error, reject); + failOnError(error); TestCase.assertThrows(() => Realm.Sync.User.current, 'We expect Realm.Sync.User.current to throw if > 1 user.'); user2.logout(); From 2b90def150333101d341606af344700cfacf74d7 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 15:05:08 -0800 Subject: [PATCH 082/100] terrible hack to make rn not retain the context --- src/js_realm.hpp | 11 +++++++++++ src/js_sync.hpp | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index f1b06498..a62790d6 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -148,7 +148,9 @@ class RealmClass : public ClassDefinition> { public: static FunctionType create_constructor(ContextType); +#if REALM_PLATFORM_NODE static Global s_constructor; +#endif // methods static void objects(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); @@ -258,8 +260,10 @@ public: } }; +#if REALM_PLATFORM_NODE template Global RealmClass::s_constructor; +#endif template inline typename T::Function RealmClass::create_constructor(ContextType ctx) { @@ -280,7 +284,10 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); #endif +#if REALM_PLATFORM_NODE s_constructor = Global(ctx, realm_constructor); +#endif + return realm_constructor; } @@ -397,7 +404,11 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t config.encryption_key = std::vector(encryption_key.begin(), encryption_key.end()); } #if REALM_ENABLE_SYNC +#if REALM_PLATFORM_NODE SyncClass::populate_sync_config(ctx, s_constructor, object, config); +#else + SyncClass::populate_sync_config(ctx, Value::validated_to_object(ctx, Object::get_prototype(ctx, this_object)), object, config); +#endif #endif } } diff --git a/src/js_sync.hpp b/src/js_sync.hpp index b9b38430..253ef85c 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -184,7 +184,7 @@ public: // private static void refresh_access_token(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); - static void populate_sync_config(ContextType, FunctionType realm_constructor, ObjectType config_object, Realm::Config&); + static void populate_sync_config(ContextType, ObjectType realm_constructor, ObjectType config_object, Realm::Config&); // static properties static void get_is_developer_edition(ContextType, ObjectType, ReturnValue &); @@ -258,7 +258,7 @@ void SyncClass::refresh_access_token(ContextType ctx, ObjectType this_object, } template -void SyncClass::populate_sync_config(ContextType ctx, FunctionType realm_constructor, ObjectType config_object, Realm::Config& config) { +void SyncClass::populate_sync_config(ContextType ctx, ObjectType realm_constructor, ObjectType config_object, Realm::Config& config) { ValueType sync_config_value = Object::get_property(ctx, config_object, "sync"); if (!Value::is_undefined(ctx, sync_config_value)) { auto sync_config_object = Value::validated_to_object(ctx, sync_config_value); From 043d801bb72bd8f2bc5d80acd404d8ac7752da8f Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 15:33:13 -0800 Subject: [PATCH 083/100] fix for node --- src/js_realm.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index a62790d6..cbee858c 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -405,7 +405,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t } #if REALM_ENABLE_SYNC #if REALM_PLATFORM_NODE - SyncClass::populate_sync_config(ctx, s_constructor, object, config); + SyncClass::populate_sync_config(ctx, FunctionType(s_constructor), object, config); #else SyncClass::populate_sync_config(ctx, Value::validated_to_object(ctx, Object::get_prototype(ctx, this_object)), object, config); #endif From e4d4cbbdf3fccb2cdf779a400bdf99308fc8b05f Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 17:53:58 -0800 Subject: [PATCH 084/100] proper fix/hack removal, partially working sync for rn --- lib/user-methods.js | 2 +- src/RealmJS.xcodeproj/project.pbxproj | 186 -------------------------- src/ios/platform.mm | 2 +- src/js_realm.hpp | 19 +-- src/js_types.hpp | 8 +- src/jsc/jsc_init.h | 1 - src/jsc/jsc_object.hpp | 12 ++ src/jsc/jsc_protected.hpp | 7 - src/node/node_object.hpp | 12 +- src/node/node_protected.hpp | 14 -- 10 files changed, 30 insertions(+), 233 deletions(-) diff --git a/lib/user-methods.js b/lib/user-methods.js index c81853d4..e4cdc409 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -20,7 +20,7 @@ if (typeof fetch != 'undefined') { } }) .then((body) => { - callback(undefined, {statusCode: 200}, body) + callback(undefined, {statusCode: 200}, JSON.parse(body)); }) .catch((error) => { callback(error); diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index fb10cd2c..3ae7e2cc 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -42,23 +42,8 @@ 02F59EE31C88F2BB007F774C /* transact_log_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */; }; 5D25F5A11D6284FD00EBBB30 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = F63FF3301C16434400B3B8E0 /* libz.tbd */; }; 5DC74A781D623C9800D77A4F /* handover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A751D623C8700D77A4F /* handover.cpp */; }; - 5DC74A791D623CA200D77A4F /* handover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A751D623C8700D77A4F /* handover.cpp */; }; 5DC74A7A1D623CA800D77A4F /* thread_confined.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A721D623C7A00D77A4F /* thread_confined.cpp */; }; - 5DC74A7B1D623CA800D77A4F /* thread_confined.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DC74A721D623C7A00D77A4F /* thread_confined.cpp */; }; - F60102D31CBB966E00EC01BA /* js_realm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029048071C0428DF00ABDED4 /* js_realm.cpp */; }; - F60102D41CBB96AB00EC01BA /* index_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EAF1C88F17D007F774C /* index_set.cpp */; }; - F60102D51CBB96AE00EC01BA /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB11C88F17D007F774C /* list.cpp */; }; - F60102D61CBB96B400EC01BA /* object_schema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB41C88F17D007F774C /* object_schema.cpp */; }; - F60102D71CBB96B800EC01BA /* object_store.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB61C88F17D007F774C /* object_store.cpp */; }; - F60102D81CBB96BD00EC01BA /* results.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EB91C88F17D007F774C /* results.cpp */; }; - F60102D91CBB96C100EC01BA /* schema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EBB1C88F17D007F774C /* schema.cpp */; }; - F60102DA1CBB96C300EC01BA /* shared_realm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EBD1C88F17D007F774C /* shared_realm.cpp */; }; - F60102E01CBB96D900EC01BA /* realm_coordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EDB1C88F2BA007F774C /* realm_coordinator.cpp */; }; - F60102E11CBB96DD00EC01BA /* transact_log_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F59EDD1C88F2BB007F774C /* transact_log_handler.cpp */; }; - F60102EA1CBCAFC300EC01BA /* node_dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6267BCA1CADC49200AC36B1 /* node_dummy.cpp */; }; F61378791C18EAC5008BFC51 /* js in Resources */ = {isa = PBXBuildFile; fileRef = F61378781C18EAAC008BFC51 /* js */; }; - F620F0581CB766DA0082977B /* node_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F620F0571CB766DA0082977B /* node_init.cpp */; }; - F620F0751CB9F60C0082977B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F620F0741CB9F60C0082977B /* CoreFoundation.framework */; }; F63FF2C61C12469E00B3B8E0 /* jsc_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029048011C0428DF00ABDED4 /* jsc_init.cpp */; }; F63FF2C91C12469E00B3B8E0 /* js_realm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029048071C0428DF00ABDED4 /* js_realm.cpp */; }; F63FF2CD1C12469E00B3B8E0 /* rpc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0290480F1C0428DF00ABDED4 /* rpc.cpp */; }; @@ -77,14 +62,8 @@ F63FF3251C1642BB00B3B8E0 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = F63FF3161C1642BB00B3B8E0 /* GCDWebServerErrorResponse.m */; }; F63FF3261C1642BB00B3B8E0 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = F63FF3181C1642BB00B3B8E0 /* GCDWebServerFileResponse.m */; }; F63FF3271C1642BB00B3B8E0 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = F63FF31A1C1642BB00B3B8E0 /* GCDWebServerStreamedResponse.m */; }; - F674784A1CC81F1900F9273C /* platform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F67478481CC81F1300F9273C /* platform.cpp */; }; F68A278C1BC2722A0063D40A /* RJSModuleLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = F68A278B1BC2722A0063D40A /* RJSModuleLoader.m */; }; F6BCCFE21C8380A400FE31AE /* lib in Resources */ = {isa = PBXBuildFile; fileRef = F6BCCFDF1C83809A00FE31AE /* lib */; }; - F6E931BA1CFEAE170016AF14 /* collection_notifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B961CE6AADD00A8669F /* collection_notifications.cpp */; }; - F6E931BB1CFEAE310016AF14 /* collection_change_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B991CE6AAEF00A8669F /* collection_change_builder.cpp */; }; - F6E931BC1CFEAE340016AF14 /* collection_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B9B1CE6AAEF00A8669F /* collection_notifier.cpp */; }; - F6E931BD1CFEAE370016AF14 /* list_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B9D1CE6AAEF00A8669F /* list_notifier.cpp */; }; - F6E931BE1CFEAE3A0016AF14 /* results_notifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02414B9F1CE6AAEF00A8669F /* results_notifier.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -228,7 +207,6 @@ F620F0741CB9F60C0082977B /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; F6267BC91CADC30000AC36B1 /* js_util.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = js_util.hpp; sourceTree = ""; }; F6267BCA1CADC49200AC36B1 /* node_dummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node_dummy.cpp; sourceTree = ""; }; - F62BF8FB1CAC71780022BCDC /* libRealmNode.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libRealmNode.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; F63118431CEBA7B700ECB2DE /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; F63118441CEBA7B700ECB2DE /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = external_commit_helper.hpp; sourceTree = ""; }; F631184A1CEBA7D800ECB2DE /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = external_commit_helper.cpp; sourceTree = ""; }; @@ -290,14 +268,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F62BF8F81CAC71780022BCDC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F620F0751CB9F60C0082977B /* CoreFoundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; F63FF2ED1C16405C00B3B8E0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -407,7 +377,6 @@ 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */, F63FF2B11C1241E500B3B8E0 /* libRealmJS.a */, F63FF2F01C16405C00B3B8E0 /* libGCDWebServers.a */, - F62BF8FB1CAC71780022BCDC /* libRealmNode.dylib */, ); name = Products; sourceTree = ""; @@ -722,24 +691,6 @@ productReference = 02B58CBC1AE99CEC009B348C /* RealmJSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - F62BF8FA1CAC71780022BCDC /* RealmNode */ = { - isa = PBXNativeTarget; - buildConfigurationList = F62BF8FF1CAC71780022BCDC /* Build configuration list for PBXNativeTarget "RealmNode" */; - buildPhases = ( - F64A05B71D140311004ACDBE /* Download Core */, - F62BF8F71CAC71780022BCDC /* Sources */, - F62BF8F81CAC71780022BCDC /* Frameworks */, - F63117A41CEA911000ECB2DE /* Build with node-gyp */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = RealmNode; - productName = RealmNode; - productReference = F62BF8FB1CAC71780022BCDC /* libRealmNode.dylib */; - productType = "com.apple.product-type.library.dynamic"; - }; F63FF2B01C1241E500B3B8E0 /* RealmJS */ = { isa = PBXNativeTarget; buildConfigurationList = F63FF2C41C1241E500B3B8E0 /* Build configuration list for PBXNativeTarget "RealmJS" */; @@ -785,9 +736,6 @@ 02B58CBB1AE99CEC009B348C = { CreatedOnToolsVersion = 6.3.1; }; - F62BF8FA1CAC71780022BCDC = { - CreatedOnToolsVersion = 7.3; - }; F63FF2B01C1241E500B3B8E0 = { CreatedOnToolsVersion = 7.1.1; }; @@ -810,7 +758,6 @@ targets = ( F63FF2EF1C16405C00B3B8E0 /* GCDWebServers */, F63FF2B01C1241E500B3B8E0 /* RealmJS */, - F62BF8FA1CAC71780022BCDC /* RealmNode */, 02B58CBB1AE99CEC009B348C /* RealmJSTests */, ); }; @@ -845,20 +792,6 @@ shellPath = /bin/sh; shellScript = "cd \"$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH\"\nyarn add needle url-parse"; }; - F63117A41CEA911000ECB2DE /* Build with node-gyp */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build with node-gyp"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "node/build-node.sh \"$CONFIGURATION\""; - }; F63FF2C51C12462600B3B8E0 /* Download Core */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -873,20 +806,6 @@ shellPath = /bin/sh; shellScript = "../scripts/download-core.sh"; }; - F64A05B71D140311004ACDBE /* Download Core */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Download Core"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "../scripts/download-core.sh node"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -900,33 +819,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F62BF8F71CAC71780022BCDC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F6E931BA1CFEAE170016AF14 /* collection_notifications.cpp in Sources */, - F60102D31CBB966E00EC01BA /* js_realm.cpp in Sources */, - F60102D61CBB96B400EC01BA /* object_schema.cpp in Sources */, - F60102D41CBB96AB00EC01BA /* index_set.cpp in Sources */, - F6E931BB1CFEAE310016AF14 /* collection_change_builder.cpp in Sources */, - 5DC74A7B1D623CA800D77A4F /* thread_confined.cpp in Sources */, - F60102D51CBB96AE00EC01BA /* list.cpp in Sources */, - F6E931BC1CFEAE340016AF14 /* collection_notifier.cpp in Sources */, - F60102E11CBB96DD00EC01BA /* transact_log_handler.cpp in Sources */, - F6E931BE1CFEAE3A0016AF14 /* results_notifier.cpp in Sources */, - F60102D71CBB96B800EC01BA /* object_store.cpp in Sources */, - F6E931BD1CFEAE370016AF14 /* list_notifier.cpp in Sources */, - F60102DA1CBB96C300EC01BA /* shared_realm.cpp in Sources */, - F60102E01CBB96D900EC01BA /* realm_coordinator.cpp in Sources */, - F60102EA1CBCAFC300EC01BA /* node_dummy.cpp in Sources */, - F60102D81CBB96BD00EC01BA /* results.cpp in Sources */, - F674784A1CC81F1900F9273C /* platform.cpp in Sources */, - F620F0581CB766DA0082977B /* node_init.cpp in Sources */, - 5DC74A791D623CA200D77A4F /* handover.cpp in Sources */, - F60102D91CBB96C100EC01BA /* schema.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; F63FF2AD1C1241E500B3B8E0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1144,75 +1036,6 @@ }; name = Release; }; - F62BF8FC1CAC71780022BCDC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0.14.3; - EXECUTABLE_PREFIX = lib; - GCC_PREPROCESSOR_DEFINITIONS = ( - "REALM_PLATFORM_NODE=1", - "$(inherited)", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/nan", - /usr/local/include/node, - ); - LIBRARY_SEARCH_PATHS = ( - /usr/local/lib, - "../core-node", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "-isystem", - "../core-node/include", - ); - OTHER_LDFLAGS = ( - "-lrealm-node-dbg", - "-luv", - "-lv8", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - F62BF8FE1CAC71780022BCDC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0.14.3; - EXECUTABLE_PREFIX = lib; - GCC_PREPROCESSOR_DEFINITIONS = ( - "REALM_PLATFORM_NODE=1", - "$(inherited)", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/nan", - /usr/local/include/node, - ); - LIBRARY_SEARCH_PATHS = ( - /usr/local/lib, - "../core-node", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "-isystem", - "../core-node/include", - ); - OTHER_LDFLAGS = ( - "-lrealm-node", - "-luv", - "-lv8", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; F63FF2B71C1241E500B3B8E0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1300,15 +1123,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F62BF8FF1CAC71780022BCDC /* Build configuration list for PBXNativeTarget "RealmNode" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F62BF8FC1CAC71780022BCDC /* Debug */, - F62BF8FE1CAC71780022BCDC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; F63FF2C41C1241E500B3B8E0 /* Build configuration list for PBXNativeTarget "RealmJS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/src/ios/platform.mm b/src/ios/platform.mm index be7e4473..26d93075 100644 --- a/src/ios/platform.mm +++ b/src/ios/platform.mm @@ -93,7 +93,7 @@ void remove_realm_files_from_directory(const std::string &directory) NSString *fileDir = @(directory.c_str()); for (NSString *path in [manager enumeratorAtPath:fileDir]) { - if (![path containsString:@".realm"]) { + if (![path.pathExtension isEqualToString:@"realm"] && ![path.pathExtension isEqualToString:@"realm.lock"] && ![path.pathExtension isEqualToString:@"realm.management"]) { continue; } if (![manager removeItemAtPath:[fileDir stringByAppendingPathComponent:path] error:nil]) { diff --git a/src/js_realm.hpp b/src/js_realm.hpp index cbee858c..fce6740c 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -148,9 +148,6 @@ class RealmClass : public ClassDefinition> { public: static FunctionType create_constructor(ContextType); -#if REALM_PLATFORM_NODE - static Global s_constructor; -#endif // methods static void objects(ContextType, ObjectType, size_t, const ValueType[], ReturnValue &); @@ -260,11 +257,6 @@ public: } }; -#if REALM_PLATFORM_NODE -template -Global RealmClass::s_constructor; -#endif - template inline typename T::Function RealmClass::create_constructor(ContextType ctx) { FunctionType realm_constructor = ObjectWrap>::create_constructor(ctx); @@ -284,10 +276,7 @@ inline typename T::Function RealmClass::create_constructor(ContextType ctx) { Object::set_property(ctx, realm_constructor, "Sync", sync_constructor, attributes); #endif -#if REALM_PLATFORM_NODE - s_constructor = Global(ctx, realm_constructor); -#endif - + Object::set_global(ctx, "Realm", realm_constructor); return realm_constructor; } @@ -404,11 +393,7 @@ void RealmClass::constructor(ContextType ctx, ObjectType this_object, size_t config.encryption_key = std::vector(encryption_key.begin(), encryption_key.end()); } #if REALM_ENABLE_SYNC -#if REALM_PLATFORM_NODE - SyncClass::populate_sync_config(ctx, FunctionType(s_constructor), object, config); -#else - SyncClass::populate_sync_config(ctx, Value::validated_to_object(ctx, Object::get_prototype(ctx, this_object)), object, config); -#endif + SyncClass::populate_sync_config(ctx, Value::validated_to_object(ctx, Object::get_global(ctx, "Realm")), object, config); #endif } } diff --git a/src/js_types.hpp b/src/js_types.hpp index 7cd56b91..4c5434a1 100644 --- a/src/js_types.hpp +++ b/src/js_types.hpp @@ -170,6 +170,9 @@ struct Object { static void set_property(ContextType, const ObjectType &, uint32_t, const ValueType &); static std::vector> get_property_names(ContextType, const ObjectType &); + static void set_global(ContextType, const String &, const ValueType &); + static ValueType get_global(ContextType, const String &); + template static ValueType validated_get_property(ContextType ctx, const ObjectType &object, const P &property, const char *message = nullptr) { if (!has_property(ctx, object, property)) { @@ -258,11 +261,6 @@ class Protected { }; }; -template -class Global { - operator ValueType() const; -}; - template struct Exception : public std::runtime_error { using ContextType = typename T::Context; diff --git a/src/jsc/jsc_init.h b/src/jsc/jsc_init.h index 9974444e..7b51ad79 100644 --- a/src/jsc/jsc_init.h +++ b/src/jsc/jsc_init.h @@ -26,7 +26,6 @@ extern "C" { JSObjectRef RJSConstructorCreate(JSContextRef ctx); void RJSInitializeInContext(JSContextRef ctx); -void RJSClearTestState(void); #ifdef __cplusplus } diff --git a/src/jsc/jsc_object.hpp b/src/jsc/jsc_object.hpp index 0013add0..5ddca87e 100644 --- a/src/jsc/jsc_object.hpp +++ b/src/jsc/jsc_object.hpp @@ -143,5 +143,17 @@ inline void jsc::Object::set_internal(const JSObjectRef &object, typename ClassT *wrap = ptr; } +template<> +inline void jsc::Object::set_global(JSContextRef ctx, const jsc::String &key, const JSValueRef &value) { + JSObjectRef global_object = JSContextGetGlobalObject(ctx); + jsc::Object::set_property(ctx, global_object, key, value, js::ReadOnly | js::DontEnum | js::DontDelete); +} + +template<> +inline JSValueRef jsc::Object::get_global(JSContextRef ctx, const jsc::String &key) { + JSObjectRef global_object = JSContextGetGlobalObject(ctx); + return jsc::Object::get_property(ctx, global_object, key); +} + } // js } // realm diff --git a/src/jsc/jsc_protected.hpp b/src/jsc/jsc_protected.hpp index d569fc89..10c25fa1 100644 --- a/src/jsc/jsc_protected.hpp +++ b/src/jsc/jsc_protected.hpp @@ -119,12 +119,5 @@ class Protected : public Protected { } }; -template<> -class Global : public Protected { - public: - Global() : Protected() {} - Global(JSContextRef ctx, JSObjectRef value) : Protected(ctx, value) {} -}; - } // js } // realm diff --git a/src/node/node_object.hpp b/src/node/node_object.hpp index c1fa9dd0..c3a472ce 100644 --- a/src/node/node_object.hpp +++ b/src/node/node_object.hpp @@ -154,6 +154,16 @@ inline void node::Object::set_internal(const v8::Local &object, type auto wrap = Nan::ObjectWrap::Unwrap>(object); *wrap = ptr; } - + +template<> +inline void node::Object::set_global(v8::Isolate* isolate, const node::String &key, const v8::Local &value) { + Object::set_property(isolate, isolate->GetCurrentContext()->Global(), key, value); +} + +template<> +inline v8::Local node::Object::get_global(v8::Isolate* isolate, const node::String &key) { + return Object::get_property(isolate, isolate->GetCurrentContext()->Global(), key); +} + } // js } // realm diff --git a/src/node/node_protected.hpp b/src/node/node_protected.hpp index 97ac12da..82d72823 100644 --- a/src/node/node_protected.hpp +++ b/src/node/node_protected.hpp @@ -102,19 +102,5 @@ struct GlobalCopyablePersistentTraits { static inline void Copy(const v8::Persistent &source, CopyablePersistent *dest) {} }; -template<> -class Global { - // TODO: Figure out why Nan::CopyablePersistentTraits causes a build failure. - Nan::Persistent> m_value; - -public: - Global() {} - Global(v8::Isolate* isolate, v8::Local value) : m_value(value) {} - - operator v8::Local() const { - return Nan::New(m_value); - } -}; - } // js } // realm From 15bb3014b9276be71a701c790b3edd35777e2dcd Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 18:23:44 -0800 Subject: [PATCH 085/100] example fixes --- .../ReactExample.xcodeproj/project.pbxproj | 115 +++++++++++++++++- scripts/test.sh | 2 +- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj b/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj index 15c72b0d..9f6a62ea 100644 --- a/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj +++ b/examples/ReactExample/ios/ReactExample.xcodeproj/project.pbxproj @@ -71,6 +71,55 @@ remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = ReactExample; }; + 02F8FE011DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 02F8FE051DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 02F8FE091DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 02F8FE0D1DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 02F8FE111DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 02F8FE161DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 02F8FE191DD6B23100BD85F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; @@ -214,6 +263,7 @@ isa = PBXGroup; children = ( 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 02F8FE021DD6B23100BD85F8 /* libRCTImage-tvOS.a */, ); name = Products; sourceTree = ""; @@ -222,6 +272,7 @@ isa = PBXGroup; children = ( 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 02F8FE0A1DD6B23100BD85F8 /* libRCTNetwork-tvOS.a */, ); name = Products; sourceTree = ""; @@ -249,6 +300,7 @@ isa = PBXGroup; children = ( 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 02F8FE0E1DD6B23100BD85F8 /* libRCTSettings-tvOS.a */, ); name = Products; sourceTree = ""; @@ -257,6 +309,7 @@ isa = PBXGroup; children = ( 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 02F8FE171DD6B23100BD85F8 /* libRCTWebSocket-tvOS.a */, ); name = Products; sourceTree = ""; @@ -278,6 +331,7 @@ isa = PBXGroup; children = ( 146834041AC3E56700842450 /* libReact.a */, + 02F8FE1A1DD6B23100BD85F8 /* libReact-tvOS.a */, ); name = Products; sourceTree = ""; @@ -286,6 +340,7 @@ isa = PBXGroup; children = ( 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 02F8FE061DD6B23100BD85F8 /* libRCTLinking-tvOS.a */, ); name = Products; sourceTree = ""; @@ -314,6 +369,7 @@ isa = PBXGroup; children = ( 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 02F8FE121DD6B23100BD85F8 /* libRCTText-tvOS.a */, ); name = Products; sourceTree = ""; @@ -505,6 +561,55 @@ remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 02F8FE021DD6B23100BD85F8 /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 02F8FE011DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE061DD6B23100BD85F8 /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 02F8FE051DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE0A1DD6B23100BD85F8 /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 02F8FE091DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE0E1DD6B23100BD85F8 /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 02F8FE0D1DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE121DD6B23100BD85F8 /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 02F8FE111DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE171DD6B23100BD85F8 /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 02F8FE161DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 02F8FE1A1DD6B23100BD85F8 /* libReact-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libReact-tvOS.a"; + remoteRef = 02F8FE191DD6B23100BD85F8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -684,6 +789,8 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; DEAD_CODE_STRIPPING = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -701,6 +808,8 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -717,7 +826,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CC = "$(SRCROOT)/../../../scripts/ccache-clang"; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -733,6 +842,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -765,7 +875,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CC = "$(SRCROOT)/../../../scripts/ccache-clang"; + CC = "$(SRCROOT)/../../../scripts/ccache-clang.sh"; CLANG_CXX_LANGUAGE_STANDARD = "c++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -781,6 +891,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + CXX = "$(SRCROOT)/../../../scripts/ccache-clang++.sh"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/scripts/test.sh b/scripts/test.sh index 3a7cf4e5..4f077d7f 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -147,7 +147,7 @@ case "$TARGET" in start_packager pushd ios - xctest ReactExample + xctest ReactExample || xctest ReactExample ;; "react-tests-android") [[ $CONFIGURATION == 'Debug' ]] && exit 0 From baa83214539c53008800256695abef21f8232708 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 19:33:21 -0800 Subject: [PATCH 086/100] fix test --- tests/js/user-tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index a8f4031a..359dcf01 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -203,7 +203,7 @@ module.exports = { var username = uuid(); // Because it waits for answer this takes some time.. return callbackTest((callback) => Realm.Sync.User.register('http://fake_host.local', username, 'password', callback), (error, user) => { - assertIsError(error, 'ECONNRESET'); + assertIsError(error); TestCase.assertUndefined(user); }); }, From 695d6f9efb56868a5d074f85b22f6cc55dcc2296 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Fri, 11 Nov 2016 21:20:04 -0800 Subject: [PATCH 087/100] suppress garbage debug info --- tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj index d23f43b4..f742e6cd 100644 --- a/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj +++ b/tests/react-test-app/ios/ReactTests.xcodeproj/project.pbxproj @@ -852,6 +852,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OS_ACTIVITY_MODE = disable; PRODUCT_BUNDLE_IDENTIFIER = "io.realm.$(PRODUCT_NAME:rfc1034identifier)"; SDKROOT = iphoneos; }; @@ -898,6 +899,7 @@ ); IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; + OS_ACTIVITY_MODE = disable; PRODUCT_BUNDLE_IDENTIFIER = "io.realm.$(PRODUCT_NAME:rfc1034identifier)"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; From f764032ef5678f7248b7084ba0adab001338859f Mon Sep 17 00:00:00 2001 From: Nabil Hachicha Date: Sat, 12 Nov 2016 10:20:16 +0000 Subject: [PATCH 088/100] fixing Android example --- .../android/app/src/main/AndroidManifest.xml | 3 +- .../io/realm/react/example/MainActivity.java | 19 ------ .../realm/react/example/MainApplication.java | 41 +++++++++++++ examples/ReactExample/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- react-native/android/build.gradle | 1 + react-native/android/src/main/jni/Android.mk | 61 ++++++++++--------- 7 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java diff --git a/examples/ReactExample/android/app/src/main/AndroidManifest.xml b/examples/ReactExample/android/app/src/main/AndroidManifest.xml index eeb0a42c..af4c12bd 100644 --- a/examples/ReactExample/android/app/src/main/AndroidManifest.xml +++ b/examples/ReactExample/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,8 @@ android:allowBackup="true" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + android:name=".MainApplication"> getPackages() { - return Arrays.asList( - new MainReactPackage(), - new RealmReactPackage() - ); - } } diff --git a/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java new file mode 100644 index 00000000..e9977df5 --- /dev/null +++ b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java @@ -0,0 +1,41 @@ +package io.realm.react.example; + +import android.app.Application; + +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; + +import java.util.Arrays; +import java.util.List; + +import io.realm.react.RealmReactPackage; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + protected boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new RealmReactPackage() + ); + } + }; + + /** + * A list of packages used by the app. If the app uses additional views + * or modules besides the default ones, add more packages here. + */ + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } +} diff --git a/examples/ReactExample/android/build.gradle b/examples/ReactExample/android/build.gradle index 403a0075..4315cea0 100644 --- a/examples/ReactExample/android/build.gradle +++ b/examples/ReactExample/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.1' + classpath 'com.android.tools.build:gradle:2.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/examples/ReactExample/android/gradle/wrapper/gradle-wrapper.properties b/examples/ReactExample/android/gradle/wrapper/gradle-wrapper.properties index b9fbfaba..43e743f0 100644 --- a/examples/ReactExample/android/gradle/wrapper/gradle-wrapper.properties +++ b/examples/ReactExample/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri Nov 11 18:15:12 GMT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/react-native/android/build.gradle b/react-native/android/build.gradle index 3809e7fb..3269c7b8 100644 --- a/react-native/android/build.gradle +++ b/react-native/android/build.gradle @@ -65,6 +65,7 @@ task downloadJSCHeaders(type: Download) { task downloadRealmCore(type: Download) { src "https://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz" + // src "https://static.realm.io/downloads/sync/realm-sync-android-${project.coreVersion}.tar.gz" onlyIfNewer true overwrite false dest new File(downloadsDir, "realm-core-android-${project.coreVersion}.tar.gz") diff --git a/react-native/android/src/main/jni/Android.mk b/react-native/android/src/main/jni/Android.mk index c3637412..ab36d77f 100644 --- a/react-native/android/src/main/jni/Android.mk +++ b/react-native/android/src/main/jni/Android.mk @@ -14,40 +14,45 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := librealmreact -LOCAL_SRC_FILES := \ - src/js_realm.cpp \ - src/rpc.cpp \ - src/jsc/jsc_init.cpp \ - src/android/platform.cpp \ - src/android/io_realm_react_RealmReactModule.cpp \ - src/android/jsc_override.cpp \ - src/object-store/src/collection_notifications.cpp \ - src/object-store/src/index_set.cpp \ - src/object-store/src/list.cpp \ - src/object-store/src/object_schema.cpp \ - src/object-store/src/object_store.cpp \ - src/object-store/src/results.cpp \ - src/object-store/src/schema.cpp \ - src/object-store/src/shared_realm.cpp \ - src/object-store/src/parser/parser.cpp \ - src/object-store/src/parser/query_builder.cpp \ - src/object-store/src/impl/collection_change_builder.cpp \ - src/object-store/src/impl/collection_notifier.cpp \ - src/object-store/src/impl/list_notifier.cpp \ - src/object-store/src/impl/realm_coordinator.cpp \ - src/object-store/src/impl/results_notifier.cpp \ - src/object-store/src/impl/transact_log_handler.cpp \ - src/object-store/src/impl/android/external_commit_helper.cpp \ - src/object-store/src/impl/android/weak_realm_notifier.cpp \ - src/object-store/src/util/format.cpp \ - src/object-store/src/util/thread_id.cpp \ - vendor/base64.cpp +LOCAL_SRC_FILES := $(wildcard vendor/*.cpp) $(wildcard src/*.cpp) $(wildcard src/jsc/*.cpp) $(wildcard src/android/*.cpp) $(wildcard src/object-store/src/*.cpp) $(wildcard src/object-store/src/impl/*.cpp) $(wildcard src/object-store/src/parser/*.cpp) $(wildcard src/object-store/src/util/*.cpp) +# $(info >>>>>>>> LIBS>: [${OBJ_STORE}]) + +# LOCAL_SRC_FILES := \ +# src/js_realm.cpp \ +# src/rpc.cpp \ +# src/jsc/jsc_init.cpp \ +# src/android/platform.cpp \ +# src/android/io_realm_react_RealmReactModule.cpp \ +# src/android/jsc_override.cpp \ +# src/object-store/src/collection_notifications.cpp \ +# src/object-store/src/index_set.cpp \ +# src/object-store/src/list.cpp \ +# src/object-store/src/object_schema.cpp \ +# src/object-store/src/object_store.cpp \ +# src/object-store/src/results.cpp \ +# src/object-store/src/schema.cpp \ +# src/object-store/src/shared_realm.cpp \ +# src/object-store/src/parser/parser.cpp \ +# src/object-store/src/parser/query_builder.cpp \ +# src/object-store/src/impl/collection_change_builder.cpp \ +# src/object-store/src/impl/collection_notifier.cpp \ +# src/object-store/src/impl/list_notifier.cpp \ +# src/object-store/src/impl/realm_coordinator.cpp \ +# src/object-store/src/impl/results_notifier.cpp \ +# src/object-store/src/impl/transact_log_handler.cpp \ +# src/object-store/src/impl/android/external_commit_helper.cpp \ +# src/object-store/src/impl/weak_realm_notifier.cpp \ +# src/object-store/src/util/format.cpp \ +# src/object-store/src/util/thread_id.cpp \ +# src/object-store/src/thread_confined.hpp \ +# vendor/base64.cpp LOCAL_C_INCLUDES := src LOCAL_C_INCLUDES += src/jsc LOCAL_C_INCLUDES += src/object-store/src LOCAL_C_INCLUDES += src/object-store/src/impl LOCAL_C_INCLUDES += src/object-store/src/parser +# LOCAL_C_INCLUDES += src/object-store/src/sync LOCAL_C_INCLUDES += src/object-store/external/pegtl LOCAL_C_INCLUDES += vendor LOCAL_C_INCLUDES += $(JAVA_HOME)/include From eef8a2de3b5ba8c694f0638d9cac3b6d798ecf5b Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Sat, 12 Nov 2016 05:26:37 -0800 Subject: [PATCH 089/100] property clean up sync state between tests in c++ --- src/js_realm.hpp | 2 ++ tests/spec/sync_tests.js | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/js_realm.hpp b/src/js_realm.hpp index fce6740c..013c4e6c 100644 --- a/src/js_realm.hpp +++ b/src/js_realm.hpp @@ -458,6 +458,8 @@ void RealmClass::clear_test_state(ContextType ctx, ObjectType this_object, si for(auto &user : SyncManager::shared().all_users()) { user->log_out(); } + SyncManager::shared().reset_for_testing(); + SyncManager::shared().configure_file_system(default_realm_file_directory(), SyncManager::MetadataMode::NoEncryption); #endif delete_all_realms(); } diff --git a/tests/spec/sync_tests.js b/tests/spec/sync_tests.js index 18e74934..e1cba3ee 100644 --- a/tests/spec/sync_tests.js +++ b/tests/spec/sync_tests.js @@ -27,13 +27,7 @@ const userTests = require('../js/user-tests'); describe('SyncTests', () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; beforeEach(() => Realm.clearTestState()); - afterEach(() => { - Realm.clearTestState(); - let users = Realm.Sync.User.all; - Object.keys(users).forEach((identity) => { - users[identity].logout(); - }); - }); + afterEach(() => Realm.clearTestState()); for (const testName in userTests) { it(testName, (done) => { From fdf88c2f78154fa533a3e97aecaa7c47ec43a32b Mon Sep 17 00:00:00 2001 From: Nabil Hachicha Date: Mon, 14 Nov 2016 13:26:33 +0000 Subject: [PATCH 090/100] Adding a build type to switch between Core & Core+Sync --- .../io/realm/react/example/MainActivity.java | 8 -- .../realm/react/example/MainApplication.java | 1 - package.json | 1 + react-native/android/build.gradle | 21 +++-- react-native/android/src/main/jni/Android.mk | 89 ++++++++++++------- .../android/src/main/jni/Application.mk | 5 +- scripts/download-core.sh | 3 + tests/react-test-app/package.json | 1 + 8 files changed, 80 insertions(+), 49 deletions(-) diff --git a/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainActivity.java b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainActivity.java index 4eb22534..66927027 100644 --- a/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainActivity.java +++ b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainActivity.java @@ -13,12 +13,4 @@ public class MainActivity extends ReactActivity { return "ReactExample"; } - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } } diff --git a/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java index e9977df5..cc1fbdf6 100644 --- a/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java +++ b/examples/ReactExample/android/app/src/main/java/io/realm/react/example/MainApplication.java @@ -33,7 +33,6 @@ public class MainApplication extends Application implements ReactApplication { * A list of packages used by the app. If the app uses additional views * or modules besides the default ones, add more packages here. */ - @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; diff --git a/package.json b/package.json index 3d0362e3..bf10ffe3 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "get-version": "echo $npm_package_version", "set-version": "scripts/set-version.sh", "get-core-version": "scripts/download-core.sh --version", + "get-sync-version": "scripts/download-core.sh --versionSync", "jsdoc": "rm -rf docs/output && jsdoc -c docs/conf.json", "lint": "eslint", "test": "scripts/test.sh", diff --git a/react-native/android/build.gradle b/react-native/android/build.gradle index 3269c7b8..0bc81df7 100644 --- a/react-native/android/build.gradle +++ b/react-native/android/build.gradle @@ -33,12 +33,14 @@ import org.apache.tools.ant.filters.ReplaceTokens // After that we build native code from src/main/jni with module path pointing at third-party-ndk. ext.coreVersion = "npm --silent run get-core-version".execute().text.trim() +ext.syncVersion = "npm --silent run get-sync-version".execute().text.trim() def currentVersion = "npm --silent run get-version".execute().text.trim() def downloadsDir = new File("$projectDir/downloads") def jscDownloadDir = new File("$projectDir/src/main/jni/jsc") def coreDownloadDir = new File("$projectDir/src/main/jni") def publishDir = new File("$projectDir/../../android/") - +// to build with sync run: ./gradlew assembleDebug -PbuildWithSync=true +ext.buildSync = project.hasProperty('buildWithSync') ? project.getProperty('buildWithSync').toBoolean() : false task generateVersionClass(type: Copy) { from 'src/main/templates/Version.java' @@ -64,11 +66,18 @@ task downloadJSCHeaders(type: Download) { } task downloadRealmCore(type: Download) { - src "https://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz" - // src "https://static.realm.io/downloads/sync/realm-sync-android-${project.coreVersion}.tar.gz" + if (project.buildSync) { + src "https://static.realm.io/downloads/sync/realm-sync-android-${project.syncVersion}.tar.gz" + } else { + src "https://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz" + } onlyIfNewer true - overwrite false - dest new File(downloadsDir, "realm-core-android-${project.coreVersion}.tar.gz") + overwrite true + if (project.buildSync) { + dest new File(downloadsDir, "realm-core-android-${project.syncVersion}.tar.gz") + } else { + dest new File(downloadsDir, "realm-core-android-${project.coreVersion}.tar.gz") + } } task prepareRealmCore(dependsOn: downloadRealmCore, type:Copy) { @@ -140,6 +149,8 @@ task buildReactNdkLib(dependsOn: [downloadJSCHeaders,prepareRealmCore], type: Ex inputs.file('src/main/jni') outputs.dir("$buildDir/realm-react-ndk/all") commandLine getNdkBuildFullPath(), + '-e', + project.buildSync ? 'BUILD_TYPE_SYNC=1' : 'BUILD_TYPE_SYNC=0', 'NDK_PROJECT_PATH=null', "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", 'NDK_OUT=' + temporaryDir, diff --git a/react-native/android/src/main/jni/Android.mk b/react-native/android/src/main/jni/Android.mk index ab36d77f..359c1f44 100644 --- a/react-native/android/src/main/jni/Android.mk +++ b/react-native/android/src/main/jni/Android.mk @@ -1,5 +1,13 @@ LOCAL_PATH:= $(call my-dir) +ifeq ($(strip $(BUILD_TYPE_SYNC)),1) +include $(CLEAR_VARS) +LOCAL_MODULE := realm-android-sync-$(TARGET_ARCH_ABI) +LOCAL_EXPORT_C_INCLUDES := core/include +LOCAL_SRC_FILES := core/librealm-sync-android-$(TARGET_ARCH_ABI).a +include $(PREBUILT_STATIC_LIBRARY) +endif + include $(CLEAR_VARS) LOCAL_MODULE := realm-android-$(TARGET_ARCH_ABI) LOCAL_EXPORT_C_INCLUDES := core/include @@ -14,53 +22,66 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := librealmreact -LOCAL_SRC_FILES := $(wildcard vendor/*.cpp) $(wildcard src/*.cpp) $(wildcard src/jsc/*.cpp) $(wildcard src/android/*.cpp) $(wildcard src/object-store/src/*.cpp) $(wildcard src/object-store/src/impl/*.cpp) $(wildcard src/object-store/src/parser/*.cpp) $(wildcard src/object-store/src/util/*.cpp) -# $(info >>>>>>>> LIBS>: [${OBJ_STORE}]) - -# LOCAL_SRC_FILES := \ -# src/js_realm.cpp \ -# src/rpc.cpp \ -# src/jsc/jsc_init.cpp \ -# src/android/platform.cpp \ -# src/android/io_realm_react_RealmReactModule.cpp \ -# src/android/jsc_override.cpp \ -# src/object-store/src/collection_notifications.cpp \ -# src/object-store/src/index_set.cpp \ -# src/object-store/src/list.cpp \ -# src/object-store/src/object_schema.cpp \ -# src/object-store/src/object_store.cpp \ -# src/object-store/src/results.cpp \ -# src/object-store/src/schema.cpp \ -# src/object-store/src/shared_realm.cpp \ -# src/object-store/src/parser/parser.cpp \ -# src/object-store/src/parser/query_builder.cpp \ -# src/object-store/src/impl/collection_change_builder.cpp \ -# src/object-store/src/impl/collection_notifier.cpp \ -# src/object-store/src/impl/list_notifier.cpp \ -# src/object-store/src/impl/realm_coordinator.cpp \ -# src/object-store/src/impl/results_notifier.cpp \ -# src/object-store/src/impl/transact_log_handler.cpp \ -# src/object-store/src/impl/android/external_commit_helper.cpp \ -# src/object-store/src/impl/weak_realm_notifier.cpp \ -# src/object-store/src/util/format.cpp \ -# src/object-store/src/util/thread_id.cpp \ -# src/object-store/src/thread_confined.hpp \ -# vendor/base64.cpp +LOCAL_SRC_FILES := vendor/base64.cpp +LOCAL_SRC_FILES += src/js_realm.cpp +LOCAL_SRC_FILES += src/rpc.cpp +LOCAL_SRC_FILES += src/jsc/jsc_init.cpp +LOCAL_SRC_FILES += src/android/io_realm_react_RealmReactModule.cpp +LOCAL_SRC_FILES += src/android/jsc_override.cpp +LOCAL_SRC_FILES += src/android/platform.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/collection_change_builder.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/collection_notifier.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/handover.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/list_notifier.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/realm_coordinator.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/results_notifier.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/transact_log_handler.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/weak_realm_notifier.cpp +LOCAL_SRC_FILES += src/object-store/src/impl/android/external_commit_helper.cpp +LOCAL_SRC_FILES += src/object-store/src/parser/parser.cpp +LOCAL_SRC_FILES += src/object-store/src/parser/query_builder.cpp +LOCAL_SRC_FILES += src/object-store/src/util/format.cpp +LOCAL_SRC_FILES += src/object-store/src/util/thread_id.cpp +LOCAL_SRC_FILES += src/object-store/src/collection_notifications.cpp +LOCAL_SRC_FILES += src/object-store/src/index_set.cpp +LOCAL_SRC_FILES += src/object-store/src/list.cpp +LOCAL_SRC_FILES += src/object-store/src/object_schema.cpp +LOCAL_SRC_FILES += src/object-store/src/object_store.cpp +LOCAL_SRC_FILES += src/object-store/src/placeholder.cpp +LOCAL_SRC_FILES += src/object-store/src/results.cpp +LOCAL_SRC_FILES += src/object-store/src/schema.cpp +LOCAL_SRC_FILES += src/object-store/src/shared_realm.cpp +LOCAL_SRC_FILES += src/object-store/src/thread_confined.cpp +ifeq ($(strip $(BUILD_TYPE_SYNC)),1) +LOCAL_SRC_FILES += src/object-store/src/sync/sync_manager.cpp +LOCAL_SRC_FILES += src/object-store/src/sync/sync_session.cpp +LOCAL_SRC_FILES += src/object-store/src/sync/sync_user.cpp +LOCAL_SRC_FILES += src/object-store/src/sync/impl/sync_file.cpp +LOCAL_SRC_FILES += src/object-store/src/sync/impl/sync_metadata.cpp +endif LOCAL_C_INCLUDES := src LOCAL_C_INCLUDES += src/jsc LOCAL_C_INCLUDES += src/object-store/src LOCAL_C_INCLUDES += src/object-store/src/impl LOCAL_C_INCLUDES += src/object-store/src/parser -# LOCAL_C_INCLUDES += src/object-store/src/sync LOCAL_C_INCLUDES += src/object-store/external/pegtl LOCAL_C_INCLUDES += vendor LOCAL_C_INCLUDES += $(JAVA_HOME)/include LOCAL_C_INCLUDES += $(JAVA_HOME)/include/darwin LOCAL_C_INCLUDES += core/include +ifeq ($(strip $(BUILD_TYPE_SYNC)),1) +LOCAL_C_INCLUDES += src/object-store/src/sync +endif LOCAL_ALLOW_UNDEFINED_SYMBOLS := true - +ifeq ($(strip $(BUILD_TYPE_SYNC)),1) +LOCAL_STATIC_LIBRARIES := realm-android-sync-$(TARGET_ARCH_ABI) +LOCAL_STATIC_LIBRARIES += realm-android-$(TARGET_ARCH_ABI) +else LOCAL_STATIC_LIBRARIES := realm-android-$(TARGET_ARCH_ABI) +endif + + LOCAL_SHARED_LIBRARIES := libjsc include $(BUILD_SHARED_LIBRARY) diff --git a/react-native/android/src/main/jni/Application.mk b/react-native/android/src/main/jni/Application.mk index 4d8ba3c5..496254e7 100644 --- a/react-native/android/src/main/jni/Application.mk +++ b/react-native/android/src/main/jni/Application.mk @@ -5,7 +5,7 @@ APP_PLATFORM := android-9 APP_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(APP_MK_DIR)first-party +NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(APP_MK_DIR) APP_STL := gnustl_static APP_CPPFLAGS := -std=c++14 @@ -18,5 +18,8 @@ APP_CPPFLAGS += -fomit-frame-pointer APP_LDFLAGS := -Wl,--build-id APP_LDFLAGS += -llog APP_LDFLAGS += -landroid +ifeq ($(strip $(BUILD_TYPE_SYNC)),1) +APP_LDFLAGS += -lz +endif NDK_TOOLCHAIN_VERSION := 4.9 diff --git a/scripts/download-core.sh b/scripts/download-core.sh index 6c83d962..f3b6dffb 100755 --- a/scripts/download-core.sh +++ b/scripts/download-core.sh @@ -12,6 +12,9 @@ source_root="$(dirname "$0")" if [ "$1" = '--version' ]; then echo "$REALM_CORE_VERSION" exit 0 +elif [ "$1" = '--versionSync' ]; then + echo "$REALM_SYNC_VERSION" + exit 0 fi # The 'node' argument will result in realm-node build being downloaded. diff --git a/tests/react-test-app/package.json b/tests/react-test-app/package.json index 10e94d1e..445c5b79 100644 --- a/tests/react-test-app/package.json +++ b/tests/react-test-app/package.json @@ -8,6 +8,7 @@ "dependencies": { "react": "15.3.2", "react-native": "^0.37.0", + "react-native-fs": "^1.1.0", "realm": "file:../..", "realm-tests": "file:../js", "xmlbuilder": "^4.2.1" From b01349087c4fa107cad8b755a17ede3ff634c044 Mon Sep 17 00:00:00 2001 From: Marius Rackwitz Date: Fri, 11 Nov 2016 18:16:40 +0100 Subject: [PATCH 091/100] Add a test which synchronizes a change between two clients --- tests/js/user-tests.js | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index 359dcf01..f8f60cbe 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -269,5 +269,64 @@ module.exports = { }); }, + testSynchronizeChangesWithTwoClientsAndOneUser() { + // Test Schema + class Foo {} + Foo.schema = { + name: 'Foo', + properties: { + string: 'string', + bars: { type: 'list', objectType: 'Bar' }, + }, + }; + + class Bar {} + Bar.schema = { + name: 'Bar', + properties: { integer: 'int' }, + }; + + const schema = [Foo.schema, Bar.schema]; + + // Create a user, open two clients at different local paths, synchronize changes + const username = uuid(); + return new Promise((resolve) => { + Realm.Sync.User.register('http://localhost:9080', username, 'password', (error ,user) => { + failOnError(error); + + const clientA = new Realm({ + path: 'testSynchronizeChangesWithTwoClientsAndOneUser_clientA.realm', + schema: schema, + sync: { + user: user, + url: 'http://localhost:9080/~/test', + }, + }); + + const clientB = new Realm({ + path: 'testSynchronizeChangesWithTwoClientsAndOneUser_clientB.realm', + schema: schema, + sync: { + user: user, + url: 'http://localhost:9080/~/test', + }, + }); + + clientB.addListener('change', () => { + const foos = clientB.objects('Foo'); + if (foos.length > 0) { + TestCase.assertEqual(foos.length, 1); + TestCase.assertEqual(foos[0].string, 'Hello, World!'); + resolve(); + } + }); + + clientA.write(() => { + clientA.create('Foo', { string: 'Hello, World!' }); + }); + }); + }); + }, + }; From 06d277aacdd04f10940d61bfce2456bca1ae9235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Mon, 14 Nov 2016 10:48:50 -0800 Subject: [PATCH 092/100] Bumped version of ESLint, added eslinting of specs, make all linting pass --- .eslintignore | 3 +- .eslintrc.json | 11 ++- docs/sync.js | 47 ++++++------ lib/.eslintrc.json | 3 - lib/browser/{.eslintrc => .eslintrc.json} | 4 +- lib/browser/collections.js | 2 +- lib/browser/index.js | 2 +- lib/browser/rpc.js | 2 +- lib/extensions.js | 3 +- lib/index.js | 1 + lib/user-methods.js | 3 +- package.json | 8 +- tests/{js => }/.eslintrc.json | 11 ++- tests/js/async-tests.js | 4 +- tests/js/schemas.js | 2 - tests/js/user-tests.js | 7 +- tests/react-test-app/index.ios.js | 2 - tests/spec/helpers/reporters.js | 2 + tests/spec/sync_integration_tests.js | 93 ++++++++++++----------- 19 files changed, 115 insertions(+), 95 deletions(-) rename lib/browser/{.eslintrc => .eslintrc.json} (85%) rename tests/{js => }/.eslintrc.json (52%) diff --git a/.eslintignore b/.eslintignore index 43adc689..988d8689 100644 --- a/.eslintignore +++ b/.eslintignore @@ -6,4 +6,5 @@ build/ node_modules/ vendor/ -/tests/test-runners/ \ No newline at end of file +/tests/test-runners/ +/object-server-for-testing/ \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index d257f28b..49e3f61b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,10 +1,19 @@ { "root": true, + "env": { + "es6": true, + "node": true + }, "extends": "eslint:recommended", "rules": { "comma-dangle": 0, "no-empty": 0, - "no-unused-vars": 1, + "no-unused-vars": [ + "warn", { + "varsIgnorePattern": "^_", + "argsIgnorePattern": "^_" + } + ], "strict": [2, "global"] } } diff --git a/docs/sync.js b/docs/sync.js index 4bdbe4fa..5ba015d2 100644 --- a/docs/sync.js +++ b/docs/sync.js @@ -20,29 +20,30 @@ * @memberof Realm */ class Sync { + + /** + * Set a global listener function. + * @param {string} local_path - The path to the directory where realm files are stored [deprecated] + * @param {string} server_url - The sync server to listen to + * @param {SyncUser} admin_user - An admin user obtained by calling `new Realm.Sync.User.Admin` + * @param {function(realm_name)} filter_callback - Return true to recieve changes for the given realm + * @param {function(realm_name, realm, change_set)} change_callback - called on any realm changes with + * the following arguments: + * - `realm_name` - path of the Realm on which changes occurred + * - `realm` - a `Realm` object for the changed Realm + * - `change_set` - a dictionary of object names to arays of indexes indicating the indexes of objects of each type + * which have been added, removed, or modified + */ + static setGlobalListener(local_path, server_url, admin_user, filter_callback, change_callback) {} + + /** + * Set the sync log level. + * @param {string} log_level + */ + static setLogLevel(log_level) {} + } -/** - * Set a global listener function. - * @param {string} local_path - The path to the directory where realm files are stored [deprecated] - * @param {string} server_url - The sync server to listen to - * @param {SyncUser} admin_user - An admin user obtained by calling `new Realm.Sync.User.Admin` - * @param {function(realm_name)} filter_callback - Return true to recieve changes for the given realm - * @param {function(realm_name, realm, change_set)} change_callback - called on any realm changes with - * the following arguments: - * - `realm_name` - path of the Realm on which changes occurred - * - `realm` - a `Realm` object for the changed Realm - * - `change_set` - a dictionary of object names to arays of indexes indicating the indexes of objects of each type - * which have been added, removed, or modified - */ -Sync.setGlobalListener = function(local_path, server_url, admin_user, filter_callback, change_callback) {}; - -/** - * Set the sync log level. - * @param {string} log_level - */ -Sync.setLogLevel = function(log_level) {}; - /** * @typedef Realm.Sync~LogLevel * @type {("error"|"info"|"debug")} @@ -117,12 +118,12 @@ class User { * The keys in the dictionary are user identities, values are corresponding User objects. * @type {object} */ - get all() {}; + get all() {} /** * Get the currently logged in user. * Throws error if > 1 user logged in, returns undefined if no users logged in. * @type {User} */ - get current() {}; + get current() {} } diff --git a/lib/.eslintrc.json b/lib/.eslintrc.json index e84df8c3..2c63c085 100644 --- a/lib/.eslintrc.json +++ b/lib/.eslintrc.json @@ -1,5 +1,2 @@ { - "env": { - "commonjs": true - } } diff --git a/lib/browser/.eslintrc b/lib/browser/.eslintrc.json similarity index 85% rename from lib/browser/.eslintrc rename to lib/browser/.eslintrc.json index db3133ab..c27c7a11 100644 --- a/lib/browser/.eslintrc +++ b/lib/browser/.eslintrc.json @@ -1,7 +1,7 @@ { "env": { - "es6": true, - "worker": true + "worker": true, + "node": false }, "globals": { "global": true diff --git a/lib/browser/collections.js b/lib/browser/collections.js index e50c4cbe..fcc9b8f5 100644 --- a/lib/browser/collections.js +++ b/lib/browser/collections.js @@ -52,7 +52,7 @@ export function fireMutationListeners(realmId) { } } -export function createCollection(prototype, realmId, info, mutable) { +export function createCollection(prototype, realmId, info, _mutable) { let collection = Object.create(prototype); let size; diff --git a/lib/browser/index.js b/lib/browser/index.js index add249a2..6668f389 100644 --- a/lib/browser/index.js +++ b/lib/browser/index.js @@ -145,7 +145,7 @@ Object.defineProperties(Realm, { set: util.setterForProperty('defaultPath'), }, schemaVersion: { - value: function(path, encryptionKey) { + value: function(_path, _encryptionKey) { return rpc.callMethod(undefined, Realm[keys.id], 'schemaVersion', Array.from(arguments)); } }, diff --git a/lib/browser/rpc.js b/lib/browser/rpc.js index 209eaf3a..28d531d6 100644 --- a/lib/browser/rpc.js +++ b/lib/browser/rpc.js @@ -21,7 +21,7 @@ import * as base64 from './base64'; import { keys, objectTypes } from './constants'; -const {id: idKey, realm: realmKey} = keys; +const {id: idKey, realm: _realmKey} = keys; const registeredCallbacks = []; const typeConverters = {}; diff --git a/lib/extensions.js b/lib/extensions.js index f9ceb48b..83cb05bd 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -28,7 +28,8 @@ module.exports = function(realmConstructor) { realmConstructor.Sync.AuthError = require('./errors').AuthError; if (realmConstructor.Sync.cleanup) { - process.on('exit', () => realmConstructor.Sync.cleanup()); + // FIXME: DOES THIS WORK ON BOTH NODE AND REACT NATIVE? + process.on('exit', realmConstructor.Sync.cleanup); } } diff --git a/lib/index.js b/lib/index.js index 0e5fe471..cef11a10 100644 --- a/lib/index.js +++ b/lib/index.js @@ -33,6 +33,7 @@ if (typeof Realm != 'undefined') { realmConstructor = require('./browser').default; // (exported as ES6 module) // eslint-disable-next-line } else if (typeof process == 'object' && (('' + process) == '[object process]' || typeof jest == 'object')) { + // If process is defined, we're running in node. // Prevent React Native packager from seeing this module. var binary = node_require('node-pre-gyp'); var path = node_require('path'); diff --git a/lib/user-methods.js b/lib/user-methods.js index e4cdc409..204c71f9 100644 --- a/lib/user-methods.js +++ b/lib/user-methods.js @@ -7,9 +7,10 @@ function node_require(module) { } var post; -if (typeof fetch != 'undefined') { +if (typeof fetch !== 'undefined') { post = function(options, callback) { options.method = 'POST'; + // eslint-disable-next-line no-undef fetch(options.url, options) .then((response) => { if (response.status != 200) { diff --git a/package.json b/package.json index 3d0362e3..29ab50d4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "sqlite", "asyncstorage", "rocksdb", - "leveldb" + "leveldb", + "realm" ], "author": { "name": "Realm", @@ -57,8 +58,9 @@ }, "devDependencies": { "babel-eslint": "^6.0.4", - "eslint": "^2.10.2", - "eslint-plugin-react": "^5.1.1", + "eslint": "^3.2.2", + "eslint-plugin-jasmine": "^2.1.0", + "eslint-plugin-react": "^6.7.0", "jsdoc": "^3.4.0", "semver": "^5.1.0" }, diff --git a/tests/js/.eslintrc.json b/tests/.eslintrc.json similarity index 52% rename from tests/js/.eslintrc.json rename to tests/.eslintrc.json index acc84647..051d0da1 100644 --- a/tests/js/.eslintrc.json +++ b/tests/.eslintrc.json @@ -1,7 +1,9 @@ { "env": { - "commonjs": true + "jasmine": true }, + "plugins": ["jasmine"], + "extends": "plugin:jasmine/recommended", "globals": { "ArrayBuffer": false, "DataView": false, @@ -14,5 +16,12 @@ "Uint32Array": false, "Uint8Array": false, "Uint8ClampedArray": false + }, + "rules": { + "no-invalid-this": "off", + "no-magic-numbers": "off", + "jasmine/no-spec-dupes": ["error", "branch"], + "jasmine/no-suite-dupes": ["error", "branch"], + "no-console": "off" } } diff --git a/tests/js/async-tests.js b/tests/js/async-tests.js index a9db9c61..5a4ccdc5 100644 --- a/tests/js/async-tests.js +++ b/tests/js/async-tests.js @@ -71,7 +71,7 @@ function createNotificationTest(config, getObservable, addListener, removeListen worker.postMessage(messages[messageIndex++]); }); -}; +} function createCollectionChangeTest(config, createCollection, messages, expected, removeAll) { return createNotificationTest( @@ -97,7 +97,7 @@ function createCollectionChangeTest(config, createCollection, messages, expected messages, expected.length ); -}; +} const ListObject = { name: 'ListObject', diff --git a/tests/js/schemas.js b/tests/js/schemas.js index 04f28ee1..beb452f9 100644 --- a/tests/js/schemas.js +++ b/tests/js/schemas.js @@ -18,8 +18,6 @@ 'use strict'; -var Realm = require('realm'); - exports.TestObject = { name: 'TestObject', properties: { diff --git a/tests/js/user-tests.js b/tests/js/user-tests.js index f8f60cbe..11cd515a 100644 --- a/tests/js/user-tests.js +++ b/tests/js/user-tests.js @@ -22,7 +22,6 @@ const Realm = require('realm'); const TestCase = require('./asserts'); -const schemas = require('./schemas'); function uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { @@ -104,7 +103,7 @@ module.exports = { // Can we open a realm with the registered user? TestCase.assertThrows(function() { - var realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); + var _realm = new Realm({sync: {user: user, url: 'realm://localhost:9080/~/test'}}); }); }) }, @@ -209,7 +208,7 @@ module.exports = { }, testAll() { - return new Promise((resolve, reject) => { + return new Promise((resolve, _reject) => { let all; all = Realm.Sync.User.all; TestCase.assertArrayLength(Object.keys(all), 0); @@ -246,7 +245,7 @@ module.exports = { }, testCurrent() { - return new Promise((resolve, reject) => { + return new Promise((resolve, _reject) => { TestCase.assertUndefined(Realm.Sync.User.current); callbackTest((callback) => Realm.Sync.User.register('http://localhost:9080', uuid(), 'password', callback), (error, user1) => { diff --git a/tests/react-test-app/index.ios.js b/tests/react-test-app/index.ios.js index b9a3dc40..d1aaaa7b 100644 --- a/tests/react-test-app/index.ios.js +++ b/tests/react-test-app/index.ios.js @@ -28,8 +28,6 @@ import { import React from 'react'; import { runTests } from './tests'; -const Realm = require('realm'); - class ReactTests extends React.Component { render() { return ( diff --git a/tests/spec/helpers/reporters.js b/tests/spec/helpers/reporters.js index 5e56821a..3920e991 100644 --- a/tests/spec/helpers/reporters.js +++ b/tests/spec/helpers/reporters.js @@ -1,3 +1,5 @@ +'use strict'; + var jasmineReporters = require('jasmine-reporters'); var junitReporter = new jasmineReporters.JUnitXmlReporter({ savePath: '.', diff --git a/tests/spec/sync_integration_tests.js b/tests/spec/sync_integration_tests.js index c4ac38fd..925ec1aa 100644 --- a/tests/spec/sync_integration_tests.js +++ b/tests/spec/sync_integration_tests.js @@ -7,57 +7,57 @@ const Realm = require("realm"); jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; -beforeEach(function(done) { - this.objectServer = spawn("sync-bundle/start-object-server.command"); - this.objectServer.once("close", (code) => { - if (typeof code === "number" && code != 0) { - console.error(`Object Server exited with code ${code}`); - process.exit(-1); - } - }); +describe('Sync Integration', () => { + beforeEach(function(done) { + this.objectServer = spawn("sync-bundle/start-object-server.command"); + this.objectServer.once("close", (code) => { + if (typeof code === "number" && code != 0) { + console.error(`Object Server exited with code ${code}`); + process.exit(-1); + } + }); - this.rl = readline.createInterface({ input: this.objectServer.stdout }); - this.rl.on("line", (line) => { - var match; - if ((match = line.match(/Connection\[1\]: Session\[1\]: Received: BIND\(server_path='\/(.+)',/))) { - var adminUser = Realm.Sync.User.adminUser('http://127.0.0.1:9080/', - fs.readFileSync("sync-bundle/admin_token.base64", "utf-8")); - this.adminRealmPath = match[1]; - this.adminRealm = new Realm({ - path: "__admin.realm", - sync: { - user: adminUser, - url: `realm://127.0.0.1:9080/${this.adminRealmPath}` - }, - schema: [ - { - name: "RealmFile", - properties: { - id: 'string', - path: 'string' + this.rl = readline.createInterface({ input: this.objectServer.stdout }); + this.rl.on("line", (line) => { + var match; + if ((match = line.match(/Connection\[1\]: Session\[1\]: Received: BIND\(server_path='\/(.+)',/))) { + var adminUser = Realm.Sync.User.adminUser('http://127.0.0.1:9080/', + fs.readFileSync("sync-bundle/admin_token.base64", "utf-8")); + this.adminRealmPath = match[1]; + this.adminRealm = new Realm({ + path: "__admin.realm", + sync: { + user: adminUser, + url: `realm://127.0.0.1:9080/${this.adminRealmPath}` + }, + schema: [ + { + name: "RealmFile", + properties: { + id: 'string', + path: 'string' + } } - } - ] - }); + ] + }); - done(); - } + done(); + } + }); }); -}); -afterEach(function(done) { - this.rl.close(); - this.objectServer.kill('SIGKILL'); - this.adminRealm.close(); + afterEach(function(done) { + this.rl.close(); + this.objectServer.kill('SIGKILL'); + this.adminRealm.close(); - let reset = spawn("sync-bundle/reset-server-realms.command"); - reset.once("close", done); - reset.stdin.write("yes\n"); + let reset = spawn("sync-bundle/reset-server-realms.command"); + reset.once("close", done); + reset.stdin.write("yes\n"); - Realm.clearTestState(); -}); + Realm.clearTestState(); + }); -describe("Sync", function() { it("should work", function(done) { Realm.Sync.User.create('http://127.0.0.1:9080/', 'foo', 'bar', function(error) { if (error) { @@ -71,11 +71,11 @@ describe("Sync", function() { return; } - var realm = new Realm({ + var _realm = new Realm({ syncConfig: { - identity: user.identity, + identity: user.identity, url: 'realm://127.0.0.1:9080/~/demo/realm1' - }, + }, schema: [ { name: 'IntObject', @@ -96,4 +96,5 @@ describe("Sync", function() { } }); }); + }); \ No newline at end of file From f0daaf6a93fb113ab6c4e8525ec8a60df84db59d Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Mon, 14 Nov 2016 20:57:01 +0100 Subject: [PATCH 093/100] Move apple-related file to mac target --- binding.gyp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/binding.gyp b/binding.gyp index cdbcc274..afc0e146 100644 --- a/binding.gyp +++ b/binding.gyp @@ -73,7 +73,8 @@ }], ["OS=='mac'", { "sources": [ - "src/object-store/src/impl/apple/external_commit_helper.cpp" + "src/object-store/src/impl/apple/external_commit_helper.cpp", + "src/object-store/src/impl/apple/keychain_helper.cpp" ] }], ["realm_enable_sync", { @@ -83,8 +84,7 @@ "src/object-store/src/sync/sync_user.cpp", "src/object-store/src/sync/sync_session.cpp", "src/object-store/src/sync/impl/sync_file.cpp", - "src/object-store/src/sync/impl/sync_metadata.cpp", - "src/object-store/src/impl/apple/keychain_helper.cpp" + "src/object-store/src/sync/impl/sync_metadata.cpp" ], }] ], From ca0fd78ceefd9a12c857550f5c274a4a95c6fb91 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Tue, 15 Nov 2016 13:49:41 +0100 Subject: [PATCH 094/100] Do not build node with sync by default --- scripts/test.sh | 9 +++++---- src/node/gyp/realm.gyp | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/test.sh b/scripts/test.sh index 4f077d7f..2e3877d2 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -123,7 +123,7 @@ case "$TARGET" in ;; "react-tests") if ! [ -z "${JENKINS_HOME}" ]; then - ${SRCROOT}/scripts/reset-simulators.sh + ${SRCROOT}/scripts/reset-simulators.sh fi pushd tests/react-test-app @@ -137,9 +137,9 @@ case "$TARGET" in ;; "react-example") if ! [ -z "${JENKINS_HOME}" ]; then - ${SRCROOT}/scripts/reset-simulators.sh + ${SRCROOT}/scripts/reset-simulators.sh fi - + pushd examples/ReactExample npm install @@ -186,10 +186,11 @@ case "$TARGET" in download_server start_server npm_tests_cmd="npm run test" + npm install --build-from-source --realm_enable_sync else npm_tests_cmd="npm run test-nosync" + npm install --build-from-source fi - npm install --build-from-source # Change to a temp directory. cd "$(mktemp -q -d -t realm.node.XXXXXX)" diff --git a/src/node/gyp/realm.gyp b/src/node/gyp/realm.gyp index 96c200f4..98ae7588 100644 --- a/src/node/gyp/realm.gyp +++ b/src/node/gyp/realm.gyp @@ -5,7 +5,7 @@ "conditions": [ ["OS=='mac'", { "variables": { - "realm_enable_sync%": "1" + "realm_enable_sync%": "0" } }, { "variables": { From ca3fb62c590e53c292475d2831f441fa02ad58d5 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 15 Nov 2016 05:08:26 -0800 Subject: [PATCH 095/100] ci build fixes for android --- package.json | 3 ++- scripts/prepublish.sh | 2 +- scripts/test.sh | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bf10ffe3..d804460a 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "jsdoc": "rm -rf docs/output && jsdoc -c docs/conf.json", "lint": "eslint", "test": "scripts/test.sh", - "install": "node-pre-gyp install --fallback-to-build" + "install": "node-pre-gyp install --fallback-to-build", + "prepublish": "scripts/prepublish.sh" }, "dependencies": { "nan": "^2.3.3", diff --git a/scripts/prepublish.sh b/scripts/prepublish.sh index 11d7adc5..0fe81249 100755 --- a/scripts/prepublish.sh +++ b/scripts/prepublish.sh @@ -8,5 +8,5 @@ cd "$(dirname "$0")/.." if [ -n "$REALM_BUILD_ANDROID" ]; then rm -rf android - (cd react-native/android && ./gradlew publishAndroid) + (cd react-native/android && ./gradlew publishAndroid -PbuildWithSync=true) fi diff --git a/scripts/test.sh b/scripts/test.sh index 4f077d7f..e7c4842d 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -151,6 +151,7 @@ case "$TARGET" in ;; "react-tests-android") [[ $CONFIGURATION == 'Debug' ]] && exit 0 + XCPRETTY=false pushd tests/react-test-app From 06b27bf8c042ecc6951b11cad0286f8fdace554d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Vind?= Date: Mon, 14 Nov 2016 15:33:23 -0800 Subject: [PATCH 096/100] Add documentation for new methods --- docs/collection.js | 33 +++++++++++++++++++++++++++++++++ docs/results.js | 4 +++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/collection.js b/docs/collection.js index b0dcaeaa..98824151 100644 --- a/docs/collection.js +++ b/docs/collection.js @@ -259,6 +259,39 @@ class Collection { * @since 0.11.0 */ reduceRight(callback, initialValue) {} + + /** + * Add a listener `callback` which will be called when a **live** collection instance changes. + * @param {function(collection, changes)} callback - A function to be called when changes occur. + * The callback function is called with two arguments: + * - `collection`: the collection instance that changed, + * - `changes`: a dictionary with keys `insertions`, `modifications` and `deletions`, + * each containing a list of indices that were inserted, updated or deleted respectively. + * @throws {Error} If `callback` is not a function. + * @example + * wines.addListener((collection, changes) => { + * // collection === wines + * console.log(`${changes.insertions.length} insertions`); + * console.log(`${changes.modifications.length} modifications`); + * console.log(`${changes.deletions.length} deletions`); + * console.log(`new size of collection: ${collection.length}`); + * }); + */ + addListener(callback) {} + + /** + * Remove the listener `callback` from the collection instance. + * @param {function(collection, changes)} callback - Callback function that was previously + * added as a listener through the {@link Collection#addListener addListener} method. + * @throws {Error} If `callback` is not a function. + */ + removeListener(callback) {} + + /** + * Remove all `callback` listeners from the collection instance. + */ + removeAllListeners(name) {} + } /** diff --git a/docs/results.js b/docs/results.js index 6a28f085..d04818e6 100644 --- a/docs/results.js +++ b/docs/results.js @@ -20,7 +20,9 @@ * Instances of this class are typically **live** collections returned by * {@link Realm#objects objects()} that will update as new objects are either * added to or deleted from the Realm that match the underlying query. Results returned by - * {@link Realm.Results#snapshot snapshot()}, however, are will **not** live update. + * {@link Realm.Results#snapshot snapshot()}, however, will **not** live update + * (and listener callbacks added through {@link Realm.Results#addListener addListener()} + * will thus never be called). * @extends Realm.Collection * @memberof Realm */ From db524a56a2d2f52fd24b15c84d37f1487c03cf98 Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 15 Nov 2016 05:42:25 -0800 Subject: [PATCH 097/100] [0.15.0-rc] Bump version --- CHANGELOG.md | 5 +++-- package.json | 2 +- src/RealmJS.xcodeproj/project.pbxproj | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98546e22..fd5c6581 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ -x.x.x Release notes (yyyy-MM-dd) +0.15.0 Release notes (2016-11-15) ============================================================= ### Breaking changes * None ### Enhancements -* None +* Support for fine grained notifications +* Updated test and examples for react-natve v0.37.0 ### Bugfixes * None diff --git a/package.json b/package.json index 29ab50d4..8491766c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "realm", "description": "Realm is a mobile database: an alternative to SQLite and key-value stores", - "version": "0.14.3-6", + "version": "0.15.0-rc", "license": "Apache-2.0", "homepage": "https://realm.io", "keywords": [ diff --git a/src/RealmJS.xcodeproj/project.pbxproj b/src/RealmJS.xcodeproj/project.pbxproj index 3ae7e2cc..60cd5354 100644 --- a/src/RealmJS.xcodeproj/project.pbxproj +++ b/src/RealmJS.xcodeproj/project.pbxproj @@ -903,7 +903,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.14.3; + CURRENT_PROJECT_VERSION = 0.15.0; CXX = "$(SRCROOT)/../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -966,7 +966,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.14.3; + CURRENT_PROJECT_VERSION = 0.15.0; CXX = "$(SRCROOT)/../scripts/ccache-clang++.sh"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; From eaf29974fd244e76e61825d27e45da364142a3e7 Mon Sep 17 00:00:00 2001 From: Radu Tutueanu Date: Tue, 15 Nov 2016 17:06:23 +0100 Subject: [PATCH 098/100] Empty commit for ci From d56fbc303ff45b8c44c316d9f5aac71eca550fde Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 15 Nov 2016 08:33:07 -0800 Subject: [PATCH 099/100] add node-sync to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fccadf5b..c47478af 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ core core-* sync sync-* +node-sync +node-sync-* # sh build.sh config /Realm/config.mk From bfce11918be7fb268aeb03b715477e2031d9c22a Mon Sep 17 00:00:00 2001 From: Ari Lazier Date: Tue, 15 Nov 2016 10:48:15 -0800 Subject: [PATCH 100/100] temporarily remove sync docs --- docs/conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.json b/docs/conf.json index 5551074d..4da9afa0 100644 --- a/docs/conf.json +++ b/docs/conf.json @@ -7,7 +7,7 @@ }, "source": { "include": ["docs"], - "exclude": ["docs/jsdoc-template", "docs/output"] + "exclude": ["docs/jsdoc-template", "docs/output", "docs/sync.js"] }, "tags": { "allowUnknownTags": false