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