import os from 'os';
import path from 'path';
import { optimize, loadConfig } from './svgo-node.js';
/**
* @typedef {import('../lib/types.js').Plugin} Plugin
*/
const describeLF = os.EOL === '\r\n' ? describe.skip : describe;
const describeCRLF = os.EOL === '\r\n' ? describe : describe.skip;
describeLF('with LF line-endings', () => {
test('should work', () => {
const svg = `
`;
const { data } = optimize(svg);
expect(data).toBe(
'',
);
});
test('should respect config', () => {
const svg = `
`;
const { data } = optimize(svg, {
js2svg: { pretty: true, indent: 2 },
});
expect(data).toBe(
'\n',
);
});
test('should respect line-ending config', () => {
const svg = `
`;
const { data } = optimize(svg, {
js2svg: { eol: 'crlf', pretty: true, indent: 2 },
});
expect(data).toBe(
'\r\n',
);
});
});
describeCRLF('with CRLF line-endings', () => {
test('should work', () => {
const svg = `
`;
const { data } = optimize(svg);
expect(data).toBe(
'',
);
});
test('should respect config', () => {
const svg = `
`;
const { data } = optimize(svg, {
js2svg: { pretty: true, indent: 2 },
});
expect(data).toBe(
'\r\n',
);
});
test('should respect line-ending config', () => {
const svg = `
`;
const { data } = optimize(svg, {
js2svg: { eol: 'lf', pretty: true, indent: 2 },
});
expect(data).toBe(
'\n',
);
});
});
describe('loadConfig', () => {
const cwd = process.cwd();
const fixtures = path.join(cwd, './test/fixtures/config-loader');
test('loads by absolute path', async () => {
expect(
await loadConfig(path.join(fixtures, 'one/two/config.js')),
).toStrictEqual({
plugins: [],
});
});
test('loads by relative path to cwd', async () => {
const config = await loadConfig('one/two/config.js', fixtures);
expect(config).toStrictEqual({ plugins: [] });
});
test('searches in cwd and up', async () => {
expect(
await loadConfig(null, path.join(fixtures, 'one/two')),
).toStrictEqual({
plugins: [],
});
expect(
await loadConfig(null, path.join(cwd, './test/fixtures/missing')),
).toBeNull();
expect(await loadConfig(null, path.join(fixtures, 'mjs'))).toStrictEqual({
plugins: ['mjs'],
});
expect(await loadConfig(null, path.join(fixtures, 'cjs'))).toStrictEqual({
plugins: ['cjs'],
});
});
test('fails when specified config does not exist', async () => {
await expect(loadConfig('{}')).rejects.toThrow(/Cannot find module/);
});
test('fails when exported config not an object', async () => {
await expect(
loadConfig(path.join(fixtures, 'invalid-null.js')),
).rejects.toThrow(/Invalid config file/);
await expect(
loadConfig(path.join(fixtures, 'invalid-array.js')),
).rejects.toThrow(/Invalid config file/);
await expect(
loadConfig(path.join(fixtures, 'invalid-string.js')),
).rejects.toThrow(/Invalid config file/);
});
test('handles runtime errors properly', async () => {
await expect(
loadConfig(path.join(fixtures, 'invalid-runtime.js')),
).rejects.toThrow(/plugins is not defined/);
await expect(
loadConfig(path.join(fixtures, 'invalid-runtime.mjs')),
).rejects.toThrow(/plugins is not defined/);
});
test('handles MODULE_NOT_FOUND properly', async () => {
await expect(
loadConfig(path.join(fixtures, 'module-not-found.js')),
).rejects.toThrow(/Cannot find module 'unknown-module'/);
});
});