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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@incloodsolutions/devkit

v0.0.4

Published

A comprehensive development toolkit for Node.js and TypeScript, providing development utilities, configuration helpers, AWS CDK constructs, stacks, and infrastructure tooling.

Readme

@incloodsolutions/devkit

npm version npm downloads license

Opinionated AWS CDK v2 constructs with sensible defaults for building serverless applications. Each construct wraps one or more aws-cdk-lib resources, applies defaults (ARM64, current Node.js runtime, source maps, stage-based timeouts, CloudFormation outputs), and exposes the underlying resource for further customisation.

For a one-line index of every construct and type in this package (and the other toolkits), see ../docs/AI-INDEX.md. Every construct, its props interface, and the created resource fields carry inline TSDoc comments describing the applied defaults.


Installation

npm install @incloodsolutions/devkit aws-cdk-lib constructs

Depends on aws-cdk-lib, constructs, esbuild, and @incloodsolutions/toolkit.

Scope note. Only the AWS CDK constructs and their types are currently exported. The src/utility, src/lint, src/prettier, and src/aws/cli folders are placeholders and export nothing yet, despite what older documentation suggested.

Common props

Every construct constructor is new XxxConstruct(scope, id, props). props is based on IBaseCdkConstructProps:

interface IBaseCdkConstructProps<TOptions = any> {
  readonly stage?: AppEnvironmentType;   // 'production' | 'staging' | 'qa' | ...
  readonly options?: TOptions;           // the service-specific options (see each construct)
  readonly stackName?: string;
  readonly appName?: string;
  readonly enableDebug?: boolean;
}

The created resource is exposed as a public readonly field (.function, .api, .table, .topic, .queue, .layer, .distribution, ...).

Modular imports (tree-shaking)

There is no package-root import. import ... from '@incloodsolutions/devkit' does not resolve — you must import a specific subpath. Every construct is published as its own subpath, so a stack that uses one construct does not bundle the code for all seventeen:

import { BaseLambdaConstruct } from '@incloodsolutions/devkit/aws-cdk/lambda';
import { BaseDynamoDBConstruct } from '@incloodsolutions/devkit/aws-cdk/dynamo-db';
import type { IBaseCdkConstructProps } from '@incloodsolutions/devkit/aws-types';

| Subpath | Contents | | ------- | -------- | | .../aws · .../aws-cdk | all Base* constructs | | .../aws-cdk/<name> | one construct — api-gateway, api-gateway-v2, api-gateway-websocket, cloudfront, cloudwatch, dynamo-db, event-bridge, lambda, lambda-authorizer, lambda-authorizer-v2, lambda-layer, role-policy, s3, s3-deployment, sns, sqs, vpc | | .../aws-types | IBaseConstruct, IBaseCdkConstructProps |

Every subpath resolves ESM (import), CommonJS (require), and its own .d.ts. aws-cdk-lib and constructs stay external in every bundle.

Constructs

| Construct | Wraps | Notable defaults | | --------- | ----- | ---------------- | | BaseLambdaConstruct | aws-lambda.Function | Node.js 24, ARM64, 1024 MB, Code.fromAsset('dist'), handler lambda.handler, timeout 30 s (prod) / 15 s, --enable-source-maps, injects NODE_ENV from stage, validates env vars for duplicates. Exposes .function. | | BaseLambdaLayerConstruct | aws-lambda.LayerVersion | Create new or import via fromExistingLayerArn / fromExistingLayerAttribute. Exposes .layer / .existingLayer. | | BaseApiGatewayConstruct | aws-apigateway.RestApi | REST API with Lambda proxy integration and permissive CORS. | | BaseApiGatewayV2Construct | aws-apigatewayv2.HttpApi | HTTP API; takes handlerFunctions and routeOptions. Exposes .api. | | BaseApiGatewayWebSocketConstruct | aws-apigatewayv2.WebSocketApi + WebSocketStage | Lambda route integrations for $connect / $disconnect / custom routes. | | BaseLambdaAuthoriserConstruct | aws-apigateway.TokenAuthorizer | REST API token authorizer backed by a Lambda. | | BaseLambdaAuthoriserV2Construct | aws-apigatewayv2-authorizers.HttpLambdaAuthorizer | HTTP API Lambda authorizer. | | BaseDynamoDBConstruct | aws-dynamodb.Table | Create new or import (fromExistingTableArn / Name / Attributes); globalSecondaryIndexes / localSecondaryIndexes. Exposes .table / .existingTable. | | BaseS3Construct | aws-s3.Bucket | Bucket with defaults. | | BaseS3DeploymentConstruct | S3 Bucket + CloudFront Distribution + BucketDeployment | Static-site deploy; toggles withS3Bucket / withCloudfront; bucketDeploymentOptions.sources required. | | BaseCloudfrontConstruct | aws-cloudfront.Distribution | Distribution with ViewerProtocolPolicy default. | | BaseCloudwatchLogGroupConstruct | aws-logs.LogGroup | Log group with retention. | | BaseSnsConstruct | aws-sns.Topic | Optional targetFunctions as LambdaSubscription. Exposes .topic. | | BaseSqsConstruct | aws-sqs.Queue | Optional Lambda EventSourceMapping. Exposes .queue. | | BaseEventBridgeConstruct | aws-events.Rule | Rule with a Lambda target. | | BaseVpcConstruct | aws-ec2.Vpc | VPC with defaults. | | BaseRolePolicyConstruct | aws-iam.Role + PolicyStatement / ManagedPolicy | IAM role and policy helper. |

Types

| Symbol | Summary | | ------ | ------- | | IBaseConstruct | extends IBaseEnableDebug. | | IBaseCdkConstructProps<TOptions> | shared construct props (see above). |

Usage

import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { BaseLambdaConstruct } from '@incloodsolutions/devkit/aws-cdk/lambda';
import { BaseApiGatewayV2Construct } from '@incloodsolutions/devkit/aws-cdk/api-gateway-v2';
import { BaseDynamoDBConstruct } from '@incloodsolutions/devkit/aws-cdk/dynamo-db';

export class ApiStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const table = new BaseDynamoDBConstruct(this, 'Table', {
      stage: 'production',
      stackName: this.stackName,
      options: { tableOptions: { partitionKey: { name: 'id', type: AttributeType.STRING } } },
    });

    const handler = new BaseLambdaConstruct(this, 'Handler', {
      stage: 'production',
      stackName: this.stackName,
      options: { lambdaOptions: { environment: { TABLE_NAME: table.table.tableName } } },
    });

    table.table.grantReadWriteData(handler.function);

    new BaseApiGatewayV2Construct(this, 'Api', {
      stage: 'production',
      stackName: this.stackName,
      options: {
        handlerFunctions: [handler.function],
        routeOptions: [{ path: '/{proxy+}' }],
      },
    });
  }
}

Development

npm install
npm run build      # tsup: bundles ESM + CJS and a single dist/index.d.ts
npm run format     # prettier --write (tabs, single quotes, trailing commas)
npm run lint       # eslint --fix
npm test           # vitest run — synthesises every construct and asserts its CloudFormation
npm run test:watch # vitest in watch mode
npm run package    # build, then npm pack a tarball

test/constructs.spec.ts instantiates each Base* construct in a throwaway Stack and checks the output with aws-cdk-lib/assertions (Template). Nothing is deployed and no AWS credentials are used. Its header comment records the constructs that need extra props or currently throw. test/esm-bundle.spec.ts guards that every subpath entry is built, loads as ESM, and keeps aws-cdk-lib / constructs external.

The whole build is tsup (dts: true), pinned to typescript@^6. There is no root export and no main/module/types fields — every module and every construct is a ./* subpath in exports (see Modular imports), configured by the entry map in tsup.config.ts and exports + typesVersions in package.json. The index bundle is still built as the test aggregation point but is not reachable by the package name.

License

MIT © Inclood Solutions