Production-readiness scan · 2026-09-21

sindresorhus/is-plain-obj

56/100

Workable, with significant gaps to close.

PARTIAL Dependencies were read from manifests only; transitive packages were not checked.

Fix first

medium

No lockfile committed

Dependency versions are declared as ranges, so two installs can resolve to different code and transitive dependencies could not be checked at all. Commit the lockfile your package manager produces.

medium

No start command is declared anywhere

The repository has a server entrypoint but no start script, Procfile, Docker CMD or platform config saying how to run it. Buildpacks guess, and guess differently from each other, so the first deploy either starts the wrong process or none at all.

index.js

medium

No lockfile committed alongside the manifest

package.json declares devDependency ranges but no package-lock.json ships in the tree, so CI's npm install resolves a fresh tree each run and the package's own build reproducibility depends on npm registry timing.

Nine dimensions

DevOps
42
CI matrix runs tests on push and PR but no package-lock.json is committed, so reproducible installs depend on npm's resolution at the moment of build.
Security
68
Zero runtime dependencies, no shipped-dependency advisories, a published security.md, and a permissive MIT license give a tiny attack surface.
Cost & infra
70
Permissive MIT license, no copyleft concerns, zero dependencies, and trivially small published payload keep distribution cost near zero.
QA & testing
30
test.js exists and CI runs ava + tsd + xo on every PR across Node 18 and 22, yet the test file uses non-standard naming that tooling counts as zero test files.
Performance
60
benchmark.js is committed for regression tracking and zero dependencies keep the hot path trivial.
Architecture
62
Single-responsibility export with proper ESM exports map, sideEffects flag, and types; nothing else is needed at this scale.
Code quality
58
Parsed source shows zero ESLint errors and no swallowed error handlers across index.js, but only a 29% sample was directly read, capping confidence.
Observability
50
As a pure type-check library, observability reduces to clear API docs and exported types, which are present but minimal.
Maintainability
68
Genuine README, MIT license, TypeScript declarations, declared node engine, and sideEffects:false show deliberate publishing hygiene.

Top findings (AI)

medium

No lockfile committed alongside the manifest

package.json declares devDependency ranges but no package-lock.json ships in the tree, so CI's npm install resolves a fresh tree each run and the package's own build reproducibility depends on npm registry timing.

medium

Test file does not follow a discoverable naming pattern

The header reports zero test files even though test.js exists at repo root. The file lacks the conventional .test.js suffix or __tests__/ directory, meaning downstream tooling, coverage reporters, and CI dashboards that key off standard patterns will silently skip it.

medium

Only 29% of repository files were directly parsed for code review

Of the 14 files in the tree, only 4 JS/TS source files (125 lines) were analysed; the rest were unparsed. No defects were found in what was read, but benchmark.js, the type-test file, and other paths were not measured.

Report sections

Open a section for the evidence that drove the score. If you open one first, start with Code.

What this scan inspected

Every section above links to the evidence behind it. Nothing on this page is asserted without a source.

Scan your own repo

Free scan. No signup.

Run free scan