From 55499e1a0afae51ab7d01f859ea5023d5dec14d6 Mon Sep 17 00:00:00 2001 From: Hyan Mandian <5044101+hyanmandian@users.noreply.github.com> Date: Wed, 9 Sep 2026 19:05:43 -0300 Subject: [PATCH 1/6] chore: tidy gitignore, pin Node version and contributors file Pin the Node.js version via .nvmrc, drop the stale tree-shaking-test ignores and refresh .all-contributorsrc. --- .all-contributorsrc | 16 +++++++++++++++- .gitignore | 3 --- .nvmrc | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 .nvmrc diff --git a/.all-contributorsrc b/.all-contributorsrc index cbb128d6..46feee15 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3,7 +3,7 @@ "projectOwner": "brazilian-utils", "files": ["README.md"], "imageSize": 100, - "commit": true, + "commit": false, "contributors": [ { "login": "hyanmandian", @@ -207,6 +207,20 @@ "avatar_url": "https://github.com/vicentevendramin.png", "profile": "https://github.com/vicentevendramin", "contributions": ["code"] + }, + { + "login": "joaopedroassad", + "name": "Joao Assad", + "avatar_url": "https://github.com/joaopedroassad.png", + "profile": "https://github.com/joaopedroassad", + "contributions": ["code", "test"] + }, + { + "login": "JanderSilv", + "name": "Jander Silva", + "avatar_url": "https://github.com/JanderSilv.png", + "profile": "https://github.com/JanderSilv", + "contributions": ["code"] } ], "repoType": "github", diff --git a/.gitignore b/.gitignore index bcb7770f..34014884 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,3 @@ node_modules .rts2_cache_umd dist coverage -tree-shaking-test/node_modules -tree-shaking-test/dist -tree-shaking-test/bun.lockb diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..a45fd52c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 From 867cd001189682a64e157d22bb58993651cb8e08 Mon Sep 17 00:00:00 2001 From: Hyan Mandian <5044101+hyanmandian@users.noreply.github.com> Date: Wed, 9 Sep 2026 19:05:44 -0300 Subject: [PATCH 2/6] build: migrate the build toolchain to vp pack with per-util subpath entries Build with vp pack (ESM + UMD, attw/publint validation) instead of vp build. Add package.json "./*" subpath exports so every util can be imported on its own (e.g. "@brazilian-utils/brazilian-utils/formatCpf"), backed by a per-util vite.config.ts entry. Replace scripts/prebuild.ts with scripts/data.ts (adds legal-natures generation). Type-aware lint and the 100% coverage gate are switched on at the end of the series, once every source file satisfies them. --- package.json | 114 +++++++++++++----- scripts/{prebuild.ts => data.ts} | 32 ++++-- vite.config.ts | 192 ++++++++++++++++++++++++++----- 3 files changed, 273 insertions(+), 65 deletions(-) rename scripts/{prebuild.ts => data.ts} (62%) diff --git a/package.json b/package.json index c4079220..c15fdef7 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,33 @@ "name": "@brazilian-utils/brazilian-utils", "version": "2.3.0", "description": "Brazilian Utils is a library focused on solving problems that we face daily in the development of applications for the Brazilian business.", + "keywords": [ + "boleto", + "brasil", + "brazil", + "brazilian", + "cep", + "cnh", + "cnpj", + "cpf", + "formatter", + "generator", + "license-plate", + "phone", + "pis", + "pix", + "utils", + "validator" + ], + "homepage": "https://brazilian-utils.com.br", + "bugs": { + "url": "https://github.com/brazilian-utils/javascript/issues" + }, "license": "MIT", - "repository": "https://github.com/brazilian-utils/javascript", + "repository": { + "type": "git", + "url": "git+https://github.com/brazilian-utils/javascript.git" + }, "files": [ "./dist" ], @@ -11,15 +36,33 @@ "sideEffects": false, "main": "./dist/brazilian-utils.umd.cjs", "module": "./dist/brazilian-utils.js", + "types": "./dist/brazilian-utils.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/brazilian-utils.js", - "require": "./dist/brazilian-utils.umd.cjs" - } + "import": { + "types": "./dist/brazilian-utils.d.ts", + "default": "./dist/brazilian-utils.js" + }, + "require": { + "types": "./dist/brazilian-utils.d.cts", + "default": "./dist/brazilian-utils.umd.cjs" + } + }, + "./*": { + "import": { + "types": "./dist/*.d.ts", + "default": "./dist/*.js" + }, + "require": { + "types": "./dist/*.d.cts", + "default": "./dist/*.cjs" + } + }, + "./package.json": "./package.json" }, "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "scripts": { "test": "vp test", @@ -27,41 +70,52 @@ "test:bun": "bun test src", "test:deno": "deno test --unstable-sloppy-imports --allow-net --allow-env src", "test:live": "RUN_LIVE_CEP_TESTS=1 vp test src/get-address-info-by-cep/get-address-info-by-cep.test.ts", - "test:edge-browser": "vp test --browser=edge", - "test:chrome-browser": "vp test --browser=chrome", - "test:safari-browser": "vp test --browser=safari --browser.headless=false", - "test:firefox-browser": "vp test --browser=firefox", + "test:edge-browser": "vp test --browser.enabled --browser.name=edge", + "test:chrome-browser": "vp test --browser.enabled --browser.name=chrome", + "test:safari-browser": "vp test --browser.enabled --browser.name=safari --browser.headless=false", + "test:firefox-browser": "vp test --browser.enabled --browser.name=firefox", "format": "vp fmt --write .", "format:check": "vp fmt --check .", "lint": "vp lint .", "lint:fix": "vp lint --fix .", "check": "vp check", "check:fix": "vp check --fix", - "prebuild": "node ./scripts/prebuild.ts", - "build": "vp build", - "build:cities": "node ./scripts/cities.ts", - "build:states": "node ./scripts/states.ts", + "build": "vp pack", + "check:tree-shaking": "node ./scripts/tree-shaking.ts", + "build:data": "node ./scripts/data.ts", + "build:llms": "node ./scripts/llms.ts", "prepublishOnly": "vp run build", - "ci": "vp check", - "release": "release-it" + "ci": "vp check" }, "devDependencies": { - "@vitest/coverage-v8": "4.1.5", - "release-it": "20.0.1", - "vite": "npm:@voidzero-dev/vite-plus-core@0.1.16", - "vite-plugin-dts": "4.5.4", - "vite-plus": "0.1.19", - "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.16", - "webdriverio": "9.27.0" + "@arethetypeswrong/core": "0.18.5", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "esbuild": "0.27.2", + "publint": "0.3.24", + "typescript": "5.9.3", + "vite-plus": "0.3.0", + "webdriverio": "9.31.6" + }, + "overrides": { + "basic-ftp@5": "^5.3.1", + "brace-expansion@2": "^2.1.2", + "fast-xml-builder@1": "^1.1.7", + "ip-address@10": "^10.3.1", + "nanoid@3": "^3.3.16", + "postcss@8": "^8.5.23", + "undici@7": "^7.28.0", + "ws@8": "^8.21.0" + }, + "devEngines": { + "runtime": { + "name": "node", + "version": ">=24.0.0", + "onFail": "warn" + } }, "engines": { "node": "^20.19.0 || >=22.12.0" }, - "packageManager": "pnpm@10.33.0", - "pnpm": { - "overrides": { - "vite": "npm:@voidzero-dev/vite-plus-core@0.1.16", - "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.16" - } - } + "packageManager": "npm@12.0.2" } diff --git a/scripts/prebuild.ts b/scripts/data.ts similarity index 62% rename from scripts/prebuild.ts rename to scripts/data.ts index 3e18a8b3..c6e8ea9a 100644 --- a/scripts/prebuild.ts +++ b/scripts/data.ts @@ -16,20 +16,36 @@ const run = (command: string, args: string[]): Promise => child.on("error", () => resolveExit(1)); }); -const [citiesResult, statesResult] = await Promise.all([ - run("node", [resolve(scriptsDir, "cities.ts")]), - run("node", [resolve(scriptsDir, "states.ts")]), -]); - -if (citiesResult !== 0 || statesResult !== 0) { - process.exit(1); -} +const generators = [ + "banks.ts", + "cbo.ts", + "cfop.ts", + "cities.ts", + "cnae.ts", + "legal-natures.ts", + "ncm.ts", + "states.ts", +]; const generatedFiles = [ + "./src/_internals/constants/banks.ts", + "./src/_internals/constants/cbo.ts", + "./src/_internals/constants/cfop.ts", "./src/_internals/constants/cities.ts", + "./src/_internals/constants/cnae.ts", "./src/_internals/constants/states.ts", + "./src/is-valid-legal-nature/constants.ts", + "./src/is-valid-ncm/constants.ts", ]; +const results = await Promise.all( + generators.map((generator) => run("node", [resolve(scriptsDir, generator)])), +); + +if (results.some((result) => result !== 0)) { + process.exit(1); +} + const formatResult = await run("vp", ["fmt", "--write", ...generatedFiles]); if (formatResult !== 0) { diff --git a/vite.config.ts b/vite.config.ts index f65bf298..81e07a78 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,15 +1,141 @@ +import { existsSync, readdirSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; -import dts from "vite-plugin-dts"; +import { transform } from "esbuild"; import { defineConfig } from "vite-plus"; +import type { PackUserConfig } from "vite-plus/pack"; import { webdriverio } from "vite-plus/test/browser-webdriverio"; const rootDir = dirname(fileURLToPath(import.meta.url)); +const srcDir = resolve(rootDir, "src"); + +type PackPlugin = Extract, unknown[]>[number]; + +/** + * The root build ships a UMD file for `require()`, which tsdown never pairs with a `.d.cts` + * twin (that only happens for the `cjs` format). The bundled declaration has no + * format-specific syntax, so a same-content copy keeps CommonJS consumers off TypeScript's + * "masquerading as ESM" error under `moduleResolution: node16`/`nodenext`. + */ +const emitCjsDtsTwin = (): PackPlugin => ({ + name: "brazilian-utils:emit-cjs-dts-twin", + generateBundle(_options, bundle) { + const dts = bundle["brazilian-utils.d.ts"]; + if (!dts) return; + this.emitFile({ + type: "asset", + fileName: "brazilian-utils.d.cts", + source: dts.type === "chunk" ? dts.code : dts.source, + }); + }, +}); + +/** + * The UMD bundle is consumed as-is from a CDN `