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

@exanubes/cdk

v0.0.21

Published

A custom nx plugin for working with aws cdk with typescript in a nx monorepo

Downloads

29

Readme

@exanubes/cdk

A custom nx plugin for working with aws cdk with typescript in a nx monorepo

Getting started

Install the plugin in your nx project with npm i -D @exanubes/cdk and generate a new cdk app with npx nx g @exanubes/cdk:init my-new-cdk-app

Generators

Init

This is an equivalent of cdk init sample-app --language=typescript with an altered file structure. It will create a new project using the appsDir.

Options

| Option | Alias | Description | Required | | ------------------------ | :----: | :-------------------------------------------------------------------------------------------------------------------------------- | -------- | | cloudFormationAccessRole | cfrole | aws role that will be assumed by cloudformation when deploying/destroying infrastructurename of the lambda project for this event | ✅ | | directory | | nx default behaviour | |

Example

npx nx g @exanubes/cdk:init sample-app --directory=infrastructure --cloudFormationAccessRole=exanubes-access-role

CREATE app/infrastructure/sample-app/project.json
CREATE app/infrastructure/sample-app/cdk.json
CREATE app/infrastructure/sample-app/src/config.ts
CREATE app/infrastructure/sample-app/src/index.ts
CREATE app/infrastructure/sample-app/tsconfig.json
UPDATE package.json

Stack

Options

| Option | Alias | Description | Required | | --------- | :---: | :------------------- | -------- | | directory | | nx default behaviour | |

Example

Create one

npx nx g @exanubes/cdk:stack comment-section --directory=stacks --lib

CREATE lib/stacks/comment-section/project.json
CREATE lib/stacks/comment-section/src/comment-section.stack.ts
CREATE lib/stacks/comment-section/src/index.ts
CREATE lib/stacks/comment-section/tsconfig.json
UPDATE tsconfig.base.json

Create multiple

You can create multiple stacks at once by using comma-separated names

npx nx g @exanubes/cdk:stack comment-section,api-gateway,cognito,database --directory=stacks

CREATE lib/stacks/comment-section/project.json
CREATE lib/stacks/comment-section/src/comment-section.stack.ts
CREATE lib/stacks/comment-section/src/index.ts
CREATE lib/stacks/comment-section/tsconfig.json
UPDATE tsconfig.base.json
CREATE lib/stacks/api-gateway/project.json
CREATE lib/stacks/api-gateway/src/api-gateway.stack.ts
.
.
.

Lambda

Creates a new lib with lambda stack and handler code.

It uses the NodejsFunction construct from aws-cdk-lib/aws-lambda-nodejs to bundle the code with esbuild when synthesizing with cdk.

Among the files generated is also a package.json. This package.json should contain all the dependencies that should be bundled with the lambda, however, dependencies should be installed in monorepo root, not in the lambda lib.

Best approach would be to move the dependencies to a Lambda Layer and add it to excluded modules.

** Did not test with Docker Images yet **

Options

| Option | Alias | Description | Required | | --------- | :---: | :----------------------------------------------- | -------- | | project | | Infrastructure project that will use this lambda | | | directory | | nx default behaviour | |

Example

Create one

npx nx g @exanubes/cdk:lambda create-comment --directory=lambdas

CREATE lib/lambdas/create-comment/project.json
CREATE lib/lambdas/create-comment/package.json
CREATE lib/lambdas/create-comment/src/create-comment.handler.ts
CREATE lib/lambdas/create-comment/src/create-comment.ts
CREATE lib/lambdas/create-comment/src/index.ts
CREATE lib/lambdas/create-comment/tsconfig.json
UPDATE app/infrastructure/sample-app/project.json
UPDATE tsconfig.base.json
UPDATE package.json

Create multiple

You can create multiple lambdas at once by using comma-separated names

npx nx g @exanubes/cdk:lambda create,list,update,remove --directory=lambdas/comments

CREATE lib/lambdas/comments/create/project.json
CREATE lib/lambdas/comments/create/package.json
CREATE lib/lambdas/comments/create/src/create.handler.ts
CREATE lib/lambdas/comments/create/src/create.ts
CREATE lib/lambdas/comments/create/src/index.ts
CREATE lib/lambdas/comments/create/tsconfig.json
UPDATE tsconfig.base.json
UPDATE package.json
CREATE lib/lambdas/comments/list/project.json
CREATE lib/lambdas/comments/list/package.json
CREATE lib/lambdas/comments/list/src/list.handler.ts
.
.
.

Layer

Creates a new lib with two constructs and a separate directory for layer code as well as adding a lambda env path alias for importing code from layer inside a lambda handler e.g., /opt/nodejs/database

The layer is split into two constructs Read/Write. This is due to an issue with updating layer versions. Read more in this github issue

Example

Create one

npx nx g @exanubes/cdk:layer dynamodb --directory=layers

CREATE lib/layers/dynamodb/project.json
CREATE lib/layers/dynamodb/src/dynamodb.layer.ts
CREATE lib/layers/dynamodb/src/const.ts
CREATE lib/layers/dynamodb/src/index.ts
CREATE lib/layers/dynamodb/src/layer/dynamodb.ts
CREATE lib/layers/dynamodb/src/layer/index.ts
CREATE lib/layers/dynamodb/src/read-dynamodb.layer.ts
CREATE lib/layers/dynamodb/tsconfig.json
UPDATE tsconfig.base.json

Create multiple

You can create multiple layers at once by using comma-separated names

npx nx g @exanubes/cdk:layer database,users,comments --directory=layers

CREATE lib/layers/database/project.json
CREATE lib/layers/database/src/database.layer.ts
CREATE lib/layers/database/src/const.ts
CREATE lib/layers/database/src/index.ts
CREATE lib/layers/database/src/layer/database.ts
CREATE lib/layers/database/src/layer/index.ts
CREATE lib/layers/database/src/read-database.layer.ts
CREATE lib/layers/database/tsconfig.json
UPDATE tsconfig.base.json
CREATE lib/layers/users/project.json
CREATE lib/layers/users/src/users.layer.ts
.
.
.

Event

Creates an event and adds an executor to target lambda's project.json which uses SAM for locally invoking the lambda.

Creates an event directory with [event_name].event.json name template.

Creates template.yml file in lib root for SAM

Creates invoke.js file in lib root for invoking the lambda

Creates local-invoke.env.json file in project root for defining environment variables

| Option | Alias | Description | Required | | ------------ | :---: | :----------------------------------------------------------------------------------------------------------------------------- | :------: | | project | | name of the lambda project for this event | ✅ | | source | | aws service that is the source of the event. If left empty it will show a prompt with all possible options | ✅ | | type | | type of the event based on the source selected. If unsure, leave it empty or write anything, and it will show possible options | ✅ | | runtime | | node version to be used. If left empty it will show a prompt with all possible options. For now, only nodejs is supported | ✅ | | functionName | fn | function name to be used in the template.yml | | | skipTemplate | skip | will not create invoke.js and template.yml files. Useful when files were moved from their original location | |

Example

npx nx g @exanubes/cdk:event authorizer-create-comment --source=apigateway --type=authorizer --project=lambdas-create-comment --runtime=nodejs18.x

CREATE lib/lambdas/create-comment/events/authorizer-create-comment.event.json
UPDATE lib/lambdas/create-comment/project.json

Invoke

In order to invoke the lambda we first need to bundle all the code together with npx nx lambdas-create-comment:build. Which will bundle all the code and dependencies into a single app.js file and put it in /dist/path/to/lib

Once that's done we can invoke the lambda with npx nx lambdas-create-comment:invoke. Which will actually just run the invoke.js file.

In case of an error asking if you have a Docker running (and you do), add a --docker-host flag to the command.

The invoke.js file is responsible for actually running the SAM local invoke, however, it does more than that. Based on the layerNames array, it will use the aws cli to find the layerVersion ARNs that your lambda depends on. In case you have multiple event sources and want to test it against each one, you can pass it an event name. By default it will use the first event that was generated.