89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @ts-check
 | |
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| function _export(target, all) {
 | |
|     for(var name in all)Object.defineProperty(target, name, {
 | |
|         enumerable: true,
 | |
|         get: all[name]
 | |
|     });
 | |
| }
 | |
| _export(exports, {
 | |
|     indentRecursive: function() {
 | |
|         return indentRecursive;
 | |
|     },
 | |
|     formatNodes: function() {
 | |
|         return formatNodes;
 | |
|     },
 | |
|     readFileWithRetries: function() {
 | |
|         return readFileWithRetries;
 | |
|     },
 | |
|     drainStdin: function() {
 | |
|         return drainStdin;
 | |
|     },
 | |
|     outputFile: function() {
 | |
|         return outputFile;
 | |
|     }
 | |
| });
 | |
| const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
 | |
| const _path = /*#__PURE__*/ _interop_require_default(require("path"));
 | |
| function _interop_require_default(obj) {
 | |
|     return obj && obj.__esModule ? obj : {
 | |
|         default: obj
 | |
|     };
 | |
| }
 | |
| function indentRecursive(node, indent = 0) {
 | |
|     node.each && node.each((child, i)=>{
 | |
|         if (!child.raws.before || !child.raws.before.trim() || child.raws.before.includes("\n")) {
 | |
|             child.raws.before = `\n${node.type !== "rule" && i > 0 ? "\n" : ""}${"  ".repeat(indent)}`;
 | |
|         }
 | |
|         child.raws.after = `\n${"  ".repeat(indent)}`;
 | |
|         indentRecursive(child, indent + 1);
 | |
|     });
 | |
| }
 | |
| function formatNodes(root) {
 | |
|     indentRecursive(root);
 | |
|     if (root.first) {
 | |
|         root.first.raws.before = "";
 | |
|     }
 | |
| }
 | |
| async function readFileWithRetries(path, tries = 5) {
 | |
|     for(let n = 0; n <= tries; n++){
 | |
|         try {
 | |
|             return await _fs.default.promises.readFile(path, "utf8");
 | |
|         } catch (err) {
 | |
|             if (n !== tries) {
 | |
|                 if (err.code === "ENOENT" || err.code === "EBUSY") {
 | |
|                     await new Promise((resolve)=>setTimeout(resolve, 10));
 | |
|                     continue;
 | |
|                 }
 | |
|             }
 | |
|             throw err;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| function drainStdin() {
 | |
|     return new Promise((resolve, reject)=>{
 | |
|         let result = "";
 | |
|         process.stdin.on("data", (chunk)=>{
 | |
|             result += chunk;
 | |
|         });
 | |
|         process.stdin.on("end", ()=>resolve(result));
 | |
|         process.stdin.on("error", (err)=>reject(err));
 | |
|     });
 | |
| }
 | |
| async function outputFile(file, newContents) {
 | |
|     try {
 | |
|         let currentContents = await _fs.default.promises.readFile(file, "utf8");
 | |
|         if (currentContents === newContents) {
 | |
|             return; // Skip writing the file
 | |
|         }
 | |
|     } catch  {}
 | |
|     // Write the file
 | |
|     await _fs.default.promises.mkdir(_path.default.dirname(file), {
 | |
|         recursive: true
 | |
|     });
 | |
|     await _fs.default.promises.writeFile(file, newContents, "utf8");
 | |
| }
 | 
