@vritti/api-sdk 0.4.3 → 0.4.6

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 (67) hide show
  1. package/dist/auth.cjs +58 -17
  2. package/dist/auth.cjs.map +1 -1
  3. package/dist/auth.d.cts +1 -1
  4. package/dist/auth.d.ts +1 -1
  5. package/dist/auth.js +58 -17
  6. package/dist/auth.js.map +1 -1
  7. package/dist/cache.cjs +51 -17
  8. package/dist/cache.cjs.map +1 -1
  9. package/dist/cache.js +51 -17
  10. package/dist/cache.js.map +1 -1
  11. package/dist/catalog-resolver.d.cts +2 -2
  12. package/dist/catalog-resolver.d.ts +2 -2
  13. package/dist/{code-pattern-BP4zkNtT.d.cts → code-pattern-DMlbIwwn.d.cts} +3 -3
  14. package/dist/{code-pattern-BP4zkNtT.d.ts → code-pattern-DMlbIwwn.d.ts} +3 -3
  15. package/dist/data-table.cjs +154 -48
  16. package/dist/data-table.cjs.map +1 -1
  17. package/dist/data-table.js +154 -48
  18. package/dist/data-table.js.map +1 -1
  19. package/dist/database.cjs +101 -31
  20. package/dist/database.cjs.map +1 -1
  21. package/dist/database.js +101 -31
  22. package/dist/database.js.map +1 -1
  23. package/dist/decorators.cjs +1 -1
  24. package/dist/decorators.cjs.map +1 -1
  25. package/dist/decorators.d.cts +2 -2
  26. package/dist/decorators.d.ts +2 -2
  27. package/dist/decorators.js +1 -1
  28. package/dist/decorators.js.map +1 -1
  29. package/dist/drizzle-pg-core.cjs +1 -1
  30. package/dist/drizzle-pg-core.cjs.map +1 -1
  31. package/dist/drizzle-pg-core.d.cts +1 -1
  32. package/dist/drizzle-pg-core.d.ts +1 -1
  33. package/dist/drizzle-pg-core.js +1 -1
  34. package/dist/drizzle-pg-core.js.map +1 -1
  35. package/dist/email.cjs +22 -6
  36. package/dist/email.cjs.map +1 -1
  37. package/dist/email.js +22 -6
  38. package/dist/email.js.map +1 -1
  39. package/dist/files.cjs +1 -1
  40. package/dist/files.cjs.map +1 -1
  41. package/dist/files.d.cts +3 -3
  42. package/dist/files.d.ts +3 -3
  43. package/dist/files.js +1 -1
  44. package/dist/files.js.map +1 -1
  45. package/dist/filters.cjs +18 -4
  46. package/dist/filters.cjs.map +1 -1
  47. package/dist/filters.js +18 -4
  48. package/dist/filters.js.map +1 -1
  49. package/dist/index.d.cts +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/license.d.cts +1 -1
  52. package/dist/license.d.ts +1 -1
  53. package/dist/logger.cjs +49 -15
  54. package/dist/logger.cjs.map +1 -1
  55. package/dist/logger.js +49 -15
  56. package/dist/logger.js.map +1 -1
  57. package/dist/nats.cjs +51 -19
  58. package/dist/nats.cjs.map +1 -1
  59. package/dist/nats.js +50 -18
  60. package/dist/nats.js.map +1 -1
  61. package/dist/root.cjs +44 -12
  62. package/dist/root.cjs.map +1 -1
  63. package/dist/root.js +44 -12
  64. package/dist/root.js.map +1 -1
  65. package/dist/{types-BQY0Aa1p.d.cts → types-VDKSjje5.d.cts} +1 -1
  66. package/dist/{types-BQY0Aa1p.d.ts → types-VDKSjje5.d.ts} +1 -1
  67. package/package.json +38 -38
package/dist/cache.cjs CHANGED
@@ -49,21 +49,30 @@ var import_config2 = require("@nestjs/config");
49
49
  var import_common = require("@nestjs/common");
50
50
 
51
51
  // src/cache/constants.ts
52
- var CACHE_PROVIDER = Symbol("CACHE_PROVIDER");
53
- var LRU_CACHE_OPTIONS = Symbol("LRU_CACHE_OPTIONS");
54
- var CACHE_MODULE_OPTIONS = Symbol("CACHE_MODULE_OPTIONS");
52
+ var CACHE_PROVIDER = /* @__PURE__ */ Symbol("CACHE_PROVIDER");
53
+ var LRU_CACHE_OPTIONS = /* @__PURE__ */ Symbol("LRU_CACHE_OPTIONS");
54
+ var CACHE_MODULE_OPTIONS = /* @__PURE__ */ Symbol("CACHE_MODULE_OPTIONS");
55
55
  var DEFAULT_LRU_MAX = 1e4;
56
56
 
57
57
  // src/cache/cache.service.ts
58
58
  function _ts_decorate(decorators, target, key, desc) {
59
59
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
60
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
61
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
60
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
61
+ r = Reflect.decorate(decorators, target, key, desc);
62
+ } else {
63
+ for (var i = decorators.length - 1; i >= 0; i--) {
64
+ if (d = decorators[i]) {
65
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
66
+ }
67
+ }
68
+ }
62
69
  return c > 3 && r && Object.defineProperty(target, key, r), r;
63
70
  }
64
71
  __name(_ts_decorate, "_ts_decorate");
65
- function _ts_metadata(k, v) {
66
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
72
+ function _ts_metadata(metadataKey, metadataValue) {
73
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
74
+ return Reflect.metadata(metadataKey, metadataValue);
75
+ }
67
76
  }
68
77
  __name(_ts_metadata, "_ts_metadata");
69
78
  function _ts_param(paramIndex, decorator) {
@@ -139,13 +148,22 @@ var import_common2 = require("@nestjs/common");
139
148
  var import_lru_cache = require("lru-cache");
140
149
  function _ts_decorate2(decorators, target, key, desc) {
141
150
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
142
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
143
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
151
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
152
+ r = Reflect.decorate(decorators, target, key, desc);
153
+ } else {
154
+ for (var i = decorators.length - 1; i >= 0; i--) {
155
+ if (d = decorators[i]) {
156
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
157
+ }
158
+ }
159
+ }
144
160
  return c > 3 && r && Object.defineProperty(target, key, r), r;
145
161
  }
146
162
  __name(_ts_decorate2, "_ts_decorate");
147
- function _ts_metadata2(k, v) {
148
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
163
+ function _ts_metadata2(metadataKey, metadataValue) {
164
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
165
+ return Reflect.metadata(metadataKey, metadataValue);
166
+ }
149
167
  }
150
168
  __name(_ts_metadata2, "_ts_metadata");
151
169
  function _ts_param2(paramIndex, decorator) {
@@ -214,13 +232,22 @@ var import_config = require("@nestjs/config");
214
232
  var import_ioredis = __toESM(require("ioredis"), 1);
215
233
  function _ts_decorate3(decorators, target, key, desc) {
216
234
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
217
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
218
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
235
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
236
+ r = Reflect.decorate(decorators, target, key, desc);
237
+ } else {
238
+ for (var i = decorators.length - 1; i >= 0; i--) {
239
+ if (d = decorators[i]) {
240
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
241
+ }
242
+ }
243
+ }
219
244
  return c > 3 && r && Object.defineProperty(target, key, r), r;
220
245
  }
221
246
  __name(_ts_decorate3, "_ts_decorate");
222
- function _ts_metadata3(k, v) {
223
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
247
+ function _ts_metadata3(metadataKey, metadataValue) {
248
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
249
+ return Reflect.metadata(metadataKey, metadataValue);
250
+ }
224
251
  }
225
252
  __name(_ts_metadata3, "_ts_metadata");
226
253
  var RedisCacheProvider = class _RedisCacheProvider {
@@ -292,8 +319,15 @@ RedisCacheProvider = _ts_decorate3([
292
319
  // src/cache/cache.module.ts
293
320
  function _ts_decorate4(decorators, target, key, desc) {
294
321
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
295
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
296
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
322
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
323
+ r = Reflect.decorate(decorators, target, key, desc);
324
+ } else {
325
+ for (var i = decorators.length - 1; i >= 0; i--) {
326
+ if (d = decorators[i]) {
327
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
328
+ }
329
+ }
330
+ }
297
331
  return c > 3 && r && Object.defineProperty(target, key, r), r;
298
332
  }
299
333
  __name(_ts_decorate4, "_ts_decorate");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cache/index.ts","../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["export { CacheModule, type CacheModuleAsyncOptions, type CacheModuleOptions } from './cache.module';\nexport { CacheService } from './cache.service';\nexport { CACHE_PROVIDER, DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from './constants';\nexport type { ICacheProvider } from './interfaces/cache-provider.interface';\nexport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nexport { RedisCacheProvider } from './providers/redis.provider';\n","import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["import_common","import_config","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","import_common","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","import_common","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
1
+ {"version":3,"sources":["../src/cache/index.ts","../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["export { CacheModule, type CacheModuleAsyncOptions, type CacheModuleOptions } from './cache.module';\nexport { CacheService } from './cache.service';\nexport { CACHE_PROVIDER, DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from './constants';\nexport type { ICacheProvider } from './interfaces/cache-provider.interface';\nexport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nexport { RedisCacheProvider } from './providers/redis.provider';\n","import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["import_common","import_config","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","import_common","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","import_common","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
package/dist/cache.js CHANGED
@@ -9,21 +9,30 @@ import { ConfigModule } from "@nestjs/config";
9
9
  import { Inject, Injectable, Logger } from "@nestjs/common";
10
10
 
11
11
  // src/cache/constants.ts
12
- var CACHE_PROVIDER = Symbol("CACHE_PROVIDER");
13
- var LRU_CACHE_OPTIONS = Symbol("LRU_CACHE_OPTIONS");
14
- var CACHE_MODULE_OPTIONS = Symbol("CACHE_MODULE_OPTIONS");
12
+ var CACHE_PROVIDER = /* @__PURE__ */ Symbol("CACHE_PROVIDER");
13
+ var LRU_CACHE_OPTIONS = /* @__PURE__ */ Symbol("LRU_CACHE_OPTIONS");
14
+ var CACHE_MODULE_OPTIONS = /* @__PURE__ */ Symbol("CACHE_MODULE_OPTIONS");
15
15
  var DEFAULT_LRU_MAX = 1e4;
16
16
 
17
17
  // src/cache/cache.service.ts
18
18
  function _ts_decorate(decorators, target, key, desc) {
19
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
21
+ r = Reflect.decorate(decorators, target, key, desc);
22
+ } else {
23
+ for (var i = decorators.length - 1; i >= 0; i--) {
24
+ if (d = decorators[i]) {
25
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
26
+ }
27
+ }
28
+ }
22
29
  return c > 3 && r && Object.defineProperty(target, key, r), r;
23
30
  }
24
31
  __name(_ts_decorate, "_ts_decorate");
25
- function _ts_metadata(k, v) {
26
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
32
+ function _ts_metadata(metadataKey, metadataValue) {
33
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
34
+ return Reflect.metadata(metadataKey, metadataValue);
35
+ }
27
36
  }
28
37
  __name(_ts_metadata, "_ts_metadata");
29
38
  function _ts_param(paramIndex, decorator) {
@@ -99,13 +108,22 @@ import { Inject as Inject2, Injectable as Injectable2, Optional } from "@nestjs/
99
108
  import { LRUCache } from "lru-cache";
100
109
  function _ts_decorate2(decorators, target, key, desc) {
101
110
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
102
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
103
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
111
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
112
+ r = Reflect.decorate(decorators, target, key, desc);
113
+ } else {
114
+ for (var i = decorators.length - 1; i >= 0; i--) {
115
+ if (d = decorators[i]) {
116
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
117
+ }
118
+ }
119
+ }
104
120
  return c > 3 && r && Object.defineProperty(target, key, r), r;
105
121
  }
106
122
  __name(_ts_decorate2, "_ts_decorate");
107
- function _ts_metadata2(k, v) {
108
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
123
+ function _ts_metadata2(metadataKey, metadataValue) {
124
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
125
+ return Reflect.metadata(metadataKey, metadataValue);
126
+ }
109
127
  }
110
128
  __name(_ts_metadata2, "_ts_metadata");
111
129
  function _ts_param2(paramIndex, decorator) {
@@ -174,13 +192,22 @@ import { ConfigService } from "@nestjs/config";
174
192
  import Redis from "ioredis";
175
193
  function _ts_decorate3(decorators, target, key, desc) {
176
194
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
177
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
178
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
195
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
196
+ r = Reflect.decorate(decorators, target, key, desc);
197
+ } else {
198
+ for (var i = decorators.length - 1; i >= 0; i--) {
199
+ if (d = decorators[i]) {
200
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
201
+ }
202
+ }
203
+ }
179
204
  return c > 3 && r && Object.defineProperty(target, key, r), r;
180
205
  }
181
206
  __name(_ts_decorate3, "_ts_decorate");
182
- function _ts_metadata3(k, v) {
183
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
207
+ function _ts_metadata3(metadataKey, metadataValue) {
208
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
209
+ return Reflect.metadata(metadataKey, metadataValue);
210
+ }
184
211
  }
185
212
  __name(_ts_metadata3, "_ts_metadata");
186
213
  var RedisCacheProvider = class _RedisCacheProvider {
@@ -252,8 +279,15 @@ RedisCacheProvider = _ts_decorate3([
252
279
  // src/cache/cache.module.ts
253
280
  function _ts_decorate4(decorators, target, key, desc) {
254
281
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
255
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
256
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
282
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
283
+ r = Reflect.decorate(decorators, target, key, desc);
284
+ } else {
285
+ for (var i = decorators.length - 1; i >= 0; i--) {
286
+ if (d = decorators[i]) {
287
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
288
+ }
289
+ }
290
+ }
257
291
  return c > 3 && r && Object.defineProperty(target, key, r), r;
258
292
  }
259
293
  __name(_ts_decorate4, "_ts_decorate");
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["Module","ConfigModule","Inject","Injectable","Logger","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","Inject","Injectable","Optional","LRUCache","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","Injectable","Logger","ConfigService","Redis","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
1
+ {"version":3,"sources":["../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["Module","ConfigModule","Inject","Injectable","Logger","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","Inject","Injectable","Optional","LRUCache","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","Injectable","Logger","ConfigService","Redis","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
@@ -1,5 +1,5 @@
1
- import { V as VersionSnapshot, S as SiteFeatureLocks, P as PlatformBucket, a as SiteType, b as ScopeType, c as ServiceCode, F as FeatureCatalogEntry, R as RoleItem, d as SnapshotFeature, e as PlatformCodes, A as ApiSurface, f as FeatureUnlocks, g as PlatformDenyCodes, L as LockReason } from './types-BQY0Aa1p.cjs';
2
- export { h as API_BUCKETS, i as API_SURFACES, j as ApiBucket, B as BUCKET_BY_SURFACE, k as BusinessVocabulary, C as CatalogPermission, l as FeatureLocks, o as PLATFORMS, n as PermissionGroupRef, p as SERVICE_CODES, q as SITE_TYPES, r as SNAPSHOT_SCHEMA_VERSION, E as SURFACE_BY_BUCKET, s as SnapshotApp, t as SnapshotAppFeatureRef, u as SnapshotBusiness, v as SnapshotMicrofrontendMobile, x as SnapshotMicrofrontendWeb, w as SnapshotMicrofrontends, y as SnapshotPermission, z as SnapshotPlan, D as SnapshotRoleTemplate, U as UI_PLATFORMS, H as UiPlatformBucket, I as VocabularyEntry, m as isApiBucket, G as snapshotFeatureKey } from './types-BQY0Aa1p.cjs';
1
+ import { V as VersionSnapshot, S as SiteFeatureLocks, P as PlatformBucket, a as SiteType, b as ScopeType, c as ServiceCode, F as FeatureCatalogEntry, R as RoleItem, d as SnapshotFeature, e as PlatformCodes, A as ApiSurface, f as FeatureUnlocks, g as PlatformDenyCodes, L as LockReason } from './types-VDKSjje5.cjs';
2
+ export { h as API_BUCKETS, i as API_SURFACES, j as ApiBucket, B as BUCKET_BY_SURFACE, k as BusinessVocabulary, C as CatalogPermission, l as FeatureLocks, m as PLATFORMS, n as PermissionGroupRef, o as SERVICE_CODES, p as SITE_TYPES, q as SNAPSHOT_SCHEMA_VERSION, r as SURFACE_BY_BUCKET, s as SnapshotApp, t as SnapshotAppFeatureRef, u as SnapshotBusiness, v as SnapshotMicrofrontendMobile, w as SnapshotMicrofrontendWeb, x as SnapshotMicrofrontends, y as SnapshotPermission, z as SnapshotPlan, D as SnapshotRoleTemplate, U as UI_PLATFORMS, E as UiPlatformBucket, G as VocabularyEntry, H as isApiBucket, I as snapshotFeatureKey } from './types-VDKSjje5.cjs';
3
3
 
4
4
  declare function featureAppliesAtNode(applicableSiteTypes: SiteType[], siteType: SiteType): boolean;
5
5
  declare function findFeatureByCode(snapshot: VersionSnapshot, code: string): SnapshotFeature | undefined;
@@ -1,5 +1,5 @@
1
- import { V as VersionSnapshot, S as SiteFeatureLocks, P as PlatformBucket, a as SiteType, b as ScopeType, c as ServiceCode, F as FeatureCatalogEntry, R as RoleItem, d as SnapshotFeature, e as PlatformCodes, A as ApiSurface, f as FeatureUnlocks, g as PlatformDenyCodes, L as LockReason } from './types-BQY0Aa1p.js';
2
- export { h as API_BUCKETS, i as API_SURFACES, j as ApiBucket, B as BUCKET_BY_SURFACE, k as BusinessVocabulary, C as CatalogPermission, l as FeatureLocks, o as PLATFORMS, n as PermissionGroupRef, p as SERVICE_CODES, q as SITE_TYPES, r as SNAPSHOT_SCHEMA_VERSION, E as SURFACE_BY_BUCKET, s as SnapshotApp, t as SnapshotAppFeatureRef, u as SnapshotBusiness, v as SnapshotMicrofrontendMobile, x as SnapshotMicrofrontendWeb, w as SnapshotMicrofrontends, y as SnapshotPermission, z as SnapshotPlan, D as SnapshotRoleTemplate, U as UI_PLATFORMS, H as UiPlatformBucket, I as VocabularyEntry, m as isApiBucket, G as snapshotFeatureKey } from './types-BQY0Aa1p.js';
1
+ import { V as VersionSnapshot, S as SiteFeatureLocks, P as PlatformBucket, a as SiteType, b as ScopeType, c as ServiceCode, F as FeatureCatalogEntry, R as RoleItem, d as SnapshotFeature, e as PlatformCodes, A as ApiSurface, f as FeatureUnlocks, g as PlatformDenyCodes, L as LockReason } from './types-VDKSjje5.js';
2
+ export { h as API_BUCKETS, i as API_SURFACES, j as ApiBucket, B as BUCKET_BY_SURFACE, k as BusinessVocabulary, C as CatalogPermission, l as FeatureLocks, m as PLATFORMS, n as PermissionGroupRef, o as SERVICE_CODES, p as SITE_TYPES, q as SNAPSHOT_SCHEMA_VERSION, r as SURFACE_BY_BUCKET, s as SnapshotApp, t as SnapshotAppFeatureRef, u as SnapshotBusiness, v as SnapshotMicrofrontendMobile, w as SnapshotMicrofrontendWeb, x as SnapshotMicrofrontends, y as SnapshotPermission, z as SnapshotPlan, D as SnapshotRoleTemplate, U as UI_PLATFORMS, E as UiPlatformBucket, G as VocabularyEntry, H as isApiBucket, I as snapshotFeatureKey } from './types-VDKSjje5.js';
3
3
 
4
4
  declare function featureAppliesAtNode(applicableSiteTypes: SiteType[], siteType: SiteType): boolean;
5
5
  declare function findFeatureByCode(snapshot: VersionSnapshot, code: string): SnapshotFeature | undefined;
@@ -1,5 +1,5 @@
1
- declare const CODE_PATTERN_SOURCE = "^[a-z][a-z0-9-]*$";
2
- declare const DOTTED_CODE_PATTERN_SOURCE = "^[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*$";
1
+ declare const CODE_PATTERN_SOURCE = "^[a-z0-9][a-z0-9-]*$";
2
+ declare const DOTTED_CODE_PATTERN_SOURCE = "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)*$";
3
3
  declare const CODE_PATTERN: RegExp;
4
4
  declare const DOTTED_CODE_PATTERN: RegExp;
5
5
  interface CodeOptions {
@@ -9,4 +9,4 @@ declare function codePattern(options?: CodeOptions): RegExp;
9
9
  declare function codePatternSource(options?: CodeOptions): string;
10
10
  declare function codeMessage(property: string, options?: CodeOptions): string;
11
11
 
12
- export { type CodeOptions as C, DOTTED_CODE_PATTERN as D, CODE_PATTERN as a, CODE_PATTERN_SOURCE as b, codeMessage as c, codePattern as d, codePatternSource as e, DOTTED_CODE_PATTERN_SOURCE as f };
12
+ export { type CodeOptions as C, DOTTED_CODE_PATTERN as D, CODE_PATTERN as a, CODE_PATTERN_SOURCE as b, DOTTED_CODE_PATTERN_SOURCE as c, codeMessage as d, codePattern as e, codePatternSource as f };
@@ -1,5 +1,5 @@
1
- declare const CODE_PATTERN_SOURCE = "^[a-z][a-z0-9-]*$";
2
- declare const DOTTED_CODE_PATTERN_SOURCE = "^[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*$";
1
+ declare const CODE_PATTERN_SOURCE = "^[a-z0-9][a-z0-9-]*$";
2
+ declare const DOTTED_CODE_PATTERN_SOURCE = "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)*$";
3
3
  declare const CODE_PATTERN: RegExp;
4
4
  declare const DOTTED_CODE_PATTERN: RegExp;
5
5
  interface CodeOptions {
@@ -9,4 +9,4 @@ declare function codePattern(options?: CodeOptions): RegExp;
9
9
  declare function codePatternSource(options?: CodeOptions): string;
10
10
  declare function codeMessage(property: string, options?: CodeOptions): string;
11
11
 
12
- export { type CodeOptions as C, DOTTED_CODE_PATTERN as D, CODE_PATTERN as a, CODE_PATTERN_SOURCE as b, codeMessage as c, codePattern as d, codePatternSource as e, DOTTED_CODE_PATTERN_SOURCE as f };
12
+ export { type CodeOptions as C, DOTTED_CODE_PATTERN as D, CODE_PATTERN as a, CODE_PATTERN_SOURCE as b, DOTTED_CODE_PATTERN_SOURCE as c, codeMessage as d, codePattern as e, codePatternSource as f };