2.0

/to @raymondfeng @bajtos @crandmck

# 2.0 TODO

- [ ] trackChanges should be well documented (remove from `Model`)
- [ ] remove [global modelBuilder](https://github.com/strongloop/loopback/blob/2.0/lib/loopback.js#L128)
- [ ] remove `loopback.createModel()` in favor of `Model.extend()`.
- [ ] rename `DataModel` to `PersistedModel`
- [ ] [remove unused explorer](https://github.com/strongloop/loopback/pull/272#discussion-diff-12943976R6)
- [ ] remove `DataModel` mixins in favor of simple delegation
- [ ] `DataModel` methods should delegate to the dataSource directly
- [ ] refactor `DataModel#replicate()` into `Replication` class.
- [ ] refactor `DataModel#bulkUpdate()` into `BulkUpdate` class.
- [ ] refactor `DataModel#diff()` into `Diff` class.
- [ ] remove `Model` autoAttach
- [ ] [password should be validatable](https://github.com/strongloop/loopback/issues/251)
- [ ] docs for any class should include any available method (eg. inherited / mixed-in / etc)
- [ ] tests should not share any objects (eg. create a new app / modelBuilder for all tests)
- [ ] karma tests should run in ci
- [ ] beef up CHANGES.md
- [ ] create upgrade guide 1.x => 2.x
- [ ] remove `app.remoteObjects()`
- [ ] move memory connector filtering into its own module
- [ ] rename `ACL` => `AccessControl` and `options.acls` to `options.acl`.
- [ ] remove `sharedCtor` and remoted prototype methods
- [ ] document model.settings.remoting / remoting options
- [ ] document base URL setting for models
- [ ] all URLs should be lowercase / dasherized (both configurable)
- [ ] groundwork for allowing ACL to provide route names
- [ ] groundwork for allowing non-model remote classes (eg. Resource and/or Controller)
- [ ] groundwork for supporting promises via remoting
- [ ] groundwork for supporting promises for `DataModel` methods
- [ ] migrate `app.boot()` into its own separate module
- [ ] migrate `ACL` into its own separate module
- [ ] groundwork for removing remoting metadata from JS
- [ ] groundwork for removing juggler as a dependency
- [ ] remove or properly impelment "property" from ACL

# Breaking Changes

See https://github.com/strongloop/loopback/blob/1.9/CHANGES.md for my notes on breaking changes.

Should we mark these in the docs as deprecated?

# Model => DataModel

`Model` is now specifically for defining data structures. `DataModel` is the default class for `app.model(name, ...);` and `models.json`.

# Remote Methods

Remote methods no longer rely on function objects for storing meta-data. This means remoting meta-data is simple to (de)serialize. All metadata has been moved from juggler to loopback including the relations.

**Types**

Remote methods now define the concrete type for accepts / returns. This is required to correctly serialize models when code expects the concrete type (eg. `MyModel`) in a callback. This is to allow code like the following to work anywhere (client, server, browser, etc)

```js
MyModel.find(function(err, myModel) {
  myModel.name = 'foobar';
  myModel.save();
});
```

# Replication

This has been mostly reviewed as part of https://github.com/strongloop/loopback/pull/153. [End to end tests](https://github.com/strongloop/loopback/blob/1.9/test/e2e/replication.e2e.js) should be review and glaring issues preventing releasing 1.9.0. Minor issues can be resolved in 1.9.x.

The e2e tests could be improved quite a bit. Suggestions welcome there.

# Remote Connector

This has been reworked a little, could use some second eyes. Same story here, anything major should be fixed before we release 1.9.0. Minor changes can be saved 1.9.x.

# Isomorphic LoopBack

This feature was landed a while ago, overall testing strategy could use some eyes. Changes suggested here will most likely wait for 1.9.1.