mirror of
https://github.com/svg/svgo.git
synced 2025-07-03 05:42:32 +03:00
Ref https://github.com/svg/svgo/issues/1596 At the moment dynamic import may randomly fail with segfault. To workaround this for some users .cjs extension is loaded exclusively with require.
107 lines
2.7 KiB
JavaScript
107 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
const os = require('os');
|
|
const fs = require('fs');
|
|
const { pathToFileURL } = require('url');
|
|
const path = require('path');
|
|
const {
|
|
extendDefaultPlugins,
|
|
optimize: optimizeAgnostic,
|
|
createContentItem,
|
|
} = require('./svgo.js');
|
|
|
|
exports.extendDefaultPlugins = extendDefaultPlugins;
|
|
exports.createContentItem = createContentItem;
|
|
|
|
const importConfig = async (configFile) => {
|
|
let config;
|
|
// at the moment dynamic import may randomly fail with segfault
|
|
// to workaround this for some users .cjs extension is loaded
|
|
// exclusively with require
|
|
if (configFile.endsWith('.cjs')) {
|
|
config = require(configFile);
|
|
} else {
|
|
try {
|
|
// dynamic import expects file url instead of path and may fail
|
|
// when windows path is provided
|
|
const { default: imported } = await import(pathToFileURL(configFile));
|
|
config = imported;
|
|
} catch (importError) {
|
|
// TODO remove require in v3
|
|
try {
|
|
config = require(configFile);
|
|
} catch (requireError) {
|
|
// throw original error if es module is detected
|
|
if (requireError.code === 'ERR_REQUIRE_ESM') {
|
|
throw importError;
|
|
} else {
|
|
throw requireError;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (config == null || typeof config !== 'object' || Array.isArray(config)) {
|
|
throw Error(`Invalid config file "${configFile}"`);
|
|
}
|
|
return config;
|
|
};
|
|
|
|
const isFile = async (file) => {
|
|
try {
|
|
const stats = await fs.promises.stat(file);
|
|
return stats.isFile();
|
|
} catch {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const loadConfig = async (configFile, cwd = process.cwd()) => {
|
|
if (configFile != null) {
|
|
if (path.isAbsolute(configFile)) {
|
|
return await importConfig(configFile);
|
|
} else {
|
|
return await importConfig(path.join(cwd, configFile));
|
|
}
|
|
}
|
|
let dir = cwd;
|
|
// eslint-disable-next-line no-constant-condition
|
|
while (true) {
|
|
const js = path.join(dir, 'svgo.config.js');
|
|
if (await isFile(js)) {
|
|
return await importConfig(js);
|
|
}
|
|
const mjs = path.join(dir, 'svgo.config.mjs');
|
|
if (await isFile(mjs)) {
|
|
return await importConfig(mjs);
|
|
}
|
|
const cjs = path.join(dir, 'svgo.config.cjs');
|
|
if (await isFile(cjs)) {
|
|
return await importConfig(cjs);
|
|
}
|
|
const parent = path.dirname(dir);
|
|
if (dir === parent) {
|
|
return null;
|
|
}
|
|
dir = parent;
|
|
}
|
|
};
|
|
exports.loadConfig = loadConfig;
|
|
|
|
const optimize = (input, config) => {
|
|
if (config == null) {
|
|
config = {};
|
|
}
|
|
if (typeof config !== 'object') {
|
|
throw Error('Config should be an object');
|
|
}
|
|
return optimizeAgnostic(input, {
|
|
...config,
|
|
js2svg: {
|
|
// platform specific default for end of line
|
|
eol: os.EOL === '\r\n' ? 'crlf' : 'lf',
|
|
...config.js2svg,
|
|
},
|
|
});
|
|
};
|
|
exports.optimize = optimize;
|