node-fractal
Version:
Output complex, flexible, AJAX/RESTful data structures.
90 lines • 3.28 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Scope = void 0;
const _1 = require(".");
const transformer_1 = require("./transformer");
class Scope {
constructor(manager, resource, scopeIdentifier) {
this.scopeIdentifier = null;
this.parentScopes = [];
this.manager = manager;
this.resource = resource;
this.scopeIdentifier = scopeIdentifier;
}
getManager() {
return this.manager;
}
getResource() {
return this.resource;
}
getScopeIdentifier() {
return this.scopeIdentifier;
}
getParentScopes() {
return this.parentScopes;
}
setParentScopes(parentScopes) {
this.parentScopes = parentScopes;
return this;
}
getIdentifier(appendIdentifier = null) {
const parts = [...this.parentScopes, this.scopeIdentifier, appendIdentifier];
return parts.filter((v) => v !== null).join(',');
}
embedChildScope(scopeIdentifier, resource) {
return this.manager.createData(resource, scopeIdentifier, this);
}
toObject() {
const rawData = this.executeResourceTransformers();
const serializer = this.manager.getSerializer();
const data = this.serializeResourceData(serializer, rawData);
const meta = this.serializeResourceMeta(serializer);
return Object.assign(Object.assign({}, data), meta);
}
executeResourceTransformers() {
const transformer = this.resource.getTransformer();
const data = this.resource.getData();
if (this.resource instanceof _1.ItemResource) {
return this.fireTransformer(transformer, data);
}
else if (this.resource instanceof _1.CollectionResource) {
const ret = [];
for (let value of data) {
ret.push(this.fireTransformer(transformer, value));
}
return ret;
}
else {
throw new Error('Argument resource should be an instance of ItemResource or CollectionResource');
}
}
fireTransformer(transformer, data) {
let transformedData = {};
let includedData = {};
if (transformer instanceof transformer_1.TransformerAbstract) {
transformer.setCurrentScope(this);
transformedData = transformer.transform(data);
includedData = transformer.processIncludedResources(this, data);
transformedData = this.manager.getSerializer().mergeIncludes(transformedData, includedData);
}
else if (typeof transformer === 'function') {
transformedData = transformer(data);
}
return transformedData;
}
serializeResourceData(serializer, data) {
const resourceKey = this.resource.getResourceKey();
if (this.resource instanceof _1.CollectionResource) {
return serializer.collection(resourceKey, data);
}
if (this.resource instanceof _1.ItemResource) {
return serializer.item(resourceKey, data);
}
return serializer.null();
}
serializeResourceMeta(serializer) {
return serializer.meta(this.resource.getMeta());
}
}
exports.Scope = Scope;
//# sourceMappingURL=scope.js.map