Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: expose builtin plugins #2027

Merged
merged 1 commit into from
Jun 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/svgo-node.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { VERSION, Config, optimize } from './svgo';
import { VERSION, Config, optimize, builtinPlugins } from './svgo';

export { VERSION, optimize };
export { VERSION, optimize, builtinPlugins };

/**
* If you write a tool on top of svgo you might need a way to load svgo config.
Expand Down
9 changes: 7 additions & 2 deletions lib/svgo-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import os from 'os';
import fs from 'fs';
import { pathToFileURL } from 'url';
import path from 'path';
import { VERSION, optimize as optimizeAgnostic } from './svgo.js';
import {
VERSION,
optimize as optimizeAgnostic,
builtinPlugins,
} from './svgo.js';

const importConfig = async (configFile) => {
// dynamic import expects file url instead of path and may fail
Expand All @@ -25,7 +29,7 @@ const isFile = async (file) => {
}
};

export { VERSION };
export { VERSION, builtinPlugins };

export const loadConfig = async (configFile, cwd = process.cwd()) => {
if (configFile != null) {
Expand Down Expand Up @@ -77,6 +81,7 @@ export const optimize = (input, config) => {

export default {
VERSION,
builtinPlugins,
loadConfig,
optimize,
};
26 changes: 26 additions & 0 deletions lib/svgo.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { StringifyOptions, DataUri, Plugin } from './types.js';
import type {
BuiltinsWithOptionalParams,
BuiltinsWithRequiredParams,
PluginsParams,
} from '../plugins/plugins-types.js';

type CustomPlugin<T = any> = {
Expand All @@ -26,6 +27,31 @@ type PluginConfig =
}[keyof BuiltinsWithRequiredParams]
| CustomPlugin;

type BuiltinPlugin<Name, Params> = {
/** Name of the plugin, also known as the plugin ID. */
name: Name;
description?: string;
fn: Plugin<Params>;
};

/**
* Plugins that are bundled with SVGO. This includes plugin presets, and plugins
* that are not enabled by default.
*/
export declare const builtinPlugins: Array<
{
[Name in keyof PluginsParams]: BuiltinPlugin<Name, PluginsParams[Name]> & {
/** If the plugin is itself a preset that invokes other plugins. */
isPreset: true | undefined;
/**
* If the plugin is a preset that invokes other plugins, this returns an
* array of the plugins in the preset in the order that they are invoked.
*/
plugins?: BuiltinPlugin<unknown, unknown>[];
};
}[keyof PluginsParams]
>;

export type Config = {
/** Can be used by plugins, for example prefixids */
path?: string;
Expand Down
3 changes: 2 additions & 1 deletion lib/svgo.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ const resolvePluginConfig = (plugin) => {
return null;
};

export { VERSION };
export { VERSION, builtin as builtinPlugins };

export const optimize = (input, config) => {
if (config == null) {
Expand Down Expand Up @@ -104,4 +104,5 @@ export const optimize = (input, config) => {
export default {
VERSION,
optimize,
builtinPlugins: builtin,
};
2 changes: 2 additions & 0 deletions lib/svgo/plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ export const invokePlugins = (
export const createPreset = ({ name, plugins }) => {
return {
name,
isPreset: true,
plugins,
fn: (ast, params, info) => {
const { floatPrecision, overrides } = params;
const globalOverrides = {};
Expand Down
3 changes: 2 additions & 1 deletion plugins/plugins-types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,8 @@ export type BuiltinsWithRequiredParams = {
};
};

type PluginsParams = BuiltinsWithOptionalParams & BuiltinsWithRequiredParams;
export type PluginsParams = BuiltinsWithOptionalParams &
BuiltinsWithRequiredParams;

export type Plugin<Name extends keyof PluginsParams> = PluginDef<
PluginsParams[Name]
Expand Down
5 changes: 4 additions & 1 deletion test/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,13 @@ const expected = `<svg xmlns="http://www.w3.org/2000/svg">

const content = `
<script type="module">
import { VERSION, optimize } from '/svgo.browser.js';
import { VERSION, optimize, builtinPlugins } from '/svgo.browser.js';
const result = optimize(${JSON.stringify(fixture)}, {
plugins : [],
js2svg : { pretty: true, indent: 2 }
});
globalThis.version = VERSION;
globalThis.builtinPlugins = builtinPlugins;
globalThis.result = result.data;
</script>
`;
Expand All @@ -60,10 +61,12 @@ const runTest = async () => {

const actual = await page.evaluate(() => ({
version: globalThis.version,
builtinPlugins: globalThis.builtinPlugins,
result: globalThis.result,
}));

assert.strictEqual(actual.version, version);
assert.notEqual(actual.builtinPlugins, undefined);
assert.equal(actual.result, expected);

await browser.close();
Expand Down
8 changes: 7 additions & 1 deletion test/svgo.cjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
const assert = require('assert');
const { VERSION, optimize, loadConfig } = require('../dist/svgo-node.cjs');
const {
VERSION,
optimize,
builtinPlugins,
loadConfig,
} = require('../dist/svgo-node.cjs');
const PKG = require('../package.json');

const fixture = `<svg xmlns="http://www.w3.org/2000/svg">
Expand Down Expand Up @@ -30,6 +35,7 @@ const runTest = () => {

assert.strictEqual(VERSION, PKG.version);
assert.equal(actual, expected);
assert.notEqual(builtinPlugins, undefined);
assert.notEqual(loadConfig, undefined);
};

Expand Down
8 changes: 7 additions & 1 deletion test/svgo/_index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import fs from 'node:fs/promises';
import path from 'path';
import { EOL } from 'os';
import { fileURLToPath } from 'url';
import { VERSION, optimize } from '../../lib/svgo.js';
import { VERSION, optimize, builtinPlugins } from '../../lib/svgo.js';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

Expand All @@ -25,6 +25,12 @@ describe('svgo', () => {
expect(VERSION).toStrictEqual(version);
});

it('should have all exported members', async () => {
expect(VERSION).toBeDefined();
expect(optimize).toBeDefined();
expect(builtinPlugins).toBeDefined();
});

it('should create indent with 2 spaces', async () => {
const [original, expected] = await parseFixture('test.svg.txt');
const result = optimize(original, {
Expand Down