UNPKG

svg-spritemap-webpack-plugin

Version:

Generates symbol-based SVG spritemap from all .svg files in a directory

127 lines (126 loc) 5 kB
import assert from 'node:assert'; import { describe, it } from 'node:test'; // Helpers import { getStylesType } from './styles.js'; import { addVariablesNamespace, findDefaultVariableValueMismatches, findVariables, hasVariables, stripVariables } from './variables.js'; // Types import { StylesType } from '../types.js'; describe('getStylesType()', () => { [{ filename: '', expected: undefined }, { filename: 'sprites.css', expected: StylesType.Asset }, { filename: '/path/to/sprites.css', expected: StylesType.Directory }, { filename: '~/path/to/sprites.css', expected: StylesType.Directory }, { filename: '~sprites.css', expected: StylesType.Module }].forEach(({ filename, expected }) => { it(`returns ${expected} for filename ${filename}`, () => { assert.strictEqual(getStylesType(' ', filename), expected); }); }); }); describe('hasVariables()', () => { [{ content: '<svg><path var:fill="red"/></svg>', expected: true }, { content: '<svg><path fill="red"/></svg>', expected: false }, { content: ['<svg/>', '<path var:fill="red"/>'], expected: true }, { content: undefined, expected: false }].forEach(({ content, expected }) => { it(`returns ${expected} when content equals ${JSON.stringify(content)}`, () => { assert.strictEqual(hasVariables(content), expected); }); }); }); describe('findVariables()', () => { [{ content: '<path var:fill="red"/>', expected: [{ name: 'fill', attribute: 'fill', value: 'red' }] }, { content: '<path var:color.fill="red"/>', expected: [{ name: 'color', attribute: 'fill', value: 'red' }] }, { content: '<svg/>', expected: [] }].forEach(({ content, expected }) => { it(`returns ${JSON.stringify(expected)} when content equals ${JSON.stringify(content)}`, () => { assert.deepStrictEqual(findVariables(content), expected); }); }); }); describe('addVariablesNamespace()', () => { it('adds xmlns:var when missing', () => { const result = addVariablesNamespace('<svg viewBox="0 0 1 1"><path var:fill="red"/></svg>'); assert.match(result, /<svg xmlns:var="[^"]+" viewBox/); }); it('leaves content unchanged when xmlns:var is already present', () => { const content = '<svg xmlns:var="https://example.com/" viewBox="0 0 1 1"/>'; assert.strictEqual(addVariablesNamespace(content), content); }); it('does not duplicate the namespace across successive calls', () => { var _a; const long = '<svg xmlns:var="https://github.com/cascornelissen/svg-spritemap-webpack-plugin/" viewBox="0 0 24 24"><path var:fill="red" d="M19,19H5V5H19M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 19,3"/></svg>'; const short = '<svg xmlns:var="x"/>'; assert.strictEqual(addVariablesNamespace(long), long); assert.strictEqual(addVariablesNamespace(short), short); assert.strictEqual(((_a = addVariablesNamespace(short).match(/xmlns:var=/g)) !== null && _a !== void 0 ? _a : []).length, 1); }); }); describe('findDefaultVariableValueMismatches()', () => { [{ content: '<svg/>', expected: [] }, { content: '<svg><path var:fill="red"/><circle var:fill="red"/></svg>', expected: [] }, { content: '<svg><path var:fill="red"/><circle var:fill="blue"/></svg>', expected: [{ name: 'fill', values: ['red', 'blue'] }] }, { content: '<svg><path var:fill="red"/><circle var:fill="blue"/><rect var:stroke="x"/></svg>', expected: [{ name: 'fill', values: ['red', 'blue'] }] }].forEach(({ content, expected }) => { it(`returns ${JSON.stringify(expected)} when content equals ${JSON.stringify(content)}`, () => { assert.deepStrictEqual(findDefaultVariableValueMismatches(content), expected); }); }); }); describe('stripVariables()', () => { it('converts var:foo="x" to foo="x"', () => { const result = stripVariables('<path var:fill="red"/>'); assert.match(result, /fill="red"/); assert.doesNotMatch(result, /var:fill/); }); it('removes the xmlns:var namespace declaration', () => { const result = stripVariables('<svg xmlns:var="https://example.com/" viewBox="0 0 1 1"/>'); assert.doesNotMatch(result, /xmlns:var=/); }); });