NodeSecure is a Node.js security CLI that statically analyzes a package's dependency tree (AST scanning, registry metadata, license/vulnerability checks) and renders results as an interactive dependency graph. This is the npm workspaces monorepo hosting the CLI and its supporting packages, each under workspaces/: cli, server, cache, size-satisfies, documentation-ui, vis-network.
Run from the repo root:
npm run build— build all workspaces (--ws --if-present)npm run lint/npm run lint-fix— ESLint across all workspacesnpm test— lint, then test all workspaces
Per workspace (npm run <script> -w workspaces/<name>), most expose build, lint, test. cli additionally has:
npm run dev -w workspaces/cli— esbuild dev/watch buildnpm run test:e2e -w workspaces/cli— Playwright e2e (see Landmines re: browser install)
- Native type stripping (Node >=24), no build step for tests/dev.
src/**/*.tsandtest/**/*.tsrun directly — nots-node/tsx/watch-compile. Relative imports need an explicit.tsextension (never.js). The sharedtsconfig.base.json(@openally/config.typescript/esm-ts-next) enforceserasableSyntaxOnly(noenum, no constructor parameter properties, nonamespace/module) andverbatimModuleSyntax(type-only imports must useimport type);noImplicitAnyis deliberately off while the rest ofstrictis on. .npmrcsetsignore-scripts=trueandpackage-lock=false: a plainnpm installwon't run lifecycle scripts or write a lockfile. CI mirrors this (npm install --ignore-scripts).- Only one ESLint config exists, at the root (
eslint.config.mjs), covering every workspace.workspaces/cli's ownlintscript is not ESLint — it'sstylelintfor CSS/public JS only. Lintcli's JS/TS via the rootnpm run lint, not-w workspaces/cli. - The root
tsconfig.jsonproject references excludeworkspaces/cli(it builds via esbuild, nottsc) — type-check it from insideworkspaces/cliitself. cli's e2e suite (test:e2e, Playwright) needsnpx playwright install --with-depsfirst and only runs on Ubuntu in CI.- Each workspace has its own GitHub Actions workflow (
.github/workflows/<name>.yml) gated by apaths:filter. - Publishing/versioning uses Changesets (
.changeset/); add one vianpx changeset addfor user-facing changes.