@intlayer/cli 5.5.10 → 5.5.11

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 (189) hide show
  1. package/dist/cjs/cli.cjs +78 -6
  2. package/dist/cjs/cli.cjs.map +1 -1
  3. package/dist/cjs/cli.test.cjs +435 -0
  4. package/dist/cjs/cli.test.cjs.map +1 -0
  5. package/dist/cjs/fill.cjs +8 -12
  6. package/dist/cjs/fill.cjs.map +1 -1
  7. package/dist/cjs/index.cjs +5 -1
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/prompts/REVIEW_PROMPT.md +37 -0
  10. package/dist/cjs/prompts/TRANSLATE_PROMPT.md +38 -0
  11. package/dist/cjs/pull.cjs +10 -2
  12. package/dist/cjs/pull.cjs.map +1 -1
  13. package/dist/cjs/pushConfig.cjs +5 -1
  14. package/dist/cjs/pushConfig.cjs.map +1 -1
  15. package/dist/cjs/reviewDoc.cjs +203 -0
  16. package/dist/cjs/reviewDoc.cjs.map +1 -0
  17. package/dist/cjs/translateDoc.cjs +201 -0
  18. package/dist/cjs/translateDoc.cjs.map +1 -0
  19. package/dist/cjs/utils/calculateChunks.cjs +120 -0
  20. package/dist/cjs/utils/calculateChunks.cjs.map +1 -0
  21. package/dist/cjs/utils/calculateChunks.test.cjs +104 -0
  22. package/dist/cjs/utils/calculateChunks.test.cjs.map +1 -0
  23. package/dist/cjs/utils/calculrateChunkTest.md +9 -0
  24. package/dist/cjs/utils/checkAIAccess.cjs +40 -0
  25. package/dist/cjs/utils/checkAIAccess.cjs.map +1 -0
  26. package/dist/cjs/utils/checkFileModifiedRange.cjs +97 -0
  27. package/dist/cjs/utils/checkFileModifiedRange.cjs.map +1 -0
  28. package/dist/cjs/utils/checkFileModifiedRange.test.cjs +175 -0
  29. package/dist/cjs/utils/checkFileModifiedRange.test.cjs.map +1 -0
  30. package/dist/cjs/utils/checkLastUpdateTime.cjs +33 -0
  31. package/dist/cjs/utils/checkLastUpdateTime.cjs.map +1 -0
  32. package/dist/cjs/utils/chunkInference.cjs +58 -0
  33. package/dist/cjs/utils/chunkInference.cjs.map +1 -0
  34. package/dist/cjs/utils/fixChunkStartEndChars.cjs +47 -0
  35. package/dist/cjs/utils/fixChunkStartEndChars.cjs.map +1 -0
  36. package/dist/cjs/utils/fixChunkStartEndChars.test.cjs +81 -0
  37. package/dist/cjs/utils/fixChunkStartEndChars.test.cjs.map +1 -0
  38. package/dist/cjs/utils/formatTimeDiff.cjs +46 -0
  39. package/dist/cjs/utils/formatTimeDiff.cjs.map +1 -0
  40. package/dist/cjs/utils/formatTimeDiff.test.cjs +32 -0
  41. package/dist/cjs/utils/formatTimeDiff.test.cjs.map +1 -0
  42. package/dist/cjs/utils/getChunk.cjs +77 -0
  43. package/dist/cjs/utils/getChunk.cjs.map +1 -0
  44. package/dist/cjs/utils/getChunk.test.cjs +46 -0
  45. package/dist/cjs/utils/getChunk.test.cjs.map +1 -0
  46. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs +36 -0
  47. package/dist/cjs/utils/getIsFileUpdatedRecently.cjs.map +1 -0
  48. package/dist/cjs/utils/getOutputFilePath.cjs +89 -0
  49. package/dist/cjs/utils/getOutputFilePath.cjs.map +1 -0
  50. package/dist/cjs/utils/getOutputFilePath.test.cjs +73 -0
  51. package/dist/cjs/utils/getOutputFilePath.test.cjs.map +1 -0
  52. package/dist/cjs/utils/getParentPackageJSON.cjs +47 -0
  53. package/dist/cjs/utils/getParentPackageJSON.cjs.map +1 -0
  54. package/dist/cjs/utils/listSpecialChars.cjs +78 -0
  55. package/dist/cjs/utils/listSpecialChars.cjs.map +1 -0
  56. package/dist/cjs/utils/listSpecialChars.test.cjs +58 -0
  57. package/dist/cjs/utils/listSpecialChars.test.cjs.map +1 -0
  58. package/dist/cjs/utils/reorderParagraphs.cjs +125 -0
  59. package/dist/cjs/utils/reorderParagraphs.cjs.map +1 -0
  60. package/dist/cjs/utils/reorderParagraphs.test.cjs +71 -0
  61. package/dist/cjs/utils/reorderParagraphs.test.cjs.map +1 -0
  62. package/dist/cjs/utils/splitTextByLine.cjs +35 -0
  63. package/dist/cjs/utils/splitTextByLine.cjs.map +1 -0
  64. package/dist/cjs/utils/splitTextByLine.test.cjs +14 -0
  65. package/dist/cjs/utils/splitTextByLine.test.cjs.map +1 -0
  66. package/dist/esm/cli.mjs +79 -7
  67. package/dist/esm/cli.mjs.map +1 -1
  68. package/dist/esm/cli.test.mjs +412 -0
  69. package/dist/esm/cli.test.mjs.map +1 -0
  70. package/dist/esm/fill.mjs +8 -12
  71. package/dist/esm/fill.mjs.map +1 -1
  72. package/dist/esm/index.mjs +2 -0
  73. package/dist/esm/index.mjs.map +1 -1
  74. package/dist/esm/prompts/REVIEW_PROMPT.md +37 -0
  75. package/dist/esm/prompts/TRANSLATE_PROMPT.md +38 -0
  76. package/dist/esm/pull.mjs +10 -2
  77. package/dist/esm/pull.mjs.map +1 -1
  78. package/dist/esm/pushConfig.mjs +5 -1
  79. package/dist/esm/pushConfig.mjs.map +1 -1
  80. package/dist/esm/reviewDoc.mjs +172 -0
  81. package/dist/esm/reviewDoc.mjs.map +1 -0
  82. package/dist/esm/translateDoc.mjs +170 -0
  83. package/dist/esm/translateDoc.mjs.map +1 -0
  84. package/dist/esm/utils/calculateChunks.mjs +96 -0
  85. package/dist/esm/utils/calculateChunks.mjs.map +1 -0
  86. package/dist/esm/utils/calculateChunks.test.mjs +103 -0
  87. package/dist/esm/utils/calculateChunks.test.mjs.map +1 -0
  88. package/dist/esm/utils/calculrateChunkTest.md +9 -0
  89. package/dist/esm/utils/checkAIAccess.mjs +16 -0
  90. package/dist/esm/utils/checkAIAccess.mjs.map +1 -0
  91. package/dist/esm/utils/checkFileModifiedRange.mjs +73 -0
  92. package/dist/esm/utils/checkFileModifiedRange.mjs.map +1 -0
  93. package/dist/esm/utils/checkFileModifiedRange.test.mjs +181 -0
  94. package/dist/esm/utils/checkFileModifiedRange.test.mjs.map +1 -0
  95. package/dist/esm/utils/checkLastUpdateTime.mjs +9 -0
  96. package/dist/esm/utils/checkLastUpdateTime.mjs.map +1 -0
  97. package/dist/esm/utils/chunkInference.mjs +34 -0
  98. package/dist/esm/utils/chunkInference.mjs.map +1 -0
  99. package/dist/esm/utils/fixChunkStartEndChars.mjs +23 -0
  100. package/dist/esm/utils/fixChunkStartEndChars.mjs.map +1 -0
  101. package/dist/esm/utils/fixChunkStartEndChars.test.mjs +80 -0
  102. package/dist/esm/utils/fixChunkStartEndChars.test.mjs.map +1 -0
  103. package/dist/esm/utils/formatTimeDiff.mjs +22 -0
  104. package/dist/esm/utils/formatTimeDiff.mjs.map +1 -0
  105. package/dist/esm/utils/formatTimeDiff.test.mjs +31 -0
  106. package/dist/esm/utils/formatTimeDiff.test.mjs.map +1 -0
  107. package/dist/esm/utils/getChunk.mjs +53 -0
  108. package/dist/esm/utils/getChunk.mjs.map +1 -0
  109. package/dist/esm/utils/getChunk.test.mjs +45 -0
  110. package/dist/esm/utils/getChunk.test.mjs.map +1 -0
  111. package/dist/esm/utils/getIsFileUpdatedRecently.mjs +12 -0
  112. package/dist/esm/utils/getIsFileUpdatedRecently.mjs.map +1 -0
  113. package/dist/esm/utils/getOutputFilePath.mjs +65 -0
  114. package/dist/esm/utils/getOutputFilePath.mjs.map +1 -0
  115. package/dist/esm/utils/getOutputFilePath.test.mjs +72 -0
  116. package/dist/esm/utils/getOutputFilePath.test.mjs.map +1 -0
  117. package/dist/esm/utils/getParentPackageJSON.mjs +23 -0
  118. package/dist/esm/utils/getParentPackageJSON.mjs.map +1 -0
  119. package/dist/esm/utils/listSpecialChars.mjs +54 -0
  120. package/dist/esm/utils/listSpecialChars.mjs.map +1 -0
  121. package/dist/esm/utils/listSpecialChars.test.mjs +57 -0
  122. package/dist/esm/utils/listSpecialChars.test.mjs.map +1 -0
  123. package/dist/esm/utils/reorderParagraphs.mjs +101 -0
  124. package/dist/esm/utils/reorderParagraphs.mjs.map +1 -0
  125. package/dist/esm/utils/reorderParagraphs.test.mjs +70 -0
  126. package/dist/esm/utils/reorderParagraphs.test.mjs.map +1 -0
  127. package/dist/esm/utils/splitTextByLine.mjs +11 -0
  128. package/dist/esm/utils/splitTextByLine.mjs.map +1 -0
  129. package/dist/esm/utils/splitTextByLine.test.mjs +13 -0
  130. package/dist/esm/utils/splitTextByLine.test.mjs.map +1 -0
  131. package/dist/types/cli.d.ts.map +1 -1
  132. package/dist/types/cli.test.d.ts +2 -0
  133. package/dist/types/cli.test.d.ts.map +1 -0
  134. package/dist/types/fill.d.ts.map +1 -1
  135. package/dist/types/index.d.ts +2 -0
  136. package/dist/types/index.d.ts.map +1 -1
  137. package/dist/types/pull.d.ts.map +1 -1
  138. package/dist/types/pushConfig.d.ts.map +1 -1
  139. package/dist/types/reviewDoc.d.ts +25 -0
  140. package/dist/types/reviewDoc.d.ts.map +1 -0
  141. package/dist/types/translateDoc.d.ts +25 -0
  142. package/dist/types/translateDoc.d.ts.map +1 -0
  143. package/dist/types/utils/calculateChunks.d.ts +9 -0
  144. package/dist/types/utils/calculateChunks.d.ts.map +1 -0
  145. package/dist/types/utils/calculateChunks.test.d.ts +2 -0
  146. package/dist/types/utils/calculateChunks.test.d.ts.map +1 -0
  147. package/dist/types/utils/checkAIAccess.d.ts +4 -0
  148. package/dist/types/utils/checkAIAccess.d.ts.map +1 -0
  149. package/dist/types/utils/checkFileModifiedRange.d.ts +11 -0
  150. package/dist/types/utils/checkFileModifiedRange.d.ts.map +1 -0
  151. package/dist/types/utils/checkFileModifiedRange.test.d.ts +2 -0
  152. package/dist/types/utils/checkFileModifiedRange.test.d.ts.map +1 -0
  153. package/dist/types/utils/checkLastUpdateTime.d.ts +9 -0
  154. package/dist/types/utils/checkLastUpdateTime.d.ts.map +1 -0
  155. package/dist/types/utils/chunkInference.d.ts +12 -0
  156. package/dist/types/utils/chunkInference.d.ts.map +1 -0
  157. package/dist/types/utils/fixChunkStartEndChars.d.ts +2 -0
  158. package/dist/types/utils/fixChunkStartEndChars.d.ts.map +1 -0
  159. package/dist/types/utils/fixChunkStartEndChars.test.d.ts +2 -0
  160. package/dist/types/utils/fixChunkStartEndChars.test.d.ts.map +1 -0
  161. package/dist/types/utils/formatTimeDiff.d.ts +2 -0
  162. package/dist/types/utils/formatTimeDiff.d.ts.map +1 -0
  163. package/dist/types/utils/formatTimeDiff.test.d.ts +2 -0
  164. package/dist/types/utils/formatTimeDiff.test.d.ts.map +1 -0
  165. package/dist/types/utils/getChunk.d.ts +9 -0
  166. package/dist/types/utils/getChunk.d.ts.map +1 -0
  167. package/dist/types/utils/getChunk.test.d.ts +2 -0
  168. package/dist/types/utils/getChunk.test.d.ts.map +1 -0
  169. package/dist/types/utils/getIsFileUpdatedRecently.d.ts +5 -0
  170. package/dist/types/utils/getIsFileUpdatedRecently.d.ts.map +1 -0
  171. package/dist/types/utils/getOutputFilePath.d.ts +26 -0
  172. package/dist/types/utils/getOutputFilePath.d.ts.map +1 -0
  173. package/dist/types/utils/getOutputFilePath.test.d.ts +2 -0
  174. package/dist/types/utils/getOutputFilePath.test.d.ts.map +1 -0
  175. package/dist/types/utils/getParentPackageJSON.d.ts +32 -0
  176. package/dist/types/utils/getParentPackageJSON.d.ts.map +1 -0
  177. package/dist/types/utils/listSpecialChars.d.ts +10 -0
  178. package/dist/types/utils/listSpecialChars.d.ts.map +1 -0
  179. package/dist/types/utils/listSpecialChars.test.d.ts +2 -0
  180. package/dist/types/utils/listSpecialChars.test.d.ts.map +1 -0
  181. package/dist/types/utils/reorderParagraphs.d.ts +8 -0
  182. package/dist/types/utils/reorderParagraphs.d.ts.map +1 -0
  183. package/dist/types/utils/reorderParagraphs.test.d.ts +2 -0
  184. package/dist/types/utils/reorderParagraphs.test.d.ts.map +1 -0
  185. package/dist/types/utils/splitTextByLine.d.ts +2 -0
  186. package/dist/types/utils/splitTextByLine.d.ts.map +1 -0
  187. package/dist/types/utils/splitTextByLine.test.d.ts +2 -0
  188. package/dist/types/utils/splitTextByLine.test.d.ts.map +1 -0
  189. package/package.json +16 -14
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var checkFileModifiedRange_exports = {};
20
+ __export(checkFileModifiedRange_exports, {
21
+ checkFileModifiedRange: () => checkFileModifiedRange
22
+ });
23
+ module.exports = __toCommonJS(checkFileModifiedRange_exports);
24
+ var import_checkLastUpdateTime = require('./checkLastUpdateTime.cjs');
25
+ var import_formatTimeDiff = require('./formatTimeDiff.cjs');
26
+ const TIMESTAMP_THRESHOLD_MS = 50 * 365 * 24 * 60 * 60 * 1e3;
27
+ const normaliseInputDate = (date, now = /* @__PURE__ */ new Date()) => {
28
+ if (date instanceof Date) {
29
+ return {
30
+ absoluteTime: date,
31
+ relativeTime: new Date(now.getTime() - date.getTime())
32
+ };
33
+ }
34
+ if (typeof date === "number") {
35
+ if (date > TIMESTAMP_THRESHOLD_MS) {
36
+ const absoluteTime = new Date(date);
37
+ return {
38
+ absoluteTime,
39
+ relativeTime: new Date(now.getTime() - absoluteTime.getTime())
40
+ };
41
+ }
42
+ const relativeMs = date;
43
+ return {
44
+ // Relative duration expressed as a Date object starting at the epoch
45
+ relativeTime: new Date(relativeMs),
46
+ // The concrete date obtained by subtracting the duration from *now*
47
+ absoluteTime: new Date(now.getTime() - relativeMs)
48
+ };
49
+ }
50
+ if (typeof date === "string") {
51
+ const absoluteTime = new Date(date);
52
+ if (Number.isNaN(absoluteTime.getTime())) {
53
+ throw new Error(`Invalid date string provided: ${date}`);
54
+ }
55
+ return {
56
+ absoluteTime,
57
+ relativeTime: new Date(now.getTime() - absoluteTime.getTime())
58
+ };
59
+ }
60
+ throw new Error(`Unsupported date format: ${date}`);
61
+ };
62
+ const checkFileModifiedRange = (filePath, options) => {
63
+ const fileLastUpdateTime = (0, import_checkLastUpdateTime.checkLastUpdateTime)(filePath);
64
+ const { skipIfModifiedBefore, skipIfModifiedAfter } = options;
65
+ const now = /* @__PURE__ */ new Date();
66
+ const minDate = skipIfModifiedBefore ? normaliseInputDate(skipIfModifiedBefore, now).absoluteTime : void 0;
67
+ const maxDate = skipIfModifiedAfter ? normaliseInputDate(skipIfModifiedAfter, now).absoluteTime : void 0;
68
+ let shouldSkip = false;
69
+ if (minDate instanceof Date && maxDate instanceof Date) {
70
+ shouldSkip = fileLastUpdateTime >= minDate && fileLastUpdateTime <= maxDate;
71
+ } else if (minDate instanceof Date) {
72
+ shouldSkip = fileLastUpdateTime >= minDate;
73
+ } else if (maxDate) {
74
+ shouldSkip = fileLastUpdateTime >= maxDate;
75
+ }
76
+ if (shouldSkip) {
77
+ const referenceDate = minDate && maxDate ? (
78
+ // When both bounds are present, the *range* caused the skip so we use
79
+ // the distance between the two bounds as the relative duration.
80
+ new Date(Math.abs(maxDate.getTime() - minDate.getTime()))
81
+ ) : minDate ?? maxDate;
82
+ const relativeTime = new Date(now.getTime() - referenceDate.getTime());
83
+ return {
84
+ isSkipped: true,
85
+ message: `Skipping file because it has been modified within the last ${(0, import_formatTimeDiff.formatTimeDiff)(relativeTime)} - ${filePath}`
86
+ };
87
+ }
88
+ return {
89
+ isSkipped: false,
90
+ message: `File ${filePath} can be processed - ${filePath}`
91
+ };
92
+ };
93
+ // Annotate the CommonJS export names for ESM import in node:
94
+ 0 && (module.exports = {
95
+ checkFileModifiedRange
96
+ });
97
+ //# sourceMappingURL=checkFileModifiedRange.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/checkFileModifiedRange.ts"],"sourcesContent":["import { checkLastUpdateTime } from './checkLastUpdateTime';\nimport { formatTimeDiff } from './formatTimeDiff';\n\ntype GetTimeRangeResult = {\n relativeTime: Date;\n absoluteTime: Date;\n};\n\n/**\n * Threshold that helps us differentiate between a numeric *timestamp* (ms from epoch)\n * and a numeric *duration* (ms ago).\n * 50 years expressed in milliseconds is far greater than any reasonable\n * \"relative\" duration we expect the helper to receive (e.g. a couple of years).\n */\nconst TIMESTAMP_THRESHOLD_MS = 50 * 365 * 24 * 60 * 60 * 1000; // 50 years\n\n/**\n * Normalises the input date representation into a pair:\n * 1. `relativeTime` – a Date instance whose epoch-time equals the duration\n * between `now` and the absolute date.\n * 2. `absoluteTime` – the concrete point in time represented as a Date.\n *\n * Rules for interpreting the input:\n * • Date => treated as an absolute time.\n * • string => parsed via the Date constructor => absolute time.\n * • number:\n * – if the value is larger than the TIMESTAMP_THRESHOLD_MS we assume it\n * is a unix timestamp (absolute time).\n * – otherwise we treat it as a *relative* duration expressed in\n * milliseconds.\n */\nconst normaliseInputDate = (\n date: Date | number | string,\n now: Date = new Date()\n): GetTimeRangeResult => {\n // Case 1: Already a Date instance\n if (date instanceof Date) {\n return {\n absoluteTime: date,\n relativeTime: new Date(now.getTime() - date.getTime()),\n };\n }\n\n // Case 2: Numeric value – decide between timestamp vs relative ms.\n if (typeof date === 'number') {\n if (date > TIMESTAMP_THRESHOLD_MS) {\n // Treat as *unix timestamp* (absolute)\n const absoluteTime = new Date(date);\n return {\n absoluteTime,\n relativeTime: new Date(now.getTime() - absoluteTime.getTime()),\n };\n }\n\n // Treat as a *relative* duration (milliseconds in the past)\n const relativeMs = date;\n return {\n // Relative duration expressed as a Date object starting at the epoch\n relativeTime: new Date(relativeMs),\n // The concrete date obtained by subtracting the duration from *now*\n absoluteTime: new Date(now.getTime() - relativeMs),\n };\n }\n\n // Case 3: String representation – let Date parse it.\n if (typeof date === 'string') {\n const absoluteTime = new Date(date);\n if (Number.isNaN(absoluteTime.getTime())) {\n throw new Error(`Invalid date string provided: ${date}`);\n }\n\n return {\n absoluteTime,\n relativeTime: new Date(now.getTime() - absoluteTime.getTime()),\n };\n }\n\n throw new Error(`Unsupported date format: ${date}`);\n};\n\ntype CheckFileModifiedRangeResult = {\n isSkipped: boolean;\n message: string;\n};\n\ntype CheckFileModifiedRangeOptions = {\n skipIfModifiedBefore?: Date | number | string;\n skipIfModifiedAfter?: Date | number | string;\n};\n\nexport const checkFileModifiedRange = (\n filePath: string,\n options: CheckFileModifiedRangeOptions\n): CheckFileModifiedRangeResult => {\n const fileLastUpdateTime = checkLastUpdateTime(filePath);\n const { skipIfModifiedBefore, skipIfModifiedAfter } = options;\n\n // Normalise the provided thresholds to concrete dates.\n const now = new Date();\n const minDate = skipIfModifiedBefore\n ? normaliseInputDate(skipIfModifiedBefore, now).absoluteTime\n : undefined;\n const maxDate = skipIfModifiedAfter\n ? normaliseInputDate(skipIfModifiedAfter, now).absoluteTime\n : undefined;\n\n // Determine if the file should be skipped.\n let shouldSkip = false;\n\n if (minDate instanceof Date && maxDate instanceof Date) {\n // Skip when the modification time falls *within* the range [minDate, maxDate]\n shouldSkip = fileLastUpdateTime >= minDate && fileLastUpdateTime <= maxDate;\n } else if (minDate instanceof Date) {\n // Only lower bound – skip when the file was modified *after* minDate\n shouldSkip = fileLastUpdateTime >= minDate;\n } else if (maxDate) {\n // Only upper bound – skip when the file was modified *after* maxDate\n shouldSkip = fileLastUpdateTime >= maxDate;\n }\n\n if (shouldSkip) {\n // For the sake of the message we compute the relative time to *now* using\n // whichever bound was responsible for the skip logic.\n const referenceDate = (\n minDate && maxDate\n ? // When both bounds are present, the *range* caused the skip so we use\n // the distance between the two bounds as the relative duration.\n new Date(Math.abs(maxDate.getTime() - minDate.getTime()))\n : (minDate ?? maxDate)\n )!;\n\n const relativeTime = new Date(now.getTime() - referenceDate.getTime());\n\n return {\n isSkipped: true,\n message: `Skipping file because it has been modified within the last ${formatTimeDiff(relativeTime)} - ${filePath}`,\n };\n }\n\n return {\n isSkipped: false,\n message: `File ${filePath} can be processed - ${filePath}`,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAoC;AACpC,4BAA+B;AAa/B,MAAM,yBAAyB,KAAK,MAAM,KAAK,KAAK,KAAK;AAiBzD,MAAM,qBAAqB,CACzB,MACA,MAAY,oBAAI,KAAK,MACE;AAEvB,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,wBAAwB;AAEjC,YAAM,eAAe,IAAI,KAAK,IAAI;AAClC,aAAO;AAAA,QACL;AAAA,QACA,cAAc,IAAI,KAAK,IAAI,QAAQ,IAAI,aAAa,QAAQ,CAAC;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,aAAa;AACnB,WAAO;AAAA;AAAA,MAEL,cAAc,IAAI,KAAK,UAAU;AAAA;AAAA,MAEjC,cAAc,IAAI,KAAK,IAAI,QAAQ,IAAI,UAAU;AAAA,IACnD;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,eAAe,IAAI,KAAK,IAAI;AAClC,QAAI,OAAO,MAAM,aAAa,QAAQ,CAAC,GAAG;AACxC,YAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AAAA,IACzD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,IAAI,KAAK,IAAI,QAAQ,IAAI,aAAa,QAAQ,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AACpD;AAYO,MAAM,yBAAyB,CACpC,UACA,YACiC;AACjC,QAAM,yBAAqB,gDAAoB,QAAQ;AACvD,QAAM,EAAE,sBAAsB,oBAAoB,IAAI;AAGtD,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAU,uBACZ,mBAAmB,sBAAsB,GAAG,EAAE,eAC9C;AACJ,QAAM,UAAU,sBACZ,mBAAmB,qBAAqB,GAAG,EAAE,eAC7C;AAGJ,MAAI,aAAa;AAEjB,MAAI,mBAAmB,QAAQ,mBAAmB,MAAM;AAEtD,iBAAa,sBAAsB,WAAW,sBAAsB;AAAA,EACtE,WAAW,mBAAmB,MAAM;AAElC,iBAAa,sBAAsB;AAAA,EACrC,WAAW,SAAS;AAElB,iBAAa,sBAAsB;AAAA,EACrC;AAEA,MAAI,YAAY;AAGd,UAAM,gBACJ,WAAW;AAAA;AAAA;AAAA,MAGP,IAAI,KAAK,KAAK,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,QACvD,WAAW;AAGlB,UAAM,eAAe,IAAI,KAAK,IAAI,QAAQ,IAAI,cAAc,QAAQ,CAAC;AAErE,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,kEAA8D,sCAAe,YAAY,CAAC,MAAM,QAAQ;AAAA,IACnH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS,QAAQ,QAAQ,uBAAuB,QAAQ;AAAA,EAC1D;AACF;","names":[]}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_checkFileModifiedRange = require('./checkFileModifiedRange.cjs');
4
+ var import_checkLastUpdateTime = require('./checkLastUpdateTime.cjs');
5
+ import_vitest.vi.mock("./checkLastUpdateTime", () => {
6
+ return {
7
+ checkLastUpdateTime: import_vitest.vi.fn(() => /* @__PURE__ */ new Date())
8
+ // pretend the file was just modified
9
+ };
10
+ });
11
+ (0, import_vitest.describe)("checkFileModifiedRange", () => {
12
+ (0, import_vitest.beforeEach)(() => {
13
+ import_vitest.vi.useFakeTimers();
14
+ import_vitest.vi.setSystemTime(/* @__PURE__ */ new Date("2025-01-01"));
15
+ });
16
+ (0, import_vitest.afterEach)(() => {
17
+ import_vitest.vi.useRealTimers();
18
+ import_vitest.vi.clearAllMocks();
19
+ });
20
+ const testList = [
21
+ {
22
+ // |---a---|
23
+ fileModifiedTime: /* @__PURE__ */ new Date("2025-01-01"),
24
+ // a
25
+ isSkipped: false
26
+ // No constraints
27
+ },
28
+ {
29
+ // |-min-a-max-|
30
+ skipIfModifiedBefore: "2024-01-01",
31
+ // min
32
+ skipIfModifiedAfter: "2026-01-01",
33
+ // max
34
+ fileModifiedTime: /* @__PURE__ */ new Date("2025-01-01"),
35
+ // a
36
+ isSkipped: true
37
+ // During the range
38
+ },
39
+ {
40
+ // |-min-max-a-|
41
+ skipIfModifiedBefore: "2024-01-01",
42
+ // min
43
+ skipIfModifiedAfter: "2026-01-01",
44
+ // max
45
+ fileModifiedTime: /* @__PURE__ */ new Date("2027-01-01"),
46
+ // a
47
+ isSkipped: false
48
+ // After the range
49
+ },
50
+ {
51
+ // |-a-min-max-|
52
+ skipIfModifiedBefore: "2024-01-01",
53
+ // min
54
+ skipIfModifiedAfter: "2026-01-01",
55
+ // max
56
+ fileModifiedTime: /* @__PURE__ */ new Date("2023-01-01"),
57
+ // a
58
+ isSkipped: false
59
+ // Before the range
60
+ },
61
+ {
62
+ // |-a-min-|
63
+ skipIfModifiedBefore: "2024-01-01",
64
+ // min
65
+ fileModifiedTime: /* @__PURE__ */ new Date("2023-01-01"),
66
+ // a
67
+ isSkipped: false
68
+ // Before the skipIfModifiedBefore
69
+ },
70
+ {
71
+ // |-min-a-|
72
+ skipIfModifiedBefore: "2024-01-01",
73
+ // min
74
+ fileModifiedTime: /* @__PURE__ */ new Date("2025-01-01"),
75
+ // a
76
+ isSkipped: true
77
+ // After the skipIfModifiedBefore
78
+ },
79
+ {
80
+ // |-a-max-|
81
+ skipIfModifiedAfter: "2026-01-01",
82
+ // max
83
+ fileModifiedTime: /* @__PURE__ */ new Date("2027-01-01"),
84
+ // a
85
+ isSkipped: true
86
+ // Before the skipIfModifiedAfter
87
+ },
88
+ {
89
+ // |-max-a-|
90
+ skipIfModifiedAfter: "2026-01-01",
91
+ // max
92
+ fileModifiedTime: /* @__PURE__ */ new Date("2027-01-01"),
93
+ // a
94
+ isSkipped: true
95
+ // After the skipIfModifiedAfter
96
+ },
97
+ {
98
+ // |-min-max-a-|
99
+ skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1e3,
100
+ // min // 3 year ago
101
+ skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1e3,
102
+ // max // 1 year
103
+ fileModifiedTime: /* @__PURE__ */ new Date("2025-01-01"),
104
+ // a
105
+ isSkipped: false
106
+ // Before the range
107
+ },
108
+ {
109
+ // |-a-max-|
110
+ skipIfModifiedAfter: 0,
111
+ // max // now
112
+ fileModifiedTime: /* @__PURE__ */ new Date("2024-01-01"),
113
+ // a
114
+ isSkipped: false
115
+ // Before the skipIfModifiedAfter
116
+ },
117
+ {
118
+ // |-min-a-|
119
+ skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1e3,
120
+ // max // 1 year
121
+ fileModifiedTime: /* @__PURE__ */ new Date("2025-01-01"),
122
+ // a
123
+ isSkipped: true
124
+ // Before the skipIfModifiedAfter
125
+ },
126
+ {
127
+ // |-min-a-max-|
128
+ skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1e3,
129
+ // min // 3 year ago
130
+ skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1e3,
131
+ // max // 1 year
132
+ fileModifiedTime: /* @__PURE__ */ new Date("2023-01-01"),
133
+ // a
134
+ isSkipped: true
135
+ // After the range
136
+ },
137
+ {
138
+ // |-a-min-max-|
139
+ skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1e3,
140
+ // min // 3 year ago
141
+ skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1e3,
142
+ // max // 1 year
143
+ fileModifiedTime: /* @__PURE__ */ new Date("2020-01-01"),
144
+ // a
145
+ isSkipped: false
146
+ // Before the range
147
+ },
148
+ {
149
+ // |-min-max-a-|
150
+ skipIfModifiedBefore: "2024-01-01T00:00:00Z",
151
+ // min
152
+ skipIfModifiedAfter: "2026-01-01T00:00:00Z",
153
+ // max
154
+ fileModifiedTime: /* @__PURE__ */ new Date("2027-01-01"),
155
+ // a
156
+ isSkipped: false
157
+ // After the range
158
+ }
159
+ ];
160
+ testList.forEach((test) => {
161
+ (0, import_vitest.it)(`should correctly handle string date inputs (absolute time) outside of the range`, () => {
162
+ const filePath = "test/file.txt";
163
+ import_checkLastUpdateTime.checkLastUpdateTime.mockReturnValue(
164
+ // If a specific mocked modification time is provided, use it. Otherwise, fall back to "now".
165
+ test.fileModifiedTime ?? /* @__PURE__ */ new Date()
166
+ );
167
+ const { isSkipped } = (0, import_checkFileModifiedRange.checkFileModifiedRange)(filePath, {
168
+ skipIfModifiedBefore: test.skipIfModifiedBefore,
169
+ skipIfModifiedAfter: test.skipIfModifiedAfter
170
+ });
171
+ (0, import_vitest.expect)(isSkipped).toBe(test.isSkipped);
172
+ });
173
+ });
174
+ });
175
+ //# sourceMappingURL=checkFileModifiedRange.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/checkFileModifiedRange.test.ts"],"sourcesContent":["import {\n afterEach,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n type Mock,\n} from 'vitest';\n\n// We are testing the public helper. The helper itself internally relies on\n// `checkLastUpdateTime`, which hits the file-system. To keep the test\n// deterministic (and independent from the real FS) we mock this dependency so\n// that we can control the last modification date that the helper receives.\n\n// NOTE: `vi.mock` must be called *before* the module under test is imported.\nvi.mock('./checkLastUpdateTime', () => {\n return {\n checkLastUpdateTime: vi.fn(() => new Date()), // pretend the file was just modified\n };\n});\n\nimport { checkFileModifiedRange } from './checkFileModifiedRange';\nimport { checkLastUpdateTime } from './checkLastUpdateTime';\n\ndescribe('checkFileModifiedRange', () => {\n beforeEach(() => {\n // Use fake timers so Date.now() is deterministic.\n vi.useFakeTimers();\n // Pin the system time to an arbitrary date for reproducibility\n vi.setSystemTime(new Date('2025-01-01'));\n });\n\n afterEach(() => {\n vi.useRealTimers();\n vi.clearAllMocks();\n });\n\n const testList = [\n {\n // |---a---|\n fileModifiedTime: new Date('2025-01-01'), // a\n isSkipped: false, // No constraints\n },\n {\n // |-min-a-max-|\n skipIfModifiedBefore: '2024-01-01', // min\n skipIfModifiedAfter: '2026-01-01', // max\n fileModifiedTime: new Date('2025-01-01'), // a\n isSkipped: true, // During the range\n },\n {\n // |-min-max-a-|\n skipIfModifiedBefore: '2024-01-01', // min\n skipIfModifiedAfter: '2026-01-01', // max\n fileModifiedTime: new Date('2027-01-01'), // a\n isSkipped: false, // After the range\n },\n {\n // |-a-min-max-|\n skipIfModifiedBefore: '2024-01-01', // min\n skipIfModifiedAfter: '2026-01-01', // max\n fileModifiedTime: new Date('2023-01-01'), // a\n isSkipped: false, // Before the range\n },\n {\n // |-a-min-|\n skipIfModifiedBefore: '2024-01-01', // min\n fileModifiedTime: new Date('2023-01-01'), // a\n isSkipped: false, // Before the skipIfModifiedBefore\n },\n {\n // |-min-a-|\n skipIfModifiedBefore: '2024-01-01', // min\n fileModifiedTime: new Date('2025-01-01'), // a\n isSkipped: true, // After the skipIfModifiedBefore\n },\n {\n // |-a-max-|\n skipIfModifiedAfter: '2026-01-01', // max\n fileModifiedTime: new Date('2027-01-01'), // a\n isSkipped: true, // Before the skipIfModifiedAfter\n },\n {\n // |-max-a-|\n skipIfModifiedAfter: '2026-01-01', // max\n fileModifiedTime: new Date('2027-01-01'), // a\n isSkipped: true, // After the skipIfModifiedAfter\n },\n {\n // |-min-max-a-|\n skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1000, // min // 3 year ago\n skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1000, // max // 1 year\n fileModifiedTime: new Date('2025-01-01'), // a\n isSkipped: false, // Before the range\n },\n {\n // |-a-max-|\n skipIfModifiedAfter: 0, // max // now\n fileModifiedTime: new Date('2024-01-01'), // a\n isSkipped: false, // Before the skipIfModifiedAfter\n },\n {\n // |-min-a-|\n skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1000, // max // 1 year\n fileModifiedTime: new Date('2025-01-01'), // a\n isSkipped: true, // Before the skipIfModifiedAfter\n },\n {\n // |-min-a-max-|\n skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1000, // min // 3 year ago\n skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1000, // max // 1 year\n fileModifiedTime: new Date('2023-01-01'), // a\n isSkipped: true, // After the range\n },\n {\n // |-a-min-max-|\n skipIfModifiedBefore: 3 * 365 * 24 * 60 * 60 * 1000, // min // 3 year ago\n skipIfModifiedAfter: 1 * 365 * 24 * 60 * 60 * 1000, // max // 1 year\n fileModifiedTime: new Date('2020-01-01'), // a\n isSkipped: false, // Before the range\n },\n {\n // |-min-max-a-|\n skipIfModifiedBefore: '2024-01-01T00:00:00Z', // min\n skipIfModifiedAfter: '2026-01-01T00:00:00Z', // max\n fileModifiedTime: new Date('2027-01-01'), // a\n isSkipped: false, // After the range\n },\n ];\n\n testList.forEach((test) => {\n it(`should correctly handle string date inputs (absolute time) outside of the range`, () => {\n const filePath = 'test/file.txt';\n\n // Simulate the file's last modification time for this test case\n (checkLastUpdateTime as unknown as Mock).mockReturnValue(\n // If a specific mocked modification time is provided, use it. Otherwise, fall back to \"now\".\n test.fileModifiedTime ?? new Date()\n );\n\n const { isSkipped } = checkFileModifiedRange(filePath, {\n skipIfModifiedBefore: test.skipIfModifiedBefore,\n skipIfModifiedAfter: test.skipIfModifiedAfter,\n });\n\n expect(isSkipped).toBe(test.isSkipped);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var checkLastUpdateTime_exports = {};
20
+ __export(checkLastUpdateTime_exports, {
21
+ checkLastUpdateTime: () => checkLastUpdateTime
22
+ });
23
+ module.exports = __toCommonJS(checkLastUpdateTime_exports);
24
+ var import_fs = require("fs");
25
+ const checkLastUpdateTime = (filePath) => {
26
+ const stats = (0, import_fs.statSync)(filePath);
27
+ return new Date(stats.mtime);
28
+ };
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ checkLastUpdateTime
32
+ });
33
+ //# sourceMappingURL=checkLastUpdateTime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/checkLastUpdateTime.ts"],"sourcesContent":["import { statSync } from 'fs';\n\n/**\n * Returns the last modification date of a file.\n *\n * @param filePath - Absolute or relative path to the file to inspect.\n * @returns Date instance representing the file's last modified time (mtime).\n * @throws Will propagate any error thrown by fs.statSync (e.g., file not found).\n */\nexport const checkLastUpdateTime = (filePath: string): Date => {\n const stats = statSync(filePath);\n return new Date(stats.mtime);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAyB;AASlB,MAAM,sBAAsB,CAAC,aAA2B;AAC7D,QAAM,YAAQ,oBAAS,QAAQ;AAC/B,SAAO,IAAI,KAAK,MAAM,KAAK;AAC7B;","names":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var chunkInference_exports = {};
20
+ __export(chunkInference_exports, {
21
+ chunkInference: () => chunkInference
22
+ });
23
+ module.exports = __toCommonJS(chunkInference_exports);
24
+ var import_api = require("@intlayer/api");
25
+ var import_config = require("@intlayer/config");
26
+ const chunkInference = async (messages, aiOptions, oAuth2AccessToken) => {
27
+ let lastResult;
28
+ await (0, import_config.retryManager)(async () => {
29
+ const response = await (0, import_api.getAiAPI)().customQuery(
30
+ {
31
+ aiOptions,
32
+ messages
33
+ },
34
+ {
35
+ ...oAuth2AccessToken && {
36
+ headers: {
37
+ Authorization: `Bearer ${oAuth2AccessToken}`
38
+ }
39
+ }
40
+ }
41
+ );
42
+ if (!response.data) {
43
+ throw new Error("No response from AI API");
44
+ }
45
+ const { fileContent, tokenUsed } = response.data;
46
+ const newContent = fileContent.replaceAll("///chunksStart///", "").replaceAll("///chunkStart///", "").replaceAll("///chunksEnd///", "").replaceAll("///chunkEnd///", "");
47
+ lastResult = {
48
+ fileContent: newContent,
49
+ tokenUsed
50
+ };
51
+ })();
52
+ return lastResult;
53
+ };
54
+ // Annotate the CommonJS export names for ESM import in node:
55
+ 0 && (module.exports = {
56
+ chunkInference
57
+ });
58
+ //# sourceMappingURL=chunkInference.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/chunkInference.ts"],"sourcesContent":["import { type AIOptions, type Messages, getAiAPI } from '@intlayer/api';\nimport { retryManager } from '@intlayer/config';\n\ntype ChunkInferenceResult = {\n fileContent: string;\n tokenUsed: number;\n};\n\n/**\n * Translates a single chunk via the OpenAI API.\n * Includes retry logic if the call fails.\n */\nexport const chunkInference = async (\n messages: Messages,\n aiOptions?: AIOptions,\n oAuth2AccessToken?: string\n): Promise<ChunkInferenceResult> => {\n let lastResult: ChunkInferenceResult;\n\n await retryManager(async () => {\n const response = await getAiAPI().customQuery(\n {\n aiOptions,\n messages,\n },\n {\n ...(oAuth2AccessToken && {\n headers: {\n Authorization: `Bearer ${oAuth2AccessToken}`,\n },\n }),\n }\n );\n\n if (!response.data) {\n throw new Error('No response from AI API');\n }\n\n const { fileContent, tokenUsed } = response.data;\n\n const newContent = fileContent\n .replaceAll('///chunksStart///', '')\n .replaceAll('///chunkStart///', '')\n .replaceAll('///chunksEnd///', '')\n .replaceAll('///chunkEnd///', '');\n\n lastResult = {\n fileContent: newContent,\n tokenUsed,\n };\n })();\n\n return lastResult!;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAwD;AACxD,oBAA6B;AAWtB,MAAM,iBAAiB,OAC5B,UACA,WACA,sBACkC;AAClC,MAAI;AAEJ,YAAM,4BAAa,YAAY;AAC7B,UAAM,WAAW,UAAM,qBAAS,EAAE;AAAA,MAChC;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,GAAI,qBAAqB;AAAA,UACvB,SAAS;AAAA,YACP,eAAe,UAAU,iBAAiB;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,UAAM,EAAE,aAAa,UAAU,IAAI,SAAS;AAE5C,UAAM,aAAa,YAChB,WAAW,qBAAqB,EAAE,EAClC,WAAW,oBAAoB,EAAE,EACjC,WAAW,mBAAmB,EAAE,EAChC,WAAW,kBAAkB,EAAE;AAElC,iBAAa;AAAA,MACX,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC,EAAE;AAEH,SAAO;AACT;","names":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var fixChunkStartEndChars_exports = {};
20
+ __export(fixChunkStartEndChars_exports, {
21
+ fixChunkStartEndChars: () => fixChunkStartEndChars
22
+ });
23
+ module.exports = __toCommonJS(fixChunkStartEndChars_exports);
24
+ const CHAR_TO_CHECK_FORMATTING = ["```", "\n\n", "\n", "---", "{{", "}}"];
25
+ const escapeForRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\n/g, "\\n");
26
+ const FORMATTING_REGEX_SOURCE = `(?:${CHAR_TO_CHECK_FORMATTING.map(escapeForRegExp).join("|")})+`;
27
+ const LEADING_FORMATTING_REGEX = new RegExp(`^${FORMATTING_REGEX_SOURCE}`);
28
+ const TRAILING_FORMATTING_REGEX = new RegExp(`${FORMATTING_REGEX_SOURCE}$`);
29
+ const fixChunkStartEndChars = (reviewedChunkResult, baseChunkContext) => {
30
+ let result = reviewedChunkResult;
31
+ const baseLeading = baseChunkContext.match(LEADING_FORMATTING_REGEX)?.[0] ?? "";
32
+ const baseTrailing = baseChunkContext.match(TRAILING_FORMATTING_REGEX)?.[0] ?? "";
33
+ const resultLeading = result.match(LEADING_FORMATTING_REGEX)?.[0] ?? "";
34
+ const resultTrailing = result.match(TRAILING_FORMATTING_REGEX)?.[0] ?? "";
35
+ if (baseLeading !== resultLeading) {
36
+ result = baseLeading + result.slice(resultLeading.length);
37
+ }
38
+ if (baseTrailing !== resultTrailing) {
39
+ result = result.slice(0, result.length - resultTrailing.length) + baseTrailing;
40
+ }
41
+ return result;
42
+ };
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ fixChunkStartEndChars
46
+ });
47
+ //# sourceMappingURL=fixChunkStartEndChars.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/fixChunkStartEndChars.ts"],"sourcesContent":["const CHAR_TO_CHECK_FORMATTING = ['```', '\\n\\n', '\\n', '---', '{{', '}}'];\n\n// Escape a string for use in RegExp\nconst escapeForRegExp = (str: string) =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\n');\n\n// Build once the regex that matches any combination of the formatting chars appearing\n// sequentially at the beginning or at the end of a string.\nconst FORMATTING_REGEX_SOURCE = `(?:${CHAR_TO_CHECK_FORMATTING.map(escapeForRegExp).join('|')})+`;\nconst LEADING_FORMATTING_REGEX = new RegExp(`^${FORMATTING_REGEX_SOURCE}`);\nconst TRAILING_FORMATTING_REGEX = new RegExp(`${FORMATTING_REGEX_SOURCE}$`);\n\nexport const fixChunkStartEndChars = (\n reviewedChunkResult: string,\n baseChunkContext: string\n) => {\n let result = reviewedChunkResult;\n\n const baseLeading =\n baseChunkContext.match(LEADING_FORMATTING_REGEX)?.[0] ?? '';\n const baseTrailing =\n baseChunkContext.match(TRAILING_FORMATTING_REGEX)?.[0] ?? '';\n\n const resultLeading = result.match(LEADING_FORMATTING_REGEX)?.[0] ?? '';\n const resultTrailing = result.match(TRAILING_FORMATTING_REGEX)?.[0] ?? '';\n\n // Fix leading formatting\n if (baseLeading !== resultLeading) {\n // Remove current leading formatting found in result and prepend the correct one\n result = baseLeading + result.slice(resultLeading.length);\n }\n\n // Fix trailing formatting\n if (baseTrailing !== resultTrailing) {\n // Remove current trailing formatting found in result and append the correct one\n result =\n result.slice(0, result.length - resultTrailing.length) + baseTrailing;\n }\n\n return result;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,2BAA2B,CAAC,OAAO,QAAQ,MAAM,OAAO,MAAM,IAAI;AAGxE,MAAM,kBAAkB,CAAC,QACvB,IAAI,QAAQ,uBAAuB,MAAM,EAAE,QAAQ,OAAO,KAAK;AAIjE,MAAM,0BAA0B,MAAM,yBAAyB,IAAI,eAAe,EAAE,KAAK,GAAG,CAAC;AAC7F,MAAM,2BAA2B,IAAI,OAAO,IAAI,uBAAuB,EAAE;AACzE,MAAM,4BAA4B,IAAI,OAAO,GAAG,uBAAuB,GAAG;AAEnE,MAAM,wBAAwB,CACnC,qBACA,qBACG;AACH,MAAI,SAAS;AAEb,QAAM,cACJ,iBAAiB,MAAM,wBAAwB,IAAI,CAAC,KAAK;AAC3D,QAAM,eACJ,iBAAiB,MAAM,yBAAyB,IAAI,CAAC,KAAK;AAE5D,QAAM,gBAAgB,OAAO,MAAM,wBAAwB,IAAI,CAAC,KAAK;AACrE,QAAM,iBAAiB,OAAO,MAAM,yBAAyB,IAAI,CAAC,KAAK;AAGvE,MAAI,gBAAgB,eAAe;AAEjC,aAAS,cAAc,OAAO,MAAM,cAAc,MAAM;AAAA,EAC1D;AAGA,MAAI,iBAAiB,gBAAgB;AAEnC,aACE,OAAO,MAAM,GAAG,OAAO,SAAS,eAAe,MAAM,IAAI;AAAA,EAC7D;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_fixChunkStartEndChars = require('./fixChunkStartEndChars.cjs');
4
+ const visible = (str) => str.replace(/\n/g, "\\n");
5
+ (0, import_vitest.describe)("fixChunkStartEndChars", () => {
6
+ (0, import_vitest.it)("should add the missing starting character when the base chunk starts with it", () => {
7
+ const base = "\nHello world";
8
+ const reviewed = "Hello world";
9
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
10
+ (0, import_vitest.expect)(visible(fixed)).toEqual(visible(base));
11
+ });
12
+ (0, import_vitest.it)("should add the missing ending character when the base chunk ends with it", () => {
13
+ const base = 'console.log("hi")```';
14
+ const reviewed = 'console.log("hi")';
15
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
16
+ (0, import_vitest.expect)(fixed).toEqual(base);
17
+ });
18
+ (0, import_vitest.it)("should remove the extra starting character when the base chunk does not start with it", () => {
19
+ const base = "Hello world";
20
+ const reviewed = "\nHello world";
21
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
22
+ (0, import_vitest.expect)(visible(fixed)).toEqual(visible(base));
23
+ });
24
+ (0, import_vitest.it)("should remove the extra ending character when the base chunk does not end with it", () => {
25
+ const base = "Hello world";
26
+ const reviewed = "Hello world---";
27
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
28
+ (0, import_vitest.expect)(fixed).toEqual(base);
29
+ });
30
+ (0, import_vitest.it)("should return the reviewed chunk untouched when already matching the base structure", () => {
31
+ const base = "Plain text without special markers";
32
+ const reviewed = "Plain text without special markers";
33
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
34
+ (0, import_vitest.expect)(fixed).toEqual(base);
35
+ });
36
+ (0, import_vitest.it)("should not remove ```` when the base chunk starts with it", () => {
37
+ const base = "```test";
38
+ const reviewed = "```test";
39
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
40
+ (0, import_vitest.expect)(fixed).toEqual(base);
41
+ });
42
+ (0, import_vitest.it)("should add ```` when the base chunk ends with it", () => {
43
+ const base = "```test";
44
+ const reviewed = "test";
45
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
46
+ (0, import_vitest.expect)(fixed).toEqual(base);
47
+ });
48
+ (0, import_vitest.it)("should remove ```` when the base chunk starts with it", () => {
49
+ const base = "test";
50
+ const reviewed = "```test";
51
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
52
+ (0, import_vitest.expect)(fixed).toEqual(base);
53
+ });
54
+ (0, import_vitest.it)("should not remove ```` when the base chunk finishes with it", () => {
55
+ const base = "test```";
56
+ const reviewed = "test```";
57
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
58
+ (0, import_vitest.expect)(fixed).toEqual(base);
59
+ });
60
+ (0, import_vitest.it)("should add ```` when the base chunk finishes with it", () => {
61
+ const base = "test```";
62
+ const reviewed = "test";
63
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
64
+ (0, import_vitest.expect)(fixed).toEqual(base);
65
+ });
66
+ (0, import_vitest.it)("should remove ```` when the base chunk finishes with it", () => {
67
+ const base = "test";
68
+ const reviewed = "test```";
69
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(reviewed, base);
70
+ (0, import_vitest.expect)(fixed).toEqual(base);
71
+ });
72
+ (0, import_vitest.it)("should add the missing char is a char list that matching char list", () => {
73
+ const baseChunk = "```\n\n### 2. **Check if the command is registered**\n";
74
+ const aiGeneratedResult = "\n\n### 2. **V\xE9rifiez si la commande est enregistr\xE9e**\n";
75
+ const fixedResultError = "```### 2. **V\xE9rifiez si la commande est enregistr\xE9e**\n";
76
+ const fixedResultSuccess = "```\n\n### 2. **V\xE9rifiez si la commande est enregistr\xE9e**\n";
77
+ const fixed = (0, import_fixChunkStartEndChars.fixChunkStartEndChars)(aiGeneratedResult, baseChunk);
78
+ (0, import_vitest.expect)(fixed).toMatch(/^```\n\n### 2\./);
79
+ });
80
+ });
81
+ //# sourceMappingURL=fixChunkStartEndChars.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/fixChunkStartEndChars.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { fixChunkStartEndChars } from './fixChunkStartEndChars';\n\n// Helper to visualise new line at the beginning/end of a string when debugging\nconst visible = (str: string) => str.replace(/\\n/g, '\\\\n');\n\ndescribe('fixChunkStartEndChars', () => {\n it('should add the missing starting character when the base chunk starts with it', () => {\n const base = '\\nHello world';\n const reviewed = 'Hello world';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(visible(fixed)).toEqual(visible(base));\n });\n\n it('should add the missing ending character when the base chunk ends with it', () => {\n const base = 'console.log(\"hi\")```';\n const reviewed = 'console.log(\"hi\")';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should remove the extra starting character when the base chunk does not start with it', () => {\n const base = 'Hello world';\n const reviewed = '\\nHello world';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(visible(fixed)).toEqual(visible(base));\n });\n\n it('should remove the extra ending character when the base chunk does not end with it', () => {\n const base = 'Hello world';\n const reviewed = 'Hello world---';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should return the reviewed chunk untouched when already matching the base structure', () => {\n const base = 'Plain text without special markers';\n const reviewed = 'Plain text without special markers';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should not remove ```` when the base chunk starts with it', () => {\n const base = '```test';\n const reviewed = '```test';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should add ```` when the base chunk ends with it', () => {\n const base = '```test';\n const reviewed = 'test';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should remove ```` when the base chunk starts with it', () => {\n const base = 'test';\n const reviewed = '```test';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should not remove ```` when the base chunk finishes with it', () => {\n const base = 'test```';\n const reviewed = 'test```';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should add ```` when the base chunk finishes with it', () => {\n const base = 'test```';\n const reviewed = 'test';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should remove ```` when the base chunk finishes with it', () => {\n const base = 'test';\n const reviewed = 'test```';\n\n const fixed = fixChunkStartEndChars(reviewed, base);\n expect(fixed).toEqual(base);\n });\n\n it('should add the missing char is a char list that matching char list', () => {\n // Here the base chunk as entry for the AI\n const baseChunk =\n '```\\n' + '\\n' + '### 2. **Check if the command is registered**\\n';\n\n // But the translation AI returned a content that is wrong, because the firsts chars are missing\n const aiGeneratedResult =\n '\\n' + '\\n' + '### 2. **Vérifiez si la commande est enregistrée**\\n';\n\n // The current result is this one, but it's wrong because the \\n are missing\n const fixedResultError =\n '```### 2. **Vérifiez si la commande est enregistrée**\\n';\n\n // The correct result should be this one, with the \\n at the beginning\n const fixedResultSuccess =\n '```\\n' + '\\n' + '### 2. **Vérifiez si la commande est enregistrée**\\n';\n\n const fixed = fixChunkStartEndChars(aiGeneratedResult, baseChunk);\n\n // Check if it start by '```\\n' + '\\n' + '### 2.'\n expect(fixed).toMatch(/^```\\n\\n### 2\\./);\n });\n});\n"],"mappings":";AAAA,oBAAqC;AACrC,mCAAsC;AAGtC,MAAM,UAAU,CAAC,QAAgB,IAAI,QAAQ,OAAO,KAAK;AAAA,IAEzD,wBAAS,yBAAyB,MAAM;AACtC,wBAAG,gFAAgF,MAAM;AACvF,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,QAAQ,KAAK,CAAC,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,EAC9C,CAAC;AAED,wBAAG,4EAA4E,MAAM;AACnF,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,yFAAyF,MAAM;AAChG,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,QAAQ,KAAK,CAAC,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,EAC9C,CAAC;AAED,wBAAG,qFAAqF,MAAM;AAC5F,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,uFAAuF,MAAM;AAC9F,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,6DAA6D,MAAM;AACpE,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,oDAAoD,MAAM;AAC3D,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,yDAAyD,MAAM;AAChE,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,+DAA+D,MAAM;AACtE,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,wDAAwD,MAAM;AAC/D,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,2DAA2D,MAAM;AAClE,UAAM,OAAO;AACb,UAAM,WAAW;AAEjB,UAAM,YAAQ,oDAAsB,UAAU,IAAI;AAClD,8BAAO,KAAK,EAAE,QAAQ,IAAI;AAAA,EAC5B,CAAC;AAED,wBAAG,sEAAsE,MAAM;AAE7E,UAAM,YACJ;AAGF,UAAM,oBACJ;AAGF,UAAM,mBACJ;AAGF,UAAM,qBACJ;AAEF,UAAM,YAAQ,oDAAsB,mBAAmB,SAAS;AAGhE,8BAAO,KAAK,EAAE,QAAQ,iBAAiB;AAAA,EACzC,CAAC;AACH,CAAC;","names":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var formatTimeDiff_exports = {};
20
+ __export(formatTimeDiff_exports, {
21
+ formatTimeDiff: () => formatTimeDiff
22
+ });
23
+ module.exports = __toCommonJS(formatTimeDiff_exports);
24
+ const formatTimeDiff = (realtiveTime) => {
25
+ const diff = realtiveTime.getTime();
26
+ const MS_IN_SECOND = 1e3;
27
+ const MS_IN_MINUTE = 60 * MS_IN_SECOND;
28
+ const MS_IN_HOUR = 60 * MS_IN_MINUTE;
29
+ const MS_IN_DAY = 24 * MS_IN_HOUR;
30
+ const days = Math.floor(diff / MS_IN_DAY);
31
+ const hours = Math.floor(diff % MS_IN_DAY / MS_IN_HOUR);
32
+ const minutes = Math.floor(diff % MS_IN_HOUR / MS_IN_MINUTE);
33
+ const seconds = Math.floor(diff % MS_IN_MINUTE / MS_IN_SECOND);
34
+ if (days > 0) {
35
+ return `${days}d ${hours}h ${minutes}m ${seconds}s`;
36
+ }
37
+ if (hours > 0) {
38
+ return `${hours}h ${minutes}m ${seconds}s`;
39
+ }
40
+ return `${minutes}m ${seconds}s`;
41
+ };
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ formatTimeDiff
45
+ });
46
+ //# sourceMappingURL=formatTimeDiff.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/formatTimeDiff.ts"],"sourcesContent":["export const formatTimeDiff = (realtiveTime: Date): string => {\n const diff = realtiveTime.getTime();\n\n const MS_IN_SECOND = 1000;\n const MS_IN_MINUTE = 60 * MS_IN_SECOND;\n const MS_IN_HOUR = 60 * MS_IN_MINUTE;\n const MS_IN_DAY = 24 * MS_IN_HOUR;\n\n const days = Math.floor(diff / MS_IN_DAY);\n const hours = Math.floor((diff % MS_IN_DAY) / MS_IN_HOUR);\n const minutes = Math.floor((diff % MS_IN_HOUR) / MS_IN_MINUTE);\n const seconds = Math.floor((diff % MS_IN_MINUTE) / MS_IN_SECOND);\n\n if (days > 0) {\n return `${days}d ${hours}h ${minutes}m ${seconds}s`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes}m ${seconds}s`;\n }\n\n return `${minutes}m ${seconds}s`;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,iBAAiB,CAAC,iBAA+B;AAC5D,QAAM,OAAO,aAAa,QAAQ;AAElC,QAAM,eAAe;AACrB,QAAM,eAAe,KAAK;AAC1B,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,KAAK;AAEvB,QAAM,OAAO,KAAK,MAAM,OAAO,SAAS;AACxC,QAAM,QAAQ,KAAK,MAAO,OAAO,YAAa,UAAU;AACxD,QAAM,UAAU,KAAK,MAAO,OAAO,aAAc,YAAY;AAC7D,QAAM,UAAU,KAAK,MAAO,OAAO,eAAgB,YAAY;AAE/D,MAAI,OAAO,GAAG;AACZ,WAAO,GAAG,IAAI,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EAClD;AACA,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AAEA,SAAO,GAAG,OAAO,KAAK,OAAO;AAC/B;","names":[]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_formatTimeDiff = require('./formatTimeDiff.cjs');
4
+ (0, import_vitest.describe)("formatTimeDiff", () => {
5
+ const fixedNow = /* @__PURE__ */ new Date("2025-01-01T00:00:00Z");
6
+ (0, import_vitest.beforeEach)(() => {
7
+ import_vitest.vi.useFakeTimers();
8
+ import_vitest.vi.setSystemTime(fixedNow);
9
+ });
10
+ (0, import_vitest.afterEach)(() => {
11
+ import_vitest.vi.useRealTimers();
12
+ });
13
+ (0, import_vitest.it)("formats differences containing days", () => {
14
+ const past = new Date(
15
+ 2 * 24 * 60 * 60 * 1e3 + // 2 days
16
+ 3 * 60 * 60 * 1e3 + // 3 hours
17
+ 4 * 60 * 1e3 + // 4 minutes
18
+ 5 * 1e3
19
+ // 5 seconds
20
+ );
21
+ (0, import_vitest.expect)((0, import_formatTimeDiff.formatTimeDiff)(past)).toBe("2d 3h 4m 5s");
22
+ });
23
+ (0, import_vitest.it)("formats differences containing hours but no days", () => {
24
+ const past = new Date(3 * 60 * 60 * 1e3 + 15 * 60 * 1e3 + 20 * 1e3);
25
+ (0, import_vitest.expect)((0, import_formatTimeDiff.formatTimeDiff)(past)).toBe("3h 15m 20s");
26
+ });
27
+ (0, import_vitest.it)("formats differences containing only minutes and seconds", () => {
28
+ const past = new Date(7 * 60 * 1e3 + 45 * 1e3);
29
+ (0, import_vitest.expect)((0, import_formatTimeDiff.formatTimeDiff)(past)).toBe("7m 45s");
30
+ });
31
+ });
32
+ //# sourceMappingURL=formatTimeDiff.test.cjs.map