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

@chrono-os/env-schema

v0.1.1

Published

Helpers Zod para validação de env vars em services Chrono — optionalStr/optionalUrl (string vazia vira undefined), requireIfPresent (regra condicional de segurança), parseEnvOrExit (boot Fastify) e validateForNest (ConfigModule.forRoot).

Downloads

257

Readme

@chrono-os/env-schema

Helpers Zod para validar env vars em services Chrono. Extraído do Plano 3B.7: optionalStr/optionalUrl viviam byte-idênticos (com o mesmo comentário) em 7 backends do workspace Naírio — este pacote é a fonte única.

Install

yarn add @chrono-os/env-schema zod

zod é peer dependency (^3.23.0 || ^4.0.0) — este pacote não fixa a versão que o consumer usa. A suíte de testes roda contra zod@^3.23.8 (a maioria dos consumers atuais) e foi validada manualmente contra zod@^4.4.3 (bpmn-saas-backend usa v4) antes do release 0.1.0 — typecheck + build + os 16 testes passam nas duas majors sem alterar código.

Uso

Padrão Fastify — parse no topo do módulo + process.exit(1)

import { z } from 'zod'
import { optionalStr, optionalUrl, requireIfPresent, parseEnvOrExit } from '@chrono-os/env-schema'

const baseSchema = z.object({
  NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
  DATABASE_URL: z.string().url(),
  ADMIN_SECRET: optionalStr(32),
  SENTRY_DSN: optionalUrl(),
  MP_ACCESS_TOKEN: optionalStr(),
  MP_WEBHOOK_SECRET: optionalStr(16),
})

const schema = requireIfPresent(baseSchema, 'MP_ACCESS_TOKEN', 'MP_WEBHOOK_SECRET')

export const env = parseEnvOrExit(schema, process.env)

Padrão NestJS — ConfigModule.forRoot({ validate })

import { z } from 'zod'
import { optionalStr, validateForNest } from '@chrono-os/env-schema'

export const envSchema = z.object({
  DATABASE_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  DASHBOARD_SERVICE_TOKEN: optionalStr(32),
})

export const validateEnv = validateForNest(envSchema)
// app.module.ts
ConfigModule.forRoot({ validate: validateEnv })

parseEnvOrExit chama process.exit(1) (padrão Fastify — o processo aborta cedo, fora do controle do framework). validateForNest lança Error em vez disso, porque o Nest não usa process.exit para interromper o bootstrap.

API

  • optionalStr(min = 1) — schema Zod: string vazia ("") vira undefined ANTES de validar .min(min). Sem isso, uma var opcional setada em branco no Coolify (ou .env.example com linha FOO=) derruba o boot com "String must contain..." numa var que a própria documentação jura ser opcional.
  • optionalUrl() — idem, para .url().
  • requireIfPresent(schema, presentField, requiredField, message?) — recebe um z.object({...}) e devolve o schema com um .superRefine: se presentField está definido (não undefined/null/""), requiredField também precisa estar, senão adiciona issue no path de requiredField. Generaliza a regra "se existe token de pagamento, exige webhook secret" (implementada à mão em SVA e MeResponda).
  • parseEnvOrExit(schema, env)safeParse; se inválido, imprime as chaves inválidas (nome + código do erro — nunca o valor, para não vazar secret em log) e process.exit(1); se válido, devolve os dados tipados.
  • validateForNest(schema) — devolve a função que ConfigModule.forRoot({ validate }) espera: mesma validação, mas lança Error em vez de process.exit.

optionalInt/booleanStr — NÃO incluídos

Nenhuma das cópias reais lidas (7 backends do Naírio + SVA/Legaris/MeResponda) tem um helper nomeado equivalente a optionalInt ou booleanStr. O que existe são casos pontuais resolvidos inline com z.preprocess (ex.: PORT_NEST em calculadora-institucional-backend, GHL_ENVIO_AUTOMATICO em painel-conteudo-backend) ou com z.enum(['true', 'false']) direto no schema — nenhum dos dois duplicado o bastante para justificar extração agora. Se um padrão nomeado surgir em 3+ lugares, adicionar em versão minor.

Versionamento

Keep a Changelog + SemVer. Pacote pré-1.0: minor pode trazer mudança de comportamento.

Origem

Plano 3B.7 do ecossistema @chrono-os/* — extração de calculadora-backend/src/config/env.ts e mais 6 cópias (ver CHANGELOG).