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