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

@neetru/pii-mask

v0.1.0

Published

Mascaramento de PII fail-closed do Neetru Core DB. Mascara dados pessoais num result set, no servidor, antes de a UI staff do visualizador de banco em produção vê-los. Salvaguarda LGPD. Função pura, zero dependências, fail-closed.

Readme

@neetru/pii-mask

Mascaramento de PII (dados pessoais) do Neetru Core DB. Mascara um result set, no servidor, antes de ele chegar à UI staff do visualizador de banco em produção. É uma salvaguarda crítica de LGPD (Lei Geral de Proteção de Dados).

O que faz

Recebe as linhas vindas do banco e um mapa coluna → política, e devolve as linhas com cada coluna mascarada segundo a sua política. Função pura, isomórfica, zero dependências de runtime.

Princípio fail-closed

A decisão de segurança cravada deste pacote: uma coluna que NÃO está explicitamente classificada é mascarada genericamente. O staff marca uma coluna como 'safe' explicitamente para desmascará-la — nunca o contrário.

O fail-closed atua em duas camadas:

  1. Coluna não classificada — uma coluna ausente do mapa columns é tratada como 'generic'. Uma coluna nova que ninguém classificou ainda nunca vaza: ela já chega mascarada.
  2. Valor que não parseia — dentro de uma política tipada (email/cpf/phone/card), um valor que não é string, ou é uma string que não casa com a forma esperada, cai para o mascaramento 'generic'. Nunca se deixa passar um valor que não parseou como o esperado.

Um null/undefined permanece null/undefined sob qualquer política — um nulo não é PII.

API

import { maskResultSet, type MaskOptions } from '@neetru/pii-mask';

const opts: MaskOptions = {
  columns: {
    id: 'safe',
    email: 'email',
    cpf: 'cpf',
    // coluna `endereco` AUSENTE → tratada como 'generic' (fail-closed)
  },
};

const out = maskResultSet(
  [{ id: 1, email: '[email protected]', cpf: '123.456.789-09', endereco: 'Rua X, 42' }],
  opts,
);

out.rows;
// [{ id: 1, email: 'jo********@g****.com', cpf: '***.***.***-09', endereco: '●●●●' }]
out.maskedColumns;
// ['cpf', 'email', 'endereco']  — colunas com política não-'safe', ordenadas

Políticas (MaskPolicy)

| Política | Comportamento | |-------------|---------------| | 'safe' | Passa o valor sem alteração. Não entra em maskedColumns. | | 'generic' | Substitui o valor inteiro por ●●●● (U+25CF × 4). Zero vazamento. | | 'email' | Mantém 2 chars do local + 1 char do domínio + o TLD. [email protected]jo********@g****.com. | | 'cpf' | CPF brasileiro: mantém só os 2 últimos dígitos → ***.***.***-NN. | | 'phone' | Telefone: mantém só os 4 últimos dígitos, preserva separadores. | | 'card' | Cartão de pagamento (padrão PCI): mantém só os 4 últimos → **** **** **** NNNN. |

maskResultSet(rows, opts)

Função pura — não muta o array de entrada nem os objetos linha; devolve linhas novas. Determinística: mesma entrada → mesma saída.

  • rowsRecord<string, unknown>[], as linhas do banco.
  • opts.columns — mapa coluna → MaskPolicy. Coluna ausente = 'generic'.
  • Retorna { rows, maskedColumns }. maskedColumns lista, ordenada e sem duplicatas, as colunas cuja política não é 'safe' (a política de mascaramento foi aplicada, independentemente de os valores serem null).
  • rows vazio → { rows: [], maskedColumns: [] }.

Estado

Implementado (M0). Suíte vitest cobrindo fail-closed por coluna não classificada, fallback genérico de política tipada, todas as políticas, pureza e correção de maskedColumns.