UNPKG

serverless-offline-local-authorizers-plugin

Version:

[Serverless](http://www.serverless.com) plugin for adding authorizers when developing and testing functions locally with [serverless-offline](https://github.com/dherault/serverless-offline).

118 lines 5.78 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsLocalAuthorizerPlugin = void 0; class AwsLocalAuthorizerPlugin { constructor(serverless, options) { this.serverless = serverless; this.options = options; if (this.serverless.service.provider.name !== "aws") { throw new this.serverless.classes.Error("aws-local-authorizers plugin only supports AWS as provider."); } this.commands = { offline: { commands: { "local-authorizers": { usage: "Replaces authorizers with local functions for offline testing", lifecycleEvents: [ "applyLocalAuthorizers", "start", ], }, }, }, }; this.serverless.configSchemaHandler.defineFunctionEventProperties('aws', 'http', { properties: { localAuthorizer: { type: "object", properties: { name: { type: "string" }, type: { anyOf: ['token', 'cognito_user_pools', 'request', 'aws_iam'].map(v => ({ type: 'string', regexp: new RegExp(`^${v}$`, 'i').toString() })), }, } }, }, }); this.hooks = { "offline:local-authorizers:applyLocalAuthorizers": () => this.applyLocalAuthorizers(), "after:offline:local-authorizers:start": () => this.serverless.pluginManager.run(["offline", "start"]), }; } applyLocalAuthorizers() { return __awaiter(this, void 0, void 0, function* () { const localAuthorizers = this.appendLocalAuthorizers(); if (!localAuthorizers || !Object.keys(localAuthorizers).length) { this.serverless.cli.log(`No local authorizers found.`, "serverless-offline-local-authorizers-plugin", { color: "yellow" }); return; } const functions = this.serverless.service.functions; for (const functionName of Object.keys(functions)) { const functionDef = functions[functionName]; if (functionDef && Array.isArray(functionDef.events)) { for (const event of functionDef.events) { if (!event.http) { continue; } const http = event.http; let localAuthorizerDef = (http.authorizer && http.authorizer.localAuthorizer) ? http.authorizer.localAuthorizer : http.localAuthorizer; if (typeof localAuthorizerDef === "string") { localAuthorizerDef = { name: localAuthorizerDef }; } if (localAuthorizerDef) { if (localAuthorizers[localAuthorizerDef.name]) { const mockFnName = localAuthorizers[localAuthorizerDef.name]; http.authorizer = { name: mockFnName, type: localAuthorizerDef.type || "token", }; } else { this.serverless.cli.log(`Invalid or unknown local authorizer '${JSON.stringify(localAuthorizerDef)}'`, "serverless-offline-local-authorizers-plugin", { color: "yellow" }); } } } } } }); } appendLocalAuthorizers() { const authorizersFile = `${this.serverless.config.servicePath}/local-authorizers.js`; let authorizers = {}; try { authorizers = require(authorizersFile); } catch (err) { this.serverless.cli.log(`Unable to load local authorizers from ${authorizersFile}`, "serverless-offline-local-authorizers-plugin", { color: "red" }); return null; } return Object.keys(authorizers).reduce((prev, authorizerName) => { const functionKey = `$__LOCAL_AUTHORIZER_${authorizerName}`; this.serverless.service.functions[functionKey] = { memorySize: 256, timeout: 30, handler: "local-authorizers." + authorizerName, events: [], name: `${this.serverless.service.service}-${this.options.stage}-${authorizerName}`, package: { include: ['local-authorizers.js'], exclude: [] }, runtime: "nodejs12.x" }; prev[authorizerName] = functionKey; return prev; }, {}); } } exports.AwsLocalAuthorizerPlugin = AwsLocalAuthorizerPlugin; //# sourceMappingURL=AwsLocalAuthorizersPlugin.js.map