utils.js 2.4 KB

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