{"version":3,"sources":["jsdelivr-header.js","/npm/ac-koa@0.2.6/lib/index.js"],"names":[],"mappings":"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","file":"/npm/ac-koa@0.2.6/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ac-koa@0.2.6/lib/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","var _ = require('lodash');\nvar co = require('co');\nvar koa = require('koa');\nvar json = require('koa-json');\nvar mount = require('koa-mount');\nvar logger = require('koa-logger');\nvar compose = require('koa-compose');\nvar router = require('koa-router');\nvar helmet = require('koa-helmet');\nvar request = require('request');\nvar winston = require('winston');\nvar ac = require('ac-node');\nvar Config = ac.Config;\nvar RedisStore = ac.RedisStore;\nvar Tenants = ac.Tenants;\nvar WebhookManager = ac.WebhookManager;\nvar adapters = require('./adapters');\nvar util = require('./util');\n\nvar ack = module.exports = function (options, services) {\n  options = options || {};\n  services = _.extend({}, services);\n  var config = Config(options);\n  services.store = createStore(services.store, config);\n  services.httpClient = services.httpClient || request;\n  var app = ack.app(config, services);\n\n  app.addon = function (scope, descriptor) {\n    if (typeof scope === 'object') {\n      descriptor = scope;\n      scope = null;\n    }\n    scope = scope || '';\n\n    if (!descriptor) {\n      return adapters.factories(app, scope);\n    }\n\n    var scopePath = '/' + scope;\n    var baseUrl = config.LOCAL_BASE_URL + (scope ? scopePath : '');\n    var addon = koa();\n    addon.logger = app.logger;\n    addon.use(ack.middleware(app.env, baseUrl));\n    addon.use(router(addon));\n    app.use(mount(scopePath, addon));\n    var addonStore = services.store;\n\n    if (scope) {\n      addon.name = scope;\n      addonStore = addonStore.narrow(scope);\n    }\n\n    var appEvents = app;\n    var addonEvents = addon;\n    var tenantStore = addonStore.narrow('tenant');\n    var tenants = Tenants(tenantStore);\n\n    var adapterServices = {\n      store: tenantStore,\n      tenants: tenants,\n      httpClient: services.httpClient,\n      webhookManager: WebhookManager(addonStore.narrow('webhook'))\n    };\n\n    var adapter = adapters.create(descriptor, baseUrl, adapterServices, options, config);\n\n    if (scope) {\n      // TODO: we only need to explicitly iterate a defined set of webhook events because EventEmitter\n      //       doesn't support wildcard subscriptions; look into using EventEmitter2 instead?\n      adapter.webhookEvents.forEach(function (event) {\n        addonEvents.on(event, function () {\n          var key = scope + ':' + event;\n          var args = [].slice.call(arguments);\n          appEvents.emit.apply(appEvents, [key].concat(args));\n        });\n      });\n    }\n\n    function onWebhook(event, definition, callback) {\n      addonEvents.on(event, function (context) {\n        var def = definition;\n        co(function *() {\n          if (!def) {\n            var name = context.query.name;\n            if (name) {\n              def = yield adapter.webhookFor(addon.descriptor, context.tenant, name, context);\n            }\n          }\n          var fire = true;\n          if (def) {\n            fire = adapter.prepareWebhook(def, context);\n          }\n          if (fire) {\n            if (util.isGeneratorFunction(callback)) {\n              co(callback).call(context);\n            } else {\n              callback.call(context);\n            }\n          }\n        }).call(context);\n      });\n    }\n\n    var builder = adapter.builder(descriptor, {\n\n      addWebhook: function (definition, callback) {\n        if (callback) {\n          onWebhook(definition.event, definition, callback);\n        }\n      },\n\n      ready: function (builtDescriptor) {\n        var finalDescriptor = adapter.transform(builtDescriptor);\n        adapter.validate(finalDescriptor);\n        addon.descriptor = finalDescriptor;\n\n        var middleware = adapter.ready(finalDescriptor, addonEvents);\n\n        // descriptor redirect\n        addon.get('/', function *() {\n          if (this.accepts('html', 'json') === 'json') {\n            this.redirect(baseUrl + adapter.descriptorPath);\n          }\n        });\n\n        // get descriptor\n        addon.get(adapter.descriptorPath, function *() {\n          this.body = finalDescriptor;\n        });\n\n        // adapter-specific middleware\n        addon.use(mount(middleware));\n      }\n\n    });\n\n    addon.authenticate = function (options) {\n      return function *(next) {\n        yield adapter.authenticator(app.env, options);\n        yield adapter.decorator(app.env, addon.descriptor);\n        yield next;\n      };\n    };\n\n    addon.onWebhook = function (event, callback) {\n      onWebhook(event, null, callback);\n    };\n\n    return _.extend(addon, builder);\n  };\n\n  var listen = app.listen;\n\n  app.listen = function (next) {\n    return listen.call(app, config.PORT, function (err) {\n      if (err) {\n        app.logger.error(err.stack || err);\n        if (next) {\n          next(err);\n        }\n        return;\n      }\n      app.logger.info('Atlassian Connect add-on started at ' + config.LOCAL_BASE_URL);\n      if (next) {\n        next();\n      }\n    });\n  };\n\n  return app;\n};\n\nack.require = function (adapterName, _adapter) {\n  adapters.require(adapterName, _adapter);\n  return this;\n};\n\nack.app = function (config, services) {\n  var app = koa();\n  app.config = config;\n  _.extend(app, services);\n  if (app.env !== 'test') {\n    app.use(logger());\n  }\n  app.logger = new winston.Logger({\n    transports: [\n      new winston.transports.Console({\n        level: app.env === 'production' ? 'info' : (app.env === 'test' ? 'error' : 'debug'),\n        colorize: app.env !== 'production'\n      })\n    ]\n  });\n  app.on('error', function (err) {\n    if (app.env !== 'test' || !err.status || err.status >= 500) {\n      app.logger.error(err.stack || err);\n    }\n  });\n  return app;\n};\n\nack.middleware = function (nodeEnv, localBaseUrl) {\n  // configure a common stack of middleware as appropriate to AC addons\n  return compose([\n    ack.helmet(nodeEnv, localBaseUrl),\n    json({\n      pretty: nodeEnv !== 'production',\n      param: 'pretty'\n    })\n    // TODO: moar warez\n  ]);\n};\n\nack.helmet = function (nodeEnv, localBaseUrl) {\n  return function *(next) {\n    if (nodeEnv === 'production') {\n      // TODO: complete helmet config as appropriate to AC addons\n      //yield helmet.xframe('allow-from', localBaseUrl);\n    }\n    yield next;\n  };\n};\n\nfunction createStore(service, config) {\n  if (typeof service === 'object') return service;\n  var factory;\n  if (typeof service === 'function') {\n    factory = service;\n  } else if (typeof service === 'string' && ac[service] && ac[service].create) {\n    factory = ac[service].create;\n  }\n  if (!factory) {\n    factory = RedisStore.create;\n  }\n  return factory(config, 'ack');\n}\n"]}