@sapphire-sh/utils 1.82.0 → 1.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/lib/cjs/date.d.ts +1 -0
  2. package/lib/cjs/date.d.ts.map +1 -1
  3. package/lib/cjs/date.js +3 -1
  4. package/lib/cjs/date.js.map +1 -1
  5. package/lib/cjs/download.d.ts +1 -1
  6. package/lib/cjs/download.d.ts.map +1 -1
  7. package/lib/cjs/download.js +25 -2
  8. package/lib/cjs/download.js.map +1 -1
  9. package/lib/cjs/env.d.ts +3 -0
  10. package/lib/cjs/env.d.ts.map +1 -0
  11. package/lib/cjs/env.js +25 -0
  12. package/lib/cjs/env.js.map +1 -0
  13. package/lib/cjs/eslint.d.ts.map +1 -1
  14. package/lib/cjs/eslint.js +14 -2
  15. package/lib/cjs/eslint.js.map +1 -1
  16. package/lib/cjs/eslintNext.d.ts +3 -0
  17. package/lib/cjs/eslintNext.d.ts.map +1 -0
  18. package/lib/cjs/eslintNext.js +11 -0
  19. package/lib/cjs/eslintNext.js.map +1 -0
  20. package/lib/cjs/eslintRules.d.ts +1 -0
  21. package/lib/cjs/eslintRules.d.ts.map +1 -1
  22. package/lib/cjs/eslintRules.js +33 -1
  23. package/lib/cjs/eslintRules.js.map +1 -1
  24. package/lib/cjs/format.d.ts +2 -0
  25. package/lib/cjs/format.d.ts.map +1 -0
  26. package/lib/cjs/format.js +19 -0
  27. package/lib/cjs/format.js.map +1 -0
  28. package/lib/cjs/fs.d.ts +3 -0
  29. package/lib/cjs/fs.d.ts.map +1 -1
  30. package/lib/cjs/fs.js +22 -6
  31. package/lib/cjs/fs.js.map +1 -1
  32. package/lib/cjs/http.d.ts +3 -1
  33. package/lib/cjs/http.d.ts.map +1 -1
  34. package/lib/cjs/http.js +27 -16
  35. package/lib/cjs/http.js.map +1 -1
  36. package/lib/cjs/index.d.ts +15 -3
  37. package/lib/cjs/index.d.ts.map +1 -1
  38. package/lib/cjs/index.js +26 -1
  39. package/lib/cjs/index.js.map +1 -1
  40. package/lib/cjs/json.d.ts +12 -0
  41. package/lib/cjs/json.d.ts.map +1 -0
  42. package/lib/cjs/json.js +41 -0
  43. package/lib/cjs/json.js.map +1 -0
  44. package/lib/cjs/logger.d.ts +9 -1
  45. package/lib/cjs/logger.d.ts.map +1 -1
  46. package/lib/cjs/logger.js +28 -5
  47. package/lib/cjs/logger.js.map +1 -1
  48. package/lib/cjs/math.d.ts +2 -0
  49. package/lib/cjs/math.d.ts.map +1 -0
  50. package/lib/cjs/math.js +11 -0
  51. package/lib/cjs/math.js.map +1 -0
  52. package/lib/cjs/notify.d.ts +1 -0
  53. package/lib/cjs/notify.d.ts.map +1 -1
  54. package/lib/cjs/notify.js +18 -1
  55. package/lib/cjs/notify.js.map +1 -1
  56. package/lib/cjs/retry.d.ts +10 -0
  57. package/lib/cjs/retry.d.ts.map +1 -0
  58. package/lib/cjs/retry.js +22 -0
  59. package/lib/cjs/retry.js.map +1 -0
  60. package/lib/cjs/serialLimiter.d.ts +3 -0
  61. package/lib/cjs/serialLimiter.d.ts.map +1 -0
  62. package/lib/cjs/serialLimiter.js +29 -0
  63. package/lib/cjs/serialLimiter.js.map +1 -0
  64. package/lib/cjs/slackLogBatcher.d.ts +12 -0
  65. package/lib/cjs/slackLogBatcher.d.ts.map +1 -0
  66. package/lib/cjs/slackLogBatcher.js +54 -0
  67. package/lib/cjs/slackLogBatcher.js.map +1 -0
  68. package/lib/cjs/vitestNext.d.ts +3 -0
  69. package/lib/cjs/vitestNext.d.ts.map +1 -0
  70. package/lib/cjs/vitestNext.js +21 -0
  71. package/lib/cjs/vitestNext.js.map +1 -0
  72. package/lib/date.d.ts +1 -0
  73. package/lib/date.d.ts.map +1 -1
  74. package/lib/date.js +1 -0
  75. package/lib/date.js.map +1 -1
  76. package/lib/download.d.ts +1 -1
  77. package/lib/download.d.ts.map +1 -1
  78. package/lib/download.js +25 -2
  79. package/lib/download.js.map +1 -1
  80. package/lib/env.d.ts +3 -0
  81. package/lib/env.d.ts.map +1 -0
  82. package/lib/env.js +20 -0
  83. package/lib/env.js.map +1 -0
  84. package/lib/eslint.d.ts.map +1 -1
  85. package/lib/eslint.js +14 -2
  86. package/lib/eslint.js.map +1 -1
  87. package/lib/eslintNext.d.ts +3 -0
  88. package/lib/eslintNext.d.ts.map +1 -0
  89. package/lib/eslintNext.js +6 -0
  90. package/lib/eslintNext.js.map +1 -0
  91. package/lib/eslintRules.d.ts +1 -0
  92. package/lib/eslintRules.d.ts.map +1 -1
  93. package/lib/eslintRules.js +32 -0
  94. package/lib/eslintRules.js.map +1 -1
  95. package/lib/format.d.ts +2 -0
  96. package/lib/format.d.ts.map +1 -0
  97. package/lib/format.js +15 -0
  98. package/lib/format.js.map +1 -0
  99. package/lib/fs.d.ts +3 -0
  100. package/lib/fs.d.ts.map +1 -1
  101. package/lib/fs.js +18 -5
  102. package/lib/fs.js.map +1 -1
  103. package/lib/http.d.ts +3 -1
  104. package/lib/http.d.ts.map +1 -1
  105. package/lib/http.js +25 -15
  106. package/lib/http.js.map +1 -1
  107. package/lib/index.d.ts +15 -3
  108. package/lib/index.d.ts.map +1 -1
  109. package/lib/index.js +10 -3
  110. package/lib/index.js.map +1 -1
  111. package/lib/json.d.ts +12 -0
  112. package/lib/json.d.ts.map +1 -0
  113. package/lib/json.js +31 -0
  114. package/lib/json.js.map +1 -0
  115. package/lib/logger.d.ts +9 -1
  116. package/lib/logger.d.ts.map +1 -1
  117. package/lib/logger.js +28 -5
  118. package/lib/logger.js.map +1 -1
  119. package/lib/math.d.ts +2 -0
  120. package/lib/math.d.ts.map +1 -0
  121. package/lib/math.js +7 -0
  122. package/lib/math.js.map +1 -0
  123. package/lib/notify.d.ts +1 -0
  124. package/lib/notify.d.ts.map +1 -1
  125. package/lib/notify.js +16 -0
  126. package/lib/notify.js.map +1 -1
  127. package/lib/retry.d.ts +10 -0
  128. package/lib/retry.d.ts.map +1 -0
  129. package/lib/retry.js +18 -0
  130. package/lib/retry.js.map +1 -0
  131. package/lib/serialLimiter.d.ts +3 -0
  132. package/lib/serialLimiter.d.ts.map +1 -0
  133. package/lib/serialLimiter.js +25 -0
  134. package/lib/serialLimiter.js.map +1 -0
  135. package/lib/slackLogBatcher.d.ts +12 -0
  136. package/lib/slackLogBatcher.d.ts.map +1 -0
  137. package/lib/slackLogBatcher.js +49 -0
  138. package/lib/slackLogBatcher.js.map +1 -0
  139. package/lib/vitestNext.d.ts +3 -0
  140. package/lib/vitestNext.d.ts.map +1 -0
  141. package/lib/vitestNext.js +16 -0
  142. package/lib/vitestNext.js.map +1 -0
  143. package/package.json +21 -1
package/lib/eslint.js CHANGED
@@ -11,6 +11,7 @@ export default defineConfig(eslint.configs.recommended, ...tseslint.configs.reco
11
11
  rules: {
12
12
  // Sapphire
13
13
  'sapphire/no-control-characters': 'error',
14
+ 'sapphire/prefer-read-env': 'error',
14
15
  // General
15
16
  'arrow-body-style': ['error', 'as-needed'],
16
17
  curly: 'error',
@@ -32,6 +33,7 @@ export default defineConfig(eslint.configs.recommended, ...tseslint.configs.reco
32
33
  'no-restricted-imports': [
33
34
  'error',
34
35
  { name: 'assert', message: 'Use `node:assert` instead.' },
36
+ { name: 'axios', message: 'Use fetch or fetchWithRetry from @sapphire-sh/utils instead.' },
35
37
  { name: 'buffer', message: 'Use `node:buffer` instead.' },
36
38
  { name: 'child_process', message: 'Use `node:child_process` instead.' },
37
39
  { name: 'cluster', message: 'Use `node:cluster` instead.' },
@@ -87,9 +89,9 @@ export default defineConfig(eslint.configs.recommended, ...tseslint.configs.reco
87
89
  custom: { regex: '^I[A-Z]', match: false },
88
90
  },
89
91
  ],
90
- '@typescript-eslint/no-explicit-any': 'warn',
92
+ '@typescript-eslint/no-explicit-any': 'error',
91
93
  '@typescript-eslint/no-namespace': 'off',
92
- '@typescript-eslint/no-non-null-assertion': 'warn',
94
+ '@typescript-eslint/no-non-null-assertion': 'error',
93
95
  '@typescript-eslint/no-shadow': 'off',
94
96
  '@typescript-eslint/no-unnecessary-type-assertion': 'error',
95
97
  '@typescript-eslint/no-unused-vars': ['error', { varsIgnorePattern: '^_', argsIgnorePattern: '^_' }],
@@ -130,6 +132,16 @@ export default defineConfig(eslint.configs.recommended, ...tseslint.configs.reco
130
132
  project: true,
131
133
  },
132
134
  },
135
+ }, {
136
+ // Test doubles implement only part of an interface, and some libraries return
137
+ // `unknown`, so test files narrow with `as` where production code must not.
138
+ files: ['**/*.test.ts', '**/*.test.tsx'],
139
+ rules: {
140
+ '@typescript-eslint/consistent-type-assertions': [
141
+ 'error',
142
+ { assertionStyle: 'as', objectLiteralTypeAssertions: 'allow', arrayLiteralTypeAssertions: 'allow' },
143
+ ],
144
+ },
133
145
  }, {
134
146
  ignores: ['*.config.js', '**/*.json', 'coverage/', 'dist/', 'lib/', 'node_modules/'],
135
147
  });
package/lib/eslint.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("eslint/config").Config[];
2
+ export default _default;
3
+ //# sourceMappingURL=eslintNext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslintNext.d.ts","sourceRoot":"","sources":["../src/eslintNext.ts"],"names":[],"mappings":";AAKA,wBAKE"}
@@ -0,0 +1,6 @@
1
+ import nextCoreWebVitals from 'eslint-config-next/core-web-vitals';
2
+ import nextTypescript from 'eslint-config-next/typescript';
3
+ import { defineConfig, globalIgnores } from 'eslint/config';
4
+ import sapphireConfig from './eslint.js';
5
+ export default defineConfig(...sapphireConfig, ...nextCoreWebVitals, ...nextTypescript, globalIgnores(['.next/**', 'out/**', 'build/**', 'next-env.d.ts']));
6
+ //# sourceMappingURL=eslintNext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslintNext.js","sourceRoot":"","sources":["../src/eslintNext.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,oCAAoC,CAAC;AACnE,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,cAAc,MAAM,aAAa,CAAC;AAEzC,eAAe,YAAY,CAC1B,GAAG,cAAc,EACjB,GAAG,iBAAiB,EACpB,GAAG,cAAc,EACjB,aAAa,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAClE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { ESLint, Rule } from 'eslint';
2
2
  export declare const noControlCharacters: Rule.RuleModule;
3
+ export declare const preferReadEnv: Rule.RuleModule;
3
4
  export declare const sapphirePlugin: ESLint.Plugin;
4
5
  //# sourceMappingURL=eslintRules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslintRules.d.ts","sourceRoot":"","sources":["../src/eslintRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO3C,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,UAgCtC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAInC,CAAC"}
1
+ {"version":3,"file":"eslintRules.d.ts","sourceRoot":"","sources":["../src/eslintRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAQ3C,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,UAgCtC,CAAC;AAUF,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,UAyBhC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAKnC,CAAC"}
@@ -35,9 +35,41 @@ export const noControlCharacters = {
35
35
  };
36
36
  },
37
37
  };
38
+ const isProcessEnv = (node) => node.type === 'MemberExpression' &&
39
+ !node.computed &&
40
+ node.object.type === 'Identifier' &&
41
+ node.object.name === 'process' &&
42
+ node.property.type === 'Identifier' &&
43
+ node.property.name === 'env';
44
+ export const preferReadEnv = {
45
+ meta: {
46
+ type: 'problem',
47
+ docs: {
48
+ description: 'Disallow fallback operators on process.env values, which keep an empty string as a value',
49
+ },
50
+ schema: [],
51
+ messages: {
52
+ preferReadEnv: 'Use readEnv() from @sapphire-sh/utils instead of a fallback operator on process.env, which does not treat an empty string as unset.',
53
+ },
54
+ },
55
+ create(context) {
56
+ return {
57
+ LogicalExpression(node) {
58
+ if (node.operator !== '??' && node.operator !== '||') {
59
+ return;
60
+ }
61
+ if (node.left.type !== 'MemberExpression' || !isProcessEnv(node.left.object)) {
62
+ return;
63
+ }
64
+ context.report({ node, messageId: 'preferReadEnv' });
65
+ },
66
+ };
67
+ },
68
+ };
38
69
  export const sapphirePlugin = {
39
70
  rules: {
40
71
  'no-control-characters': noControlCharacters,
72
+ 'prefer-read-env': preferReadEnv,
41
73
  },
42
74
  };
43
75
  //# sourceMappingURL=eslintRules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslintRules.js","sourceRoot":"","sources":["../src/eslintRules.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,qGAAqG;AACrG,4CAA4C;AAC5C,MAAM,yBAAyB,GAAG,IAAI,MAAM,CAAC,uDAAuD,EAAE,GAAG,CAAC,CAAC;AAE3G,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IACnD,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,mEAAmE;SAChF;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACT,gBAAgB,EAAE,oDAAoD;SACtE;KACD;IACD,MAAM,CAAC,OAAO;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,OAAO;YACN,OAAO,CAAC,IAAI;gBACX,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;oBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;oBAChF,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI;wBACJ,GAAG,EAAE;4BACJ,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC;4BACxC,GAAG,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;yBAC1C;wBACD,SAAS,EAAE,kBAAkB;wBAC7B,IAAI,EAAE,EAAE,IAAI,EAAE;qBACd,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC5C,KAAK,EAAE;QACN,uBAAuB,EAAE,mBAAmB;KAC5C;CACD,CAAC"}
1
+ {"version":3,"file":"eslintRules.js","sourceRoot":"","sources":["../src/eslintRules.ts"],"names":[],"mappings":"AAGA,uFAAuF;AACvF,qGAAqG;AACrG,4CAA4C;AAC5C,MAAM,yBAAyB,GAAG,IAAI,MAAM,CAAC,uDAAuD,EAAE,GAAG,CAAC,CAAC;AAE3G,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IACnD,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,mEAAmE;SAChF;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACT,gBAAgB,EAAE,oDAAoD;SACtE;KACD;IACD,MAAM,CAAC,OAAO;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,OAAO;YACN,OAAO,CAAC,IAAI;gBACX,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;oBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;oBAChF,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI;wBACJ,GAAG,EAAE;4BACJ,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC;4BACxC,GAAG,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;yBAC1C;wBACD,SAAS,EAAE,kBAAkB;wBAC7B,IAAI,EAAE,EAAE,IAAI,EAAE;qBACd,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAU,EAAW,EAAE,CAC5C,IAAI,CAAC,IAAI,KAAK,kBAAkB;IAChC,CAAC,IAAI,CAAC,QAAQ;IACd,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;IACjC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;IAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;IACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC;AAE9B,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC7C,IAAI,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACL,WAAW,EAAE,0FAA0F;SACvG;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACT,aAAa,EACZ,qIAAqI;SACtI;KACD;IACD,MAAM,CAAC,OAAO;QACb,OAAO;YACN,iBAAiB,CAAC,IAAI;gBACrB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACtD,OAAO;gBACR,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9E,OAAO;gBACR,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;YACtD,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC5C,KAAK,EAAE;QACN,uBAAuB,EAAE,mBAAmB;QAC5C,iBAAiB,EAAE,aAAa;KAChC;CACD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const formatBytes: (bytes: number) => string;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAc3C,CAAC"}
package/lib/format.js ADDED
@@ -0,0 +1,15 @@
1
+ const BYTES_PER_UNIT = 1024;
2
+ const BYTE_UNITS = ['KB', 'MB', 'GB', 'TB'];
3
+ export const formatBytes = (bytes) => {
4
+ if (bytes < BYTES_PER_UNIT) {
5
+ return `${bytes} B`;
6
+ }
7
+ let value = bytes / BYTES_PER_UNIT;
8
+ let unitIndex = 0;
9
+ while (value >= BYTES_PER_UNIT && unitIndex < BYTE_UNITS.length - 1) {
10
+ value /= BYTES_PER_UNIT;
11
+ unitIndex += 1;
12
+ }
13
+ return `${value.toFixed(1)} ${BYTE_UNITS[unitIndex]}`;
14
+ };
15
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IACpD,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC5B,OAAO,GAAG,KAAK,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,GAAG,cAAc,CAAC;IACnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,KAAK,IAAI,cAAc,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,KAAK,IAAI,cAAc,CAAC;QACxB,SAAS,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;AACvD,CAAC,CAAC"}
package/lib/fs.d.ts CHANGED
@@ -1,2 +1,5 @@
1
+ export declare const fileExists: (path: string) => Promise<boolean>;
1
2
  export declare const mkdir: (path: string) => Promise<void>;
3
+ export declare const readJson: <T>(path: string) => Promise<T>;
4
+ export declare const writeJson: (path: string, data: unknown) => Promise<void>;
2
5
  //# sourceMappingURL=fs.d.ts.map
package/lib/fs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAUtD,CAAC"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,CAU9D,CAAC;AAEF,eAAO,MAAM,KAAK,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAKtD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAU,CAAC,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,CAAC,CAIzD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,MAAM,MAAM,EAAE,MAAM,OAAO,KAAG,OAAO,CAAC,IAAI,CAEzE,CAAC"}
package/lib/fs.js CHANGED
@@ -1,15 +1,28 @@
1
1
  import fs from 'node:fs';
2
- export const mkdir = async (path) => {
2
+ export const fileExists = async (path) => {
3
3
  try {
4
4
  await fs.promises.lstat(path);
5
+ return true;
5
6
  }
6
7
  catch (error) {
7
8
  if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
8
- await fs.promises.mkdir(path, { recursive: true });
9
- }
10
- else {
11
- throw error;
9
+ return false;
12
10
  }
11
+ throw error;
13
12
  }
14
13
  };
14
+ export const mkdir = async (path) => {
15
+ if (await fileExists(path)) {
16
+ return;
17
+ }
18
+ await fs.promises.mkdir(path, { recursive: true });
19
+ };
20
+ export const readJson = async (path) => {
21
+ const text = await fs.promises.readFile(path, 'utf-8');
22
+ const parsed = JSON.parse(text);
23
+ return parsed;
24
+ };
25
+ export const writeJson = async (path, data) => {
26
+ await fs.promises.writeFile(path, `${JSON.stringify(data, null, 2)}\n`);
27
+ };
15
28
  //# sourceMappingURL=fs.js.map
package/lib/fs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IAC1D,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;IAClE,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IAC1D,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAK,IAAY,EAAc,EAAE;IAC7D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,IAAa,EAAiB,EAAE;IAC7E,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC,CAAC"}
package/lib/http.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare class HttpError extends Error {
2
2
  readonly status: number;
3
- constructor(status: number, statusText: string);
3
+ readonly retryAfterMs?: number | undefined;
4
+ constructor(status: number, statusText: string, retryAfterMs?: number | undefined);
4
5
  }
5
6
  export interface FetchRetryOptions {
6
7
  maxRetries?: number;
@@ -9,4 +10,5 @@ export interface FetchRetryOptions {
9
10
  timeoutMs?: number;
10
11
  }
11
12
  export declare const fetchWithRetry: (url: string, init?: RequestInit, retryOptions?: FetchRetryOptions) => Promise<Response>;
13
+ export declare const fetchJson: <T>(url: string, init?: RequestInit, retryOptions?: FetchRetryOptions) => Promise<T>;
12
14
  //# sourceMappingURL=http.d.ts.map
package/lib/http.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,qBAAa,SAAU,SAAQ,KAAK;aAElB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,UAAU,EAAE,MAAM;CAInB;AAED,MAAM,WAAW,iBAAiB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,cAAc,GAC1B,KAAK,MAAM,EACX,OAAO,WAAW,EAClB,eAAe,iBAAiB,KAC9B,OAAO,CAAC,QAAQ,CA6BlB,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,qBAAa,SAAU,SAAQ,KAAK;aAElB,MAAM,EAAE,MAAM;aAEd,YAAY,CAAC,EAAE,MAAM;gBAFrB,MAAM,EAAE,MAAM,EAC9B,UAAU,EAAE,MAAM,EACF,YAAY,CAAC,EAAE,MAAM,YAAA;CAItC;AAED,MAAM,WAAW,iBAAiB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD,eAAO,MAAM,cAAc,GAC1B,KAAK,MAAM,EACX,OAAO,WAAW,EAClB,eAAe,iBAAiB,KAC9B,OAAO,CAAC,QAAQ,CAwBlB,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,CAAC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe,iBAAiB,KAAG,OAAO,CAAC,CAAC,CAI/G,CAAC"}
package/lib/http.js CHANGED
@@ -1,14 +1,23 @@
1
- import { sleep } from './sleep.js';
1
+ import { retry } from './retry.js';
2
2
  export class HttpError extends Error {
3
3
  status;
4
- constructor(status, statusText) {
4
+ retryAfterMs;
5
+ constructor(status, statusText, retryAfterMs) {
5
6
  super(`HTTP ${status} ${statusText}`);
6
7
  this.status = status;
8
+ this.retryAfterMs = retryAfterMs;
7
9
  }
8
10
  }
11
+ const parseRetryAfterMs = (response) => {
12
+ const header = response.headers.get('retry-after');
13
+ if (header === null || header === '') {
14
+ return undefined;
15
+ }
16
+ return Number.parseInt(header, 10) * 1000;
17
+ };
9
18
  export const fetchWithRetry = async (url, init, retryOptions) => {
10
19
  const { maxRetries = 3, baseDelayMs = 1000, jitterMs = 500, timeoutMs = 30000 } = retryOptions ?? {};
11
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
20
+ return retry(async () => {
12
21
  const resp = await fetch(url, {
13
22
  signal: AbortSignal.timeout(timeoutMs),
14
23
  ...init,
@@ -16,17 +25,18 @@ export const fetchWithRetry = async (url, init, retryOptions) => {
16
25
  if (resp.ok) {
17
26
  return resp;
18
27
  }
19
- const error = new HttpError(resp.status, resp.statusText);
20
- const isTransient = resp.status === 429 || resp.status >= 500;
21
- if (!isTransient || attempt === maxRetries) {
22
- throw error;
23
- }
24
- const retryAfterHeader = resp.headers.get('retry-after');
25
- const delay = retryAfterHeader !== null && retryAfterHeader !== ''
26
- ? Number.parseInt(retryAfterHeader, 10) * 1000
27
- : baseDelayMs * 2 ** attempt;
28
- await sleep(delay, jitterMs);
29
- }
30
- throw new Error('unreachable');
28
+ throw new HttpError(resp.status, resp.statusText, parseRetryAfterMs(resp));
29
+ }, {
30
+ maxAttempts: maxRetries + 1,
31
+ baseDelayMs,
32
+ jitterMs,
33
+ isRetryable: (error) => error instanceof HttpError && (error.status === 429 || error.status >= 500),
34
+ delayMs: (error) => (error instanceof HttpError ? error.retryAfterMs : undefined),
35
+ });
36
+ };
37
+ export const fetchJson = async (url, init, retryOptions) => {
38
+ const resp = await fetchWithRetry(url, init, retryOptions);
39
+ const parsed = await resp.json();
40
+ return parsed;
31
41
  };
32
42
  //# sourceMappingURL=http.js.map
package/lib/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,SAAU,SAAQ,KAAK;IAElB;IADjB,YACiB,MAAc,EAC9B,UAAkB;QAElB,KAAK,CAAC,QAAQ,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;QAHtB,WAAM,GAAN,MAAM,CAAQ;IAI/B,CAAC;CACD;AASD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,GAAW,EACX,IAAkB,EAClB,YAAgC,EACZ,EAAE;IACtB,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;IAErG,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,GAAG,IAAI;SACP,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QAE9D,IAAI,CAAC,WAAW,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,KAAK,CAAC;QACb,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,KAAK,GACV,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE;YACnD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,GAAG,IAAI;YAC9C,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC;QAC/B,MAAM,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,SAAU,SAAQ,KAAK;IAElB;IAEA;IAHjB,YACiB,MAAc,EAC9B,UAAkB,EACF,YAAqB;QAErC,KAAK,CAAC,QAAQ,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;QAJtB,WAAM,GAAN,MAAM,CAAQ;QAEd,iBAAY,GAAZ,YAAY,CAAS;IAGtC,CAAC;CACD;AASD,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAsB,EAAE;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,GAAW,EACX,IAAkB,EAClB,YAAgC,EACZ,EAAE;IACtB,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;IAErG,OAAO,KAAK,CACX,KAAK,IAAI,EAAE;QACV,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,GAAG,IAAI;SACP,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC,EACD;QACC,WAAW,EAAE,UAAU,GAAG,CAAC;QAC3B,WAAW;QACX,QAAQ;QACR,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;QACnG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;KACjF,CACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAK,GAAW,EAAE,IAAkB,EAAE,YAAgC,EAAc,EAAE;IACnH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC;AACf,CAAC,CAAC"}
package/lib/index.d.ts CHANGED
@@ -1,12 +1,24 @@
1
- export { formatDuration, toLocalISOString } from './date.js';
1
+ export { formatDate, formatDuration, toLocalISOString } from './date.js';
2
+ export { readEnv, requireEnv } from './env.js';
2
3
  export { serializeError } from './error.js';
4
+ export { formatBytes } from './format.js';
3
5
  export { getEnumValue } from './getEnumValue.js';
4
- export { HttpError, fetchWithRetry } from './http.js';
6
+ export { HttpError, fetchJson, fetchWithRetry } from './http.js';
5
7
  export type { FetchRetryOptions } from './http.js';
6
8
  export { isNonNullable } from './isNonNullable.js';
9
+ export { getArray, getBoolean, getNumber, getObject, getString, isJsonObject, parseJson } from './json.js';
10
+ export type { JsonObject, JsonValue } from './json.js';
7
11
  export { LogLevel, logger } from './logger.js';
8
- export { notifyMattermost, notifySlack } from './notify.js';
12
+ export type { LogEntry, LogSink } from './logger.js';
13
+ export { clamp } from './math.js';
14
+ export { notifyMattermost, notifySlack, pingHealthchecks } from './notify.js';
9
15
  export { Queue } from './queue.js';
16
+ export { retry } from './retry.js';
17
+ export type { RetryOptions } from './retry.js';
18
+ export { createSerialLimiter } from './serialLimiter.js';
19
+ export type { SerialLimiter } from './serialLimiter.js';
20
+ export { chunkLines, createSlackLogBatcher } from './slackLogBatcher.js';
21
+ export type { SlackLogBatcher, SlackLogBatcherOptions } from './slackLogBatcher.js';
10
22
  export { sleep } from './sleep.js';
11
23
  export { escapeHtml } from './string.js';
12
24
  export { throttle } from './throttle.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3G,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
package/lib/index.js CHANGED
@@ -1,11 +1,18 @@
1
- export { formatDuration, toLocalISOString } from './date.js';
1
+ export { formatDate, formatDuration, toLocalISOString } from './date.js';
2
+ export { readEnv, requireEnv } from './env.js';
2
3
  export { serializeError } from './error.js';
4
+ export { formatBytes } from './format.js';
3
5
  export { getEnumValue } from './getEnumValue.js';
4
- export { HttpError, fetchWithRetry } from './http.js';
6
+ export { HttpError, fetchJson, fetchWithRetry } from './http.js';
5
7
  export { isNonNullable } from './isNonNullable.js';
8
+ export { getArray, getBoolean, getNumber, getObject, getString, isJsonObject, parseJson } from './json.js';
6
9
  export { LogLevel, logger } from './logger.js';
7
- export { notifyMattermost, notifySlack } from './notify.js';
10
+ export { clamp } from './math.js';
11
+ export { notifyMattermost, notifySlack, pingHealthchecks } from './notify.js';
8
12
  export { Queue } from './queue.js';
13
+ export { retry } from './retry.js';
14
+ export { createSerialLimiter } from './serialLimiter.js';
15
+ export { chunkLines, createSlackLogBatcher } from './slackLogBatcher.js';
9
16
  export { sleep } from './sleep.js';
10
17
  export { escapeHtml } from './string.js';
11
18
  export { throttle } from './throttle.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3G,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
package/lib/json.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export type JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;
2
+ export interface JsonObject {
3
+ [key: string]: JsonValue;
4
+ }
5
+ export declare const isJsonObject: (value: unknown) => value is JsonObject;
6
+ export declare const parseJson: (text: string) => JsonValue | null;
7
+ export declare const getObject: (object: JsonObject, key: string) => JsonObject | null;
8
+ export declare const getArray: (object: JsonObject, key: string) => JsonValue[];
9
+ export declare const getString: (object: JsonObject, key: string) => string | null;
10
+ export declare const getNumber: (object: JsonObject, key: string) => number | null;
11
+ export declare const getBoolean: (object: JsonObject, key: string) => boolean | null;
12
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,UAAU;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UACc,CAAC;AAEtE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,SAAS,GAAG,IAOpD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,UAAU,GAAG,IAGxE,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,SAAS,EAGnE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAGpE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAGpE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,OAAO,GAAG,IAGtE,CAAC"}
package/lib/json.js ADDED
@@ -0,0 +1,31 @@
1
+ export const isJsonObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
2
+ export const parseJson = (text) => {
3
+ try {
4
+ const parsed = JSON.parse(text);
5
+ return parsed;
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ };
11
+ export const getObject = (object, key) => {
12
+ const value = object[key];
13
+ return isJsonObject(value) ? value : null;
14
+ };
15
+ export const getArray = (object, key) => {
16
+ const value = object[key];
17
+ return Array.isArray(value) ? value : [];
18
+ };
19
+ export const getString = (object, key) => {
20
+ const value = object[key];
21
+ return typeof value === 'string' ? value : null;
22
+ };
23
+ export const getNumber = (object, key) => {
24
+ const value = object[key];
25
+ return typeof value === 'number' ? value : null;
26
+ };
27
+ export const getBoolean = (object, key) => {
28
+ const value = object[key];
29
+ return typeof value === 'boolean' ? value : null;
30
+ };
31
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE,CACnE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAoB,EAAE;IAC3D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAqB,EAAE;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAe,EAAE;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAkB,EAAE;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC,CAAC"}
package/lib/logger.d.ts CHANGED
@@ -4,12 +4,20 @@ export declare enum LogLevel {
4
4
  WARN = 3,
5
5
  ERROR = 4
6
6
  }
7
- type Payload = Record<string, unknown> | Error;
7
+ type Payload = unknown;
8
+ export interface LogEntry {
9
+ level: LogLevel;
10
+ message: string;
11
+ payload?: unknown;
12
+ timestamp: Date;
13
+ }
14
+ export type LogSink = (entry: LogEntry) => void;
8
15
  export declare const logger: {
9
16
  debug: (message: string, payload?: Payload) => void;
10
17
  info: (message: string, payload?: Payload) => void;
11
18
  warn: (message: string, payload?: Payload) => void;
12
19
  error: (message: string, payload?: Payload) => void;
20
+ addSink: (sink: LogSink) => (() => void);
13
21
  setLevel: (level: LogLevel | string) => void;
14
22
  };
15
23
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IACnB,KAAK,IAAI;IACT,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,KAAK,IAAA;CACL;AAED,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;AAiD/C,eAAO,MAAM,MAAM;qBACD,MAAM,YAAY,OAAO;oBAC1B,MAAM,YAAY,OAAO;oBACzB,MAAM,YAAY,OAAO;qBACxB,MAAM,YAAY,OAAO;sBACxB,QAAQ,GAAG,MAAM;CAYnC,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IACnB,KAAK,IAAI;IACT,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,KAAK,IAAA;CACL;AAED,KAAK,OAAO,GAAG,OAAO,CAAC;AAEvB,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAgEhD,eAAO,MAAM,MAAM;qBACD,MAAM,YAAY,OAAO;oBAC1B,MAAM,YAAY,OAAO;oBACzB,MAAM,YAAY,OAAO;qBACxB,MAAM,YAAY,OAAO;oBAC1B,OAAO,KAAG,CAAC,MAAM,IAAI,CAAC;sBASpB,QAAQ,GAAG,MAAM;CAYnC,CAAC"}
package/lib/logger.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { readEnv } from './env.js';
1
2
  export var LogLevel;
2
3
  (function (LogLevel) {
3
4
  LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
@@ -5,8 +6,13 @@ export var LogLevel;
5
6
  LogLevel[LogLevel["WARN"] = 3] = "WARN";
6
7
  LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
7
8
  })(LogLevel || (LogLevel = {}));
9
+ const sinks = [];
10
+ // JSON.stringify is typed as returning string, but returns undefined for values it cannot
11
+ // serialize, such as functions and symbols.
12
+ const stringify = (value) => JSON.stringify(value);
8
13
  const serializePayload = (payload) => {
9
- const json = JSON.stringify(payload instanceof Error ? { error: payload.message, name: payload.name, stack: payload.stack } : payload);
14
+ const serialized = stringify(payload instanceof Error ? { error: payload.message, name: payload.name, stack: payload.stack } : payload);
15
+ const json = serialized ?? `"[${typeof payload}]"`;
10
16
  return json.padStart(json.length + 1);
11
17
  };
12
18
  const levelMap = {
@@ -17,8 +23,8 @@ const levelMap = {
17
23
  };
18
24
  const parseLevel = (level) => levelMap[level.toUpperCase()];
19
25
  const resolveInitialLevel = () => {
20
- const envLevel = process.env.LOG_LEVEL;
21
- if (envLevel === undefined || envLevel === '') {
26
+ const envLevel = readEnv('LOG_LEVEL');
27
+ if (envLevel === undefined) {
22
28
  return LogLevel.INFO;
23
29
  }
24
30
  return parseLevel(envLevel) ?? LogLevel.INFO;
@@ -28,8 +34,8 @@ const log = (level, message, payload) => {
28
34
  if (level < currentLevel) {
29
35
  return;
30
36
  }
31
- const ts = new Date().toISOString();
32
- const prefix = `[${ts}] [${LogLevel[level].toUpperCase()}]`;
37
+ const timestamp = new Date();
38
+ const prefix = `[${timestamp.toISOString()}] [${LogLevel[level].toUpperCase()}]`;
33
39
  const payloadStr = payload === undefined ? '' : serializePayload(payload);
34
40
  const output = `${prefix} ${message}${payloadStr}`;
35
41
  if (level === LogLevel.ERROR) {
@@ -44,12 +50,29 @@ const log = (level, message, payload) => {
44
50
  else {
45
51
  console.log(output);
46
52
  }
53
+ for (const sink of sinks) {
54
+ try {
55
+ sink({ level, message, payload, timestamp });
56
+ }
57
+ catch (error) {
58
+ console.error('[logger] sink failed', error);
59
+ }
60
+ }
47
61
  };
48
62
  export const logger = {
49
63
  debug: (message, payload) => log(LogLevel.DEBUG, message, payload),
50
64
  info: (message, payload) => log(LogLevel.INFO, message, payload),
51
65
  warn: (message, payload) => log(LogLevel.WARN, message, payload),
52
66
  error: (message, payload) => log(LogLevel.ERROR, message, payload),
67
+ addSink: (sink) => {
68
+ sinks.push(sink);
69
+ return () => {
70
+ const index = sinks.indexOf(sink);
71
+ if (index !== -1) {
72
+ sinks.splice(index, 1);
73
+ }
74
+ };
75
+ },
53
76
  setLevel: (level) => {
54
77
  if (typeof level === 'string') {
55
78
  const resolved = parseLevel(level);
package/lib/logger.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/lib/math.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const clamp: (value: number, min: number, max: number) => number;
2
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAK/D,CAAC"}
package/lib/math.js ADDED
@@ -0,0 +1,7 @@
1
+ export const clamp = (value, min, max) => {
2
+ if (min > max) {
3
+ throw new RangeError(`Invalid clamp range: min ${min} is greater than max ${max}`);
4
+ }
5
+ return Math.min(max, Math.max(min, value));
6
+ };
7
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE;IACxE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,4BAA4B,GAAG,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC"}
package/lib/notify.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export declare const notifySlack: (url: string, text: string) => Promise<void>;
2
+ export declare const pingHealthchecks: (url: string, timeoutMs?: number) => Promise<void>;
2
3
  export declare const notifyMattermost: (baseUrl: string, token: string, channelId: string, message: string) => Promise<void>;
3
4
  //# sourceMappingURL=notify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyBzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,KACb,OAAO,CAAC,IAAI,CAcd,CAAC"}
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyBzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,KAAK,MAAM,EAAE,kBAAgB,KAAG,OAAO,CAAC,IAAI,CAclF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,KACb,OAAO,CAAC,IAAI,CAcd,CAAC"}