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