@ima/cli
Version:
IMA.js CLI tool to build, develop and work with IMA.js applications.
570 lines (569 loc) • 20.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const findRules_1 = require("../findRules");
describe('findLoader', () => {
describe('finding loaders in rule.use arrays', () => {
it('should find string loader in rule.use', () => {
const rule = {
test: /\.js$/,
use: ['babel-loader', 'eslint-loader'],
};
const result = (0, findRules_1.findLoader)(rule, 'babel-loader');
expect(result).toEqual(['babel-loader']);
});
it('should find object loader with options in rule.use', () => {
const rule = {
test: /\.css$/,
use: [
{
loader: 'css-loader',
options: {
modules: true,
},
},
'style-loader',
],
};
const result = (0, findRules_1.findLoader)(rule, 'css-loader');
expect(result).toEqual([
{
loader: 'css-loader',
options: {
modules: true,
},
},
]);
});
it('should find multiple matching loaders in rule.use', () => {
const rule = {
test: /\.ts$/,
use: ['ts-loader', 'babel-loader', 'ts-loader'],
};
const result = (0, findRules_1.findLoader)(rule, 'ts-loader');
expect(result).toEqual(['ts-loader', 'ts-loader']);
});
it('should return null when loader not found in rule.use', () => {
const rule = {
test: /\.js$/,
use: ['babel-loader', 'eslint-loader'],
};
const result = (0, findRules_1.findLoader)(rule, 'css-loader');
expect(result).toBeNull();
});
});
describe('finding loaders in rule.loader', () => {
it('should find loader in rule.loader property', () => {
const rule = {
test: /\.js$/,
loader: 'babel-loader',
};
const result = (0, findRules_1.findLoader)(rule, 'babel-loader');
expect(result).toEqual(['babel-loader']);
});
it('should return null when loader not found in rule.loader', () => {
const rule = {
test: /\.js$/,
loader: 'babel-loader',
};
const result = (0, findRules_1.findLoader)(rule, 'css-loader');
expect(result).toBeNull();
});
});
describe('finding loaders in rule.oneOf', () => {
it('should find loader in oneOf rules', () => {
const rule = {
oneOf: [
{
test: /\.css$/,
use: [
{
loader: 'css-loader',
options: { modules: true },
},
],
},
{
test: /\.scss$/,
use: ['sass-loader'],
},
],
};
const result = (0, findRules_1.findLoader)(rule, 'css-loader');
expect(result).toEqual([
{
loader: 'css-loader',
options: { modules: true },
},
]);
});
it('should find loaders in nested oneOf rules', () => {
const rule = {
oneOf: [
{
test: /\.css$/,
use: ['css-loader'],
},
{
oneOf: [
{
test: /\.scss$/,
use: [
{
loader: 'sass-loader',
options: { sourceMap: true },
},
],
},
],
},
],
};
const result = (0, findRules_1.findLoader)(rule, 'sass-loader');
expect(result).toEqual([
{
loader: 'sass-loader',
options: { sourceMap: true },
},
]);
});
it('should find multiple loaders across oneOf rules', () => {
const rule = {
oneOf: [
{
test: /\.css$/,
use: ['css-loader'],
},
{
test: /\.scss$/,
use: [
{
loader: 'css-loader',
options: { modules: true },
},
],
},
],
};
const result = (0, findRules_1.findLoader)(rule, 'css-loader');
expect(result).toEqual([
'css-loader',
{
loader: 'css-loader',
options: { modules: true },
},
]);
});
});
describe('finding loaders in arrays of rules', () => {
it('should find loader in array of rules', () => {
const rules = [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.css$/,
use: ['css-loader'],
},
];
const result = (0, findRules_1.findLoader)(rules, 'css-loader');
expect(result).toEqual(['css-loader']);
});
it('should find loaders from multiple rules in array', () => {
const rules = [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.ts$/,
use: [
{
loader: 'babel-loader',
options: { presets: ['@babel/preset-typescript'] },
},
],
},
];
const result = (0, findRules_1.findLoader)(rules, 'babel-loader');
expect(result).toEqual([
'babel-loader',
{
loader: 'babel-loader',
options: { presets: ['@babel/preset-typescript'] },
},
]);
});
it('should return null when loader not found in any rule', () => {
const rules = [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.css$/,
use: ['css-loader'],
},
];
const result = (0, findRules_1.findLoader)(rules, 'sass-loader');
expect(result).toBeNull();
});
});
describe('edge cases', () => {
it('should handle rule without use, loader, or oneOf', () => {
const rule = {
test: /\.js$/,
};
const result = (0, findRules_1.findLoader)(rule, 'babel-loader');
expect(result).toBeNull();
});
it('should handle empty use array', () => {
const rule = {
test: /\.js$/,
use: [],
};
const result = (0, findRules_1.findLoader)(rule, 'babel-loader');
expect(result).toBeNull();
});
it('should handle empty oneOf array', () => {
const rule = {
oneOf: [],
};
const result = (0, findRules_1.findLoader)(rule, 'babel-loader');
expect(result).toBeNull();
});
it('should handle empty rule array', () => {
const rules = [];
const result = (0, findRules_1.findLoader)(rules, 'babel-loader');
expect(result).toBeNull();
});
it('should match loader names partially', () => {
const rule = {
test: /\.js$/,
use: ['babel-loader'],
};
const result = (0, findRules_1.findLoader)(rule, 'babel');
expect(result).toEqual(['babel-loader']);
});
});
});
describe('findRules', () => {
describe('finding rules by test string', () => {
it('should find rule matching test regex', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.css$/,
use: ['css-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toHaveLength(1);
expect(result[0].test).toEqual(/\.js$/);
});
it('should find rule matching test string', () => {
const config = {
module: {
rules: [
{
test: '.js',
use: ['babel-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toHaveLength(1);
expect(result[0].test).toBe('.js');
});
it('should find rule matching test function', () => {
const testFn = (filename) => filename.endsWith('.ts');
const config = {
module: {
rules: [
{
test: testFn,
use: ['ts-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, 'file.ts', undefined);
expect(result).toHaveLength(1);
});
it('should find multiple matching rules', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.js$/,
use: ['eslint-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toHaveLength(2);
});
it('should not find rules that do not match', () => {
const config = {
module: {
rules: [
{
test: /\.css$/,
use: ['css-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toHaveLength(0);
});
});
describe('finding rules with loader parameter', () => {
it('should find loader objects matching test and loader', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: { presets: ['@babel/preset-env'] },
},
],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
loader: 'babel-loader',
options: { presets: ['@babel/preset-env'] },
});
});
it('should find string loader matching test and loader', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toHaveLength(1);
expect(result[0]).toBe('babel-loader');
});
it('should find loaders from multiple matching rules', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: { sourceMap: true },
},
],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toHaveLength(2);
expect(result[0]).toBe('babel-loader');
expect(result[1]).toEqual({
loader: 'babel-loader',
options: { sourceMap: true },
});
});
it('should return empty array when loader not found', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'css-loader');
expect(result).toEqual([]);
});
it('should return empty array when no rules match test', () => {
const config = {
module: {
rules: [
{
test: /\.css$/,
use: ['css-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toEqual([]);
});
});
describe('finding rules in oneOf', () => {
it('should find rules in oneOf', () => {
const config = {
module: {
rules: [
{
oneOf: [
{
test: /\.css$/,
use: ['css-loader'],
},
{
test: /\.scss$/,
use: ['sass-loader'],
},
],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.css', undefined);
expect(result).toHaveLength(1);
expect(result[0].test).toEqual(/\.css$/);
});
it('should find loader in oneOf rules', () => {
const config = {
module: {
rules: [
{
oneOf: [
{
test: /\.css$/,
use: [
{
loader: 'css-loader',
options: { modules: true },
},
],
},
],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.css', 'css-loader');
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
loader: 'css-loader',
options: { modules: true },
});
});
it('should find nested oneOf rules', () => {
const config = {
module: {
rules: [
{
oneOf: [
{
test: /\.css$/,
use: ['css-loader'],
},
{
oneOf: [
{
test: /\.scss$/,
use: [
{
loader: 'sass-loader',
options: { sourceMap: true },
},
],
},
],
},
],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.scss', 'sass-loader');
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
loader: 'sass-loader',
options: { sourceMap: true },
});
});
});
describe('edge cases', () => {
it('should return empty array when config has no module', () => {
const config = {};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toEqual([]);
});
it('should return empty array when config has no rules', () => {
const config = {
module: {},
};
const result = (0, findRules_1.findRules)(config, '.js', undefined);
expect(result).toEqual([]);
});
it('should handle rules array', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.css$/,
use: ['css-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toHaveLength(1);
expect(result[0]).toBe('babel-loader');
});
it('should remove duplicate loaders', () => {
const config = {
module: {
rules: [
{
test: /\.js$/,
use: ['babel-loader'],
},
{
test: /\.js$/,
use: ['babel-loader'],
},
],
},
};
const result = (0, findRules_1.findRules)(config, '.js', 'babel-loader');
expect(result).toHaveLength(1);
expect(result[0]).toBe('babel-loader');
});
});
});