|
1 | 1 | // ten skrypt to początek nowego CLI do devTranslatea |
2 | 2 | import { Chain, Languages, ModelTypes } from '@/src/zeus/index.js'; |
3 | | -import { readdirSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs'; |
| 3 | +import { readdirSync, writeFileSync, readFileSync, mkdirSync, statSync, existsSync } from 'node:fs'; |
4 | 4 | import * as path from 'node:path'; |
5 | 5 | import PQueue from 'p-queue'; |
6 | 6 |
|
7 | 7 | const DEV_TRANSLATE_HOST = process.env.OVERRIDE_DEV_TRANSLATE_HOST || 'https://backend.devtranslate.app/graphql'; |
| 8 | +const TIMESTAMP_FILE = '.dev-translate.timestamp.json'; |
| 9 | +const timestampFilePath = path.join(process.cwd(), TIMESTAMP_FILE); |
8 | 10 |
|
9 | 11 | export type BackendProps = Pick< |
10 | 12 | ModelTypes['TranslateInput'], |
@@ -97,17 +99,26 @@ const getLocalePaths = ({ |
97 | 99 | localeDir, |
98 | 100 | logLevel = LogLevels.info, |
99 | 101 | fileNameFilter, |
| 102 | + lastTranslationTimeStamp, |
100 | 103 | }: { |
101 | 104 | cwd: string; |
102 | 105 | localeDir: string; |
103 | 106 | srcLang: LangPair; |
104 | 107 | logLevel?: LogLevels; |
105 | 108 | fileNameFilter?: string; |
| 109 | + lastTranslationTimeStamp?: number; |
106 | 110 | }) => { |
107 | 111 | const localePath = path.join(cwd, localeDir); |
108 | 112 | innerLogger(logLevel)('Locale path:', localePath)(LogLevels.debug); |
109 | 113 | const srcLangPath = path.join(localePath, srcLang.folderName); |
110 | | - let localeSrcFiles = readdirSync(srcLangPath).filter((f) => f.endsWith('.json')); |
| 114 | + let localeSrcFiles = readdirSync(srcLangPath) |
| 115 | + .filter((f) => f.endsWith('.json')) |
| 116 | + .filter((lsf) => { |
| 117 | + if (lastTranslationTimeStamp) { |
| 118 | + return statSync(path.join(srcLangPath, lsf)).mtimeMs > lastTranslationTimeStamp; |
| 119 | + } |
| 120 | + return true; |
| 121 | + }); |
111 | 122 | if (fileNameFilter) localeSrcFiles = localeSrcFiles.filter((lsf) => path.parse(lsf).base === fileNameFilter); |
112 | 123 | const outLangs = getOutputLanguages(localePath, srcLang.folderName); |
113 | 124 | innerLogger(logLevel)( |
@@ -135,7 +146,16 @@ export const predictLocaleFolder = async ({ |
135 | 146 | srcLang: LangPair; |
136 | 147 | logLevel?: LogLevels; |
137 | 148 | } & BackendProps) => { |
138 | | - const { localeSrcFiles, outLangs, srcLangPath } = getLocalePaths({ cwd, localeDir, srcLang, logLevel }); |
| 149 | + const writeExists = existsSync(timestampFilePath); |
| 150 | + const { localeSrcFiles, outLangs, srcLangPath } = getLocalePaths({ |
| 151 | + cwd, |
| 152 | + localeDir, |
| 153 | + srcLang, |
| 154 | + logLevel, |
| 155 | + lastTranslationTimeStamp: writeExists |
| 156 | + ? (JSON.parse(readFileSync(timestampFilePath, 'utf-8')).timestamp as number) |
| 157 | + : undefined, |
| 158 | + }); |
139 | 159 | const translateChain = await Chain(DEV_TRANSLATE_HOST, { |
140 | 160 | headers: { |
141 | 161 | 'api-key': apiKey, |
@@ -195,11 +215,15 @@ export const translateLocaleFolder = async ({ |
195 | 215 | } & BackendProps) => { |
196 | 216 | let activeExecutions = 0; |
197 | 217 | const queue = new PQueue({ concurrency: 1 }); |
| 218 | + const writeExists = existsSync(timestampFilePath); |
198 | 219 | const { localePath, localeSrcFiles, outLangs, srcLangPath } = getLocalePaths({ |
199 | 220 | cwd, |
200 | 221 | localeDir, |
201 | 222 | srcLang, |
202 | 223 | logLevel, |
| 224 | + lastTranslationTimeStamp: writeExists |
| 225 | + ? (JSON.parse(readFileSync(timestampFilePath, 'utf-8')).timestamp as number) |
| 226 | + : undefined, |
203 | 227 | fileNameFilter, |
204 | 228 | }); |
205 | 229 | const translateChain = Chain(DEV_TRANSLATE_HOST, { |
@@ -261,6 +285,7 @@ export const translateLocaleFolder = async ({ |
261 | 285 | innerLogger(logLevel)( |
262 | 286 | `All translations consumed ${results.reduce((a, b) => a + (b.consumedTokens as number), 0)} tokens`, |
263 | 287 | )(LogLevels.info); |
| 288 | + writeFileSync(path.join(process.cwd(), TIMESTAMP_FILE), JSON.stringify({ timestamp: new Date().valueOf() })); |
264 | 289 | return results; |
265 | 290 | }; |
266 | 291 |
|
|
0 commit comments