Compare commits

...

90 Commits

Author SHA1 Message Date
Sampo Silvennoinen
4e0c3c1181 CI: add Node.js 18, 20 & 22 (#2630)
* CI workflow: add Node.js 18, 20 & 22

* CI workflow: pin old Node.js versions to older MacOS

MacOS-latest can run Node versions 6 - 14 anymore. Pin them to MacOS-13 to keep the actions running

* CI: update used GH action versions

* CI: allow failure on Windows

All Windows pipelines currently fail for some integration tests. It seems to be a question of running actual git commands inside a Windows based Github action runner. Reverting it to older Windows runner wont help.
2024-10-13 12:45:04 +02:00
Sampo Silvennoinen
a0d4444324 CI workflow: add Node 16 (#2593)
Adds Node 16 to version matrix for tests

Co-authored-by: Adam Stankiewicz <sheerun@sher.pl>
2022-03-14 16:52:35 +01:00
Adam Stankiewicz
d765b2bb88 Bump to 1.8.14 2022-03-14 16:37:01 +01:00
Adam Stankiewicz
ca23b460b3 Run CI only on node 6+ 2022-03-14 16:31:27 +01:00
Eduardo Freitas
7f26c5b856 Fix bug unauthenticated git protocol in GitHubResolver (#2612)
Co-authored-by: Adam Stankiewicz <sheerun@sher.pl>
2022-03-14 16:23:54 +01:00
Adam Stankiewicz
4b5722f2bd Update README.md 2022-03-10 22:30:29 +01:00
Adam Stankiewicz
557c1cd7f1 Fix mode for bin/bower 2021-11-15 04:10:45 +01:00
Adam Stankiewicz
74560b7308 Fix child process execution 2021-11-15 03:58:38 +01:00
Adam Stankiewicz
2905791817 Fix running bower on non-windows 2021-11-15 03:30:58 +01:00
Adam Stankiewicz
dfdda3fda3 Merge remote-tracking branch 'origin/master' 2021-11-15 03:25:18 +01:00
Adam Stankiewicz
fa36814f64 Bump to 1.8.13 2021-11-15 03:23:11 +01:00
Adam Stankiewicz
f19bc34f84 Make sure correct git/svn binary is always used 2021-11-15 03:22:34 +01:00
Ikko Ashimine
eb8659ea32 Fix typo in Manager.js (#2607)
depdendency -> dependency
2021-10-20 14:58:32 +02:00
Ikko Ashimine
537b9b4558 Fix typo in Project.js (#2597)
propery -> property
2021-06-08 10:05:45 +02:00
Adam Stankiewicz
372fefbf1c Finish fixing linting 2021-01-18 17:34:20 +01:00
Adam Stankiewicz
f6ced09f76 Fix linting 2021-01-18 16:48:23 +01:00
Adam Stankiewicz
f18330b248 Bump to 1.8.12 2021-01-18 16:41:52 +01:00
Adam Stankiewicz
a1b5d93f13 Remove wild .npmignore before publishing, #2591 2021-01-18 16:41:32 +01:00
Adam Stankiewicz
74baec8a60 Bump to 1.8.11 2021-01-18 12:00:36 +01:00
Adam Stankiewicz
771c7d0ac8 Fix packaging node_modules 2021-01-18 12:00:15 +01:00
Adam Stankiewicz
50e98031e5 Fix publish script 2021-01-18 11:31:15 +01:00
Adam Stankiewicz
41126ec03e Update build script for 1.8.10 2021-01-18 11:01:39 +01:00
Adam Stankiewicz
bb563b01c2 Bump to 1.8.10 2021-01-14 18:42:22 +01:00
Adam Stankiewicz
c94f3f6422 Fix production packing 2021-01-14 18:42:06 +01:00
Adam Stankiewicz
ab589e46e9 Bump to 1.8.9 2021-01-14 17:21:29 +01:00
Adam Stankiewicz
341c3772f0 Improve publish script 2021-01-11 23:56:45 +01:00
Adam Stankiewicz
9734497faf Add package-lock.json to gitignores (we use yarn.lock) 2021-01-11 19:31:26 +01:00
dependabot[bot]
87cc6a3c6c Bump tar-fs from 1.15.3 to 1.16.2 (#2576)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 1.15.3 to 1.16.2.
- [Release notes](https://github.com/mafintosh/tar-fs/releases)
- [Commits](https://github.com/mafintosh/tar-fs/compare/v1.15.3...v1.16.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-11 19:18:41 +01:00
dependabot[bot]
2a47ba1a1d Bump ini from 1.3.4 to 1.3.7 (#2589)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.4 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.4...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-11 19:17:13 +01:00
dependabot[bot]
26212e7a67 Bump handlebars from 4.3.0 to 4.5.3 (#2586)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.3.0 to 4.5.3.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.3.0...v4.5.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-11 19:16:10 +01:00
Adam Stankiewicz
7af181f276 Update CONTRIBUTING.md 2020-05-19 10:01:56 +02:00
Adam Stankiewicz
975f6216e5 Update CONTRIBUTING.md 2020-05-19 10:01:23 +02:00
Adam Stankiewicz
d8747d794e Update minimist (#2578) 2020-04-28 14:04:17 +02:00
Adam Stankiewicz
8630604e82 Update mocha (#2577) 2020-04-28 13:19:08 +02:00
Adam Stankiewicz
8f604adf26 Revert "Bump tar-fs from 1.15.3 to 1.16.2 (#2569)"
This reverts commit 3f01228db4.
2020-04-28 12:41:52 +02:00
Satoshi Nakamura
34b4644ca3 Fix typos in changelog (#2574) 2020-04-28 01:11:43 +02:00
dependabot[bot]
3f01228db4 Bump tar-fs from 1.15.3 to 1.16.2 (#2569)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 1.15.3 to 1.16.2.
- [Release notes](https://github.com/mafintosh/tar-fs/releases)
- [Commits](https://github.com/mafintosh/tar-fs/compare/v1.15.3...v1.16.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-27 22:10:20 +02:00
Adam Stankiewicz
f5dbab0eac Update yarn.lock 2020-04-27 21:31:30 +02:00
Adam Stankiewicz
26031df67c Prevent errors when expanded env variable does not exist, fixes #2573 2020-04-27 21:29:47 +02:00
Adam Stankiewicz
1226186126 Update dependencies and yarn.lock 2020-04-27 18:05:53 +02:00
Adam Stankiewicz
752d6d42d7 Update deep-extend 2020-04-27 18:03:33 +02:00
Adam Stankiewicz
587f08844b Update yarn.lock 2020-04-27 13:57:27 +02:00
Adam Stankiewicz
6afb7b19ef Fix requires in bower-json 2020-04-27 13:55:22 +02:00
Adam Stankiewicz
6798f961f7 Update yarn.lock 2020-04-27 01:58:42 +02:00
Adam Stankiewicz
f1685ec484 Bump bower-json 2020-04-27 01:57:47 +02:00
Adam Stankiewicz
6682e312ac Vendor ext-name (drop meow dependency) (#2572) 2020-04-26 22:51:21 +02:00
Adam Stankiewicz
b123fed19b Remove coveralls and istanbul 2020-04-26 22:21:06 +02:00
Adam Stankiewicz
f6443b675a Update eslint (#2571) 2020-04-26 22:19:22 +02:00
dependabot[bot]
199e46c94a Bump fstream from 1.0.11 to 1.0.12 (#2568)
Bumps [fstream](https://github.com/npm/fstream) from 1.0.11 to 1.0.12.
- [Release notes](https://github.com/npm/fstream/releases)
- [Commits](https://github.com/npm/fstream/compare/v1.0.11...v1.0.12)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-26 20:43:39 +02:00
dependabot[bot]
d3455643d2 Bump is-my-json-valid from 2.16.1 to 2.20.0 (#2570)
Bumps [is-my-json-valid](https://github.com/mafintosh/is-my-json-valid) from 2.16.1 to 2.20.0.
- [Release notes](https://github.com/mafintosh/is-my-json-valid/releases)
- [Commits](https://github.com/mafintosh/is-my-json-valid/compare/v2.16.1...v2.20.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-26 20:43:28 +02:00
Adam Stankiewicz
95d5a35f70 Restore yarn.lock 2020-04-26 20:20:59 +02:00
Adam Stankiewicz
7c922f577a Pin chmodr 2020-04-26 20:14:34 +02:00
Adam Stankiewicz
7ae3808b44 Fix linting 2020-04-26 19:57:41 +02:00
Adam Stankiewicz
f7b21d38a8 Fix formatting 2020-04-26 19:52:20 +02:00
Adam Stankiewicz
807eada63f Bump bower-config in bower 2020-04-26 19:48:22 +02:00
Adam Stankiewicz
c1abde9269 Bump bower-config 2020-04-26 19:47:20 +02:00
Adam Stankiewicz
f82a541679 Bump bower-config 2020-04-26 19:42:39 +02:00
Adam Stankiewicz
ce59f15cc9 Apply security fix for minimist, closes #2564 2020-04-26 19:40:42 +02:00
Adam Stankiewicz
845995fccd Allow to run bower with sudo by default, closes #2406 2020-04-26 15:58:38 +02:00
Adam Stankiewicz
ebd99ad866 Update support channels 2020-04-26 15:37:03 +02:00
Adam Stankiewicz
26a37942de Update SECURITY.md 2020-04-25 02:41:14 +02:00
Adam Stankiewicz
390dec6d7f Create SECURITY.md 2020-04-25 02:40:23 +02:00
Adam Stankiewicz
234ee9149d Update travis badges and remove old files 2020-04-25 02:23:19 +02:00
Adam Stankiewicz
bcb1911268 Test subpackages, all node versions, and all platforms (#2554) 2020-04-25 02:14:49 +02:00
Adam Stankiewicz
c18aa260f3 Update sponsor badges 2020-04-20 14:05:09 +02:00
Adam Stankiewicz
9d5f7b7f61 Update README 2020-04-19 15:27:13 +02:00
Tim Gates
71661c6460 docs: Fix simple typo, wheter -> whether (#2563) 2020-04-02 16:50:45 +02:00
dependabot[bot]
67590f7728 Bump handlebars from 4.1.2 to 4.3.0 (#2555)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.3.0.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.3.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-01-15 16:37:53 +01:00
dependabot[bot]
4e68c23c87 Bump stringstream from 0.0.5 to 0.0.6 (#2553)
Bumps [stringstream](https://github.com/mhart/StringStream) from 0.0.5 to 0.0.6.
- [Release notes](https://github.com/mhart/StringStream/releases)
- [Commits](https://github.com/mhart/StringStream/compare/v0.0.5...v0.0.6)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-10 12:59:40 +01:00
dependabot[bot]
fcc02c4200 Bump handlebars from 4.0.10 to 4.1.2 (#2552)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.0.10 to 4.1.2.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.0.10...v4.1.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-10 12:33:10 +01:00
dependabot[bot]
d24e7be811 Bump mime from 1.4.0 to 1.6.0 (#2551)
Bumps [mime](https://github.com/broofa/node-mime) from 1.4.0 to 1.6.0.
- [Release notes](https://github.com/broofa/node-mime/releases)
- [Changelog](https://github.com/broofa/node-mime/blob/v1.6.0/CHANGELOG.md)
- [Commits](https://github.com/broofa/node-mime/compare/v1.4.0...v1.6.0)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-10 11:41:29 +01:00
dependabot[bot]
746fd3a669 Bump sshpk from 1.13.1 to 1.16.1 (#2550)
Bumps [sshpk](https://github.com/joyent/node-sshpk) from 1.13.1 to 1.16.1.
- [Release notes](https://github.com/joyent/node-sshpk/releases)
- [Commits](https://github.com/joyent/node-sshpk/compare/v1.13.1...v1.16.1)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-10 09:35:48 +01:00
dependabot[bot]
031c7731a4 Bump extend from 3.0.1 to 3.0.2 (#2549)
Bumps [extend](https://github.com/justmoon/node-extend) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/justmoon/node-extend/releases)
- [Changelog](https://github.com/justmoon/node-extend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/justmoon/node-extend/compare/v3.0.1...v3.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-10 09:35:31 +01:00
Adam Stankiewicz
fa62654b9c Test node 10 and 12 on Windows 2019-12-10 09:26:12 +01:00
Adam Stankiewicz
fd2d448b7e Test node 10 and 12 on CI (#2548) 2019-12-10 08:53:36 +01:00
Adam Stankiewicz
997fb2b298 Create FUNDING.yml 2019-11-25 23:18:17 +01:00
Adam Stankiewicz
9c9f332ea0 Add sponsor slots 2019-08-29 17:19:21 +02:00
Adam Stankiewicz
1861fa4355 Add sponsor slots 2019-08-29 17:18:09 +02:00
Adam Stankiewicz
79a539ffb4 Add sponsor slots 2019-06-26 14:30:21 +02:00
Adam Stankiewicz
0608b26364 Add sponsors slots 2019-06-26 14:28:47 +02:00
Adam Stankiewicz
15e5b9709d Add some slots 2019-06-26 14:26:05 +02:00
Adam Stankiewicz
67741b4bfe Bump to 1.8.8 2019-01-23 22:15:30 +01:00
Adam Stankiewicz
45c6bfa86f Fix .tar.gz extract vulnerability 2019-01-23 22:14:48 +01:00
Adam Stankiewicz
4f68fc7daa Update decompress-zip and bump 2019-01-17 23:35:49 +01:00
Adam Stankiewicz
206046b271 Bump to 1.8.6 2019-01-17 14:44:28 +01:00
Adam Stankiewicz
43894f5149 Bump to 1.8.5 2019-01-17 14:19:04 +01:00
Adam Stankiewicz
6390815c5f Update decompress-zip 2019-01-17 13:03:49 +01:00
Adam Stankiewicz
e8b94ecbd0 Mention parcel 2018-06-23 18:06:56 +02:00
Adam Stankiewicz
51feb8f925 Fix release script 2018-04-19 11:07:03 +02:00
Adam Stankiewicz
1c15deadc0 Bump to 1.8.4 2018-03-28 20:43:29 +02:00
77 changed files with 2677 additions and 3592 deletions

View File

@@ -1,46 +0,0 @@
# http://www.appveyor.com/docs/appveyor-yml
# Set build version format here instead of in the admin panel.
version: "{build}"
# Fix line endings in Windows. (runs before repo cloning)
init:
- git config --global core.autocrlf input
# Test against these versions of Node.js.
environment:
matrix:
- nodejs_version: "0.10"
- nodejs_version: "0.12"
- nodejs_version: "4"
- nodejs_version: "6"
- nodejs_version: "8"
- nodejs_version: "9"
# Finish on first failed build
matrix:
fast_finish: true
# Install node, display versions, install dependencies
install:
- ps: Install-Product node 8
- node --version && npm --version
- git --version && svn --version
- npm install -g yarn grunt
- yarn
- ps: Install-Product node $env:nodejs_version
# Post-install test scripts.
test_script:
- cmd: npm run ci
# Make clone much faster
shallow_clone: true
# Disable Visual Studio build and deploy
build: off
deploy: off
# Cache node modules, and refresh if package.json changes
cache:
- "%LOCALAPPDATA%\\Yarn"

6
.eslintignore Normal file
View File

@@ -0,0 +1,6 @@
node_modules
test/assets
test/reports
test/sample
test/tmp
packages/bower-logger/test

View File

@@ -19,7 +19,6 @@
"comma-spacing": 2,
"quote-props": [2, "as-needed"],
"quotes": [2, "single", "avoid-escape"],
"indent": [2, 4],
"no-cond-assign": [ 2, "except-parens" ],
"no-debugger": 2,
"no-dupe-args": 2,

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
# These are supported funding model platforms
open_collective: bower

88
.github/workflows/nodejs.yml vendored Normal file
View File

@@ -0,0 +1,88 @@
name: build
on:
push:
branches:
- master
pull_request:
branches:
- '**'
jobs:
test:
name: Node v${{ matrix.node-version }} on ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# https://github.com/actions/setup-node/issues/27
node-version: [6.x, 8.x, 10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x]
os: [ubuntu-latest, macOS-latest, windows-latest]
include:
# Pin deprecated Node.js versions on Mac to specific MacOS,
# as later OS architecture wont support them anymore.
- node-version: 6.x
os: macOS-13
- node-version: 8.x
os: macOS-13
- node-version: 10.x
os: macOS-13
- node-version: 12.x
os: macOS-13
- node-version: 14.x
os: macOS-13
exclude:
# Exclude older Node.js versions from macOS-latest
- node-version: 6.x
os: macOS-latest
- node-version: 8.x
os: macOS-latest
- node-version: 10.x
os: macOS-latest
- node-version: 12.x
os: macOS-latest
- node-version: 14.x
os: macOS-latest
runs-on: ${{ matrix.os }}
steps:
- name: Set git config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.symlinks true
if: runner.os == 'Windows'
- uses: actions/checkout@v4
- name: install
run: yarn && (cd packages/bower-json && yarn link) && yarn link bower-json
- name: lint
run: npm run lint
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: bower tests
run: npm test
env:
CI: true
continue-on-error: ${{ matrix.os == 'windows-latest' }} # Allow failure on Windows
- name: bower-logger tests
run: (cd packages/bower-logger && npm install && npm test)
env:
CI: true
- name: bower-config tests
run: (cd packages/bower-config && npm install && npm test)
env:
CI: true
- name: bower-endpoint-parser tests
run: (cd packages/bower-endpoint-parser && npm install && npm test)
env:
CI: true
- name: bower-json tests
run: (cd packages/bower-json && npm install && npm test)
env:
CI: true
- name: bower-registry-client tests
run: (cd packages/bower-registry-client && npm install && npm test)
env:
CI: true

1
.gitignore vendored
View File

@@ -13,3 +13,4 @@
/test/sample
!/test/sample/bower.json
/npm-shrinkwrap.json
package-lock.json

View File

@@ -1,2 +1,4 @@
**/node_modules/**
**/test/assets/**
**/bower_components/**
test/sample

View File

@@ -1,43 +0,0 @@
sudo: false
language: node_js
# Use node 8 for build
node_js:
- "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:
- yarn
- nvm install $TEST_NODE_VERSION
- npm install -g grunt
os:
- osx
- linux
matrix:
fast_finish: true
allow_failures:
- os: osx
script:
- nvm use $TEST_NODE_VERSION
- node --version && npm --version && git --version && svn --version | head -n 1
- grunt travis

View File

@@ -1,6 +1,6 @@
# Contributing to Bower
Bower is a large community project with many different developers contributing at all levels to the project. We're **actively** looking for more contributors right now. If you're interested in becoming a Bower maintainer or supporting in any way, please fill the following form: http://goo.gl/forms/P1ndzCNoiG. There is more information about [contributing](https://github.com/bower/bower/wiki/Contributor-Guidelines) in the Wiki.
Bower is a large community project with many different developers contributing at all levels to the project. There is more information about [contributing](https://github.com/bower/bower/wiki/Contributor-Guidelines) in the Wiki.
<a name="bugs"></a>
## 🐛 [Bug reports](https://github.com/bower/bower/wiki/Report-a-Bug)
@@ -16,12 +16,6 @@ Bower is a large community project with many different developers contributing a
* Read [Architecture doc](https://github.com/bower/bower/wiki/Rewrite-architecture)
* Triage, close, fix and resolve [issues](https://github.com/bower/bower/issues)
## Team Meetings
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.
## Using the issue tracker
The issue tracker is the preferred channel for [bug reports](#bugs),
@@ -29,12 +23,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),
[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.
[Stack Overflow](http://stackoverflow.com/questions/tagged/bower), or in serious cases
send an e-mail to team@bower.io
* Please **do not** derail or troll issues. Keep the discussion on topic and
respect the opinions of others.

View File

@@ -1,234 +0,0 @@
var tmp = require('tmp');
var childProcess = require('child_process');
var arraydiff = require('arr-diff');
var fs = require('fs');
var wrench = require('wrench');
var inquirer = require('inquirer');
var path = require('path');
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
grunt.initConfig({
eslint: {
files: [
'Gruntfile.js',
'bin/*',
'lib/**/*.js',
'test/**/*.js',
'!test/assets/**/*',
'!test/reports/**/*',
'!test/sample/**/*',
'!test/tmp/**/*'
]
},
simplemocha: {
options: {
reporter: 'spec',
timeout: '15000'
},
full: {
src: ['test/test.js']
},
short: {
options: {
reporter: 'dot'
},
src: ['test/test.js']
}
},
exec: {
assets: {
command: 'node test/packages.js && node test/packages-svn.js'
},
'assets-force': {
command:
'node test/packages.js --force && node test/packages-svn.js --force'
},
cover: {
command:
'node node_modules/istanbul/lib/cli.js cover --dir ./test/reports node_modules/mocha/bin/_mocha -- --timeout 30000 -R dot test/test.js'
},
coveralls: {
command: 'npm run coveralls < test/reports/lcov.info',
exitCodes: [0, 1, 2, 3] // Alow for failure for coverage report
}
},
watch: {
files: ['<%= eslint.files %>'],
tasks: ['eslint', 'simplemocha:short']
}
});
grunt.registerTask('assets', ['exec:assets-force']);
grunt.registerTask('test', ['eslint', 'exec:assets', 'simplemocha:full']);
grunt.registerTask('cover', 'exec:cover');
grunt.registerTask('travis', [
'eslint',
'exec:assets',
'exec:cover',
'exec:coveralls'
]);
grunt.registerTask('default', 'test');
grunt.task.registerTask(
'publish',
'Perform final checks and publish Bower',
function() {
var jsonPackage = require('./package');
if (
childProcess
.execSync('git rev-parse --abbrev-ref HEAD')
.toString()
.trim() !== 'master'
) {
grunt.log.writeln(
'You need to release bower from the "master" branch'
);
process.exit(1);
}
if (process.env.SKIP_TESTS !== '1') {
grunt.log.writeln('Reinstalling dependencies...');
childProcess.execSync('rm -rf node_modules && yarn', {
stdio: [0, 1, 2]
});
grunt.log.writeln('Running test suite...');
childProcess.execSync('yarn test', { stdio: [0, 1, 2] });
}
var dir = tmp.dirSync().name;
wrench.copyDirSyncRecursive(__dirname, dir, {
forceDelete: true,
include: function(path) {
return !path.match(/node_modules|\.git|test/);
}
});
grunt.log.writeln('Installing production dependencies...');
childProcess.execSync('yarn --production', {
cwd: dir,
stdio: [0, 1, 2]
});
delete jsonPackage.dependencies;
delete jsonPackage.devDependencies;
delete jsonPackage.scripts;
fs.writeFileSync(
path.resolve(dir, 'package.json'),
JSON.stringify(jsonPackage, null, ' ') + '\n'
);
grunt.log.writeln('Moving node_modules to lib directory...');
wrench.copyDirSyncRecursive(
path.resolve(dir, 'node_modules'),
path.resolve(dir, 'lib', 'node_modules')
);
wrench.rmdirSyncRecursive(path.resolve(dir, 'node_modules'));
grunt.log.writeln('Testing bower on sample project...');
childProcess.execSync(
'cd test/sample && rm -rf bower_components && ' +
dir +
'/bin/bower install --force',
{ stdio: [0, 1, 2] }
);
var expectedPackages = (
'SHA-1 ace-builds almond angular angular-animate angular-bootstrap angular-charts angular-contenteditable ' +
'angular-deckgrid angular-fullscreen angular-gravatar angular-hotkeys angular-local-storage angular-marked ' +
'angular-moment angular-sanitize angular-touch angular-ui-router angular-ui-sortable ' +
'angulartics asEvented bootstrap coffee-script d3 es6-shim font-awesome howler jquery ' +
'jquery-ui jquery-waypoints js-beautify lodash lz-string marked moment ng-file-upload peerjs ' +
'requirejs restangular slimScroll slimScrollHorizontal venturocket-angular-slider'
).split(' ');
var installedPackages = fs.readdirSync(
'./test/sample/bower_components'
);
var installedDiff = arraydiff(expectedPackages, installedPackages);
if (installedDiff.length > 0) {
grunt.log.writeln(
'ERROR. Some packages were not installed by bower: '
);
grunt.log.writeln(installedDiff.join(', '));
process.exit(1);
}
grunt.log.writeln('\nBower production bundle installed in:');
grunt.log.writeln(dir + '\n');
var questions = [
{
type: 'confirm',
name: 'review',
message: 'Did you review all the changes with "git diff"?',
default: false
},
{
type: 'confirm',
name: 'tests',
message:
'Are you sure all tests are passing on Travis and Appveyor?',
default: false
},
{
type: 'confirm',
name: 'publish',
message:
'Are you SURE you want to publish ' +
jsonPackage.name +
'@' +
jsonPackage.version +
'?',
default: false
}
];
var done = this.async();
inquirer.prompt(questions, function(answers) {
if (
!answers.review ||
!answers.changelog ||
!answers.tests ||
!answers.publish
) {
grunt.log.writeln(
'Please publish bower after you fix this issue'
);
process.exit(1);
}
grunt.log.writeln(
'\nPlease remember to tag this release, and add a release with changelog on Github!'
);
grunt.log.writeln(
'\nAlso, please remember to test published Bower one more time!'
);
grunt.log.writeln(
'\nYou can promote this bower release with "npm dist-tag add bower@' + jsonPackage.version + ' latest"'
);
grunt.log.writeln('\nPublishing Bower...');
childProcess.execSync('npm publish --tag beta', {
cwd: dir,
stdio: [0, 1, 2]
});
done();
});
}
);
};

210
README.md
View File

@@ -1,14 +1,10 @@
# Bower - A package manager for the web
[![Build](https://github.com/bower/bower/workflows/build/badge.svg)](https://github.com/bower/bower/actions?query=branch%3Amaster)
[![Backers on Open Collective](https://opencollective.com/bower/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/bower/sponsors/badge.svg)](#sponsors)
> ..psst! While Bower is maintained, we recommend [yarn](https://yarnpkg.com/) and [webpack](https://webpack.js.org/) for new front-end projects!
[![Unix CI](https://img.shields.io/travis/bower/bower/master.svg?maxAge=2592000)](https://travis-ci.org/bower/bower)
[![Windows CI](https://img.shields.io/appveyor/ci/bower/bower/master.svg)](https://ci.appveyor.com/project/bower/bower)
[![Coverage Status](https://img.shields.io/coveralls/bower/bower.svg)](https://coveralls.io/r/bower/bower?branch=master)
[![Discord chat](https://img.shields.io/badge/discord-join%20chat%20%E2%86%92-brightgreen.svg?style=flat)](https://discord.gg/0fFM7QF0KpZRh2cY)
> ..psst! While Bower is maintained, we recommend [yarn](https://yarnpkg.com/) and [webpack](https://webpack.js.org/) or [parcel](https://parceljs.org/) for new front-end projects!
<img align="right" height="300" src="http://bower.io/img/bower-logo.png">
@@ -101,9 +97,11 @@ Bower can be configured using JSON in a `.bowerrc` file. Read over available opt
## Support
* [Discord chat](https://discord.gg/0fFM7QF0KpZRh2cY)
You can ask questions on following channels in order:
* [StackOverflow](http://stackoverflow.com/questions/tagged/bower)
* [Mailinglist](http://groups.google.com/group/twitter-bower) - twitter-bower@googlegroups.com
* [Issue Tracker](https://github.com/bower/bower/issues)
* team@bower.io
## Contributing
@@ -125,72 +123,136 @@ git config --global core.autocrlf input
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>
<a href='https://opencollective.com/bower/tiers/sponsors/1/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/1/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/2/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/2/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/3/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/3/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/4/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/4/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/5/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/5/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/6/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/6/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/7/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/7/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/8/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/8/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/9/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/9/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/10/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/10/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/11/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/11/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/12/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/12/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/13/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/13/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/14/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/14/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/15/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/15/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/16/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/16/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/17/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/17/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/18/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/18/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/19/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/19/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/20/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/20/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/21/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/21/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/22/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/22/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/23/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/23/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/24/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/24/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/25/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/25/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/26/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/26/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/27/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/27/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/28/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/28/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/29/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/29/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/30/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/30/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/31/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/31/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/32/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/32/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/33/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/33/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/34/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/34/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/35/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/35/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/36/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/36/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/37/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/37/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/38/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/38/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/39/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/39/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/40/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/40/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/41/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/41/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/42/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/42/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/43/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/43/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/44/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/44/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/45/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/45/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/46/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/46/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/47/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/47/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/48/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/48/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/49/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/49/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/50/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/50/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/51/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/51/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/52/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/52/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/53/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/53/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/54/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/54/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/55/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/55/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/56/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/56/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/57/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/57/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/58/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/58/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/59/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/59/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/60/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/60/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/61/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/61/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/62/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/62/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/63/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/63/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/64/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/64/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/65/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/65/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/66/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/66/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/67/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/67/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/68/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/68/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/69/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/69/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/70/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/70/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/71/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/71/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/72/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/72/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/73/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/73/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/74/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/74/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/75/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/75/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/76/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/76/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/77/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/77/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/78/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/78/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/79/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/79/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/80/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/80/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/81/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/81/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/82/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/82/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/83/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/83/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/84/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/84/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/85/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/85/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/86/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/86/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/87/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/87/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/88/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/88/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/89/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/89/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/90/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/90/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/91/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/91/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/92/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/92/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/93/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/93/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/94/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/94/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/95/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/95/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/96/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/96/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/97/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/97/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/98/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/98/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/99/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/99/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/100/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/100/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/101/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/101/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/102/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/102/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/103/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/103/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/104/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/104/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/105/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/105/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/106/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/106/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/107/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/107/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/108/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/108/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/109/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/109/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/110/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/110/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/111/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/111/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/112/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/112/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/113/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/113/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/114/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/114/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/115/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/115/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/116/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/116/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/117/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/117/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/118/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/118/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/119/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/119/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/120/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/120/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/121/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/121/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/122/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/122/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/123/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/123/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/124/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/124/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/125/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/125/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/126/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/126/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/127/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/127/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/128/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/128/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/129/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/129/avatar.svg'></a>
<a href='https://opencollective.com/bower/tiers/sponsors/130/website' target='_blank'><img src='https://opencollective.com/bower/tiers/sponsors/130/avatar.svg'></a>
## License

3
SECURITY.md Normal file
View File

@@ -0,0 +1,3 @@
# Security Policy
For critical security issues, please send an e-mail to team@bower.io instead of filing issue here.

View File

@@ -17,9 +17,9 @@ function lookup(logger, name, config) {
return !entry
? null
: {
name: name,
url: entry.url
};
name: name,
url: entry.url
};
}
);
}

View File

@@ -1,9 +1,9 @@
var semver = require('semver');
var which = require('which');
var which = require('../util/which');
var fs = require('../util/fs');
var path = require('path');
var Q = require('q');
var execFile = require('child_process').execFile;
var execFile = require('../util/childProcess').execFile;
var defaultConfig = require('../config');
var createError = require('../util/createError');
@@ -105,10 +105,10 @@ var driver = {
err.code = 'ENOGIT';
throw err;
})
.then(function() {
.then(function(gitPath) {
return Q.nfcall(
execFile,
'git',
gitPath,
['status', '--porcelain'],
{ env: process.env, cwd: cwd }
);

View File

@@ -537,7 +537,7 @@ Manager.prototype._parseDependencies = function(decEndpoint, pkgMeta) {
var compatible;
var childDecEndpoint = endpointParser.json2decomposed(key, value);
// Check if this depdendency should be skipped.
// Check if this dependency should be skipped.
if (
mout.array.contains(
this._config.ignoredDependencies,

View File

@@ -602,7 +602,7 @@ Project.prototype._analyse = function() {
var isSaved =
jsonCopy.dependencies[key] || jsonCopy.devDependencies[key];
// The _direct propery is saved by the manager when .newly is specified
// The _direct property is saved by the manager when .newly is specified
// It may happen pkgMeta is undefined if package is uninstalled
if (!isSaved && pkgMeta && pkgMeta._direct) {
decEndpoint.extraneous = true;

View File

@@ -29,10 +29,8 @@ function GitHubResolver(decEndpoint, config, logger) {
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://');
}
// Use https:// rather than git:// (PR #2611)
this._source = this._source.replace('git://', 'https://');
// Enable shallow clones for GitHub repos
this._shallowClone = function() {

View File

@@ -3,7 +3,7 @@ var path = require('path');
var Q = require('q');
var rimraf = require('../../util/rimraf');
var mkdirp = require('mkdirp');
var which = require('which');
var which = require('../../util/which');
var LRU = require('lru-cache');
var mout = require('mout');
var Resolver = require('./Resolver');

View File

@@ -1,6 +1,6 @@
var util = require('util');
var Q = require('q');
var which = require('which');
var which = require('../../util/which');
var LRU = require('lru-cache');
var mout = require('mout');
var Resolver = require('./Resolver');

View File

@@ -166,7 +166,7 @@ function pluginResolverFactory(resolverFactory, bower) {
})
.then(function() {
// We pass old _resolution (if hasNew has been called before contents).
// So resolver can decide wheter use cached version of contents new one.
// So resolver can decide whether use cached version of contents new one.
if (typeof resolver.fetch !== 'function') {
throw createError(
'Resolver does not implement the "fetch" method.'

View File

@@ -69,33 +69,33 @@ JsonRenderer.prototype.prompt = function(prompts) {
validator: !prompt.validate
? null
: function(value) {
var ret = prompt.validate(value);
var ret = prompt.validate(value);
if (typeof ret === 'string') {
throw ret;
}
if (typeof ret === 'string') {
throw ret;
}
return value;
}
return value;
}
};
// For now only "input", "confirm" and "password" are supported
switch (prompt.type) {
case 'input':
funcName = 'prompt';
break;
case 'confirm':
case 'password':
funcName = prompt.type;
break;
case 'checkbox':
funcName = 'prompt';
break;
default:
promise = promise.then(function() {
throw createError('Unknown prompt type', 'ENOTSUP');
});
return;
case 'input':
funcName = 'prompt';
break;
case 'confirm':
case 'password':
funcName = prompt.type;
break;
case 'checkbox':
funcName = 'prompt';
break;
default:
promise = promise.then(function() {
throw createError('Unknown prompt type', 'ENOTSUP');
});
return;
}
promise = promise.then(function() {

21
lib/util/childProcess.js Normal file
View File

@@ -0,0 +1,21 @@
var childProcess = require('child_process');
var which = require('./which');
function execFile(cmd, args, opt, cb) {
try {
cmd = which.sync(cmd);
} catch (e) {
cb(e);
}
return childProcess.execFile(cmd, args, opt, cb);
}
function spawn(cmd, args, opt) {
cmd = which.sync(cmd);
return childProcess.spawn(cmd, args, opt);
}
module.exports = {
execFile: execFile,
spawn: spawn
};

View File

@@ -1,8 +1,8 @@
var cp = require('child_process');
var cp = require('./childProcess');
var path = require('path');
var Q = require('q');
var mout = require('mout');
var which = require('which');
var which = require('./which');
var PThrottler = require('p-throttler');
var createError = require('./createError');

View File

@@ -130,8 +130,8 @@ function extractGz(archive, dst) {
return deferred.promise;
}
function isSymlink(entry) {
return entry.type === 'SymbolicLink';
function isSymlink(_, entry) {
return entry.type === 'symlink';
}
function filterSymlinks(entry) {

View File

@@ -24,11 +24,10 @@ You can however run a command with sudo using "--allow-root" option';
var cli = require('./cli');
renderer = cli.getRenderer('', false, config);
renderer.error(
createError('Cannot be run with sudo', 'ESUDO', {
createError('Please do not run with sudo', 'ESUDO', {
details: errorMsg
})
);
process.exit(1);
}
}

51
lib/util/which.js Normal file
View File

@@ -0,0 +1,51 @@
var join = require('path').join;
var execFileSync = require('child_process').execFileSync;
var cache = {};
var originalWhich = require('which');
var isWin = process.platform === 'win32';
function which(name, opt, cb) {
if (typeof opt === 'function') {
cb = opt;
opt = {};
}
if (isWin) {
var result = whichSync(name);
if (result) {
cb(null, result);
} else {
cb(new Error('Could not find ' + name + ' in PATH'));
}
} else {
originalWhich(name, opt, cb);
}
}
function whichSync(name, opt) {
if (name in cache) {
return cache[name];
}
if (isWin) {
var WHERE_PATH = join(process.env.WINDIR, 'System32', 'where.exe');
var stdout = execFileSync(WHERE_PATH, ['$PATH:' + name], {
stdio: ['pipe', 'pipe', 'ignore']
}).toString();
var matches = stdout.split('\r\n');
if (matches.length === 0) {
throw new Error('Could not find ' + name + ' in PATH');
}
var result = matches[0].trim();
cache[name] = result;
return result;
}
var result = originalWhich.sync(name, opt);
cache[name] = result;
return result;
}
which.sync = whichSync;
module.exports = which;

View File

@@ -1,6 +1,7 @@
{
"private": true,
"name": "bower",
"version": "1.8.3",
"version": "1.8.14",
"description": "The browser package manager",
"author": "Twitter",
"license": "MIT",
@@ -17,16 +18,11 @@
"dependencies": {
"abbrev": "^1.0.5",
"archy": "1.0.0",
"bower-config": "^1.4.1",
"bower-endpoint-parser": "^0.2.2",
"bower-json": "^0.8.1",
"bower-logger": "^0.2.2",
"bower-registry-client": "^1.0.0",
"cardinal": "0.4.4",
"chalk": "^1.0.0",
"chmodr": "^1.0.2",
"chmodr": "1.0.2",
"configstore": "^2.0.0",
"decompress-zip": "^0.2.1",
"decompress-zip": "^0.2.2",
"destroy": "^1.0.3",
"findup-sync": "^0.3.0",
"fs-write-stream-atomic": "1.0.8",
@@ -35,7 +31,7 @@
"github": "^0.2.3",
"glob": "^4.3.2",
"graceful-fs": "^4.1.3",
"handlebars": "^4.0.5",
"handlebars": "^4.5.3",
"inquirer": "0.10.0",
"is-root": "^1.0.0",
"junk": "^1.0.0",
@@ -68,44 +64,46 @@
"devDependencies": {
"arr-diff": "^2.0.0",
"chai": "^3.5.0",
"coveralls": "^2.11.9",
"eslint": "^4.18.2",
"expect.js": "^0.3.1",
"grunt": "^1.0.1",
"grunt-cli": "^1.1.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-eslint": "^18.1.0",
"grunt-exec": "^0.4.7",
"grunt-simple-mocha": "^0.4.1",
"husky": "^0.14.3",
"in-publish": "^2.0.0",
"istanbul": "^0.4.3",
"lint-staged": "^7.0.0",
"load-grunt-tasks": "^3.5.0",
"mocha": "^2.5.3",
"lint-staged": "^9.5.0",
"mocha": "^3.5.3",
"multiline": "^1.0.2",
"nock": "^9.2.3",
"nock": "^11.7.0",
"nock-legacy": "npm:nock@9.2.3",
"node-uuid": "^1.4.7",
"prettier": "^1.11.1",
"prettier": "^1.19.1",
"proxyquire": "^1.7.9",
"spawn-sync": "1.0.15",
"wrench": "^1.5.8"
},
"scripts": {
"test": "grunt test",
"ci": "grunt travis",
"coveralls": "coveralls",
"prepublish": "in-publish && echo 'You need to use \"grunt publish\" to publish bower' && false || not-in-publish",
"lint": "eslint .",
"test": "node test/packages.js && node test/packages-svn.js && mocha --timeout 15000 --reporter spec",
"prepublishOnly": "in-publish && echo 'You need to use \"node publish.js\" to publish bower' && false || not-in-publish",
"format": "prettier --write --single-quote --tab-width 4 '**/*.js'",
"precommit": "lint-staged"
},
"lint-staged": {
"*.js": [
"prettier --single-quote --tab-width 4",
"git add"
"prettier --single-quote --tab-width 4"
]
},
"files": [
"bin",
"lib"
],
"resolutions": {
"deep-extend": "0.5.1",
"minimist": "0.2.1"
},
"workspaces": [
"packages/bower-config",
"packages/bower-endpoint-parser",
"packages/bower-json",
"packages/bower-logger",
"packages/bower-registry-client"
]
}

View File

@@ -1,61 +0,0 @@
{
"predef": [
"console",
"describe",
"it",
"after",
"afterEach",
"before",
"beforeEach"
],
"indent": 4,
"node": true,
"devel": true,
"bitwise": false,
"curly": false,
"eqeqeq": true,
"forin": false,
"immed": true,
"latedef": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": true,
"plusplus": false,
"regexp": false,
"undef": true,
"unused": true,
"quotmark": "single",
"strict": false,
"trailing": true,
"asi": false,
"boss": true,
"debug": false,
"eqnull": true,
"es5": false,
"esnext": false,
"evil": false,
"expr": false,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": true,
"laxcomma": false,
"loopfunc": true,
"multistr": false,
"onecase": true,
"regexdash": false,
"scripturl": false,
"smarttabs": false,
"shadow": false,
"sub": false,
"supernew": true,
"validthis": false,
"nomen": false,
"white": true
}

View File

@@ -1,9 +0,0 @@
sudo: false
language: node_js
node_js:
- '5'
- '4'
- '0.12'
- '0.10'
script:
- grunt travis

View File

@@ -1,5 +1,13 @@
# Changelog
## 1.4.2
- Prevent errors when expanded env variable does not exist
## 1.4.2
- Update minimist to 0.2.1 to fix security issue
## 1.4.0
- Change default shorthand resolver from git:// to https://

View File

@@ -1,54 +0,0 @@
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
grunt.initConfig({
jshint: {
options: {
jshintrc: '.jshintrc'
},
files: [
'Gruntfile.js',
'bin/*',
'lib/**/*.js',
'test/**/*.js',
'!test/assets/**/*',
'!test/reports/**/*',
'!test/tmp/**/*'
]
},
simplemocha: {
options: {
reporter: 'spec',
timeout: '10000'
},
full: {
src: ['test/test.js']
},
short: {
options: {
reporter: 'dot'
},
src: ['test/test.js']
}
},
exec: {
cover: {
command:
'STRICT_REQUIRE=1 node node_modules/istanbul/lib/cli.js cover --dir ./test/reports node_modules/mocha/bin/_mocha -- --timeout 30000 -R dot test/test.js'
},
coveralls: {
command:
'node node_modules/.bin/coveralls < test/reports/lcov.info'
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'simplemocha:short']
}
});
grunt.registerTask('test', ['jshint', 'simplemocha:full']);
grunt.registerTask('cover', 'exec:cover');
grunt.registerTask('travis', ['jshint', 'exec:cover', 'exec:coveralls']);
grunt.registerTask('default', 'test');
};

View File

@@ -1,4 +1,4 @@
# bower-config [![Build Status](https://secure.travis-ci.org/bower/config.png?branch=master)](http://travis-ci.org/bower/config)[![Coverage Status](https://coveralls.io/repos/bower/config/badge.svg?branch=master&service=github)](https://coveralls.io/github/bower/config?branch=master)
# bower-config
> The Bower config (`.bowerrc`) reader and writer.

View File

@@ -33,9 +33,7 @@ function doEnvReplaceStr(f) {
esc = esc.length && esc.length % 2;
if (esc) return orig;
if (undefined === process.env[name]) {
throw new Error(
'Environment variable used in .bowerrc is not defined: ' + orig
);
return '${' + name + '}';
}
return process.env[name];

View File

@@ -1,6 +1,6 @@
var path = require('path');
var fs = require('graceful-fs');
var optimist = require('optimist');
var optimist = require('../vendor/optimist');
var osenv = require('osenv');
var object = require('mout/object');
var string = require('mout/string');

View File

@@ -0,0 +1,358 @@
var path = require('path');
var minimist = require('minimist');
var wordwrap = require('wordwrap');
/* Hack an instance of Argv with process.argv into Argv
so people can do
require('optimist')(['--beeble=1','-z','zizzle']).argv
to parse a list of args and
require('optimist').argv
to get a parsed version of process.argv.
*/
var inst = Argv(process.argv.slice(2));
Object.keys(inst).forEach(function(key) {
Argv[key] =
typeof inst[key] == 'function' ? inst[key].bind(inst) : inst[key];
});
var exports = (module.exports = Argv);
function Argv(processArgs, cwd) {
var self = {};
if (!cwd) cwd = process.cwd();
self.$0 = process.argv
.slice(0, 2)
.map(function(x) {
var b = rebase(cwd, x);
return x.match(/^\//) && b.length < x.length ? b : x;
})
.join(' ');
if (process.env._ != undefined && process.argv[1] == process.env._) {
self.$0 = process.env._.replace(
path.dirname(process.execPath) + '/',
''
);
}
var options = {
boolean: [],
string: [],
alias: {},
default: []
};
self.boolean = function(bools) {
options.boolean.push.apply(options.boolean, [].concat(bools));
return self;
};
self.string = function(strings) {
options.string.push.apply(options.string, [].concat(strings));
return self;
};
self.default = function(key, value) {
if (typeof key === 'object') {
Object.keys(key).forEach(function(k) {
self.default(k, key[k]);
});
} else {
options.default[key] = value;
}
return self;
};
self.alias = function(x, y) {
if (typeof x === 'object') {
Object.keys(x).forEach(function(key) {
self.alias(key, x[key]);
});
} else {
options.alias[x] = (options.alias[x] || []).concat(y);
}
return self;
};
var demanded = {};
self.demand = function(keys) {
if (typeof keys == 'number') {
if (!demanded._) demanded._ = 0;
demanded._ += keys;
} else if (Array.isArray(keys)) {
keys.forEach(function(key) {
self.demand(key);
});
} else {
demanded[keys] = true;
}
return self;
};
var usage;
self.usage = function(msg, opts) {
if (!opts && typeof msg === 'object') {
opts = msg;
msg = null;
}
usage = msg;
if (opts) self.options(opts);
return self;
};
function fail(msg) {
self.showHelp();
if (msg) console.error(msg);
process.exit(1);
}
var checks = [];
self.check = function(f) {
checks.push(f);
return self;
};
var descriptions = {};
self.describe = function(key, desc) {
if (typeof key === 'object') {
Object.keys(key).forEach(function(k) {
self.describe(k, key[k]);
});
} else {
descriptions[key] = desc;
}
return self;
};
self.parse = function(args) {
return parseArgs(args);
};
self.option = self.options = function(key, opt) {
if (typeof key === 'object') {
Object.keys(key).forEach(function(k) {
self.options(k, key[k]);
});
} else {
if (opt.alias) self.alias(key, opt.alias);
if (opt.demand) self.demand(key);
if (typeof opt.default !== 'undefined') {
self.default(key, opt.default);
}
if (opt.boolean || opt.type === 'boolean') {
self.boolean(key);
}
if (opt.string || opt.type === 'string') {
self.string(key);
}
var desc = opt.describe || opt.description || opt.desc;
if (desc) {
self.describe(key, desc);
}
}
return self;
};
var wrap = null;
self.wrap = function(cols) {
wrap = cols;
return self;
};
self.showHelp = function(fn) {
if (!fn) fn = console.error;
fn(self.help());
};
self.help = function() {
var keys = Object.keys(
Object.keys(descriptions)
.concat(Object.keys(demanded))
.concat(Object.keys(options.default))
.reduce(function(acc, key) {
if (key !== '_') acc[key] = true;
return acc;
}, {})
);
var help = keys.length ? ['Options:'] : [];
if (usage) {
help.unshift(usage.replace(/\$0/g, self.$0), '');
}
var switches = keys.reduce(function(acc, key) {
acc[key] = [key]
.concat(options.alias[key] || [])
.map(function(sw) {
return (sw.length > 1 ? '--' : '-') + sw;
})
.join(', ');
return acc;
}, {});
var switchlen = longest(
Object.keys(switches).map(function(s) {
return switches[s] || '';
})
);
var desclen = longest(
Object.keys(descriptions).map(function(d) {
return descriptions[d] || '';
})
);
keys.forEach(function(key) {
var kswitch = switches[key];
var desc = descriptions[key] || '';
if (wrap) {
desc = wordwrap(switchlen + 4, wrap)(desc).slice(switchlen + 4);
}
var spadding = new Array(
Math.max(switchlen - kswitch.length + 3, 0)
).join(' ');
var dpadding = new Array(
Math.max(desclen - desc.length + 1, 0)
).join(' ');
var type = null;
if (options.boolean[key]) type = '[boolean]';
if (options.string[key]) type = '[string]';
if (!wrap && dpadding.length > 0) {
desc += dpadding;
}
var prelude = ' ' + kswitch + spadding;
var extra = [
type,
demanded[key] ? '[required]' : null,
options.default[key] !== undefined
? '[default: ' + JSON.stringify(options.default[key]) + ']'
: null
]
.filter(Boolean)
.join(' ');
var body = [desc, extra].filter(Boolean).join(' ');
if (wrap) {
var dlines = desc.split('\n');
var dlen =
dlines.slice(-1)[0].length +
(dlines.length === 1 ? prelude.length : 0);
body =
desc +
(dlen + extra.length > wrap - 2
? '\n' +
new Array(wrap - extra.length + 1).join(' ') +
extra
: new Array(wrap - extra.length - dlen + 1).join(' ') +
extra);
}
help.push(prelude + body);
});
help.push('');
return help.join('\n');
};
Object.defineProperty(self, 'argv', {
get: function() {
return parseArgs(processArgs);
},
enumerable: true
});
function parseArgs(args) {
var argv = minimist(args, options);
argv.$0 = self.$0;
if (demanded._ && argv._.length < demanded._) {
fail(
'Not enough non-option arguments: got ' +
argv._.length +
', need at least ' +
demanded._
);
}
var missing = [];
Object.keys(demanded).forEach(function(key) {
if (!argv[key]) missing.push(key);
});
if (missing.length) {
fail('Missing required arguments: ' + missing.join(', '));
}
checks.forEach(function(f) {
try {
if (f(argv) === false) {
fail('Argument check failed: ' + f.toString());
}
} catch (err) {
fail(err);
}
});
return argv;
}
function longest(xs) {
return Math.max.apply(
null,
xs.map(function(x) {
return x.length;
})
);
}
return self;
}
// rebase an absolute path to a relative one with respect to a base directory
// exported for tests
exports.rebase = rebase;
function rebase(base, dir) {
var ds = path
.normalize(dir)
.split('/')
.slice(1);
var bs = path
.normalize(base)
.split('/')
.slice(1);
for (var i = 0; ds[i] && ds[i] == bs[i]; i++);
ds.splice(0, i);
bs.splice(0, i);
var p = path
.normalize(
bs
.map(function() {
return '..';
})
.concat(ds)
.join('/')
)
.replace(/\/$/, '')
.replace(/^$/, '.');
return p.match(/^[.\/]/) ? p : './' + p;
}

View File

@@ -1,6 +1,6 @@
{
"name": "bower-config",
"version": "1.4.0",
"version": "1.4.3",
"description": "The Bower config reader and writer.",
"author": "Twitter",
"license": "MIT",
@@ -12,32 +12,23 @@
},
"dependencies": {
"graceful-fs": "^4.1.3",
"minimist": "^0.2.1",
"mout": "^1.0.0",
"optimist": "^0.6.1",
"osenv": "^0.1.3",
"untildify": "^2.1.0"
"untildify": "^2.1.0",
"wordwrap": "^0.0.3"
},
"devDependencies": {
"coveralls": "^2.11.4",
"expect.js": "^0.3.1",
"glob": "^4.5.3",
"grunt": "^0.4.5",
"grunt-cli": "^0.1.13",
"grunt-contrib-jshint": "^0.10.0",
"grunt-contrib-watch": "^0.6.1",
"grunt-coveralls": "^1.0.0",
"grunt-exec": "^0.4.6",
"grunt-simple-mocha": "^0.4.0",
"istanbul": "^0.4.1",
"load-grunt-tasks": "^2.0.0",
"mkdirp": "^0.5.0",
"mocha": "~1.12.0",
"mocha": "^3.5.3",
"node-uuid": "^1.4.3",
"q": "^1.2.0",
"rimraf": "^2.3.2"
},
"scripts": {
"test": "grunt test"
"test": "mocha test"
},
"files": [
"lib"

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env node
var path = require('path');
var bowerConfig = require('..');
var config = bowerConfig.read(path.join(__dirname + '/assets/env-variables'), {
foo: 'bar'
});
console.log(config);

View File

@@ -177,18 +177,25 @@ describe('NPM Config on package.json', function() {
assert.equal(process.env.HTTPS_PROXY, 'http://HTTPS_PROXY');
assert.equal(process.env.NO_PROXY, 'google.com');
assert.equal(process.env.http_proxy, undefined);
assert.equal(process.env.https_proxy, undefined);
assert.equal(process.env.no_proxy, undefined);
// On windows env is case insensitive
if (process.platform === 'win32') {
assert.equal(process.env.http_proxy, 'http://HTTP_PROXY');
assert.equal(process.env.https_proxy, 'http://HTTPS_PROXY');
assert.equal(process.env.no_proxy, 'google.com');
} else {
assert.equal(process.env.http_proxy, undefined);
assert.equal(process.env.https_proxy, undefined);
assert.equal(process.env.no_proxy, undefined);
}
});
it('restores env variables', function() {
process.env.HTTP_PROXY = 'a';
process.env.HTTPS_PROXY = 'b';
process.env.NO_PROXY = 'c';
process.env.http_proxy = 'd';
process.env.https_proxy = 'e';
process.env.no_proxy = 'f';
process.env.HTTP_PROXY = 'a';
process.env.HTTPS_PROXY = 'b';
process.env.NO_PROXY = 'c';
var config = require('../lib/Config')
.create('test/assets/env-variables')
@@ -199,9 +206,16 @@ describe('NPM Config on package.json', function() {
assert.equal(process.env.HTTPS_PROXY, 'b');
assert.equal(process.env.NO_PROXY, 'c');
assert.equal(process.env.http_proxy, 'd');
assert.equal(process.env.https_proxy, 'e');
assert.equal(process.env.no_proxy, 'f');
// On windows precedence for restoring is for capital case
if (process.platform === 'win32') {
assert.equal(process.env.http_proxy, 'a');
assert.equal(process.env.https_proxy, 'b');
assert.equal(process.env.no_proxy, 'c');
} else {
assert.equal(process.env.http_proxy, 'd');
assert.equal(process.env.https_proxy, 'e');
assert.equal(process.env.no_proxy, 'f');
}
});
it('restores env variables if they are undefined', function() {
@@ -241,7 +255,7 @@ describe('Allow ${ENV} variables in .bowerrc', function() {
'test/assets/env-variables-values'
);
assert.equal('a', config.storage.packages);
assert.equal('/tmp/b', config.tmp);
assert.equal(path.resolve('/tmp/b'), config.tmp);
assert.equal('username:password', config.storage.registry.search[0]);
assert.equal('${_myshellvar}', config.scripts.postinstall);
});

View File

@@ -1,61 +0,0 @@
{
"predef": [
"console",
"describe",
"it",
"after",
"afterEach",
"before",
"beforeEach"
],
"indent": 4,
"node": true,
"devel": true,
"bitwise": false,
"curly": false,
"eqeqeq": true,
"forin": false,
"immed": true,
"latedef": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": true,
"plusplus": false,
"regexp": false,
"undef": true,
"unused": true,
"quotmark": "single",
"strict": false,
"trailing": true,
"camelcase": true,
"asi": false,
"boss": true,
"debug": false,
"eqnull": true,
"esnext": false,
"evil": false,
"expr": true,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": true,
"laxcomma": false,
"loopfunc": true,
"multistr": false,
"onecase": true,
"regexdash": false,
"scripturl": false,
"smarttabs": false,
"shadow": false,
"sub": false,
"supernew": true,
"validthis": false,
"nomen": false,
"white": true
}

View File

@@ -1,4 +0,0 @@
language: node_js
node_js:
- "0.10"
- "0.8"

View File

@@ -1,4 +1,4 @@
# endpoint-parser [![Build Status](https://secure.travis-ci.org/bower/endpoint-parser.png?branch=master)](http://travis-ci.org/bower/endpoint-parser)
# bower-endpoint-parser
Little module that helps with endpoints parsing.

View File

@@ -16,7 +16,7 @@
},
"devDependencies": {
"expect.js": "~0.2.0",
"mocha": "~1.12.0",
"mocha": "^3.5.3",
"mout": "~0.9.0"
},
"scripts": {

View File

@@ -1,48 +0,0 @@
{
"indent": 4,
"node": true,
"devel": true,
"mocha": true,
"bitwise": false,
"curly": false,
"eqeqeq": true,
"forin": false,
"immed": true,
"latedef": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": true,
"plusplus": false,
"regexp": false,
"undef": true,
"unused": true,
"quotmark": "single",
"strict": false,
"camelcase": true,
"asi": false,
"boss": true,
"debug": false,
"eqnull": true,
"es5": false,
"esnext": false,
"evil": false,
"expr": false,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": true,
"laxcomma": false,
"loopfunc": true,
"multistr": false,
"onecase": true,
"regexdash": false,
"scripturl": false,
"shadow": false,
"sub": false,
"supernew": true,
"validthis": false
}

View File

@@ -1,10 +0,0 @@
sudo: false
language: node_js
node_js:
- '5'
- '4'
- '0.12'
- '0.10'
script:
- grunt travis

View File

@@ -1,3 +1,15 @@
# 0.8.4
- Update deep-extend (security fix)
# 0.8.3
- Fix requires
# 0.8.2
- Drop dependency on meow (vendor ext-name)
# 0.8.1
- Revert strict name validations and allow @, spaces and slashes

View File

@@ -1,57 +0,0 @@
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
// Project configuration.
grunt.initConfig({
jshint: {
files: [
'Gruntfile.js',
'lib/**/*.js',
'test/**/*.js',
'!test/reports/**/*'
],
options: {
jshintrc: '.jshintrc'
}
},
simplemocha: {
options: {
reporter: 'spec'
},
full: { src: ['test/test.js'] },
short: {
options: {
reporter: 'dot'
},
src: ['test/test.js']
},
build: {
options: {
reporter: 'tap'
},
src: ['test/test.js']
}
},
exec: {
cover: {
command:
'STRICT_REQUIRE=1 node node_modules/istanbul/lib/cli.js cover --dir ./test/reports node_modules/mocha/bin/_mocha -- --timeout 30000 -R dot test/test.js'
},
coveralls: {
command:
'node node_modules/.bin/coveralls < test/reports/lcov.info'
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'simplemocha:short']
}
});
// Default task.
grunt.registerTask('test', ['simplemocha:full']);
grunt.registerTask('default', ['jshint', 'test']);
grunt.registerTask('travis', ['jshint', 'exec:cover', 'exec:coveralls']);
};

View File

@@ -1,4 +1,4 @@
# bower-json [![Build Status](https://secure.travis-ci.org/bower/json.png?branch=master)](http://travis-ci.org/bower/json) [![Coverage Status](https://coveralls.io/repos/bower/json/badge.svg?branch=master&service=github)](https://coveralls.io/github/bower/json?branch=master)
# bower-json
Read `bower.json` files with semantics, normalisation, defaults and validation.

View File

@@ -1,4 +1,4 @@
var extName = require('ext-name');
var extName = require('../vendor/ext-name');
function isAsset(filename) {
var info = extName(filename);

View File

@@ -0,0 +1,19 @@
'use strict';
var endsWith = require('ends-with');
var extList = require('ext-list');
var sortKeysLength = require('sort-keys-length');
module.exports = function(str) {
var obj = sortKeysLength.desc(extList());
var ext = Object.keys(obj).filter(endsWith.bind(null, str));
if (!ext.length) {
return;
}
return {
ext: ext[0],
mime: obj[ext[0]]
};
};

View File

@@ -1,6 +1,6 @@
{
"name": "bower-json",
"version": "0.8.1",
"version": "0.8.4",
"description": "Read bower.json files with semantics, normalisation, defaults and validation",
"author": "Twitter",
"license": "MIT",
@@ -10,29 +10,21 @@
"node": ">=0.10.0"
},
"dependencies": {
"deep-extend": "^0.4.0",
"ext-name": "^3.0.0",
"deep-extend": "^0.5.1",
"ends-with": "^0.2.0",
"ext-list": "^2.0.0",
"sort-keys-length": "^1.0.0",
"graceful-fs": "^4.1.3",
"intersect": "^1.0.1"
},
"devDependencies": {
"coveralls": "^2.11.2",
"expect.js": "^0.3.1",
"grunt": "^0.4.4",
"grunt-cli": "^0.1.13",
"grunt-contrib-jshint": "^0.11.2",
"grunt-contrib-watch": "^0.6.1",
"grunt-coveralls": "^1.0.0",
"grunt-exec": "^0.4.6",
"grunt-simple-mocha": "^0.4.0",
"istanbul": "^0.3.5",
"load-grunt-tasks": "^3.3.0",
"mocha": "*",
"mocha": "^3.5.3",
"request": "^2.64.0",
"underscore.string": "^3.0.3"
},
"scripts": {
"test": "grunt test"
"test": "mocha"
},
"files": [
"lib"

View File

@@ -162,7 +162,9 @@ describe('.read', function() {
return done(err);
}
expect(file).to.equal(__dirname + '/pkg-bower-json/bower.json');
expect(file).to.equal(
path.resolve(__dirname + '/pkg-bower-json/bower.json')
);
done();
});
});

View File

@@ -1,62 +0,0 @@
{
"predef": [
"console",
"describe",
"it",
"after",
"afterEach",
"before",
"beforeEach"
],
"indent": 4,
"node": true,
"devel": true,
"bitwise": false,
"curly": false,
"eqeqeq": true,
"forin": false,
"immed": true,
"latedef": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": true,
"plusplus": false,
"regexp": false,
"undef": true,
"unused": true,
"quotmark": "single",
"strict": false,
"trailing": true,
"camelcase": true,
"asi": false,
"boss": true,
"debug": false,
"eqnull": true,
"es5": false,
"esnext": false,
"evil": false,
"expr": false,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": true,
"laxcomma": false,
"loopfunc": true,
"multistr": false,
"onecase": true,
"regexdash": false,
"scripturl": false,
"smarttabs": false,
"shadow": false,
"sub": false,
"supernew": true,
"validthis": false,
"nomen": false,
"white": true
}

View File

@@ -1,6 +0,0 @@
sudo: false
language: node_js
node_js:
- 'iojs'
- '0.12'
- '0.10'

View File

@@ -1,4 +1,4 @@
# bower-logger [![Build Status](https://secure.travis-ci.org/bower/logger.png?branch=master)](http://travis-ci.org/bower/logger)
# bower-logger
The logger used in the various architecture components of Bower.

View File

@@ -16,12 +16,12 @@
},
"devDependencies": {
"expect.js": "~0.2.0",
"mocha": "~1.12.0"
"mocha": "^3.5.3"
},
"scripts": {
"test": "mocha -R spec"
},
"files": [
"lib"
"lib"
]
}

View File

@@ -1,61 +0,0 @@
{
"predef": [
"console",
"describe",
"it",
"after",
"afterEach",
"before",
"beforeEach"
],
"indent": 4,
"node": true,
"devel": true,
"bitwise": false,
"curly": false,
"eqeqeq": true,
"forin": false,
"immed": true,
"latedef": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": true,
"plusplus": false,
"regexp": false,
"undef": true,
"unused": "vars",
"quotmark": "single",
"strict": false,
"trailing": true,
"camelcase": true,
"asi": false,
"boss": true,
"debug": false,
"eqnull": true,
"esnext": false,
"evil": false,
"expr": true,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": true,
"laxcomma": false,
"loopfunc": true,
"multistr": false,
"onecase": true,
"regexdash": false,
"scripturl": false,
"smarttabs": false,
"shadow": false,
"sub": false,
"supernew": true,
"validthis": false,
"nomen": false,
"white": true
}

View File

@@ -1,6 +0,0 @@
sudo: false
language: node_js
node_js:
- 'iojs'
- '0.12'
- '0.10'

View File

@@ -1,42 +0,0 @@
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-simple-mocha');
grunt.initConfig({
jshint: {
files: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js'],
options: {
jshintrc: '.jshintrc'
}
},
simplemocha: {
options: {
reporter: 'spec',
timeout: 20000
},
full: {
src: ['test/runner.js']
},
short: {
options: {
reporter: 'dot'
},
src: ['test/runner.js']
},
build: {
options: {
reporter: 'tap'
},
src: ['test/runner.js']
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'simplemocha:short']
}
});
grunt.registerTask('test', ['simplemocha:full']);
grunt.registerTask('default', ['jshint', 'test']);
};

View File

@@ -1,4 +1,4 @@
# bower-registry-client [![Build Status](https://travis-ci.org/bower/registry-client.png?branch=master)](https://travis-ci.org/bower/registry-client)
# bower-registry-client
> Provides easy interaction with the Bower registry

View File

@@ -21,16 +21,11 @@
"devDependencies": {
"bower-config": "^1.1.2",
"expect.js": "~0.2.0",
"grunt": "~0.4.1",
"grunt-cli": "^0.1.13",
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-watch": "~0.5.0",
"grunt-simple-mocha": "~0.4.0",
"mocha": "~1.12.0",
"nock": "~0.22.0"
"mocha": "^3.5.3",
"nock": "9.2.3"
},
"scripts": {
"test": "grunt test"
"test": "mocha"
},
"files": [
"lib",

View File

@@ -2,9 +2,9 @@ var RegistryClient = require('../Client');
var fs = require('fs');
var expect = require('expect.js');
var md5 = require('../lib/util/md5');
var nock = require('nock');
var http = require('http');
var Config = require('bower-config');
var nock = require('nock');
describe('RegistryClient', function() {
beforeEach(function() {
@@ -213,12 +213,12 @@ describe('RegistryClient', function() {
expect(entry.url).to.eql(
'git://github.com/components/jquery.git'
);
next();
});
next();
});
});
describe('calling the lookup instance method without argument', function() {
describe.skip('calling the lookup instance method without argument', function() {
it('should return no result', function(next) {
this.timeout(10000);
this.registry.lookup('', function(err, entry) {
@@ -647,7 +647,7 @@ describe('RegistryClient', function() {
describe('calling the list instance method with two registries', function() {
beforeEach(function() {
nock('https://registry.bower.io:443')
nock('https://registry.bower.io')
.get('/packages')
.reply(200, []);
@@ -660,6 +660,9 @@ describe('RegistryClient', function() {
}
]);
this.pkg = 'jquery';
this.pkgUrl = 'git://github.com/bar/foo.git';
this.registry = new RegistryClient(
Config.read(process.cwd(), {
strictSsl: false,

View File

@@ -3,7 +3,7 @@ var expect = require('expect.js');
describe('Cache', function() {
beforeEach(function() {
this.cache = new Cache();
this.cache = new Cache(__dirname);
});
describe('Constructor', function() {

128
publish.js Normal file
View File

@@ -0,0 +1,128 @@
var tmp = require('tmp');
var fs = require('fs');
var path = require('path');
var glob = require('glob');
var childProcess = require('child_process');
var arraydiff = require('arr-diff');
var wrench = require('wrench');
var jsonPackage = require('./package');
if (
childProcess
.execSync('git rev-parse --abbrev-ref HEAD')
.toString()
.trim() !== 'master'
) {
console.log('You need to release bower from the "master" branch');
process.exit(1);
}
var dir = path.join(tmp.dirSync().name, 'package');
console.log('\nInstalling production bundle in:');
console.log(dir + '\n');
wrench.copyDirSyncRecursive(__dirname, dir, {
forceDelete: true,
include: function(path) {
return !path.match(/node_modules|\.git|test/);
}
});
delete jsonPackage.scripts;
delete jsonPackage.private;
jsonPackage.workspaces.forEach(function(name) {
jsonPackage.dependencies[name.split('/').reverse()[0]] = 'file:./' + name;
});
delete jsonPackage.workspaces;
fs.writeFileSync(
path.resolve(dir, 'package.json'),
JSON.stringify(jsonPackage, null, ' ') + '\n'
);
console.log('Installing production dependencies...');
childProcess.execSync('yarn --production', {
cwd: dir,
stdio: [0, 1, 2]
});
delete jsonPackage.dependencies;
delete jsonPackage.resolutions;
delete jsonPackage['lint-staged'];
delete jsonPackage.devDependencies;
delete jsonPackage.files;
fs.writeFileSync(
path.resolve(dir, 'package.json'),
JSON.stringify(jsonPackage, null, ' ') + '\n'
);
glob.sync(path.join(dir, '**', '.npmignore')).forEach(function(file) {
fs.rmSync(file);
});
fs.writeFileSync(path.resolve(dir, '.npmignore'), '');
console.log('Moving node_modules to lib directory...');
wrench.copyDirSyncRecursive(
path.resolve(dir, 'node_modules'),
path.resolve(dir, 'lib', 'node_modules')
);
wrench.rmdirSyncRecursive(path.resolve(dir, 'node_modules'));
glob.sync(path.join(dir, '**', 'package.json')).forEach(function(file) {
console.log(file);
var json = JSON.parse(fs.readFileSync(file));
delete json.files;
fs.writeFileSync(file, JSON.stringify(json, null, ' ') + '\n');
});
console.log('Testing bower on sample project...');
childProcess.execSync(
'cd test/sample && rm -rf bower_components && ' +
dir +
'/bin/bower install --force',
{ stdio: [0, 1, 2] }
);
var expectedPackages = (
'SHA-1 ace-builds almond angular angular-animate angular-bootstrap angular-charts angular-contenteditable ' +
'angular-deckgrid angular-fullscreen angular-gravatar angular-hotkeys angular-local-storage angular-marked ' +
'angular-moment angular-sanitize angular-touch angular-ui-router angular-ui-sortable ' +
'angulartics asEvented bootstrap coffee-script d3 es6-shim font-awesome howler jquery ' +
'jquery-ui jquery-waypoints js-beautify lodash lz-string marked moment ng-file-upload peerjs ' +
'requirejs restangular slimScroll slimScrollHorizontal venturocket-angular-slider'
).split(' ');
var installedPackages = fs.readdirSync('./test/sample/bower_components');
var installedDiff = arraydiff(expectedPackages, installedPackages);
if (installedDiff.length > 0) {
console.log('ERROR. Some packages were not installed by bower: ');
console.log(installedDiff.join(', '));
process.exit(1);
}
var tgzName = 'bower-' + jsonPackage.version + '.tgz';
childProcess.execSync('npm pack', {
cwd: dir,
stdio: [0, 1, 2]
});
fs.copyFileSync(path.join(dir, tgzName), path.join(__dirname, tgzName));
console.log('All done!');
console.log('You need to publish prerelease and release manually:');
console.log('');
console.log('- npm install -g ' + tgzName);
console.log('- npm publish ' + tgzName + ' --tag beta');
console.log('- npm dist-tag add bower@' + jsonPackage.version + ' latest');

View File

@@ -1,7 +1,7 @@
var expect = require('expect.js');
var path = require('path');
var helpers = require('../helpers');
var nock = require('nock');
var nock = require('../util/nock');
var rimraf = require('rimraf');
var fs = require('../../lib/util/fs');
var tar = require('tar-fs');
@@ -692,7 +692,7 @@ describe('bower install', function() {
});
});
it('recognizes proxy option in config', function(done) {
it('recognizes proxy option in config', function() {
this.timeout(10000);
tempDir.prepare({
@@ -708,8 +708,10 @@ describe('bower install', function() {
cwd: tempDir.path
});
nock('http://dummy.local')
.get('http://github.com/yahoo/pure/archive/v0.6.0.tar.gz')
nock('http://dummy.local/')
.get(function(uri) {
return true;
})
.reply(500);
return helpers
@@ -720,7 +722,6 @@ describe('bower install', function() {
])
.fail(function(error) {
expect(error.message).to.equal('Status code of 500');
done();
});
});

View File

@@ -268,8 +268,7 @@ describe('PackageRepository', function() {
return Q.resolve([tempPackage, json]);
};
copy
.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
copy.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
.then(function() {
fs.writeFileSync(
path.join(tempPackage, '.bower.json'),
@@ -316,8 +315,7 @@ describe('PackageRepository', function() {
return Q.resolve([tempPackage, json]);
};
copy
.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
copy.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
.then(function() {
fs.writeFileSync(
path.join(tempPackage, '.bower.json'),
@@ -364,8 +362,7 @@ describe('PackageRepository', function() {
return Q.resolve([tempPackage, json]);
};
copy
.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
copy.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
.then(function() {
fs.writeFileSync(
path.join(tempPackage, '.bower.json'),
@@ -410,8 +407,7 @@ describe('PackageRepository', function() {
return Q.resolve([tempPackage, json]);
};
copy
.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
copy.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
.then(function() {
fs.writeFileSync(
path.join(tempPackage, '.bower.json'),

View File

@@ -88,9 +88,10 @@ describe('ResolveCache', function() {
// Create a fresh copy of the test package into temp
rimraf.sync(tempPackage);
copy
.copyDir(testPackage, tempPackage, { ignore: ['.git'] })
.then(next.bind(next, null), next);
copy.copyDir(testPackage, tempPackage, { ignore: ['.git'] }).then(
next.bind(next, null),
next
);
});
it('should move the canonical dir to source-md5/version/ folder if package meta has a version', function(next) {
@@ -158,8 +159,7 @@ describe('ResolveCache', function() {
var pkgMeta = path.join(tempPackage, '.bower.json');
// Copy bower.json to .bower.json and add some props
copy
.copyFile(path.join(tempPackage, 'component.json'), pkgMeta)
copy.copyFile(path.join(tempPackage, 'component.json'), pkgMeta)
.then(function() {
return Q.nfcall(fs.readFile, pkgMeta).then(function(
contents

View File

@@ -205,13 +205,13 @@ describe('resolverFactory', function() {
gitHub = {
// git:
'git://github.com/user/project':
'git://github.com/user/project.git',
'https://github.com/user/project.git',
'git://github.com/user/project/':
'git://github.com/user/project.git',
'https://github.com/user/project.git',
'git://github.com/user/project.git':
'git://github.com/user/project.git',
'https://github.com/user/project.git',
'git://github.com/user/project.git/':
'git://github.com/user/project.git',
'https://github.com/user/project.git',
// git@:
'git@github.com:user/project': 'git@github.com:user/project.git',

View File

@@ -179,11 +179,10 @@ describe('FsResolver', function() {
mkdirp.sync(tempSource);
resolver = create(tempSource);
copy
.copyFile(
path.join(testPackage, 'foo'),
path.join(tempSource, 'foo')
)
copy.copyFile(
path.join(testPackage, 'foo'),
path.join(tempSource, 'foo')
)
.then(resolver.resolve.bind(resolver))
.then(function(dir) {
expect(fs.existsSync(path.join(dir, 'index'))).to.be(true);
@@ -202,11 +201,10 @@ describe('FsResolver', function() {
mkdirp.sync(tempSource);
resolver = create(tempSource);
copy
.copyFile(
path.join(testPackage, 'bower.json'),
path.join(tempSource, 'bower.json')
)
copy.copyFile(
path.join(testPackage, 'bower.json'),
path.join(tempSource, 'bower.json')
)
.then(resolver.resolve.bind(resolver))
.then(function(dir) {
expect(fs.existsSync(path.join(dir, 'bower.json'))).to.be(
@@ -244,8 +242,7 @@ describe('FsResolver', function() {
tempSource = path.resolve(__dirname, '../../assets/package-a-copy');
resolver = create(tempSource);
copy
.copyDir(testPackage, tempSource)
copy.copyDir(testPackage, tempSource)
.then(function() {
// Change tempSource dir to 0777
fs.chmodSync(tempSource, 0777);
@@ -269,8 +266,7 @@ describe('FsResolver', function() {
tempSource = path.resolve(__dirname, '../../tmp/temp-source');
resolver = create(tempSource);
copy
.copyFile(path.join(testPackage, 'foo'), tempSource)
copy.copyFile(path.join(testPackage, 'foo'), tempSource)
.then(function() {
// Change tempSource dir to 0777
fs.chmodSync(tempSource, 0777);

View File

@@ -146,7 +146,7 @@ describe('GitFsResolver', function() {
var dir = path.join(testPackage, 'new-dir');
fs.writeFileSync(file, 'foo');
fs.mkdir(dir);
fs.mkdirSync(dir);
function cleanup(err) {
fs.unlinkSync(file);
@@ -213,8 +213,7 @@ describe('GitFsResolver', function() {
tempSource = path.resolve(__dirname, '../../assets/package-a-copy');
resolver = create({ source: tempSource, target: 'some-branch' });
copy
.copyDir(testPackage, tempSource)
copy.copyDir(testPackage, tempSource)
.then(function() {
// Change tempSource dir to 0777
fs.chmodSync(tempSource, 0777);

View File

@@ -1,5 +1,5 @@
var path = require('path');
var nock = require('nock');
var nock = require('../../util/nock');
var fs = require('../../../lib/util/fs');
var expect = require('expect.js');
var Logger = require('bower-logger');
@@ -37,19 +37,19 @@ describe('GitHub', function() {
it('should ensure .git in the source', function() {
var resolver;
resolver = create('git://github.com/twitter/bower');
resolver = create('https://github.com/twitter/bower');
expect(resolver.getSource()).to.equal(
'git://github.com/twitter/bower.git'
'https://github.com/twitter/bower.git'
);
resolver = create('git://github.com/twitter/bower.git');
resolver = create('https://github.com/twitter/bower.git');
expect(resolver.getSource()).to.equal(
'git://github.com/twitter/bower.git'
'https://github.com/twitter/bower.git'
);
resolver = create('git://github.com/twitter/bower.git/');
resolver = create('https://github.com/twitter/bower.git/');
expect(resolver.getSource()).to.equal(
'git://github.com/twitter/bower.git'
'https://github.com/twitter/bower.git'
);
});
});
@@ -66,7 +66,7 @@ describe('GitHub', function() {
);
resolver = create({
source: 'git://github.com/IndigoUnited/js-events-emitter.git',
source: 'https://github.com/IndigoUnited/js-events-emitter.git',
target: '0.1.0'
});
@@ -106,7 +106,7 @@ describe('GitHub', function() {
});
resolver = create({
source: 'git://github.com/IndigoUnited/js-events-emitter.git',
source: 'https://github.com/IndigoUnited/js-events-emitter.git',
target: '0.1.0'
});
@@ -142,7 +142,7 @@ describe('GitHub', function() {
});
resolver = create({
source: 'git://github.com/IndigoUnited/js-events-emitter.git',
source: 'https://github.com/IndigoUnited/js-events-emitter.git',
target: '0.1.0'
});
@@ -163,7 +163,7 @@ describe('GitHub', function() {
it('should fallback to the GitRemoteResolver mechanism if resolution is not a tag', function(next) {
var resolver = create({
source: 'git://github.com/foo/bar.git',
source: 'https://github.com/foo/bar.git',
target: '2af02ac6ddeaac1c2f4bead8d6287ce54269c039'
});
var originalCheckout = GitRemoteResolver.prototype._checkout;

View File

@@ -975,14 +975,13 @@ describe('GitResolver', function() {
var dst = path.join(tempDir, '.git');
// Copy .git folder to the tempDir
copy
.copyDir(
path.resolve(__dirname, '../../assets/package-a/.git'),
dst,
copy.copyDir(
path.resolve(__dirname, '../../assets/package-a/.git'),
dst,
{
mode: 0777
}
)
)
.then(function() {
resolver._tempDir = tempDir;

View File

@@ -1,7 +1,7 @@
var expect = require('expect.js');
var path = require('path');
var fs = require('../../../lib/util/fs');
var nock = require('nock');
var nock = require('../../util/nock');
var Q = require('q');
var rimraf = require('../../../lib/util/rimraf');
var mkdirp = require('mkdirp');
@@ -530,64 +530,64 @@ describe('UrlResolver', function() {
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Type': 'application/zip'
}
{
'Content-Type': 'application/zip'
}
)
.get('/package-zip2')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Type': 'application/zip; charset=UTF-8'
}
{
'Content-Type': 'application/zip; charset=UTF-8'
}
)
.get('/package-zip3')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Type': ' application/zip ; charset=UTF-8'
}
{
'Content-Type': ' application/zip ; charset=UTF-8'
}
)
.get('/package-zip4')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Type': '"application/x-zip"' // Test with quotes
}
{
'Content-Type': '"application/x-zip"' // Test with quotes
}
)
.get('/package-tar')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-tar.tar.gz'),
{
'Content-Type': ' application/x-tgz ; charset=UTF-8'
}
{
'Content-Type': ' application/x-tgz ; charset=UTF-8'
}
)
.get('/package-tar.tar.gz')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-tar.tar.gz'),
{
'Content-Type': ' application/x-tgz ; charset=UTF-8'
}
{
'Content-Type': ' application/x-tgz ; charset=UTF-8'
}
)
.get('/package-tar2.tar.gz')
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-tar.tar.gz'),
{
'Content-Type':
{
'Content-Type':
' application/octet-stream ; charset=UTF-8'
}
}
);
resolver = create('http://bower.io/package-zip');
@@ -698,10 +698,10 @@ describe('UrlResolver', function() {
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Disposition':
{
'Content-Disposition':
'attachment; filename="package-zip.zip"'
}
}
);
resolver = create('http://bower.io/package-zip');
@@ -857,9 +857,9 @@ describe('UrlResolver', function() {
.replyWithFile(
200,
path.resolve(__dirname, '../../assets/package-zip.zip'),
{
'Content-Disposition': header
}
{
'Content-Disposition': header
}
);
resolver = create('http://bower.io/package-zip');

View File

@@ -15,13 +15,13 @@ var proxyquire = require('proxyquire')
.noPreserveCache();
var spawnSync = require('spawn-sync');
var config = require('../lib/config');
var nock = require('nock');
var nock = require('./util/nock');
var semver = require('semver');
// For better promise errors
Q.longStackSupport = true;
// Those are needed for Travis or not configured git environment
// Those are needed for testing or not configured git environment
var env = {
GIT_AUTHOR_DATE: 'Sun Apr 7 22:13:13 2013 +0000',
GIT_AUTHOR_NAME: 'André Cruz',

View File

@@ -105,9 +105,9 @@ function createRelease(dir, release, files) {
cmd('git', ['checkout', 'master', '-f'], { cwd: dir })
// Attempt to delete branch, ignoring the error
.then(function() {
return cmd('git', ['branch', '-D', branch], { cwd: dir }).fail(
function() {}
);
return cmd('git', ['branch', '-D', branch], {
cwd: dir
}).fail(function() {});
})
// Checkout based on master
.then(

View File

@@ -1,6 +1,6 @@
var expect = require('expect.js');
var helpers = require('../helpers');
var nock = require('nock');
var nock = require('../util/nock');
var path = require('path');
var Q = require('q');
@@ -13,42 +13,30 @@ describe('download', function() {
destination = tempDir.getPath('package.tar.gz');
function downloadTest(opts) {
var deferred = Q.defer();
tempDir.prepare();
opts.response(nock('http://bower.io', opts.nockOpts));
download(
return download(
opts.sourceUrl || 'http://bower.io/package.tar.gz',
opts.destinationPath || destination,
opts.downloadOpts
)
.then(
function(result) {
if (opts.expect) {
opts.expect(result);
deferred.resolve();
} else {
deferred.reject(
new Error(
'Error expected. Got successful response.'
)
);
}
},
function(error) {
if (opts.expectError) {
opts.expectError(error);
deferred.resolve();
} else {
deferred.reject(error);
}
).then(
function(result) {
if (opts.expect) {
opts.expect(result);
} else {
throw new Error('Error expected. Got successful response.');
}
)
.done();
return deferred.promise;
},
function(error) {
if (opts.expectError) {
opts.expectError(error);
} else {
throw error;
}
}
);
}
it('download file to directory', function() {
@@ -112,8 +100,7 @@ describe('download', function() {
return downloadTest({
response: function(nock) {
// First connection + 5 retries
nock
.get('/package.tar.gz')
nock.get('/package.tar.gz')
.times(6)
.delayConnection(1000)
.replyWithFile(200, source);
@@ -134,8 +121,7 @@ describe('download', function() {
return downloadTest({
response: function(nock) {
// First connection + 5 retries
nock
.get('/package.tar.gz')
nock.get('/package.tar.gz')
.times(6)
.socketDelay(1000)
.replyWithFile(200, source);
@@ -156,8 +142,7 @@ describe('download', function() {
return downloadTest({
response: function(nock) {
// First connection + 5 retries
nock
.get('/package.tar.gz')
nock.get('/package.tar.gz')
.times(5)
.delayConnection(1000)
.replyWithFile(200, source);
@@ -180,9 +165,9 @@ describe('download', function() {
return downloadTest({
response: function(nock) {
// First connection + 5 retries
nock
.get('/package.tar.gz')
.replyWithFile(200, source, { 'Content-Length': 5000 });
nock.get('/package.tar.gz').replyWithFile(200, source, {
'Content-Length': 5000
});
},
expectError: function(e) {
expect(e.code).to.be('EINCOMPLETE');
@@ -208,11 +193,13 @@ describe('download', function() {
return downloadTest({
response: function(nock) {
nock
.get('/' + sourceFilename)
.replyWithFile(200, sourceFile, {
nock.get('/' + sourceFilename).replyWithFile(
200,
sourceFile,
{
'Content-Encoding': 'gzip'
});
}
);
},
expect: function() {
expect(fs.readFileSync(destinationPath, 'ascii')).to.be(

4
test/util/nock.js Normal file
View File

@@ -0,0 +1,4 @@
var NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
module.exports =
NODE_MAJOR_VERSION >= 12 ? require('nock') : require('nock-legacy');

4019
yarn.lock

File diff suppressed because it is too large Load Diff