mirror of
https://github.com/serverless/serverless.git
synced 2026-01-18 14:58:43 +00:00
184 lines
7.1 KiB
JavaScript
184 lines
7.1 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* Serverless Plugin Boilerplate
|
|
* - Useful example/starter code for writing a plugin for the Serverless Framework.
|
|
* - In a plugin, you can:
|
|
* - Create a Custom Action that can be called via the CLI or programmatically via a function handler.
|
|
* - Overwrite a Core Action that is included by default in the Serverless Framework.
|
|
* - Add a hook that fires before or after a Core Action or a Custom Action
|
|
* - All of the above at the same time :)
|
|
*
|
|
* - Setup:
|
|
* - Make a Serverless Project dedicated for plugin development, or use an existing Serverless Project
|
|
* - Make a "plugins" folder in the root of your Project and copy this codebase into it. Title it your custom plugin name with the suffix "-dev", like "myplugin-dev"
|
|
* - Run "npm link" in your plugin, then run "npm link myplugin" in the root of your project.
|
|
* - Start developing!
|
|
*
|
|
* - Good luck, serverless.com :)
|
|
*/
|
|
|
|
module.exports = function(ServerlessPlugin) { // Always pass in the ServerlessPlugin Class
|
|
|
|
const path = require('path'),
|
|
fs = require('fs'),
|
|
BbPromise = require('bluebird'); // Serverless uses Bluebird Promises and we recommend you do to because they provide more than your average Promise :)
|
|
|
|
/**
|
|
* ServerlessPluginBoilerplate
|
|
*/
|
|
|
|
class ServerlessPluginBoilerplate extends ServerlessPlugin {
|
|
|
|
/**
|
|
* Constructor
|
|
* - Keep this and don't touch it unless you know what you're doing.
|
|
*/
|
|
|
|
constructor(S) {
|
|
super(S);
|
|
}
|
|
|
|
/**
|
|
* Define your plugins name
|
|
* - We recommend adding prefixing your personal domain to the name so people know the plugin author
|
|
*/
|
|
|
|
static getName() {
|
|
return 'com.serverless.' + ServerlessPluginBoilerplate.name;
|
|
}
|
|
|
|
/**
|
|
* Register Actions
|
|
* - If you would like to register a Custom Action or overwrite a Core Serverless Action, add this function.
|
|
* - If you would like your Action to be used programatically, include a "handler" which can be called in code.
|
|
* - If you would like your Action to be used via the CLI, include a "description", "context", "action" and any options you would like to offer.
|
|
* - Your custom Action can be called programatically and via CLI, as in the example provided below
|
|
*/
|
|
|
|
registerActions() {
|
|
|
|
this.S.addAction(this._customAction.bind(this), {
|
|
handler: 'customAction',
|
|
description: 'A custom action from a custom plugin',
|
|
context: 'custom',
|
|
contextAction: 'run',
|
|
options: [{ // These must be specified in the CLI like this "-option true" or "-o true"
|
|
option: 'option',
|
|
shortcut: 'o',
|
|
description: 'test option 1'
|
|
}],
|
|
parameters: [ // Use paths when you multiple values need to be input (like an array). Input looks like this: "serverless custom run module1/function1 module1/function2 module1/function3. Serverless will automatically turn this into an array and attach it to evt.options within your plugin
|
|
{
|
|
parameter: 'paths',
|
|
description: 'One or multiple paths to your function',
|
|
position: '0->' // Can be: 0, 0-2, 0-> This tells Serverless which params are which. 3-> Means that number and infinite values after it.
|
|
}
|
|
]
|
|
});
|
|
|
|
return BbPromise.resolve();
|
|
}
|
|
|
|
/**
|
|
* Register Hooks
|
|
* - If you would like to register hooks (i.e., functions) that fire before or after a core Serverless Action or your Custom Action, include this function.
|
|
* - Make sure to identify the Action you want to add a hook for and put either "pre" or "post" to describe when it should happen.
|
|
*/
|
|
|
|
registerHooks() {
|
|
|
|
this.S.addHook(this._hookPre.bind(this), {
|
|
action: 'functionRunLambdaNodeJs',
|
|
event: 'pre'
|
|
});
|
|
|
|
this.S.addHook(this._hookPost.bind(this), {
|
|
action: 'functionRunLambdaNodeJs',
|
|
event: 'post'
|
|
});
|
|
|
|
return BbPromise.resolve();
|
|
}
|
|
|
|
/**
|
|
* Custom Action Example
|
|
* - Here is an example of a Custom Action. Include this and modify it if you would like to write your own Custom Action for the Serverless Framework.
|
|
* - Be sure to ALWAYS accept and return the "evt" object, or you will break the entire flow.
|
|
* - The "evt" object contains Action-specific data. You can add custom data to it, but if you change any data it will affect subsequent Actions and Hooks.
|
|
* - You can also access other Project-specific data @ this.S Again, if you mess with data on this object, it could break everything, so make sure you know what you're doing ;)
|
|
*/
|
|
|
|
_customAction(evt) {
|
|
|
|
let _this = this;
|
|
|
|
return new BbPromise(function (resolve, reject) {
|
|
|
|
// console.log(evt) // Contains Action Specific data
|
|
// console.log(_this.S) // Contains Project Specific data
|
|
// console.log(_this.S.state) // Contains tons of useful methods for you to use in your plugin. It's the official API for plugin developers.
|
|
|
|
console.log('-------------------');
|
|
console.log('YOU JUST RAN YOUR CUSTOM ACTION, NICE!');
|
|
console.log('-------------------');
|
|
|
|
return resolve(evt);
|
|
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Your Custom PRE Hook
|
|
* - Here is an example of a Custom PRE Hook. Include this and modify it if you would like to write your a hook that fires BEFORE an Action.
|
|
* - Be sure to ALWAYS accept and return the "evt" object, or you will break the entire flow.
|
|
* - The "evt" object contains Action-specific data. You can add custom data to it, but if you change any data it will affect subsequent Actions and Hooks.
|
|
* - You can also access other Project-specific data @ this.S Again, if you mess with data on this object, it could break everything, so make sure you know what you're doing ;)
|
|
*/
|
|
|
|
_hookPre(evt) {
|
|
|
|
let _this = this;
|
|
|
|
return new BbPromise(function (resolve, reject) {
|
|
|
|
console.log('-------------------');
|
|
console.log('YOUR SERVERLESS PLUGIN\'S CUSTOM "PRE" HOOK HAS RUN BEFORE "FunctionRunLambdaNodeJs"');
|
|
console.log('-------------------');
|
|
|
|
return resolve(evt);
|
|
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Your Custom POST Hook
|
|
* - Here is an example of a Custom POST Hook. Include this and modify it if you would like to write your a hook that fires AFTER an Action.
|
|
* - Be sure to ALWAYS accept and return the "evt" object, or you will break the entire flow.
|
|
* - The "evt" object contains Action-specific data. You can add custom data to it, but if you change any data it will affect subsequent Actions and Hooks.
|
|
* - You can also access other Project-specific data @ this.S Again, if you mess with data on this object, it could break everything, so make sure you know what you're doing ;)
|
|
*/
|
|
|
|
_hookPost(evt) {
|
|
|
|
let _this = this;
|
|
|
|
return new BbPromise(function (resolve, reject) {
|
|
|
|
console.log('-------------------');
|
|
console.log('YOUR SERVERLESS PLUGIN\'S CUSTOM "POST" HOOK HAS RUN AFTER "FunctionRunLambdaNodeJs"');
|
|
console.log('-------------------');
|
|
|
|
return resolve(evt);
|
|
|
|
});
|
|
}
|
|
}
|
|
|
|
// Export Plugin Class
|
|
return ServerlessPluginBoilerplate;
|
|
|
|
};
|
|
|
|
// Godspeed!
|