@granito/ngx-hal-client
Version:
A HAL client to be used in Angular projects
95 lines • 11.7 kB
JavaScript
import { catchError, map } from 'rxjs';
import * as URI from 'uri-template';
import { HalBase, objectFrom } from './internal';
/**
* This class repesents an in-memory instance of a HAL resource.
*/
export class Resource extends HalBase {
/**
* This property is `true` when either `methods` array does not exist
* in the `self` link or the array exists and contains `PUT` string.
* It is `false` otherwise.
*/
get canUpdate() {
return this.can('PUT');
}
/**
* Follow the relation link. Returns an accessor for the resource
* or `undefined` if no such relation exists.
*
* @param rel the name of the relation link
* @param params parameters for a templated link
* @returns an accessor for the linked resource or `undefined`
*/
follow(rel, params = {}) {
const link = this._links[rel];
if (!link)
return undefined;
const uri = link.href;
return !uri ? undefined :
this.accessor(!link.templated ? uri :
URI.parse(uri).expand(params), link.methods);
}
/**
* Refresh the the resource. In other words, read the resource
* identified by `self` link.
*
* @returns an observable of the refreshed resource instance
*/
read() {
const type = this.constructor;
return this.withSelf(self => this._client.get(self).pipe(map(obj => this.instanceOf(type, obj)), catchError(this.handleError)));
}
/**
* Persit the resource. Uses `PUT` request to send the new resource
* state.
*
* @returns an observable of resource accessor
*/
update() {
return this.withSelf(self => this._client.put(self, objectFrom(this)).pipe(map(() => this.accessor(self)), catchError(this.handleError)));
}
/**
* Returns a single embedded resource or `undefined` if no such
* embedded exists. If the named resource is an array it returns
* the first element.
*
* @param type the resource type
* @param rel the name of the embedded resource
* @returns the resource or `undefined`
*/
get(type, rel) {
const obj = this._embedded[rel];
if (Array.isArray(obj)) {
const objs = obj;
const first = objs[0];
return first && this.instanceOf(type, first);
}
return obj && this.instanceOf(type, obj);
}
/**
* Returns an embedded array of resources or `undefined` if the named
* embedded does not exist. If the named resource is not an array it
* wraps the resource in an array.
*
* @param type the element resource type
* @param rel the name of the embedded resource array
* @returns the resource array or `undefined`
*/
getArray(type, rel) {
const obj = this._embedded[rel];
if (Array.isArray(obj))
return this.arrayOf(type, obj);
return obj && [this.instanceOf(type, obj)];
}
clone(override = {}) {
return new this.constructor({
...this,
...override
});
}
arrayOf(type, values) {
return values.map(obj => this.instanceOf(type, obj));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Jlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYyxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBWSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTzNEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxPQUFPO0lBQ2pDOzs7O09BSUc7SUFDSCxJQUFJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsSUFBSTtZQUNMLE9BQU8sU0FBUyxDQUFDO1FBRXJCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSTtRQUNBLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUF5QixDQUFDO1FBRTVDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDdEMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDL0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTTtRQUNGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3RFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQy9CLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEdBQUcsQ0FBcUIsSUFBYSxFQUFFLEdBQVc7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksR0FBRyxHQUFlLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRCLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQXFCLElBQWEsRUFBRSxHQUFXO1FBRW5ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRVMsS0FBSyxDQUFDLFdBQWdCLEVBQUU7UUFDOUIsT0FBTyxJQUFLLElBQUksQ0FBQyxXQUEwQixDQUFDO1lBQ3hDLEdBQUcsSUFBSTtZQUNQLEdBQUcsUUFBUTtTQUNkLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyxPQUFPLENBQXFCLElBQWEsRUFDL0MsTUFBZ0I7UUFDaEIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFVSSSBmcm9tICd1cmktdGVtcGxhdGUnO1xuaW1wb3J0IHsgQWNjZXNzb3IsIEhhbEJhc2UsIG9iamVjdEZyb20gfSBmcm9tICcuL2ludGVybmFsJztcblxuLyoqXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50IHBhcmFtZXRlcnMgZm9yIHRlbXBsYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyYW1zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG5cbi8qKlxuICogVGhpcyBjbGFzcyByZXBlc2VudHMgYW4gaW4tbWVtb3J5IGluc3RhbmNlIG9mIGEgSEFMIHJlc291cmNlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2UgZXh0ZW5kcyBIYWxCYXNlIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGB0cnVlYCB3aGVuIGVpdGhlciBgbWV0aG9kc2AgYXJyYXkgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBpbiB0aGUgYHNlbGZgIGxpbmsgb3IgdGhlIGFycmF5IGV4aXN0cyBhbmQgY29udGFpbnMgYFBVVGAgc3RyaW5nLlxuICAgICAqIEl0IGlzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCBjYW5VcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbignUFVUJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9sbG93IHRoZSByZWxhdGlvbiBsaW5rLiBSZXR1cm5zIGFuIGFjY2Vzc29yIGZvciB0aGUgcmVzb3VyY2VcbiAgICAgKiBvciBgdW5kZWZpbmVkYCBpZiBubyBzdWNoIHJlbGF0aW9uIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWwgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIGxpbmtcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIGEgdGVtcGxhdGVkIGxpbmtcbiAgICAgKiBAcmV0dXJucyBhbiBhY2Nlc3NvciBmb3IgdGhlIGxpbmtlZCByZXNvdXJjZSBvciBgdW5kZWZpbmVkYFxuICAgICAqL1xuICAgIGZvbGxvdyhyZWw6IHN0cmluZywgcGFyYW1zOiBQYXJhbXMgPSB7fSk6IEFjY2Vzc29yIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMuX2xpbmtzW3JlbF07XG5cbiAgICAgICAgaWYgKCFsaW5rKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCB1cmkgPSBsaW5rLmhyZWY7XG5cbiAgICAgICAgcmV0dXJuICF1cmkgPyB1bmRlZmluZWQgOlxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NvcighbGluay50ZW1wbGF0ZWQgPyB1cmkgOlxuICAgICAgICAgICAgICAgIFVSSS5wYXJzZSh1cmkpLmV4cGFuZChwYXJhbXMpLCBsaW5rLm1ldGhvZHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggdGhlIHRoZSByZXNvdXJjZS4gSW4gb3RoZXIgd29yZHMsIHJlYWQgdGhlIHJlc291cmNlXG4gICAgICogaWRlbnRpZmllZCBieSBgc2VsZmAgbGluay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIG9ic2VydmFibGUgb2YgdGhlIHJlZnJlc2hlZCByZXNvdXJjZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHJlYWQoKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIFR5cGU8dGhpcz47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlbGYoc2VsZiA9PiB0aGlzLl9jbGllbnQuZ2V0KHNlbGYpLnBpcGUoXG4gICAgICAgICAgICBtYXAob2JqID0+IHRoaXMuaW5zdGFuY2VPZih0eXBlLCBvYmopKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyc2l0IHRoZSByZXNvdXJjZS4gVXNlcyBgUFVUYCByZXF1ZXN0IHRvIHNlbmQgdGhlIG5ldyByZXNvdXJjZVxuICAgICAqIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gb2JzZXJ2YWJsZSBvZiByZXNvdXJjZSBhY2Nlc3NvclxuICAgICAqL1xuICAgIHVwZGF0ZSgpOiBPYnNlcnZhYmxlPEFjY2Vzc29yPiB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZWxmKHNlbGYgPT4gdGhpcy5fY2xpZW50LnB1dChzZWxmLCBvYmplY3RGcm9tKHRoaXMpKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuYWNjZXNzb3Ioc2VsZikpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc2luZ2xlIGVtYmVkZGVkIHJlc291cmNlIG9yIGB1bmRlZmluZWRgIGlmIG5vIHN1Y2hcbiAgICAgKiBlbWJlZGRlZCBleGlzdHMuIElmIHRoZSBuYW1lZCByZXNvdXJjZSBpcyBhbiBhcnJheSBpdCByZXR1cm5zXG4gICAgICogdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgcmVzb3VyY2UgdHlwZVxuICAgICAqIEBwYXJhbSByZWwgdGhlIG5hbWUgb2YgdGhlIGVtYmVkZGVkIHJlc291cmNlXG4gICAgICogQHJldHVybnMgdGhlIHJlc291cmNlIG9yIGB1bmRlZmluZWRgXG4gICAgICovXG4gICAgZ2V0PFQgZXh0ZW5kcyBSZXNvdXJjZT4odHlwZTogVHlwZTxUPiwgcmVsOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdGhpcy5fZW1iZWRkZWRbcmVsXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBjb25zdCBvYmpzID0gb2JqIGFzIE9iamVjdFtdO1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBvYmpzWzBdO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlyc3QgJiYgdGhpcy5pbnN0YW5jZU9mKHR5cGUsIGZpcnN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmogJiYgdGhpcy5pbnN0YW5jZU9mKHR5cGUsIG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBlbWJlZGRlZCBhcnJheSBvZiByZXNvdXJjZXMgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIG5hbWVkXG4gICAgICogZW1iZWRkZWQgZG9lcyBub3QgZXhpc3QuIElmIHRoZSBuYW1lZCByZXNvdXJjZSBpcyBub3QgYW4gYXJyYXkgaXRcbiAgICAgKiB3cmFwcyB0aGUgcmVzb3VyY2UgaW4gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZWxlbWVudCByZXNvdXJjZSB0eXBlXG4gICAgICogQHBhcmFtIHJlbCB0aGUgbmFtZSBvZiB0aGUgZW1iZWRkZWQgcmVzb3VyY2UgYXJyYXlcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVzb3VyY2UgYXJyYXkgb3IgYHVuZGVmaW5lZGBcbiAgICAgKi9cbiAgICBnZXRBcnJheTxUIGV4dGVuZHMgUmVzb3VyY2U+KHR5cGU6IFR5cGU8VD4sIHJlbDogc3RyaW5nKTpcbiAgICAgICAgVFtdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdGhpcy5fZW1iZWRkZWRbcmVsXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlPZih0eXBlLCBvYmopO1xuXG4gICAgICAgIHJldHVybiBvYmogJiYgW3RoaXMuaW5zdGFuY2VPZih0eXBlLCBvYmopXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvbmUob3ZlcnJpZGU6IGFueSA9IHt9KTogdGhpcyB7XG4gICAgICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgVHlwZTx0aGlzPikoe1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIC4uLm92ZXJyaWRlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcnJheU9mPFQgZXh0ZW5kcyBSZXNvdXJjZT4odHlwZTogVHlwZTxUPixcbiAgICAgICAgdmFsdWVzOiBPYmplY3RbXSk6IFRbXSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMubWFwKG9iaiA9PiB0aGlzLmluc3RhbmNlT2YodHlwZSwgb2JqKSk7XG4gICAgfVxufVxuIl19