summaryrefslogtreecommitdiff
path: root/deps/npm/test/tap/pack-files-and-ignores.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/test/tap/pack-files-and-ignores.js')
-rw-r--r--deps/npm/test/tap/pack-files-and-ignores.js697
1 files changed, 697 insertions, 0 deletions
diff --git a/deps/npm/test/tap/pack-files-and-ignores.js b/deps/npm/test/tap/pack-files-and-ignores.js
new file mode 100644
index 0000000000..6d8b43e9d5
--- /dev/null
+++ b/deps/npm/test/tap/pack-files-and-ignores.js
@@ -0,0 +1,697 @@
+'use strict'
+var test = require('tap').test
+var common = require('../common-tap.js')
+var path = require('path')
+var rimraf = require('rimraf')
+var mkdirp = require('mkdirp')
+var fs = require('graceful-fs')
+var tar = require('tar')
+var basepath = path.resolve(__dirname, path.basename(__filename, '.js'))
+var fixturepath = path.resolve(basepath, 'npm-test-files')
+var targetpath = path.resolve(basepath, 'target')
+var Tacks = require('tacks')
+var File = Tacks.File
+var Dir = Tacks.Dir
+
+test('basic file inclusion', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ 'include',
+ 'sub/include'
+ ]
+ }),
+ include: File(''),
+ sub: Dir({ include: File('') }),
+ notincluded: File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('include'), 'toplevel file included')
+ t.ok(fileExists('sub/include'), 'nested file included')
+ t.notOk(fileExists('notincluded'), 'unspecified file not included')
+ done()
+ })
+})
+
+test('basic file exclusion', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.npmignore': File(
+ 'ignore\n' +
+ 'sub/ignore\n'
+ ),
+ include: File(''),
+ ignore: File(''),
+ sub: Dir({ ignore: File('') })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('ignore'), 'toplevel file excluded')
+ t.notOk(fileExists('sub/ignore'), 'nested file excluded')
+ t.ok(fileExists('include'), 'unignored file included')
+ done()
+ })
+})
+
+test('toplevel-only and blanket ignores', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.npmignore': File(
+ './shallow1\n' +
+ '/shallow2\n' +
+ '/sub/onelevel\n' +
+ 'deep\n' +
+ ''
+ ),
+ shallow1: File(''),
+ shallow2: File(''),
+ deep: File(''),
+ sub: Dir({
+ shallow1: File(''),
+ shallow2: File(''),
+ onelevel: File(''),
+ deep: File(''),
+ sub: Dir({
+ deep: File(''),
+ onelevel: File('')
+ })
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('shallow2'), '/ file excluded')
+ t.ok(fileExists('sub/shallow1'), 'nested ./ file included')
+ t.ok(fileExists('sub/shallow2'), 'nested / file included')
+ t.ok(fileExists('sub/sub/onelevel'), 'double-nested file included')
+ t.notOk(fileExists('sub/onelevel'), 'nested / file excluded')
+ t.notOk(fileExists('deep'), 'deep file excluded')
+ t.notOk(fileExists('sub/deep'), 'nested deep file excluded')
+ t.notOk(fileExists('sub/sub/deep'), 'double-nested deep file excluded')
+ t.ok(fileExists('shallow1'), './ file included')
+ done()
+ })
+})
+
+test('.npmignore works for nested directories recursively', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.npmignore': File(
+ '/ignore\n' +
+ 'deep\n'
+ ),
+ include: File(''),
+ ignore: File(''),
+ deep: File(''),
+ sub: Dir({
+ ignore: File(''),
+ include: File(''),
+ deep: File(''),
+ sub: Dir({
+ '.npmignore': File(
+ '/ignore\n'
+ ),
+ ignore: File(''),
+ include: File(''),
+ deep: File('')
+ })
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('ignore'), 'toplevel file excluded')
+ t.ok(fileExists('include'), 'unignored file included')
+ t.ok(fileExists('sub/ignore'), 'same-name file in nested dir included')
+ t.ok(fileExists('sub/include'), 'unignored nested dir file included')
+ t.notOk(fileExists('sub/sub/ignore'), 'sub-sub-directory file excluded')
+ t.ok(fileExists('sub/sub/include'), 'sub-sube-directory file included')
+ t.notOk(fileExists('deep'), 'deep file excluded')
+ t.notOk(fileExists('sub/deep'), 'sub-dir deep file excluded')
+ t.notOk(fileExists('sub/sub/deep'), 'sub-sub-dir deep file excluded')
+ done()
+ })
+})
+
+test('.gitignore should have identical semantics', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.gitignore': File(
+ './shallow1\n' +
+ '/shallow2\n' +
+ '/sub/onelevel\n' +
+ 'deep\n' +
+ ''
+ ),
+ shallow1: File(''),
+ shallow2: File(''),
+ deep: File(''),
+ sub: Dir({
+ shallow1: File(''),
+ shallow2: File(''),
+ onelevel: File(''),
+ deep: File(''),
+ sub: Dir({
+ deep: File(''),
+ onelevel: File('')
+ })
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('shallow2'), '/ file excluded')
+ t.ok(fileExists('sub/shallow1'), 'nested ./ file included')
+ t.ok(fileExists('sub/shallow2'), 'nested / file included')
+ t.ok(fileExists('sub/sub/onelevel'), 'double-nested file included')
+ t.notOk(fileExists('sub/onelevel'), 'nested / file excluded')
+ t.notOk(fileExists('deep'), 'deep file excluded')
+ t.notOk(fileExists('sub/deep'), 'nested deep file excluded')
+ t.notOk(fileExists('sub/sub/deep'), 'double-nested deep file excluded')
+ t.ok(fileExists('shallow1'), './ file included')
+ done()
+ })
+})
+
+test('.npmignore should always be overridden by files array', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ 'include',
+ 'sub'
+ ]
+ }),
+ '.npmignore': File(
+ 'include\n' +
+ 'ignore\n' +
+ 'sub/included\n'
+ ),
+ include: File(''),
+ ignore: File(''),
+ sub: Dir({
+ included: File('')
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('ignore'), 'toplevel file excluded')
+ t.ok(fileExists('include'), 'unignored file included')
+ t.ok(fileExists('sub/included'), 'nested file included')
+ done()
+ })
+})
+
+test('.gitignore supported for ignores', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.gitignore': File(
+ 'ignore\n' +
+ 'sub/ignore\n'
+ ),
+ include: File(''),
+ ignore: File(''),
+ sub: Dir({ ignore: File('') })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('ignore'), 'toplevel file excluded')
+ t.notOk(fileExists('sub/ignore'), 'nested file excluded')
+ t.ok(fileExists('include'), 'unignored file included')
+ done()
+ })
+})
+
+test('.npmignore completely overrides .gitignore', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.npmignore': File(
+ 'ignore\n' +
+ 'sub/ignore\n'
+ ),
+ '.gitignore': File(
+ 'include\n' +
+ 'sub/include\n' +
+ 'extra\n'
+ ),
+ include: File(''),
+ sub: Dir({ include: File('') }),
+ extra: File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('include'), 'gitignored toplevel file included')
+ t.ok(fileExists('extra'), 'gitignored extra toplevel file included')
+ t.ok(fileExists('sub/include'), 'gitignored nested file included')
+ t.notOk(fileExists('ignore'), 'toplevel file excluded')
+ t.notOk(fileExists('sub/ignore'), 'nested file excluded')
+ done()
+ })
+})
+
+test('files array overrides .npmignore', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ 'include',
+ 'sub/include'
+ ]
+ }),
+ '.npmignore': File(
+ 'include\n' +
+ 'sub/include\n'
+ ),
+ include: File(''),
+ sub: Dir({ include: File('') })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('include'), 'toplevel file included')
+ t.ok(fileExists('sub/include'), 'nested file included')
+ done()
+ })
+})
+
+test('includes files regardless of emptiness', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ 'full',
+ 'empty'
+ ]
+ }),
+ full: File('This file has contents~'),
+ empty: File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('full'), 'contentful file included')
+ t.ok(fileExists('empty'), 'empty file included')
+ done()
+ })
+})
+
+test('.npmignore itself gets included', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ '.npmignore'
+ ]
+ }),
+ '.npmignore': File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('.npmignore'), '.npmignore included')
+ done()
+ })
+})
+
+test('include default files when missing files spec', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ 'index.js': File(''),
+ foo: File(''),
+ node_modules: Dir({foo: Dir({bar: File('')})})
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('index.js'), 'index.js included')
+ t.ok(fileExists('foo'), 'foo included')
+ t.notOk(fileExists('node_modules'), 'node_modules not included')
+ done()
+ })
+})
+
+test('include main file', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ main: 'foo.js',
+ files: []
+ }),
+ 'index.js': File(''),
+ 'foo.js': File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('foo.js'), 'foo.js included because of main')
+ t.notOk(fileExists('index.js'), 'index.js not included')
+ done()
+ })
+})
+
+test('certain files ignored by default', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.git': Dir({foo: File('')}),
+ '.svn': Dir({foo: File('')}),
+ 'CVS': Dir({foo: File('')}),
+ '.hg': Dir({foo: File('')}),
+ '.lock-wscript': File(''),
+ '.wafpickle-0': File(''),
+ '.wafpickle-5': File(''),
+ '.wafpickle-50': File(''),
+ 'build': Dir({'config.gypi': File('')}),
+ 'npm-debug.log': File(''),
+ '.npmrc': File(''),
+ '.foo.swp': File(''),
+ '.DS_Store': Dir({foo: File('')}),
+ '._ohno': File(''),
+ '._ohnoes': Dir({noes: File('')}),
+ 'foo.orig': File(''),
+ 'package-lock.json': File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('.git'), '.git not included')
+ t.notOk(fileExists('.svn'), '.svn not included')
+ t.notOk(fileExists('CVS'), 'CVS not included')
+ t.notOk(fileExists('.hg'), '.hg not included')
+ t.notOk(fileExists('.lock-wscript'), '.lock-wscript not included')
+ t.notOk(fileExists('.wafpickle-0'), '.wafpickle-0 not included')
+ t.notOk(fileExists('.wafpickle-5'), '.wafpickle-5 not included')
+ t.notOk(fileExists('.wafpickle-50'), '.wafpickle-50 not included')
+ t.notOk(fileExists('build/config.gypi'), 'build/config.gypi not included')
+ t.notOk(fileExists('npm-debug.log'), 'npm-debug.log not included')
+ t.notOk(fileExists('.npmrc'), '.npmrc not included')
+ t.notOk(fileExists('.foo.swp'), '.foo.swp not included')
+ t.notOk(fileExists('.DS_Store'), '.DS_Store not included')
+ t.notOk(fileExists('._ohno'), '._ohno not included')
+ t.notOk(fileExists('._ohnoes'), '._ohnoes not included')
+ t.notOk(fileExists('foo.orig'), 'foo.orig not included')
+ t.notOk(fileExists('package-lock.json'), 'package-lock.json not included')
+ done()
+ })
+})
+
+test('default-ignored files can be explicitly included', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ '.git',
+ '.svn',
+ 'CVS',
+ '.hg',
+ '.lock-wscript',
+ '.wafpickle-0',
+ '.wafpickle-5',
+ '.wafpickle-50',
+ 'build/config.gypi',
+ 'npm-debug.log',
+ '.npmrc',
+ '.foo.swp',
+ '.DS_Store',
+ '._ohno',
+ '._ohnoes',
+ 'foo.orig',
+ 'package-lock.json'
+ ]
+ }),
+ '.git': Dir({foo: File('')}),
+ '.svn': Dir({foo: File('')}),
+ 'CVS': Dir({foo: File('')}),
+ '.hg': Dir({foo: File('')}),
+ '.lock-wscript': File(''),
+ '.wafpickle-0': File(''),
+ '.wafpickle-5': File(''),
+ '.wafpickle-50': File(''),
+ 'build': Dir({'config.gypi': File('')}),
+ 'npm-debug.log': File(''),
+ '.npmrc': File(''),
+ '.foo.swp': File(''),
+ '.DS_Store': Dir({foo: File('')}),
+ '._ohno': File(''),
+ '._ohnoes': Dir({noes: File('')}),
+ 'foo.orig': File(''),
+ 'package-lock.json': File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('.git'), '.git included')
+ t.ok(fileExists('.svn'), '.svn included')
+ t.ok(fileExists('CVS'), 'CVS included')
+ t.ok(fileExists('.hg'), '.hg included')
+ t.ok(fileExists('.lock-wscript'), '.lock-wscript included')
+ t.ok(fileExists('.wafpickle-0'), '.wafpickle-0 included')
+ t.ok(fileExists('.wafpickle-5'), '.wafpickle-5 included')
+ t.ok(fileExists('.wafpickle-50'), '.wafpickle-50 included')
+ t.ok(fileExists('build/config.gypi'), 'build/config.gypi included')
+ t.ok(fileExists('npm-debug.log'), 'npm-debug.log included')
+ t.ok(fileExists('.npmrc'), '.npmrc included')
+ t.ok(fileExists('.foo.swp'), '.foo.swp included')
+ t.ok(fileExists('.DS_Store'), '.DS_Store included')
+ t.ok(fileExists('._ohno'), '._ohno included')
+ t.ok(fileExists('._ohnoes'), '._ohnoes included')
+ t.ok(fileExists('foo.orig'), 'foo.orig included')
+ t.ok(fileExists('package-lock.json'), 'package-lock.json included')
+ done()
+ })
+})
+
+test('certain files included unconditionally', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '.npmignore': File(
+ 'package.json',
+ 'README',
+ 'Readme',
+ 'readme.md',
+ 'readme.randomext',
+ 'changelog',
+ 'CHAngelog',
+ 'ChangeLOG.txt',
+ 'history',
+ 'HistorY',
+ 'HistorY.md',
+ 'license',
+ 'licence',
+ 'LICENSE',
+ 'LICENCE'
+ ),
+ 'README': File(''),
+ 'Readme': File(''),
+ 'readme.md': File(''),
+ 'readme.randomext': File(''),
+ 'changelog': File(''),
+ 'CHAngelog': File(''),
+ 'ChangeLOG.txt': File(''),
+ 'history': File(''),
+ 'HistorY': File(''),
+ 'HistorY.md': File(''),
+ 'license': File(''),
+ 'licence': File(''),
+ 'LICENSE': File(''),
+ 'LICENCE': File('')
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('package.json'), 'package.json included')
+ t.ok(fileExists('README'), 'README included')
+ t.ok(fileExists('Readme'), 'Readme included')
+ t.ok(fileExists('readme.md'), 'readme.md included')
+ t.ok(fileExists('readme.randomext'), 'readme.randomext included')
+ t.ok(fileExists('changelog'), 'changelog included')
+ t.ok(fileExists('CHAngelog'), 'CHAngelog included')
+ t.ok(fileExists('ChangeLOG.txt'), 'ChangeLOG.txt included')
+ t.ok(fileExists('license'), 'license included')
+ t.ok(fileExists('licence'), 'licence included')
+ t.ok(fileExists('LICENSE'), 'LICENSE included')
+ t.ok(fileExists('LICENCE'), 'LICENCE included')
+ done()
+ })
+})
+
+test('unconditional inclusion does not capture modules', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ 'node_modules': Dir({
+ 'readme': Dir({ 'file': File('') }),
+ 'README': Dir({ 'file': File('') }),
+ 'licence': Dir({ 'file': File('') }),
+ 'license': Dir({ 'file': File('') }),
+ 'history': Dir({ 'file': File('') }),
+ 'History': Dir({ 'file': File('') }),
+ 'changelog': Dir({ 'file': File('') }),
+ 'ChangeLOG': Dir({ 'file': File('') })
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.notOk(fileExists('node_modules/readme/file'), 'readme module not included')
+ t.notOk(fileExists('node_modules/README/file'), 'README module not included')
+ t.notOk(fileExists('node_modules/licence/file'), 'licence module not included')
+ t.notOk(fileExists('node_modules/license/file'), 'license module not included')
+ t.notOk(fileExists('node_modules/history/file'), 'history module not included')
+ t.notOk(fileExists('node_modules/History/file'), 'History module not included')
+ t.notOk(fileExists('node_modules/changelog/file'), 'changelog module not included')
+ t.notOk(fileExists('node_modules/ChangeLOG/file'), 'ChangeLOG module not included')
+
+ done()
+ })
+})
+
+test('folder-based inclusion works', function (t) {
+ var fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5',
+ files: [
+ 'sub1/sub',
+ 'sub2'
+ ]
+ }),
+ sub1: Dir({
+ sub: Dir({
+ include1: File(''),
+ include2: File('')
+ }),
+ ignored: File('')
+ }),
+ sub2: Dir({
+ include1: File(''),
+ include2: File(''),
+ empty: Dir({})
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('sub1/sub/include1'), 'nested dir included')
+ t.ok(fileExists('sub1/sub/include2'), 'nested dir included')
+ t.notOk(fileExists('sub1/ignored'), 'unspecified file not included')
+
+ t.ok(fileExists('sub2/include1'), 'dir contents included')
+ t.ok(fileExists('sub2/include2'), 'dir contents included')
+ t.notOk(fileExists('sub2/empty'), 'empty dir not included')
+
+ done()
+ })
+})
+
+test('file that starts with @ sign included normally', (t) => {
+ const fixture = new Tacks(
+ Dir({
+ 'package.json': File({
+ name: 'npm-test-files',
+ version: '1.2.5'
+ }),
+ '@sub1': Dir({
+ sub: Dir({
+ include1: File('')
+ })
+ }),
+ sub2: Dir({
+ '@include': File(''),
+ '@sub3': Dir({
+ include1: File('')
+ })
+ })
+ })
+ )
+ withFixture(t, fixture, function (done) {
+ t.ok(fileExists('@sub1/sub/include1'), '@ dir included')
+
+ t.ok(fileExists('sub2/@include'), '@ file included')
+ t.ok(fileExists('sub2/@sub3/include1'), 'nested @ dir included')
+
+ done()
+ })
+})
+
+function fileExists (file) {
+ try {
+ return !!fs.statSync(path.resolve(targetpath, 'package', file))
+ } catch (_) {
+ return false
+ }
+}
+
+function withFixture (t, fixture, tester) {
+ fixture.create(fixturepath)
+ mkdirp.sync(targetpath)
+ common.npm(['pack', fixturepath], {cwd: basepath}, extractAndCheck)
+ function extractAndCheck (err, code) {
+ if (err) throw err
+ t.is(code, 0, 'pack went ok')
+ extractTarball(checkTests)
+ }
+ function checkTests (err) {
+ if (err) throw err
+ tester(removeAndDone)
+ }
+ function removeAndDone (err) {
+ if (err) throw err
+ fixture.remove(fixturepath)
+ rimraf.sync(basepath)
+ t.done()
+ }
+}
+
+function extractTarball (cb) {
+ // Unpack to disk so case-insensitive filesystems are consistent
+ tar.extract({
+ file: basepath + '/npm-test-files-1.2.5.tgz',
+ cwd: targetpath,
+ sync: true
+ })
+
+ cb()
+}