Common utilities for DevSquad serverless plugins and tools
Common utilities for DevSquad Serverless Framework plugins and tools. This package extracts shared functionality from composer, module-registry, artifact-manager, and arn-prefixer to eliminate code duplication and provide consistent behavior.
``bash`
npm install @hyperdrive.bot/serverless-utils
- Universal Logger: Consistent logging across all serverless plugins
- Variable Resolution: Cross-version Serverless Framework variable resolution
- Object Utilities: Deep merge, cloning, and manipulation functions
- CloudFormation Support: YAML schema with intrinsic function support
- Build Configurations: Standardized TypeScript, ESLint, and Jest configs
Create consistent, colorful logs across all serverless plugins:
`typescript
import { createLogger } from '@hyperdrive.bot/serverless-utils'
const logger = createLogger(serverless, 'my-plugin')
logger.info('Processing started')
logger.success('Operation completed successfully')
logger.warning('Configuration missing')
logger.error('Deployment failed')
logger.step('Processing next phase')
// Structured sections
logger.section('Deployment Summary')
logger.sectionItem('Service', serviceName, 'cyan')
logger.sectionItem('Functions', functionCount.toString(), 'green')
logger.sectionEnd()
`
Handle Serverless Framework variables across all versions:
`typescript
import { resolveVarsSafely, detectServerlessVersion } from '@hyperdrive.bot/serverless-utils'
const version = detectServerlessVersion(serverless)
const resolved = await resolveVarsSafely(serverless, {
tableName: '${arn:prefix}-users',
bucketName: '${env:BUCKET_NAME}'
})
`
Merge and manipulate objects safely:
`typescript
import { deepMerge, isPlainObject, chunkArray } from '@hyperdrive.bot/serverless-utils'
const merged = deepMerge(target, source)
const batches = chunkArray(largeArray, 25) // For DynamoDB batch operations
const resourceName = sanitizeResourceName('my-resource-name!')
`
Parse YAML with CloudFormation intrinsic functions:
`typescript
import { loadCloudFormationYaml, cloudFormationSchema } from '@hyperdrive.bot/serverless-utils'
const config = loadCloudFormationYaml('./serverless.yml')
// Handles !Ref, !GetAtt, !Sub, !Join, etc.
`
Use standardized build configurations:
`typescript
// tsup.config.ts
import { createTSUpConfig } from '@hyperdrive.bot/serverless-utils/config'
export default createTSUpConfig({
nodeTarget: 'node16',
externalDeps: ['serverless', 'custom-dep']
})
`
`json`
// tsconfig.json
{
"extends": "@hyperdrive.bot/serverless-utils/src/config/tsconfig.base.json"
}
`json`
// .eslintrc.json
{
"extends": ["@hyperdrive.bot/serverless-utils/src/config/eslint.base.json"]
}
Before:
`typescript
import { EnhancedLogger } from './logger'
import { resolveVarsSafely, deepMerge } from './utils'
const logger = new EnhancedLogger(serverless)
`
After:
`typescript
import { createLogger, resolveVarsSafely, deepMerge } from '@hyperdrive.bot/serverless-utils'
const logger = createLogger(serverless, 'composer')
`
Before:
`typescript`
// Custom logger implementation
const logger = createModuleRegistryLogger('my-handler')
After:
`typescript
import { createLogger } from '@hyperdrive.bot/serverless-utils'
const logger = createLogger({ cli: { log: console.log } }, 'module-registry')
`
- info(message, color?) - Info message with optional colorsuccess(message)
- - Green success message with checkmarkwarning(message)
- - Yellow warning message with warning iconerror(message)
- - Red error message with X iconstep(message)
- - Blue step message with arrowsection(title)
- - Formatted section headersectionItem(key, value, color?)
- - Indented section itemsectionEnd()
- - Section footerprogress(category, fileCount)
- - Processing progressvariableResolution(category, variableCount)
- - Variable resolution progress
- deepMerge(target, source) - Deep merge objectsisPlainObject(obj)
- - Check if object is plainchunkArray(array, size)
- - Split array into chunkssanitizeResourceName(name)
- - CloudFormation-safe namesdeepClone(obj)
- - Deep clone objectsisEmpty(obj)
- - Check if object/array is empty
- resolveVarsSafely(serverless, payload) - Cross-version variable resolutiondetectServerlessVersion(serverless)
- - Detect v2 vs v3+resolveVariablesManually(payload, sources, serverless)` - Manual resolution
-
MIT License - see the LICENSE file for details.