UNPKG

@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
// 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