utils.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. function _export(target, all) {
  6. for(var name in all)Object.defineProperty(target, name, {
  7. enumerable: true,
  8. get: all[name]
  9. });
  10. }
  11. _export(exports, {
  12. indentRecursive: ()=>indentRecursive,
  13. formatNodes: ()=>formatNodes,
  14. readFileWithRetries: ()=>readFileWithRetries,
  15. drainStdin: ()=>drainStdin,
  16. outputFile: ()=>outputFile
  17. });
  18. const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
  19. const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
  20. function _interopRequireDefault(obj) {
  21. return obj && obj.__esModule ? obj : {
  22. default: obj
  23. };
  24. }
  25. function indentRecursive(node, indent = 0) {
  26. node.each && node.each((child, i)=>{
  27. if (!child.raws.before || !child.raws.before.trim() || child.raws.before.includes("\n")) {
  28. child.raws.before = `\n${node.type !== "rule" && i > 0 ? "\n" : ""}${" ".repeat(indent)}`;
  29. }
  30. child.raws.after = `\n${" ".repeat(indent)}`;
  31. indentRecursive(child, indent + 1);
  32. });
  33. }
  34. function formatNodes(root) {
  35. indentRecursive(root);
  36. if (root.first) {
  37. root.first.raws.before = "";
  38. }
  39. }
  40. async function readFileWithRetries(path, tries = 5) {
  41. for(let n = 0; n <= tries; n++){
  42. try {
  43. return await _fs.default.promises.readFile(path, "utf8");
  44. } catch (err) {
  45. if (n !== tries) {
  46. if (err.code === "ENOENT" || err.code === "EBUSY") {
  47. await new Promise((resolve)=>setTimeout(resolve, 10));
  48. continue;
  49. }
  50. }
  51. throw err;
  52. }
  53. }
  54. }
  55. function drainStdin() {
  56. return new Promise((resolve, reject)=>{
  57. let result = "";
  58. process.stdin.on("data", (chunk)=>{
  59. result += chunk;
  60. });
  61. process.stdin.on("end", ()=>resolve(result));
  62. process.stdin.on("error", (err)=>reject(err));
  63. });
  64. }
  65. async function outputFile(file, newContents) {
  66. try {
  67. let currentContents = await _fs.default.promises.readFile(file, "utf8");
  68. if (currentContents === newContents) {
  69. return; // Skip writing the file
  70. }
  71. } catch {}
  72. // Write the file
  73. await _fs.default.promises.mkdir(_path.default.dirname(file), {
  74. recursive: true
  75. });
  76. await _fs.default.promises.writeFile(file, newContents, "utf8");
  77. }