123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- '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;
|