0.6.0
- Move resolution modules under
NPM.Resolution:PackageResolver,Exports, andConditional - Support nested conditional package exports, array targets, and wildcard export patterns in
NPM.Resolution.Exports - Add package
importsresolution for internal specifiers such as#compiler/builders - Add
NPM.Resolution.PackageResolver.nearest_package/1andNPM.Resolution.PackageResolver.package_root/2 - Harden package resolution for modern packages such as Svelte and
@jridgewell/* - Fix optional tarball linker test isolation
0.5.3
- Add
NPM.PackageResolver.relative_import_path/3— compute relative import paths between files within a project root, with guaranteed.//../prefix
0.5.2
- Add
NPM.PackageResolver— Node.js module resolution algorithm (specifier parsing,node_modulestraversal,package.jsonentry points, extension probing) - Fix ETS race condition in
NPM.Resolvercache initialization - Fix
NPM.Cache.ensure/5spec and docs to include{:ok, :missing_optional}return - Fix dead code in
NPM.PeerDepsversion matching (redundant boolean case) - Fix
NPM.FileSize.by_extension/1dead||branch (Path.extnamenever returns nil) - Fix
NPM.DepSort.install_order/1dead{:error, :cycle}branch - Fix crash in
NPM.Linkernested version resolution on unparseable versions - Replace blanket
rescue _with specific exception types across the codebase - Flatten nesting in
expand_all_optional_deps,solver_dependencies,select_group - Bump ex_dna
~> 1.1→~> 1.3
0.5.1
- Platform-agnostic lockfile:
npm.locknow includes all optional platform bindings, not just the current platform - Only install matching platform bindings into
node_modulesat link time - Lockfiles are now portable across OS/arch — same as npm's
package-lock.jsonbehavior
0.5.0
- Add
NPM.install/2for script context — works likeMix.install/2, installs to a content-addressed cache directory without requiring a Mix project - Add
NPM.installed?/0,NPM.install_dir!/0,NPM.node_modules_dir!/0helpers mix npm.installnow accepts multiple packages:mix npm.install lodash react vue- Fix infinite loop when a package lists itself as a dependency (e.g.
sqlite-napi)
0.4.6
- Add packument disk cache (
~/.npm_ex/packuments/) with 1h TTL — avoids refetching registry metadata on repeat installs - Skip resolution entirely when lockfile matches
package.jsonandnode_modulesis intact
0.4.5
- Switch default linker strategy from symlink to copy, fixing ESM module resolution for cached packages
- Fix
NodeRunnerentrypoint resolution to follow bin symlinks correctly - Cache platform binding selection results, reducing resolve time from ~35s to ~1.5s for packages like
oxfmt - Generalize platform binding family detection for both old-style (
@oxfmt/darwin-arm64) and new-style (@oxfmt/binding-darwin-arm64) naming - Avoid grouping non-platform optional dependencies (e.g.
@babel/core) as platform variants
0.4.4
- Fix npm registry packument decoding for optional platform dependency inspection
- Select the correct platform-specific optional binding for packages like
oxfmtandoxlint - Keep
mix npm.execrunning binaries through Node instead of shell string spawning - Preserve
optional_dependenciesinnpm.lock - Skip linking crashes when optional packages are unavailable
0.4.3
- Fix
mix npm.execto resolve binaries viaNPM.Exec.which/2and run them through Node instead of shell string spawning - Preserve
optional_dependenciesinnpm.lock - Skip linking missing optional packages instead of crashing during install
- Add focused test coverage for exec environment, cached Node runner execution, optional runtime linking, and resolver optional dependency handling
0.4.2
- Speculative parallel prefetch of transitive dependencies before solving — fetches the full dep tree breadth-first with 16 concurrent requests
- Deduplicate
format_size/format_bytesacross 8 modules intoNPM.Format.bytes/1
0.4.1
- Fix mix tasks crashing with
unknown registry: Req.Finchwhen host app hasn't started the HTTP stack
0.4.0
New Mix Tasks (21 new, 43 total)
mix npm.init— create a newpackage.jsonmix npm.update— update all or specific packagesmix npm.outdated— show packages with newer versions availablemix npm.tree— display full dependency treemix npm.why/mix npm.explain— explain why a package is installedmix npm.info/mix npm.view— show package details from the registrymix npm.search— search the npm registrymix npm.run— run scripts frompackage.jsonmix npm.exec— execute binaries fromnode_modules/.bin/mix npm.ci— frozen lockfile install (CI shortcut)mix npm.check/mix npm.verify— verify installation statemix npm.clean— removenode_modules/mix npm.cache— manage global cachemix npm.config/mix npm.set— show and modify configurationmix npm.version— show npm_ex versionmix npm.link— link local packages for developmentmix npm.diff— show lockfile changes since last commitmix npm.pack— create a tarball of the current packagemix npm.audit— check for security vulnerabilitiesmix npm.dedupe— re-resolve to minimize duplicatesmix npm.prune— remove extraneous packagesmix npm.fund— show package funding infomix npm.rebuild— clean and reinstall from lockfilemix npm.uninstall— alias fornpm.removemix npm.deps— list installed packages (mix deps-style output)mix npm.deprecations— show deprecated packagesmix npm.doctor— diagnose common setup problemsmix npm.licenses— list dependency licensesmix npm.ls— alias formix npm.listmix npm.publish— publish package to registrymix npm.shrinkwrap— generate npm-shrinkwrap.jsonmix npm.size— estimate installed package sizesmix npm.stats— show dependency statisticsmix npm.token— manage registry auth tokensmix npm.completion— shell completion helpers
Install UX
mix deps-style output after install — packages listed as* name version (npm registry)- Progress reporting for resolution, fetching, and linking steps
- Structured error messages with actionable suggestions
- Lockfile diff output showing added/removed/updated packages on install
- Project setup checklist (
NPM.ProjectInit)
Dependency Analysis (30+ modules)
NPM.DepGraph— adjacency list, fan-in/out, cycle detection, orphansNPM.GraphOps— transitive closure, shortest path, impact scoringNPM.DepSort— topological sorting, parallel install levelsNPM.DepRange— classify ranges (exact, caret, tilde, star, file, git, url)NPM.DepConflict— detect version conflicts between dependency groupsNPM.DepFreshness— classify package freshness (current, outdated, ancient)NPM.DepStats— aggregate statistics (scope distribution, version breakdown)NPM.DepPath— resolve bin and module paths within node_modulesNPM.DepCheck— verify installed tree matches lockfileNPM.PhantomDep— detect undeclared (phantom) dependenciesNPM.HoistingConflict— detect version conflicts from hoistingNPM.PeerDep/NPM.PeerDepsCheck— peer dependency validationNPM.PackageUpdate— compute available major/minor/patch updatesNPM.OutdatedReport— npm outdated-style table formattingNPM.SnapshotDiff— lockfile snapshot comparisonNPM.ManifestDiff— diff two package.json filesNPM.IntegrityCheck— verify installed packages match lockfileNPM.LockfileCheck/NPM.LockfileStats— lockfile validation and metrics
Package Metadata (20+ modules)
NPM.Validate— package.json schema validationNPM.Engines/NPM.NodeVersion— engine constraints and .nvmrc/.tool-versions parsingNPM.Compat— Node.js version compatibility checkingNPM.Funding— funding field parsingNPM.TypeField— module type detection (ESM/CJS)NPM.SideEffects— tree-shaking side-effects fieldNPM.Conditional— conditional exports/imports resolutionNPM.Exports/NPM.TypesResolution— package exports and types resolutionNPM.PublishConfig— publish configurationNPM.Corepack— packageManager field parsingNPM.PackageQuality— metadata quality scoringNPM.PackageFiles— files field and .npmignore analysisNPM.BundleAnalysis— bundle-friendliness scoringNPM.ImportMap— browser import map generationNPM.TypesCompanion— suggest @types/* companion packagesNPM.ScriptRunner— script analysis and pattern detectionNPM.ReleaseNotes— changelog version extraction
Security & Supply Chain
NPM.CVE— CVE detection and scoringNPM.SBOM— software bill of materials generationNPM.SupplyChain— supply chain risk assessmentNPM.Provenance— package provenance verificationNPM.DeprecationAnalysis— deprecation severity analysis
Configuration
NPM.Npmrc— .npmrc file parsingNPM.NpmrcMerge— multi-layer .npmrc resolution (project → user → global)NPM.RegistryUrl— registry URL resolution with scope supportNPM.InstallStrategy— hoisted/nested/isolated install strategiesNPM.Workspaces— workspace configuration and glob matchingNPM.Migration— npm version migration guidance
Infrastructure
NPM.Compiler— Mix compiler for automatic npm installsNPM.CacheStats— cache hit/miss metrics and disk usageNPM.ProgressReporter— structured progress outputNPM.ErrorMessage— error formatting with suggestionsNPM.DepsOutput—mix deps-style package listingNPM.Diagnostics— project health diagnosticsNPM.Gitignore— .gitignore management for npm projects
Other
devDependenciessupport (--save-dev,--production)optionalDependenciessupport (--save-optional)--save-exactflag for pinning exact versionsnode_modules/.bin/executable linkingoverridessupport inpackage.json- Custom registry URL via
NPM_REGISTRYenv var - Auth token support via
NPM_TOKENenv var - SHA-256 integrity verification (in addition to SHA-512 and SHA-1)
- Retry with exponential backoff for failed HTTP requests
file:dependency references- 2,697 tests (up from 64)
0.3.1
- Rename repository to npm_ex
0.3.0
mix npm.remove— remove a package frompackage.jsonmix npm.list— show installed packages with versionsmix npm.install --frozen— fail if lockfile is stale (CI mode)- Fix scoped package parsing (
@scope/pkg@^1.0was splitting incorrectly) - Timing output for resolve and install steps
- Rename
install/2toadd/2in the public API - Expand test suite to 64 tests
0.2.0
- Global package cache at
~/.npm_ex/cache/— download once, reuse across projects node_modules/linking via symlinks (unix) or copies (Windows)- Hoisted flat layout
- Switch from
:httpcto Req for HTTP - Add
mix npm.gettask - Add credo, ex_slop, ex_dna, dialyzer
- Add unit and integration tests
- Add GitHub Actions CI
0.1.0
Initial release.
mix npm.install— resolve and install all deps frompackage.jsonmix npm.install <pkg>— add a package and install- PubGrub dependency resolution via
hex_solver - npm registry client with abbreviated packuments
- SHA-512 integrity verification
npm.locklockfile for reproducible installs