{"version":3,"sources":["jsdelivr-header.js","/npm/loopback-connector-flexirest@2.1.2/index.js"],"names":[],"mappings":"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","file":"/npm/loopback-connector-flexirest@2.1.2/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/loopback-connector-flexirest@2.1.2/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\nvar debug = require('debug')('loopback:connector:flexirest');\nvar RestConnector = require('loopback-connector-rest');\nvar path = require('path');\nvar walk = require('./lib/walk');\nvar url = require('url');\nvar transformerLib = require('./lib/transformer');\n\n/**\n * Export the initialize method to loopback-datasource-juggler\n * @param {DataSource} dataSource The loopback data source instance\n * @param {function} [callback] The callback function\n */\nexports.initialize = function initializeDataSource(dataSource, callback) {\n    var settings = dataSource.settings || {};\n    var endpointPath = settings.path || 'endpoints';\n    var baseURL = settings.baseURL || settings.restPath || '';\n\n    // load endpoints folder and add to operations for loopback-connector-rest\n    if (endpointPath) {\n       var endpointTemplates = walk(path.resolve(endpointPath),'json');\n\n       settings.operations = [];\n       endpointTemplates.forEach(function(templateFile){\n\n           debug('Found JSON file', templateFile);\n           var defintion = require(templateFile);\n           defintion.file = templateFile;\n\n           if(defintion && defintion.template && defintion.functions) {\n               // file is a template json file\n               debug('Adding template to settings.operations');\n\n               if (baseURL) {\n                   defintion.template.url = url.resolve(baseURL, defintion.template.url);\n               }\n\n               settings.operations.push(defintion);\n           }\n       });\n   }\n\n   RestConnector.initialize(dataSource, callback);\n   applyTransformerPatch(dataSource);\n   autoloadFunctions(dataSource);\n};\n\nvar applyTransformerPatch = function(dataSource) {\n\n    var dao = dataSource.connector.DataAccessObject;\n    var connector = dataSource.connector;\n\n    Object.keys(dao).filter(function(key){\n        return key !== 'invoke';\n    }).forEach(function(key){\n        var originalfn = dao[key];\n        debug('patched function', key);\n\n        var argsList = originalfn.accepts.map(function(param){\n            return param.arg;\n        });\n\n        var newfn = function(cb){\n\n            var self = this;\n            var context = {'name':key};\n            var cb = null;\n            if (arguments.length > 0\n                    && 'function' === typeof arguments[arguments.length - 1]) {\n                cb = arguments[arguments.length - 1];\n            }\n\n            context.parameters = {};\n            var argsLength = arguments.length;\n\n            Array.prototype.slice.call(arguments)\n            .filter(function(arg,index){\n                // to avoid callback being added to\n                // parameters\n                return index < (argsLength -1);\n            })\n            .forEach(function(arg,index){\n                context.parameters[argsList[index]] = arg;\n            })\n\n            function outgoingTransform(context, done) {\n\n                if(self[key].outgoingTransform) {\n                    debug('outgoingTransform called');\n                    var transformedOutput = null;\n                    try {\n                        transformedOutput = self[key].outgoingTransform(context.parameters);\n\n                        if(typeof transformedOutput !== 'object')\n                            done(new Error('transformedOutput is not an object'));\n\n                        Object.keys(context.parameters).filter(function(property){\n                            return !transformedOutput.hasOwnProperty(property);\n                        }).forEach(function(property){\n                            transformedOutput[property] = context.parameters[property];\n                        });\n\n                        context.parameters = transformedOutput;\n                        done();\n                    } catch (e) {\n                        done(e);\n                    }\n                } else {\n                    done();\n                }\n            }\n\n            function errorHandler(err, body, response,done) {\n\n                if(self[key].errorHandler) {\n                    debug('errorHandler called');\n                    self[key].errorHandler(err, body, response, done);\n                } else {\n                    done(err, body, response);\n                }\n            }\n\n            function incomingTransform(context, done) {\n\n                if(self[key].incomingTransform) {\n                    debug('incomingTransform called');\n                    try {\n                        context.body = self[key].incomingTransform(context.body);\n                    } catch (e) {\n                        done(e);\n                    }\n                }\n                done(null, context.body, context.response);\n            }\n\n            connector.notifyObserversAround('outgoingTransform', context, outgoingTransform, function(err) {\n\n                //TODO: fix it properly\n                if(err)\n                    return cb(err);\n\n                context.parameters = argsList.map(function(property){\n                    return context.parameters[property];\n                });\n\n                var callback = function(err, body, response) {\n                    errorHandler(err,body,response,function(err,body,response){\n                        if(err) {\n                            cb(err, body, response);\n                        } else {\n                            delete context.parameters;\n                            context.body = body;\n                            context.response = response;\n                            connector.notifyObserversAround('incomingTransform', context, incomingTransform, function(err, body, response){\n                                cb(err, body, response);\n                            });\n                        }\n                    });\n                }\n\n                context.parameters.push(callback);\n                originalfn.apply(this, context.parameters);\n            });\n        };\n\n        ['accepts','returns','shared','http'].forEach(function(prop){\n            newfn[prop] = originalfn[prop];\n        });\n\n        dao[key] = newfn;\n    });\n};\n\nvar autoloadFunctions = function(dataSource) {\n\n    var dao = dataSource.connector.DataAccessObject;\n    var functionList = ['errorHandler','incomingTransform','outgoingTransform'];\n\n    var transformer = null;\n    if(dataSource.settings.transformer && dataSource.settings.transformer.library\n    && dataSource.settings.transformer.ext){\n        transformer = transformerLib(dataSource.settings.transformer.library);\n    }\n\n    dataSource.settings.operations.forEach(function(defintion){\n        functionList.forEach(function(name){\n            var handlerString = defintion[name];\n            if(handlerString) {\n                var handler = null;\n                // check if template is used for transformation. Only for\n                // incoming and outgoing tranformation with transformer defined\n                if(name !== 'errorHandler'&& transformer\n                && handlerString.indexOf(dataSource.settings.transformer.ext) !== -1) {\n                    var templateFile = path.join(path.dirname(defintion.file),\n                        handlerString);\n                    handler = transformer.createFunction(templateFile);\n                    debug('loading file for transformation',templateFile);\n                } else {\n                    handler = loadHandler(path.dirname(defintion.file),\n                         handlerString);\n                }\n\n                if(handler) {\n                    for (var f in defintion.functions) {\n                        debug('autoloading function',name,'for',f);\n                        dao[f][name] = handler;\n                    }\n                }\n            }\n        });\n\n        if(defintion.hasOwnProperty('shared')) {\n            var sharedFlag = defintion['shared'];\n            for (var f in defintion.functions) {\n                debug('marking function', f ,' with shared flag as',sharedFlag);\n                dao[f]['shared'] = sharedFlag;\n            }\n        }\n    });\n};\n\nvar loadHandler = function(dir, handlerString) {\n    var filename = handlerString.split('.')[0];\n    var functionName = handlerString.split('.')[1];\n\n    var fn = null;\n    try {\n        fn = require(path.join(dir,filename))[functionName];\n    } catch(e) {\n        //ignore the error and dont load the function\n    }\n    return fn;\n};\n"]}