diff --git a/.gitignore b/.gitignore
index c311dea..75552dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,9 @@ bower_components/
*.iml
.idea/
+
+build_examples/r.js/bundle.js
+build_examples/browserify/bundle.js
+build_examples/webpack/bundle.js
+build_examples/webpack_es6/bundle.js
+build_examples/webpack_es6_2/bundle.js
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 93f0c37..a2352b7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,23 @@
+##### 3.0.0 - 02 July 2015
+
+Stable Version 3.0.0
+
+##### 3.0.0-rc.1 - 28 June 2015
+
+Stable Version 3.0.0-rc.1
+
+##### 3.0.0-beta.2 - 19 April 2015
+
+Added examples of various build setups `./build_examples/`
+
+##### 3.0.0-beta.1 - 17 April 2015
+
+###### Backwards compatible API changes
+- #306 - Keep it DRY
+
+###### Other
+- #314 - Switch to using peerDependencies
+
##### 2.4.0 - 15 April 2015
###### Backwards compatible API changes
diff --git a/Gruntfile.js b/Gruntfile.js
index 260ac9a..4966178 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -72,7 +72,7 @@ module.exports = function (grunt) {
files: [
'bower_components/angular-1.3.2/angular.js',
'bower_components/angular-mocks-1.3.2/angular-mocks.js',
- 'bower_components/js-data/dist/js-data.js',
+ 'node_modules/js-data/dist/js-data.min.js',
'dist/js-data-angular.min.js',
'karma.start.js',
'test/**/*.js'
@@ -87,10 +87,11 @@ module.exports = function (grunt) {
},
webpack: {
dist: {
+ debug: true,
entry: './src/index.js',
output: {
filename: './dist/js-data-angular.js',
- libraryTarget: 'umd',
+ libraryTarget: 'umd2',
library: 'jsDataAngularModuleName'
},
externals: {
@@ -100,11 +101,12 @@ module.exports = function (grunt) {
commonjs2: 'js-data',
root: 'JSData'
},
+ 'axios': 'axios',
'angular': 'angular'
},
module: {
loaders: [
- { test: /(.+)\.js$/, exclude: /node_modules/, loader: 'babel-loader?blacklist=useStrict' }
+ { test: /(.+)\.js$/, loader: 'babel-loader?blacklist=useStrict' }
],
preLoaders: [
{
diff --git a/README.md b/README.md
index c71a740..2b68e74 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
Angular wrapper for [js-data](http://www.js-data.io).
#### What happened Angular-data?
-Js-data-angular is Angular-data 2.0, with [js-data](http://www.js-data.io) as the framework-agnostic core. Documentation for Angular-data 1.x can be found at [angular-data.pseudobry.com](http://angular-data.pseudobry.com).
+Angular-data is deprecated. js-data + js-data-angular is the new hotness.
### Guides
- [Angular + JSData (js-data-angular)](http://www.js-data.io/docs/js-data-angular)
@@ -41,7 +41,7 @@ __Latest Release:__ [](https://gemnasium.com/js-data/js-data-angular) [](https://coveralls.io/r/js-data/js-data-angular?branch=master) [](https://www.codacy.com/public/jasondobry/js-data-angular/dashboard)
+[](https://gemnasium.com/js-data/js-data-angular) [](https://coveralls.io/r/js-data/js-data-angular?branch=master) [](https://www.codacy.com/public/jasondobry/js-data-angular/dashboard)
__Supported Platforms:__
@@ -99,6 +99,8 @@ app.controller('postCtrl', function ($scope, $routeParams, Post, Comment) {
[CHANGELOG.md](https://github.com/js-data/js-data-angular/blob/master/CHANGELOG.md)
### Community
+- [Gitter Channel](https://gitter.im/js-data/js-data) - Better than IRC!
+- [Announcements](http://www.js-data.io/blog)
- [Mailing List](https://groups.io/org/groupsio/jsdata) - Ask your questions!
- [Issues](https://github.com/js-data/js-data-angular/issues) - Found a bug? Feature request? Submit an issue!
- [GitHub](https://github.com/js-data/js-data-angular) - View the source code for js-data.
diff --git a/bower.json b/bower.json
index 4c785fa..5679625 100644
--- a/bower.json
+++ b/bower.json
@@ -18,20 +18,12 @@
"package.json"
],
"devDependencies": {
- "angular-1.1.5": "angular-unstable#1.1.5",
- "angular-1.2.16": "angular#1.2.16",
- "angular-1.2.25": "angular#1.2.25",
"angular-1.3.2": "angular#1.3.2",
- "angular-mocks-1.1.5": "angular-mocks-unstable#1.1.5",
- "angular-mocks-1.2.16": "angular-mocks#1.2.16",
- "angular-mocks-1.2.25": "angular-mocks#1.2.25",
"angular-mocks-1.3.2": "angular-mocks#1.3.2"
},
"dependencies": {
- "js-data": ">=1.5.7",
+ "js-data": ">=2.0.0",
+ "js-data-http": ">=2.0.0",
"angular": ">=1.1.0"
- },
- "resolutions": {
- "angular": "1.3.2"
}
}
diff --git a/build_examples/browserify/README.md b/build_examples/browserify/README.md
new file mode 100644
index 0000000..bac593a
--- /dev/null
+++ b/build_examples/browserify/README.md
@@ -0,0 +1,3 @@
+Running `browserify -x axios app.js > bundle.js` in this directory will produce `bundle.js`
+
+Note the external dependency "axios" that is excluded from the build (it's not needed when using js-data-angular).
diff --git a/build_examples/browserify/app.js b/build_examples/browserify/app.js
new file mode 100644
index 0000000..542325e
--- /dev/null
+++ b/build_examples/browserify/app.js
@@ -0,0 +1,17 @@
+// this is what you would do in a real app
+// var angular = require('angular');
+
+// for the example to work
+var angular = require('../../node_modules/angular');
+
+console.log(angular);
+
+angular.module('app', [
+ // this is what you would do in a real app
+ // require('js-data-angular')
+
+ // for the example to work
+ require('../../dist/js-data-angular.js')
+]).run(function (DS, DSVersion, $rootScope) {
+ $rootScope.test = 'It works! Using js-data ' + DSVersion.full;
+});
diff --git a/build_examples/browserify/index.html b/build_examples/browserify/index.html
new file mode 100644
index 0000000..9769ccd
--- /dev/null
+++ b/build_examples/browserify/index.html
@@ -0,0 +1,11 @@
+
+
+
+ My App
+
+
+
+
+{{ test }}
+
+
diff --git a/build_examples/r.js/README.md b/build_examples/r.js/README.md
new file mode 100644
index 0000000..0632f37
--- /dev/null
+++ b/build_examples/r.js/README.md
@@ -0,0 +1,3 @@
+Running `r.js -o require.config.js` in this directory will produce `bundle.js`
+
+In `index.html` switch `script/main` between `main` (load scripts dynamically) and `bundle` (load bundled scripts)
diff --git a/build_examples/r.js/app.js b/build_examples/r.js/app.js
new file mode 100644
index 0000000..6ead9cf
--- /dev/null
+++ b/build_examples/r.js/app.js
@@ -0,0 +1,9 @@
+define('app', [
+ 'angular',
+ 'js-data-angular'
+], function (angular, jsDataModuleName) {
+ return angular.module('app', [jsDataModuleName])
+ .run(function (DS, DSVersion, $rootScope) {
+ $rootScope.test = 'It works! Using js-data ' + DSVersion.full;
+ });
+});
diff --git a/build_examples/r.js/index.html b/build_examples/r.js/index.html
new file mode 100644
index 0000000..781e49d
--- /dev/null
+++ b/build_examples/r.js/index.html
@@ -0,0 +1,14 @@
+
+
+
+ My App
+
+
+
+
+
+
+
+{{ test }}
+
+
diff --git a/build_examples/r.js/main.js b/build_examples/r.js/main.js
new file mode 100644
index 0000000..f3e8fb5
--- /dev/null
+++ b/build_examples/r.js/main.js
@@ -0,0 +1,23 @@
+require.config({
+ paths: {
+ angular: '../../bower_components/angular/angular',
+ 'js-data-angular': '../../dist/js-data-angular',
+ 'js-data': '../../bower_components/js-data/dist/js-data'
+ },
+ shim: {
+ 'angular': {
+ exports: 'angular'
+ }
+ }
+});
+
+require([
+ 'angular',
+ 'app'
+ ], function (angular, app) {
+ angular.element(document.getElementsByTagName('html')[0]).ready(function () {
+ // bootstrap the app manually
+ angular.bootstrap(document, ['app']);
+ });
+ }
+);
diff --git a/build_examples/r.js/require.config.js b/build_examples/r.js/require.config.js
new file mode 100644
index 0000000..a89ae0f
--- /dev/null
+++ b/build_examples/r.js/require.config.js
@@ -0,0 +1,6 @@
+({
+ name: 'main',
+ mainConfigFile: 'main.js',
+ out: 'bundle.js',
+ optimize: 'none'
+})
diff --git a/build_examples/webpack/README.md b/build_examples/webpack/README.md
new file mode 100644
index 0000000..14fa7b9
--- /dev/null
+++ b/build_examples/webpack/README.md
@@ -0,0 +1,3 @@
+Running `webpack` in this directory will produce `bundle.js`
+
+Note the external dependency "axios" that is excluded from the build (it's not needed when using js-data-angular).
diff --git a/build_examples/webpack/app.js b/build_examples/webpack/app.js
new file mode 100644
index 0000000..542325e
--- /dev/null
+++ b/build_examples/webpack/app.js
@@ -0,0 +1,17 @@
+// this is what you would do in a real app
+// var angular = require('angular');
+
+// for the example to work
+var angular = require('../../node_modules/angular');
+
+console.log(angular);
+
+angular.module('app', [
+ // this is what you would do in a real app
+ // require('js-data-angular')
+
+ // for the example to work
+ require('../../dist/js-data-angular.js')
+]).run(function (DS, DSVersion, $rootScope) {
+ $rootScope.test = 'It works! Using js-data ' + DSVersion.full;
+});
diff --git a/build_examples/webpack/index.html b/build_examples/webpack/index.html
new file mode 100644
index 0000000..9769ccd
--- /dev/null
+++ b/build_examples/webpack/index.html
@@ -0,0 +1,11 @@
+
+
+
+ My App
+
+
+
+
+{{ test }}
+
+
diff --git a/build_examples/webpack/webpack.config.js b/build_examples/webpack/webpack.config.js
new file mode 100644
index 0000000..fc1fbc3
--- /dev/null
+++ b/build_examples/webpack/webpack.config.js
@@ -0,0 +1,12 @@
+module.exports = {
+ entry: './app.js',
+ output: {
+ filename: 'bundle.js'
+ },
+ externals: ['axios'],
+ resolve: {
+ alias: {
+ 'js-data-angular': '../dist/js-data-angular.js'
+ }
+ }
+};
diff --git a/build_examples/webpack_es6/README.md b/build_examples/webpack_es6/README.md
new file mode 100644
index 0000000..14fa7b9
--- /dev/null
+++ b/build_examples/webpack_es6/README.md
@@ -0,0 +1,3 @@
+Running `webpack` in this directory will produce `bundle.js`
+
+Note the external dependency "axios" that is excluded from the build (it's not needed when using js-data-angular).
diff --git a/build_examples/webpack_es6/app.js b/build_examples/webpack_es6/app.js
new file mode 100644
index 0000000..40c0f8c
--- /dev/null
+++ b/build_examples/webpack_es6/app.js
@@ -0,0 +1,8 @@
+import angular from 'angular';
+import jsDataModuleName from 'js-data-angular';
+
+angular.module('app', [
+ jsDataModuleName
+]).run((DS, DSVersion, $rootScope) => {
+ $rootScope.test = 'It works! Using js-data ' + DSVersion.full;
+});
diff --git a/build_examples/webpack_es6/index.html b/build_examples/webpack_es6/index.html
new file mode 100644
index 0000000..9769ccd
--- /dev/null
+++ b/build_examples/webpack_es6/index.html
@@ -0,0 +1,11 @@
+
+
+
+ My App
+
+
+
+
+{{ test }}
+
+
diff --git a/build_examples/webpack_es6/webpack.config.js b/build_examples/webpack_es6/webpack.config.js
new file mode 100644
index 0000000..a645ef2
--- /dev/null
+++ b/build_examples/webpack_es6/webpack.config.js
@@ -0,0 +1,17 @@
+module.exports = {
+ entry: './app.js',
+ output: {
+ filename: 'bundle.js'
+ },
+ externals: ['axios'],
+ resolve: {
+ alias: {
+ 'js-data-angular': '../../dist/js-data-angular.js'
+ }
+ },
+ module: {
+ loaders: [
+ { test: /(.+)\.js$/, loader: 'babel-loader?blacklist=useStrict' }
+ ]
+ }
+};
diff --git a/build_examples/webpack_es6_2/README.md b/build_examples/webpack_es6_2/README.md
new file mode 100644
index 0000000..14fa7b9
--- /dev/null
+++ b/build_examples/webpack_es6_2/README.md
@@ -0,0 +1,3 @@
+Running `webpack` in this directory will produce `bundle.js`
+
+Note the external dependency "axios" that is excluded from the build (it's not needed when using js-data-angular).
diff --git a/build_examples/webpack_es6_2/app.js b/build_examples/webpack_es6_2/app.js
new file mode 100644
index 0000000..ec74833
--- /dev/null
+++ b/build_examples/webpack_es6_2/app.js
@@ -0,0 +1,8 @@
+import 'angular';
+import 'js-data-angular';
+
+angular.module('app', [
+ 'js-data'
+]).run((DS, DSVersion, $rootScope) => {
+ $rootScope.test = 'It works! Using js-data ' + DSVersion.full;
+});
diff --git a/build_examples/webpack_es6_2/index.html b/build_examples/webpack_es6_2/index.html
new file mode 100644
index 0000000..9769ccd
--- /dev/null
+++ b/build_examples/webpack_es6_2/index.html
@@ -0,0 +1,11 @@
+
+
+
+ My App
+
+
+
+
+{{ test }}
+
+
diff --git a/build_examples/webpack_es6_2/webpack.config.js b/build_examples/webpack_es6_2/webpack.config.js
new file mode 100644
index 0000000..a645ef2
--- /dev/null
+++ b/build_examples/webpack_es6_2/webpack.config.js
@@ -0,0 +1,17 @@
+module.exports = {
+ entry: './app.js',
+ output: {
+ filename: 'bundle.js'
+ },
+ externals: ['axios'],
+ resolve: {
+ alias: {
+ 'js-data-angular': '../../dist/js-data-angular.js'
+ }
+ },
+ module: {
+ loaders: [
+ { test: /(.+)\.js$/, loader: 'babel-loader?blacklist=useStrict' }
+ ]
+ }
+};
diff --git a/dist/js-data-angular.js b/dist/js-data-angular.js
index bf234d3..988d5ee 100644
--- a/dist/js-data-angular.js
+++ b/dist/js-data-angular.js
@@ -1,6 +1,6 @@
/*!
* js-data-angular
- * @version 2.4.0 - Homepage
+ * @version 3.0.0 - Homepage
* @author Jason Dobry
* @copyright (c) 2014-2015 Jason Dobry
* @license MIT
@@ -9,14 +9,16 @@
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory((function webpackLoadOptionalExternalModule() { try { return require("js-data"); } catch(e) {} }()), (function webpackLoadOptionalExternalModule() { try { return require("angular"); } catch(e) {} }()));
+ module.exports = factory(require("js-data"), require("angular"), (function webpackLoadOptionalExternalModule() { try { return require("axios"); } catch(e) {} }()));
else if(typeof define === 'function' && define.amd)
- define(["js-data", "angular"], factory);
+ define(["js-data", "angular"], function webpackLoadOptionalExternalModuleAmd(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_2__) {
+ return factory(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_2__, root["axios"]);
+ });
else if(typeof exports === 'object')
- exports["jsDataAngularModuleName"] = factory((function webpackLoadOptionalExternalModule() { try { return require("js-data"); } catch(e) {} }()), (function webpackLoadOptionalExternalModule() { try { return require("angular"); } catch(e) {} }()));
+ exports["jsDataAngularModuleName"] = factory(require("js-data"), require("angular"), (function webpackLoadOptionalExternalModule() { try { return require("axios"); } catch(e) {} }()));
else
- root["jsDataAngularModuleName"] = factory(root["JSData"], root["angular"]);
-})(this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_2__) {
+ root["jsDataAngularModuleName"] = factory(root["JSData"], root["angular"], root["axios"]);
+})(this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_5__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
@@ -63,56 +65,22 @@ return /******/ (function(modules) { // webpackBootstrap
/* 0 */
/***/ function(module, exports, __webpack_require__) {
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
- Object.defineProperty(exports, '__esModule', {
- value: true
- });
/*jshint loopfunc:true*/
- var angular = undefined,
- JSData = undefined;
- try {
- JSData = __webpack_require__(1);
- } catch (e) {}
-
- if (!JSData) {
- try {
- JSData = window.JSData;
- } catch (e) {}
- }
- if (!JSData) {
- throw new Error('js-data must be loaded!');
- }
- try {
- angular = __webpack_require__(2);
- } catch (e) {}
-
- if (!angular) {
- try {
- angular = window.angular;
- } catch (e) {}
- }
- if (!angular) {
- throw new Error('angular must be loaded!');
- }
+ var JSData = __webpack_require__(1);
+ var DSHttpAdapter = __webpack_require__(4);
+ var angular = __webpack_require__(2);
var DSUtils = JSData.DSUtils;
var DSErrors = JSData.DSErrors;
- var deepMixIn = DSUtils.deepMixIn;
- var copy = DSUtils.copy;
- var removeCircular = DSUtils.removeCircular;
var isString = DSUtils.isString;
var isNumber = DSUtils.isNumber;
- var makePath = DSUtils.makePath;
- var httpLoaded = false;
+ var isObject = DSUtils.isObject;
+ var set = DSUtils.set;
+ var resolveId = DSUtils.resolveId;
var adapters = [{
- project: 'js-data-http',
- name: 'http',
- 'class': 'DSHttpAdapter'
- }, {
project: 'js-data-localstorage',
name: 'localstorage',
'class': 'DSLocalStorageAdapter'
@@ -130,7 +98,7 @@ return /******/ (function(modules) { // webpackBootstrap
'class': 'DSSqlAdapter'
}];
- var functionsToWrap = ['compute', 'digest', 'eject', 'inject', 'link', 'linkAll', 'linkInverse', 'unlinkInverse'];
+ var functionsToWrap = ['compute', 'digest', 'eject', 'inject'];
function registerAdapter(adapter) {
var Adapter = undefined;
@@ -144,9 +112,6 @@ return /******/ (function(modules) { // webpackBootstrap
}
if (Adapter) {
- if (adapter.name === 'http') {
- httpLoaded = true;
- }
adapter.loaded = true;
angular.module('js-data').provider(adapter['class'], function () {
var _this = this;
@@ -158,6 +123,20 @@ return /******/ (function(modules) { // webpackBootstrap
}
}
+ var DSHttpAdapterProvider = function DSHttpAdapterProvider() {
+ _classCallCheck(this, DSHttpAdapterProvider);
+
+ var defaults = {};
+ this.defaults = defaults;
+
+ this.$get = ['$http', 'DS', function ($http, DS) {
+ defaults.http = defaults.http || $http;
+ var adapter = new DSHttpAdapter(defaults);
+ DS.registerAdapter('http', adapter, { 'default': true });
+ return adapter;
+ }];
+ };
+
var DSProvider = function DSProvider() {
_classCallCheck(this, DSProvider);
@@ -179,11 +158,11 @@ return /******/ (function(modules) { // webpackBootstrap
if (!_this.definitions[resourceName]) {
throw new DSErrors.NER(resourceName);
- } else if (!DSUtils.isObject(params)) {
+ } else if (!isObject(params)) {
throw new DSErrors.IA('"params" must be an object!');
- } else if (!DSUtils.isObject(scope)) {
+ } else if (!isObject(scope)) {
throw new DSErrors.IA('"scope" must be an object!');
- } else if (!DSUtils.isString(expr)) {
+ } else if (!isString(expr)) {
throw new DSErrors.IA('"expr" must be a string!');
}
@@ -192,7 +171,7 @@ return /******/ (function(modules) { // webpackBootstrap
return _this.lastModified(resourceName);
}, function () {
var items = _this.filter(resourceName, params);
- DSUtils.set(scope, expr, items);
+ set(scope, expr, items);
if (cb) {
cb(null, items);
}
@@ -209,14 +188,14 @@ return /******/ (function(modules) { // webpackBootstrap
JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) {
var _this = this;
- id = DSUtils.resolveId(_this.definitions[resourceName], id);
+ id = resolveId(_this.definitions[resourceName], id);
if (!_this.definitions[resourceName]) {
throw new DSErrors.NER(resourceName);
- } else if (!DSUtils.isString(id) && !DSUtils.isNumber(id)) {
+ } else if (!isString(id) && !isNumber(id)) {
throw new DSErrors.IA('"id" must be a string or a number!');
- } else if (!DSUtils.isObject(scope)) {
+ } else if (!isObject(scope)) {
throw new DSErrors.IA('"scope" must be an object!');
- } else if (!DSUtils.isString(expr)) {
+ } else if (!isString(expr)) {
throw new DSErrors.IA('"expr" must be a string!');
}
@@ -228,7 +207,7 @@ return /******/ (function(modules) { // webpackBootstrap
if (item) {
_this.compute(resourceName, id);
}
- DSUtils.set(scope, expr, item);
+ set(scope, expr, item);
if (cb) {
cb(null, item);
}
@@ -322,300 +301,28 @@ return /******/ (function(modules) { // webpackBootstrap
_this.$get = deps;
};
- angular.module('js-data', ['ng']).value('DSUtils', JSData.DSUtils).value('DSErrors', JSData.DSErrors).provider('DS', DSProvider);
+ angular.module('js-data', ['ng']).value('DSUtils', DSUtils).value('DSErrors', DSErrors).value('DSVersion', JSData.version).provider('DS', DSProvider).provider('DSHttpAdapter', DSHttpAdapterProvider).run(['DS', 'DSHttpAdapter', function (DS, DSHttpAdapter) {
+ DS.registerAdapter('http', DSHttpAdapter, { 'default': true });
+ }]);
for (var i = 0; i < adapters.length; i++) {
registerAdapter(adapters[i]);
}
- if (!httpLoaded) {
- (function () {
- var Defaults = (function () {
- function Defaults() {
- _classCallCheck(this, Defaults);
- }
-
- _createClass(Defaults, [{
- key: 'queryTransform',
- value: function queryTransform(resourceConfig, params) {
- return params;
- }
- }, {
- key: 'deserialize',
- value: function deserialize(resourceConfig, data) {
- return data ? 'data' in data ? data.data : data : data;
- }
- }, {
- key: 'serialize',
- value: function serialize(resourceConfig, data) {
- return data;
- }
- }, {
- key: 'log',
- value: function log() {}
- }, {
- key: 'error',
- value: function error() {}
- }]);
-
- return Defaults;
- })();
-
- var defaultsPrototype = Defaults.prototype;
-
- defaultsPrototype.basePath = '';
-
- defaultsPrototype.forceTrailingSlash = '';
-
- defaultsPrototype.httpConfig = {};
-
- var DSHttpAdapter = (function () {
- function DSHttpAdapter(options) {
- _classCallCheck(this, DSHttpAdapter);
-
- this.defaults = new Defaults();
- if (console) {
- this.defaults.log = function (a, b) {
- return console[typeof console.info === 'function' ? 'info' : 'log'](a, b);
- };
- }
- if (console) {
- this.defaults.error = function (a, b) {
- return console[typeof console.error === 'function' ? 'error' : 'log'](a, b);
- };
- }
- deepMixIn(this.defaults, options);
- }
-
- _createClass(DSHttpAdapter, [{
- key: 'getPath',
- value: function getPath(method, resourceConfig, id, options) {
- var _this = this;
- options = options || {};
- var args = [options.basePath || _this.defaults.basePath || resourceConfig.basePath, resourceConfig.getEndpoint(isString(id) || isNumber(id) || method === 'create' ? id : null, options)];
- if (method === 'find' || method === 'update' || method === 'destroy') {
- args.push(id);
- }
- return makePath.apply(DSUtils, args);
- }
- }, {
- key: 'GET',
- value: function GET(url, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'get';
- }
- return this.HTTP(deepMixIn(config, {
- url: url
- }));
- }
- }, {
- key: 'POST',
- value: function POST(url, attrs, config) {
- config = config || {};
- config = DSUtils.copy(config);
- if (!('method' in config)) {
- config.method = 'post';
- }
- return this.HTTP(deepMixIn(config, {
- url: url,
- data: attrs
- }));
- }
- }, {
- key: 'PUT',
- value: function PUT(url, attrs, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'put';
- }
- return this.HTTP(deepMixIn(config, {
- url: url,
- data: attrs || {}
- }));
- }
- }, {
- key: 'DEL',
- value: function DEL(url, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'delete';
- }
- return this.HTTP(deepMixIn(config, {
- url: url
- }));
- }
- }, {
- key: 'find',
- value: function find(resourceConfig, id, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.GET(_this.getPath('find', resourceConfig, id, options), options).then(function (data) {
- var item = (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- return !item ? JSData.DSUtils.Promise.reject(new Error('Not Found!')) : item;
- });
- }
- }, {
- key: 'findAll',
- value: function findAll(resourceConfig, params, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return _this.GET(_this.getPath('findAll', resourceConfig, params, options), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }, {
- key: 'create',
- value: function create(resourceConfig, attrs, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.POST(_this.getPath('create', resourceConfig, attrs, options), (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }, {
- key: 'update',
- value: function update(resourceConfig, id, attrs, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.PUT(_this.getPath('update', resourceConfig, id, options), (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }, {
- key: 'updateAll',
- value: function updateAll(resourceConfig, attrs, params, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return this.PUT(_this.getPath('updateAll', resourceConfig, attrs, options), (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }, {
- key: 'destroy',
- value: function destroy(resourceConfig, id, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.DEL(_this.getPath('destroy', resourceConfig, id, options), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }, {
- key: 'destroyAll',
- value: function destroyAll(resourceConfig, params, options) {
- var _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return this.DEL(_this.getPath('destroyAll', resourceConfig, params, options), options).then(function (data) {
- return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- });
- }
- }]);
-
- return DSHttpAdapter;
- })();
-
- var dsHttpAdapterPrototype = DSHttpAdapter.prototype;
-
- var DSHttpAdapterProvider = function DSHttpAdapterProvider() {
- _classCallCheck(this, DSHttpAdapterProvider);
-
- var _this = this;
- _this.defaults = {};
- _this.$get = ['$http', 'DS', '$q', function ($http, DS, $q) {
- dsHttpAdapterPrototype.HTTP = function (config) {
- var _this = this;
- var start = new Date();
- config = copy(config);
- config = deepMixIn(config, _this.defaults.httpConfig);
- if (_this.defaults.forceTrailingSlash && config.url[config.url.length - 1] !== '/') {
- config.url += '/';
- }
- config.method = config.method.toUpperCase();
- if (typeof config.data === 'object') {
- config.data = removeCircular(config.data);
- }
- var suffix = config.suffix || _this.defaults.suffix;
- if (suffix && config.url.substr(config.url.length - suffix.length) !== suffix) {
- config.url += suffix;
- }
-
- function logResponse(data) {
- var str = '' + start.toUTCString() + ' - ' + data.config.method.toUpperCase() + ' ' + data.config.url + ' - ' + data.status + ' ' + (new Date().getTime() - start.getTime()) + 'ms';
- if (data.status >= 200 && data.status < 300) {
- if (_this.defaults.log) {
- _this.defaults.log(str, data);
- }
- return data;
- } else {
- if (_this.defaults.error) {
- _this.defaults.error('FAILED: ' + str, data);
- }
- return $q.reject(data);
- }
- }
-
- return $http(config).then(logResponse, logResponse);
- };
-
- var adapter = new DSHttpAdapter(_this.defaults);
- DS.registerAdapter('http', adapter, { 'default': true });
- return adapter;
- }];
- };
-
- angular.module('js-data').provider('DSHttpAdapter', DSHttpAdapterProvider);
- })();
- }
- angular.module('js-data').run(['DS', 'DSHttpAdapter', function (DS, DSHttpAdapter) {
- return DS.registerAdapter('http', DSHttpAdapter, { 'default': true });
- }]);
-
// return the module name
- exports['default'] = 'js-data';
- module.exports = exports['default'];
+ module.exports = 'js-data';
+ module.exports.name = 'js-data';
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
- if(typeof __WEBPACK_EXTERNAL_MODULE_1__ === 'undefined') {var e = new Error("Cannot find module \"undefined\""); e.code = 'MODULE_NOT_FOUND'; throw e;}
module.exports = __WEBPACK_EXTERNAL_MODULE_1__;
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
- if(typeof __WEBPACK_EXTERNAL_MODULE_2__ === 'undefined') {var e = new Error("Cannot find module \"angular\""); e.code = 'MODULE_NOT_FOUND'; throw e;}
module.exports = __WEBPACK_EXTERNAL_MODULE_2__;
/***/ },
@@ -637,6 +344,343 @@ return /******/ (function(modules) { // webpackBootstrap
webpackContext.id = 3;
+/***/ },
+/* 4 */
+/***/ function(module, exports, __webpack_require__) {
+
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ var JSData = __webpack_require__(1);
+ var axios = null;
+
+ try {
+ axios = __webpack_require__(5);
+ } catch (e) {}
+
+ var DSUtils = JSData.DSUtils;
+ var deepMixIn = DSUtils.deepMixIn;
+ var removeCircular = DSUtils.removeCircular;
+ var copy = DSUtils.copy;
+ var makePath = DSUtils.makePath;
+ var isString = DSUtils.isString;
+ var isNumber = DSUtils.isNumber;
+
+ var Defaults = (function () {
+ function Defaults() {
+ _classCallCheck(this, Defaults);
+ }
+
+ _createClass(Defaults, [{
+ key: 'queryTransform',
+ value: function queryTransform(resourceConfig, params) {
+ return params;
+ }
+ }, {
+ key: 'deserialize',
+ value: function deserialize(resourceConfig, data) {
+ return data ? 'data' in data ? data.data : data : data;
+ }
+ }, {
+ key: 'serialize',
+ value: function serialize(resourceConfig, data) {
+ return data;
+ }
+ }, {
+ key: 'log',
+ value: function log() {}
+ }, {
+ key: 'error',
+ value: function error() {}
+ }]);
+
+ return Defaults;
+ })();
+
+ var defaultsPrototype = Defaults.prototype;
+
+ defaultsPrototype.basePath = '';
+
+ defaultsPrototype.forceTrailingSlash = '';
+
+ defaultsPrototype.httpConfig = {};
+
+ var DSHttpAdapter = (function () {
+ function DSHttpAdapter(options) {
+ _classCallCheck(this, DSHttpAdapter);
+
+ this.defaults = new Defaults();
+ if (console) {
+ this.defaults.log = function (a, b) {
+ return console[typeof console.info === 'function' ? 'info' : 'log'](a, b);
+ };
+ }
+ if (console) {
+ this.defaults.error = function (a, b) {
+ return console[typeof console.error === 'function' ? 'error' : 'log'](a, b);
+ };
+ }
+ deepMixIn(this.defaults, options);
+ this.http = options.http || axios;
+ }
+
+ _createClass(DSHttpAdapter, [{
+ key: 'getEndpoint',
+ value: function getEndpoint(resourceConfig, id, options) {
+ var _this2 = this;
+
+ options = options || {};
+ options.params = options.params || {};
+
+ var item = undefined;
+ var parentKey = resourceConfig.parentKey;
+ var endpoint = options.hasOwnProperty('endpoint') ? options.endpoint : resourceConfig.endpoint;
+ var parentField = resourceConfig.parentField;
+ var parentDef = resourceConfig.getResource(resourceConfig.parent);
+ var parentId = options.params[parentKey];
+
+ if (parentId === false || !parentKey || !parentDef) {
+ if (parentId === false) {
+ delete options.params[parentKey];
+ }
+ return endpoint;
+ } else {
+ delete options.params[parentKey];
+
+ if (DSUtils._sn(id)) {
+ item = resourceConfig.get(id);
+ } else if (DSUtils._o(id)) {
+ item = id;
+ }
+
+ if (item) {
+ parentId = parentId || item[parentKey] || (item[parentField] ? item[parentField][parentDef.idAttribute] : null);
+ }
+
+ if (parentId) {
+ var _ret = (function () {
+ delete options.endpoint;
+ var _options = {};
+ DSUtils.forOwn(options, function (value, key) {
+ _options[key] = value;
+ });
+ return {
+ v: DSUtils.makePath(_this2.getEndpoint(parentDef, parentId, DSUtils._(parentDef, _options)), parentId, endpoint)
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ } else {
+ return endpoint;
+ }
+ }
+ }
+ }, {
+ key: 'getPath',
+ value: function getPath(method, resourceConfig, id, options) {
+ var _this = this;
+ options = options || {};
+ var args = [options.basePath || _this.defaults.basePath || resourceConfig.basePath, this.getEndpoint(resourceConfig, isString(id) || isNumber(id) || method === 'create' ? id : null, options)];
+ if (method === 'find' || method === 'update' || method === 'destroy') {
+ args.push(id);
+ }
+ return makePath.apply(DSUtils, args);
+ }
+ }, {
+ key: 'HTTP',
+ value: function HTTP(config) {
+ var _this = this;
+ var start = new Date();
+ config = copy(config);
+ config = deepMixIn(config, _this.defaults.httpConfig);
+ if (_this.defaults.forceTrailingSlash && config.url[config.url.length - 1] !== '/') {
+ config.url += '/';
+ }
+ if (typeof config.data === 'object') {
+ config.data = removeCircular(config.data);
+ }
+ config.method = config.method.toUpperCase();
+ var suffix = config.suffix || _this.defaults.suffix;
+ if (suffix && config.url.substr(config.url.length - suffix.length) !== suffix) {
+ config.url += suffix;
+ }
+
+ function logResponse(data) {
+ var str = start.toUTCString() + ' - ' + data.config.method.toUpperCase() + ' ' + data.config.url + ' - ' + data.status + ' ' + (new Date().getTime() - start.getTime()) + 'ms';
+ if (data.status >= 200 && data.status < 300) {
+ if (_this.defaults.log) {
+ _this.defaults.log(str, data);
+ }
+ return data;
+ } else {
+ if (_this.defaults.error) {
+ _this.defaults.error('\'FAILED: ' + str, data);
+ }
+ return DSUtils.Promise.reject(data);
+ }
+ }
+
+ if (!this.http) {
+ throw new Error('You have not configured this adapter with an http library!');
+ }
+
+ return this.http(config).then(logResponse, logResponse);
+ }
+ }, {
+ key: 'GET',
+ value: function GET(url, config) {
+ config = config || {};
+ if (!('method' in config)) {
+ config.method = 'get';
+ }
+ return this.HTTP(deepMixIn(config, {
+ url: url
+ }));
+ }
+ }, {
+ key: 'POST',
+ value: function POST(url, attrs, config) {
+ config = config || {};
+ if (!('method' in config)) {
+ config.method = 'post';
+ }
+ return this.HTTP(deepMixIn(config, {
+ url: url,
+ data: attrs
+ }));
+ }
+ }, {
+ key: 'PUT',
+ value: function PUT(url, attrs, config) {
+ config = config || {};
+ if (!('method' in config)) {
+ config.method = 'put';
+ }
+ return this.HTTP(deepMixIn(config, {
+ url: url,
+ data: attrs || {}
+ }));
+ }
+ }, {
+ key: 'DEL',
+ value: function DEL(url, config) {
+ config = config || {};
+ if (!('method' in config)) {
+ config.method = 'delete';
+ }
+ return this.HTTP(deepMixIn(config, {
+ url: url
+ }));
+ }
+ }, {
+ key: 'find',
+ value: function find(resourceConfig, id, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ options.params = _this.defaults.queryTransform(resourceConfig, options.params);
+ return _this.GET(_this.getPath('find', resourceConfig, id, options), options).then(function (data) {
+ var item = (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ return !item ? DSUtils.Promise.reject(new Error('Not Found!')) : item;
+ });
+ }
+ }, {
+ key: 'findAll',
+ value: function findAll(resourceConfig, params, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ if (params) {
+ params = _this.defaults.queryTransform(resourceConfig, params);
+ deepMixIn(options.params, params);
+ }
+ return _this.GET(_this.getPath('findAll', resourceConfig, params, options), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }, {
+ key: 'create',
+ value: function create(resourceConfig, attrs, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ options.params = _this.defaults.queryTransform(resourceConfig, options.params);
+ return _this.POST(_this.getPath('create', resourceConfig, attrs, options), options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }, {
+ key: 'update',
+ value: function update(resourceConfig, id, attrs, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ options.params = _this.defaults.queryTransform(resourceConfig, options.params);
+ return _this.PUT(_this.getPath('update', resourceConfig, id, options), options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }, {
+ key: 'updateAll',
+ value: function updateAll(resourceConfig, attrs, params, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ if (params) {
+ params = _this.defaults.queryTransform(resourceConfig, params);
+ deepMixIn(options.params, params);
+ }
+ return this.PUT(_this.getPath('updateAll', resourceConfig, attrs, options), options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }, {
+ key: 'destroy',
+ value: function destroy(resourceConfig, id, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ options.params = _this.defaults.queryTransform(resourceConfig, options.params);
+ return _this.DEL(_this.getPath('destroy', resourceConfig, id, options), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }, {
+ key: 'destroyAll',
+ value: function destroyAll(resourceConfig, params, options) {
+ var _this = this;
+ options = options ? copy(options) : {};
+ options.suffix = options.suffix || resourceConfig.suffix;
+ options.params = options.params || {};
+ if (params) {
+ params = _this.defaults.queryTransform(resourceConfig, params);
+ deepMixIn(options.params, params);
+ }
+ return this.DEL(_this.getPath('destroyAll', resourceConfig, params, options), options).then(function (data) {
+ return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
+ });
+ }
+ }]);
+
+ return DSHttpAdapter;
+ })();
+
+ module.exports = DSHttpAdapter;
+
+/***/ },
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+ if(typeof __WEBPACK_EXTERNAL_MODULE_5__ === 'undefined') {var e = new Error("Cannot find module \"axios\""); e.code = 'MODULE_NOT_FOUND'; throw e;}
+ module.exports = __WEBPACK_EXTERNAL_MODULE_5__;
+
/***/ }
/******/ ])
});
diff --git a/dist/js-data-angular.min.js b/dist/js-data-angular.min.js
index e88c1b2..1d88e7c 100644
--- a/dist/js-data-angular.min.js
+++ b/dist/js-data-angular.min.js
@@ -1,6 +1,6 @@
/*!
* js-data-angular
-* @version 2.4.0 - Homepage
+* @version 3.0.0 - Homepage
* @author Jason Dobry
* @copyright (c) 2014-2015 Jason Dobry
* @license MIT
@@ -8,5 +8,5 @@
* @overview Angular wrapper for js-data.
*/
-!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(function(){try{return require("js-data")}catch(a){}}(),function(){try{return require("angular")}catch(a){}}()):"function"==typeof define&&define.amd?define(["js-data","angular"],b):"object"==typeof exports?exports.jsDataAngularModuleName=b(function(){try{return require("js-data")}catch(a){}}(),function(){try{return require("angular")}catch(a){}}()):a.jsDataAngularModuleName=b(a.JSData,a.angular)}(this,function(a,b){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){function d(a){var b=void 0;try{b=c(3)(a.project)}catch(d){}b||(b=window[a["class"]]),b&&("http"===a.name&&(r=!0),a.loaded=!0,g.module("js-data").provider(a["class"],function(){var a=this;a.defaults={},a.$get=[function(){return new b(a.defaults)}]}))}var e=function(){function a(a,b){for(var c=0;ce;e++)d[e]=arguments[e];var f=d[d.length-2],i=d[d.length-1],k=new h.DS(b.defaults),l={};if(a.all=i.all,a.when=i.when,a.reject=i.reject,j.Promise=a,d.length)for(var m=0;md;d++)c[d]=arguments[d];return f.$$phase?l[a].apply(k,c):f.$apply(function(){return l[a].apply(k,c)})}},p=0;p=200&&a.status<300?(d.defaults.log&&d.defaults.log(b,a),a):(d.defaults.error&&d.defaults.error("FAILED: "+b,a),f.reject(a))}var d=this,e=new Date;a=m(a),a=l(a,d.defaults.httpConfig),d.defaults.forceTrailingSlash&&"/"!==a.url[a.url.length-1]&&(a.url+="/"),a.method=a.method.toUpperCase(),"object"==typeof a.data&&(a.data=n(a.data));var g=a.suffix||d.defaults.suffix;return g&&a.url.substr(a.url.length-g.length)!==g&&(a.url+=g),b(a).then(c,c)};var g=new c(a.defaults);return e.registerAdapter("http",g,{"default":!0}),g}]};g.module("js-data").provider("DSHttpAdapter",i)}(),g.module("js-data").run(["DS","DSHttpAdapter",function(a,b){return a.registerAdapter("http",b,{"default":!0})}]),b["default"]="js-data",a.exports=b["default"]},function(b,c,d){if("undefined"==typeof a){var e=new Error('Cannot find module "undefined"');throw e.code="MODULE_NOT_FOUND",e}b.exports=a},function(a,c,d){if("undefined"==typeof b){var e=new Error('Cannot find module "angular"');throw e.code="MODULE_NOT_FOUND",e}a.exports=b},function(a,b,c){function d(a){return c(e(a))}function e(a){return f[a]||function(){throw new Error("Cannot find module '"+a+"'.")}()}var f={};d.keys=function(){return Object.keys(f)},d.resolve=e,a.exports=d,d.id=3}])});
+!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(require("js-data"),require("angular"),function(){try{return require("axios")}catch(a){}}()):"function"==typeof define&&define.amd?define(["js-data","angular"],function(c,d){return b(c,d,a.axios)}):"object"==typeof exports?exports.jsDataAngularModuleName=b(require("js-data"),require("angular"),function(){try{return require("axios")}catch(a){}}()):a.jsDataAngularModuleName=b(a.JSData,a.angular,a.axios)}(this,function(a,b,c){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(a){var b=void 0;try{b=c(3)(a.project)}catch(d){}b||(b=window[a["class"]]),b&&(a.loaded=!0,h.module("js-data").provider(a["class"],function(){var a=this;a.defaults={},a.$get=[function(){return new b(a.defaults)}]}))}var f=c(1),g=c(4),h=c(2),i=f.DSUtils,j=f.DSErrors,k=i.isString,l=i.isNumber,m=i.isObject,n=i.set,o=i.resolveId,p=[{project:"js-data-localstorage",name:"localstorage","class":"DSLocalStorageAdapter"},{project:"js-data-localforage",name:"localforage","class":"DSLocalForageAdapter"},{project:"js-data-firebase",name:"firebase","class":"DSFirebaseAdapter"},{project:"js-data-sql",name:"sql","class":"DSSqlAdapter"}],q=["compute","digest","eject","inject"],r=function u(){d(this,u);var a={};this.defaults=a,this.$get=["$http","DS",function(b,c){a.http=a.http||b;var d=new g(a);return c.registerAdapter("http",d,{"default":!0}),d}]},s=function v(){function a(){function a(a){var b=j.defer();try{a.call(void 0,h.bind(b,b.resolve),h.bind(b,b.reject))}catch(c){b.reject(c)}return b.promise}for(var c=arguments.length,d=Array(c),e=0;c>e;e++)d[e]=arguments[e];var g=d[d.length-2],j=d[d.length-1],k=new f.DS(b.defaults),l={};if(a.all=j.all,a.when=j.when,a.reject=j.reject,i.Promise=a,d.length)for(var m=0;md;d++)c[d]=arguments[d];return g.$$phase?l[a].apply(k,c):g.$apply(function(){return l[a].apply(k,c)})}},r=0;r=200&&a.status<300?(c.defaults.log&&c.defaults.log(b,a),a):(c.defaults.error&&c.defaults.error("'FAILED: "+b,a),i.Promise.reject(a))}var c=this,d=new Date;a=l(a),a=j(a,c.defaults.httpConfig),c.defaults.forceTrailingSlash&&"/"!==a.url[a.url.length-1]&&(a.url+="/"),"object"==typeof a.data&&(a.data=k(a.data)),a.method=a.method.toUpperCase();var e=a.suffix||c.defaults.suffix;if(e&&a.url.substr(a.url.length-e.length)!==e&&(a.url+=e),!this.http)throw new Error("You have not configured this adapter with an http library!");return this.http(a).then(b,b)}},{key:"GET",value:function(a,b){return b=b||{},"method"in b||(b.method="get"),this.HTTP(j(b,{url:a}))}},{key:"POST",value:function(a,b,c){return c=c||{},"method"in c||(c.method="post"),this.HTTP(j(c,{url:a,data:b}))}},{key:"PUT",value:function(a,b,c){return c=c||{},"method"in c||(c.method="put"),this.HTTP(j(c,{url:a,data:b||{}}))}},{key:"DEL",value:function(a,b){return b=b||{},"method"in b||(b.method="delete"),this.HTTP(j(b,{url:a}))}},{key:"find",value:function(a,b,c){var d=this;return c=c?l(c):{},c.suffix=c.suffix||a.suffix,c.params=c.params||{},c.params=d.defaults.queryTransform(a,c.params),d.GET(d.getPath("find",a,b,c),c).then(function(b){var e=(c.deserialize?c.deserialize:d.defaults.deserialize)(a,b);return e?e:i.Promise.reject(new Error("Not Found!"))})}},{key:"findAll",value:function(a,b,c){var d=this;return c=c?l(c):{},c.suffix=c.suffix||a.suffix,c.params=c.params||{},b&&(b=d.defaults.queryTransform(a,b),j(c.params,b)),d.GET(d.getPath("findAll",a,b,c),c).then(function(b){return(c.deserialize?c.deserialize:d.defaults.deserialize)(a,b)})}},{key:"create",value:function(a,b,c){var d=this;return c=c?l(c):{},c.suffix=c.suffix||a.suffix,c.params=c.params||{},c.params=d.defaults.queryTransform(a,c.params),d.POST(d.getPath("create",a,b,c),c.serialize?c.serialize(a,b):d.defaults.serialize(a,b),c).then(function(b){return(c.deserialize?c.deserialize:d.defaults.deserialize)(a,b)})}},{key:"update",value:function(a,b,c,d){var e=this;return d=d?l(d):{},d.suffix=d.suffix||a.suffix,d.params=d.params||{},d.params=e.defaults.queryTransform(a,d.params),e.PUT(e.getPath("update",a,b,d),d.serialize?d.serialize(a,c):e.defaults.serialize(a,c),d).then(function(b){return(d.deserialize?d.deserialize:e.defaults.deserialize)(a,b)})}},{key:"updateAll",value:function(a,b,c,d){var e=this;return d=d?l(d):{},d.suffix=d.suffix||a.suffix,d.params=d.params||{},c&&(c=e.defaults.queryTransform(a,c),j(d.params,c)),this.PUT(e.getPath("updateAll",a,b,d),d.serialize?d.serialize(a,b):e.defaults.serialize(a,b),d).then(function(b){return(d.deserialize?d.deserialize:e.defaults.deserialize)(a,b)})}},{key:"destroy",value:function(a,b,c){var d=this;return c=c?l(c):{},c.suffix=c.suffix||a.suffix,c.params=c.params||{},c.params=d.defaults.queryTransform(a,c.params),d.DEL(d.getPath("destroy",a,b,c),c).then(function(b){return(c.deserialize?c.deserialize:d.defaults.deserialize)(a,b)})}},{key:"destroyAll",value:function(a,b,c){var d=this;return c=c?l(c):{},c.suffix=c.suffix||a.suffix,c.params=c.params||{},b&&(b=d.defaults.queryTransform(a,b),j(c.params,b)),this.DEL(d.getPath("destroyAll",a,b,c),c).then(function(b){return(c.deserialize?c.deserialize:d.defaults.deserialize)(a,b)})}}]),a}();a.exports=r},function(a,b,d){if("undefined"==typeof c){var e=new Error('Cannot find module "axios"');throw e.code="MODULE_NOT_FOUND",e}a.exports=c}])});
//# sourceMappingURL=js-data-angular.min.map
\ No newline at end of file
diff --git a/dist/js-data-angular.min.map b/dist/js-data-angular.min.map
index b182301..5a5833b 100644
--- a/dist/js-data-angular.min.map
+++ b/dist/js-data-angular.min.map
@@ -1 +1 @@
-{"version":3,"file":"js-data-angular.min.js","sources":["js-data-angular.js"],"names":["root","factory","exports","module","require","e","define","amd","this","__WEBPACK_EXTERNAL_MODULE_1__","__WEBPACK_EXTERNAL_MODULE_2__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","registerAdapter","adapter","Adapter","undefined","project","window","name","httpLoaded","angular","provider","_this","defaults","$get","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","value","JSData","Error","DSUtils","DSErrors","deepMixIn","copy","removeCircular","isString","isNumber","makePath","adapters","class","functionsToWrap","DSProvider","load","QPromise","executor","deferred","$q","defer","bind","resolve","reject","err","promise","_len","arguments","args","Array","_key","$rootScope","store","DS","originals","all","when","Promise","j","registered","_loop","k","_len2","_key2","$$phase","apply","$apply","observe","$watch","Platform","performMicrotaskCheckpoint","deps","push","bindAll","resourceName","params","scope","expr","cb","definitions","NER","isObject","IA","lastModified","items","filter","set","bindOne","resolveId","item","get","compute","Defaults","resourceConfig","data","defaultsPrototype","basePath","forceTrailingSlash","httpConfig","DSHttpAdapter","options","console","log","a","b","info","error","method","getEndpoint","url","config","HTTP","attrs","suffix","queryTransform","GET","getPath","then","deserialize","POST","serialize","PUT","DEL","dsHttpAdapterPrototype","DSHttpAdapterProvider","$http","logResponse","str","start","toUTCString","toUpperCase","status","Date","getTime","substr","default","run","code","webpackContext","req","webpackContextResolve","map","keys"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"js-data-angular.min.js","sources":["js-data-angular.js"],"names":["root","factory","exports","module","require","e","define","amd","__WEBPACK_EXTERNAL_MODULE_1__","__WEBPACK_EXTERNAL_MODULE_2__","this","__WEBPACK_EXTERNAL_MODULE_5__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_classCallCheck","instance","Constructor","TypeError","registerAdapter","adapter","Adapter","undefined","project","window","angular","provider","_this","defaults","$get","JSData","DSHttpAdapter","DSUtils","DSErrors","isString","isNumber","isObject","set","resolveId","adapters","name","class","functionsToWrap","DSHttpAdapterProvider","$http","DS","http","default","DSProvider","load","QPromise","executor","deferred","$q","defer","bind","resolve","reject","err","promise","_len","arguments","length","args","Array","_key","$rootScope","store","originals","all","when","Promise","i","j","registered","_loop","k","_len2","_key2","$$phase","apply","$apply","Object","observe","$watch","Platform","performMicrotaskCheckpoint","deps","push","prototype","bindAll","resourceName","params","scope","expr","cb","definitions","NER","IA","lastModified","items","filter","bindOne","item","get","compute","value","version","run","webpackContext","req","webpackContextResolve","map","Error","keys","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","defineProperty","key","protoProps","staticProps","axios","deepMixIn","removeCircular","copy","makePath","Defaults","resourceConfig","data","defaultsPrototype","basePath","forceTrailingSlash","httpConfig","options","console","log","a","b","info","error","_this2","parentKey","endpoint","hasOwnProperty","parentField","parentDef","getResource","parent","parentId","_sn","_o","idAttribute","_ret","_options","forOwn","v","getEndpoint","_","method","config","logResponse","str","start","toUTCString","toUpperCase","url","status","Date","getTime","suffix","substr","then","HTTP","attrs","queryTransform","GET","getPath","deserialize","POST","serialize","PUT","DEL","code"],"mappings":"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"}
\ No newline at end of file
diff --git a/karma.conf.js b/karma.conf.js
index 6e57fb6..43b6ffc 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -23,7 +23,7 @@ module.exports = function (config) {
files: [
'bower_components/angular-1.3.2/angular.js',
'bower_components/angular-mocks-1.3.2/angular-mocks.js',
- 'bower_components/js-data/dist/js-data.js',
+ 'node_modules/js-data/dist/js-data.js',
'dist/js-data-angular.js',
'karma.start.js',
'test/**/*.js'
diff --git a/karma.start.js b/karma.start.js
index 7e9176c..1054600 100644
--- a/karma.start.js
+++ b/karma.start.js
@@ -80,7 +80,7 @@ beforeEach(function () {
lifecycle.beforeInject = function () {
lifecycle.beforeInject.callCount += 1;
};
- lifecycle.afterInject = function () {
+ lifecycle.afterInject = function (resource, data) {
lifecycle.afterInject.callCount += 1;
};
lifecycle.serialize = function (resourceName, data) {
diff --git a/package.json b/package.json
index 7103743..a347d37 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "js-data-angular",
"description": "Angular wrapper for js-data.",
- "version": "2.4.0",
+ "version": "3.0.0",
"homepage": "http://www.js-data.io/docs/js-data-angular",
"repository": {
"type": "git",
@@ -20,37 +20,38 @@
],
"main": "dist/js-data-angular.js",
"devDependencies": {
- "babel-core": "5.1.9",
- "babel-loader": "5.0.0",
+ "babel-core": "5.6.15",
+ "babel-loader": "5.2.2",
"grunt": "0.4.5",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-uglify": "0.9.1",
"grunt-contrib-watch": "0.6.1",
- "grunt-karma": "0.10.1",
+ "grunt-karma": "0.11.2",
"grunt-karma-coveralls": "2.5.3",
- "grunt-webpack": "1.0.8",
+ "grunt-webpack": "1.0.11",
"jit-grunt": "0.9.1",
- "jshint": "2.7.0",
"jshint-loader": "0.8.3",
- "karma": "0.12.31",
+ "karma": "0.12.37",
"karma-chai": "0.1.0",
- "karma-chrome-launcher": "0.1.7",
- "karma-coverage": "0.2.7",
- "karma-firefox-launcher": "0.1.4",
- "karma-mocha": "0.1.10",
- "karma-phantomjs-launcher": "0.1.4",
+ "karma-chrome-launcher": "0.2.0",
+ "karma-coverage": "0.4.2",
+ "karma-firefox-launcher": "0.1.6",
+ "karma-mocha": "0.2.0",
+ "karma-phantomjs-launcher": "0.2.0",
"karma-script-launcher": "0.1.0",
"karma-sinon": "1.0.4",
- "karma-spec-reporter": "0.0.18",
- "time-grunt": "1.1.0",
- "webpack": "1.8.4",
- "webpack-dev-server": "1.8.0"
+ "karma-spec-reporter": "0.0.19",
+ "time-grunt": "1.2.1",
+ "webpack-dev-server": "1.10.1"
},
"scripts": {
"test": "grunt test"
},
"peerDependencies": {
"angular": ">=1.1.0",
- "js-data": ">=1.5.7"
+ "js-data": ">=2.0.0"
+ },
+ "dependencies": {
+ "js-data-http": ">=2.0.0"
}
}
diff --git a/src/index.js b/src/index.js
index c8ab825..b8040b6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,50 +1,12 @@
/*jshint loopfunc:true*/
-let angular, JSData;
-try {
- JSData = require('js-data');
-} catch (e) {
-}
+let JSData = require('js-data');
+let DSHttpAdapter = require('../node_modules/js-data-http/src/index.js');
+let angular = require('angular');
-if (!JSData) {
- try {
- JSData = window.JSData;
- } catch (e) {
- }
-}
-if (!JSData) {
- throw new Error('js-data must be loaded!');
-}
-try {
- angular = require('angular');
-} catch (e) {
-}
-
-if (!angular) {
- try {
- angular = window.angular;
- } catch (e) {
- }
-}
-if (!angular) {
- throw new Error('angular must be loaded!');
-}
-
-let DSUtils = JSData.DSUtils;
-let DSErrors = JSData.DSErrors;
-let deepMixIn = DSUtils.deepMixIn;
-let copy = DSUtils.copy;
-let removeCircular = DSUtils.removeCircular;
-let isString = DSUtils.isString;
-let isNumber = DSUtils.isNumber;
-let makePath = DSUtils.makePath;
-let httpLoaded = false;
+let { DSUtils, DSErrors } = JSData;
+let { isString, isNumber, isObject, set, resolveId } = DSUtils;
let adapters = [
- {
- project: 'js-data-http',
- name: 'http',
- 'class': 'DSHttpAdapter'
- },
{
project: 'js-data-localstorage',
name: 'localstorage',
@@ -71,11 +33,7 @@ let functionsToWrap = [
'compute',
'digest',
'eject',
- 'inject',
- 'link',
- 'linkAll',
- 'linkInverse',
- 'unlinkInverse'
+ 'inject'
];
function registerAdapter(adapter) {
@@ -92,9 +50,6 @@ function registerAdapter(adapter) {
}
if (Adapter) {
- if (adapter.name === 'http') {
- httpLoaded = true;
- }
adapter.loaded = true;
angular.module('js-data').provider(adapter.class, function () {
let _this = this;
@@ -104,6 +59,20 @@ function registerAdapter(adapter) {
}
}
+class DSHttpAdapterProvider {
+ constructor() {
+ let defaults = {};
+ this.defaults = defaults;
+
+ this.$get = ['$http', 'DS', ($http, DS) => {
+ defaults.http = defaults.http || $http;
+ let adapter = new DSHttpAdapter(defaults);
+ DS.registerAdapter('http', adapter, { 'default': true });
+ return adapter;
+ }];
+ }
+}
+
class DSProvider {
constructor() {
let _this = this;
@@ -124,18 +93,18 @@ class DSProvider {
if (!_this.definitions[resourceName]) {
throw new DSErrors.NER(resourceName);
- } else if (!DSUtils.isObject(params)) {
+ } else if (!isObject(params)) {
throw new DSErrors.IA('"params" must be an object!');
- } else if (!DSUtils.isObject(scope)) {
+ } else if (!isObject(scope)) {
throw new DSErrors.IA('"scope" must be an object!');
- } else if (!DSUtils.isString(expr)) {
+ } else if (!isString(expr)) {
throw new DSErrors.IA('"expr" must be a string!');
}
try {
return scope.$watch(() => _this.lastModified(resourceName), () => {
let items = _this.filter(resourceName, params);
- DSUtils.set(scope, expr, items);
+ set(scope, expr, items);
if (cb) {
cb(null, items);
}
@@ -152,14 +121,14 @@ class DSProvider {
JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) {
let _this = this;
- id = DSUtils.resolveId(_this.definitions[resourceName], id);
+ id = resolveId(_this.definitions[resourceName], id);
if (!_this.definitions[resourceName]) {
throw new DSErrors.NER(resourceName);
- } else if (!DSUtils.isString(id) && !DSUtils.isNumber(id)) {
+ } else if (!isString(id) && !isNumber(id)) {
throw new DSErrors.IA('"id" must be a string or a number!');
- } else if (!DSUtils.isObject(scope)) {
+ } else if (!isObject(scope)) {
throw new DSErrors.IA('"scope" must be an object!');
- } else if (!DSUtils.isString(expr)) {
+ } else if (!isString(expr)) {
throw new DSErrors.IA('"expr" must be a string!');
}
@@ -169,7 +138,7 @@ class DSProvider {
if (item) {
_this.compute(resourceName, id);
}
- DSUtils.set(scope, expr, item);
+ set(scope, expr, item);
if (cb) {
cb(null, item);
}
@@ -250,265 +219,20 @@ class DSProvider {
}
}
angular.module('js-data', ['ng'])
- .value('DSUtils', JSData.DSUtils)
- .value('DSErrors', JSData.DSErrors)
- .provider('DS', DSProvider);
+ .value('DSUtils', DSUtils)
+ .value('DSErrors', DSErrors)
+ .value('DSVersion', JSData.version)
+ .provider('DS', DSProvider)
+ .provider('DSHttpAdapter', DSHttpAdapterProvider)
+ .run(['DS', 'DSHttpAdapter', (DS, DSHttpAdapter) => {
+ DS.registerAdapter('http', DSHttpAdapter, { 'default': true });
+ }]);
for (var i = 0; i < adapters.length; i++) {
registerAdapter(adapters[i]);
}
-if (!httpLoaded) {
-
- class Defaults {
- queryTransform(resourceConfig, params) {
- return params;
- }
-
- deserialize(resourceConfig, data) {
- return data ? ('data' in data ? data.data : data) : data;
- }
-
- serialize(resourceConfig, data) {
- return data;
- }
-
- log() {
-
- }
-
- error() {
-
- }
- }
- let defaultsPrototype = Defaults.prototype;
-
- defaultsPrototype.basePath = '';
-
- defaultsPrototype.forceTrailingSlash = '';
-
- defaultsPrototype.httpConfig = {};
-
- class DSHttpAdapter {
- constructor(options) {
- this.defaults = new Defaults();
- if (console) {
- this.defaults.log = (a, b) => console[typeof console.info === 'function' ? 'info' : 'log'](a, b);
- }
- if (console) {
- this.defaults.error = (a, b) => console[typeof console.error === 'function' ? 'error' : 'log'](a, b);
- }
- deepMixIn(this.defaults, options);
- }
-
- getPath(method, resourceConfig, id, options) {
- let _this = this;
- options = options || {};
- let args = [
- options.basePath || _this.defaults.basePath || resourceConfig.basePath,
- resourceConfig.getEndpoint((isString(id) || isNumber(id) || method === 'create') ? id : null, options)
- ];
- if (method === 'find' || method === 'update' || method === 'destroy') {
- args.push(id);
- }
- return makePath.apply(DSUtils, args);
- }
-
- GET(url, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'get';
- }
- return this.HTTP(deepMixIn(config, {
- url
- }));
- }
-
- POST(url, attrs, config) {
- config = config || {};
- config = DSUtils.copy(config);
- if (!('method' in config)) {
- config.method = 'post';
- }
- return this.HTTP(deepMixIn(config, {
- url,
- data: attrs
- }));
- }
-
- PUT(url, attrs, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'put';
- }
- return this.HTTP(deepMixIn(config, {
- url,
- data: attrs || {}
- }));
- }
-
- DEL(url, config) {
- config = config || {};
- if (!('method' in config)) {
- config.method = 'delete';
- }
- return this.HTTP(deepMixIn(config, {
- url
- }));
- }
-
- find(resourceConfig, id, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.GET(
- _this.getPath('find', resourceConfig, id, options),
- options
- ).then(data => {
- let item = (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data);
- return !item ? JSData.DSUtils.Promise.reject(new Error('Not Found!')) : item;
- });
- }
-
- findAll(resourceConfig, params, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return _this.GET(
- _this.getPath('findAll', resourceConfig, params, options),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
-
- create(resourceConfig, attrs, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.POST(
- _this.getPath('create', resourceConfig, attrs, options),
- (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
-
- update(resourceConfig, id, attrs, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.PUT(
- _this.getPath('update', resourceConfig, id, options),
- (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
-
- updateAll(resourceConfig, attrs, params, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return this.PUT(
- _this.getPath('updateAll', resourceConfig, attrs, options),
- (options.serialize ? options.serialize : _this.defaults.serialize)(resourceConfig, attrs),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
-
- destroy(resourceConfig, id, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- options.params = _this.defaults.queryTransform(resourceConfig, options.params);
- return _this.DEL(
- _this.getPath('destroy', resourceConfig, id, options),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
-
- destroyAll(resourceConfig, params, options) {
- let _this = this;
- options = options ? copy(options) : {};
- options.suffix = options.suffix || resourceConfig.suffix;
- options.params = options.params || {};
- if (params) {
- params = _this.defaults.queryTransform(resourceConfig, params);
- deepMixIn(options.params, params);
- }
- return this.DEL(
- _this.getPath('destroyAll', resourceConfig, params, options),
- options
- ).then(data => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data));
- }
- }
-
- let dsHttpAdapterPrototype = DSHttpAdapter.prototype;
-
- class DSHttpAdapterProvider {
- constructor() {
- let _this = this;
- _this.defaults = {};
- _this.$get = ['$http', 'DS', '$q', ($http, DS, $q) => {
- dsHttpAdapterPrototype.HTTP = function (config) {
- let _this = this;
- let start = new Date();
- config = copy(config);
- config = deepMixIn(config, _this.defaults.httpConfig);
- if (_this.defaults.forceTrailingSlash && config.url[config.url.length - 1] !== '/') {
- config.url += '/';
- }
- config.method = config.method.toUpperCase();
- if (typeof config.data === 'object') {
- config.data = removeCircular(config.data);
- }
- let suffix = config.suffix || _this.defaults.suffix;
- if (suffix && config.url.substr(config.url.length - suffix.length) !== suffix) {
- config.url += suffix;
- }
-
- function logResponse(data) {
- let str = `${start.toUTCString()} - ${data.config.method.toUpperCase()} ${data.config.url} - ${data.status} ${(new Date().getTime() - start.getTime())}ms`;
- if (data.status >= 200 && data.status < 300) {
- if (_this.defaults.log) {
- _this.defaults.log(str, data);
- }
- return data;
- } else {
- if (_this.defaults.error) {
- _this.defaults.error(`FAILED: ${str}`, data);
- }
- return $q.reject(data);
- }
- }
-
- return $http(config).then(logResponse, logResponse);
- };
-
- let adapter = new DSHttpAdapter(_this.defaults);
- DS.registerAdapter('http', adapter, { 'default': true });
- return adapter;
- }];
- }
- }
- angular.module('js-data').provider('DSHttpAdapter', DSHttpAdapterProvider);
-}
-angular.module('js-data').run(['DS', 'DSHttpAdapter', (DS, DSHttpAdapter) => DS.registerAdapter('http', DSHttpAdapter, { 'default': true })]);
-
// return the module name
-export default 'js-data';
+module.exports = 'js-data';
+module.exports.name = 'js-data';
diff --git a/test/datastore/async_methods/create.test.js b/test/datastore/async_methods/create.test.js
index 0564ef3..8679fc2 100644
--- a/test/datastore/async_methods/create.test.js
+++ b/test/datastore/async_methods/create.test.js
@@ -177,7 +177,7 @@ describe('DS.create', function () {
$httpBackend.flush();
});
it('should find inverse links', function () {
- DS.inject('organization', {
+ var organization = DS.inject('organization', {
id: 77
});
@@ -189,15 +189,14 @@ describe('DS.create', function () {
DS.create('user', {
organizationId: 77,
id: 88
- }, { upsert: false, findBelongsTo: true }).then(function (user) {
- var organization = DS.link('organization', 77, ['user']);
+ }, { upsert: false }).then(function (user) {
assert.isArray(organization.users);
assert.equal(1, organization.users.length);
assert.isObject(user.organization);
assert.isTrue(user.organization === organization);
assert.isTrue(user === organization.users[0]);
}, function () {
- fail('Should not have succeeded!');
+ fail('Should not have failed!');
});
$httpBackend.flush();
diff --git a/test/datastore/async_methods/loadRelations.test.js b/test/datastore/async_methods/loadRelations.test.js
index 459cdd6..d6f2abb 100644
--- a/test/datastore/async_methods/loadRelations.test.js
+++ b/test/datastore/async_methods/loadRelations.test.js
@@ -12,7 +12,7 @@ describe('DS.loadRelations', function () {
$httpBackend.expectGET('http://test.angular-cache.com/profile?approvedBy=10&userId=10').respond(200, [profile15]);
$httpBackend.expectGET('http://test.angular-cache.com/organization/14?approvedBy=10').respond(200, organization14);
- DS.loadRelations('user', 10, ['comment', 'profile', 'organization'], { params: { approvedBy: 10 } }).then(function (user) {
+ DS.loadRelations('user', 10, ['comment', 'profile', 'organization'], { params: { approvedBy: 10 }, findStrictCache: true }).then(function (user) {
try {
assert.deepEqual(user.comments[0].id, DS.get('comment', user.comments[0].id).id);
assert.deepEqual(user.comments[0].user, DS.get('comment', user.comments[0].id).user);
@@ -26,7 +26,7 @@ describe('DS.loadRelations', function () {
DS.inject('comment', comment19);
$httpBackend.expectGET('http://test.angular-cache.com/user/20').respond(200, user20);
$httpBackend.expectGET('http://test.angular-cache.com/user/19').respond(200, user19);
- DS.loadRelations('comment', 19, ['user']).then(function (comment) {
+ DS.loadRelations('comment', 19, ['user'], { findStrictCache: true }).then(function (comment) {
try {
assert.isObject(comment.user);
assert.equal(comment.user.id, user20.id);
@@ -49,7 +49,9 @@ describe('DS.loadRelations', function () {
fail(err);
});
- $httpBackend.flush();
+ setTimeout(function () {
+ $httpBackend.flush();
+ }, 30);
});
it('should get an item from the server but not store it if cacheResponse is false', function () {
DS.inject('user', {
@@ -66,7 +68,7 @@ describe('DS.loadRelations', function () {
$httpBackend.expectGET('http://test.angular-cache.com/profile?userId=10').respond(200, [profile15]);
$httpBackend.expectGET('http://test.angular-cache.com/organization/14').respond(200, organization14);
- DS.loadRelations('user', 10, ['comment', 'profile', 'organization'], { cacheResponse: false }).then(function (user) {
+ DS.loadRelations('user', 10, ['comment', 'profile', 'organization'], { cacheResponse: false, findStrictCache: true }).then(function (user) {
assert.deepEqual(angular.toJson(user.comments), angular.toJson([
comment11,
comment12,
@@ -80,11 +82,13 @@ describe('DS.loadRelations', function () {
assert.isUndefined(DS.get('comment', 13));
assert.isUndefined(DS.get('organization', 14));
assert.isUndefined(DS.get('profile', 15));
- }, function () {
+ }).catch(function (e) {
fail('should not have failed!');
});
- $httpBackend.flush();
+ setTimeout(function () {
+ $httpBackend.flush();
+ }, 30);
});
it('should correctly propagate errors', function () {
DS.inject('user', {
@@ -117,7 +121,7 @@ describe('DS.loadRelations', function () {
$httpBackend.expectGET('http://test.angular-cache.com/organization/14/user').respond(200, [copy]);
- DS.loadRelations('organization', organization, ['user']).then(function (organization) {
+ DS.loadRelations('organization', organization, ['user'], { findStrictCache: true }).then(function (organization) {
assert.equal(organization.users[0].id, 10);
$httpBackend.expectGET('http://test.angular-cache.com/organization/14/user/10/comment').respond(200, [comment11, comment12]);