Universal NPM dependency resolver.
Designed with support for browsers and use with Node.js.
Resolves dependencies to absolute semver-compatible versions. Entry points
listed in a dependency's package.json (e.g. main
, typings
) are returned in
the resolution for loaders to pick up proper file mappings.
A new Resolver()
will need to be constructed for each set of dependencies
to be resolved. You may need a promise polyfill for the browser, and an npm
registry with CORS enabled.
import { Resolver, NpmHttpRegistry } from '@stackblitz/turbo-resolver';
function resolve(dependencies){
// const resolver = new Resolver(); // For server-side usage, uses https://registry.npmjs.org which doesn't have CORS enabled
const resolver = new Resolver({
registry: new NpmHttpRegistry({ registryUrl: 'https://registry.npmjs.cf/' })
});
return resolver.resolve(dependencies);
}
resolve({
"rxjs": "~5.5.0",
"left-pad": "*",
"zone.js": "latest",
"@angular/core": "~5.2.0"
}).then(results => console.log(results))
Possible options:
registry
- An object that implementsfetch
andbatchFetch
that can return NPM registry data. A custom registry source can be provided to read from your own database or private NPM registry.validatePeers
- boolean - turns on/offpeerDependencies
validation, defaults totrue
.packageJsonProps
-string[]
- list of properties to retain frompackage.json
for resolved versions.timeout
- number - Number of milliseconds to attempt resolution before timing out.concurrency
- number - Maximum number of concurrent registry operations, default value4
.
Example dependencies payload:
`{
"rxjs": "~5.5.0",
"left-pad": "*",
"zone.js": "latest",
"@angular/core": "~5.2.0"
}`
Resulting output:
{
"appDependencies": {
"rxjs": {
"version": "5.5.6",
"dependencies": {
"symbol-observable": "[email protected]"
},
"main": "./Rx.js",
"typings": "./Rx.d.ts"
},
"left-pad": {
"version": "1.2.0",
"dependencies": {},
"main": "index.js",
"types": "index.d.ts"
},
"zone.js": {
"version": "0.8.20",
"dependencies": {},
"main": "dist/zone-node.js",
"browser": "dist/zone.js",
"typings": "dist/zone.js.d.ts",
"unpkg": "dist/zone.js"
},
"@angular/core": {
"version": "5.2.6",
"dependencies": {
"rxjs": "[email protected]",
"zone.js": "[email protected]",
"tslib": "[email protected]"
},
"main": "./bundles/core.umd.js",
"module": "./esm5/core.js",
"typings": "./core.d.ts"
}
},
"resDependencies": {
"[email protected]": {
"dependencies": {},
"typings": "index.d.ts"
},
"[email protected]": {
"dependencies": {},
"main": "tslib.js",
"module": "tslib.es6.js",
"typings": "tslib.d.ts"
}
},
"warnings": {}
}
appDependencies
includes resolutions and mappings for top-level dependencies requested.
resDependencies
includes resolutions and mappings for sub-dependencies and their dependencies.
Warning responses will still contain a valid resolution, users should be notified of any warnings.
Example request:
{
"zone.js": "^0.8.4",
"rxjs": "*",
"@angular/core": "5.2.6",
"@angular/common": "5.2.5",
"@angular/platform-browser": "5.2.6"
}
A requested peer dependency was installed as a top level dependency, so it isn't missing, but its resolved version doesn't satisfy one or more top-level dependencies.
{
"warnings": {
"invalidPeers": {
"@angular/[email protected]": {
"@angular/core": "5.2.5"
},
"@angular/[email protected]": {
"@angular/common": "5.2.6"
}
}
}
}
@angular/[email protected]
requests @angular/[email protected]
but @angular/[email protected]
was installed.
@angular/[email protected]
requests @angular/[email protected]
but @angular/[email protected]
was installed.
Example request:
{"@angular/common": "5.2.6"}
A Peer dependency was missing from the top-level dependency. Includes which dependencies are missing, along with what top-level dependencies requested that peer, along with the semver range requested by the top-level dependency.
{
"error": "MISSING_PEERS",
"data": {
"rxjs": {
"@angular/[email protected]": "^5.5.0"
},
"@angular/core": {
"@angular/[email protected]": "5.2.6"
}
}
}
Example request:
{"mmnt": "2.20.1"}
The request contains a package not found in the registry.
{
"error": "PACKAGE_NOT_FOUND",
"data": {
"name": "mmnt"
}
}
Example request:
{"moment": "~1337.0.0"}
The request contains a valid package with an invalid range. Includes which package was requested along with the improper range.
{
"error": "UNSATISFIED_RANGE",
"data": {
"name": "moment",
"range": "~1337.0.0"
}
}
The request has timed out:
{ "error": "TIMEOUT" }