mirror of
https://github.com/bower/bower.git
synced 2026-04-24 03:00:19 -04:00
Compare commits
46 Commits
lerna
...
fix-resolu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51c9c9af6d | ||
|
|
d6a18ae7ee | ||
|
|
b62faa19a6 | ||
|
|
50ee729ea2 | ||
|
|
bb17839bc2 | ||
|
|
5a6ae540f9 | ||
|
|
9eaa7e8c7b | ||
|
|
1935716660 | ||
|
|
add601795f | ||
|
|
8e34328466 | ||
|
|
c3e9c94833 | ||
|
|
dd19bafa37 | ||
|
|
74af42c176 | ||
|
|
a6308bf8f8 | ||
|
|
e1dc0105d2 | ||
|
|
ce210e4f16 | ||
|
|
e483e9bc2c | ||
|
|
b0c3859699 | ||
|
|
e6d1b2d82e | ||
|
|
d4345bb254 | ||
|
|
975f9bdcdb | ||
|
|
a969a9c557 | ||
|
|
6500b421ce | ||
|
|
0641167b96 | ||
|
|
0d03374dab | ||
|
|
765d8e739d | ||
|
|
0bd318de53 | ||
|
|
aa6b51edc0 | ||
|
|
2c2e5309fd | ||
|
|
b716bc4e3a | ||
|
|
bda400634c | ||
|
|
b01243ac3c | ||
|
|
89902a6919 | ||
|
|
80308a41a6 | ||
|
|
47cc2262e1 | ||
|
|
f7c5154490 | ||
|
|
cba4b2a4cd | ||
|
|
bdabf6a4e6 | ||
|
|
7896224384 | ||
|
|
3209cda975 | ||
|
|
38501a0b93 | ||
|
|
e60d236b25 | ||
|
|
044896e708 | ||
|
|
fc4c260de4 | ||
|
|
d405917b4a | ||
|
|
22bbb3fcaf |
@@ -12,11 +12,10 @@ environment:
|
||||
matrix:
|
||||
- nodejs_version: "0.10"
|
||||
- nodejs_version: "0.12"
|
||||
- nodejs_version: "4.0"
|
||||
- nodejs_version: "4.1"
|
||||
- nodejs_version: "4.2"
|
||||
- nodejs_version: "5"
|
||||
- nodejs_version: "4"
|
||||
- nodejs_version: "6"
|
||||
- nodejs_version: "8"
|
||||
- nodejs_version: "9"
|
||||
|
||||
# Finish on first failed build
|
||||
matrix:
|
||||
@@ -24,10 +23,12 @@ matrix:
|
||||
|
||||
# Install node, display versions, install dependencies
|
||||
install:
|
||||
- ps: Install-Product node $env:nodejs_version
|
||||
- ps: Install-Product node 8
|
||||
- node --version && npm --version
|
||||
- git --version && svn --version
|
||||
- npm install
|
||||
- npm install -g yarn grunt
|
||||
- yarn
|
||||
- ps: Install-Product node $env:nodejs_version
|
||||
|
||||
# Post-install test scripts.
|
||||
test_script:
|
||||
@@ -42,4 +43,4 @@ deploy: off
|
||||
|
||||
# Cache node modules, and refresh if package.json changes
|
||||
cache:
|
||||
- node_modules -> package.json
|
||||
- "%LOCALAPPDATA%\\Yarn"
|
||||
@@ -15,5 +15,4 @@ trim_trailing_whitespace = false
|
||||
insert_final_newline = false
|
||||
|
||||
[{package,bower}.json]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
39
.travis.yml
39
.travis.yml
@@ -2,23 +2,31 @@ sudo: false
|
||||
|
||||
language: node_js
|
||||
|
||||
# Use node 8 for build
|
||||
node_js:
|
||||
- "0.10"
|
||||
- "0.11"
|
||||
- "0.12"
|
||||
- "4.0"
|
||||
- "4.1"
|
||||
- "4.2"
|
||||
- "5"
|
||||
- "6"
|
||||
- "8"
|
||||
|
||||
# Then test with specific node version
|
||||
env:
|
||||
- TEST_NODE_VERSION="0.10"
|
||||
- TEST_NODE_VERSION="0.12"
|
||||
- TEST_NODE_VERSION="4"
|
||||
- TEST_NODE_VERSION="6"
|
||||
- TEST_NODE_VERSION="8"
|
||||
- TEST_NODE_VERSION="9"
|
||||
|
||||
before_install:
|
||||
- node --version
|
||||
- curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.5.1
|
||||
- export PATH=$HOME/.yarn/bin:$PATH
|
||||
|
||||
cache:
|
||||
yarn: true
|
||||
|
||||
install:
|
||||
- node --version
|
||||
- npm --version
|
||||
- git --version
|
||||
- svn --version | head -n 1
|
||||
- npm install -g grunt-cli
|
||||
- npm install
|
||||
- yarn
|
||||
- nvm install $TEST_NODE_VERSION
|
||||
- npm install -g grunt
|
||||
|
||||
os:
|
||||
- osx
|
||||
@@ -28,7 +36,8 @@ matrix:
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
- os: osx
|
||||
- env: "NODE_VERSION=0.11"
|
||||
|
||||
script:
|
||||
- nvm use $TEST_NODE_VERSION
|
||||
- node --version && npm --version && git --version && svn --version | head -n 1
|
||||
- grunt travis
|
||||
|
||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,5 +1,22 @@
|
||||
# Changelog
|
||||
|
||||
## 1.8.0 - 2016-11-07
|
||||
|
||||
- Download tar archives from GitHub when possible (#2263)
|
||||
- Change default shorthand resolver for github from `git://` to `https://`
|
||||
- Fix ssl handling by not setting GIT_SSL_NO_VERIFY=false (#2361)
|
||||
- Allow for removing components with url instead of name (#2368)
|
||||
- Show in warning message location of malformed bower.json (#2357)
|
||||
- Improve handling of non-semver versions in git resolver (#2316)
|
||||
- Fix handling of cached releases pluginResolverFactory (#2356)
|
||||
- Allow to type the entire version when conflict occured (#2243)
|
||||
- Allow `owner/reponame` shorthand for registering components (#2248)
|
||||
- Allow single-char repo names and package names (#2249)
|
||||
- Make `bower version` no longer honor `version` in bower.json (#2232)
|
||||
- Add `postinstall` hook (#2252)
|
||||
- Allow for `@` instead of `#` for `install` and `info` commands (#2322)
|
||||
- Upgrade all bundled modules
|
||||
|
||||
## 1.7.9 - 2016-04-05
|
||||
|
||||
- Show warnings for invalid bower.json fields
|
||||
@@ -83,7 +100,7 @@ https://github.com/npm/npm/issues/11227
|
||||
- Update bower config
|
||||
- Loads the .bowerrc file from the cwd specified on the command line
|
||||
- Allow the use of environment variables in .bowerrc ([#41](https://github.com/bower/config/issues/41))
|
||||
- Allow for array notation in ENV variables ([#44](https://github.com/bower/config/issues/44))
|
||||
- Allow for array notation in ENV variables ([#44](https://github.com/bower/config/issues/44))
|
||||
|
||||
## 1.6.9 - 2015-12-04
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ Bower is a large community project with many different developers contributing a
|
||||
|
||||
## Team Meetings
|
||||
|
||||
We communicate through a channel on slack: https://gitter.im/bower
|
||||
We communicate through a channel on Discord https://discord.gg/0fFM7QF0KpZRh2cY
|
||||
|
||||
If you'd like to attend the meetings, please fill the [support form](http://goo.gl/forms/P1ndzCNoiG), and you'll get an invite.
|
||||
|
||||
@@ -29,9 +29,9 @@ The issue tracker is the preferred channel for [bug reports](#bugs),
|
||||
requests](#pull-requests), but please respect the following restrictions:
|
||||
|
||||
* Please **do not** use the issue tracker for personal support requests. Use
|
||||
[Stack Overflow](http://stackoverflow.com/questions/tagged/bower)
|
||||
[Gitter Channel](https://gitter.im/bower/bower)
|
||||
[Mailing List](http://groups.google.com/group/twitter-bower)
|
||||
[Stack Overflow](http://stackoverflow.com/questions/tagged/bower),
|
||||
[Discord Channel](https://discordapp.com/channels/119103197720739842/123728452816732160),
|
||||
[Mailing List](http://groups.google.com/group/twitter-bower),
|
||||
(twitter-bower@googlegroups.com), or
|
||||
[#bower](http://webchat.freenode.net/?channels=bower) on Freenode.
|
||||
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2016 Twitter and other contributors
|
||||
Copyright (c) 2013-present Twitter and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
||||
82
README.md
82
README.md
@@ -1,13 +1,14 @@
|
||||
# Bower - A package manager for the web
|
||||
|
||||
> Bower needs your help. If you're willing to help, please say hello to team@bower.io or [donate](https://salt.bountysource.com/teams/bower)
|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
> ..psst! While Bower is maintained, we recommend [yarn](https://yarnpkg.com/) and [webpack](https://webpack.js.org/) for new front-end projects!
|
||||
|
||||
[](https://travis-ci.org/bower/bower)
|
||||
[](https://ci.appveyor.com/project/bower/bower)
|
||||
[](https://coveralls.io/r/bower/bower?branch=master)
|
||||
[](https://discord.gg/0fFM7QF0KpZRh2cY)
|
||||
[](http://issuestats.com/github/bower/bower)
|
||||
[](http://issuestats.com/github/bower/bower)
|
||||
|
||||
<img align="right" height="300" src="http://bower.io/img/bower-logo.png">
|
||||
|
||||
@@ -119,8 +120,81 @@ Note that on Windows for tests to pass you need to configure Git before cloning:
|
||||
git config --global core.autocrlf input
|
||||
```
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/bower#backer)]
|
||||
|
||||
<a href="https://opencollective.com/bower/backer/0/website" target="_blank"><img src="https://opencollective.com/bower/backer/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/1/website" target="_blank"><img src="https://opencollective.com/bower/backer/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/2/website" target="_blank"><img src="https://opencollective.com/bower/backer/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/3/website" target="_blank"><img src="https://opencollective.com/bower/backer/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/4/website" target="_blank"><img src="https://opencollective.com/bower/backer/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/5/website" target="_blank"><img src="https://opencollective.com/bower/backer/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/6/website" target="_blank"><img src="https://opencollective.com/bower/backer/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/7/website" target="_blank"><img src="https://opencollective.com/bower/backer/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/8/website" target="_blank"><img src="https://opencollective.com/bower/backer/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/9/website" target="_blank"><img src="https://opencollective.com/bower/backer/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/10/website" target="_blank"><img src="https://opencollective.com/bower/backer/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/11/website" target="_blank"><img src="https://opencollective.com/bower/backer/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/12/website" target="_blank"><img src="https://opencollective.com/bower/backer/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/13/website" target="_blank"><img src="https://opencollective.com/bower/backer/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/14/website" target="_blank"><img src="https://opencollective.com/bower/backer/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/15/website" target="_blank"><img src="https://opencollective.com/bower/backer/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/16/website" target="_blank"><img src="https://opencollective.com/bower/backer/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/17/website" target="_blank"><img src="https://opencollective.com/bower/backer/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/18/website" target="_blank"><img src="https://opencollective.com/bower/backer/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/19/website" target="_blank"><img src="https://opencollective.com/bower/backer/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/20/website" target="_blank"><img src="https://opencollective.com/bower/backer/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/21/website" target="_blank"><img src="https://opencollective.com/bower/backer/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/22/website" target="_blank"><img src="https://opencollective.com/bower/backer/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/23/website" target="_blank"><img src="https://opencollective.com/bower/backer/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/24/website" target="_blank"><img src="https://opencollective.com/bower/backer/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/25/website" target="_blank"><img src="https://opencollective.com/bower/backer/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/26/website" target="_blank"><img src="https://opencollective.com/bower/backer/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/27/website" target="_blank"><img src="https://opencollective.com/bower/backer/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/28/website" target="_blank"><img src="https://opencollective.com/bower/backer/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/backer/29/website" target="_blank"><img src="https://opencollective.com/bower/backer/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## Sponsors
|
||||
|
||||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/bower#sponsor)]
|
||||
|
||||
<a href="https://opencollective.com/bower/sponsor/0/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/1/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/2/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/3/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/4/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/5/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/6/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/7/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/8/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/9/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/10/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/11/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/12/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/13/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/14/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/15/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/16/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/17/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/18/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/19/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/20/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/21/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/22/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/23/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/24/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/25/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/26/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/27/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/28/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/bower/sponsor/29/website" target="_blank"><img src="https://opencollective.com/bower/sponsor/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2016 Twitter and [other contributors](https://github.com/bower/bower/graphs/contributors)
|
||||
Copyright (c) 2012-present Twitter and [other contributors](https://github.com/bower/bower/graphs/contributors)
|
||||
|
||||
Licensed under the MIT License
|
||||
|
||||
@@ -9,6 +9,12 @@ function info(logger, endpoint, property, config) {
|
||||
return;
|
||||
}
|
||||
|
||||
// handle @ as version divider
|
||||
var splitParts = endpoint.split('/');
|
||||
splitParts[splitParts.length - 1] = splitParts[splitParts.length - 1].replace('@', '#');
|
||||
endpoint = splitParts.join('/');
|
||||
|
||||
|
||||
var repository;
|
||||
var decEndpoint;
|
||||
|
||||
@@ -21,33 +27,33 @@ function info(logger, endpoint, property, config) {
|
||||
getPkgMeta(repository, decEndpoint, property),
|
||||
decEndpoint.target === '*' && !property ? repository.versions(decEndpoint.source) : null
|
||||
])
|
||||
.spread(function (pkgMeta, versions) {
|
||||
if (versions) {
|
||||
return {
|
||||
name: decEndpoint.source,
|
||||
versions: versions,
|
||||
latest: pkgMeta
|
||||
};
|
||||
}
|
||||
.spread(function (pkgMeta, versions) {
|
||||
if (versions) {
|
||||
return {
|
||||
name: decEndpoint.source,
|
||||
versions: versions,
|
||||
latest: pkgMeta
|
||||
};
|
||||
}
|
||||
|
||||
return pkgMeta;
|
||||
});
|
||||
return pkgMeta;
|
||||
});
|
||||
}
|
||||
|
||||
function getPkgMeta(repository, decEndpoint, property) {
|
||||
return repository.fetch(decEndpoint)
|
||||
.spread(function (canonicalDir, pkgMeta) {
|
||||
pkgMeta = mout.object.filter(pkgMeta, function (value, key) {
|
||||
return key.charAt(0) !== '_';
|
||||
.spread(function (canonicalDir, pkgMeta) {
|
||||
pkgMeta = mout.object.filter(pkgMeta, function (value, key) {
|
||||
return key.charAt(0) !== '_';
|
||||
});
|
||||
|
||||
// Retrieve specific property
|
||||
if (property) {
|
||||
pkgMeta = mout.object.get(pkgMeta, property);
|
||||
}
|
||||
|
||||
return pkgMeta;
|
||||
});
|
||||
|
||||
// Retrieve specific property
|
||||
if (property) {
|
||||
pkgMeta = mout.object.get(pkgMeta, property);
|
||||
}
|
||||
|
||||
return pkgMeta;
|
||||
});
|
||||
}
|
||||
|
||||
// -------------------
|
||||
|
||||
@@ -16,6 +16,12 @@ function install(logger, endpoints, options, config) {
|
||||
// Convert endpoints to decomposed endpoints
|
||||
endpoints = endpoints || [];
|
||||
decEndpoints = endpoints.map(function (endpoint) {
|
||||
|
||||
// handle @ as version divider
|
||||
var splitParts = endpoint.split('/');
|
||||
splitParts[splitParts.length - 1] = splitParts[splitParts.length - 1].replace('@', '#');
|
||||
endpoint = splitParts.join('/');
|
||||
|
||||
return endpointParser.decompose(endpoint);
|
||||
});
|
||||
|
||||
@@ -28,11 +34,11 @@ install.readOptions = function (argv) {
|
||||
var cli = require('../util/cli');
|
||||
|
||||
var options = cli.readOptions({
|
||||
'force-latest': { type: Boolean, shorthand: 'F'},
|
||||
'production': { type: Boolean, shorthand: 'p' },
|
||||
'save': { type: Boolean, shorthand: 'S' },
|
||||
'save-dev': { type: Boolean, shorthand: 'D' },
|
||||
'save-exact': { type: Boolean, shorthand: 'E' }
|
||||
'force-latest': {type: Boolean, shorthand: 'F'},
|
||||
'production': {type: Boolean, shorthand: 'p'},
|
||||
'save': {type: Boolean, shorthand: 'S'},
|
||||
'save-dev': {type: Boolean, shorthand: 'D'},
|
||||
'save-exact': {type: Boolean, shorthand: 'E'}
|
||||
}, argv);
|
||||
|
||||
var packages = options.argv.remain.slice(1);
|
||||
|
||||
@@ -16,7 +16,7 @@ function lookup(logger, name, config) {
|
||||
.then(function (entry) {
|
||||
return !entry ? null : {
|
||||
name: name,
|
||||
url: entry && entry.url
|
||||
url: entry.url
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -587,6 +587,17 @@ Manager.prototype._dissect = function () {
|
||||
}
|
||||
}
|
||||
|
||||
// If they are equal and one of them is an exact target,
|
||||
// give higher priority
|
||||
if (!result) {
|
||||
if (first.target === first.pkgMeta.version) {
|
||||
return -1;
|
||||
}
|
||||
if (second.target === second.pkgMeta.version) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
@@ -676,7 +687,6 @@ Manager.prototype._electSuitable = function (name, semvers, nonSemvers) {
|
||||
var unresolvable;
|
||||
var dataPicks;
|
||||
var save;
|
||||
var choices;
|
||||
var picks = [];
|
||||
var versionRegex = /(?:[\d\w]\.){2}[\d\w](?:.)*/;
|
||||
var picksReleases;
|
||||
@@ -815,7 +825,9 @@ Manager.prototype._electSuitable = function (name, semvers, nonSemvers) {
|
||||
});
|
||||
|
||||
// Save resolution
|
||||
this._storeResolution(picks[suitable]);
|
||||
if (this._config.argv.cooked.includes('--save')) {
|
||||
this._storeResolution(picks[suitable]);
|
||||
}
|
||||
|
||||
return Q.resolve(picks[suitable]);
|
||||
}
|
||||
@@ -834,7 +846,6 @@ Manager.prototype._electSuitable = function (name, semvers, nonSemvers) {
|
||||
picks: dataPicks
|
||||
});
|
||||
|
||||
choices = picks.map(function (pick, index) { return index + 1; });
|
||||
picksReleases = picks.map(function (pick) { return pick.pkgMeta._release; });
|
||||
return Q.nfcall(this._logger.prompt.bind(this._logger), {
|
||||
type: 'input',
|
||||
|
||||
@@ -213,6 +213,20 @@ Project.prototype.update = function (names, options) {
|
||||
});
|
||||
};
|
||||
|
||||
function resolveUrlNames(names, flattened)
|
||||
{
|
||||
for (var i = 0; i < names.length; i++)
|
||||
if (! flattened[names[i]])
|
||||
{
|
||||
var url = names[i].trim().replace(/\/$/, '');
|
||||
var packName;
|
||||
for (packName in flattened)
|
||||
if (! ( !flattened[packName].source))
|
||||
if (url == flattened[packName].source.trim().replace(/\/$/, ''))
|
||||
names[i] = packName;
|
||||
}
|
||||
}
|
||||
|
||||
Project.prototype.uninstall = function (names, options) {
|
||||
var that = this;
|
||||
var packages = {};
|
||||
@@ -230,6 +244,7 @@ Project.prototype.uninstall = function (names, options) {
|
||||
// Fill in the packages to be uninstalled
|
||||
.spread(function (json, tree, flattened) {
|
||||
var promise = Q.resolve();
|
||||
resolveUrlNames(names, flattened);
|
||||
|
||||
names.forEach(function (name) {
|
||||
var decEndpoint = flattened[name];
|
||||
|
||||
@@ -176,6 +176,12 @@ function getConstructor(decEndpoint, options, registryClient) {
|
||||
|
||||
// Check if is a shorthand and expand it
|
||||
addResolver(function () {
|
||||
|
||||
// Check if the shorthandResolver is falsy
|
||||
if (!config.shorthandResolver) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip ssh and/or URL with auth
|
||||
if (/[:@]/.test(source)) {
|
||||
return;
|
||||
|
||||
@@ -29,9 +29,6 @@ function GitHubResolver(decEndpoint, config, logger) {
|
||||
this._source += '.git';
|
||||
}
|
||||
|
||||
// Check if it's public
|
||||
this._public = mout.string.startsWith(this._source, 'git://');
|
||||
|
||||
// Use https:// rather than git:// if on a proxy
|
||||
if (this._config.proxy || this._config.httpsProxy) {
|
||||
this._source = this._source.replace('git://', 'https://');
|
||||
@@ -49,14 +46,10 @@ mout.object.mixIn(GitHubResolver, GitRemoteResolver);
|
||||
// -----------------
|
||||
|
||||
GitHubResolver.prototype._checkout = function () {
|
||||
// Only fully works with public repositories and tags
|
||||
// Could work with https/ssh protocol but not with 100% certainty
|
||||
if (!this._public || !this._resolution.tag) {
|
||||
return GitRemoteResolver.prototype._checkout.call(this);
|
||||
}
|
||||
|
||||
var msg;
|
||||
var tarballUrl = 'https://github.com/' + this._org + '/' + this._repo + '/archive/' + this._resolution.tag + '.tar.gz';
|
||||
var name = this._resolution.tag || this._resolution.branch || this._resolution.commit;
|
||||
var tarballUrl = 'https://github.com/' + this._org + '/' + this._repo + '/archive/' + name + '.tar.gz';
|
||||
|
||||
var file = path.join(this._tempDir, 'archive.tar.gz');
|
||||
var reqHeaders = {};
|
||||
var that = this;
|
||||
@@ -121,7 +114,6 @@ GitHubResolver.prototype._checkout = function () {
|
||||
|
||||
return that._cleanTempDir()
|
||||
.then(GitRemoteResolver.prototype._checkout.bind(that));
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -19,14 +19,14 @@ function GitRemoteResolver(decEndpoint, config, logger) {
|
||||
this._name = this._name.slice(0, -4);
|
||||
}
|
||||
|
||||
// Get the host of this source
|
||||
// Get the remote of this source
|
||||
if (!/:\/\//.test(this._source)) {
|
||||
this._host = url.parse('ssh://' + this._source).host;
|
||||
this._remote = url.parse('ssh://' + this._source);
|
||||
} else {
|
||||
this._host = url.parse(this._source).host;
|
||||
this._remote = url.parse(this._source);
|
||||
}
|
||||
|
||||
this._remote = url.parse(this._source);
|
||||
|
||||
this._host = this._remote.host;
|
||||
|
||||
// Verify whether the server supports shallow cloning
|
||||
this._shallowClone = this._supportsShallowCloning;
|
||||
|
||||
@@ -26,8 +26,18 @@ function GitResolver(decEndpoint, config, logger) {
|
||||
// anyway
|
||||
mkdirp.sync(config.storage.empty);
|
||||
process.env.GIT_TEMPLATE_DIR = config.storage.empty;
|
||||
process.env.GIT_SSL_NO_VERIFY = (!config.strictSsl).toString();
|
||||
process.env.GIT_TERMINAL_PROMPT = config.interactive ? '1' : '0';
|
||||
|
||||
if (!config.strictSsl) {
|
||||
process.env.GIT_SSL_NO_VERIFY = 'true';
|
||||
}
|
||||
|
||||
if (!config.interactive) {
|
||||
process.env.GIT_TERMINAL_PROMPT = '0';
|
||||
|
||||
if (!process.env.SSH_ASKPASS) {
|
||||
process.env.SSH_ASKPASS = 'echo';
|
||||
}
|
||||
}
|
||||
|
||||
Resolver.call(this, decEndpoint, config, logger);
|
||||
|
||||
@@ -111,8 +121,6 @@ GitResolver.prototype._findResolution = function (target) {
|
||||
version,
|
||||
index;
|
||||
|
||||
versionsArr = versions.map(function (obj) { return obj.version; });
|
||||
|
||||
// If there are no tags and target is *,
|
||||
// fallback to the latest commit on master
|
||||
if (!versions.length && target === '*') {
|
||||
@@ -206,7 +214,7 @@ GitResolver.prototype._savePkgMeta = function (meta) {
|
||||
version = semver.clean(this._resolution.tag);
|
||||
|
||||
// Warn if the package meta version is different than the resolved one
|
||||
if (typeof meta.version === 'string' && semver.neq(meta.version, version)) {
|
||||
if (typeof meta.version === 'string' && semver.valid(meta.version) && semver.neq(meta.version, version)) {
|
||||
this._logger.warn('mismatch', 'Version declared in the json (' + meta.version + ') is different than the resolved one (' + version + ')', {
|
||||
resolution: this._resolution,
|
||||
pkgMeta: meta
|
||||
|
||||
@@ -109,7 +109,7 @@ function pluginResolverFactory(resolverFactory, bower) {
|
||||
throw createError('Resolver did not provide releases of package.');
|
||||
}
|
||||
|
||||
var releases = this._releases = result;
|
||||
var releases = that._releases = result;
|
||||
|
||||
var versions = releases.filter(function (target) {
|
||||
return semver.clean(target.version);
|
||||
|
||||
@@ -69,6 +69,10 @@
|
||||
{
|
||||
"flag": "--no-color",
|
||||
"description": "Disable colors"
|
||||
},
|
||||
{
|
||||
"flag": "--config.interactive=false",
|
||||
"description": "Disable prompts"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -19,7 +19,9 @@ function readJson(file, options) {
|
||||
|
||||
if (options.logger) {
|
||||
var issues = bowerJson.getIssues(json);
|
||||
|
||||
if (issues.warnings.length > 0) {
|
||||
options.logger.warn('invalid-meta', 'for:' + jsonFile);
|
||||
}
|
||||
issues.warnings.forEach(function (warning) {
|
||||
options.logger.warn('invalid-meta', warning);
|
||||
});
|
||||
|
||||
@@ -18,7 +18,7 @@ sudo, please spend a few minutes learning more about how your system should work
|
||||
make any necessary repairs.\n\n\
|
||||
http://www.joyent.com/blog/installing-node-and-npm\n\
|
||||
https://gist.github.com/isaacs/579814\n\n\
|
||||
You can however run a command with sudo using --allow-root option';
|
||||
You can however run a command with sudo using "--allow-root" option';
|
||||
|
||||
if (isRoot()) {
|
||||
var cli = require('./cli');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bower",
|
||||
"version": "1.7.9",
|
||||
"version": "1.8.0",
|
||||
"description": "The browser package manager",
|
||||
"author": "Twitter",
|
||||
"license": "MIT",
|
||||
@@ -17,7 +17,7 @@
|
||||
"dependencies": {
|
||||
"abbrev": "^1.0.5",
|
||||
"archy": "1.0.0",
|
||||
"bower-config": "^1.3.1",
|
||||
"bower-config": "^1.4.1",
|
||||
"bower-endpoint-parser": "^0.2.2",
|
||||
"bower-json": "^0.8.1",
|
||||
"bower-logger": "^0.2.2",
|
||||
@@ -81,7 +81,7 @@
|
||||
"load-grunt-tasks": "^3.5.0",
|
||||
"mocha": "^2.5.3",
|
||||
"multiline": "^1.0.2",
|
||||
"nock": "^7.7.2",
|
||||
"nock": "^9.2.3",
|
||||
"node-uuid": "^1.4.7",
|
||||
"proxyquire": "^1.7.9",
|
||||
"spawn-sync": "1.0.15",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"registry": {
|
||||
"search": [
|
||||
"http://localhost:8000",
|
||||
"https://bower.herokuapp.com"
|
||||
"https://registry.bower.io"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ var userAgent = !proxy && !httpsProxy
|
||||
|
||||
var defaults = {
|
||||
'directory': 'bower_components',
|
||||
'registry': 'https://bower.herokuapp.com',
|
||||
'registry': 'https://registry.bower.io',
|
||||
'shorthand-resolver': 'https://github.com/{{owner}}/{{package}}.git',
|
||||
'tmp': paths.tmp,
|
||||
'proxy': proxy,
|
||||
|
||||
@@ -43,6 +43,9 @@ function doEnvReplaceStr (f) {
|
||||
|
||||
function envReplace(config) {
|
||||
var envReplaced = {};
|
||||
if ( lang.isArray(config) ) {
|
||||
envReplaced = [];
|
||||
}
|
||||
|
||||
object.forOwn(config, function (value, key) {
|
||||
|
||||
@@ -63,6 +66,9 @@ function envReplace(config) {
|
||||
if ( lang.isPlainObject(value) ) {
|
||||
envReplaced[key] = envReplace(value);
|
||||
}
|
||||
else if ( lang.isArray(value) ) {
|
||||
envReplaced[key] = envReplace(value);
|
||||
}
|
||||
else if ( lang.isString(value) ) {
|
||||
envReplaced[key] = doEnvReplaceStr(value);
|
||||
}
|
||||
@@ -86,7 +92,7 @@ function expand(config) {
|
||||
publish: config.registry
|
||||
};
|
||||
} else if (typeof config.registry === 'object') {
|
||||
config.registry.default = config.registry.default || 'https://bower.herokuapp.com';
|
||||
config.registry.default = config.registry.default || 'https://registry.bower.io';
|
||||
|
||||
config.registry = {
|
||||
default: config.registry.default,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "The Bower config reader and writer.",
|
||||
"author": "Twitter",
|
||||
"license": "MIT",
|
||||
"repository": "bower/config",
|
||||
"repository": "https://github.com/bower/bower/tree/master/packages/bower-config",
|
||||
"main": "lib/Config",
|
||||
"homepage": "http://bower.io",
|
||||
"engines": {
|
||||
|
||||
@@ -4,7 +4,12 @@
|
||||
},
|
||||
"storage" : {
|
||||
"packages" : "${_BOWERRC_MY_PACKAGES}",
|
||||
"registry" : "~/.bower-test/registry"
|
||||
"registry" : {
|
||||
"register": "~/.bower-test/registry",
|
||||
"search": [
|
||||
"${_BOWERRC_MY_USER}:${_BOWERRC_MY_PASS}"
|
||||
]
|
||||
}
|
||||
},
|
||||
"tmp" : "${_BOWERRC_MY_TMP}"
|
||||
}
|
||||
|
||||
@@ -12,12 +12,12 @@ describe('NPM Config on package.json', function () {
|
||||
var config = require('../lib/Config').read(null, {});
|
||||
|
||||
assert.deepEqual(config.registry, {
|
||||
'default': 'https://bower.herokuapp.com',
|
||||
'default': 'https://registry.bower.io',
|
||||
'search': [
|
||||
'https://bower.herokuapp.com'
|
||||
'https://registry.bower.io'
|
||||
],
|
||||
'register': 'https://bower.herokuapp.com',
|
||||
'publish': 'https://bower.herokuapp.com'
|
||||
'register': 'https://registry.bower.io',
|
||||
'publish': 'https://registry.bower.io'
|
||||
});
|
||||
});
|
||||
|
||||
@@ -38,12 +38,12 @@ describe('NPM Config on package.json', function () {
|
||||
var config = require('../lib/Config').read(null, { registry: { search: 'https://foobar' } });
|
||||
|
||||
assert.deepEqual(config.registry, {
|
||||
'default': 'https://bower.herokuapp.com',
|
||||
'default': 'https://registry.bower.io',
|
||||
'search': [
|
||||
'https://foobar',
|
||||
],
|
||||
'register': 'https://bower.herokuapp.com',
|
||||
'publish': 'https://bower.herokuapp.com'
|
||||
'register': 'https://registry.bower.io',
|
||||
'publish': 'https://registry.bower.io'
|
||||
});
|
||||
});
|
||||
|
||||
@@ -70,12 +70,12 @@ describe('NPM Config on package.json', function () {
|
||||
assert.deepEqual(config, {
|
||||
'directory': 'bower_components',
|
||||
'registry': {
|
||||
'default': 'https://bower.herokuapp.com',
|
||||
'default': 'https://registry.bower.io',
|
||||
'search': [
|
||||
'https://bower.herokuapp.com'
|
||||
'https://registry.bower.io'
|
||||
],
|
||||
'register': 'https://bower.herokuapp.com',
|
||||
'publish': 'https://bower.herokuapp.com'
|
||||
'register': 'https://registry.bower.io',
|
||||
'publish': 'https://registry.bower.io'
|
||||
},
|
||||
'shorthandResolver': 'https://github.com/{{owner}}/{{package}}.git',
|
||||
'tmp': '/foo/bar',
|
||||
@@ -224,10 +224,13 @@ describe('Allow ${ENV} variables in .bowerrc', function() {
|
||||
it('sets values from process.env', function() {
|
||||
process.env._BOWERRC_MY_PACKAGES = 'a';
|
||||
process.env._BOWERRC_MY_TMP = '/tmp/b';
|
||||
process.env._BOWERRC_MY_USER = 'username';
|
||||
process.env._BOWERRC_MY_PASS = 'password';
|
||||
|
||||
var config = require('../lib/Config').read('test/assets/env-variables-values');
|
||||
assert.equal('a', config.storage.packages);
|
||||
assert.equal('/tmp/b', config.tmp);
|
||||
assert.equal('username:password', config.storage.registry.search[0]);
|
||||
assert.equal('${_myshellvar}', config.scripts.postinstall);
|
||||
});
|
||||
});
|
||||
@@ -238,7 +241,7 @@ describe('untildify paths in .bowerrc', function() {
|
||||
var config = require('../lib/Config').read('test/assets/env-variables-values');
|
||||
var untildify = require('untildify');
|
||||
|
||||
assert.equal(untildify('~/.bower-test/registry') , config.storage.registry);
|
||||
assert.equal(untildify('~/.bower-test/registry') , config.storage.registry.register);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -9,10 +9,7 @@
|
||||
"url": "https://github.com/bower/endpoint-parser/blob/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/bower/endpoint-parser.git"
|
||||
},
|
||||
"repository": "https://github.com/bower/bower/tree/master/packages/bower-endpoint-parser",
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2016 Twitter and other contributors
|
||||
Copyright (c) 2012-present Twitter and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Read bower.json files with semantics, normalisation, defaults and validation",
|
||||
"author": "Twitter",
|
||||
"license": "MIT",
|
||||
"repository": "bower/json",
|
||||
"repository": "https://github.com/bower/bower/tree/master/packages/bower-json",
|
||||
"main": "lib/json",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
|
||||
@@ -447,7 +447,7 @@ describe('.normalize', function () {
|
||||
describe('packages from bower registry', function () {
|
||||
|
||||
var packageList,
|
||||
packageListUrl = 'http://bower.herokuapp.com/packages';
|
||||
packageListUrl = 'http://registry.bower.io/packages';
|
||||
|
||||
this.timeout(60000);
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"url": "https://github.com/bower/logger/blob/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"repository": "bower/logger",
|
||||
"repository": "https://github.com/bower/bower/tree/master/packages/bower-logger",
|
||||
"main": "lib/Logger",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Provides easy interaction with the Bower registry",
|
||||
"author": "Twitter",
|
||||
"license": "MIT",
|
||||
"repository": "bower/registry-client",
|
||||
"repository": "https://github.com/bower/bower/tree/master/packages/bower-registry-client",
|
||||
"main": "Client",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
|
||||
@@ -8,7 +8,7 @@ var Config = require('bower-config');
|
||||
|
||||
describe('RegistryClient', function () {
|
||||
beforeEach(function () {
|
||||
this.uri = 'https://bower.herokuapp.com';
|
||||
this.uri = 'https://registry.bower.io';
|
||||
this.timeoutVal = 5000;
|
||||
this.registry = new RegistryClient(Config.read(process.cwd(), {
|
||||
strictSsl: false,
|
||||
@@ -104,7 +104,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('cache', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/search/jquery')
|
||||
.replyWithFile(200, __dirname + '/fixtures/search.json');
|
||||
|
||||
@@ -114,7 +114,7 @@ describe('RegistryClient', function () {
|
||||
}));
|
||||
|
||||
this.cacheDir = this.client._config.cache;
|
||||
this.host = 'bower.herokuapp.com';
|
||||
this.host = 'registry.bower.io';
|
||||
this.method = 'search';
|
||||
this.pkg = 'jquery';
|
||||
|
||||
@@ -164,7 +164,7 @@ describe('RegistryClient', function () {
|
||||
//
|
||||
describe('calling the lookup instance method with argument', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/jquery')
|
||||
.reply(200, {
|
||||
name: 'jquery',
|
||||
@@ -260,7 +260,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('calling the lookup instance method with three registries', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/jquery')
|
||||
.reply(404);
|
||||
|
||||
@@ -283,7 +283,7 @@ describe('RegistryClient', function () {
|
||||
force: true,
|
||||
registry: {
|
||||
search: [
|
||||
'https://bower.herokuapp.com',
|
||||
'https://registry.bower.io',
|
||||
'http://custom-registry.com',
|
||||
'http://custom-registry2.com'
|
||||
]
|
||||
@@ -311,7 +311,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
it('should respect order', function (next) {
|
||||
this.registry._config.registry.search = [
|
||||
'https://bower.herokuapp.com',
|
||||
'https://registry.bower.io',
|
||||
'http://custom-registry2.com',
|
||||
'http://custom-registry.com'
|
||||
];
|
||||
@@ -330,7 +330,7 @@ describe('RegistryClient', function () {
|
||||
//
|
||||
describe('calling the register instance method with argument', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.post('/packages', 'name=test-ba&url=git%3A%2F%2Fgithub.com%2Ftest-ba%2Ftest-ba.git')
|
||||
.reply(201);
|
||||
|
||||
@@ -368,7 +368,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('calling the register instance method without arguments', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.post('/packages', 'name=&url=')
|
||||
.reply(400);
|
||||
});
|
||||
@@ -392,7 +392,7 @@ describe('RegistryClient', function () {
|
||||
this.accessToken = '12345678';
|
||||
this.registry._config.accessToken = this.accessToken;
|
||||
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.delete('/packages/' + this.pkg + '?access_token=' + this.accessToken)
|
||||
.reply(204);
|
||||
});
|
||||
@@ -420,7 +420,7 @@ describe('RegistryClient', function () {
|
||||
this.pkg = 'testfoo';
|
||||
this.registry._config.accessToken = '';
|
||||
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.delete('/packages/' + this.pkg)
|
||||
.reply(403);
|
||||
});
|
||||
@@ -440,7 +440,7 @@ describe('RegistryClient', function () {
|
||||
this.accessToken = '12345678';
|
||||
this.registry._config.accessToken = this.accessToken;
|
||||
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.delete('/packages/' + this.notpkg + '?access_token=' + this.accessToken)
|
||||
.reply(404);
|
||||
});
|
||||
@@ -459,7 +459,7 @@ describe('RegistryClient', function () {
|
||||
//
|
||||
describe('calling the search instance method with argument', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/search/jquery')
|
||||
.replyWithFile(200, __dirname + '/fixtures/search.json');
|
||||
|
||||
@@ -505,7 +505,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('calling the search instance method with two registries', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/search/jquery')
|
||||
.reply(200, []);
|
||||
|
||||
@@ -526,7 +526,7 @@ describe('RegistryClient', function () {
|
||||
force: true,
|
||||
registry: {
|
||||
search: [
|
||||
'https://bower.herokuapp.com',
|
||||
'https://registry.bower.io',
|
||||
'http://custom-registry.com'
|
||||
]
|
||||
}
|
||||
@@ -566,7 +566,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('calling the search instance method without argument', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages/search/')
|
||||
.reply(404);
|
||||
});
|
||||
@@ -585,7 +585,7 @@ describe('RegistryClient', function () {
|
||||
//
|
||||
describe('calling the list instance method', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages')
|
||||
.reply(200, [], {});
|
||||
|
||||
@@ -610,7 +610,7 @@ describe('RegistryClient', function () {
|
||||
|
||||
describe('calling the list instance method with two registries', function () {
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages')
|
||||
.reply(200, []);
|
||||
|
||||
@@ -628,7 +628,7 @@ describe('RegistryClient', function () {
|
||||
force: true,
|
||||
registry: {
|
||||
search: [
|
||||
'https://bower.herokuapp.com',
|
||||
'https://registry.bower.io',
|
||||
'http://custom-registry.com'
|
||||
]
|
||||
}
|
||||
@@ -669,7 +669,7 @@ describe('RegistryClient', function () {
|
||||
describe('calling the list instance method', function () {
|
||||
|
||||
beforeEach(function () {
|
||||
nock('https://bower.herokuapp.com:443')
|
||||
nock('https://registry.bower.io:443')
|
||||
.get('/packages')
|
||||
.reply(200, [], {});
|
||||
});
|
||||
|
||||
@@ -49,4 +49,17 @@ describe('bower info', function () {
|
||||
});
|
||||
});
|
||||
});
|
||||
it('should handle @ as a divider', function () {
|
||||
return helpers.run(info, [mainPackage.path + '@0.1.3']).spread(function (results) {
|
||||
expect(results).to.eql(
|
||||
{
|
||||
name: 'package',
|
||||
version: '0.1.3',
|
||||
homepage: 'http://bower.io',
|
||||
description: 'Hello world! Hello!'
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -726,4 +726,13 @@ describe('bower install', function () {
|
||||
expect(tempDir.read(path.join('bower_components', 'package', 'package.tar'))).to.contain('test');
|
||||
});
|
||||
});
|
||||
it('should handle @ as a divider', function () {
|
||||
return helpers.run(install, [
|
||||
['empty@1.0.1'], {
|
||||
save: true
|
||||
}
|
||||
]).then(function () {
|
||||
expect(tempDir.readJson('bower.json').dependencies).to.eql({empty: '1.0.1'});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -124,7 +124,7 @@ describe('bower register', function () {
|
||||
return helpers.expectEvent(promise.logger, 'confirm')
|
||||
.spread(function (e) {
|
||||
expect(e.type).to.be('confirm');
|
||||
expect(e.message).to.be('Registering a package will make it installable via the registry (https://bower.herokuapp.com), continue?');
|
||||
expect(e.message).to.be('Registering a package will make it installable via the registry (https://registry.bower.io), continue?');
|
||||
expect(e.default).to.be(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -99,4 +99,21 @@ describe('bower uninstall', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('removes a project with url from absolute path', function () {
|
||||
var targetPath = path.resolve(tempDir.path, 'other_directory/underscore');
|
||||
mkdirp.sync(targetPath);
|
||||
fs.writeFileSync(path.join(targetPath, '.bower.json'), '{ "name": "underscore", "_source": "git://github.com/user/repo.git" }');
|
||||
|
||||
return helpers.run(uninstall, [['git://github.com/user/repo.git'], undefined, {
|
||||
cwd: tempDir.path,
|
||||
directory: path.resolve(tempDir.path, 'other_directory'),
|
||||
interactive: true
|
||||
}])
|
||||
.then(function () {
|
||||
expect(function () {
|
||||
fs.statSync(targetPath);
|
||||
}).to.throwException(/no such file or directory/);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -34,6 +34,31 @@ describe('Manager', function () {
|
||||
next();
|
||||
});
|
||||
|
||||
describe('resolve', function () {
|
||||
it('prefers exact versions over ranges', function () {
|
||||
manager._resolved = {
|
||||
ember: [
|
||||
{
|
||||
target: '>=1.4',
|
||||
pkgMeta: { version: '2.7.0' }
|
||||
},
|
||||
{
|
||||
target: '2.7.0',
|
||||
pkgMeta: { version: '2.7.0' }
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
return manager.resolve().then(function () {
|
||||
expect(manager._dissected).to.eql({
|
||||
ember: {
|
||||
target: '2.7.0',
|
||||
pkgMeta: { version: '2.7.0' }
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('_areCompatible', function () {
|
||||
describe('resolved is being fetched', function () {
|
||||
|
||||
@@ -356,6 +356,26 @@ describe('GitRemoteResolver', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should evaluate to true when source is a ssh protocol and host is defined to support shallow cloning', function (next) {
|
||||
var testSource = 'git@foo:bar.git';
|
||||
|
||||
var MyGitRemoteResolver = gitRemoteResolverFactory(
|
||||
createCmdHandlerFn(testSource, multiline(function () {/*
|
||||
foo: bar
|
||||
Content-Type: application/x-git-upload-pack-advertisement
|
||||
1234: 5678
|
||||
*/}))
|
||||
);
|
||||
|
||||
var resolver = new MyGitRemoteResolver({ source: testSource }, defaultConfig({ shallowCloneHosts: ['foo'] }), logger);
|
||||
|
||||
resolver._shallowClone().then(function (shallowCloningSupported) {
|
||||
expect(shallowCloningSupported).to.be(true);
|
||||
|
||||
next();
|
||||
});
|
||||
});
|
||||
|
||||
it('should cache hosts that support shallow cloning', function (next) {
|
||||
var testSource = 'https://foo/bar.git';
|
||||
|
||||
|
||||
@@ -50,16 +50,17 @@ describe('GitResolver', function () {
|
||||
expect(process.env).to.not.have.property('GIT_SSL_NO_VERIFY');
|
||||
|
||||
resolver = new GitResolver(decEndpoint, defaultConfig(), logger);
|
||||
expect(process.env).to.have.property('GIT_SSL_NO_VERIFY', 'false');
|
||||
delete process.env.GIT_SSL_NO_VERIFY;
|
||||
expect(process.env).to.not.have.property('GIT_SSL_NO_VERIFY');
|
||||
|
||||
resolver = new GitResolver(decEndpoint, defaultConfig({strictSsl: false}), logger);
|
||||
expect(process.env).to.have.property('GIT_SSL_NO_VERIFY', 'true');
|
||||
delete process.env.GIT_SSL_NO_VERIFY;
|
||||
|
||||
// git only checks the existence of GIT_SSL_NO_VERIFY.
|
||||
// git does NOT check whether is true of false.
|
||||
// Hence not exporting GIT_SSL_NO_VERIFY is effectively equivalent to 'false'
|
||||
resolver = new GitResolver(decEndpoint, defaultConfig({strictSsl: true}), logger);
|
||||
expect(process.env).to.have.property('GIT_SSL_NO_VERIFY', 'false');
|
||||
delete process.env.GIT_SSL_NO_VERIFY;
|
||||
expect(process.env).to.not.have.property('GIT_SSL_NO_VERIFY');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ describe('download', function () {
|
||||
nock.get('/package.tar.gz').times(6).delayConnection(1000).replyWithFile(200, source);
|
||||
},
|
||||
expectError: function (e) {
|
||||
expect(e.code).to.be('ETIMEDOUT');
|
||||
expect(e.code).to.be('ESOCKETTIMEDOUT');
|
||||
expect(fs.readdirSync(tempDir.path)).to.be.empty();
|
||||
},
|
||||
downloadOpts: {
|
||||
|
||||
Reference in New Issue
Block a user