diff --git a/Frontend/projects/edu-sharing-api/README.md b/Frontend/projects/edu-sharing-api/README.md index 6863e7ee5f..03fd538e67 100644 --- a/Frontend/projects/edu-sharing-api/README.md +++ b/Frontend/projects/edu-sharing-api/README.md @@ -26,6 +26,52 @@ Import `EduSharingApiModule` in your app module: export class AppModule {} ``` +### Using a Development Version of Ngx Edu-Sharing Api + +- Build the library as described in [Build](#build). +- In `dist/edu-sharing-api`, run + ```sh + npm link + ``` +- In the project directory where you want to use Ngx Edu-Sharing Api, run + ```sh + npm link npx-edu-sharing-api + ``` + +You might need to add the following paths to the `tsconfig.json` of your project: + +```json +{ + "compilerOptions": { + "paths": { + "rxjs": ["./node_modules/rxjs"], + "rxjs/*": ["./node_modules/rxjs/*"], + "@angular/*": ["./node_modules/@angular/*"] + } + } +} +``` + +Also, in your `angular.json` you will have to set + +```json +{ + "projects": { + "": { + "architect": { + "build": { + "configurations": { + "development": { + "preserveSymlinks": true + } + } + } + } + } + } +} +``` + ## Configuration | Parameter | Description | Example | @@ -86,31 +132,32 @@ export class EduSharingService { If not stated otherwise, methods will throw errors of type `ApiErrorResponse` (see [Error Handling](#error-handling)). ### `Observable`s + This library uses `Observable`s as return types. There are methods that -- trigger a request and return the result with an `Observable`. - This is the behavior of most methods re-exported from `./lib/api/services` and some wrapped - methods. - Names of these methods usually start wit `get` (except re-exported). - Example: `search.getPage()`. -- trigger a request but yield no result. - This is the behavior of some methods re-exported from `./lib/api/services` and some wrapped - methods. - Names of these methods usually don't have a prefix and are named as an action. - Example: `search.loadMoreFacets()`. - :warning: Do not forget to subscribe to the returned `Observable` anyway! -- return a cached result with an `Observable`. - Names of these methods usually start wit `get`. - This is only done when we know it is safe to return old values. You can use these methods like - normal API methods, but we safe some requests. - Example: `about.getAbout()`. -- return a result each time its value changes. - Names of these methods start wit `observe`. - We provide these methods when we have a way of knowing when to refetch information. You can just - subscribe for as long as you need updated information and not care about requests. - Example: `search.observeFacets()`. - :warning: Do not forget to unsubscribe when you don't need the values anymore! - :warning: These `Observable`s will never complete! +- trigger a request and return the result with an `Observable`. + This is the behavior of most methods re-exported from `./lib/api/services` and some wrapped + methods. + Names of these methods usually start wit `get` (except re-exported). + Example: `search.getPage()`. +- trigger a request but yield no result. + This is the behavior of some methods re-exported from `./lib/api/services` and some wrapped + methods. + Names of these methods usually don't have a prefix and are named as an action. + Example: `search.loadMoreFacets()`. + :warning: Do not forget to subscribe to the returned `Observable` anyway! +- return a cached result with an `Observable`. + Names of these methods usually start wit `get`. + This is only done when we know it is safe to return old values. You can use these methods like + normal API methods, but we safe some requests. + Example: `about.getAbout()`. +- return a result each time its value changes. + Names of these methods start wit `observe`. + We provide these methods when we have a way of knowing when to refetch information. You can just + subscribe for as long as you need updated information and not care about requests. + Example: `search.observeFacets()`. + :warning: Do not forget to unsubscribe when you don't need the values anymore! + :warning: These `Observable`s will never complete! ### Things to Keep in Mind When Using This Library @@ -203,7 +250,7 @@ export class FooComponent implements OnInit, OnDestroy { } ``` -## Error Handling +### Error Handling This library allows to define a default error handler `onError`, that will be called on all HTTP errors (see [Configuration](#configuration)). @@ -212,13 +259,19 @@ You can choose to prevent this for individual calls by catching the error and ca `preventDefault()` on it: ```ts -this.searchApi.search({ /* ... */ }).subscribe({ - next: (results) => { /* handle results */ }, - error: (err: ApiErrorResponse) => { - /* handle error in a way that makes the default error handler obsolete */ - err.preventDefault(); - }, -}); +this.searchApi + .search({ + /* ... */ + }) + .subscribe({ + next: (results) => { + /* handle results */ + }, + error: (err: ApiErrorResponse) => { + /* handle error in a way that makes the default error handler obsolete */ + err.preventDefault(); + }, + }); ``` You can also choose to do additional error handling and also run the default error handler by not diff --git a/Frontend/projects/edu-sharing-api/package-lock.json b/Frontend/projects/edu-sharing-api/package-lock.json index 554d0c2caf..8d16a67976 100644 --- a/Frontend/projects/edu-sharing-api/package-lock.json +++ b/Frontend/projects/edu-sharing-api/package-lock.json @@ -1,9 +1,362 @@ { "name": "ngx-edu-sharing-api", - "version": "0.3.0", - "lockfileVersion": 1, + "version": "0.4.0", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "ngx-edu-sharing-api", + "version": "0.4.0", + "license": "GNU GPL v2", + "dependencies": { + "tslib": "^2.3.0" + }, + "devDependencies": { + "ng-openapi-gen": "^0.19.0", + "prettier": "^2.4.1" + }, + "peerDependencies": { + "@angular/common": "^12.2.0 || ^13.0.0", + "@angular/core": "^12.2.0 || ^13.0.0", + "rxjs": "^6.6.3" + } + }, + "node_modules/@angular/common": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.2.tgz", + "integrity": "sha512-tQ2dKh5v/a0Nz6EXguw/vyms8VeRhcZO0F2xd9C+UdS3DVBftC1milluWGpjXdkLijTlJBCr114aXyZsyjNf3g==", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/core": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.2.tgz", + "integrity": "sha512-e+3eyV1AaiiP/3L82BKi5WowAYzsOmSfzYdT4utQScuTjbtNhIo4NvlpSRwk51QRYR9XsqinHO3SfEX2eMPSGA==", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.3.0.tgz", + "integrity": "sha512-TYfxx36xfl52Rf1LU9HyWSLGPdYLL+SQ8/E/0yVyKG8wCCDaSrhPap0vEdlsZWRaS6tnKKLPGiEJGiREVC8kxQ==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ng-openapi-gen": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/ng-openapi-gen/-/ng-openapi-gen-0.19.0.tgz", + "integrity": "sha512-GGWyqBqDIKiZR8gGb51s2eifa9Lp7NAidvPeEjzwmDR4leNuNL770iMu5+4pSjDSS0Za96upwXIADVMbC1NkNQ==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.7", + "argparse": "^2.0.1", + "eol": "^0.9.1", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.7", + "jsesc": "^3.0.2", + "json-schema": "^0.3.0", + "lodash": "^4.17.21", + "mkdirp": "^1.0.4", + "typescript": "^4.2.3" + }, + "bin": { + "ng-openapi-gen": "lib/index.js" + }, + "peerDependencies": { + "@angular/core": ">=7.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "peer": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/zone.js": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + } + }, "dependencies": { + "@angular/common": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.2.tgz", + "integrity": "sha512-tQ2dKh5v/a0Nz6EXguw/vyms8VeRhcZO0F2xd9C+UdS3DVBftC1milluWGpjXdkLijTlJBCr114aXyZsyjNf3g==", + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/core": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.2.tgz", + "integrity": "sha512-e+3eyV1AaiiP/3L82BKi5WowAYzsOmSfzYdT4utQScuTjbtNhIo4NvlpSRwk51QRYR9XsqinHO3SfEX2eMPSGA==", + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, "@apidevtools/json-schema-ref-parser": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", @@ -162,6 +515,23 @@ "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "peer": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -197,6 +567,15 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true + }, + "zone.js": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "peer": true, + "requires": { + "tslib": "^2.3.0" + } } } } diff --git a/Frontend/projects/edu-sharing-api/package.json b/Frontend/projects/edu-sharing-api/package.json index ec5548fc2e..a5bb47a802 100644 --- a/Frontend/projects/edu-sharing-api/package.json +++ b/Frontend/projects/edu-sharing-api/package.json @@ -1,6 +1,6 @@ { "name": "ngx-edu-sharing-api", - "version": "0.3.0", + "version": "0.4.0", "license": "GNU GPL v2", "description": "Angular bindings for Edu-Sharing's API", "repository": {