@goatlab/node-backend 0.2.6 → 1.0.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 (34) hide show
  1. package/README.md +146 -14
  2. package/dist/container/Container.d.ts +86 -2
  3. package/dist/container/Container.js +260 -10
  4. package/dist/container/Container.js.map +1 -1
  5. package/dist/container/examples/batch-operations.example.d.ts +1 -0
  6. package/dist/container/examples/batch-operations.example.js +165 -0
  7. package/dist/container/examples/batch-operations.example.js.map +1 -0
  8. package/dist/container/types.d.ts +50 -0
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/bootstraps/getExpressTrpcApp.js +69 -7
  12. package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -1
  13. package/dist/server/middleware/memoryMonitor.example.d.ts +1 -0
  14. package/dist/server/middleware/memoryMonitor.example.js +109 -0
  15. package/dist/server/middleware/memoryMonitor.example.js.map +1 -0
  16. package/dist/server/middleware/memoryMonitor.middleware.d.ts +42 -0
  17. package/dist/server/middleware/memoryMonitor.middleware.js +134 -0
  18. package/dist/server/middleware/memoryMonitor.middleware.js.map +1 -0
  19. package/dist/server/services/secrets/examples/container-preload.example.d.ts +1 -0
  20. package/dist/server/services/secrets/examples/container-preload.example.js +148 -0
  21. package/dist/server/services/secrets/examples/container-preload.example.js.map +1 -0
  22. package/dist/server/services/secrets/index.d.ts +1 -0
  23. package/dist/server/services/secrets/index.js +6 -0
  24. package/dist/server/services/secrets/index.js.map +1 -0
  25. package/dist/server/services/secrets/secret.service.d.ts +46 -6
  26. package/dist/server/services/secrets/secret.service.js +256 -30
  27. package/dist/server/services/secrets/secret.service.js.map +1 -1
  28. package/dist/server/services/translations/translation.model.js +2 -1
  29. package/dist/server/services/translations/translation.model.js.map +1 -1
  30. package/dist/server/services/translations/translation.service.d.ts +8 -1
  31. package/dist/server/services/translations/translation.service.js +123 -13
  32. package/dist/server/services/translations/translation.service.js.map +1 -1
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +1 -1
@@ -2,25 +2,183 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SecretService = void 0;
4
4
  const fs = require("fs");
5
+ const fs_1 = require("fs");
5
6
  const undici_1 = require("undici");
6
7
  const node_utils_1 = require("@goatlab/node-utils");
7
8
  const colors_1 = require("kleur/colors");
9
+ // Enhanced cache with TTL support
8
10
  const memoryCache = {};
11
+ // Default TTL in milliseconds (5 minutes)
12
+ const DEFAULT_TTL_MS = 5 * 60 * 1000;
9
13
  class SecretService {
10
14
  provider;
11
15
  location;
12
16
  encryptionKey;
13
17
  vaultConfig;
14
- constructor({ provider, location, encryptionKey, vaultConfig }) {
15
- this.provider = provider;
16
- this.location = location;
17
- this.encryptionKey = encryptionKey;
18
- this.vaultConfig = vaultConfig;
18
+ cacheTTL;
19
+ preloadedSecrets;
20
+ isPreloaded = false;
21
+ fileWatcher;
22
+ constructor(config) {
23
+ this.provider = config.provider;
24
+ this.location = config.location;
25
+ this.encryptionKey = config.encryptionKey;
26
+ this.vaultConfig = config.vaultConfig;
27
+ this.cacheTTL = config.cacheTTL ?? DEFAULT_TTL_MS;
19
28
  }
20
- // We should cache this call
29
+ /**
30
+ * Preload secrets asynchronously for synchronous access later
31
+ * This method loads secrets once and stores them in the instance
32
+ */
33
+ async preload() {
34
+ try {
35
+ const secrets = await this.loadSecretsAsync();
36
+ this.preloadedSecrets = secrets;
37
+ this.isPreloaded = true;
38
+ // Set up file watching for automatic invalidation (FILE provider only)
39
+ if (this.provider === 'FILE' && !this.fileWatcher) {
40
+ this.setupFileWatcher();
41
+ }
42
+ }
43
+ catch (error) {
44
+ this.isPreloaded = false;
45
+ throw new Error(`Failed to preload secrets: ${error.message}`);
46
+ }
47
+ }
48
+ /**
49
+ * Invalidate preloaded secrets and stop file watching
50
+ */
51
+ async invalidate() {
52
+ this.preloadedSecrets = undefined;
53
+ this.isPreloaded = false;
54
+ // Clear cache to force reload
55
+ if (this.provider === 'FILE') {
56
+ delete memoryCache[this.location];
57
+ }
58
+ else if (this.provider === 'ENV') {
59
+ delete memoryCache[`env_${this.location}`];
60
+ }
61
+ else if (this.provider === 'VAULT' && this.vaultConfig) {
62
+ delete memoryCache[`vault_${this.vaultConfig.endpoint}_${this.location}`];
63
+ }
64
+ // Stop file watching
65
+ if (this.fileWatcher) {
66
+ this.fileWatcher.close();
67
+ this.fileWatcher = undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Set up file watching for automatic invalidation
72
+ */
73
+ setupFileWatcher() {
74
+ if (this.provider !== 'FILE')
75
+ return;
76
+ try {
77
+ this.fileWatcher = fs.watch(this.location, async (eventType) => {
78
+ if (eventType === 'change') {
79
+ console.log(`🔄 Secret file changed: ${(0, colors_1.magenta)(this.location)}`);
80
+ await this.invalidate();
81
+ // Optionally auto-reload
82
+ try {
83
+ await this.preload();
84
+ console.log(`✅ Secrets reloaded successfully`);
85
+ }
86
+ catch (error) {
87
+ console.error(`❌ Failed to reload secrets: ${error.message}`);
88
+ }
89
+ }
90
+ });
91
+ }
92
+ catch (error) {
93
+ console.warn(`⚠️ Failed to set up file watching: ${error.message}`);
94
+ }
95
+ }
96
+ /**
97
+ * Load secrets asynchronously with decryption for all providers
98
+ */
99
+ async loadSecretsAsync() {
100
+ let secrets;
101
+ switch (this.provider) {
102
+ case 'FILE':
103
+ secrets = await this.loadSecretsFromFileAsync();
104
+ break;
105
+ case 'ENV':
106
+ secrets = this.loadSecretsFromEnv();
107
+ break;
108
+ case 'VAULT':
109
+ secrets = await this.loadSecretsFromVault();
110
+ break;
111
+ case 'GCP':
112
+ secrets = this.loadSecretsFromGCP();
113
+ break;
114
+ default:
115
+ throw new Error(`Unknown provider: ${this.provider}`);
116
+ }
117
+ // No need to decrypt here as each provider method already handles decryption
118
+ return secrets;
119
+ }
120
+ // Helper method to check if cache entry is valid
121
+ isCacheValid(entry) {
122
+ if (!entry)
123
+ return false;
124
+ if (!entry.expiresAt)
125
+ return true; // No expiration set
126
+ return Date.now() < entry.expiresAt;
127
+ }
128
+ // Helper method to set cache with TTL
129
+ setCache(key, data, ttl) {
130
+ const expiresAt = ttl ? Date.now() + ttl : undefined;
131
+ memoryCache[key] = { data, expiresAt };
132
+ }
133
+ // Helper method to get from cache
134
+ getCache(key) {
135
+ const entry = memoryCache[key];
136
+ if (this.isCacheValid(entry)) {
137
+ return entry?.data;
138
+ }
139
+ // Clear expired entry
140
+ if (entry) {
141
+ delete memoryCache[key];
142
+ }
143
+ return undefined;
144
+ }
145
+ // Async version of loadSecretsFromFile
146
+ async loadSecretsFromFileAsync() {
147
+ const cached = this.getCache(this.location);
148
+ if (cached) {
149
+ return cached;
150
+ }
151
+ const start = process.hrtime.bigint();
152
+ try {
153
+ // Check if file exists using async stat
154
+ await fs_1.promises.stat(this.location);
155
+ }
156
+ catch (error) {
157
+ throw new Error(`Secret file "${this.location}" does not exist`);
158
+ }
159
+ try {
160
+ const fileContents = await fs_1.promises.readFile(this.location, 'utf-8');
161
+ const secretEncryptedObject = JSON.parse(fileContents);
162
+ console.log(`🔐 Secrets loaded: ${(0, colors_1.magenta)(this.location.split('/').slice(-2).join('/'))}`);
163
+ const decrypted = node_utils_1.Security.decryptObject(secretEncryptedObject, this.encryptionKey);
164
+ this.setCache(this.location, decrypted, this.cacheTTL);
165
+ const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;
166
+ console.log(`⏱️ loadSecrets(${this.location}) took ${durationMs.toFixed(3)}ms`);
167
+ return decrypted;
168
+ }
169
+ catch (err) {
170
+ if (err instanceof SyntaxError) {
171
+ throw new Error(`Invalid JSON in secret file: ${this.location}`);
172
+ }
173
+ console.error(err);
174
+ throw new Error(`loadSecrets failed to decrypt: ${this.location}`);
175
+ }
176
+ }
177
+ // Synchronous version for backward compatibility
21
178
  loadSecretsFromFile() {
22
- if (memoryCache[this.location]) {
23
- return memoryCache[this.location];
179
+ const cached = this.getCache(this.location);
180
+ if (cached) {
181
+ return cached;
24
182
  }
25
183
  if (!fs.existsSync(this.location)) {
26
184
  throw new Error(`Secret file "${this.location}" does not exist`);
@@ -30,11 +188,11 @@ class SecretService {
30
188
  const secretEncryptedObject = JSON.parse(fileContents);
31
189
  console.log(`🔐 Secrets loaded: ${(0, colors_1.magenta)(this.location.split('/').slice(-2).join('/'))}`);
32
190
  try {
33
- const decripted = node_utils_1.Security.decryptObject(secretEncryptedObject, this.encryptionKey);
34
- memoryCache[this.location] = decripted;
191
+ const decrypted = node_utils_1.Security.decryptObject(secretEncryptedObject, this.encryptionKey);
192
+ this.setCache(this.location, decrypted, this.cacheTTL);
35
193
  const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;
36
194
  console.log(`⏱️ loadSecrets(${this.location}) took ${durationMs.toFixed(3)}ms`);
37
- return memoryCache[this.location];
195
+ return decrypted;
38
196
  }
39
197
  catch (err) {
40
198
  console.error(err);
@@ -42,15 +200,27 @@ class SecretService {
42
200
  }
43
201
  }
44
202
  loadSecretsFromGCP() {
45
- return {};
203
+ // TODO: Implement GCP Secret Manager integration
204
+ // For now, return empty object but apply decryption if needed
205
+ const secrets = {};
206
+ if (this.encryptionKey) {
207
+ try {
208
+ return node_utils_1.Security.decryptObject(secrets, this.encryptionKey);
209
+ }
210
+ catch (error) {
211
+ console.warn(`Failed to decrypt GCP secrets: ${error.message}`);
212
+ }
213
+ }
214
+ return secrets;
46
215
  }
47
216
  loadEncryptionKeyFromGCP() {
48
217
  return '';
49
218
  }
50
219
  loadSecretsFromEnv() {
51
220
  const cacheKey = `env_${this.location}`;
52
- if (memoryCache[cacheKey]) {
53
- return memoryCache[cacheKey];
221
+ const cached = this.getCache(cacheKey);
222
+ if (cached) {
223
+ return cached;
54
224
  }
55
225
  const start = process.hrtime.bigint();
56
226
  try {
@@ -76,10 +246,21 @@ class SecretService {
76
246
  if (!this.location) {
77
247
  console.warn('ENV provider without location prefix - this will expose all environment variables');
78
248
  }
79
- memoryCache[cacheKey] = secrets;
249
+ // Apply tenant-specific decryption if encryption key is provided
250
+ let decryptedSecrets = secrets;
251
+ if (this.encryptionKey) {
252
+ try {
253
+ decryptedSecrets = node_utils_1.Security.decryptObject(secrets, this.encryptionKey);
254
+ }
255
+ catch (error) {
256
+ // If decryption fails, assume secrets are not encrypted
257
+ console.warn(`Failed to decrypt ENV secrets: ${error.message}`);
258
+ }
259
+ }
260
+ this.setCache(cacheKey, decryptedSecrets, this.cacheTTL);
80
261
  const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;
81
262
  console.log(`🔐 Secrets loaded from ENV: ${(0, colors_1.magenta)(this.location || 'all')} (${durationMs.toFixed(3)}ms)`);
82
- return secrets;
263
+ return decryptedSecrets;
83
264
  }
84
265
  catch (error) {
85
266
  console.error('Failed to load secrets from ENV:', error.message);
@@ -91,8 +272,9 @@ class SecretService {
91
272
  throw new Error('Vault configuration is required for VAULT provider');
92
273
  }
93
274
  const cacheKey = `vault_${this.vaultConfig.endpoint}_${this.location}`;
94
- if (memoryCache[cacheKey]) {
95
- return memoryCache[cacheKey];
275
+ const cached = this.getCache(cacheKey);
276
+ if (cached) {
277
+ return cached;
96
278
  }
97
279
  const start = process.hrtime.bigint();
98
280
  try {
@@ -117,8 +299,18 @@ class SecretService {
117
299
  }
118
300
  const data = (await response.json());
119
301
  // Vault KV v2 stores data in data.data
120
- const secrets = data.data?.data || data.data || {};
121
- memoryCache[cacheKey] = secrets;
302
+ let secrets = data.data?.data || data.data || {};
303
+ // Apply tenant-specific decryption if encryption key is provided
304
+ if (this.encryptionKey) {
305
+ try {
306
+ secrets = node_utils_1.Security.decryptObject(secrets, this.encryptionKey);
307
+ }
308
+ catch (error) {
309
+ // If decryption fails, assume secrets are not encrypted
310
+ console.warn(`Failed to decrypt Vault secrets: ${error.message}`);
311
+ }
312
+ }
313
+ this.setCache(cacheKey, secrets, this.cacheTTL);
122
314
  const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;
123
315
  console.log(`🔐 Secrets loaded from Vault: ${(0, colors_1.magenta)(this.location)} (${durationMs.toFixed(3)}ms)`);
124
316
  return secrets;
@@ -177,12 +369,14 @@ class SecretService {
177
369
  if (this.provider === 'ENV') {
178
370
  return this.loadSecretsFromEnv();
179
371
  }
180
- return this.loadSecretsFromFile();
372
+ // For FILE provider, return async version by default
373
+ // The synchronous loadSecretsFromFile is still available for backward compatibility
374
+ return this.loadSecretsFromFileAsync();
181
375
  }
182
376
  loadEncryptionKey() {
183
377
  return this.encryptionKey;
184
378
  }
185
- async getSecret(secretName) {
379
+ async getSecretAsync(secretName) {
186
380
  const secrets = await this.loadSecrets();
187
381
  const secret = secrets[secretName];
188
382
  if (!secret) {
@@ -190,24 +384,36 @@ class SecretService {
190
384
  }
191
385
  return secret;
192
386
  }
193
- async getSecretJson(secretName) {
194
- const secretValue = await this.getSecret(secretName);
387
+ async getSecretJsonAsync(secretName) {
388
+ const secretValue = await this.getSecretAsync(secretName);
195
389
  return JSON.parse(secretValue);
196
390
  }
197
- // Synchronous versions for backward compatibility (FILE and ENV providers only)
391
+ // Keep async versions for backward compatibility
392
+ async getSecret(secretName) {
393
+ return this.getSecretAsync(secretName);
394
+ }
395
+ async getSecretJson(secretName) {
396
+ return this.getSecretJsonAsync(secretName);
397
+ }
398
+ /**
399
+ * Get a secret synchronously (requires preload() to be called first)
400
+ */
198
401
  getSecretSync(secretName) {
199
- if (this.provider === 'VAULT') {
200
- throw new Error('Use async getSecret() method for Vault provider');
402
+ if (!this.isPreloaded || !this.preloadedSecrets) {
403
+ throw new Error('Secrets not preloaded. Call preload() before using synchronous methods.');
201
404
  }
202
- const secrets = this.loadSecrets();
203
- const secret = secrets[secretName];
405
+ const secret = this.preloadedSecrets[secretName];
204
406
  if (!secret) {
205
407
  throw new Error(`Secret ${secretName.toString()} does not exist in ${this.location} env`);
206
408
  }
207
409
  return secret;
208
410
  }
411
+ /**
412
+ * Get a JSON secret synchronously (requires preload() to be called first)
413
+ */
209
414
  getSecretJsonSync(secretName) {
210
- return JSON.parse(this.getSecretSync(secretName));
415
+ const secretValue = this.getSecretSync(secretName);
416
+ return JSON.parse(secretValue);
211
417
  }
212
418
  // Utility method to clear cache for testing
213
419
  static clearCache() {
@@ -215,6 +421,26 @@ class SecretService {
215
421
  delete memoryCache[key];
216
422
  });
217
423
  }
424
+ // Utility method to clear expired cache entries
425
+ static cleanupExpiredCache() {
426
+ const now = Date.now();
427
+ Object.entries(memoryCache).forEach(([key, entry]) => {
428
+ if (entry?.expiresAt && entry.expiresAt < now) {
429
+ delete memoryCache[key];
430
+ }
431
+ });
432
+ }
433
+ /**
434
+ * Clean up resources (file watchers, etc.) when service is no longer needed
435
+ */
436
+ dispose() {
437
+ if (this.fileWatcher) {
438
+ this.fileWatcher.close();
439
+ this.fileWatcher = undefined;
440
+ }
441
+ this.preloadedSecrets = undefined;
442
+ this.isPreloaded = false;
443
+ }
218
444
  }
219
445
  exports.SecretService = SecretService;
220
446
  //# sourceMappingURL=secret.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secret.service.js","sourceRoot":"","sources":["../../../../src/server/services/secrets/secret.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secret.service.js","sourceRoot":"","sources":["../../../../src/server/services/secrets/secret.service.ts"],"names":[],"mappings":";;;AAAA,yBAAwB;AACxB,2BAA2C;AAC3C,mCAA8B;AAE9B,oDAA8C;AAC9C,yCAAsC;AAQtC,kCAAkC;AAClC,MAAM,WAAW,GAAsD,EAAE,CAAA;AAEzE,0CAA0C;AAC1C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAqBpC,MAAa,aAAa;IACxB,QAAQ,CAAgB;IACxB,QAAQ,CAAQ;IAChB,aAAa,CAAQ;IACrB,WAAW,CAAc;IACzB,QAAQ,CAAQ;IACN,gBAAgB,CAAa;IAC7B,WAAW,GAAY,KAAK,CAAA;IAC9B,WAAW,CAAe;IAElC,YAAY,MAA2B;QACrC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAA;IACnD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;YAC7C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAA;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YAEvB,uEAAuE;YACvE,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;YACxB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QAExB,8BAA8B;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACnC,OAAO,WAAW,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzD,OAAO,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;YACxB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;YAAE,OAAM;QAEpC,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC7D,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAA,gBAAO,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;oBAChE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;oBACvB,yBAAyB;oBACzB,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;wBACpB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;oBAChD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,IAAI,OAAY,CAAA;QAEhB,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,MAAM;gBACT,OAAO,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAA;gBAC/C,MAAK;YACP,KAAK,KAAK;gBACR,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;gBACnC,MAAK;YACP,KAAK,OAAO;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC3C,MAAK;YACP,KAAK,KAAK;gBACR,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;gBACnC,MAAK;YACP;gBACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QAED,6EAA6E;QAE7E,OAAO,OAAqB,CAAA;IAC9B,CAAC;IAED,iDAAiD;IACzC,YAAY,CAAC,KAAwC;QAC3D,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QACxB,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA,CAAC,oBAAoB;QACtD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAA;IACrC,CAAC;IAED,sCAAsC;IAC9B,QAAQ,CAAC,GAAW,EAAE,IAAe,EAAE,GAAY;QACzD,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QACpD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACxC,CAAC;IAED,kCAAkC;IAC1B,QAAQ,CAAC,GAAW;QAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,EAAE,IAAI,CAAA;QACpB,CAAC;QACD,sBAAsB;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,uCAAuC;IACvC,KAAK,CAAC,wBAAwB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAA2B,CAAA;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAErC,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,aAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,aAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACtE,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAEtD,OAAO,CAAC,GAAG,CACT,sBAAsB,IAAA,gBAAO,EAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAC7C,EAAE,CACJ,CAAA;YAED,MAAM,SAAS,GAAG,qBAAQ,CAAC,aAAa,CACtC,qBAAqB,EACrB,IAAI,CAAC,aAAa,CACnB,CAAA;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,SAAS,CAAA;YACtE,OAAO,CAAC,GAAG,CACT,kBAAkB,IAAI,CAAC,QAAQ,UAAU,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACnE,CAAA;YACD,OAAO,SAA8B,CAAA;QACvC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,mBAAmB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAA2B,CAAA;QACpC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAErC,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5D,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEtD,OAAO,CAAC,GAAG,CACT,sBAAsB,IAAA,gBAAO,EAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAC7C,EAAE,CACJ,CAAA;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,qBAAQ,CAAC,aAAa,CACtC,qBAAqB,EACrB,IAAI,CAAC,aAAa,CACnB,CAAA;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,SAAS,CAAA;YACtE,OAAO,CAAC,GAAG,CACT,kBAAkB,IAAI,CAAC,QAAQ,UAAU,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACnE,CAAA;YACD,OAAO,SAA8B,CAAA;QACvC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,iDAAiD;QACjD,8DAA8D;QAC9D,MAAM,OAAO,GAAG,EAAS,CAAA;QAEzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,qBAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAsB,CAAA;YACjF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;QAED,OAAO,OAAqB,CAAA;IAC9B,CAAC;IAED,wBAAwB;QACtB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,kBAAkB;QAChB,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAA2B,CAAA;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAErC,IAAI,CAAC;YACH,2EAA2E;YAC3E,yFAAyF;YACzF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACrE,MAAM,OAAO,GAAc,EAAE,CAAA;YAE7B,2DAA2D;YAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,IAAI,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBACrC,iCAAiC;wBACjC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;wBAC1C,OAAO,CAAC,SAAS,CAAC,GAAG,KAAK,CAAA;oBAC5B,CAAC;yBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;wBACnB,+CAA+C;wBAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CACV,mFAAmF,CACpF,CAAA;YACH,CAAC;YAED,iEAAiE;YACjE,IAAI,gBAAgB,GAAG,OAAO,CAAA;YAC9B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,gBAAgB,GAAG,qBAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;gBACxE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wDAAwD;oBACxD,OAAO,CAAC,IAAI,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;gBACjE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAExD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,SAAS,CAAA;YACtE,OAAO,CAAC,GAAG,CACT,+BAA+B,IAAA,gBAAO,EACpC,IAAI,CAAC,QAAQ,IAAI,KAAK,CACvB,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACjC,CAAA;YAED,OAAO,gBAAqC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAChE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAA2B,CAAA;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAErC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,OAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,QAC5B,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;aACnC,CAAA;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;YACnD,CAAC;YAED,6BAA6B;YAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC/B,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAA;YAC3D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAA,cAAK,EAAC,QAAQ,EAAE;gBACrC,MAAM,EAAE,KAAK;gBACb,OAAO;aACR,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAClE,CAAA;YACH,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;YAE3C,uCAAuC;YACvC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;YAEhD,iEAAiE;YACjE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,OAAO,GAAG,qBAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;gBAC/D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wDAAwD;oBACxD,OAAO,CAAC,IAAI,CAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAE/C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,SAAS,CAAA;YACtE,OAAO,CAAC,GAAG,CACT,iCAAiC,IAAA,gBAAO,EACtC,IAAI,CAAC,QAAQ,CACd,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACjC,CAAA;YAED,OAAO,OAAqB,CAAA;QAC9B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAClE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAA4B;QACpD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,OAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,QAC5B,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;aACnC,CAAA;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;YACnD,CAAC;YAED,6BAA6B;YAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC/B,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAA;YAC3D,CAAC;YAED,6DAA6D;YAC7D,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,OAAO;aACd,CAAA;YAED,MAAM,QAAQ,GAAG,MAAM,IAAA,cAAK,EAAC,QAAQ,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACxE,CAAA;YACH,CAAC;YAED,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;YACtE,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;YAE5B,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAA,gBAAO,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACtE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YACjE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAA;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAClC,CAAC;QAED,qDAAqD;QACrD,oFAAoF;QACpF,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAA;IACxC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAA4B;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;QAElC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,UAAU,UAAU,CAAC,QAAQ,EAAE,sBAAsB,IAAI,CAAC,QAAQ,MAAM,CACzE,CAAA;QACH,CAAC;QAED,OAAO,MAAgB,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAU,UAA4B;QAC5D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,SAAS,CAAC,UAA4B;QAC1C,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAU,UAA4B;QACvD,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAA4B;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,UAAU,UAAU,CAAC,QAAQ,EAAE,sBAAsB,IAAI,CAAC,QAAQ,MAAM,CACzE,CAAA;QACH,CAAC;QAED,OAAO,MAAgB,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAU,UAA4B;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAGD,4CAA4C;IAC5C,MAAM,CAAC,UAAU;QACf,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,mBAAmB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACnD,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBAC9C,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;YACxB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;IAC1B,CAAC;CACF;AA7hBD,sCA6hBC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.missingTranslationExcludeList = exports.LANG_DEFAULT = void 0;
3
+ exports.missingTranslationExcludeList = exports.LANG_DEFAULT = exports.SUPPORTED_LANGUAGES = void 0;
4
+ exports.SUPPORTED_LANGUAGES = ['en_us', 'en_gb', 'es_us', 'es_cl', 'es_mx'];
4
5
  exports.LANG_DEFAULT = 'en_us';
5
6
  exports.missingTranslationExcludeList = new Set([]);
6
7
  //# sourceMappingURL=translation.model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"translation.model.js","sourceRoot":"","sources":["../../../../src/server/services/translations/translation.model.ts"],"names":[],"mappings":";;;AAGa,QAAA,YAAY,GAAG,OAAO,CAAA;AAEtB,QAAA,6BAA6B,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"translation.model.js","sourceRoot":"","sources":["../../../../src/server/services/translations/translation.model.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAC3E,QAAA,YAAY,GAAG,OAAO,CAAA;AAEtB,QAAA,6BAA6B,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,CAAA"}
@@ -4,6 +4,9 @@ export interface UserLanguageOptions {
4
4
  language: LANG | null;
5
5
  }
6
6
  declare class TranslationService {
7
+ private initialized;
8
+ private initialize;
9
+ private loadLocaleSync;
7
10
  getLocale(lang: LANG | null): StringMap;
8
11
  getLocaleMap(): Record<LANG, StringMap>;
9
12
  missingKey(key: string): string;
@@ -13,11 +16,15 @@ declare class TranslationService {
13
16
  */
14
17
  translateIfExists(key: string, user: UserLanguageOptions, args?: {}): string | undefined;
15
18
  formatResult(key: string, text: string, args?: {}): string;
16
- reportMissing(key: string, opt: UserLanguageOptions): void;
19
+ reportMissing(_key: string, opt: UserLanguageOptions): void;
17
20
  /**
18
21
  * Based on: https://nodejs.org/api/intl.html#intl_detecting_internationalization_support
19
22
  */
20
23
  hasFullICU(): boolean;
24
+ /**
25
+ * Clear cache and reinitialize - useful for testing
26
+ */
27
+ clearCacheAndReinitialize(): void;
21
28
  }
22
29
  export declare const translationService: TranslationService;
23
30
  export declare function tr(key: string, user: UserLanguageOptions, args?: {}): string;
@@ -4,14 +4,84 @@ exports.translationService = void 0;
4
4
  exports.tr = tr;
5
5
  exports.trIfExists = trIfExists;
6
6
  const pupa_1 = require("@goatlab/js-utils/dist/Strings/pupa");
7
+ const pupa_2 = require("@goatlab/js-utils/dist/Strings/pupa");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
7
10
  const consts_1 = require("../../consts");
8
- const template_util_1 = require("./template.util");
11
+ // import { templateUtil } from './template.util' // No longer needed with direct pupa usage
9
12
  const translation_model_1 = require("./translation.model");
13
+ // Cache for compiled templates - key format: "lang:key"
14
+ const templateCache = new Map();
15
+ // Cache for loaded locale files
16
+ const localeCache = new Map();
17
+ // Precompile template function
18
+ function compileTemplate(template) {
19
+ // Pre-parse the template to identify placeholders
20
+ const doubleBraceRegex = /{{(\d+|[a-z$_][\w\-$]*?(?:\.[\w\-$]*?)*?)}}/gi;
21
+ const braceRegex = /{(\d+|[a-z$_][\w\-$]*?(?:\.[\w\-$]*?)*?)}/gi;
22
+ const hasDoubleBraces = doubleBraceRegex.test(template);
23
+ const hasSingleBraces = braceRegex.test(template);
24
+ // If no placeholders, return a function that returns the template as-is
25
+ if (!hasDoubleBraces && !hasSingleBraces) {
26
+ return () => template;
27
+ }
28
+ // Return optimized template function
29
+ return (args) => {
30
+ if (!args || Object.keys(args).length === 0) {
31
+ return template;
32
+ }
33
+ return (0, pupa_2.pupa)(template, args);
34
+ };
35
+ }
10
36
  class TranslationService {
11
- // @Memo.syncMethod()
37
+ initialized = false;
38
+ // Initialize service by preloading all locale files
39
+ initialize() {
40
+ if (this.initialized)
41
+ return;
42
+ // Preload all supported language files
43
+ if (translation_model_1.SUPPORTED_LANGUAGES && Array.isArray(translation_model_1.SUPPORTED_LANGUAGES)) {
44
+ for (const lang of translation_model_1.SUPPORTED_LANGUAGES) {
45
+ this.loadLocaleSync(lang);
46
+ }
47
+ }
48
+ this.initialized = true;
49
+ }
50
+ // Load locale file synchronously (used during initialization)
51
+ loadLocaleSync(lang) {
52
+ if (localeCache.has(lang)) {
53
+ return localeCache.get(lang);
54
+ }
55
+ try {
56
+ const filePath = (0, node_path_1.join)(consts_1.config.langDir, `${lang}.json`);
57
+ const content = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
58
+ const locale = JSON.parse(content);
59
+ localeCache.set(lang, locale);
60
+ return locale;
61
+ }
62
+ catch {
63
+ console.warn(`Failed to load locale: ${lang}`);
64
+ return undefined;
65
+ }
66
+ }
67
+ // Get locale from cache (backward compatible)
12
68
  getLocale(lang) {
69
+ if (!lang)
70
+ return undefined;
71
+ // Ensure initialization
72
+ if (!this.initialized) {
73
+ this.initialize();
74
+ }
75
+ const cached = localeCache.get(lang);
76
+ if (cached) {
77
+ // Return a copy to maintain backward compatibility
78
+ return { ...cached };
79
+ }
80
+ // Try to load dynamically if not in cache (backward compatibility)
13
81
  try {
14
- return { ...require(`${consts_1.config.langDir}/${lang}.json`) };
82
+ const locale = { ...require(`${consts_1.config.langDir}/${lang}.json`) };
83
+ localeCache.set(lang, locale);
84
+ return locale;
15
85
  }
16
86
  catch {
17
87
  console.warn(`Unsupported lang ${lang}`);
@@ -19,10 +89,21 @@ class TranslationService {
19
89
  }
20
90
  }
21
91
  getLocaleMap() {
22
- return translation_model_1.SUPPORTED_LANGUAGES.reduce((map, lang) => {
23
- map[lang] = this.getLocale(lang);
24
- return map;
25
- }, {});
92
+ // Ensure initialization
93
+ if (!this.initialized) {
94
+ this.initialize();
95
+ }
96
+ const map = {};
97
+ // Use cached locales if available
98
+ if (translation_model_1.SUPPORTED_LANGUAGES && Array.isArray(translation_model_1.SUPPORTED_LANGUAGES)) {
99
+ for (const lang of translation_model_1.SUPPORTED_LANGUAGES) {
100
+ const locale = localeCache.get(lang) || this.getLocale(lang);
101
+ if (locale) {
102
+ map[lang] = locale;
103
+ }
104
+ }
105
+ }
106
+ return map;
26
107
  }
27
108
  missingKey(key) {
28
109
  return `[${key}]`;
@@ -41,9 +122,14 @@ class TranslationService {
41
122
  * Implementation based on static ./src/lang/*.json files
42
123
  */
43
124
  translateIfExists(key, user, args = {}) {
44
- const fallbackLocale = this.getLocale(translation_model_1.LANG_DEFAULT);
45
- const locale = this.getLocale(user.language);
46
- const value = locale[key] ?? fallbackLocale[key];
125
+ // Ensure initialization
126
+ if (!this.initialized) {
127
+ this.initialize();
128
+ }
129
+ // Get locale from cache directly for better performance
130
+ const locale = user.language ? localeCache.get(user.language) : undefined;
131
+ const fallbackLocale = localeCache.get(translation_model_1.LANG_DEFAULT) || this.getLocale(translation_model_1.LANG_DEFAULT);
132
+ const value = (locale && locale[key]) ?? (fallbackLocale && fallbackLocale[key]);
47
133
  return value && this.formatResult(key, value, args);
48
134
  }
49
135
  formatResult(key, text, args = {}) {
@@ -51,15 +137,23 @@ class TranslationService {
51
137
  return `** ${key} **`;
52
138
  }
53
139
  if (Object.keys(args).length) {
140
+ // Check template cache first
141
+ const cacheKey = `${key}:${text}`;
142
+ let compiledTemplate = templateCache.get(cacheKey);
143
+ if (!compiledTemplate) {
144
+ // Compile and cache the template
145
+ compiledTemplate = compileTemplate(text);
146
+ templateCache.set(cacheKey, compiledTemplate);
147
+ }
54
148
  try {
55
- return template_util_1.templateUtil.renderString(text, args);
149
+ return compiledTemplate(args);
56
150
  }
57
151
  catch (err) {
58
152
  if (err instanceof pupa_1.MissingValueError) {
59
153
  // sentryService.captureMessage(
60
154
  // `template value missing for key=${key}, param=${err.key}`,
61
155
  // )
62
- return template_util_1.templateUtil.renderString(text, args, { ignoreMissing: true });
156
+ return (0, pupa_2.pupa)(text, args, { ignoreMissing: true });
63
157
  }
64
158
  throw err;
65
159
  }
@@ -68,7 +162,7 @@ class TranslationService {
68
162
  return text;
69
163
  }
70
164
  }
71
- reportMissing(key, opt) {
165
+ reportMissing(_key, opt) {
72
166
  console.log(opt); // For Sentry
73
167
  //sentryService.captureMessage(`translation missing for key=${key}}`)
74
168
  }
@@ -85,8 +179,24 @@ class TranslationService {
85
179
  return false;
86
180
  }
87
181
  }
182
+ /**
183
+ * Clear cache and reinitialize - useful for testing
184
+ */
185
+ clearCacheAndReinitialize() {
186
+ // Clear all caches
187
+ localeCache.clear();
188
+ templateCache.clear();
189
+ // Reset initialization state
190
+ this.initialized = false;
191
+ // Reinitialize
192
+ this.initialize();
193
+ }
88
194
  }
89
195
  exports.translationService = new TranslationService();
196
+ // Initialize on module load to preload all locales
197
+ if (typeof translation_model_1.SUPPORTED_LANGUAGES !== 'undefined' && Array.isArray(translation_model_1.SUPPORTED_LANGUAGES)) {
198
+ exports.translationService['initialize']();
199
+ }
90
200
  // Alias
91
201
  function tr(key, user, args = {}) {
92
202
  return exports.translationService.translate(key, user, args);