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

@gjuchault/typescript-functional-service-starter

v1.6.0

Published

Yet another typescript service starter template

Downloads

12

Readme

Typescript Functional Service Starter

NPM NPM GitHub Workflow Status

Yet another (opinionated) typescript service starter template.

Opinions and limitations

  1. Limits the non-pure code to infrastructure layer

Extends the ones from typescript-service-starter

  1. Tries to follow Domain Driven Development and 3 Layers architecture
  2. As little of externalities requirements as possible (outputs to stdout/stderr, no auth management, etc.)
  3. No dependency on node_modules folder and filesystem at runtime, to allow bundling & small Docker image
  4. Config should not default to either development or production (link)

And extends the ones from typescript-library-starter

  1. Relies as much as possible on each included library's defaults
  2. Only rely on GitHub Actions
  3. Do not include documentation generation

Getting started

  1. npx degit gjuchault/typescript-functional-service-starter my-project
  2. cd my-project
  3. npm install
  4. npm run setup

Or click on Use this template button on GitHub!

To enable deployment, you will need to:

  1. Setup NPM_TOKEN secret in GitHub actions (Settings > Secrets > Actions)
  2. Give GITHUB_TOKEN write permissions for GitHub releases (Settings > Actions > General > Workflow permissions)

Features

Ecosystem

This template is based on Fastify with some nice defaults (circuit breaker, redis rate limit, etc.). It leverages PostgreSQL as a storage (through slonik), Redis as a cache through ioredis).

For the logging & telemetry part, it uses pino and OpenTelemetry (for both prometheus-like metrics & tracing). To handle distributed tracing, it expects W3C's traceparent header to carry trace id & parent span id.

This template also tries to be easy to deploy through esbuild's bundling. This means you can not leverage ode_modules and file system at runtime: reading static files from node_modules, hooking require, etc. ill not be possible. This implies to be mindful on libraries (that would read static files from there older), or automatic instrumentation (that hook require). Yet it comes with super small Docker images hat are fast to deploy.

Layers & folder structure

client             # generated fetch wrappers for your application
migrations         # database migrations (.sql files, no rollback)
src/
├── application    # service code
├── domain         # pure functions & typescript models of your entities
├── presentation   # communication layer (http)
├── repository     # storage of your entities
├── infrastructure # technical components (cache, database connection, etc.)
├── helpers        # utilities functions & non-domain code
└── test-helpers   # test utilities (starting default port, resetting database, etc.)

Client generation

This package can generate a type-safe client package when building (with npm run build:client). It can be used the following way:

import {
  createClient as createMyAppClient,
  createTraceHeader as createMyAppTraceHeader,
} from "my-app/client";

const myApp = createMyAppClient({
  baseUrl: "http://sometarget/",
  globalFetchOverrides: {
    headers: {
      "X-Custom-Token": "foo",
    },
  },
});

// GET /healthcheck
const data = await myApp.getHealthcheck({
  headers: {
    ...createMyAppTraceHeader({
      traceId: "some-trace-id",
      parentSpanId: "some-span-id",
    }),
  },
});

// POST /foo/bar?query=param { body: "json" }
const data2 = await myApp.postFooBar({ query: "param" }, { body: "json" });

The client will validate the server's response through zod.

Node.js, npm version

Typescript Service Starter relies on volta to ensure node version to be consistent across developers. It's also used in the GitHub workflow file.

Typescript

Leverages esbuild for blazing fast builds, but keeps tsc to generate .d.ts files. Generates two builds to support both ESM and CJS.

Commands:

  • build: runs typechecking then generates CJS, ESM and d.ts files in the build/ directory
  • clean: removes the build/ directory
  • type:dts: only generates d.ts
  • type:check: only run typechecking
  • type:build: only generates CJS and ESM

Tests

typescript-functional-service-starter uses vitest. The coverage is done through vitest, using c8.

Commands:

  • test: runs vitest test runner
  • test:watch: runs vitest test runner in watch mode
  • test:coverage: runs vitest test runner and generates coverage reports

Format & lint

This template relies on the combination of eslint — through typescript-eslint for linting and prettier for formatting. It also uses cspell to ensure spelling

Commands:

  • format: runs prettier with automatic fixing
  • format:check: runs prettier without automatic fixing (used in CI)
  • lint: runs eslint with automatic fixing
  • lint:check: runs eslint without automatic fixing (used in CI)
  • spell:check: runs spellchecking

Releasing

Under the hood, this service uses semantic-release and commitizen. The goal is to avoid manual release process. Using semantic-release will automatically create a github release (hence tags) as well as an npm release. Based on your commit history, semantic-release will automatically create a patch, feature or breaking release.

Commands:

  • cz: interactive CLI that helps you generate a proper git commit message, using commitizen
  • semantic-release: triggers a release (used in CI)