pax_global_header 0000666 0000000 0000000 00000000064 14276532165 0014525 g ustar 00root root 0000000 0000000 52 comment=33d884251be6a7793d7a91177a666c1eb926d292
normalize-package-data-4.0.1/ 0000775 0000000 0000000 00000000000 14276532165 0016027 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/.commitlintrc.js 0000664 0000000 0000000 00000000553 14276532165 0021152 0 ustar 00root root 0000000 0000000 /* This file is automatically added by @npmcli/template-oss. Do not edit. */
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'deps', 'chore']],
'header-max-length': [2, 'always', 80],
'subject-case': [0, 'always', ['lower-case', 'sentence-case', 'start-case']],
},
}
normalize-package-data-4.0.1/.eslintrc.js 0000664 0000000 0000000 00000000545 14276532165 0020272 0 ustar 00root root 0000000 0000000 /* This file is automatically added by @npmcli/template-oss. Do not edit. */
'use strict'
const { readdirSync: readdir } = require('fs')
const localConfigs = readdir(__dirname)
.filter((file) => file.startsWith('.eslintrc.local.'))
.map((file) => `./${file}`)
module.exports = {
root: true,
extends: [
'@npmcli',
...localConfigs,
],
}
normalize-package-data-4.0.1/.github/ 0000775 0000000 0000000 00000000000 14276532165 0017367 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/.github/CODEOWNERS 0000664 0000000 0000000 00000000132 14276532165 0020756 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
* @npm/cli-team
normalize-package-data-4.0.1/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14276532165 0021552 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/.github/ISSUE_TEMPLATE/bug.yml 0000664 0000000 0000000 00000002655 14276532165 0023062 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: Bug
description: File a bug/issue
title: "[BUG]
"
labels: [ Bug, Needs Triage ]
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please [search here](./issues) to see if an issue already exists for your problem.
options:
- label: I have searched the existing issues
required: true
- type: textarea
attributes:
label: Current Behavior
description: A clear & concise description of what you're experiencing.
validations:
required: false
- type: textarea
attributes:
label: Expected Behavior
description: A clear & concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
value: |
1. In this environment...
2. With this config...
3. Run '...'
4. See error...
validations:
required: false
- type: textarea
attributes:
label: Environment
description: |
examples:
- **npm**: 7.6.3
- **Node**: 13.14.0
- **OS**: Ubuntu 20.04
- **platform**: Macbook Pro
value: |
- npm:
- Node:
- OS:
- platform:
validations:
required: false
normalize-package-data-4.0.1/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000145 14276532165 0023542 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
blank_issues_enabled: true
normalize-package-data-4.0.1/.github/dependabot.yml 0000664 0000000 0000000 00000000565 14276532165 0022225 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
allow:
- dependency-type: direct
versioning-strategy: increase-if-necessary
commit-message:
prefix: deps
prefix-development: chore
labels:
- "Dependencies"
normalize-package-data-4.0.1/.github/settings.yml 0000664 0000000 0000000 00000000055 14276532165 0021752 0 ustar 00root root 0000000 0000000 ---
_extends: '.github:npm-cli/settings.yml'
normalize-package-data-4.0.1/.github/workflows/ 0000775 0000000 0000000 00000000000 14276532165 0021424 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/.github/workflows/audit.yml 0000664 0000000 0000000 00000001370 14276532165 0023256 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: Audit
on:
workflow_dispatch:
schedule:
# "At 01:00 on Monday" https://crontab.guru/#0_1_*_*_1
- cron: "0 1 * * 1"
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Update npm to latest
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
- run: npm -v
- run: npm i --ignore-scripts --no-audit --no-fund --package-lock
- run: npm audit
normalize-package-data-4.0.1/.github/workflows/ci.yml 0000664 0000000 0000000 00000005114 14276532165 0022543 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: CI
on:
workflow_dispatch:
pull_request:
branches:
- '*'
push:
branches:
- main
- latest
schedule:
# "At 02:00 on Monday" https://crontab.guru/#0_2_*_*_1
- cron: "0 2 * * 1"
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Update npm to latest
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
- run: npm -v
- run: npm i --ignore-scripts --no-audit --no-fund
- run: npm run lint
test:
strategy:
fail-fast: false
matrix:
node-version:
- 12.13.0
- 12.x
- 14.15.0
- 14.x
- 16.0.0
- 16.x
platform:
- os: ubuntu-latest
shell: bash
- os: macos-latest
shell: bash
- os: windows-latest
shell: cmd
runs-on: ${{ matrix.platform.os }}
defaults:
run:
shell: ${{ matrix.platform.shell }}
steps:
- uses: actions/checkout@v3
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Update to workable npm (windows)
# node 12 and 14 ship with npm@6, which is known to fail when updating itself in windows
if: matrix.platform.os == 'windows-latest' && (startsWith(matrix.node-version, '12.') || startsWith(matrix.node-version, '14.'))
run: |
curl -sO https://registry.npmjs.org/npm/-/npm-7.5.4.tgz
tar xf npm-7.5.4.tgz
cd package
node lib/npm.js install --no-fund --no-audit -g ..\npm-7.5.4.tgz
cd ..
rmdir /s /q package
- name: Update npm to 7
# If we do test on npm 10 it needs npm7
if: startsWith(matrix.node-version, '10.')
run: npm i --prefer-online --no-fund --no-audit -g npm@7
- name: Update npm to latest
if: ${{ !startsWith(matrix.node-version, '10.') }}
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
- run: npm -v
- run: npm i --ignore-scripts --no-audit --no-fund
- run: npm test --ignore-scripts
normalize-package-data-4.0.1/.github/workflows/codeql-analysis.yml 0000664 0000000 0000000 00000002001 14276532165 0025230 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: "CodeQL"
on:
push:
branches:
- main
- latest
pull_request:
# The branches below must be a subset of the branches above
branches:
- main
- latest
schedule:
# "At 03:00 on Monday" https://crontab.guru/#0_3_*_*_1
- cron: "0 3 * * 1"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ javascript ]
steps:
- uses: actions/checkout@v3
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
normalize-package-data-4.0.1/.github/workflows/post-dependabot.yml 0000664 0000000 0000000 00000002641 14276532165 0025242 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: Post Dependabot Actions
on: pull_request
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
permissions:
contents: write
jobs:
template-oss-apply:
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]'
steps:
- uses: actions/checkout@v3
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Update npm to latest
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
- run: npm -v
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v1.1.1
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: npm install and commit
if: contains(steps.metadata.outputs.dependency-names, '@npmcli/template-oss')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh pr checkout ${{ github.event.pull_request.number }}
npm install --ignore-scripts --no-audit --no-fund
npm run template-oss-apply
git add .
git commit -am "chore: postinstall for dependabot template-oss PR"
git push
npm run lint
normalize-package-data-4.0.1/.github/workflows/pull-request.yml 0000664 0000000 0000000 00000002143 14276532165 0024611 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: Pull Request Linting
on:
pull_request:
types:
- opened
- reopened
- edited
- synchronize
jobs:
check:
name: Check PR Title or Commits
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup git user
run: |
git config --global user.email "npm-cli+bot@github.com"
git config --global user.name "npm CLI robot"
- uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Update npm to latest
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
- run: npm -v
- name: Install deps
run: npm i -D @commitlint/cli @commitlint/config-conventional
- name: Check commits OR PR title
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
npx --offline commitlint -V --from origin/main --to ${{ github.event.pull_request.head.sha }} \
|| echo $PR_TITLE | npx --offline commitlint -V
normalize-package-data-4.0.1/.github/workflows/release-please.yml 0000664 0000000 0000000 00000001314 14276532165 0025035 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
name: Release Please
on:
push:
branches:
- main
- latest
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v3
id: release
with:
release-type: node
changelog-types: >
[
{"type":"feat","section":"Features","hidden":false},
{"type":"fix","section":"Bug Fixes","hidden":false},
{"type":"docs","section":"Documentation","hidden":false},
{"type":"deps","section":"Dependencies","hidden":false},
{"type":"chore","hidden":true}
]
normalize-package-data-4.0.1/.gitignore 0000664 0000000 0000000 00000000570 14276532165 0020021 0 ustar 00root root 0000000 0000000 # This file is automatically added by @npmcli/template-oss. Do not edit.
# ignore everything in the root
/*
# keep these
!/.eslintrc.local.*
!**/.gitignore
!/docs/
!/tap-snapshots/
!/test/
!/map.js
!/scripts/
!/README*
!/LICENSE*
!/CHANGELOG*
!/.commitlintrc.js
!/.eslintrc.js
!/.github/
!/.gitignore
!/.npmrc
!/CODE_OF_CONDUCT.md
!/SECURITY.md
!/bin/
!/lib/
!/package.json
normalize-package-data-4.0.1/.npmrc 0000664 0000000 0000000 00000000135 14276532165 0017146 0 ustar 00root root 0000000 0000000 ; This file is automatically added by @npmcli/template-oss. Do not edit.
package-lock=false
normalize-package-data-4.0.1/CHANGELOG.md 0000664 0000000 0000000 00000004235 14276532165 0017644 0 ustar 00root root 0000000 0000000 # Changelog
## [4.0.1](https://github.com/npm/normalize-package-data/compare/v4.0.0...v4.0.1) (2022-08-15)
### Bug Fixes
* linting ([#146](https://github.com/npm/normalize-package-data/issues/146)) ([850038e](https://github.com/npm/normalize-package-data/commit/850038e68baa8155f55f9169977cb631fecbe1d4))
## [4.0.0](https://www.github.com/npm/normalize-package-data/compare/v3.0.3...v4.0.0) (2022-03-14)
### ⚠ BREAKING CHANGES
* this drops support for node 10 and non-LTS versions of node 12 and node 14
### Bug Fixes
* do not overwrite bundled dependency ranges with * ([#128](https://www.github.com/npm/normalize-package-data/issues/128)) ([b8e4604](https://www.github.com/npm/normalize-package-data/commit/b8e460412c45a334c71f874d8fe118522ae73c95))
* safer regex ([abcdb36](https://www.github.com/npm/normalize-package-data/commit/abcdb36f5bbeeb4d1e0a0aafac6aaf8b3e8488b3))
### Documentation
* Missprint in readme ([#127](https://www.github.com/npm/normalize-package-data/issues/127)) ([ac078ea](https://www.github.com/npm/normalize-package-data/commit/ac078eaa9bc3f41c971bdf5539e46b2738820156))
* @npmcli/template-oss@2.9.2 ([80daf4a](https://www.github.com/npm/normalize-package-data/commit/80daf4a771c0cae08695466f0b766f6989b31525))
### Dependencies
* bump hosted-git-info from 4.1.0 to 5.0.0 ([#135](https://www.github.com/npm/normalize-package-data/issues/135)) ([289674d](https://www.github.com/npm/normalize-package-data/commit/289674dc86fca6e2685d505b9e735bdc6ef84ea6))
* update is-core-module requirement from ^2.5.0 to ^2.8.1 ([#132](https://www.github.com/npm/normalize-package-data/issues/132)) ([b3ec77e](https://www.github.com/npm/normalize-package-data/commit/b3ec77e1413c17713ccd984ad2702679cc02f6eb))
* update semver requirement from ^7.3.4 to ^7.3.5 ([#133](https://www.github.com/npm/normalize-package-data/issues/133)) ([e0a56dc](https://www.github.com/npm/normalize-package-data/commit/e0a56dc76afa0da4e147afe8892c5b0306f1a77a))
* update validate-npm-package-license requirement ([#131](https://www.github.com/npm/normalize-package-data/issues/131)) ([fe7dc60](https://www.github.com/npm/normalize-package-data/commit/fe7dc60d74e8cdaaf8b0015e67a57b4aa5366f63))
normalize-package-data-4.0.1/CODE_OF_CONDUCT.md 0000664 0000000 0000000 00000000507 14276532165 0020630 0 ustar 00root root 0000000 0000000
All interactions in this repo are covered by the [npm Code of
Conduct](https://docs.npmjs.com/policies/conduct)
The npm cli team may, at its own discretion, moderate, remove, or edit
any interactions such as pull requests, issues, and comments.
normalize-package-data-4.0.1/LICENSE 0000664 0000000 0000000 00000002573 14276532165 0017043 0 ustar 00root root 0000000 0000000 This package contains code originally written by Isaac Z. Schlueter.
Used with permission.
Copyright (c) Meryn Stol ("Author")
All rights reserved.
The BSD License
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
normalize-package-data-4.0.1/README.md 0000664 0000000 0000000 00000016111 14276532165 0017306 0 ustar 00root root 0000000 0000000 # normalize-package-data
[](https://travis-ci.org/npm/normalize-package-data)
normalize-package-data exports a function that normalizes package metadata. This data is typically found in a package.json file, but in principle could come from any source - for example the npm registry.
normalize-package-data is used by [read-package-json](https://npmjs.org/package/read-package-json) to normalize the data it reads from a package.json file. In turn, read-package-json is used by [npm](https://npmjs.org/package/npm) and various npm-related tools.
## Installation
```
npm install normalize-package-data
```
## Usage
Basic usage is really simple. You call the function that normalize-package-data exports. Let's call it `normalizeData`.
```javascript
normalizeData = require('normalize-package-data')
packageData = require("./package.json")
normalizeData(packageData)
// packageData is now normalized
```
#### Strict mode
You may activate strict validation by passing true as the second argument.
```javascript
normalizeData = require('normalize-package-data')
packageData = require("./package.json")
normalizeData(packageData, true)
// packageData is now normalized
```
If strict mode is activated, only Semver 2.0 version strings are accepted. Otherwise, Semver 1.0 strings are accepted as well. Packages must have a name, and the name field must not have contain leading or trailing whitespace.
#### Warnings
Optionally, you may pass a "warning" function. It gets called whenever the `normalizeData` function encounters something that doesn't look right. It indicates less than perfect input data.
```javascript
normalizeData = require('normalize-package-data')
packageData = require("./package.json")
warnFn = function(msg) { console.error(msg) }
normalizeData(packageData, warnFn)
// packageData is now normalized. Any number of warnings may have been logged.
```
You may combine strict validation with warnings by passing `true` as the second argument, and `warnFn` as third.
When `private` field is set to `true`, warnings will be suppressed.
### Potential exceptions
If the supplied data has an invalid name or version field, `normalizeData` will throw an error. Depending on where you call `normalizeData`, you may want to catch these errors so can pass them to a callback.
## What normalization (currently) entails
* The value of `name` field gets trimmed (unless in strict mode).
* The value of the `version` field gets cleaned by `semver.clean`. See [documentation for the semver module](https://github.com/isaacs/node-semver).
* If `name` and/or `version` fields are missing, they are set to empty strings.
* If `files` field is not an array, it will be removed.
* If `bin` field is a string, then `bin` field will become an object with `name` set to the value of the `name` field, and `bin` set to the original string value.
* If `man` field is a string, it will become an array with the original string as its sole member.
* If `keywords` field is string, it is considered to be a list of keywords separated by one or more white-space characters. It gets converted to an array by splitting on `\s+`.
* All people fields (`author`, `maintainers`, `contributors`) get converted into objects with name, email and url properties.
* If `bundledDependencies` field (a typo) exists and `bundleDependencies` field does not, `bundledDependencies` will get renamed to `bundleDependencies`.
* If the value of any of the dependencies fields (`dependencies`, `devDependencies`, `optionalDependencies`) is a string, it gets converted into an object with familiar `name=>value` pairs.
* The values in `optionalDependencies` get added to `dependencies`. The `optionalDependencies` array is left untouched.
* As of v2: Dependencies that point at known hosted git providers (currently: github, bitbucket, gitlab) will have their URLs canonicalized, but protocols will be preserved.
* As of v2: Dependencies that use shortcuts for hosted git providers (`org/proj`, `github:org/proj`, `bitbucket:org/proj`, `gitlab:org/proj`, `gist:docid`) will have the shortcut left in place. (In the case of github, the `org/proj` form will be expanded to `github:org/proj`.) THIS MARKS A BREAKING CHANGE FROM V1, where the shortcut was previously expanded to a URL.
* If `description` field does not exist, but `readme` field does, then (more or less) the first paragraph of text that's found in the readme is taken as value for `description`.
* If `repository` field is a string, it will become an object with `url` set to the original string value, and `type` set to `"git"`.
* If `repository.url` is not a valid url, but in the style of "[owner-name]/[repo-name]", `repository.url` will be set to git+https://github.com/[owner-name]/[repo-name].git
* If `bugs` field is a string, the value of `bugs` field is changed into an object with `url` set to the original string value.
* If `bugs` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `bugs` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]/issues . If the repository field points to a GitHub Gist repo url, the associated http url is chosen.
* If `bugs` field is an object, the resulting value only has email and url properties. If email and url properties are not strings, they are ignored. If no valid values for either email or url is found, bugs field will be removed.
* If `homepage` field is not a string, it will be removed.
* If the url in the `homepage` field does not specify a protocol, then http is assumed. For example, `myproject.org` will be changed to `http://myproject.org`.
* If `homepage` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `homepage` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]#readme . If the repository field points to a GitHub Gist repo url, the associated http url is chosen.
### Rules for name field
If `name` field is given, the value of the name field must be a string. The string may not:
* start with a period.
* contain the following characters: `/@\s+%`
* contain any characters that would need to be encoded for use in urls.
* resemble the word `node_modules` or `favicon.ico` (case doesn't matter).
### Rules for version field
If `version` field is given, the value of the version field must be a valid *semver* string, as determined by the `semver.valid` method. See [documentation for the semver module](https://github.com/isaacs/node-semver).
### Rules for license field
The `license`/`licence` field should be a valid *SPDX license expression* or one of the special values allowed by [validate-npm-package-license](https://npmjs.com/package/validate-npm-package-license). See [documentation for the license field in package.json](https://docs.npmjs.com/files/package.json#license).
## Credits
This package contains code based on read-package-json written by Isaac Z. Schlueter. Used with permission.
## License
normalize-package-data is released under the [BSD 2-Clause License](https://opensource.org/licenses/BSD-2-Clause).
Copyright (c) 2013 Meryn Stol
normalize-package-data-4.0.1/SECURITY.md 0000664 0000000 0000000 00000000246 14276532165 0017622 0 ustar 00root root 0000000 0000000
Please send vulnerability reports through [hackerone](https://hackerone.com/github).
normalize-package-data-4.0.1/docs/ 0000775 0000000 0000000 00000000000 14276532165 0016757 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/docs/AUTHORS 0000664 0000000 0000000 00000000230 14276532165 0020022 0 ustar 00root root 0000000 0000000 # Names sorted by how much code was originally theirs.
Isaac Z. Schlueter
Meryn Stol
Robert Kowalski
normalize-package-data-4.0.1/lib/ 0000775 0000000 0000000 00000000000 14276532165 0016575 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/lib/extract_description.js 0000664 0000000 0000000 00000001045 14276532165 0023210 0 ustar 00root root 0000000 0000000 module.exports = extractDescription
// Extracts description from contents of a readme file in markdown format
function extractDescription (d) {
if (!d) {
return
}
if (d === 'ERROR: No README data found!') {
return
}
// the first block of text before the first heading
// that isn't the first line heading
d = d.trim().split('\n')
let s = 0
while (d[s] && d[s].trim().match(/^(#|$)/)) {
s++
}
const l = d.length
let e = s + 1
while (e < l && d[e].trim()) {
e++
}
return d.slice(s, e).join(' ').trim()
}
normalize-package-data-4.0.1/lib/fixer.js 0000664 0000000 0000000 00000030642 14276532165 0020255 0 ustar 00root root 0000000 0000000 var isValidSemver = require('semver/functions/valid')
var cleanSemver = require('semver/functions/clean')
var validateLicense = require('validate-npm-package-license')
var hostedGitInfo = require('hosted-git-info')
var isBuiltinModule = require('is-core-module')
var depTypes = ['dependencies', 'devDependencies', 'optionalDependencies']
var extractDescription = require('./extract_description')
var url = require('url')
var typos = require('./typos.json')
var isEmail = str => str.includes('@') && (str.indexOf('@') < str.lastIndexOf('.'))
module.exports = {
// default warning function
warn: function () {},
fixRepositoryField: function (data) {
if (data.repositories) {
this.warn('repositories')
data.repository = data.repositories[0]
}
if (!data.repository) {
return this.warn('missingRepository')
}
if (typeof data.repository === 'string') {
data.repository = {
type: 'git',
url: data.repository,
}
}
var r = data.repository.url || ''
if (r) {
var hosted = hostedGitInfo.fromUrl(r)
if (hosted) {
r = data.repository.url
= hosted.getDefaultRepresentation() === 'shortcut' ? hosted.https() : hosted.toString()
}
}
if (r.match(/github.com\/[^/]+\/[^/]+\.git\.git$/)) {
this.warn('brokenGitUrl', r)
}
},
fixTypos: function (data) {
Object.keys(typos.topLevel).forEach(function (d) {
if (Object.prototype.hasOwnProperty.call(data, d)) {
this.warn('typo', d, typos.topLevel[d])
}
}, this)
},
fixScriptsField: function (data) {
if (!data.scripts) {
return
}
if (typeof data.scripts !== 'object') {
this.warn('nonObjectScripts')
delete data.scripts
return
}
Object.keys(data.scripts).forEach(function (k) {
if (typeof data.scripts[k] !== 'string') {
this.warn('nonStringScript')
delete data.scripts[k]
} else if (typos.script[k] && !data.scripts[typos.script[k]]) {
this.warn('typo', k, typos.script[k], 'scripts')
}
}, this)
},
fixFilesField: function (data) {
var files = data.files
if (files && !Array.isArray(files)) {
this.warn('nonArrayFiles')
delete data.files
} else if (data.files) {
data.files = data.files.filter(function (file) {
if (!file || typeof file !== 'string') {
this.warn('invalidFilename', file)
return false
} else {
return true
}
}, this)
}
},
fixBinField: function (data) {
if (!data.bin) {
return
}
if (typeof data.bin === 'string') {
var b = {}
var match
if (match = data.name.match(/^@[^/]+[/](.*)$/)) {
b[match[1]] = data.bin
} else {
b[data.name] = data.bin
}
data.bin = b
}
},
fixManField: function (data) {
if (!data.man) {
return
}
if (typeof data.man === 'string') {
data.man = [data.man]
}
},
fixBundleDependenciesField: function (data) {
var bdd = 'bundledDependencies'
var bd = 'bundleDependencies'
if (data[bdd] && !data[bd]) {
data[bd] = data[bdd]
delete data[bdd]
}
if (data[bd] && !Array.isArray(data[bd])) {
this.warn('nonArrayBundleDependencies')
delete data[bd]
} else if (data[bd]) {
data[bd] = data[bd].filter(function (filtered) {
if (!filtered || typeof filtered !== 'string') {
this.warn('nonStringBundleDependency', filtered)
return false
} else {
if (!data.dependencies) {
data.dependencies = {}
}
if (!Object.prototype.hasOwnProperty.call(data.dependencies, filtered)) {
this.warn('nonDependencyBundleDependency', filtered)
data.dependencies[filtered] = '*'
}
return true
}
}, this)
}
},
fixDependencies: function (data, strict) {
objectifyDeps(data, this.warn)
addOptionalDepsToDeps(data, this.warn)
this.fixBundleDependenciesField(data)
;['dependencies', 'devDependencies'].forEach(function (deps) {
if (!(deps in data)) {
return
}
if (!data[deps] || typeof data[deps] !== 'object') {
this.warn('nonObjectDependencies', deps)
delete data[deps]
return
}
Object.keys(data[deps]).forEach(function (d) {
var r = data[deps][d]
if (typeof r !== 'string') {
this.warn('nonStringDependency', d, JSON.stringify(r))
delete data[deps][d]
}
var hosted = hostedGitInfo.fromUrl(data[deps][d])
if (hosted) {
data[deps][d] = hosted.toString()
}
}, this)
}, this)
},
fixModulesField: function (data) {
if (data.modules) {
this.warn('deprecatedModules')
delete data.modules
}
},
fixKeywordsField: function (data) {
if (typeof data.keywords === 'string') {
data.keywords = data.keywords.split(/,\s+/)
}
if (data.keywords && !Array.isArray(data.keywords)) {
delete data.keywords
this.warn('nonArrayKeywords')
} else if (data.keywords) {
data.keywords = data.keywords.filter(function (kw) {
if (typeof kw !== 'string' || !kw) {
this.warn('nonStringKeyword')
return false
} else {
return true
}
}, this)
}
},
fixVersionField: function (data, strict) {
// allow "loose" semver 1.0 versions in non-strict mode
// enforce strict semver 2.0 compliance in strict mode
var loose = !strict
if (!data.version) {
data.version = ''
return true
}
if (!isValidSemver(data.version, loose)) {
throw new Error('Invalid version: "' + data.version + '"')
}
data.version = cleanSemver(data.version, loose)
return true
},
fixPeople: function (data) {
modifyPeople(data, unParsePerson)
modifyPeople(data, parsePerson)
},
fixNameField: function (data, options) {
if (typeof options === 'boolean') {
options = { strict: options }
} else if (typeof options === 'undefined') {
options = {}
}
var strict = options.strict
if (!data.name && !strict) {
data.name = ''
return
}
if (typeof data.name !== 'string') {
throw new Error('name field must be a string.')
}
if (!strict) {
data.name = data.name.trim()
}
ensureValidName(data.name, strict, options.allowLegacyCase)
if (isBuiltinModule(data.name)) {
this.warn('conflictingName', data.name)
}
},
fixDescriptionField: function (data) {
if (data.description && typeof data.description !== 'string') {
this.warn('nonStringDescription')
delete data.description
}
if (data.readme && !data.description) {
data.description = extractDescription(data.readme)
}
if (data.description === undefined) {
delete data.description
}
if (!data.description) {
this.warn('missingDescription')
}
},
fixReadmeField: function (data) {
if (!data.readme) {
this.warn('missingReadme')
data.readme = 'ERROR: No README data found!'
}
},
fixBugsField: function (data) {
if (!data.bugs && data.repository && data.repository.url) {
var hosted = hostedGitInfo.fromUrl(data.repository.url)
if (hosted && hosted.bugs()) {
data.bugs = { url: hosted.bugs() }
}
} else if (data.bugs) {
if (typeof data.bugs === 'string') {
if (isEmail(data.bugs)) {
data.bugs = { email: data.bugs }
/* eslint-disable-next-line node/no-deprecated-api */
} else if (url.parse(data.bugs).protocol) {
data.bugs = { url: data.bugs }
} else {
this.warn('nonEmailUrlBugsString')
}
} else {
bugsTypos(data.bugs, this.warn)
var oldBugs = data.bugs
data.bugs = {}
if (oldBugs.url) {
/* eslint-disable-next-line node/no-deprecated-api */
if (typeof (oldBugs.url) === 'string' && url.parse(oldBugs.url).protocol) {
data.bugs.url = oldBugs.url
} else {
this.warn('nonUrlBugsUrlField')
}
}
if (oldBugs.email) {
if (typeof (oldBugs.email) === 'string' && isEmail(oldBugs.email)) {
data.bugs.email = oldBugs.email
} else {
this.warn('nonEmailBugsEmailField')
}
}
}
if (!data.bugs.email && !data.bugs.url) {
delete data.bugs
this.warn('emptyNormalizedBugs')
}
}
},
fixHomepageField: function (data) {
if (!data.homepage && data.repository && data.repository.url) {
var hosted = hostedGitInfo.fromUrl(data.repository.url)
if (hosted && hosted.docs()) {
data.homepage = hosted.docs()
}
}
if (!data.homepage) {
return
}
if (typeof data.homepage !== 'string') {
this.warn('nonUrlHomepage')
return delete data.homepage
}
/* eslint-disable-next-line node/no-deprecated-api */
if (!url.parse(data.homepage).protocol) {
data.homepage = 'http://' + data.homepage
}
},
fixLicenseField: function (data) {
const license = data.license || data.licence
if (!license) {
return this.warn('missingLicense')
}
if (
typeof (license) !== 'string' ||
license.length < 1 ||
license.trim() === ''
) {
return this.warn('invalidLicense')
}
if (!validateLicense(license).validForNewPackages) {
return this.warn('invalidLicense')
}
},
}
function isValidScopedPackageName (spec) {
if (spec.charAt(0) !== '@') {
return false
}
var rest = spec.slice(1).split('/')
if (rest.length !== 2) {
return false
}
return rest[0] && rest[1] &&
rest[0] === encodeURIComponent(rest[0]) &&
rest[1] === encodeURIComponent(rest[1])
}
function isCorrectlyEncodedName (spec) {
return !spec.match(/[/@\s+%:]/) &&
spec === encodeURIComponent(spec)
}
function ensureValidName (name, strict, allowLegacyCase) {
if (name.charAt(0) === '.' ||
!(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
(strict && (!allowLegacyCase) && name !== name.toLowerCase()) ||
name.toLowerCase() === 'node_modules' ||
name.toLowerCase() === 'favicon.ico') {
throw new Error('Invalid name: ' + JSON.stringify(name))
}
}
function modifyPeople (data, fn) {
if (data.author) {
data.author = fn(data.author)
}['maintainers', 'contributors'].forEach(function (set) {
if (!Array.isArray(data[set])) {
return
}
data[set] = data[set].map(fn)
})
return data
}
function unParsePerson (person) {
if (typeof person === 'string') {
return person
}
var name = person.name || ''
var u = person.url || person.web
var wrappedUrl = u ? (' (' + u + ')') : ''
var e = person.email || person.mail
var wrappedEmail = e ? (' <' + e + '>') : ''
return name + wrappedEmail + wrappedUrl
}
function parsePerson (person) {
if (typeof person !== 'string') {
return person
}
var matchedName = person.match(/^([^(<]+)/)
var matchedUrl = person.match(/\(([^()]+)\)/)
var matchedEmail = person.match(/<([^<>]+)>/)
var obj = {}
if (matchedName && matchedName[0].trim()) {
obj.name = matchedName[0].trim()
}
if (matchedEmail) {
obj.email = matchedEmail[1]
}
if (matchedUrl) {
obj.url = matchedUrl[1]
}
return obj
}
function addOptionalDepsToDeps (data, warn) {
var o = data.optionalDependencies
if (!o) {
return
}
var d = data.dependencies || {}
Object.keys(o).forEach(function (k) {
d[k] = o[k]
})
data.dependencies = d
}
function depObjectify (deps, type, warn) {
if (!deps) {
return {}
}
if (typeof deps === 'string') {
deps = deps.trim().split(/[\n\r\s\t ,]+/)
}
if (!Array.isArray(deps)) {
return deps
}
warn('deprecatedArrayDependencies', type)
var o = {}
deps.filter(function (d) {
return typeof d === 'string'
}).forEach(function (d) {
d = d.trim().split(/(:?[@\s><=])/)
var dn = d.shift()
var dv = d.join('')
dv = dv.trim()
dv = dv.replace(/^@/, '')
o[dn] = dv
})
return o
}
function objectifyDeps (data, warn) {
depTypes.forEach(function (type) {
if (!data[type]) {
return
}
data[type] = depObjectify(data[type], type, warn)
})
}
function bugsTypos (bugs, warn) {
if (!bugs) {
return
}
Object.keys(bugs).forEach(function (k) {
if (typos.bugs[k]) {
warn('typo', k, typos.bugs[k], 'bugs')
bugs[typos.bugs[k]] = bugs[k]
delete bugs[k]
}
})
}
normalize-package-data-4.0.1/lib/make_warning.js 0000664 0000000 0000000 00000001307 14276532165 0021576 0 ustar 00root root 0000000 0000000 var util = require('util')
var messages = require('./warning_messages.json')
module.exports = function () {
var args = Array.prototype.slice.call(arguments, 0)
var warningName = args.shift()
if (warningName === 'typo') {
return makeTypoWarning.apply(null, args)
} else {
var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'"
args.unshift(msgTemplate)
return util.format.apply(null, args)
}
}
function makeTypoWarning (providedName, probableName, field) {
if (field) {
providedName = field + "['" + providedName + "']"
probableName = field + "['" + probableName + "']"
}
return util.format(messages.typo, providedName, probableName)
}
normalize-package-data-4.0.1/lib/normalize.js 0000664 0000000 0000000 00000002547 14276532165 0021143 0 ustar 00root root 0000000 0000000 module.exports = normalize
var fixer = require('./fixer')
normalize.fixer = fixer
var makeWarning = require('./make_warning')
var fieldsToFix = ['name', 'version', 'description', 'repository', 'modules', 'scripts',
'files', 'bin', 'man', 'bugs', 'keywords', 'readme', 'homepage', 'license']
var otherThingsToFix = ['dependencies', 'people', 'typos']
var thingsToFix = fieldsToFix.map(function (fieldName) {
return ucFirst(fieldName) + 'Field'
})
// two ways to do this in CoffeeScript on only one line, sub-70 chars:
// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field"
// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix)
thingsToFix = thingsToFix.concat(otherThingsToFix)
function normalize (data, warn, strict) {
if (warn === true) {
warn = null
strict = true
}
if (!strict) {
strict = false
}
if (!warn || data.private) {
warn = function (msg) { /* noop */ }
}
if (data.scripts &&
data.scripts.install === 'node-gyp rebuild' &&
!data.scripts.preinstall) {
data.gypfile = true
}
fixer.warn = function () {
warn(makeWarning.apply(null, arguments))
}
thingsToFix.forEach(function (thingName) {
fixer['fix' + ucFirst(thingName)](data, strict)
})
data._id = data.name + '@' + data.version
}
function ucFirst (string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
normalize-package-data-4.0.1/lib/safe_format.js 0000664 0000000 0000000 00000000406 14276532165 0021421 0 ustar 00root root 0000000 0000000 var util = require('util')
module.exports = function () {
var args = Array.prototype.slice.call(arguments, 0)
args.forEach(function (arg) {
if (!arg) {
throw new TypeError('Bad arguments.')
}
})
return util.format.apply(null, arguments)
}
normalize-package-data-4.0.1/lib/typos.json 0000664 0000000 0000000 00000001353 14276532165 0020650 0 ustar 00root root 0000000 0000000 {
"topLevel": {
"dependancies": "dependencies"
,"dependecies": "dependencies"
,"depdenencies": "dependencies"
,"devEependencies": "devDependencies"
,"depends": "dependencies"
,"dev-dependencies": "devDependencies"
,"devDependences": "devDependencies"
,"devDepenencies": "devDependencies"
,"devdependencies": "devDependencies"
,"repostitory": "repository"
,"repo": "repository"
,"prefereGlobal": "preferGlobal"
,"hompage": "homepage"
,"hampage": "homepage"
,"autohr": "author"
,"autor": "author"
,"contributers": "contributors"
,"publicationConfig": "publishConfig"
,"script": "scripts"
},
"bugs": { "web": "url", "name": "url" },
"script": { "server": "start", "tests": "test" }
}
normalize-package-data-4.0.1/lib/warning_messages.json 0000664 0000000 0000000 00000003406 14276532165 0023027 0 ustar 00root root 0000000 0000000 {
"repositories": "'repositories' (plural) Not supported. Please pick one as the 'repository' field"
,"missingRepository": "No repository field."
,"brokenGitUrl": "Probably broken git url: %s"
,"nonObjectScripts": "scripts must be an object"
,"nonStringScript": "script values must be string commands"
,"nonArrayFiles": "Invalid 'files' member"
,"invalidFilename": "Invalid filename in 'files' list: %s"
,"nonArrayBundleDependencies": "Invalid 'bundleDependencies' list. Must be array of package names"
,"nonStringBundleDependency": "Invalid bundleDependencies member: %s"
,"nonDependencyBundleDependency": "Non-dependency in bundleDependencies: %s"
,"nonObjectDependencies": "%s field must be an object"
,"nonStringDependency": "Invalid dependency: %s %s"
,"deprecatedArrayDependencies": "specifying %s as array is deprecated"
,"deprecatedModules": "modules field is deprecated"
,"nonArrayKeywords": "keywords should be an array of strings"
,"nonStringKeyword": "keywords should be an array of strings"
,"conflictingName": "%s is also the name of a node core module."
,"nonStringDescription": "'description' field should be a string"
,"missingDescription": "No description"
,"missingReadme": "No README data"
,"missingLicense": "No license field."
,"nonEmailUrlBugsString": "Bug string field must be url, email, or {email,url}"
,"nonUrlBugsUrlField": "bugs.url field must be a string url. Deleted."
,"nonEmailBugsEmailField": "bugs.email field must be a string email. Deleted."
,"emptyNormalizedBugs": "Normalized value of bugs field is an empty object. Deleted."
,"nonUrlHomepage": "homepage field must be a string url. Deleted."
,"invalidLicense": "license should be a valid SPDX license expression"
,"typo": "%s should probably be %s."
}
normalize-package-data-4.0.1/package.json 0000664 0000000 0000000 00000002621 14276532165 0020316 0 ustar 00root root 0000000 0000000 {
"name": "normalize-package-data",
"version": "4.0.1",
"author": "GitHub Inc.",
"description": "Normalizes data that can be found in package.json files.",
"license": "BSD-2-Clause",
"repository": {
"type": "git",
"url": "https://github.com/npm/normalize-package-data.git"
},
"main": "lib/normalize.js",
"scripts": {
"postversion": "npm publish",
"prepublishOnly": "git push origin --follow-tags",
"preversion": "npm test",
"test": "tap",
"npmclilint": "npmcli-lint",
"lint": "eslint \"**/*.js\"",
"lintfix": "npm run lint -- --fix",
"posttest": "npm run lint",
"postsnap": "npm run lintfix --",
"postlint": "template-oss-check",
"snap": "tap",
"template-oss-apply": "template-oss-apply --force"
},
"dependencies": {
"hosted-git-info": "^5.0.0",
"is-core-module": "^2.8.1",
"semver": "^7.3.5",
"validate-npm-package-license": "^3.0.4"
},
"devDependencies": {
"@npmcli/eslint-config": "^3.0.1",
"@npmcli/template-oss": "3.5.0",
"tap": "^16.0.1"
},
"files": [
"bin/",
"lib/"
],
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
},
"templateOSS": {
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
"version": "3.5.0"
},
"tap": {
"branches": 86,
"functions": 92,
"lines": 86,
"statements": 86
}
}
normalize-package-data-4.0.1/test/ 0000775 0000000 0000000 00000000000 14276532165 0017006 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/test/basic.js 0000664 0000000 0000000 00000002770 14276532165 0020433 0 ustar 00root root 0000000 0000000 var tap = require('tap')
var normalize = require('../lib/normalize')
var path = require('path')
var fs = require('fs')
tap.test('basic test', function (t) {
var p = path.resolve(__dirname, './fixtures/read-package-json.json')
fs.readFile(p, function (err, contents) {
if (err) {
throw err
}
var originalData = JSON.parse(contents.toString())
var data = JSON.parse(contents.toString())
normalize(data)
t.ok(data)
verifyFields(t, data, originalData)
t.end()
})
})
function verifyFields (t, normalized, original) {
t.equal(normalized.version, original.version, 'Version field stays same')
t.equal(normalized._id, normalized.name + '@' + normalized.version, 'It gets good id.')
t.equal(normalized.name, original.name, 'Name stays the same.')
t.type(normalized.author, 'object', 'author field becomes object')
t.same(normalized.scripts, original.scripts, 'scripts field (object) stays same')
t.equal(normalized.main, original.main)
// optional deps are folded in.
t.same(normalized.optionalDependencies,
original.optionalDependencies)
t.has(
normalized.dependencies,
original.optionalDependencies, 'opt depedencies are copied into dependencies'
)
t.has(normalized.dependencies, original.dependencies, 'regular depedencies stay in place')
t.same(normalized.devDependencies, original.devDependencies)
t.type(normalized.bugs, 'object', 'bugs should become object')
t.equal(normalized.bugs.url, 'https://github.com/isaacs/read-package-json/issues')
}
normalize-package-data-4.0.1/test/consistency.js 0000664 0000000 0000000 00000001510 14276532165 0021702 0 ustar 00root root 0000000 0000000 const t = require('tap')
const normalize = require('../lib/normalize')
const fs = require('fs')
const path = require('path')
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
const readdir = promisify(fs.readdir)
t.test('consistent normalization', async t => {
const entries = await readdir(path.join(__dirname, 'fixtures'))
const verifyConsistency = async (entryName) => {
const warn = () => null
const filename = path.join(__dirname, 'fixtures', entryName)
const contents = await readFile(filename)
const data = JSON.parse(contents.toString())
normalize(data, warn)
const clonedData = { ...data }
normalize(data, warn)
t.same(clonedData, data,
'Normalization of ' + entryName + ' is consistent.')
}
return Promise.all(entries.map(i => verifyConsistency(i)))
})
normalize-package-data-4.0.1/test/dependencies.js 0000664 0000000 0000000 00000003333 14276532165 0021774 0 ustar 00root root 0000000 0000000 var tap = require('tap')
var normalize = require('../lib/normalize')
var warningMessages = require('../lib/warning_messages.json')
var safeFormat = require('../lib/safe_format')
tap.test('warn if dependency contains anything else but a string', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
dependencies: { a: 123 },
devDependencies: { b: 456 },
optionalDependencies: { c: 789 },
}, warn)
var wanted1 = safeFormat(warningMessages.nonStringDependency, 'a', 123)
var wanted2 = safeFormat(warningMessages.nonStringDependency, 'b', 456)
var wanted3 = safeFormat(warningMessages.nonStringDependency, 'c', 789)
t.ok(~warnings.indexOf(wanted1), wanted1)
t.ok(~warnings.indexOf(wanted2), wanted2)
t.ok(~warnings.indexOf(wanted3), wanted3)
t.end()
})
tap.test('warn if bundleDependencies array contains anything else but strings', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
bundleDependencies: ['abc', 123, { foo: 'bar' }],
}, warn)
var pkg = {
dependencies: {
def: '^1.0.0',
},
bundleDependencies: ['abc', 'def', 123, { foo: 'bar' }],
}
normalize(pkg, warn)
var wanted1 = safeFormat(warningMessages.nonStringBundleDependency, 123)
var wanted2 = safeFormat(warningMessages.nonStringBundleDependency, { foo: 'bar' })
var wanted3 = safeFormat(warningMessages.nonDependencyBundleDependency, 'abc')
t.ok(~warnings.indexOf(wanted1), wanted1)
t.ok(~warnings.indexOf(wanted2), wanted2)
t.ok(~warnings.indexOf(wanted3), wanted3)
t.equal(pkg.dependencies.abc, '*', 'added bundled dep to dependencies with *')
t.equal(pkg.dependencies.def, '^1.0.0', 'left def dependency alone')
t.end()
})
normalize-package-data-4.0.1/test/fixtures/ 0000775 0000000 0000000 00000000000 14276532165 0020657 5 ustar 00root root 0000000 0000000 normalize-package-data-4.0.1/test/fixtures/async.json 0000664 0000000 0000000 00000001550 14276532165 0022670 0 ustar 00root root 0000000 0000000 {
"name": "async",
"description": "Higher-order functions and common patterns for asynchronous code",
"main": "./lib/async",
"author": "Caolan McMahon",
"version": "0.2.6",
"repository" : {
"type" : "git",
"url" : "http://github.com/caolan/async.git"
},
"bugs" : {
"url" : "http://github.com/caolan/async/issues"
},
"licenses" : [
{
"type" : "MIT",
"url" : "http://github.com/caolan/async/raw/master/LICENSE"
}
],
"devDependencies": {
"nodeunit": ">0.0.0",
"uglify-js": "1.2.x",
"nodelint": ">0.0.0"
},
"jam": {
"main": "lib/async.js",
"include": [
"lib/async.js",
"README.md",
"LICENSE"
]
},
"scripts": {
"test": "nodeunit test/test-async.js"
}
}
normalize-package-data-4.0.1/test/fixtures/badscripts.json 0000664 0000000 0000000 00000000116 14276532165 0023706 0 ustar 00root root 0000000 0000000 {
"name": "bad-scripts-package",
"version": "0.0.1",
"scripts": "foo"
}
normalize-package-data-4.0.1/test/fixtures/bcrypt.json 0000664 0000000 0000000 00000003436 14276532165 0023063 0 ustar 00root root 0000000 0000000 {
"name": "bcrypt",
"description": "A bcrypt library for NodeJS.",
"keywords": [
"bcrypt",
"password",
"auth",
"authentication",
"encryption",
"crypt",
"crypto"
],
"main": "./bcrypt",
"version": "0.7.5",
"author": "Nick Campbell (http://github.com/ncb000gt)",
"engines": {
"node": ">= 0.6.0"
},
"repository": {
"type": "git",
"url": "http://github.com/ncb000gt/node.bcrypt.js.git"
},
"licenses": [
{
"type": "MIT"
}
],
"bugs": {
"url": "http://github.com/ncb000gt/node.bcrypt.js/issues"
},
"scripts": {
"test": "node-gyp configure build && nodeunit test"
},
"dependencies": {
"bindings": "1.0.0"
},
"devDependencies": {
"nodeunit": ">=0.6.4"
},
"contributors": [
"Antonio Salazar Cardozo (https://github.com/Shadowfiend)",
"Van Nguyen (https://github.com/thegoleffect)",
"David Trejo (https://github.com/dtrejo)",
"Ben Glow (https://github.com/pixelglow)",
"NewITFarmer.com <> (https://github.com/newitfarmer)",
"Alfred Westerveld (https://github.com/alfredwesterveld)",
"Vincent Côté-Roy (https://github.com/vincentcr)",
"Lloyd Hilaiel (https://github.com/lloyd)",
"Roman Shtylman (https://github.com/shtylman)",
"Vadim Graboys (https://github.com/vadimg)",
"Ben Noorduis <> (https://github.com/bnoordhuis)",
"Nate Rajlich (https://github.com/tootallnate)",
"Sean McArthur (https://github.com/seanmonstar)",
"Fanie Oosthuysen (https://github.com/weareu)"
]
}
normalize-package-data-4.0.1/test/fixtures/coffee-script.json 0000664 0000000 0000000 00000001673 14276532165 0024312 0 ustar 00root root 0000000 0000000 {
"name": "coffee-script",
"description": "Unfancy JavaScript",
"keywords": ["javascript", "language", "coffeescript", "compiler"],
"author": "Jeremy Ashkenas",
"version": "1.6.2",
"licenses": [{
"type": "MIT",
"url": "https://raw.github.com/jashkenas/coffee-script/master/LICENSE"
}],
"engines": {
"node": ">=0.8.0"
},
"directories" : {
"lib" : "./lib/coffee-script"
},
"main" : "./lib/coffee-script/coffee-script",
"bin": {
"coffee": "./bin/coffee",
"cake": "./bin/cake"
},
"scripts": {
"test": "node ./bin/cake test"
},
"homepage": "http://coffeescript.org",
"bugs": "https://github.com/jashkenas/coffee-script/issues",
"repository": {
"type": "git",
"url": "git://github.com/jashkenas/coffee-script.git"
},
"devDependencies": {
"uglify-js": "~2.2",
"jison": ">=0.2.0"
}
}
normalize-package-data-4.0.1/test/fixtures/http-server.json 0000664 0000000 0000000 00000002303 14276532165 0024033 0 ustar 00root root 0000000 0000000 {
"name": "http-server",
"preferGlobal": true,
"version": "0.3.0",
"author": "Nodejitsu ",
"description": "a simple zero-configuration command-line http server",
"contributors": [
{
"name": "Marak Squires",
"email": "marak@nodejitsu.com"
}
],
"bin": {
"http-server": "./bin/http-server"
},
"scripts": {
"start": "node ./bin/http-server",
"test": "vows --spec --isolate",
"predeploy": "echo This will be run before deploying the app",
"postdeploy": "echo This will be run after deploying the app"
},
"main": "./lib/http-server",
"repository": {
"type": "git",
"url": "https://github.com/nodejitsu/http-server.git"
},
"keywords": [
"cli",
"http",
"server"
],
"dependencies" : {
"colors" : "*",
"flatiron" : "0.1.x",
"optimist" : "0.2.x",
"union" : "0.1.x",
"ecstatic" : "0.1.x",
"plates" : "https://github.com/flatiron/plates/tarball/master"
},
"analyze": false,
"devDependencies": {
"vows" : "0.5.x",
"request" : "2.1.x"
},
"bundledDependencies": [
"union",
"ecstatic"
],
"license": "MIT",
"engines": {
"node": ">=0.6"
}
}
normalize-package-data-4.0.1/test/fixtures/movefile.json 0000664 0000000 0000000 00000001071 14276532165 0023357 0 ustar 00root root 0000000 0000000 {
"name": "movefile",
"description": "rename implementation working over devices",
"version": "0.2.0",
"author": "yazgazan ",
"main": "./build/Release/movefile",
"keywords": ["move", "file", "rename"],
"repository": "git://github.com/yazgazan/movefile.git",
"directories": {
"lib": "./build/Release/"
},
"scripts": {
"install": "./node_modules/node-gyp/bin/node-gyp.js configure && ./node_modules/node-gyp/bin/node-gyp.js build"
},
"engines": {
"node": "*"
},
"dependencies": {
"node-gyp": "~0.9.1"
}
}
normalize-package-data-4.0.1/test/fixtures/no-description.json 0000664 0000000 0000000 00000000066 14276532165 0024511 0 ustar 00root root 0000000 0000000 {
"name": "foo-bar-package",
"version": "0.0.1"
}
normalize-package-data-4.0.1/test/fixtures/node-module_exist.json 0000664 0000000 0000000 00000001117 14276532165 0025176 0 ustar 00root root 0000000 0000000 {
"name": "node-module_exist",
"description": "Find if a NodeJS module is available to require or not",
"version": "0.0.1",
"main": "module_exist.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git@gist.github.com:3135914.git"
},
"homepage": "https://github.com/FGRibreau",
"author": {
"name": "Francois-Guillaume Ribreau",
"url": "http://fgribreau.com.com/"
},
"devDependencies": {
"nodeunit": "~0.7.4"
},
"keywords": [
"core",
"modules"
],
"license": "MIT"
}
normalize-package-data-4.0.1/test/fixtures/npm.json 0000664 0000000 0000000 00000005413 14276532165 0022347 0 ustar 00root root 0000000 0000000 {
"version": "1.2.17",
"name": "npm",
"publishConfig": {
"proprietary-attribs": false
},
"description": "A package manager for node",
"keywords": [
"package manager",
"modules",
"install",
"package.json"
],
"preferGlobal": true,
"config": {
"publishtest": false
},
"homepage": "https://npmjs.org/doc/",
"author": "Isaac Z. Schlueter (http://blog.izs.me)",
"repository": {
"type": "git",
"url": "https://github.com/isaacs/npm"
},
"bugs": {
"email": "npm-@googlegroups.com",
"url": "http://github.com/isaacs/npm/issues"
},
"directories": {
"doc": "./doc",
"man": "./man",
"lib": "./lib",
"bin": "./bin"
},
"main": "./lib/npm.js",
"bin": "./bin/npm-cli.js",
"dependencies": {
"semver": "~1.1.2",
"ini": "~1.1.0",
"slide": "1",
"abbrev": "~1.0.4",
"graceful-fs": "~1.2.0",
"minimatch": "~0.2.11",
"nopt": "~2.1.1",
"rimraf": "2",
"request": "~2.9",
"which": "1",
"tar": "~0.1.17",
"fstream": "~0.1.22",
"block-stream": "*",
"inherits": "1",
"mkdirp": "~0.3.3",
"read": "~1.0.4",
"lru-cache": "~2.3.0",
"node-gyp": "~0.9.3",
"fstream-npm": "~0.1.3",
"uid-number": "0",
"archy": "0",
"chownr": "0",
"npmlog": "0",
"ansi": "~0.1.2",
"npm-registry-client": "~0.2.18",
"read-package-json": "~0.3.0",
"read-installed": "0",
"glob": "~3.1.21",
"init-package-json": "0.0.6",
"osenv": "0",
"lockfile": "~0.3.0",
"retry": "~0.6.0",
"once": "~1.1.1",
"npmconf": "0",
"opener": "~1.3.0",
"chmodr": "~0.1.0",
"cmd-shim": "~1.1.0"
},
"bundleDependencies": [
"semver",
"ini",
"slide",
"abbrev",
"graceful-fs",
"minimatch",
"nopt",
"rimraf",
"request",
"which",
"tar",
"fstream",
"block-stream",
"inherits",
"mkdirp",
"read",
"lru-cache",
"node-gyp",
"fstream-npm",
"uid-number",
"archy",
"chownr",
"npmlog",
"ansi",
"npm-registry-client",
"read-package-json",
"read-installed",
"glob",
"init-package-json",
"osenv",
"lockfile",
"retry",
"once",
"npmconf",
"opener",
"chmodr",
"cmd-shim"
],
"devDependencies": {
"ronn": "~0.3.6",
"tap": "~0.4.0"
},
"engines": {
"node": ">=0.6",
"npm": "1"
},
"scripts": {
"test": "node ./test/run.js && tap test/tap/*.js",
"tap": "tap test/tap/*.js",
"prepublish": "node bin/npm-cli.js prune ; rm -rf test/*/*/node_modules ; make -j4 doc",
"dumpconf": "env | grep npm | sort | uniq",
"echo": "node bin/npm-cli.js"
},
"licenses": [
{
"type": "MIT +no-false-attribs",
"url": "https://github.com/isaacs/npm/raw/master/LICENSE"
}
]
}
normalize-package-data-4.0.1/test/fixtures/read-package-json.json 0000664 0000000 0000000 00000001244 14276532165 0025026 0 ustar 00root root 0000000 0000000 {
"name": "read-package-json",
"version": "0.1.1",
"author": "Isaac Z. Schlueter (http://blog.izs.me/)",
"description": "The thing npm uses to read package.json files with semantics and defaults and validation",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/read-package-json.git"
},
"license": "MIT",
"main": "read-json.js",
"scripts": {
"test": "tap test/*.js"
},
"dependencies": {
"glob": "~3.1.9",
"lru-cache": "~1.1.0",
"semver": "~1.0.14",
"slide": "~1.1.3"
},
"devDependencies": {
"tap": "~0.2.5"
},
"optionalDependencies": {
"npmlog": "0",
"graceful-fs": "~1.1.8"
}
}
normalize-package-data-4.0.1/test/fixtures/request.json 0000664 0000000 0000000 00000001466 14276532165 0023251 0 ustar 00root root 0000000 0000000 {
"name": "request",
"description": "Simplified HTTP request client.",
"tags": [
"http",
"simple",
"util",
"utility"
],
"version": "2.16.7",
"author": "Mikeal Rogers ",
"repository": {
"type": "git",
"url": "http://github.com/mikeal/request.git"
},
"bugs": {
"url": "http://github.com/mikeal/request/issues"
},
"engines": [
"node >= 0.8.0"
],
"main": "index.js",
"dependencies": {
"form-data": "~0.0.3",
"mime": "~1.2.7",
"hawk": "~0.10.2",
"node-uuid": "~1.4.0",
"cookie-jar": "~0.2.0",
"aws-sign": "~0.2.0",
"oauth-sign": "~0.2.0",
"forever-agent": "~0.2.0",
"tunnel-agent": "~0.2.0",
"json-stringify-safe": "~3.0.0",
"qs": "~0.5.4"
},
"scripts": {
"test": "node tests/run.js"
}
}
normalize-package-data-4.0.1/test/fixtures/underscore.json 0000664 0000000 0000000 00000001176 14276532165 0023730 0 ustar 00root root 0000000 0000000 {
"name" : "underscore",
"description" : "JavaScript's functional programming helper library.",
"homepage" : "http://underscorejs.org",
"keywords" : ["util", "functional", "server", "client", "browser"],
"author" : "Jeremy Ashkenas ",
"repository" : {"type": "git", "url": "git://github.com/documentcloud/underscore.git"},
"main" : "underscore.js",
"version" : "1.4.4",
"devDependencies": {
"phantomjs": "1.9.0-1"
},
"scripts": {
"test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true"
},
"license" : "MIT"
}
normalize-package-data-4.0.1/test/github-urls.js 0000664 0000000 0000000 00000002262 14276532165 0021613 0 ustar 00root root 0000000 0000000 const t = require('tap')
const normalize = require('../lib/normalize')
const fs = require('fs')
const path = require('path')
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
t.test('consistent normalization', async t => {
const entries = [
'read-package-json.json',
'http-server.json',
'movefile.json',
'node-module_exist.json',
]
const verifyConsistency = async (entryName) => {
const warn = () => null
const filename = path.join(__dirname, 'fixtures', entryName)
const contents = await readFile(filename)
const data = JSON.parse(contents.toString())
normalize(data, warn)
if (data.name === 'node-module_exist') {
t.same(data.bugs.url, 'https://gist.github.com/3135914')
}
if (data.name === 'read-package-json') {
t.same(data.bugs.url, 'https://github.com/isaacs/read-package-json/issues')
}
if (data.name === 'http-server') {
t.same(data.bugs.url, 'https://github.com/nodejitsu/http-server/issues')
}
if (data.name === 'movefile') {
t.same(data.bugs.url, 'https://github.com/yazgazan/movefile/issues')
}
}
return Promise.all(entries.map(i => verifyConsistency(i)))
})
normalize-package-data-4.0.1/test/mixedcase-names.js 0000664 0000000 0000000 00000001420 14276532165 0022404 0 ustar 00root root 0000000 0000000 var test = require('tap').test
var normalize = require('../')
var fixer = normalize.fixer
test('mixedcase', function (t) {
t.doesNotThrow(function () {
fixer.fixNameField({ name: 'foo' }, true)
})
t.doesNotThrow(function () {
fixer.fixNameField({ name: 'foo' }, false)
})
t.doesNotThrow(function () {
fixer.fixNameField({ name: 'foo' })
})
t.throws(function () {
fixer.fixNameField({ name: 'Foo' }, true)
}, new Error('Invalid name: "Foo"'), 'should throw an error')
t.throws(function () {
fixer.fixNameField({ name: 'Foo' }, { strict: true })
}, new Error('Invalid name: "Foo"'), 'should throw an error')
t.doesNotThrow(function () {
fixer.fixNameField({ name: 'Foo' }, { strict: true, allowLegacyCase: true })
})
t.end()
})
normalize-package-data-4.0.1/test/normalize.js 0000664 0000000 0000000 00000016727 14276532165 0021361 0 ustar 00root root 0000000 0000000 var tap = require('tap')
var fs = require('fs')
var path = require('path')
var normalize = require('../lib/normalize')
var warningMessages = require('../lib/warning_messages.json')
var safeFormat = require('../lib/safe_format')
var rpjPath = path.resolve(__dirname, './fixtures/read-package-json.json')
tap.test('normalize some package data', function (t) {
var packageData = require(rpjPath)
var warnings = []
normalize(packageData, function (warning) {
warnings.push(warning)
})
// there's no readme data in this particular object
t.equal(warnings.length, 1, "There's exactly one warning.")
fs.readFile(rpjPath, function (err, data) {
if (err) {
throw err
}
// Various changes have been made
t.not(packageData, JSON.parse(data), 'Output is different from input.')
t.end()
})
})
tap.test('runs without passing warning function', function (t) {
fs.readFile(rpjPath, function (err, data) {
if (err) {
throw err
}
normalize(JSON.parse(data))
t.ok(true, "If you read this, this means I'm still alive.")
t.end()
})
})
tap.test('empty object', function (t) {
var packageData = {}
var expect =
{ name: '',
version: '',
readme: 'ERROR: No README data found!',
_id: '@' }
var warnings = []
function warn (m) {
warnings.push(m)
}
normalize(packageData, warn)
t.same(packageData, expect)
t.same(warnings, [
warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.missingLicense,
])
t.end()
})
tap.test('core module name', function (t) {
var warnings = []
function warn (m) {
warnings.push(m)
}
var coreModules = ['http', '_stream_writable']
var expect = []
for (var i = 0; i < coreModules.length; ++i) {
normalize({
name: coreModules[i],
readme: 'read yourself how about',
homepage: 123,
bugs: "what is this i don't even",
repository: 'Hello.',
}, warn)
expect = expect.concat([
safeFormat(warningMessages.conflictingName, coreModules[i]),
warningMessages.nonEmailUrlBugsString,
warningMessages.emptyNormalizedBugs,
warningMessages.nonUrlHomepage,
warningMessages.missingLicense,
])
}
t.same(warnings, expect)
t.end()
})
tap.test('urls required', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
bugs: {
url: '/1',
email: 'not an email address',
},
}, warn)
normalize({
readme: 'read yourself how about',
homepage: 123,
bugs: "what is this i don't even",
repository: 'Hello.',
}, warn)
var expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.nonUrlBugsUrlField,
warningMessages.nonEmailBugsEmailField,
warningMessages.emptyNormalizedBugs,
warningMessages.missingReadme,
warningMessages.missingLicense,
warningMessages.nonEmailUrlBugsString,
warningMessages.emptyNormalizedBugs,
warningMessages.nonUrlHomepage,
warningMessages.missingLicense]
t.same(warnings, expect)
t.end()
})
tap.test('homepage field must start with a protocol.', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
var a
normalize(a = {
homepage: 'example.org',
}, warn)
var expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.missingLicense]
t.same(warnings, expect)
t.same(a.homepage, 'http://example.org')
t.end()
})
tap.test('license field should be a valid SPDX expression', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
license: 'Apache 2',
}, warn)
var expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.invalidLicense]
t.same(warnings, expect)
t.end()
})
tap.test("don't fail when license is just a space", function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
license: ' ',
}, warn)
var expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.invalidLicense]
t.same(warnings, expect)
t.end()
})
tap.test("don't fail when license is licence", function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
description: 'description',
readme: 'readme',
repository: 'https://npmjs.org',
licence: 'MIT',
}, warn)
t.same(warnings, [])
t.end()
})
tap.test('gist bugs url', function (t) {
var d = {
repository: 'git@gist.github.com:1234567.git',
}
normalize(d)
t.same(d.repository, { type: 'git', url: 'git+ssh://git@gist.github.com/1234567.git' })
t.same(d.bugs, { url: 'https://gist.github.com/1234567' })
t.end()
})
tap.test('singularize repositories', function (t) {
var d = { repositories: ['git@gist.github.com:1234567.git'] }
normalize(d)
t.same(d.repository, { type: 'git', url: 'git+ssh://git@gist.github.com/1234567.git' })
t.end()
})
tap.test('treat visionmedia/express as github repo', function (t) {
var d = { repository: { type: 'git', url: 'visionmedia/express' } }
normalize(d)
t.same(d.repository, { type: 'git', url: 'git+https://github.com/visionmedia/express.git' })
t.end()
})
tap.test('treat isaacs/node-graceful-fs as github repo', function (t) {
var d = { repository: { type: 'git', url: 'isaacs/node-graceful-fs' } }
normalize(d)
t.same(d.repository, { type: 'git', url: 'git+https://github.com/isaacs/node-graceful-fs.git' })
t.end()
})
tap.test('homepage field will set to github url if repository is a github repo', function (t) {
var a
normalize(a = {
repository: { type: 'git', url: 'https://github.com/isaacs/node-graceful-fs' },
})
t.same(a.homepage, 'https://github.com/isaacs/node-graceful-fs#readme')
t.end()
})
tap.test('homepage field will set to github gist url if repository is a gist', function (t) {
var a
normalize(a = {
repository: { type: 'git', url: 'git@gist.github.com:1234567.git' },
})
t.same(a.homepage, 'https://gist.github.com/1234567')
t.end()
})
/* eslint-disable-next-line max-len */
tap.test('homepage field will set to github gist url if repository is a shorthand reference', function (t) {
var a
normalize(a = {
repository: { type: 'git', url: 'sindresorhus/chalk' },
})
t.same(a.homepage, 'https://github.com/sindresorhus/chalk#readme')
t.end()
})
tap.test("don't mangle github shortcuts in dependencies", function (t) {
var d = { dependencies: { 'node-graceful-fs': 'isaacs/node-graceful-fs' } }
normalize(d)
t.same(d.dependencies, { 'node-graceful-fs': 'github:isaacs/node-graceful-fs' })
t.end()
})
tap.test('deprecation warning for array in dependencies fields', function (t) {
var warnings = []
function warn (w) {
warnings.push(w)
}
normalize({
dependencies: [],
devDependencies: [],
optionalDependencies: [],
}, warn)
t.ok(
~warnings.indexOf(safeFormat(warningMessages.deprecatedArrayDependencies, 'dependencies')),
'deprecation warning'
)
t.ok(
~warnings.indexOf(safeFormat(warningMessages.deprecatedArrayDependencies, 'devDependencies')),
'deprecation warning'
)
t.ok(
~warnings.indexOf(
safeFormat(warningMessages.deprecatedArrayDependencies, 'optionalDependencies')
),
'deprecation warning'
)
t.end()
})
normalize-package-data-4.0.1/test/scoped.js 0000664 0000000 0000000 00000002633 14276532165 0020625 0 ustar 00root root 0000000 0000000 var test = require('tap').test
var fixNameField = require('../lib/fixer.js').fixNameField
var fixBinField = require('../lib/fixer.js').fixBinField
test('a simple scoped module has a valid name', function (t) {
var data = { name: '@org/package' }
fixNameField(data, false)
t.equal(data.name, '@org/package', 'name was unchanged')
t.end()
})
test("'org@package' is not a valid name", function (t) {
t.throws(function () {
fixNameField({ name: 'org@package' }, false)
}, 'blows up as expected')
t.end()
})
test("'org=package' is not a valid name", function (t) {
t.throws(function () {
fixNameField({ name: 'org=package' }, false)
}, 'blows up as expected')
t.end()
})
test("'@org=sub/package' is not a valid name", function (t) {
t.throws(function () {
fixNameField({ name: '@org=sub/package' }, false)
}, 'blows up as expected')
t.end()
})
test("'@org/' is not a valid name", function (t) {
t.throws(function () {
fixNameField({ name: '@org/' }, false)
}, 'blows up as expected')
t.end()
})
test("'@/package' is not a valid name", function (t) {
t.throws(function () {
fixNameField({ name: '@/package' }, false)
}, 'blows up as expected')
t.end()
})
test("name='@org/package', bin='bin.js' is bin={package:'bin.js'}", function (t) {
var obj = { name: '@org/package', bin: 'bin.js' }
fixBinField(obj)
t.strictSame(obj.bin, { package: 'bin.js' })
t.end()
})
normalize-package-data-4.0.1/test/scripts.js 0000664 0000000 0000000 00000001415 14276532165 0021034 0 ustar 00root root 0000000 0000000 var tap = require('tap')
var normalize = require('../lib/normalize')
var path = require('path')
var fs = require('fs')
tap.test('bad scripts', function (t) {
var p = path.resolve(__dirname, './fixtures/badscripts.json')
fs.readFile(p, function (err, contents) {
if (err) {
throw err
}
var originalData = JSON.parse(contents.toString())
var data = JSON.parse(contents.toString())
normalize(data)
t.ok(data)
verifyFields(t, data, originalData)
t.end()
})
})
function verifyFields (t, normalized, original) {
t.equal(normalized.version, original.version, 'Version field stays same')
t.equal(normalized.name, original.name, 'Name stays the same.')
// scripts is not an object, so it should be deleted
t.notOk(normalized.scripts)
}
normalize-package-data-4.0.1/test/strict.js 0000664 0000000 0000000 00000002244 14276532165 0020656 0 ustar 00root root 0000000 0000000 var test = require('tap').test
var normalize = require('../')
test('strict', function (t) {
var threw
try {
threw = false
normalize({ name: 'X' }, true)
} catch (er) {
threw = true
t.equal(er.message, 'Invalid name: "X"')
} finally {
t.equal(threw, true)
}
try {
threw = false
normalize({ name: ' x ' }, true)
} catch (er) {
threw = true
t.equal(er.message, 'Invalid name: " x "')
} finally {
t.equal(threw, true)
}
try {
threw = false
normalize({ name: 'x', version: '01.02.03' }, true)
} catch (er) {
threw = true
t.equal(er.message, 'Invalid version: "01.02.03"')
} finally {
t.equal(threw, true)
}
// these should not throw
var slob = { name: ' X ',
version: '01.02.03',
dependencies: {
y: '>01.02.03',
z: '! 99 $$ASFJ(Aawenf90awenf as;naw.3j3qnraw || an elephant',
} }
normalize(slob, false)
t.same(slob,
{ name: 'X',
version: '1.2.3',
dependencies:
{ y: '>01.02.03',
z: '! 99 $$ASFJ(Aawenf90awenf as;naw.3j3qnraw || an elephant' },
readme: 'ERROR: No README data found!',
_id: 'X@1.2.3' })
t.end()
})
normalize-package-data-4.0.1/test/typo.js 0000664 0000000 0000000 00000007511 14276532165 0020343 0 ustar 00root root 0000000 0000000 var test = require('tap').test
var normalize = require('../')
var warningMessages = require('../lib/warning_messages.json')
var safeFormat = require('../lib/safe_format')
test('typos', function (t) {
var warnings = []
function warn (m) {
warnings.push(m)
}
var typoMessage = safeFormat.bind(undefined, warningMessages.typo)
var expect =
[warningMessages.missingRepository,
warningMessages.missingLicense,
typoMessage('dependancies', 'dependencies'),
typoMessage('dependecies', 'dependencies'),
typoMessage('depdenencies', 'dependencies'),
typoMessage('devEependencies', 'devDependencies'),
typoMessage('depends', 'dependencies'),
typoMessage('dev-dependencies', 'devDependencies'),
typoMessage('devDependences', 'devDependencies'),
typoMessage('devDepenencies', 'devDependencies'),
typoMessage('devdependencies', 'devDependencies'),
typoMessage('repostitory', 'repository'),
typoMessage('repo', 'repository'),
typoMessage('prefereGlobal', 'preferGlobal'),
typoMessage('hompage', 'homepage'),
typoMessage('hampage', 'homepage'),
typoMessage('autohr', 'author'),
typoMessage('autor', 'author'),
typoMessage('contributers', 'contributors'),
typoMessage('publicationConfig', 'publishConfig')]
normalize({ dependancies: 'dependencies',
dependecies: 'dependencies',
depdenencies: 'dependencies',
devEependencies: 'devDependencies',
depends: 'dependencies',
'dev-dependencies': 'devDependencies',
devDependences: 'devDependencies',
devDepenencies: 'devDependencies',
devdependencies: 'devDependencies',
repostitory: 'repository',
repo: 'repository',
prefereGlobal: 'preferGlobal',
hompage: 'homepage',
hampage: 'homepage',
autohr: 'author',
autor: 'author',
contributers: 'contributors',
publicationConfig: 'publishConfig',
readme: 'asdf',
name: 'name',
version: '1.2.5' }, warn)
t.same(warnings, expect)
warnings.length = 0
expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
typoMessage("bugs['web']", "bugs['url']"),
typoMessage("bugs['name']", "bugs['url']"),
warningMessages.nonUrlBugsUrlField,
warningMessages.emptyNormalizedBugs,
warningMessages.missingReadme,
warningMessages.missingLicense]
normalize({ name: 'name',
version: '1.2.5',
bugs: { web: 'url', name: 'url' } }, warn)
t.same(warnings, expect)
warnings.length = 0
expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.missingLicense,
typoMessage('script', 'scripts')]
normalize({ name: 'name',
version: '1.2.5',
script: { server: 'start', tests: 'test' } }, warn)
t.same(warnings, expect)
warnings.length = 0
expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
typoMessage("scripts['server']", "scripts['start']"),
typoMessage("scripts['tests']", "scripts['test']"),
warningMessages.missingReadme,
warningMessages.missingLicense]
normalize({ name: 'name',
version: '1.2.5',
scripts: { server: 'start', tests: 'test' } }, warn)
t.same(warnings, expect)
warnings.length = 0
expect =
[warningMessages.missingDescription,
warningMessages.missingRepository,
warningMessages.missingReadme,
warningMessages.missingLicense]
normalize({ name: 'name',
version: '1.2.5',
scripts: { server: 'start',
tests: 'test',
start: 'start',
test: 'test' } }, warn)
t.same(warnings, expect)
warnings.length = 0
expect = []
normalize({ private: true,
name: 'name',
version: '1.2.5',
scripts: { server: 'start', tests: 'test' } }, warn)
t.same(warnings, expect)
t.end()
})