require-glob
Version:
Require multiple modules using glob patterns. Supports exclusions.
271 lines (230 loc) • 5.46 kB
JavaScript
'use strict';
const path = require('path');
const test = require('./utils/test.js');
const requireGlob = require('../src/require-glob');
test('should require nothing', async (t) => {
const bogusA = await requireGlob('./fixtures/bogu*.js');
const bogusB = requireGlob.sync('./fixtures/bogu*.js');
t.deepEqual(bogusA, {});
t.deepEqual(bogusB, {});
});
test('should require a module', async (t) => {
const oneA = await requireGlob('./fixtures/rand*.js');
const oneB = requireGlob.sync('./fixtures/rand*.js');
t.equal(typeof oneA.random, 'number');
t.equal(typeof oneB.random, 'number');
});
test('should require multiple modules', async (t) => {
const shallowA = await requireGlob('./fixtures/shallow/**/*.js');
const shallowB = requireGlob.sync('./fixtures/shallow/**/*.js');
const expected = {
a: 'a',
b: 'b',
c: 'c',
d: {
e: 'e',
},
};
t.deepEqual(shallowA, expected);
t.deepEqual(shallowB, expected);
});
test('should require nested modules', async (t) => {
const deepA = await requireGlob('./fixtures/deep/**/*.js');
const deepB = requireGlob.sync('./fixtures/deep/**/*.js');
const expected = {
a: {
a1: 'a1',
a2: 'a2',
},
b: {
b_bB: {
// eslint-disable-line camelcase
_bB1: '_b.b1',
bB2: 'b.b2',
},
b1: 'b1',
b2: 'b2',
},
};
t.deepEqual(deepA, expected);
t.deepEqual(deepB, expected);
});
test('should require multiple patterns', async (t) => {
const deep = await requireGlob([
'./fixtures/{deep,shallow}/**/*.js',
'!./**/a*',
]);
const expected = {
deep: {
b: {
b_bB: {
// eslint-disable-line camelcase
_bB1: '_b.b1',
bB2: 'b.b2',
},
b1: 'b1',
b2: 'b2',
},
},
shallow: {
b: 'b',
c: 'c',
d: {
e: 'e',
},
},
};
t.deepEqual(deep, expected);
});
test('should use custom cwd', async (t) => {
const deep = await requireGlob('./test/**/deep/**/*.js', {
cwd: path.dirname(__dirname),
});
const expected = {
fixtures: {
deep: {
a: {
a1: 'a1',
a2: 'a2',
},
b: {
b_bB: {
// eslint-disable-line camelcase
_bB1: '_b.b1',
bB2: 'b.b2',
},
b1: 'b1',
b2: 'b2',
},
},
},
};
t.deepEqual(deep, expected);
});
test('should use custom base', async (t) => {
const deep = await requireGlob('./fixtures/deep/**/*.js', {
base: path.join(__dirname, 'fixtures'),
});
const expected = {
deep: {
a: {
a1: 'a1',
a2: 'a2',
},
b: {
b_bB: {
// eslint-disable-line camelcase
_bB1: '_b.b1',
bB2: 'b.b2',
},
b1: 'b1',
b2: 'b2',
},
},
};
t.deepEqual(deep, expected);
});
test('should bust cache', async (t) => {
const a = await requireGlob('./fixtures/rand*.js');
const b = await requireGlob('./fixtures/rand*.js');
const c = await requireGlob('./fixtures/rand*.js', { bustCache: true });
const d = await requireGlob('./fixtures/rand*.js', { bustCache: true });
const e = await requireGlob('./fixtures/rand*.js');
t.equal(a.random, b.random);
t.notEqual(b.random, c.random);
t.notEqual(c.random, d.random);
t.equal(d.random, e.random);
});
test('should use custom mapper', async (t) => {
const deep = requireGlob.sync('./fixtures/deep/**/*.js', {
mapper: function (options, filePath) {
const base = path.basename(filePath);
return {
path: base.toUpperCase(),
exports: base,
};
},
});
const expected = {
A1: 'a1.js',
A2: 'a2.js',
B1: 'b1.js',
B2: 'b2.js',
BB2: 'b.b2.js',
_BB1: '_b.b1.js',
};
t.deepEqual(deep, expected);
});
test('should use custom reducer', async (t) => {
const deep = await requireGlob('./fixtures/deep/**/*.js', {
reducer: function (options, tree, file) {
const base = path.basename(file.path);
tree[base.toUpperCase()] = file.exports;
return tree;
},
});
const expected = {
'A1.JS': 'a1',
'A2.JS': 'a2',
'B1.JS': 'b1',
'B2.JS': 'b2',
'B.B2.JS': 'b.b2',
'_B.B1.JS': '_b.b1',
};
t.deepEqual(deep, expected);
});
test('should use custom keygen', async (t) => {
const deep = await requireGlob('./fixtures/deep/**/*.js', {
keygen: function (options, file) {
return file.path
.replace(file.base + path.sep, '')
.replace(/\\/g, '/');
},
});
const expected = {
'a/a1.js': 'a1',
'a/a2.js': 'a2',
'b/b_b-b/_b.b1.js': '_b.b1',
'b/b_b-b/b.b2.js': 'b.b2',
'b/b1.js': 'b1',
'b/b2.js': 'b2',
};
t.deepEqual(deep, expected);
});
test('should use initial value', async (t) => {
const result = await requireGlob([
'./fixtures/{deep,shallow}/**/*.js',
'!./**/a*',
], {
initialValue: [],
reducer: (options, result, fileObject) => {
result.push(fileObject.exports);
return result;
}
});
const expected = ['_b.b1','b.b2', 'b1', 'b2', 'b', 'c', { e: 'e' }];
t.deepEqual(result.sort(), expected.sort());
});
test('should return initial value', async (t) => {
const result = await requireGlob('./fixtures/bogu*.js', { initialValue: [] });
const expected = [];
t.deepEqual(result, expected);
});
test('should overwrite initial value', async (t) => {
const oneA = await requireGlob('./fixtures/rand*.js', {
initialValue: {
fixed: 'a',
random: 'b',
}
});
const oneB = requireGlob.sync('./fixtures/rand*.js', {
initialValue: {
fixed: 'a',
random: 'b',
}
});
t.equal(typeof oneA.fixed, 'string')
t.equal(typeof oneA.random, 'number');
t.equal(typeof oneB.fixed, 'string')
t.equal(typeof oneB.random, 'number');
})