@resin/pinejs
Version:
Pine.js is a sophisticated rules-driven API engine that enables you to define rules in a structured subset of English. Those rules are used in order for Pine.js to generate a database schema and the associated [OData](http://www.odata.org/) API. This make
225 lines (197 loc) • 8.15 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var BadRequestError, OData2AbstractSQL, ODataParser, ParsingError, Promise, TranslationError, _, deepFreeze, env, memoize, memoizeWeak, memoizedGetOData2AbstractSQL, memoizedOdata2AbstractSQL, memoizedParseOdata, metadataEndpoints, mustExtractHeader, notBadRequestOrParsingError, parseODataChangeset, permissions, ref1, sbvrUtils, splitApiRoot,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
Promise = require('bluebird');
ODataParser = require('@resin/odata-parser').ODataParser;
OData2AbstractSQL = require('@resin/odata-to-abstract-sql').OData2AbstractSQL;
memoize = require('memoizee');
memoizeWeak = require('memoizee/weak');
_ = require('lodash');
ref1 = require('./errors'), BadRequestError = ref1.BadRequestError, ParsingError = ref1.ParsingError, TranslationError = ref1.TranslationError;
deepFreeze = require('deep-freeze');
env = require('../config-loader/env');
permissions = require('./permissions');
sbvrUtils = require('./sbvr-utils');
exports.BadRequestError = BadRequestError;
exports.ParsingError = ParsingError;
exports.TranslationError = TranslationError;
exports.parseId = function(b) {
return ODataParser.matchAll(String(b), 'ExternalKeyBind');
};
exports.memoizedParseOdata = memoizedParseOdata = (function() {
var _memoizedParseOdata, odataParser, parseOdata;
odataParser = ODataParser.createInstance();
parseOdata = function(url) {
var odata, ref2;
odata = odataParser.matchAll(url, 'Process');
if (((ref2 = odata.tree.property) != null ? ref2.resource : void 0) === 'canAccess') {
odata.tree.resource = odata.tree.resource + '#' + odata.tree.property.resource;
}
return odata;
};
_memoizedParseOdata = memoize(parseOdata, {
primitive: true,
max: env.cache.parseOData.max
});
return function(url) {
if (_.includes(url, '$')) {
return parseOdata(url);
} else {
return _.cloneDeep(_memoizedParseOdata(url));
}
};
})();
memoizedGetOData2AbstractSQL = memoizeWeak(function(abstractSqlModel) {
var odata2AbstractSQL;
odata2AbstractSQL = OData2AbstractSQL.createInstance();
odata2AbstractSQL.setClientModel(abstractSqlModel);
return odata2AbstractSQL;
});
memoizedOdata2AbstractSQL = (function() {
var _memoizedOdata2AbstractSQL;
_memoizedOdata2AbstractSQL = memoizeWeak(function(abstractSqlModel, odataQuery, method, bodyKeys, existingBindVarsLength) {
var abstractSql, e, odata2AbstractSQL;
try {
odata2AbstractSQL = memoizedGetOData2AbstractSQL(abstractSqlModel);
abstractSql = odata2AbstractSQL.match(odataQuery, 'Process', [method, bodyKeys, existingBindVarsLength]);
deepFreeze(abstractSql);
return abstractSql;
} catch (error) {
e = error;
if (e instanceof permissions.PermissionError) {
throw e;
}
console.error('Failed to translate url: ', JSON.stringify(odataQuery, null, '\t'), method, e, e.stack);
throw new TranslationError('Failed to translate url');
}
}, {
normalizer: function(abstractSqlModel, arg) {
var bodyKeys, existingBindVarsLength, method, odataQuery;
odataQuery = arg[0], method = arg[1], bodyKeys = arg[2], existingBindVarsLength = arg[3];
return JSON.stringify(odataQuery) + method + bodyKeys + existingBindVarsLength;
},
max: env.cache.odataToAbstractSql.max
});
return function(request) {
var abstractSqlModel, extraBindVars, extraBodyVars, method, odataBinds, odataQuery, ref2, tree, values;
method = request.method, odataQuery = request.odataQuery, odataBinds = request.odataBinds, values = request.values;
abstractSqlModel = sbvrUtils.getAbstractSqlModel(request);
ref2 = _memoizedOdata2AbstractSQL(abstractSqlModel, odataQuery, method, _.keys(values).sort(), odataBinds.length), tree = ref2.tree, extraBodyVars = ref2.extraBodyVars, extraBindVars = ref2.extraBindVars;
_.assign(values, extraBodyVars);
odataBinds.push.apply(odataBinds, extraBindVars);
return tree;
};
})();
exports.metadataEndpoints = metadataEndpoints = ['$metadata', '$serviceroot'];
notBadRequestOrParsingError = function(e) {
return !((e instanceof BadRequestError) || (e instanceof ParsingError));
};
exports.parseOData = function(b) {
return Promise["try"](function() {
var apiRoot, csReferences, odata, ref2, sortedCS, url;
if (b._isChangeSet) {
csReferences = new Map();
sortedCS = _.sortBy(b.changeSet, function(el) {
return !(el.url[0] === '/');
});
return Promise.reduce(sortedCS, parseODataChangeset, csReferences).then(function(csReferences) {
return Array.from(csReferences.values());
});
} else {
ref2 = splitApiRoot(b.url), url = ref2.url, apiRoot = ref2.apiRoot;
odata = memoizedParseOdata(url);
return {
method: b.method,
url: url,
vocabulary: apiRoot,
resourceName: odata.tree.resource,
odataBinds: odata.binds,
odataQuery: odata.tree,
values: b.data,
custom: {},
_defer: false
};
}
})["catch"](SyntaxError, function(e) {
throw new BadRequestError("Malformed url: '" + b.url + "'");
})["catch"](notBadRequestOrParsingError, function(e) {
console.error('Failed to parse url: ', b.method, b.url, e, e.stack);
throw new ParsingError("Failed to parse url: '" + b.url + "'");
});
};
parseODataChangeset = function(csReferences, b) {
var apiRoot, bind, contentId, defer, id, odata, parseResult, ref, ref2, ref3, tag, url;
contentId = mustExtractHeader(b, 'content-id');
if (csReferences.has(contentId)) {
throw new BadRequestError('Content-Id must be unique inside a changeset');
}
if (b.url[0] === '/') {
ref2 = splitApiRoot(b.url), url = ref2.url, apiRoot = ref2.apiRoot;
odata = memoizedParseOdata(url);
defer = false;
} else {
url = b.url;
odata = memoizedParseOdata(url);
bind = odata.tree.resource.bind;
ref3 = odata.binds[bind], tag = ref3[0], id = ref3[1];
ref = csReferences.get(id);
if (_.isUndefined(ref)) {
throw new BadRequestError('Content-Id refers to a non existent resource');
}
apiRoot = ref.vocabulary;
odata.tree.resource = ref.resourceName;
defer = true;
}
parseResult = {
method: b.method,
url: url,
vocabulary: apiRoot,
resourceName: odata.tree.resource,
odataBinds: odata.binds,
odataQuery: odata.tree,
values: b.data,
custom: {},
id: contentId,
_defer: defer
};
csReferences.set(contentId, parseResult);
return csReferences;
};
splitApiRoot = function(url) {
var apiRoot;
url = url.split('/');
apiRoot = url[1];
if (apiRoot == null) {
throw new ParsingError('No such api root: ' + apiRoot);
}
url = '/' + url.slice(2).join('/');
return {
url: url,
apiRoot: apiRoot
};
};
mustExtractHeader = function(body, header) {
var h, ref2;
h = (ref2 = body.headers[header]) != null ? ref2[0] : void 0;
if (_.isUndefined(h)) {
throw new BadRequestError(header + " must be specified");
}
return h;
};
exports.translateUri = function(request) {
var abstractSqlQuery, isMetadataEndpoint, ref2;
if (request.abstractSqlQuery != null) {
return request;
}
isMetadataEndpoint = (ref2 = request.resourceName, indexOf.call(metadataEndpoints, ref2) >= 0) || request.method === 'OPTIONS';
if (!isMetadataEndpoint) {
abstractSqlQuery = memoizedOdata2AbstractSQL(request);
request = _.clone(request);
request.abstractSqlQuery = abstractSqlQuery;
return request;
}
return request;
};
}).call(this);
//# sourceMappingURL=uri-parser.js.map