misc.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { dirname } from 'node:path';
  2. import fs from 'node:fs';
  3. import fsp from 'node:fs/promises';
  4. export function fastStringCompare(a: string, b: string) {
  5. const lenA = a.length;
  6. const lenB = b.length;
  7. const minLen = lenA < lenB ? lenA : lenB;
  8. for (let i = 0; i < minLen; ++i) {
  9. const ca = a.charCodeAt(i);
  10. const cb = b.charCodeAt(i);
  11. if (ca > cb) return 1;
  12. if (ca < cb) return -1;
  13. }
  14. if (lenA === lenB) {
  15. return 0;
  16. }
  17. return lenA > lenB ? 1 : -1;
  18. };
  19. interface Write {
  20. (
  21. destination: string,
  22. input: NodeJS.TypedArray | string,
  23. ): Promise<unknown>
  24. }
  25. export function mkdirp(dir: string) {
  26. if (fs.existsSync(dir)) {
  27. return;
  28. }
  29. return fsp.mkdir(dir, { recursive: true });
  30. }
  31. export const writeFile: Write = async (destination: string, input, dir = dirname(destination)) => {
  32. const p = mkdirp(dir);
  33. if (p) {
  34. await p;
  35. }
  36. return fsp.writeFile(destination, input, { encoding: 'utf-8' });
  37. };
  38. export const removeFiles = async (files: string[]) => Promise.all(files.map((file) => fsp.rm(file, { force: true })));
  39. export function domainWildCardToRegex(domain: string) {
  40. let result = '^';
  41. for (let i = 0, len = domain.length; i < len; i++) {
  42. switch (domain[i]) {
  43. case '.':
  44. result += String.raw`\.`;
  45. break;
  46. case '*':
  47. result += '[a-zA-Z0-9-_.]*?';
  48. break;
  49. case '?':
  50. result += '[a-zA-Z0-9-_.]';
  51. break;
  52. default:
  53. result += domain[i];
  54. }
  55. }
  56. result += '$';
  57. return result;
  58. }
  59. export function withBannerArray(title: string, description: string[] | readonly string[], date: Date, content: string[]) {
  60. return [
  61. '#########################################',
  62. `# ${title}`,
  63. `# Last Updated: ${date.toISOString()}`,
  64. `# Size: ${content.length}`,
  65. ...description.map(line => (line ? `# ${line}` : '#')),
  66. '#########################################',
  67. ...content,
  68. '################## EOF ##################'
  69. ];
  70. };