povery-cli v0.0.21
Povery CLI
Overview
Povery is a framework for developing AWS Lambda functions with TypeScript. This CLI tool facilitates local development, testing, and deployment of serverless applications.
Povery CLI enables developers to:
- Locally serve multiple Lambda functions as an HTTP server
- Invoke Lambda functions locally via terminal
- Deploy Lambda functions to AWS environments
Unlike other serverless frameworks, Povery CLI focuses exclusively on Lambda function management without infrastructure provisioning. This adheres to the principle of separation of concerns between application logic and infrastructure management.
Technical Foundation
The local development server functionality is built on top of the Serverless Framework, leveraging its offline capabilities to simulate AWS Lambda and API Gateway locally. This integration provides a high-fidelity local development experience that closely mirrors the AWS production environment while maintaining a streamlined developer workflow.
Project Structure Requirements
The CLI requires a specific project structure:
/<project_root>
lambda/
API_Something/
index.ts
EVENT_Something/
index.ts
event.json
povery.jsonNaming Conventions
- All Lambda functions must reside in the
lambda/directory - Each Lambda function requires
index.tsas its entry point - API Gateway Lambda functions must:
- Use proxy integration for API requests
- Use the prefix
API_(e.g.,API_UserService) - Start with a capital letter
- Event-driven Lambda functions must:
- Use the prefix
EVENT_(e.g.,EVENT_DataProcessor) - Start with a capital letter
- Use the prefix
Installation
Local Installation (Recommended)
npm i -D povery-cliAdd to your package.json:
{
"scripts": {
"povery": "povery-cli"
}
}Usage:
npm run poveryWhen passing options:
npm run povery function deploy API_UserService -- --stage devGlobal Installation
npm i -g povery-cliUsage
Command Reference
povery-cli --helpStart Command
povery-cli start [options]Options:
-t, --timeout <seconds>: Set the Lambda timeout in seconds (default: 30)
Local API Testing
Configure routes in povery.json:
{
"lambdas": {
"API_UserService": [
{
"method": "ANY",
"path": "/{proxy+}"
}
]
}
}Start the local server:
povery-cli startYou can customize the Lambda timeout for local development:
povery-cli start --timeout 60This sets the Lambda timeout to 60 seconds (default is 30 seconds) which is useful for debugging or when working with long-running operations.
By default, Lambda functions have a 30-second timeout when running locally. If you're experiencing timeout issues during debugging or when working with long-running operations, you can increase this limit using the --timeout parameter.
Local Lambda Invocation
Execute a Lambda function with the event.json file in its directory:
povery-cli function invoke EVENT_DataProcessorModule Resolution
When sharing code between Lambda functions, use TypeScript path aliases instead of relative imports:
// Incorrect - will break transpilation
import { Something } from '../../common/something.ts';
// Correct
import { Something } from '@common/something.ts';Configure tsconfig.json with appropriate path mappings:
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@common/*": "common/*",
"povery": "node_modules/povery"
}
}
}The explicit povery path mapping prevents esbuild transpilation issues.
Configuration Options
The povery.json file supports the following configuration options:
deployStrategy
""(empty string): Deploys Lambda functions without prefix or alias (e.g.,API_UserService)STAGE_PREFIX: Deploys with stage name as prefix (e.g.,dev_API_UserService)STAGE_ALIAS: Deploys with stage name as alias (e.g.,API_UserService:dev)
installScript
Specifies a custom script to run instead of the default npm install during Lambda build.
esbuild
Provides configuration options for esbuild:
{
"esbuild": {
"external": ["pg"]
}
}This is particularly useful for:
- Excluding libraries that should be deployed as Lambda Layers
- Handling libraries with compilation errors or dynamic imports
- Optimizing large dependencies that could impact cold start performance
Deployment
Single Lambda Deployment
Interactive mode:
povery-cli functionDirect deployment:
povery-cli function deploy <lambda_name>Batch Deployment
Deploy all Lambda functions (ideal for CI/CD pipelines):
povery-cli deployFunction Building Process
Povery CLI follows a structured process when building Lambda functions:
Clean Build Directory:
- Removes the
.distdirectory for the specified Lambda function - Creates a fresh
.distdirectory for the build output
- Removes the
Install Dependencies:
- Creates a temporary build folder (
.tmp) if it doesn't exist - Copies the main
package.jsonto the temporary folder - Runs
npm install --omit=dev(or a custom install script specified inpovery.json) - Creates a symbolic link from the temporary
node_modulesto the Lambda's.dist/node_modules
- Creates a temporary build folder (
TypeScript Compilation:
- Creates symbolic links for path aliases defined in
tsconfig.json - Generates a temporary Lambda-specific
tsconfig.jsonwith appropriate settings - Validates TypeScript code with
tsc --noEmit - Bundles the code using esbuild with:
- Entry point:
./lambda/<functionName>/index.ts - Output:
./lambda/<functionName>/.dist/index.js - Minification enabled
- Source maps generated
- External dependencies excluded as specified in
povery.json
- Entry point:
- Cleans up temporary files and symlinks
- Creates symbolic links for path aliases defined in
Package Creation:
- Creates a ZIP file containing:
- The compiled JavaScript file (
index.js) - Source map file (
index.js.map)
- The compiled JavaScript file (
- Outputs the ZIP to
./lambda/<functionName>/.dist/<functionName>.zip
- Creates a ZIP file containing:
Deployment (if requested):
- Uploads the ZIP file to AWS Lambda using the AWS SDK
- Updates the function code with the new package
- Applies the appropriate naming strategy based on
deployStrategyinpovery.json
This process can be initiated in several ways:
# Interactive mode
povery-cli function
# Direct build (package only)
povery-cli function build <functionName>
# Direct deployment (build and publish)
povery-cli function deploy <functionName>
# With environment option
povery-cli function deploy <functionName> --environment prod
# Force dependency reinstallation
povery-cli function deploy <functionName> --nocacheBuild Optimization
By default, Povery CLI:
- Minifies code
- Produces a single file with source map
- Optimizes for cold start performance
Source Map Support
Enable source maps for debugging by adding this environment variable to your Lambda:
NODE_OPTIONS=--enable-source-mapsNote: This may impact performance and is not recommended for production environments. Consider using error tracking services like Sentry with uploaded source maps instead.
Deployment Operations
Povery CLI provides several commands for managing the deployment lifecycle of your Lambda functions:
Function Command
The function command is the primary interface for working with individual Lambda functions:
povery-cli function [operation] [functionName] [options]Available operations:
info: Retrieve information about a deployed Lambda functionbuild: Build the Lambda package without deployingdeploy: Build and deploy the Lambda functionpromote: Promote a Lambda function to a different stageinvoke: Run the Lambda function locally with an eventclean: Remove build artifacts
Options:
-p, --payload <payload>: Specify a payload for function invocation-e, --eventFilename <string>: Specify an event file for invocation-z, --environment <string>: Target environment (default: 'dev')-nc, --nocache: Disable cache and force npm install--auth: Load claims file for authorization testing
If no operation or function name is provided, an interactive wizard will guide you through the process.
Batch Deployment
To deploy all Lambda functions at once:
povery-cli deploy [options]Options:
-y, --yes: Automatically confirm all prompts-nc, --nocache: Disable cache and force npm install-z, --environment <string>: Target environment (default: 'dev')
Versioning
To increment the version of all Lambda functions:
povery-cli versionThis command:
1. Creates a new version of the $LATEST Lambda function
2. Sets the dev alias to point to $LATEST
Lambda Layers
To upload a Lambda Layer:
povery-cli layers [functionName]If no function name is provided, an interactive wizard will guide you through the process.
Promotion
To promote Lambda functions between stages:
povery-cli promote [stage]Available promotion paths:
dev -> test: Promotes from development to testingtest -> prod: Promotes from testing to production
The promotion process:
1. For dev -> test: Creates a new version and sets the test alias to that version
2. For other stages: Copies the version from the source stage to the target stage
API Gateway Deployment
To deploy API Gateway configurations:
povery-cli apiThis command allows you to select a stage (dev, staging, prod) and deploys the API Gateway configuration for all Lambda functions.
Environment Variables
Create a .envrc file in your project root to define environment variables. All exported variables will be available during local Lambda execution.
Version Control
Add the following to your .gitignore file:
.serverless.*Contributing
Contributions are welcome. Please feel free to submit issues and pull requests.
License
MIT
9 months ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago