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
JavaScript
;
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