diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index baa91a3..0000000 --- a/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "bower_components" -} \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..ad84ef7 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing + +[Read the Contributing Guide](http://js-data.io/docs/contributing). + +## Support + +[Find out how to Get Support](http://js-data.io/docs/support). + +## Community + +[Explore the Community](http://js-data.io/docs/community). + +### Have write access? + +To cut a release: + +1. Checkout master +1. Bump version in `package.json` appropriately +1. Run `npm run release` +1. Update `CHANGELOG.md` appropriately +1. Commit and push changes, including the `dist/` folder +1. Make a GitHub release + - set tag name to version + - set release name to version + - set release body to changelog entry for the version + - attach the files in the `dist/` folder +1. `npm publish .` diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2ce62e8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,7 @@ +(delete this line) GitHub Issues are NOT for support questions. +(delete this line) GitHub Issues ARE for bug reports, feature requests, and other issues. +(delete this line) Find out how to Get Support here: http://js-data.io/docs/support. + + + +Thanks! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4c14bdc --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Fixes # (it's a good idea to open an issue first for discussion) + +- [ ] - `npm test` succeeds +- [ ] - Pull request has been squashed into 1 commit +- [ ] - I did NOT commit changes to `dist/` +- [ ] - Code coverage does not decrease (if any source code was changed) +- [ ] - Appropriate JSDoc comments were updated in source code (if applicable) +- [ ] - Approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) diff --git a/.gitignore b/.gitignore index c311dea..9fef4f8 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,11 @@ 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 +.js-data-http.js +.js-data-http/ \ No newline at end of file diff --git a/.jshintrc b/.jshintrc index e408dcf..c58b501 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,9 +1,9 @@ { "node": false, "browser": true, - "es5": true, "esnext": true, "bitwise": true, + "asi": true, "camelcase": true, "curly": true, "eqeqeq": true, diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..a1e3721 --- /dev/null +++ b/.mailmap @@ -0,0 +1,5 @@ +InternalFX Bryan +InternalFX Bryan Morris +Jason Dobry Jason Dobry +Kent C. Dodds Kent C. Dodds +Robert Porter Robert P \ No newline at end of file diff --git a/.npmignore b/.npmignore index 1160c35..d4155b8 100644 --- a/.npmignore +++ b/.npmignore @@ -8,3 +8,8 @@ bower_components/ karma* guide/ doc/ +webpack.config.js +circle.yml + +.js-data-http.js +.js-data-http/ \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +6 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3f10973..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - npm install -g bower - - bower install - - npm install -g grunt-cli -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start -script: - - grunt test - - grunt coveralls || true diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..072af3a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,24 @@ +# This is the official list of js-data-angular project authors. +# +# Names are formatted as: +# Name or Organization +# The email address is not required for organizations. +Andre Deutmeyer +Artemy Tregubenko +Asaf Katz +Chase Noel +Clark Pan +David Tang +Gabo Esquivel +Jason Aden +Jason Dobry +Kent C. Dodds +Loìˆc Mahieu +Nikolay +Peter Dave Hello +Shai Reznik +thorn0 +Tim Chen +Timothy Krell +vollnhals +Wes Cruver diff --git a/CHANGELOG.md b/CHANGELOG.md index 12a9e7a..e695d82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,80 @@ +##### 3.2.1 - 18 March 2016 + +###### Backwards compatible bug fixes +- Upgraded to js-data-http 2.2.2 + +##### 3.2.0 - 17 March 2016 + +###### Backwards compatible bug fixes +- #347 - BindOne recomputing computed properties +- #353 - jshint or standard? +- #356 - Multiple parents isn't working + +##### 3.1.1 - 20 September 2015 + +Stable Version 3.1.0 + +###### Backwards compatible API changes +- #335 - Calling $q.reject in http interceptor doesn't resolve to calling reject handler in DS.findAll.then + +###### Other +- Built with js-data-http 2.1.1 +- Upgraded dependencies + +##### 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 +- #327 - `bindOne` now updates computed properties on change + +##### 2.3.0 - 15 April 2015 + +###### Backwards compatible API changes +- #328 - Add support for `js-data-sql` adapter + +###### Backwards compatible bug fixes +- #328 - Fixed adapter registration + +##### 2.2.3 - 08 March 2015 + +###### Other +- Converted to ES6, using Babel.js to transpile to ES5. + +##### 2.2.2 - 04 March 2015 + +###### Backwards compatible bug fixes +- #312 - UMDifying js-data-angular +- #313 - DSHttpAdapter#find/create/update/destroy do not call queryTransform + +##### 2.2.1 - 25 February 2015 + +###### Backwards compatible bug fixes +- #311 - Does not properly throw error in find() (like other adapters) when the item cannot be found + +##### 2.2.0 - 24 February 2015 + +###### Backwards compatible API changes +- Added `suffix` option + ##### 2.1.0 - 04 February 2015 Now requiring >= js-data 1.1.0 in order to use removeCircular to safely safe cyclic objects diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a086c59..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,12 +0,0 @@ -# Contributing Guide - -First, feel free to contact me with questions. [Mailing List](https://groups.google.com/forum/?fromgroups#!forum/js-data-angular). [Issues](https://github.com/js-data/js-data-angular/issues). - -1. Contribute to the issue that is the reason you'll be developing in the first place -1. Fork js-data-angular -1. `git clone https://github.com//js-data-angular.git` -1. `cd js-data-angular; npm install; bower install;` -1. `grunt go` (builds and starts a watch) -1. (in another terminal) `grunt karma:dev` (runs the tests) -1. Write your code, including relevant documentation and tests -1. Submit a PR and we'll review diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 2d0e1d8..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * js-data-angular - * http://github.com/js-data/js-data-angular - * - * Copyright (c) 2014 Jason Dobry - * Licensed under the MIT license. - */ -module.exports = function (grunt) { - 'use strict'; - - require('jit-grunt')(grunt, { - coveralls: 'grunt-karma-coveralls' - }); - require('time-grunt')(grunt); - - var pkg = grunt.file.readJSON('package.json'); - - // Project configuration. - grunt.initConfig({ - pkg: pkg, - clean: { - dist: ['dist/'] - }, - jshint: { - all: ['Gruntfile.js', 'src/**/*.js'], - jshintrc: '.jshintrc' - }, - watch: { - dist: { - files: ['src/**/*.js'], - tasks: ['build'] - } - }, - uglify: { - main: { - options: { - banner: '/**\n' + - '* @author Jason Dobry \n' + - '* @file js-data-angular.min.js\n' + - '* @version <%= pkg.version %> - Homepage \n' + - '* @copyright (c) 2014 Jason Dobry \n' + - '* @license MIT \n' + - '*\n' + - '* @overview Angular wrapper for js-data.\n' + - '*/\n' - }, - files: { - 'dist/js-data-angular.min.js': ['dist/js-data-angular.js'] - } - }, - scripts: { - files: { - 'doc/resources/js/libs.min.js': ['doc/resources/js/libs.js'] - } - } - }, - browserify: { - options: { - external: ['js-data'] - }, - dist: { - files: { - 'dist/js-data-angular.js': ['src/index.js'] - } - } - }, - karma: { - options: { - configFile: './karma.conf.js' - }, - dev: { - browsers: ['Chrome'], - autoWatch: true, - singleRun: false, - reporters: ['spec'], - preprocessors: {} - }, - min: { - browsers: ['Chrome', 'Firefox', 'PhantomJS'], - options: { - 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', - 'dist/js-data-angular.min.js', - 'karma.start.js', - 'test/**/*.js' - ] - } - } - }, - coveralls: { - options: { - coverage_dir: 'coverage' - } - } - }); - - grunt.registerTask('version', function (filePath) { - var file = grunt.file.read(filePath); - - file = file.replace(/<%= pkg\.version %>/gi, pkg.version); - - grunt.file.write(filePath, file); - }); - - grunt.registerTask('banner', function () { - var file = grunt.file.read('dist/js-data-angular.js'); - - var banner = '/**\n' + - '* @author Jason Dobry \n' + - '* @file js-data-angular.js\n' + - '* @version ' + pkg.version + ' - Homepage \n' + - '* @copyright (c) 2014 Jason Dobry \n' + - '* @license MIT \n' + - '*\n' + - '* @overview Angular wrapper for js-data.js.\n' + - '*/\n'; - - file = banner + file; - - grunt.file.write('dist/js-data-angular.js', file); - }); - - grunt.registerTask('build', [ - 'clean', - 'jshint', - 'browserify', - 'banner', - 'uglify:main' - ]); - grunt.registerTask('go', ['build', 'watch:dist']); - grunt.registerTask('default', ['build']); - grunt.registerTask('test', ['build', 'karma:min']); -}; diff --git a/LICENSE b/LICENSE index 460f8ee..21fc5e4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2015 Jason Dobry +Copyright (c) 2014-2016 js-data-angular project authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/README.md b/README.md index 18c7fe3..c5984d1 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ js-data logo -## js-data-angular [![Bower version](https://badge.fury.io/bo/js-data-angular.png)](http://badge.fury.io/bo/js-data-angular) [![NPM version](https://badge.fury.io/js/js-data-angular.png)](http://badge.fury.io/js/js-data-angular) +## js-data-angular [![bower version](https://img.shields.io/bower/v/js-data-angular.svg?style=flat-square)](https://www.npmjs.org/package/js-data-angular) [![npm version](https://img.shields.io/npm/v/js-data-angular.svg?style=flat-square)](https://www.npmjs.org/package/js-data-angular) [![Circle CI](https://img.shields.io/circleci/project/js-data/js-data-angular/master.svg?style=flat-square)](https://circleci.com/gh/js-data/js-data-angular/tree/master) [![npm downloads](https://img.shields.io/npm/dm/js-data-angular.svg?style=flat-square)](https://www.npmjs.org/package/js-data-angular) [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/js-data/js-data-angular/blob/master/LICENSE) 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 +### Guides - [Angular + JSData (js-data-angular)](http://www.js-data.io/docs/js-data-angular) - [Getting Started with js-data](http://www.js-data.io/docs/home) - [Resources/Models](http://www.js-data.io/docs/resources) - [Working with the Data Store](http://www.js-data.io/docs/working-with-the-data-store) - [Adapters](http://www.js-data.io/docs/working-with-adapters) +- [Query Syntax](http://www.js-data.io/docs/query-syntax) - [Model Lifecycle](http://www.js-data.io/docs/model-lifecycle) - [Custom Instance Behavior](http://www.js-data.io/docs/custom-instance-behavior) - [Computed Properties](http://www.js-data.io/docs/computed-properties) - [Relations](http://www.js-data.io/docs/relations) - [Schemata & Validation](http://www.js-data.io/docs/schemata--validation) +- [JSData on the Server](http://www.js-data.io/docs/jsdata-on-the-server) - [FAQ](http://www.js-data.io/docs/faq) -## Js-data-angular API Documentation +### Js-data-angular API Documentation - [js-data-angular](http://www.js-data.io/docs/js-data-angular) - [DS](http://www.js-data.io/docs/ds) - [js-data-schema](http://www.js-data.io/docs/js-data-schema) @@ -30,19 +32,22 @@ Js-data-angular is Angular-data 2.0, with [js-data](http://www.js-data.io) as th - [DSFirebaseAdapter](http://www.js-data.io/docs/dsfirebaseadapter) - [DSRedisAdapter](http://www.js-data.io/docs/dsredisadapter) - [DSRethinkDBAdapter](http://www.js-data.io/docs/dsrethinkdbadapter) +- [DSMongoDBAdapter](http://www.js-data.io/docs/dsmongodbadapter) +- [DSSqlAdapter](http://www.js-data.io/docs/dssqladapter) -## Project Status +### Project Status -| Branch | Master | -| ------ | ------ | -| Bower | [![Bower version](https://badge.fury.io/bo/js-data-angular.png)](http://badge.fury.io/bo/js-data-angular) | -| NPM | [![NPM version](https://badge.fury.io/js/js-data-angular.png)](http://badge.fury.io/js/js-data-angular) | -| Build Status | [![Build Status](https://travis-ci.org/js-data/js-data-angular.png?branch=master)](https://travis-ci.org/js-data/js-data-angular) | -| Code Climate | [![Code Climate](https://codeclimate.com/github/js-data/js-data-angular.png)](https://codeclimate.com/github/js-data/js-data-angular) | -| Dependency Status | [![Dependency Status](https://gemnasium.com/js-data/js-data-angular.png)](https://gemnasium.com/js-data/js-data-angular) | -| Coverage | [![Coverage Status](https://coveralls.io/repos/js-data/js-data-angular/badge.png?branch=master)](https://coveralls.io/r/js-data/js-data-angular?branch=master) | +__Latest Release:__ [![Latest Release](https://img.shields.io/github/release/js-data/js-data-angular.svg?style=flat-square)](https://github.com/js-data/js-data-angular/releases) -## Quick Start +__Status:__ + +[![Dependency Status](https://img.shields.io/gemnasium/js-data/js-data-angular.svg?style=flat-square)](https://gemnasium.com/js-data/js-data-angular) [![Coverage Status](https://img.shields.io/coveralls/js-data/js-data-angular/master.svg?style=flat-square)](https://coveralls.io/r/js-data/js-data-angular?branch=master) [![Codacity](https://img.shields.io/codacy/e7690b906dfa471ebcc8b2bdc52e9662.svg?style=flat-square)](https://www.codacy.com/public/jasondobry/js-data-angular/dashboard) + +__Supported Platforms:__ + +[![browsers](https://img.shields.io/badge/Browser-Chrome%2CFirefox%2CSafari%2COpera%2CIE%209%2B%2CiOS%20Safari%207.1%2B%2CAndroid%20Browser%202.3%2B-green.svg?style=flat-square)](https://github.com/js-data/js-data) + +### Quick Start `bower install --save js-data js-data-angular` or `npm install --save js-data js-data-angular`. Load `js-data-angular.js` after `js-data.js`. @@ -90,29 +95,43 @@ app.controller('postCtrl', function ($scope, $routeParams, Post, Comment) { }); ``` -## Changelog +### Changelog [CHANGELOG.md](https://github.com/js-data/js-data-angular/blob/master/CHANGELOG.md) -## Community +### Community +- [Slack Room](http://slack.js-data.io) - 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. - [Contributing Guide](https://github.com/js-data/js-data-angular/blob/master/CONTRIBUTING.md) -## Contributing +### Contributing + +First, support is handled via the [Gitter Channel](https://gitter.im/js-data/js-data) and the [Mailing List](https://groups.io/org/groupsio/jsdata). Ask your questions there. + +When submitting issues on GitHub, please include as much detail as possible to make debugging quick and easy. + +- good - Your versions of Angular, js-data, js-data-angular, etc., relevant console logs/error, code examples that revealed the issue +- better - A [plnkr](http://plnkr.co/), [fiddle](http://jsfiddle.net/), or [bin](http://jsbin.com/?html,output) that demonstrates the issue +- best - A Pull Request that fixes the issue, including test coverage for the issue and the fix + +[Github Issues](https://github.com/js-data/js-data-angular/issues). -First, feel free to contact me with questions. [Mailing List](https://groups.io/org/groupsio/jsdata). [Issues](https://github.com/js-data/js-data-angular/issues). +#### Submitting Pull Requests -1. Contribute to the issue that is the reason you'll be developing in the first place +1. Contribute to the issue/discussion that is the reason you'll be developing in the first place 1. Fork js-data-angular -1. `git clone https://github.com//js-data-angular.git` +1. `git clone git@github.com:/js-data-angular.git` 1. `cd js-data-angular; npm install; bower install;` -1. `grunt go` (builds and starts a watch) -1. (in another terminal) `grunt karma:dev` (runs the tests) 1. Write your code, including relevant documentation and tests -1. Submit a PR and we'll review +1. Run `grunt test` (build and test) +1. Your code will be linted and checked for formatting, the tests will be run +1. The `dist/` folder & files will be generated, do NOT commit `dist/*`! They will be committed when a release is cut. +1. Submit your PR and we'll review! +1. Thanks! -## License +### License The MIT License (MIT) diff --git a/bower.json b/bower.json index a1f3e2a..529ee44 100644 --- a/bower.json +++ b/bower.json @@ -1,8 +1,8 @@ { - "author": "Jason Dobry", + "author": "js-data-angular project authors", "name": "js-data-angular", "description": "Angular wrapper for js-data (originally angular-data).", - "homepage": "http://www.js-data.io/docs/js-data-angular", + "homepage": "https://github.com/js-data/js-data-angular", "repository": { "type": "git", "url": "https://github.com/js-data/js-data-angular.git" @@ -13,22 +13,18 @@ ".*", "*.iml", "src/", - "Gruntfile.js", "node_modules/", + "doc", + "coverage", + "test", "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.1.0", - "angular": ">=1.0.3" + "js-data": ">=2.0.0 <3", + "angular": ">=1.1.0" } } 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/circle.yml b/circle.yml index 74b0946..7ffcd64 100644 --- a/circle.yml +++ b/circle.yml @@ -1,3 +1,7 @@ +general: + branches: + ignore: + - gh-pages # list of branches to ignore dependencies: pre: - bower install diff --git a/dist/js-data-angular.js b/dist/js-data-angular.js index 0c24d93..b62c48d 100644 --- a/dist/js-data-angular.js +++ b/dist/js-data-angular.js @@ -1,502 +1,750 @@ -/** -* @author Jason Dobry -* @file js-data-angular.js -* @version 2.1.0 - Homepage -* @copyright (c) 2014 Jason Dobry +/*! +* js-data-angular +* @version 3.2.4 - Homepage +* @copyright (c) 2014-2016 js-data-angular project authors * @license MIT * -* @overview Angular wrapper for js-data.js. +* @overview Angular wrapper for js-data. */ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 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').run(['DS', 'DSHttpAdapter', function (DS, DSHttpAdapter) { - DS.registerAdapter('http', DSHttpAdapter, { default: true }); - }]); - } - -})(window, window.angular); - -},{"js-data":"js-data"}]},{},[1]); +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + 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"], function webpackLoadOptionalExternalModuleAmd(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__) { + return factory(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__, root["axios"]); + }); + else if(typeof exports === 'object') + exports["jsDataAngularModuleName"] = factory(require("js-data"), require("angular"), (function webpackLoadOptionalExternalModule() { try { return require("axios"); } catch(e) {} }())); + else + root["jsDataAngularModuleName"] = factory(root["JSData"], root["angular"], root["axios"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_3__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + /* jshint loopfunc:true */ + var JSData = __webpack_require__(1); + var DSHttpAdapter = __webpack_require__(2); + var angular = __webpack_require__(4); + + var DSUtils = JSData.DSUtils, + DSErrors = JSData.DSErrors; + var get = DSUtils.get, + isString = DSUtils.isString, + isNumber = DSUtils.isNumber, + isObject = DSUtils.isObject, + set = DSUtils.set, + resolveId = DSUtils.resolveId; + + + var adapters = [{ + 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' + }]; + + var functionsToWrap = ['compute', 'digest', 'eject', 'inject']; + + function registerAdapter(adapter) { + var Adapter = void 0; + + try { + Adapter = __webpack_require__(5)(adapter.project); + } catch (e) {} + + if (!Adapter) { + Adapter = window[adapter.class]; + } + + if (Adapter) { + adapter.loaded = true; + angular.module('js-data').provider(adapter.class, function () { + var _this = this; + _this.defaults = {}; + _this.$get = [function () { + return new Adapter(_this.defaults); + }]; + }); + } + } + + 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); + + var _this = this; + var deps = []; + + for (var i = 0; i < adapters.length; i++) { + if (adapters[i].loaded) { + deps.push(adapters[i].class); + } + } + + _this.defaults = {}; + + JSData.DS.prototype.bindAll = function (resourceName, params, scope, expr, cb) { + var _this = this; + + params = params || {}; + + if (!_this.definitions[resourceName]) { + throw new DSErrors.NER(resourceName); + } else if (!isObject(params)) { + throw new DSErrors.IA('"params" must be an object!'); + } else if (!isObject(scope)) { + throw new DSErrors.IA('"scope" must be an object!'); + } else if (!isString(expr)) { + throw new DSErrors.IA('"expr" must be a string!'); + } + + var idAttribute = _this.definitions[resourceName].idAttribute; + + try { + return scope.$watch(function () { + return _this.lastModified(resourceName); + }, function () { + var items = _this.filter(resourceName, params); + if (items && items.length) { + angular.forEach(items, function (item) { + _this.compute(resourceName, get(item, idAttribute)); + }); + } + set(scope, expr, items); + if (cb) { + cb(null, items); + } + }); + } catch (err) { + if (cb) { + cb(err); + } else { + throw err; + } + } + }; + + JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) { + var _this = this; + + id = resolveId(_this.definitions[resourceName], id); + if (!_this.definitions[resourceName]) { + throw new DSErrors.NER(resourceName); + } else if (!isString(id) && !isNumber(id)) { + throw new DSErrors.IA('"id" must be a string or a number!'); + } else if (!isObject(scope)) { + throw new DSErrors.IA('"scope" must be an object!'); + } else if (!isString(expr)) { + throw new DSErrors.IA('"expr" must be a string!'); + } + + try { + return scope.$watch(function () { + return _this.lastModified(resourceName, id); + }, function () { + var item = _this.get(resourceName, id); + if (item) { + _this.compute(resourceName, id); + } + set(scope, expr, item); + if (cb) { + cb(null, item); + } + }); + } catch (err) { + if (cb) { + cb(err); + } else { + throw err; + } + } + }; + + function load() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var $rootScope = args[args.length - 2]; + var $q = args[args.length - 1]; + var store = new JSData.DS(_this.defaults); + var originals = {}; + + function QPromise(executor) { + var deferred = $q.defer(); + + try { + executor(angular.bind(deferred, deferred.resolve), angular.bind(deferred, deferred.reject)); + } catch (err) { + deferred.reject(err); + } + + return deferred.promise; + } + + QPromise.all = $q.all; + QPromise.when = $q.when; + QPromise.reject = $q.reject; + + DSUtils.Promise = QPromise; + + // Register any adapters that have been loaded + if (args.length) { + for (var i = 0; i < args.length; i++) { + for (var j = 0; j < adapters.length; j++) { + if (adapters[j].loaded && !adapters[j].registered) { + adapters[j].registered = true; + store.registerAdapter(adapters[j].name, args[i]); + break; + } + } + } + } + + // Wrap certain sync functions with $apply + + var _loop = function _loop() { + var name = functionsToWrap[k]; + originals[name] = store[name]; + store[name] = function () { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + if (!$rootScope.$$phase) { + return $rootScope.$apply(function () { + return originals[name].apply(store, args); + }); + } + return originals[name].apply(store, args); + }; + }; + + for (var k = 0; k < functionsToWrap.length; k++) { + _loop(); + } + + // Hook into the digest loop + if (typeof Object.observe !== 'function' || typeof Array.observe !== 'function') { + $rootScope.$watch(function () { + return store.observe.Platform.performMicrotaskCheckpoint(); + }); + } + + return store; + } + + deps.push('$rootScope'); + deps.push('$q'); + deps.push(load); + + _this.$get = deps; + }; + + 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]); + } + + // return the module name + module.exports = 'js-data'; + try { + module.exports.name = 'js-data'; + } catch (e) {} + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_1__; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + 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 _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + 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__(3); + } catch (e) {} + + var DSUtils = JSData.DSUtils; + var deepMixIn = DSUtils.deepMixIn, + removeCircular = DSUtils.removeCircular, + copy = DSUtils.copy, + makePath = DSUtils.makePath, + isString = DSUtils.isString, + isNumber = DSUtils.isNumber; + + + function isUndefined(value) { + return value === undefined; + } + + 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 = {}; + + defaultsPrototype.verbsUseBasePath = false; + + var DSHttpAdapter = function () { + function DSHttpAdapter(options) { + _classCallCheck(this, DSHttpAdapter); + + options || (options = {}); + 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) { + options || (options = {}); + options.params = isUndefined(options.params) ? {} : options.params; + + var endpoint = options.hasOwnProperty('endpoint') ? options.endpoint : resourceConfig.endpoint; + var parents = resourceConfig.parents || (resourceConfig.parent ? _defineProperty({}, resourceConfig.parent, { + key: resourceConfig.parentKey, + field: resourceConfig.parentField + }) : {}); + + DSUtils.forOwn(parents, function (parent, parentName) { + var item = void 0; + var parentKey = parent.key; + var parentField = parent.field; + var parentDef = resourceConfig.getResource(parentName); + var parentId = options.params[parentKey]; + + if (parentId === false || !parentKey || !parentDef) { + if (parentId === false) { + delete options.params[parentKey]; + } + } 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) { + delete options.endpoint; + var _options = {}; + DSUtils.forOwn(options, function (value, key) { + _options[key] = value; + }); + endpoint = DSUtils.makePath(this.getEndpoint(parentDef, parentId, DSUtils._(parentDef, _options)), parentId, endpoint); + } + } + }, this); + + return endpoint; + } + }, { + key: 'getPath', + value: function getPath(method, resourceConfig, id, options) { + var _this = this; + options || (options = {}); + if (isString(options.urlPath)) { + return makePath.apply(DSUtils, [options.basePath || resourceConfig.basePath || _this.defaults.basePath, options.urlPath]); + } else { + var args = [options.basePath || resourceConfig.basePath || _this.defaults.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(); + + // blacklist `data` as it can be large and will take a lot of time to copy + var payload = config.data; + var cache = config.cache; + var timeout = config.timeout; + var params = config.params; + config = copy(config, null, null, null, ['data', 'cache', 'timeout', 'params']); // params could have data, cache, timeout + config.params = copy(params); + config = deepMixIn(config, _this.defaults.httpConfig); + config.data = payload; + config.cache = cache; + config.timeout = timeout; + if (!('verbsUseBasePath' in config)) { + config.verbsUseBasePath = _this.defaults.verbsUseBasePath; + } + if (!config.urlOverride && config.verbsUseBasePath) { + config.url = makePath(config.basePath || _this.defaults.basePath, config.url); + } + if (_this.defaults.forceTrailingSlash && config.url[config.url.length - 1] !== '/' && !config.urlOverride) { + config.url += '/'; + } + if (_typeof(config.data) === 'object') { + config.data = removeCircular(config.data); + } + config.method = config.method.toUpperCase(); + var suffix = isUndefined(config.suffix) ? _this.defaults.suffix : config.suffix; + if (suffix && config.url.substr(config.url.length - suffix.length) !== suffix && !config.urlOverride) { + config.url += suffix; + } + + // logs the HTTP response + function logResponse(data, isRejection) { + data = data || {}; + // examine the data object + if (data instanceof Error) { + // log the Error object + _this.defaults.error('FAILED: ' + (data.message || 'Unknown Error'), data); + return DSUtils.Promise.reject(data); + } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object') { + var str = start.toUTCString() + ' - ' + config.method + ' ' + config.url + ' - ' + data.status + ' ' + (new Date().getTime() - start.getTime()) + 'ms'; + + if (data.status >= 200 && data.status < 300 && !isRejection) { + 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); + } + } else { + // unknown type for 'data' that is not an Object or Error + _this.defaults.error('FAILED', 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, function (data) { + return logResponse(data, true); + }); + } + }, { + key: 'GET', + value: function GET(url, config) { + config = config || {}; + config.method = config.method || 'get'; + config.urlOverride = !!config.url; + config.url = config.url || url; + return this.HTTP(config); + } + }, { + key: 'POST', + value: function POST(url, attrs, config) { + config = config || {}; + config.method = config.method || 'post'; + config.urlOverride = !!config.url; + config.url = config.url || url; + config.data = config.data || attrs; + return this.HTTP(config); + } + }, { + key: 'PUT', + value: function PUT(url, attrs, config) { + config = config || {}; + config.method = config.method || 'put'; + config.urlOverride = !!config.url; + config.url = config.url || url; + config.data = config.data || attrs; + return this.HTTP(config); + } + }, { + key: 'DEL', + value: function DEL(url, config) { + config = config || {}; + config.method = config.method || 'delete'; + config.urlOverride = !!config.url; + config.url = config.url || url; + return this.HTTP(config); + } + }, { + key: 'find', + value: function find(resourceConfig, id, options) { + var _this = this; + options || (options = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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 = {}); + options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix; + options.params = isUndefined(options.params) ? {} : copy(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; + }(); + + DSHttpAdapter.version = { + full: '3.2.4', + major: parseInt('3', 10), + minor: parseInt('2', 10), + patch: parseInt('4', 10), + alpha: true ? 'false' : false, + beta: true ? 'false' : false + }; + + module.exports = DSHttpAdapter; + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + if(typeof __WEBPACK_EXTERNAL_MODULE_3__ === 'undefined') {var e = new Error("Cannot find module \"axios\""); e.code = 'MODULE_NOT_FOUND'; throw e;} + module.exports = __WEBPACK_EXTERNAL_MODULE_3__; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_4__; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + var map = {}; + function webpackContext(req) { + return __webpack_require__(webpackContextResolve(req)); + }; + function webpackContextResolve(req) { + return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }()); + }; + webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); + }; + webpackContext.resolve = webpackContextResolve; + module.exports = webpackContext; + webpackContext.id = 5; + + +/***/ } +/******/ ]) +}); +; +//# sourceMappingURL=js-data-angular.js.map \ No newline at end of file diff --git a/dist/js-data-angular.js.map b/dist/js-data-angular.js.map new file mode 100644 index 0000000..6425c65 --- /dev/null +++ b/dist/js-data-angular.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 1c3c52fb1c99b2166362","webpack:///./src/index.js","webpack:///external {\"amd\":\"js-data\",\"commonjs\":\"js-data\",\"commonjs2\":\"js-data\",\"root\":\"JSData\"}","webpack:///./.js-data-http.js","webpack:///external \"axios\"","webpack:///external \"angular\"","webpack:///./src ^\\.\\/.*$"],"names":["JSData","require","DSHttpAdapter","angular","DSUtils","DSErrors","get","isString","isNumber","isObject","set","resolveId","adapters","project","name","functionsToWrap","registerAdapter","adapter","Adapter","e","window","class","loaded","module","provider","_this","defaults","$get","DSHttpAdapterProvider","$http","DS","http","DSProvider","deps","i","length","push","prototype","bindAll","resourceName","params","scope","expr","cb","definitions","NER","IA","idAttribute","$watch","lastModified","items","filter","forEach","item","compute","err","bindOne","id","load","args","$rootScope","$q","store","originals","QPromise","executor","deferred","defer","bind","resolve","reject","promise","all","when","Promise","j","registered","k","$$phase","$apply","apply","Object","observe","Array","Platform","performMicrotaskCheckpoint","value","version","run","exports","axios","deepMixIn","removeCircular","copy","makePath","isUndefined","undefined","Defaults","resourceConfig","data","defaultsPrototype","basePath","forceTrailingSlash","httpConfig","verbsUseBasePath","options","console","log","a","b","info","error","endpoint","hasOwnProperty","parents","parent","key","parentKey","field","parentField","forOwn","parentName","parentDef","getResource","parentId","_sn","_o","_options","getEndpoint","_","method","urlPath","config","start","Date","payload","cache","timeout","urlOverride","url","toUpperCase","suffix","substr","logResponse","isRejection","Error","message","str","toUTCString","status","getTime","then","HTTP","attrs","queryTransform","GET","getPath","deserialize","POST","serialize","PUT","DEL","full","major","parseInt","minor","patch","alpha","beta"],"mappings":"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","file":"./dist/js-data-angular.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"js-data\"), require(\"angular\"), (function webpackLoadOptionalExternalModule() { try { return require(\"axios\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"js-data\", \"angular\"], function webpackLoadOptionalExternalModuleAmd(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__) {\n\t\t\treturn factory(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__, root[\"axios\"]);\n\t\t});\n\telse if(typeof exports === 'object')\n\t\texports[\"jsDataAngularModuleName\"] = factory(require(\"js-data\"), require(\"angular\"), (function webpackLoadOptionalExternalModule() { try { return require(\"axios\"); } catch(e) {} }()));\n\telse\n\t\troot[\"jsDataAngularModuleName\"] = factory(root[\"JSData\"], root[\"angular\"], root[\"axios\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_3__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 1c3c52fb1c99b2166362\n **/","/* jshint loopfunc:true */\nlet JSData = require('js-data')\nlet DSHttpAdapter = require('../.js-data-http.js')\nlet angular = require('angular')\n\nlet { DSUtils, DSErrors } = JSData\nlet { get, isString, isNumber, isObject, set, resolveId } = DSUtils\n\nlet adapters = [\n {\n project: 'js-data-localstorage',\n name: 'localstorage',\n 'class': 'DSLocalStorageAdapter'\n },\n {\n project: 'js-data-localforage',\n name: 'localforage',\n 'class': 'DSLocalForageAdapter'\n },\n {\n project: 'js-data-firebase',\n name: 'firebase',\n 'class': 'DSFirebaseAdapter'\n },\n {\n project: 'js-data-sql',\n name: 'sql',\n 'class': 'DSSqlAdapter'\n }\n]\n\nlet functionsToWrap = [\n 'compute',\n 'digest',\n 'eject',\n 'inject'\n]\n\nfunction registerAdapter (adapter) {\n let Adapter\n\n try {\n Adapter = require(adapter.project)\n } catch (e) {}\n\n if (!Adapter) {\n Adapter = window[adapter.class]\n }\n\n if (Adapter) {\n adapter.loaded = true\n angular.module('js-data').provider(adapter.class, function () {\n let _this = this\n _this.defaults = {}\n _this.$get = [() => new Adapter(_this.defaults)]\n })\n }\n}\n\nclass DSHttpAdapterProvider {\n constructor () {\n let defaults = {}\n this.defaults = defaults\n\n this.$get = ['$http', 'DS', ($http, DS) => {\n defaults.http = defaults.http || $http\n let adapter = new DSHttpAdapter(defaults)\n DS.registerAdapter('http', adapter, { 'default': true })\n return adapter\n }]\n }\n}\n\nclass DSProvider {\n constructor () {\n let _this = this\n let deps = []\n\n for (var i = 0; i < adapters.length; i++) {\n if (adapters[i].loaded) {\n deps.push(adapters[i].class)\n }\n }\n\n _this.defaults = {}\n\n JSData.DS.prototype.bindAll = function (resourceName, params, scope, expr, cb) {\n let _this = this\n\n params = params || {}\n\n if (!_this.definitions[resourceName]) {\n throw new DSErrors.NER(resourceName)\n } else if (!isObject(params)) {\n throw new DSErrors.IA('\"params\" must be an object!')\n } else if (!isObject(scope)) {\n throw new DSErrors.IA('\"scope\" must be an object!')\n } else if (!isString(expr)) {\n throw new DSErrors.IA('\"expr\" must be a string!')\n }\n\n let idAttribute = _this.definitions[resourceName].idAttribute\n\n try {\n return scope.$watch(() => _this.lastModified(resourceName), () => {\n let items = _this.filter(resourceName, params)\n if (items && items.length) {\n angular.forEach(items, (item) => {\n _this.compute(resourceName, get(item, idAttribute))\n })\n }\n set(scope, expr, items)\n if (cb) {\n cb(null, items)\n }\n })\n } catch (err) {\n if (cb) {\n cb(err)\n } else {\n throw err\n }\n }\n }\n\n JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) {\n let _this = this\n\n id = resolveId(_this.definitions[resourceName], id)\n if (!_this.definitions[resourceName]) {\n throw new DSErrors.NER(resourceName)\n } else if (!isString(id) && !isNumber(id)) {\n throw new DSErrors.IA('\"id\" must be a string or a number!')\n } else if (!isObject(scope)) {\n throw new DSErrors.IA('\"scope\" must be an object!')\n } else if (!isString(expr)) {\n throw new DSErrors.IA('\"expr\" must be a string!')\n }\n\n try {\n return scope.$watch(() => _this.lastModified(resourceName, id), () => {\n let item = _this.get(resourceName, id)\n if (item) {\n _this.compute(resourceName, id)\n }\n set(scope, expr, item)\n if (cb) {\n cb(null, item)\n }\n })\n } catch (err) {\n if (cb) {\n cb(err)\n } else {\n throw err\n }\n }\n }\n\n function load (...args) {\n let $rootScope = args[args.length - 2]\n let $q = args[args.length - 1]\n let store = new JSData.DS(_this.defaults)\n let originals = {}\n\n function QPromise (executor) {\n let deferred = $q.defer()\n\n try {\n executor(\n angular.bind(deferred, deferred.resolve),\n angular.bind(deferred, deferred.reject)\n )\n } catch (err) {\n deferred.reject(err)\n }\n\n return deferred.promise\n }\n\n QPromise.all = $q.all\n QPromise.when = $q.when\n QPromise.reject = $q.reject\n\n DSUtils.Promise = QPromise\n\n // Register any adapters that have been loaded\n if (args.length) {\n for (var i = 0; i < args.length; i++) {\n for (var j = 0; j < adapters.length; j++) {\n if (adapters[j].loaded && !adapters[j].registered) {\n adapters[j].registered = true\n store.registerAdapter(adapters[j].name, args[i])\n break\n }\n }\n }\n }\n\n // Wrap certain sync functions with $apply\n for (var k = 0; k < functionsToWrap.length; k++) {\n let name = functionsToWrap[k]\n originals[name] = store[name]\n store[name] = (...args) => {\n if (!$rootScope.$$phase) {\n return $rootScope.$apply(() => originals[name].apply(store, args))\n }\n return originals[name].apply(store, args)\n }\n }\n\n // Hook into the digest loop\n if (typeof Object.observe !== 'function' || typeof Array.observe !== 'function') {\n $rootScope.$watch(() => store.observe.Platform.performMicrotaskCheckpoint())\n }\n\n return store\n }\n\n deps.push('$rootScope')\n deps.push('$q')\n deps.push(load)\n\n _this.$get = deps\n }\n}\nangular.module('js-data', ['ng'])\n .value('DSUtils', DSUtils)\n .value('DSErrors', DSErrors)\n .value('DSVersion', JSData.version)\n .provider('DS', DSProvider)\n .provider('DSHttpAdapter', DSHttpAdapterProvider)\n .run(['DS', 'DSHttpAdapter', (DS, DSHttpAdapter) => {\n DS.registerAdapter('http', DSHttpAdapter, { 'default': true })\n }])\n\nfor (var i = 0; i < adapters.length; i++) {\n registerAdapter(adapters[i])\n}\n\n// return the module name\nmodule.exports = 'js-data'\ntry {\n module.exports.name = 'js-data'\n} catch (e) {}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"amd\":\"js-data\",\"commonjs\":\"js-data\",\"commonjs2\":\"js-data\",\"root\":\"JSData\"}\n ** module id = 1\n ** module chunks = 0\n **/","let JSData = require('js-data')\nlet axios = null\n\ntry {\n axios = require('axios')\n} catch (e) {}\n\nlet { DSUtils } = JSData\nlet { deepMixIn, removeCircular, copy, makePath, isString, isNumber } = DSUtils\n\nfunction isUndefined (value) {\n return value === undefined\n}\n\nclass Defaults {\n queryTransform (resourceConfig, params) {\n return params\n }\n\n deserialize (resourceConfig, data) {\n return data ? ('data' in data ? data.data : data) : data\n }\n\n serialize (resourceConfig, data) {\n return data\n }\n\n log () {}\n\n error () {}\n}\n\nlet defaultsPrototype = Defaults.prototype\n\ndefaultsPrototype.basePath = ''\n\ndefaultsPrototype.forceTrailingSlash = ''\n\ndefaultsPrototype.httpConfig = {}\n\ndefaultsPrototype.verbsUseBasePath = false\n\nclass DSHttpAdapter {\n constructor (options) {\n options || (options = {})\n this.defaults = new Defaults()\n if (console) {\n this.defaults.log = (a, b) => console[typeof console.info === 'function' ? 'info' : 'log'](a, b)\n }\n if (console) {\n this.defaults.error = (a, b) => console[typeof console.error === 'function' ? 'error' : 'log'](a, b)\n }\n deepMixIn(this.defaults, options)\n this.http = options.http || axios\n }\n\n getEndpoint (resourceConfig, id, options) {\n options || (options = {})\n options.params = isUndefined(options.params) ? {} : options.params\n\n let endpoint = options.hasOwnProperty('endpoint') ? options.endpoint : resourceConfig.endpoint\n let parents = resourceConfig.parents || (resourceConfig.parent ? {\n [resourceConfig.parent]: {\n key: resourceConfig.parentKey,\n field: resourceConfig.parentField\n }\n } : {})\n\n DSUtils.forOwn(parents, function (parent, parentName) {\n let item\n let parentKey = parent.key\n let parentField = parent.field\n let parentDef = resourceConfig.getResource(parentName)\n let parentId = options.params[parentKey]\n\n if (parentId === false || !parentKey || !parentDef) {\n if (parentId === false) {\n delete options.params[parentKey]\n }\n } else {\n delete options.params[parentKey]\n\n if (DSUtils._sn(id)) {\n item = resourceConfig.get(id)\n } else if (DSUtils._o(id)) {\n item = id\n }\n\n if (item) {\n parentId = parentId || item[parentKey] || (item[parentField] ? item[parentField][parentDef.idAttribute] : null)\n }\n\n if (parentId) {\n delete options.endpoint\n let _options = {}\n DSUtils.forOwn(options, (value, key) => {\n _options[key] = value\n })\n endpoint = DSUtils.makePath(this.getEndpoint(parentDef, parentId, DSUtils._(parentDef, _options)), parentId, endpoint)\n }\n }\n }, this)\n\n return endpoint\n }\n\n getPath (method, resourceConfig, id, options) {\n let _this = this\n options || (options = {})\n if (isString(options.urlPath)) {\n return makePath.apply(DSUtils, [options.basePath || resourceConfig.basePath || _this.defaults.basePath, options.urlPath])\n } else {\n let args = [\n options.basePath || resourceConfig.basePath || _this.defaults.basePath,\n this.getEndpoint(resourceConfig, (isString(id) || isNumber(id) || method === 'create') ? id : null, options)\n ]\n if (method === 'find' || method === 'update' || method === 'destroy') {\n args.push(id)\n }\n return makePath.apply(DSUtils, args)\n }\n }\n\n HTTP (config) {\n let _this = this\n let start = new Date()\n\n // blacklist `data` as it can be large and will take a lot of time to copy\n let payload = config.data\n let cache = config.cache\n let timeout = config.timeout\n let params = config.params\n config = copy(config, null, null, null, ['data', 'cache', 'timeout', 'params']) // params could have data, cache, timeout\n config.params = copy(params)\n config = deepMixIn(config, _this.defaults.httpConfig)\n config.data = payload\n config.cache = cache\n config.timeout = timeout\n if (!('verbsUseBasePath' in config)) {\n config.verbsUseBasePath = _this.defaults.verbsUseBasePath\n }\n if (!config.urlOverride && config.verbsUseBasePath) {\n config.url = makePath(config.basePath || _this.defaults.basePath, config.url)\n }\n if (_this.defaults.forceTrailingSlash && config.url[config.url.length - 1] !== '/' && !config.urlOverride) {\n config.url += '/'\n }\n if (typeof config.data === 'object') {\n config.data = removeCircular(config.data)\n }\n config.method = config.method.toUpperCase()\n let suffix = isUndefined(config.suffix) ? _this.defaults.suffix : config.suffix\n if (suffix && config.url.substr(config.url.length - suffix.length) !== suffix && !config.urlOverride) {\n config.url += suffix\n }\n\n // logs the HTTP response\n function logResponse (data, isRejection) {\n data = data || {}\n // examine the data object\n if (data instanceof Error) {\n // log the Error object\n _this.defaults.error(`FAILED: ${data.message || 'Unknown Error'}`, data)\n return DSUtils.Promise.reject(data)\n } else if (typeof data === 'object') {\n let str = `${start.toUTCString()} - ${config.method} ${config.url} - ${data.status} ${(new Date().getTime() - start.getTime())}ms`\n\n if (data.status >= 200 && data.status < 300 && !isRejection) {\n if (_this.defaults.log) {\n _this.defaults.log(str, data)\n }\n return data\n } else {\n if (_this.defaults.error) {\n _this.defaults.error(`FAILED: ${str}`, data)\n }\n return DSUtils.Promise.reject(data)\n }\n } else {\n // unknown type for 'data' that is not an Object or Error\n _this.defaults.error('FAILED', data)\n return DSUtils.Promise.reject(data)\n }\n }\n\n if (!this.http) {\n throw new Error('You have not configured this adapter with an http library!')\n }\n\n return this.http(config).then(logResponse, function (data) {\n return logResponse(data, true)\n })\n }\n\n GET (url, config) {\n config = config || {}\n config.method = config.method || 'get'\n config.urlOverride = !!config.url\n config.url = config.url || url\n return this.HTTP(config)\n }\n\n POST (url, attrs, config) {\n config = config || {}\n config.method = config.method || 'post'\n config.urlOverride = !!config.url\n config.url = config.url || url\n config.data = config.data || attrs\n return this.HTTP(config)\n }\n\n PUT (url, attrs, config) {\n config = config || {}\n config.method = config.method || 'put'\n config.urlOverride = !!config.url\n config.url = config.url || url\n config.data = config.data || attrs\n return this.HTTP(config)\n }\n\n DEL (url, config) {\n config = config || {}\n config.method = config.method || 'delete'\n config.urlOverride = !!config.url\n config.url = config.url || url\n return this.HTTP(config)\n }\n\n find (resourceConfig, id, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n options.params = _this.defaults.queryTransform(resourceConfig, options.params)\n return _this.GET(\n _this.getPath('find', resourceConfig, id, options),\n options\n ).then((data) => {\n let item = (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data)\n return !item ? DSUtils.Promise.reject(new Error('Not Found!')) : item\n })\n }\n\n findAll (resourceConfig, params, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n if (params) {\n params = _this.defaults.queryTransform(resourceConfig, params)\n deepMixIn(options.params, params)\n }\n return _this.GET(\n _this.getPath('findAll', resourceConfig, params, options),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n\n create (resourceConfig, attrs, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n options.params = _this.defaults.queryTransform(resourceConfig, options.params)\n return _this.POST(\n _this.getPath('create', resourceConfig, attrs, options),\n options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n\n update (resourceConfig, id, attrs, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n options.params = _this.defaults.queryTransform(resourceConfig, options.params)\n return _this.PUT(\n _this.getPath('update', resourceConfig, id, options),\n options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n\n updateAll (resourceConfig, attrs, params, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n if (params) {\n params = _this.defaults.queryTransform(resourceConfig, params)\n deepMixIn(options.params, params)\n }\n return this.PUT(\n _this.getPath('updateAll', resourceConfig, attrs, options),\n options.serialize ? options.serialize(resourceConfig, attrs) : _this.defaults.serialize(resourceConfig, attrs),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n\n destroy (resourceConfig, id, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n options.params = _this.defaults.queryTransform(resourceConfig, options.params)\n return _this.DEL(\n _this.getPath('destroy', resourceConfig, id, options),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n\n destroyAll (resourceConfig, params, options) {\n let _this = this\n options || (options = {})\n options.suffix = isUndefined(options.suffix) ? resourceConfig.suffix : options.suffix\n options.params = isUndefined(options.params) ? {} : copy(options.params)\n if (params) {\n params = _this.defaults.queryTransform(resourceConfig, params)\n deepMixIn(options.params, params)\n }\n return this.DEL(\n _this.getPath('destroyAll', resourceConfig, params, options),\n options\n ).then((data) => (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data))\n }\n}\n\nDSHttpAdapter.version = {\n full: '<%= pkg.version %>',\n major: parseInt('<%= major %>', 10),\n minor: parseInt('<%= minor %>', 10),\n patch: parseInt('<%= patch %>', 10),\n alpha: '<%= alpha %>' !== 'false' ? '<%= alpha %>' : false,\n beta: '<%= beta %>' !== 'false' ? '<%= beta %>' : false\n}\n\nmodule.exports = DSHttpAdapter\n\n\n\n/** WEBPACK FOOTER **\n ** ./.js-data-http.js\n **/","if(typeof __WEBPACK_EXTERNAL_MODULE_3__ === 'undefined') {var e = new Error(\"Cannot find module \\\"axios\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"axios\"\n ** module id = 3\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"angular\"\n ** module id = 4\n ** module chunks = 0\n **/","var map = {};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src ^\\.\\/.*$\n ** module id = 5\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js-data-angular.min.js b/dist/js-data-angular.min.js index d602d5b..cfb64ab 100644 --- a/dist/js-data-angular.min.js +++ b/dist/js-data-angular.min.js @@ -1,10 +1,10 @@ -/** -* @author Jason Dobry -* @file js-data-angular.min.js -* @version 2.1.0 - Homepage -* @copyright (c) 2014 Jason Dobry +/*! +* js-data-angular +* @version 3.2.4 - Homepage +* @copyright (c) 2014-2016 js-data-angular project authors * @license MIT * * @overview Angular wrapper for js-data. */ -!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=200&&a.status<300?(e.defaults.log&&e.defaults.log(b,a),a):(e.defaults.error&&e.defaults.error("FAILED: "+b,a),d.reject(a))}var e=this,f=new Date;return a=k(a,e.defaults.httpConfig),e.defaults.forceTrailingSlash&&"/"!==a.url[a.url.length]&&(a.url+="/"),a.method=a.method.toUpperCase(),"object"==typeof a.data&&(a.data=j.removeCircular(a.data)),b(a).then(c,c)};var e=new f(a.defaults);return c.registerAdapter("http",e,{"default":!0}),e}]}),c.module("js-data").run(["DS","DSHttpAdapter",function(a,b){a.registerAdapter("http",b,{"default":!0})}])}}(window,window.angular)},{"js-data":"js-data"}]},{},[1]); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("js-data"),require("angular"),function(){try{return require("axios")}catch(e){}}()):"function"==typeof define&&define.amd?define(["js-data","angular"],function(r,a){return t(r,a,e.axios)}):"object"==typeof exports?exports.jsDataAngularModuleName=t(require("js-data"),require("angular"),function(){try{return require("axios")}catch(e){}}()):e.jsDataAngularModuleName=t(e.JSData,e.angular,e.axios)}(this,function(e,t,r){return function(e){function t(a){if(r[a])return r[a].exports;var n=r[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e){var t=void 0;try{t=r(5)(e.project)}catch(e){}t||(t=window[e.class]),t&&(e.loaded=!0,u.module("js-data").provider(e.class,function(){var e=this;e.defaults={},e.$get=[function(){return new t(e.defaults)}]}))}var i=r(1),s=r(2),u=r(4),o=i.DSUtils,f=i.DSErrors,l=o.get,d=o.isString,c=o.isNumber,p=o.isObject,h=o.set,m=o.resolveId,v=[{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"}],y=["compute","digest","eject","inject"],g=function e(){a(this,e);var t={};this.defaults=t,this.$get=["$http","DS",function(e,r){t.http=t.http||e;var a=new s(t);return r.registerAdapter("http",a,{default:!0}),a}]},b=function e(){function t(){function e(e){var t=f.defer();try{e(u.bind(t,t.resolve),u.bind(t,t.reject))}catch(e){t.reject(e)}return t.promise}for(var t=arguments.length,a=Array(t),n=0;t>n;n++)a[n]=arguments[n];var s=a[a.length-2],f=a[a.length-1],l=new i.DS(r.defaults),d={};if(e.all=f.all,e.when=f.when,e.reject=f.reject,o.Promise=e,a.length)for(var c=0;ca;a++)r[a]=arguments[a];return s.$$phase?d[e].apply(l,r):s.$apply(function(){return d[e].apply(l,r)})}},m=0;m=200&&t.status<300&&!n?(r.defaults.log&&r.defaults.log(i,t),t):(r.defaults.error&&r.defaults.error("FAILED: "+i,t),l.Promise.reject(t))}return r.defaults.error("FAILED",t),l.Promise.reject(t)}var r=this,a=new Date,n=e.data,u=e.cache,o=e.timeout,f=e.params;e=p(e,null,null,null,["data","cache","timeout","params"]),e.params=p(f),e=d(e,r.defaults.httpConfig),e.data=n,e.cache=u,e.timeout=o,"verbsUseBasePath"in e||(e.verbsUseBasePath=r.defaults.verbsUseBasePath),!e.urlOverride&&e.verbsUseBasePath&&(e.url=h(e.basePath||r.defaults.basePath,e.url)),r.defaults.forceTrailingSlash&&"/"!==e.url[e.url.length-1]&&!e.urlOverride&&(e.url+="/"),"object"===s(e.data)&&(e.data=c(e.data)),e.method=e.method.toUpperCase();var m=i(e.suffix)?r.defaults.suffix:e.suffix;if(m&&e.url.substr(e.url.length-m.length)!==m&&!e.urlOverride&&(e.url+=m),!this.http)throw new Error("You have not configured this adapter with an http library!");return this.http(e).then(t,function(e){return t(e,!0)})}},{key:"GET",value:function(e,t){return t=t||{},t.method=t.method||"get",t.urlOverride=!!t.url,t.url=t.url||e,this.HTTP(t)}},{key:"POST",value:function(e,t,r){return r=r||{},r.method=r.method||"post",r.urlOverride=!!r.url,r.url=r.url||e,r.data=r.data||t,this.HTTP(r)}},{key:"PUT",value:function(e,t,r){return r=r||{},r.method=r.method||"put",r.urlOverride=!!r.url,r.url=r.url||e,r.data=r.data||t,this.HTTP(r)}},{key:"DEL",value:function(e,t){return t=t||{},t.method=t.method||"delete",t.urlOverride=!!t.url,t.url=t.url||e,this.HTTP(t)}},{key:"find",value:function(e,t,r){var a=this;return r||(r={}),r.suffix=i(r.suffix)?e.suffix:r.suffix,r.params=i(r.params)?{}:p(r.params),r.params=a.defaults.queryTransform(e,r.params),a.GET(a.getPath("find",e,t,r),r).then(function(t){var n=(r.deserialize?r.deserialize:a.defaults.deserialize)(e,t);return n?n:l.Promise.reject(new Error("Not Found!"))})}},{key:"findAll",value:function(e,t,r){var a=this;return r||(r={}),r.suffix=i(r.suffix)?e.suffix:r.suffix,r.params=i(r.params)?{}:p(r.params),t&&(t=a.defaults.queryTransform(e,t),d(r.params,t)),a.GET(a.getPath("findAll",e,t,r),r).then(function(t){return(r.deserialize?r.deserialize:a.defaults.deserialize)(e,t)})}},{key:"create",value:function(e,t,r){var a=this;return r||(r={}),r.suffix=i(r.suffix)?e.suffix:r.suffix,r.params=i(r.params)?{}:p(r.params),r.params=a.defaults.queryTransform(e,r.params),a.POST(a.getPath("create",e,t,r),r.serialize?r.serialize(e,t):a.defaults.serialize(e,t),r).then(function(t){return(r.deserialize?r.deserialize:a.defaults.deserialize)(e,t)})}},{key:"update",value:function(e,t,r,a){var n=this;return a||(a={}),a.suffix=i(a.suffix)?e.suffix:a.suffix,a.params=i(a.params)?{}:p(a.params),a.params=n.defaults.queryTransform(e,a.params),n.PUT(n.getPath("update",e,t,a),a.serialize?a.serialize(e,r):n.defaults.serialize(e,r),a).then(function(t){return(a.deserialize?a.deserialize:n.defaults.deserialize)(e,t)})}},{key:"updateAll",value:function(e,t,r,a){var n=this;return a||(a={}),a.suffix=i(a.suffix)?e.suffix:a.suffix,a.params=i(a.params)?{}:p(a.params),r&&(r=n.defaults.queryTransform(e,r),d(a.params,r)),this.PUT(n.getPath("updateAll",e,t,a),a.serialize?a.serialize(e,t):n.defaults.serialize(e,t),a).then(function(t){return(a.deserialize?a.deserialize:n.defaults.deserialize)(e,t)})}},{key:"destroy",value:function(e,t,r){var a=this;return r||(r={}),r.suffix=i(r.suffix)?e.suffix:r.suffix,r.params=i(r.params)?{}:p(r.params),r.params=a.defaults.queryTransform(e,r.params),a.DEL(a.getPath("destroy",e,t,r),r).then(function(t){return(r.deserialize?r.deserialize:a.defaults.deserialize)(e,t)})}},{key:"destroyAll",value:function(e,t,r){var a=this;return r||(r={}),r.suffix=i(r.suffix)?e.suffix:r.suffix,r.params=i(r.params)?{}:p(r.params),t&&(t=a.defaults.queryTransform(e,t),d(r.params,t)),this.DEL(a.getPath("destroyAll",e,t,r),r).then(function(t){return(r.deserialize?r.deserialize:a.defaults.deserialize)(e,t)})}}]),e}();b.version={full:"<%= pkg.version %>",major:parseInt("<%= major %>",10),minor:parseInt("<%= minor %>",10),patch:parseInt("<%= patch %>",10),alpha:"<%= alpha %>",beta:"<%= beta %>"},e.exports=b},function(e,t){if("undefined"==typeof r){var a=new Error('Cannot find module "axios"');throw a.code="MODULE_NOT_FOUND",a}e.exports=r},function(e,r){e.exports=t},function(e,t,r){function a(e){return r(n(e))}function n(e){return i[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var i={};a.keys=function(){return Object.keys(i)},a.resolve=n,e.exports=a,a.id=5}])}); +//# 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 new file mode 100644 index 0000000..b85a53a --- /dev/null +++ b/dist/js-data-angular.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["dist/js-data-angular.js"],"names":["root","factory","exports","module","require","e","define","amd","__WEBPACK_EXTERNAL_MODULE_1__","__WEBPACK_EXTERNAL_MODULE_4__","this","__WEBPACK_EXTERNAL_MODULE_3__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_classCallCheck","instance","Constructor","TypeError","registerAdapter","adapter","Adapter","project","window","class","angular","provider","_this","defaults","$get","JSData","DSHttpAdapter","DSUtils","DSErrors","get","isString","isNumber","isObject","set","resolveId","adapters","name","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","idAttribute","lastModified","items","filter","forEach","item","compute","bindOne","value","version","run","_defineProperty","obj","key","defineProperty","enumerable","configurable","writable","isUndefined","undefined","_typeof","Symbol","iterator","constructor","_createClass","defineProperties","target","props","descriptor","protoProps","staticProps","axios","deepMixIn","removeCircular","copy","makePath","Defaults","resourceConfig","data","defaultsPrototype","basePath","forceTrailingSlash","httpConfig","verbsUseBasePath","options","console","log","a","b","info","error","endpoint","hasOwnProperty","parents","parent","parentKey","field","parentField","forOwn","parentName","parentDef","getResource","parentId","_sn","_o","_options","getEndpoint","_","method","urlPath","config","logResponse","isRejection","Error","message","str","start","toUTCString","url","status","Date","getTime","payload","cache","timeout","urlOverride","toUpperCase","suffix","substr","then","HTTP","attrs","queryTransform","GET","getPath","deserialize","POST","serialize","PUT","DEL","full","major","parseInt","minor","patch","alpha","beta","code","webpackContext","req","webpackContextResolve","map","keys"],"mappings":"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","file":"dist/js-data-angular.min.js"} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 6e57fb6..31fe59d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,63 +1,78 @@ -// an example karma.conf.js +var customLaunchers = { + bs_ie9_windows7: { + base: 'BrowserStack', + browser: 'ie', + browser_version: '9.0', + os: 'Windows', + os_version: '7' + }, + bs_safari7_osxmavericks: { + base: 'BrowserStack', + browser: 'safari', + browser_version: '7.1', + os: 'OS X', + os_version: 'Mavericks' + }, + bs_firefox41_windows7: { + base: 'BrowserStack', + browser: 'firefox', + browser_version: '41.0', + os: 'Windows', + os_version: '7' + }, + bs_chrome46_windows7: { + base: 'BrowserStack', + browser: 'chrome', + browser_version: '46.0', + os: 'Windows', + os_version: '7' + } +} + +var browsers = ['PhantomJS'] +if ( + process.env.BROWSERSTACK_USERNAME && + process.env.BROWSERSTACK_ACCESS_KEY +) { + browsers = browsers.concat(Object.keys(customLaunchers)) +} + module.exports = function (config) { config.set({ - // base path, that will be used to resolve files and exclude basePath: './', frameworks: ['sinon', 'chai', 'mocha'], plugins: [ - // these plugins will be require() by Karma 'karma-sinon', 'karma-mocha', 'karma-chai', - 'karma-chrome-launcher', 'karma-phantomjs-launcher', - 'karma-firefox-launcher', - 'karma-coverage', - 'karma-spec-reporter' + 'karma-coverage' ], autoWatch: false, browserNoActivityTimeout: 30000, - browsers: ['Chrome'], - - // list of files / patterns to load in the browser + browsers: browsers, 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/babel-polyfill/dist/polyfill.js', + 'node_modules/js-data/dist/js-data.js', 'dist/js-data-angular.js', 'karma.start.js', 'test/**/*.js' ], - - reporters: ['spec', 'coverage'], - + reporters: ['dots', 'coverage'], preprocessors: { 'dist/js-data-angular.js': ['coverage'] }, - - // optionally, configure the reporter coverageReporter: { type: 'lcov', dir: 'coverage/' }, - - // web server port port: 9876, - - // cli runner port runnerPort: 9100, - - // enable / disable colors in the output (reporters and logs) colors: true, - - // level of logging logLevel: config.LOG_INFO, - - // If browser does not capture in given timeout [ms], kill it captureTimeout: 30000, - - // Continuous Integration mode - // if true, it capture browsers, run tests and exit singleRun: true - }); -}; + }) +} diff --git a/karma.start.js b/karma.start.js index 7e9176c..cc3bd79 100644 --- a/karma.start.js +++ b/karma.start.js @@ -1,18 +1,18 @@ // Setup global test variables -var $rootScope, $q, $log, $timeout, DSHttpAdapterProvider, DSProvider, DS, DSUtils, DSHttpAdapter, app, $httpBackend, p1, p2, p3, p4, p5; +var $rootScope, $q, $log, $timeout, DSHttpAdapterProvider, DSProvider, DS, DSUtils, DSHttpAdapter, app, $httpBackend, p1, p2, p3, p4, p5 -var Post, User, Organization, Comment, Profile; -var user1, organization2, comment3, profile4; -var comment11, comment12, comment13, organization14, profile15, user10, user16, user17, user18, organization15, user19, user20, comment19, user22, profile21; +var Post, User, Organization, Comment, Profile +var user1, organization2, comment3, profile4 +var comment11, comment12, comment13, organization14, profile15, user10, user16, user17, user18, organization15, user19, user20, comment19, user22, profile21 -var lifecycle = {}; +var lifecycle = {} // Helper globals var fail = function (msg) { if (msg instanceof Error) { - console.log(msg.stack); + console.log(msg.stack) } else { - assert.equal('should not reach this!: ' + msg, 'failure'); + assert.equal('should not reach this!: ' + msg, 'failure') } }, TYPES_EXCEPT_STRING = [123, 123.123, null, undefined, {}, [], true, false, function () { @@ -35,105 +35,105 @@ var fail = function (msg) { }], TYPES_EXCEPT_BOOLEAN = ['string', 123, 123.123, null, undefined, {}, [], function () { }], - TYPES_EXCEPT_FUNCTION = ['string', 123, 123.123, null, undefined, {}, [], true, false]; + TYPES_EXCEPT_FUNCTION = ['string', 123, 123.123, null, undefined, {}, [], true, false] -angular.module('app', ['ng', 'js-data']); +angular.module('app', ['ng', 'js-data']) // Setup before each test beforeEach(function () { lifecycle.beforeValidate = function (resourceName, attrs, cb) { - lifecycle.beforeValidate.callCount += 1; - cb(null, attrs); - }; + lifecycle.beforeValidate.callCount += 1 + cb(null, attrs) + } lifecycle.validate = function (resourceName, attrs, cb) { - lifecycle.validate.callCount += 1; - cb(null, attrs); - }; + lifecycle.validate.callCount += 1 + cb(null, attrs) + } lifecycle.afterValidate = function (resourceName, attrs, cb) { - lifecycle.afterValidate.callCount += 1; - cb(null, attrs); - }; + lifecycle.afterValidate.callCount += 1 + cb(null, attrs) + } lifecycle.beforeCreate = function (resourceName, attrs, cb) { - lifecycle.beforeCreate.callCount += 1; - cb(null, attrs); - }; + lifecycle.beforeCreate.callCount += 1 + cb(null, attrs) + } lifecycle.afterCreate = function (resourceName, attrs, cb) { - lifecycle.afterCreate.callCount += 1; - cb(null, attrs); - }; + lifecycle.afterCreate.callCount += 1 + cb(null, attrs) + } lifecycle.beforeUpdate = function (resourceName, attrs, cb) { - lifecycle.beforeUpdate.callCount += 1; - cb(null, attrs); - }; + lifecycle.beforeUpdate.callCount += 1 + cb(null, attrs) + } lifecycle.afterUpdate = function (resourceName, attrs, cb) { - lifecycle.afterUpdate.callCount += 1; - cb(null, attrs); - }; + lifecycle.afterUpdate.callCount += 1 + cb(null, attrs) + } lifecycle.beforeDestroy = function (resourceName, attrs, cb) { - lifecycle.beforeDestroy.callCount += 1; - cb(null, attrs); - }; + lifecycle.beforeDestroy.callCount += 1 + cb(null, attrs) + } lifecycle.afterDestroy = function (resourceName, attrs, cb) { - lifecycle.afterDestroy.callCount += 1; - cb(null, attrs); - }; + lifecycle.afterDestroy.callCount += 1 + cb(null, attrs) + } lifecycle.beforeInject = function () { - lifecycle.beforeInject.callCount += 1; - }; - lifecycle.afterInject = function () { - lifecycle.afterInject.callCount += 1; - }; + lifecycle.beforeInject.callCount += 1 + } + lifecycle.afterInject = function (resource, data) { + lifecycle.afterInject.callCount += 1 + } lifecycle.serialize = function (resourceName, data) { - lifecycle.serialize.callCount += 1; - return data; - }; + lifecycle.serialize.callCount += 1 + return data + } lifecycle.deserialize = function (resourceName, data) { - lifecycle.deserialize.callCount += 1; - return data ? (data.data ? data.data : data) : data;; - }; + lifecycle.deserialize.callCount += 1 + return data ? (data.data ? data.data : data) : data + } lifecycle.queryTransform = function (resourceName, query) { - lifecycle.queryTransform.callCount += 1; - return query; - }; + lifecycle.queryTransform.callCount += 1 + return query + } module('app', function (_DSProvider_, _DSHttpAdapterProvider_) { - DSProvider = _DSProvider_; - DSProvider.defaults.basePath = 'http://test.angular-cache.com/'; - DSProvider.defaults.beforeValidate = lifecycle.beforeValidate; - DSProvider.defaults.validate = lifecycle.validate; - DSProvider.defaults.afterValidate = lifecycle.afterValidate; - DSProvider.defaults.beforeCreate = lifecycle.beforeCreate; - DSProvider.defaults.afterCreate = lifecycle.afterCreate; - DSProvider.defaults.beforeUpdate = lifecycle.beforeUpdate; - DSProvider.defaults.afterUpdate = lifecycle.afterUpdate; - DSProvider.defaults.beforeDestroy = lifecycle.beforeDestroy; - DSProvider.defaults.afterDestroy = lifecycle.afterDestroy; - DSProvider.defaults.beforeInject = lifecycle.beforeInject; - DSProvider.defaults.afterInject = lifecycle.afterInject; - DSProvider.defaults.serialize = lifecycle.serialize; - DSProvider.defaults.deserialize = lifecycle.deserialize; - DSHttpAdapterProvider = _DSHttpAdapterProvider_; - DSHttpAdapterProvider.defaults.queryTransform = lifecycle.queryTransform; - DSHttpAdapterProvider.defaults.log = false; - }); -}); + DSProvider = _DSProvider_ + DSProvider.defaults.basePath = 'http://test.angular-cache.com/' + DSProvider.defaults.beforeValidate = lifecycle.beforeValidate + DSProvider.defaults.validate = lifecycle.validate + DSProvider.defaults.afterValidate = lifecycle.afterValidate + DSProvider.defaults.beforeCreate = lifecycle.beforeCreate + DSProvider.defaults.afterCreate = lifecycle.afterCreate + DSProvider.defaults.beforeUpdate = lifecycle.beforeUpdate + DSProvider.defaults.afterUpdate = lifecycle.afterUpdate + DSProvider.defaults.beforeDestroy = lifecycle.beforeDestroy + DSProvider.defaults.afterDestroy = lifecycle.afterDestroy + DSProvider.defaults.beforeInject = lifecycle.beforeInject + DSProvider.defaults.afterInject = lifecycle.afterInject + DSProvider.defaults.serialize = lifecycle.serialize + DSProvider.defaults.deserialize = lifecycle.deserialize + DSHttpAdapterProvider = _DSHttpAdapterProvider_ + DSHttpAdapterProvider.defaults.queryTransform = lifecycle.queryTransform + DSHttpAdapterProvider.defaults.log = false + }) +}) function startInjector() { inject(function (_$rootScope_, _$q_, _$timeout_, _$httpBackend_, _DS_, _$log_, _DSUtils_, _DSHttpAdapter_) { // Setup global mocks - localStorage.clear(); - $q = _$q_; - $rootScope = _$rootScope_; - DS = _DS_; - $timeout = _$timeout_; - DSUtils = _DSUtils_; - DSHttpAdapter = _DSHttpAdapter_; - $httpBackend = _$httpBackend_; + localStorage.clear() + $q = _$q_ + $rootScope = _$rootScope_ + DS = _DS_ + $timeout = _$timeout_ + DSUtils = _DSUtils_ + DSHttpAdapter = _DSHttpAdapter_ + $httpBackend = _$httpBackend_ Post = DS.defineResource({ name: 'post', keepChangeHistory: true, endpoint: '/posts' - }); + }) User = DS.defineResource({ name: 'user', relations: { @@ -157,7 +157,7 @@ function startInjector() { } } } - }); + }) Organization = DS.defineResource({ name: 'organization', @@ -169,7 +169,7 @@ function startInjector() { } } } - }); + }) Profile = DS.defineResource({ name: 'profile', @@ -181,7 +181,7 @@ function startInjector() { } } } - }); + }) Comment = DS.defineResource({ name: 'comment', @@ -200,74 +200,74 @@ function startInjector() { ] } } - }); - $log = _$log_; + }) + $log = _$log_ - lifecycle.beforeValidate.callCount = 0; - lifecycle.validate.callCount = 0; - lifecycle.afterValidate.callCount = 0; - lifecycle.beforeCreate.callCount = 0; - lifecycle.afterCreate.callCount = 0; - lifecycle.beforeUpdate.callCount = 0; - lifecycle.afterUpdate.callCount = 0; - lifecycle.beforeDestroy.callCount = 0; - lifecycle.afterDestroy.callCount = 0; - lifecycle.beforeInject.callCount = 0; - lifecycle.afterInject.callCount = 0; - lifecycle.serialize.callCount = 0; - lifecycle.deserialize.callCount = 0; - lifecycle.queryTransform.callCount = 0; + lifecycle.beforeValidate.callCount = 0 + lifecycle.validate.callCount = 0 + lifecycle.afterValidate.callCount = 0 + lifecycle.beforeCreate.callCount = 0 + lifecycle.afterCreate.callCount = 0 + lifecycle.beforeUpdate.callCount = 0 + lifecycle.afterUpdate.callCount = 0 + lifecycle.beforeDestroy.callCount = 0 + lifecycle.afterDestroy.callCount = 0 + lifecycle.beforeInject.callCount = 0 + lifecycle.afterInject.callCount = 0 + lifecycle.serialize.callCount = 0 + lifecycle.deserialize.callCount = 0 + lifecycle.queryTransform.callCount = 0 - p1 = { author: 'John', age: 30, id: 5 }; - p2 = { author: 'Sally', age: 31, id: 6 }; - p3 = { author: 'Mike', age: 32, id: 7 }; - p4 = { author: 'Adam', age: 33, id: 8 }; - p5 = { author: 'Adam', age: 33, id: 9 }; + p1 = { author: 'John', age: 30, id: 5 } + p2 = { author: 'Sally', age: 31, id: 6 } + p3 = { author: 'Mike', age: 32, id: 7 } + p4 = { author: 'Adam', age: 33, id: 8 } + p5 = { author: 'Adam', age: 33, id: 9 } user1 = { name: 'John Anderson', id: 1, organizationId: 2 - }; + } organization2 = { name: 'Test Corp 2', id: 2 - }; + } comment3 = { content: 'test comment 3', id: 3, userId: 1 - }; + } profile4 = { content: 'test profile 4', id: 4, userId: 1 - }; + } comment11 = { id: 11, userId: 10, content: 'test comment 11' - }; + } comment12 = { id: 12, userId: 10, content: 'test comment 12' - }; + } comment13 = { id: 13, userId: 10, content: 'test comment 13' - }; + } organization14 = { id: 14, name: 'Test Corp' - }; + } profile15 = { id: 15, userId: 10, email: 'john.anderson@test.com' - }; + } user10 = { name: 'John Anderson', id: 10, @@ -279,22 +279,22 @@ function startInjector() { ], organization: organization14, profile: profile15 - }; + } user16 = { id: 16, organizationId: 15, name: 'test user 16' - }; + } user17 = { id: 17, organizationId: 15, name: 'test user 17' - }; + } user18 = { id: 18, organizationId: 15, name: 'test user 18' - }; + } organization15 = { name: 'Another Test Corp', id: 15, @@ -303,15 +303,15 @@ function startInjector() { user17, user18 ] - }; + } user19 = { id: 19, name: 'test user 19' - }; + } user20 = { id: 20, name: 'test user 20' - }; + } comment19 = { content: 'test comment 19', id: 19, @@ -319,27 +319,27 @@ function startInjector() { approvedByUser: user19, userId: 20, user: user20 - }; + } user22 = { id: 22, name: 'test user 22' - }; + } profile21 = { content: 'test profile 21', id: 21, userId: 22, user: user22 - }; - }); + } + }) } // Clean up after each test afterEach(function () { try { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); + $httpBackend.verifyNoOutstandingExpectation() + $httpBackend.verifyNoOutstandingRequest() } catch (err) { - console.log(err); + console.log(err) } - $log.reset(); -}); + $log.reset() +}) diff --git a/package.json b/package.json index 54a3286..55e2e70 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,71 @@ { "name": "js-data-angular", "description": "Angular wrapper for js-data.", - "version": "2.1.0", + "version": "3.2.4", "homepage": "http://www.js-data.io/docs/js-data-angular", "repository": { "type": "git", "url": "https://github.com/js-data/js-data-angular.git" }, - "author": { - "name": "Jason Dobry", - "url": "http://www.pseudobry.com/", - "email": "jason.dobry@gmail.com" + "author": "js-data-angular project authors", + "license": "MIT", + "main": "dist/js-data-angular.js", + "standard": { + "parser": "babel-eslint", + "globals": [ + "Headers", + "fetch", + "Request", + "action", + "describe", + "it", + "sinon", + "before", + "after", + "beforeEach", + "afterEach" + ] + }, + "scripts": { + "lint": "repo-tools lint karma.conf.js src/*.js scripts/*.js", + "webpack": "node scripts/js-data-http.js && webpack --config webpack.config.js", + "min": "uglifyjs dist/js-data-angular.js -o dist/js-data-angular.min.js --source-map dist/js-data-angular.min.map --source-map-url js-data-angular.min.map -v -m -c --screw-ie8", + "version": "node scripts/version.js", + "banner": "node scripts/banner.js", + "gzip": "echo js-data-angular gzipped size: $(cat dist/js-data-angular.min.js | gzip -f9 | wc -c)kb", + "build": "npm run lint && npm run webpack && npm run min && npm run version && npm run banner", + "karma": "karma start", + "test": "npm run build && npm run karma", + "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", + "release": "npm test && npm run repo-tools", + "ci": "npm test && cat ./coverage/PhantomJS*/lcov.info | coveralls || true" + }, + "peerDependencies": { + "angular": ">=1.1.0", + "js-data": ">=2.0.0 <3" }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/js-data/js-data-angular/blob/master/LICENSE" - } - ], - "main": "src/index.js", "devDependencies": { - "grunt": "0.4.5", - "grunt-browserify": "3.3.0", - "grunt-contrib-clean": "0.6.0", - "grunt-contrib-jshint": "0.11.0", - "grunt-contrib-uglify": "0.7.0", - "grunt-contrib-watch": "0.6.1", - "grunt-karma": "0.10.1", - "grunt-karma-coveralls": "2.5.3", - "karma": "0.12.31", + "babel-core": "6.7.2", + "babel-loader": "6.2.4", + "babel-polyfill": "6.7.2", + "babel-preset-es2015": "6.6.0", + "chai": "3.5.0", + "coveralls": "2.11.8", + "js-data-repo-tools": "0.2.0", + "karma": "0.13.22", + "karma-browserstack-launcher": "0.1.10", "karma-chai": "0.1.0", - "karma-chrome-launcher": "0.1.7", - "karma-coverage": "0.2.7", - "karma-script-launcher": "0.1.0", - "karma-firefox-launcher": "0.1.4", - "karma-phantomjs-launcher": "0.1.4", - "karma-mocha": "0.1.10", + "karma-coverage": "0.5.5", + "karma-mocha": "0.2.2", + "karma-phantomjs-launcher": "1.0.2", "karma-sinon": "1.0.4", - "karma-spec-reporter": "0.0.16", - "time-grunt": "1.0.0", - "jit-grunt": "0.9.1" - }, - "scripts": { - "test": "grunt test" - }, - "dependencies": { - "mout": "0.11.0", - "js-data": ">=1.1.0" + "mocha": "2.4.5", + "phantomjs-prebuilt": "2.1.6", + "request": "2.69.0", + "sinon": "1.17.3", + "tar.gz": "1.0.3", + "tarball-extract": "0.0.3", + "uglify-js": "2.6.2", + "webpack": "1.12.14" } } diff --git a/scripts/AUTHORS b/scripts/AUTHORS new file mode 100644 index 0000000..4300136 --- /dev/null +++ b/scripts/AUTHORS @@ -0,0 +1,7 @@ +# This is the official list of js-data-http project authors. +# +# This file is controlled by scripts/authors.js +# +# Names are formatted as: +# Name or Organization +# The email address is not required for organizations. diff --git a/scripts/CONTRIBUTORS b/scripts/CONTRIBUTORS new file mode 100644 index 0000000..429081a --- /dev/null +++ b/scripts/CONTRIBUTORS @@ -0,0 +1,6 @@ +# People who have contributed to the js-data-http project. +# +# This file is controlled by scripts/authors.js +# +# Names should be added to this file as: +# [commit count] Name diff --git a/scripts/authors.js b/scripts/authors.js new file mode 100644 index 0000000..778dc8f --- /dev/null +++ b/scripts/authors.js @@ -0,0 +1,58 @@ +var fs = require('fs') +var exec = require('child_process').exec +var path = require('path') + +console.log('Writing AUTHORS file...') + +var authorsFile = fs.readFileSync(path.join(__dirname, '/AUTHORS'), { + encoding: 'utf-8' +}) +var contributorsFile = fs.readFileSync(path.join(__dirname, '/CONTRIBUTORS'), { + encoding: 'utf-8' +}) + +var tty = process.platform === 'win32' ? 'CON' : '/dev/tty' + +exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { + if (err) { + console.error(err) + process.exit(-1) + } else { + var lines = stdout.split('\n') + var countsAndNames = lines.map(function (line) { + return line.split('\t') + }) + var names = countsAndNames.map(function (pair) { + return pair[1] + }) + + // Add to or otherwise modify "names" if necessary + + fs.writeFileSync(path.join(__dirname, '/../AUTHORS'), authorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + fs.writeFileSync(path.join(__dirname, '/../fetch/AUTHORS'), authorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + fs.writeFileSync(path.join(__dirname, '/../node/AUTHORS'), authorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + console.log('Done!') + console.log('Writing CONTRIBUTORS file...') + + names = lines + + // Add to or otherwise modify "names" if necessary + + fs.writeFileSync(path.join(__dirname, '/../CONTRIBUTORS'), contributorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + fs.writeFileSync(path.join(__dirname, '/../fetch/CONTRIBUTORS'), contributorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + fs.writeFileSync(path.join(__dirname, '/../node/CONTRIBUTORS'), contributorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + console.log('Done!') + } +}) diff --git a/scripts/banner.js b/scripts/banner.js new file mode 100644 index 0000000..94570f3 --- /dev/null +++ b/scripts/banner.js @@ -0,0 +1,29 @@ +var fs = require('fs') +var pkg = require('../package.json') + +var banner = '/*!\n' + + '* js-data-angular\n' + + '* @version ' + pkg.version + ' - Homepage \n' + + '* @copyright (c) 2014-2016 js-data-angular project authors\n' + + '* @license MIT \n' + + '*\n' + + '* @overview Angular wrapper for js-data.\n' + + '*/\n' + +console.log('Adding banner to dist/ files...') + +function addBanner (filepath) { + var contents = fs.readFileSync(filepath, { + encoding: 'utf-8' + }) + if (contents.substr(0, 3) !== '/*!') { + fs.writeFileSync(filepath, banner + contents, { + encoding: 'utf-8' + }) + } +} + +addBanner('dist/js-data-angular.js') +addBanner('dist/js-data-angular.min.js') + +console.log('Done!') diff --git a/scripts/cleanup.js b/scripts/cleanup.js new file mode 100644 index 0000000..1bc6136 --- /dev/null +++ b/scripts/cleanup.js @@ -0,0 +1,25 @@ +var fs = require('fs') + +var pkg = require('../package.json') + +var path = './doc/js-data-angular/' + pkg.version + '/styles/' + +var files = fs.readdirSync(path) +files.forEach(function (file) { + if (file.indexOf('site') === 0) { + if (file.indexOf('lumen') === -1 && file.indexOf('dibs') === -1) { + fs.unlinkSync(path + file) + } + } +}) + +path = './doc/js-data-angular/' + pkg.version + +files = fs.readdirSync(path) +files.forEach(function (file) { + if (file.indexOf('.html') === file.length - 5) { + var content = fs.readFileSync(path + '/' + file, { encoding: 'utf8' }) + content = content.replace(/\/home\/ubuntu\/workspace\//gi, '') + fs.writeFileSync(path + '/' + file, content, { encoding: 'utf8' }) + } +}) diff --git a/scripts/js-data-http.js b/scripts/js-data-http.js new file mode 100644 index 0000000..79a4c49 --- /dev/null +++ b/scripts/js-data-http.js @@ -0,0 +1,23 @@ +var fs = require('fs') +var url = 'https://github.com/js-data/js-data-http/archive/2.2.4.tar.gz' +var directory = './.js-data-http/' +var request = require('request') +var targz = require('tar.gz') + +// Streams +try { + fs.statSync(directory) + console.log('js-data-http already downloaded') +} catch (err) { + console.log('downloading js-data-http') + var read = request.get(url) + var write = targz().createWriteStream(directory) + + read.pipe(write) + + write.on('finish', function () { + var copyRead = fs.createReadStream(directory + 'js-data-http-2.2.4/src/index.js') + var copyWrite = fs.createWriteStream('./.js-data-http.js') + copyRead.pipe(copyWrite) + }) +} diff --git a/scripts/version.js b/scripts/version.js new file mode 100644 index 0000000..ec3d3f5 --- /dev/null +++ b/scripts/version.js @@ -0,0 +1,39 @@ +var fs = require('fs') +var pkg = require('../package.json') + +console.log('Adding version to dist/ files...') + +function version (filepath) { + var file = fs.readFileSync(filepath, { + encoding: 'utf-8' + }) + + file = file.replace(/<%= pkg\.version %>/gi, pkg.version) + + var parts = pkg.version.split('-') + var numbers = parts[0].split('.') + + file = file.replace(/<%= major %>/gi, numbers[0]) + file = file.replace(/<%= minor %>/gi, numbers[1]) + file = file.replace(/<%= patch %>/gi, numbers[2]) + + if (pkg.version.indexOf('alpha') !== -1) { + file = file.replace(/<%= alpha %>/gi, parts[1].replace('alpha.', '') + (parts.length > 2 ? '-' + parts[2] : '')) + } else { + file = file.replace(/<%= alpha %>/gi, false) + } + + if (pkg.version.indexOf('beta') !== -1) { + file = file.replace(/<%= beta %>/gi, parts[1].replace('beta.', '') + (parts.length > 2 ? '-' + parts[2] : '')) + } else { + file = file.replace(/<%= beta %>/gi, false) + } + + fs.writeFileSync(filepath, file, { + encoding: 'utf-8' + }) +} + +version('dist/js-data-angular.js') + +console.log('Done!') diff --git a/src/index.js b/src/index.js index fa9b4c3..3cf5439 100644 --- a/src/index.js +++ b/src/index.js @@ -1,490 +1,245 @@ -/*jshint loopfunc:true*/ -(function (window, angular, undefined) { - 'use strict'; +/* jshint loopfunc:true */ +let JSData = require('js-data') +let DSHttpAdapter = require('../.js-data-http.js') +let angular = require('angular') + +let { DSUtils, DSErrors } = JSData +let { get, isString, isNumber, isObject, set, resolveId } = DSUtils + +let adapters = [ + { + 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' + } +] - var JSData; +let functionsToWrap = [ + 'compute', + 'digest', + 'eject', + 'inject' +] - try { - JSData = require('js-data'); - } catch (e) { +function registerAdapter (adapter) { + let Adapter - } + try { + Adapter = require(adapter.project) + } catch (e) {} - if (!JSData) { - JSData = window.JSData; + if (!Adapter) { + Adapter = window[adapter.class] } - if (!JSData) { - throw new Error('js-data must be loaded!'); + if (Adapter) { + adapter.loaded = true + angular.module('js-data').provider(adapter.class, function () { + let _this = this + _this.defaults = {} + _this.$get = [() => new Adapter(_this.defaults)] + }) } - - var DSUtils = JSData.DSUtils; - - var deepMixIn = JSData.DSUtils.deepMixIn; - var httpLoaded = false; - - var adapters = [ - { - project: 'js-data-http', - name: 'http', - class: 'DSHttpAdapter' - }, - { - project: 'js-data-localstorage', - name: 'localstorage', - class: 'DSLocalStorageAdapter' - }, - { - project: 'js-data-localforage', - name: 'localforage', - class: 'DSLocalForageAdapter' - }, - { - project: 'js-data-firebase', - name: 'firebase', - class: 'DSFirebaseAdapter' - } - ]; - - var functionsToWrap = [ - 'compute', - 'digest', - 'eject', - 'inject', - 'link', - 'linkAll', - 'linkInverse', - 'unlinkInverse' - ]; - - function Defaults() { - +} + +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 + }] } +} - function DSHttpAdapter(options) { - this.defaults = new Defaults(); - deepMixIn(this.defaults, options); - } +class DSProvider { + constructor () { + let _this = this + let deps = [] - function registerAdapter(adapter) { - var Adapter; + for (var i = 0; i < adapters.length; i++) { + if (adapters[i].loaded) { + deps.push(adapters[i].class) + } + } - try { - Adapter = require(adapter.project); - } catch (e) { + _this.defaults = {} - } + JSData.DS.prototype.bindAll = function (resourceName, params, scope, expr, cb) { + let _this = this - if (!Adapter) { - Adapter = window[adapter.class]; - } + params = params || {} - if (Adapter) { - if (adapter.name === 'http') { - httpLoaded = true; + if (!_this.definitions[resourceName]) { + throw new DSErrors.NER(resourceName) + } else if (!isObject(params)) { + throw new DSErrors.IA('"params" must be an object!') + } else if (!isObject(scope)) { + throw new DSErrors.IA('"scope" must be an object!') + } else if (!isString(expr)) { + throw new DSErrors.IA('"expr" must be a string!') } - adapter.loaded = true; - angular.module('js-data').provider(adapter.class, function () { - var _this = this; - _this.defaults = {}; - _this.$get = [function () { - return new Adapter(_this.defaults); - }]; - }); - } - } - - angular.module('js-data', ['ng']) - .value('DSUtils', JSData.DSUtils) - .value('DSErrors', JSData.DSErrors) - .provider('DS', function () { - var _this = this; - var DSErrors = JSData.DSErrors; - var deps = []; + let idAttribute = _this.definitions[resourceName].idAttribute - for (var i = 0; i < adapters.length; i++) { - if (adapters[i].loaded) { - deps.push(adapters[i].class); + try { + return scope.$watch(() => _this.lastModified(resourceName), () => { + let items = _this.filter(resourceName, params) + if (items && items.length) { + angular.forEach(items, (item) => { + _this.compute(resourceName, get(item, idAttribute)) + }) + } + set(scope, expr, items) + if (cb) { + cb(null, items) + } + }) + } catch (err) { + if (cb) { + cb(err) + } else { + throw err } } + } - _this.defaults = {}; - - JSData.DS.prototype.bindAll = function (resourceName, params, scope, expr, cb) { - var _this = this; - - params = params || {}; - - if (!_this.definitions[resourceName]) { - throw new DSErrors.NER(resourceName); - } else if (!DSUtils.isObject(params)) { - throw new DSErrors.IA('"params" must be an object!'); - } else if (!DSUtils.isObject(scope)) { - throw new DSErrors.IA('"scope" must be an object!'); - } else if (!DSUtils.isString(expr)) { - throw new DSErrors.IA('"expr" must be a string!'); - } + JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) { + let _this = this + + id = resolveId(_this.definitions[resourceName], id) + if (!_this.definitions[resourceName]) { + throw new DSErrors.NER(resourceName) + } else if (!isString(id) && !isNumber(id)) { + throw new DSErrors.IA('"id" must be a string or a number!') + } else if (!isObject(scope)) { + throw new DSErrors.IA('"scope" must be an object!') + } else if (!isString(expr)) { + throw new DSErrors.IA('"expr" must be a string!') + } - try { - return scope.$watch(function () { - return _this.lastModified(resourceName); - }, function () { - var items = _this.filter(resourceName, params); - DSUtils.set(scope, expr, items); - if (cb) { - cb(null, items); - } - }); - } catch (err) { + try { + return scope.$watch(() => _this.lastModified(resourceName, id), () => { + let item = _this.get(resourceName, id) + if (item) { + _this.compute(resourceName, id) + } + set(scope, expr, item) if (cb) { - cb(err); - } else { - throw err; + cb(null, item) } + }) + } catch (err) { + if (cb) { + cb(err) + } else { + throw err } - }; - - JSData.DS.prototype.bindOne = function (resourceName, id, scope, expr, cb) { - var _this = this; - - id = DSUtils.resolveId(_this.definitions[resourceName], id); - if (!_this.definitions[resourceName]) { - throw new DSErrors.NER(resourceName); - } else if (!DSUtils.isString(id) && !DSUtils.isNumber(id)) { - throw new DSErrors.IA('"id" must be a string or a number!'); - } else if (!DSUtils.isObject(scope)) { - throw new DSErrors.IA('"scope" must be an object!'); - } else if (!DSUtils.isString(expr)) { - throw new DSErrors.IA('"expr" must be a string!'); - } + } + } + + function load (...args) { + let $rootScope = args[args.length - 2] + let $q = args[args.length - 1] + let store = new JSData.DS(_this.defaults) + let originals = {} + + function QPromise (executor) { + let deferred = $q.defer() try { - return scope.$watch(function () { - return _this.lastModified(resourceName, id); - }, function () { - var item = _this.get(resourceName, id); - DSUtils.set(scope, expr, item); - if (cb) { - cb(null, item); - } - }); + executor( + angular.bind(deferred, deferred.resolve), + angular.bind(deferred, deferred.reject) + ) } catch (err) { - if (cb) { - cb(err); - } else { - throw err; - } + deferred.reject(err) } - }; - - function load() { - var args = Array.prototype.slice.call(arguments); - var $rootScope = args[args.length - 2]; - var $q = args[args.length - 1]; - var store = new JSData.DS(_this.defaults); - var originals = {}; - - function QPromise(executor) { - var deferred = $q.defer(); - - try { - executor.call(undefined, - angular.bind(deferred, deferred.resolve), - angular.bind(deferred, deferred.reject)); - } catch (err) { - deferred.reject(err); - } - return deferred.promise; - } + return deferred.promise + } - QPromise.all = $q.all; - QPromise.when = $q.when; - QPromise.reject = $q.reject; + QPromise.all = $q.all + QPromise.when = $q.when + QPromise.reject = $q.reject - DSUtils.Promise = QPromise; + DSUtils.Promise = QPromise - // Register any adapters that have been loaded - if (args.length) { - for (var i = 0; i < args.length; i++) { - for (var j = 0; j < adapters.length; j++) { - if (adapters[j].loaded && !adapters[j].registered) { - adapters[j].registered = true; - store.registerAdapter(adapters[j].name, args[i]); - } + // Register any adapters that have been loaded + if (args.length) { + for (var i = 0; i < args.length; i++) { + for (var j = 0; j < adapters.length; j++) { + if (adapters[j].loaded && !adapters[j].registered) { + adapters[j].registered = true + store.registerAdapter(adapters[j].name, args[i]) + break } } } - - // Wrap certain sync functions with $apply - for (var k = 0; k < functionsToWrap.length; k++) { - originals[functionsToWrap[k]] = store[functionsToWrap[k]]; - store[functionsToWrap[k]] = (function (name) { - return function () { - var args = arguments; - if (!$rootScope.$$phase) { - return $rootScope.$apply(function () { - return originals[name].apply(store, args); - }); - } - return originals[name].apply(store, args); - }; - })(functionsToWrap[k]); - } - - // Hook into the digest loop - if (typeof Object.observe !== 'function' || typeof Array.observe !== 'function') { - $rootScope.$watch(function () { - store.observe.Platform.performMicrotaskCheckpoint(); - }); - } - - return store; } - deps.push('$rootScope'); - deps.push('$q'); - deps.push(load); - - _this.$get = deps; - }); - - - for (var i = 0; i < adapters.length; i++) { - registerAdapter(adapters[i]); - } - - if (!httpLoaded) { - var defaultsPrototype = Defaults.prototype; - - defaultsPrototype.queryTransform = function (resource, params) { - return params; - }; - - defaultsPrototype.basePath = ''; - - defaultsPrototype.forceTrailingSlash = ''; - - defaultsPrototype.httpConfig = {}; - - defaultsPrototype.log = console ? function (a, b) { - console[typeof console.info === 'function' ? 'info' : 'log'](a, b); - } : function () { - }; - - defaultsPrototype.error = console ? function (a, b) { - console[typeof console.error === 'function' ? 'error' : 'log'](a, b); - } : function () { - }; - - defaultsPrototype.deserialize = function (resource, data) { - return data ? ('data' in data ? data.data : data) : data; - }; - - defaultsPrototype.serialize = function (resource, data) { - return data; - }; - - var dsHttpAdapterPrototype = DSHttpAdapter.prototype; - - dsHttpAdapterPrototype.getPath = function (method, resourceConfig, id, options) { - var _this = this; - options = options || {}; - var args = [ - options.basePath || _this.defaults.basePath || resourceConfig.basePath, - resourceConfig.getEndpoint((DSUtils.isString(id) || DSUtils.isNumber(id) || method === 'create') ? id : null, options) - ]; - if (method === 'find' || method === 'update' || method === 'destroy') { - args.push(id); + // Wrap certain sync functions with $apply + for (var k = 0; k < functionsToWrap.length; k++) { + let name = functionsToWrap[k] + originals[name] = store[name] + store[name] = (...args) => { + if (!$rootScope.$$phase) { + return $rootScope.$apply(() => originals[name].apply(store, args)) + } + return originals[name].apply(store, args) + } } - return DSUtils.makePath.apply(DSUtils, args); - }; - dsHttpAdapterPrototype.GET = function (url, config) { - config = config || {}; - if (!('method' in config)) { - config.method = 'get'; - } - return this.HTTP(deepMixIn(config, { - url: url - })); - }; - - dsHttpAdapterPrototype.POST = function (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 - })); - }; - - dsHttpAdapterPrototype.PUT = function (url, attrs, config) { - config = config || {}; - if (!('method' in config)) { - config.method = 'put'; - } - return this.HTTP(deepMixIn(config, { - url: url, - data: attrs || {} - })); - }; - - dsHttpAdapterPrototype.DEL = function (url, config) { - config = config || {}; - if (!('method' in config)) { - config.method = 'delete'; - } - return this.HTTP(deepMixIn(config, { - url: url - })); - }; - - dsHttpAdapterPrototype.find = function (resourceConfig, id, options) { - var _this = this; - options = options || {}; - return _this.GET( - _this.getPath('find', resourceConfig, id, options), - options - ).then(function (data) { - return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data); - }); - }; - - dsHttpAdapterPrototype.findAll = function (resourceConfig, params, options) { - var _this = this; - options = options || {}; - options = DSUtils.copy(options); - options.params = options.params || {}; - if (params) { - params = _this.defaults.queryTransform(resourceConfig, params); - deepMixIn(options.params, params); + // Hook into the digest loop + if (typeof Object.observe !== 'function' || typeof Array.observe !== 'function') { + $rootScope.$watch(() => store.observe.Platform.performMicrotaskCheckpoint()) } - return _this.GET( - _this.getPath('findAll', resourceConfig, params, options), - options - ).then(function (data) { - return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data); - }); - }; - - dsHttpAdapterPrototype.create = function (resourceConfig, attrs, options) { - var _this = this; - options = options || {}; - 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); - }); - }; - - dsHttpAdapterPrototype.update = function (resourceConfig, id, attrs, options) { - var _this = this; - options = options || {}; - 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); - }); - }; - - dsHttpAdapterPrototype.updateAll = function (resourceConfig, attrs, params, options) { - var _this = this; - options = options || {}; - options = DSUtils.copy(options); - 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); - }); - }; - - dsHttpAdapterPrototype.destroy = function (resourceConfig, id, options) { - var _this = this; - options = options || {}; - return _this.DEL( - _this.getPath('destroy', resourceConfig, id, options), - options - ).then(function (data) { - return (options.deserialize ? options.deserialize : _this.defaults.deserialize)(resourceConfig, data); - }); - }; - - dsHttpAdapterPrototype.destroyAll = function (resourceConfig, params, options) { - var _this = this; - options = options || {}; - options = DSUtils.copy(options); - 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); - }); - }; - - angular.module('js-data').provider('DSHttpAdapter', function () { - 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 = deepMixIn(config, _this.defaults.httpConfig); - if (_this.defaults.forceTrailingSlash && config.url[config.url.length] !== '/') { - config.url += '/'; - } - config.method = config.method.toUpperCase(); - if (typeof config.data === 'object') { - config.data = DSUtils.removeCircular(config.data); - } - 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); - }; + return store + } - var adapter = new DSHttpAdapter(_this.defaults); - DS.registerAdapter('http', adapter, { default: true }); - return adapter; - }]; - }); + deps.push('$rootScope') + deps.push('$q') + deps.push(load) - angular.module('js-data').run(['DS', 'DSHttpAdapter', function (DS, DSHttpAdapter) { - DS.registerAdapter('http', DSHttpAdapter, { default: true }); - }]); + _this.$get = deps } - -})(window, window.angular); +} +angular.module('js-data', ['ng']) + .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]) +} + +// return the module name +module.exports = 'js-data' +try { + module.exports.name = 'js-data' +} catch (e) {} diff --git a/test/adapters/http/create.test.js b/test/adapters/http/create.test.js index 35dff6a..d692da9 100644 --- a/test/adapters/http/create.test.js +++ b/test/adapters/http/create.test.js @@ -31,6 +31,6 @@ describe('DSHttpAdapter.create', function () { $httpBackend.flush(); - assert.equal(lifecycle.queryTransform.callCount, 0, 'queryTransform should not have been called'); + assert.equal(lifecycle.queryTransform.callCount, 2, 'queryTransform should have been called twice'); }); }); diff --git a/test/adapters/http/destroy.test.js b/test/adapters/http/destroy.test.js index dc25160..8ec0df3 100644 --- a/test/adapters/http/destroy.test.js +++ b/test/adapters/http/destroy.test.js @@ -25,6 +25,6 @@ describe('DSHttpAdapter.destroy', function () { $httpBackend.flush(); - assert.equal(lifecycle.queryTransform.callCount, 0, 'queryTransform should not have been called'); + assert.equal(lifecycle.queryTransform.callCount, 2, 'queryTransform should have been called twice'); }); }); diff --git a/test/adapters/http/find.test.js b/test/adapters/http/find.test.js index 37b8c90..2c0bb95 100644 --- a/test/adapters/http/find.test.js +++ b/test/adapters/http/find.test.js @@ -25,7 +25,20 @@ describe('DSHttpAdapter.find', function () { $httpBackend.flush(); - assert.equal(lifecycle.queryTransform.callCount, 0, 'queryTransform should not have been called'); + assert.equal(lifecycle.queryTransform.callCount, 2, 'queryTransform should have been called twice'); + }); + + it('should error if the item is undefined', function () { + $httpBackend.expectGET('http://test.angular-cache.com/posts/1').respond(200); + + DSHttpAdapter.find(Post, 1).then(function () { + fail('should not have reached this'); + }).catch(function (err) { + assert.equal(err.message, 'Not Found!'); + return true; + }); + + $httpBackend.flush(); }); it('should use default configs', function () { @@ -49,4 +62,26 @@ describe('DSHttpAdapter.find', function () { delete DSHttpAdapter.defaults.httpConfig.params; delete DSHttpAdapter.defaults.httpConfig.headers; }); + + it('should use suffixes', function () { + var Thing = DS.defineResource({ + name: 'thing', + endpoint: 'things', + suffix: '.xml' + }); + + DSHttpAdapter.defaults.suffix = '.json'; + + $httpBackend.expectGET('http://test.angular-cache.com/things/1.xml').respond(200, { id: 1 }); + + DSHttpAdapter.find(Thing, 1); + + $httpBackend.expectGET('http://test.angular-cache.com/posts/1.json').respond(200, { id: 1 }); + + DSHttpAdapter.find(Post, 1); + + $httpBackend.flush(); + + DSHttpAdapter.defaults.suffix = ''; + }); }); diff --git a/test/adapters/http/update.test.js b/test/adapters/http/update.test.js index 060132e..e29c4ef 100644 --- a/test/adapters/http/update.test.js +++ b/test/adapters/http/update.test.js @@ -31,6 +31,6 @@ describe('DSHttpAdapter.update', function () { $httpBackend.flush(); - assert.equal(lifecycle.queryTransform.callCount, 0, 'queryTransform should not have been called'); + assert.equal(lifecycle.queryTransform.callCount, 2, 'queryTransform should have been called twice'); }); }); 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]); diff --git a/test/datastore/async_methods/update.test.js b/test/datastore/async_methods/update.test.js index bfb07b1..174cf0d 100644 --- a/test/datastore/async_methods/update.test.js +++ b/test/datastore/async_methods/update.test.js @@ -102,20 +102,26 @@ describe('DS.update', function () { $httpBackend.flush(); - $httpBackend.expectPUT('http://test.angular-cache.com/user/4/comment/6', { content: 'stuff' }).respond(200, testComment2); + $httpBackend.expectPUT('http://test.angular-cache.com/user/4/comment/6', { content: 'stuff', other: 'stuff' }).respond(200, testComment2); var comment = DS.inject('comment', testComment2); - function onBeforeUpdate(resourceName, attrs) { - attrs.other = 'stuff'; - assert.equal(resourceName, 'comment'); - assert.deepEqual(angular.toJson(attrs), angular.toJson({ content: 'stuff', other: 'stuff' })); + function onBeforeUpdate(resource, attrs) { + try { + attrs.other = 'stuff'; + assert.equal(angular.toJson(attrs), angular.toJson({ content: 'stuff', other: 'stuff' })); + } catch (e) { + console.log(e.stack); + } } - function onAfterUpdate(resourceName, attrs) { - assert.equal(resourceName, 'comment'); - assert.deepEqual(angular.toJson(attrs), angular.toJson(testComment2)); - assert.isFalse(testComment2 === attrs); + function onAfterUpdate(resource, attrs) { + try { + assert.deepEqual(angular.toJson(attrs), angular.toJson(testComment2)); + assert.isFalse(testComment2 === attrs); + } catch (e) { + console.log(e.stack); + } } Comment.on('DS.beforeUpdate', onBeforeUpdate); @@ -128,8 +134,12 @@ describe('DS.update', function () { approvedBy: 4 } }).then(function (comment) { - assert.deepEqual(angular.toJson(comment), angular.toJson(testComment2)); - assert.deepEqual(angular.toJson(comment), angular.toJson(DS.get('comment', 6))); + try { + assert.deepEqual(angular.toJson(comment), angular.toJson(testComment2)); + assert.deepEqual(angular.toJson(comment), angular.toJson(DS.get('comment', 6))); + } catch (e) { + console.log(e.stack); + } }, function () { fail('Should not have failed!'); }); @@ -147,8 +157,12 @@ describe('DS.update', function () { approvedBy: false } }).then(function (comment) { - assert.deepEqual(angular.toJson(comment), angular.toJson(testComment2)); - assert.deepEqual(angular.toJson(comment), angular.toJson(DS.get('comment', 6))); + try { + assert.deepEqual(angular.toJson(comment), angular.toJson(testComment2)); + assert.deepEqual(angular.toJson(comment), angular.toJson(DS.get('comment', 6))); + } catch (e) { + console.log(e.stack); + } }, function () { fail('Should not have failed!'); }); diff --git a/test/datastore/sync_methods/bindAll.test.js b/test/datastore/sync_methods/bindAll.test.js index aea4692..801b38a 100644 --- a/test/datastore/sync_methods/bindAll.test.js +++ b/test/datastore/sync_methods/bindAll.test.js @@ -13,26 +13,26 @@ describe('DS.bindAll', function () { it('should throw an error when method pre-conditions are not met', function () { assert.throws(function () { DS.bindAll('does not exist'); - }, DS.errors.NonexistentResourceError, 'does not exist is not a registered resource!'); + }, Error, 'does not exist is not a registered resource!'); angular.forEach(TYPES_EXCEPT_OBJECT, function (key) { if (key) { assert.throws(function () { DS.bindAll('post', key); - }, DS.errors.IllegalArgumentError, '"params" must be an object!'); + }, Error, '"params" must be an object!'); } }); angular.forEach(TYPES_EXCEPT_OBJECT, function (key) { assert.throws(function () { DS.bindAll('post', {}, key); - }, DS.errors.IllegalArgumentError, '"scope" must be an object!'); + }, Error, '"scope" must be an object!'); }); angular.forEach(TYPES_EXCEPT_STRING, function (key) { assert.throws(function () { DS.bindAll('post', {}, $scope, key); - }, DS.errors.IllegalArgumentError, '"expr" must be a string!'); + }, Error, '"expr" must be a string!'); }); }); it('should bind an item in the data store to the scope', function () { diff --git a/test/datastore/sync_methods/bindOne.test.js b/test/datastore/sync_methods/bindOne.test.js index 42a9564..a0f938b 100644 --- a/test/datastore/sync_methods/bindOne.test.js +++ b/test/datastore/sync_methods/bindOne.test.js @@ -13,24 +13,24 @@ describe('DS.bindOne', function () { it('should throw an error when method pre-conditions are not met', function () { assert.throws(function () { DS.bindOne('does not exist'); - }, DS.errors.NonexistentResourceError, 'does not exist is not a registered resource!'); + }, Error, 'does not exist is not a registered resource!'); angular.forEach(TYPES_EXCEPT_STRING_OR_NUMBER, function (key) { assert.throws(function () { DS.bindOne('post', key); - }, DS.errors.IllegalArgumentError, '"id" must be a string or a number!'); + }, Error, '"id" must be a string or a number!'); }); angular.forEach(TYPES_EXCEPT_OBJECT, function (key) { assert.throws(function () { DS.bindOne('post', 5, key); - }, DS.errors.IllegalArgumentError, '"scope" must be an object!'); + }, Error, '"scope" must be an object!'); }); angular.forEach(TYPES_EXCEPT_STRING, function (key) { assert.throws(function () { DS.bindOne('post', 5, $scope, key); - }, DS.errors.IllegalArgumentError, '"expr" must be a string!'); + }, Error, '"expr" must be a string!'); }); }); it('should bind an item in the data store to the scope', function () { diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..2911e48 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,35 @@ +var path = require('path') + +module.exports = { + devtool: 'source-map', + entry: { + './dist/js-data-angular.js': './src/index.js' + }, + output: { + filename: '[name]', + libraryTarget: 'umd2', + library: 'jsDataAngularModuleName' + }, + externals: { + 'js-data': { + amd: 'js-data', + commonjs: 'js-data', + commonjs2: 'js-data', + root: 'JSData' + }, + 'axios': 'axios', + 'angular': 'angular' + }, + module: { + loaders: [ + { + loader: 'babel-loader', + include: [ + path.resolve(__dirname, 'src'), + path.resolve(__dirname) + ], + test: /\.js$/ + } + ] + } +}