npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

serverless-plugin-for-each

v3.1.2

Published

Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates

Downloads

12,325

Readme

serverless-plugin-for-each

Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates.

Configuration

$forEach block requires two fields:

iterator

A collection to iterate over. Can be:

  • array
    iterator:
      - first
      - second
  • object
    iterator:
      first: first-value
      second: second-value
  • environment variable regular expression
    iterator:
      $env: ENVIRONMENT_VARIABLE_NAME_REGEX

template

An array or object to replace $forEach block with. Template can contain $forEach.key and $forEach.value variables that are interpolated during the replacement. Depending on the iterator type, these variables are replaced with:

  • array:
    • $forEach.key - item index in the array
    • $forEach.value - item value
  • object:
    • $forEach.key - field name
    • $forEach.value - field value
  • environment variable regular expression:
    • $forEach.key - environment variable name
    • $forEach.value - environment variable value

Examples

Populate environment variables based on the list

Config

service: my-service

provider:
  environment:
    LOG_LEVEL: info
    REGION: us-east-1
    $forEach:
      iterator: ${self:custom.queues}
      template:
        $forEach.key_QUEUE_URL:
          Fn::ImportValue: my-service-$forEach.value-url

custom:
  # this list does not need to be hardcoded here and can come from a file, for example
  queues:
    FIRST: first-queue
    SECOND: second-queue

Result

service: my-service

provider:
  environment:
    LOG_LEVEL: info
    REGION: us-east-1
    FIRST_QUEUE_URL:
      Fn::ImportValue: my-service-first-queue-url
    SECOND_QUEUE_URL:
      Fn::ImportValue: my-service-second-queue-url

custom:
  # this list does not need to be hardcoded here and can come from a file, for example
  queues:
    FIRST: first-queue
    SECOND: second-queue

Multiple $forEach blocks in the same object

Config

service: my-service

provider:
  environment:
    LOG_LEVEL: info
    REGION: us-east-1
    $forEach_queues: # A "_suffix" can be added to avoid duplicated keys
      iterator: ${self:custom.queues}
      template:
        $forEach.key_QUEUE_URL:
          Fn::ImportValue: my-service-$forEach.value-url
    $forEach_tables:
      iterator: ${self:custom.tables}
      template:
        $forEach.key_TABLE_ARN:
          Fn::ImportValue: my-service-$forEach.value-arn

custom:
  queues:
    FIRST: first-queue
    SECOND: second-queue
  tables:
    ONE: table-one
    TWO: table-two

Result

service: my-service

provider:
  environment:
    LOG_LEVEL: info
    REGION: us-east-1
    FIRST_QUEUE_URL:
      Fn::ImportValue: my-service-first-queue-url
    SECOND_QUEUE_URL:
      Fn::ImportValue: my-service-second-queue-url
    ONE_TABLE_ARN:
      Fn::ImportValue: my-service-one-table-arn
    TWO_TABLE_ARN:
      Fn::ImportValue: my-service-two-table-arn

custom:
  queues:
    FIRST: first-queue
    SECOND: second-queue
  tables:
    ONE: table-one
    TWO: table-two

Attach multiple streams to lambda using environment variables

Config

service: my-service

functions:
  helloWorld:
    handler: ./src/hello-world.js
    events:
      - $forEach:
          iterator:
            $env: STREAM_ARN$ # matches all env vars with this suffix
          template:
            - stream:
                arn: $forEach.value
                startingPosition: TRIM_HORIZON
                enabled: true

Result

Assuming you have FIRST_STREAM_ARN=<first-stream-arn> and SECOND_STREAM_ARN=<second-stream-arn> set, the configuration above would be converted into

service: my-service

functions:
  helloWorld:
    handler: ./src/hello-world.js
    events:
      - stream:
          arn: <first-stream-arn>
          startingPosition: TRIM_HORIZON
          enabled: true
      - stream:
          arn: <second-stream-arn>
          startingPosition: TRIM_HORIZON
          enabled: true