@burdenoff/be-sdk 2026.815.1 → 2026.820.1

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.
@@ -1,6 +1,6 @@
1
1
  import { B as BurdenoffGraphQLClient } from '../graphql-Dxxpbzr3.js';
2
2
  import { S as SDKContext } from '../index-B8viwwDM.js';
3
- import { G as GraphQLContext } from '../types-BuP_sFzk.js';
3
+ import { G as GraphQLContext } from '../types-Dg2F8FNa.js';
4
4
  import 'graphql-request';
5
5
  import '../layer-GNAVXBMf.js';
6
6
  import 'graphql';
@@ -547,7 +547,7 @@ var I18n = class {
547
547
  if (this.config.logMissing) {
548
548
  logger.warn(`[I18n] Missing translation for key: ${key} in locale: ${locale}`);
549
549
  }
550
- return defaultValue ?? (this.config.returnKeyOnMissing ? key : "");
550
+ return interpolate(defaultValue ?? (this.config.returnKeyOnMissing ? key : ""), variables);
551
551
  }
552
552
  return interpolate(text, variables);
553
553
  }
@@ -760,5 +760,5 @@ var DEFAULT_I18N_CONFIG = {
760
760
  };
761
761
 
762
762
  export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, i18n_exports, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t };
763
- //# sourceMappingURL=chunk-ULFFX3YE.js.map
764
- //# sourceMappingURL=chunk-ULFFX3YE.js.map
763
+ //# sourceMappingURL=chunk-UJG32VIP.js.map
764
+ //# sourceMappingURL=chunk-UJG32VIP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/index.ts","../src/i18n/types.ts","../src/i18n/parser.ts","../src/i18n/loader.ts","../src/i18n/i18n.ts","../src/i18n/helpers.ts"],"names":["RTL_LANGUAGES","getTextDirection","language","includes","parseLocaleString","localeStr","trimmed","trim","localePart","params","split","quality","param","key","value","toLowerCase","parsed","parseFloat","isNaN","locale","parts","region","toUpperCase","normalizedLocale","parseAcceptLanguage","header","locales","part","push","sort","a","b","extractLocaleFromRequest","request","defaultLocale","explicitLocale","headers","get","acceptLanguage","parsedLocales","length","normalizeLocale","getLanguageFromLocale","getRegionFromLocale","findBestMatch","requested","available","availableSet","Set","map","l","req","has","find","langMatch","translationCache","Map","validateFilePath","filePath","baseDir","resolvedBase","resolve","resolvedPath","relativePath","relative","startsWith","Error","safeReadFile","validatedPath","Bun","file","text","safeStat","stat","catch","safeReaddir","dirPath","readdir","flattenDictionary","obj","prefix","result","Object","entries","fullKey","assign","loadTranslationFile","content","data","JSON","parse","error","logger","getCacheKey","namespace","loadTranslationsForLocale","config","cacheKey","enableCache","pathsToTry","join","localesPath","path","stats","isFile","endsWith","translations","flattened","debug","isDirectory","files","extname","basename","keys","fallbackLocale","warn","fallbackTranslations","undefined","set","discoverLocales","validatedBasePath","entry","entryPath","preloadAllTranslations","supportedLocales","info","Promise","all","clearTranslationCache","delete","clear","getCachedTranslations","setCachedTranslations","getEnglishPluralCategory","absCount","getFrenchPluralCategory","getSlavicPluralCategory","mod10","mod100","getArabicPluralCategory","getPolishCzechPluralCategory","getRomanianPluralCategory","getHebrewPluralCategory","getPluralCategory","count","Math","abs","englishLanguages","interpolate","variables","replace","match","String","I18n","currentLocale","initialized","returnKeyOnMissing","logMissing","initialize","lazyLoad","getLocale","setLocale","getSupportedLocales","isSupported","normalized","some","supportedNorm","loadLocale","getTranslations","t","defaultValue","translate","tp","translatePlural","langTranslations","category","pluralKey","createContext","formatNumber","options","Intl","NumberFormat","format","formatCurrency","currency","style","formatDate","date","dateObj","Date","DateTimeFormat","formatRelativeTime","unit","RelativeTimeFormat","numeric","createContextFromRequest","bestMatch","getLanguageInfo","direction","code","globalI18n","initializeI18n","getI18n","createI18n","interpolateVariables","ctx","defaultMessage","i18n","translated","createTranslator","hasI18n","getLanguage","defaultLanguage","Locales","EN_US","EN_GB","EN_AU","EN_CA","EN_IN","ES_ES","ES_MX","FR_FR","FR_CA","DE_DE","DE_AT","DE_CH","IT_IT","PT_PT","PT_BR","RU_RU","ZH_CN","ZH_TW","ZH_HK","JA_JP","KO_KR","AR_SA","AR_AE","HI_IN","TA_IN","NL_NL","PL_PL","TR_TR","VI_VN","TH_TH","ID_ID","HE_IL","UK_UA","DEFAULT_I18N_CONFIG"],"mappings":"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","file":"chunk-UJG32VIP.js","sourcesContent":["/**\n * I18n Module\n *\n * Comprehensive internationalization support for backend services.\n *\n * Features:\n * - Load translations from JSON files\n * - Accept-Language header parsing\n * - Translation with variable interpolation\n * - Pluralization support (CLDR rules)\n * - Locale-aware formatting (numbers, dates, currencies)\n * - Request context integration\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk/i18n';\n *\n * // Initialize\n * const i18n = new I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * // Create context for a request\n * const ctx = i18n.createContextFromRequest(request);\n *\n * // Translate\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * // => \"Tag not found\"\n *\n * // Pluralize\n * const items = ctx.tp('items', 5, { count: 5 });\n * // => \"5 items\"\n * ```\n *\n * @packageDocumentation\n */\n\n// Core i18n class and functions\nexport { I18n, initializeI18n, getI18n, createI18n } from './i18n.js';\n\n// Context-based translation helpers (for use in resolvers/providers)\nexport {\n t,\n createTranslator,\n hasI18n,\n getLocale,\n getLanguage,\n type I18nCapableContext,\n type Translator,\n} from './helpers.js';\n\n// Types\nexport type {\n LocaleCode,\n LanguageCode,\n TranslationDictionary,\n FlatTranslationMap,\n TranslationVariables,\n PluralForms,\n TranslateFunction,\n PluralTranslateFunction,\n I18nConfig,\n ParsedLocale,\n I18nContext,\n II18n,\n TextDirection,\n LanguageInfo,\n} from './types.js';\n\n// Type helpers\nexport { RTL_LANGUAGES, getTextDirection } from './types.js';\n\n// Parser functions\nexport {\n parseLocaleString,\n parseAcceptLanguage,\n extractLocaleFromRequest,\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n} from './parser.js';\n\n// Loader functions\nexport {\n flattenDictionary,\n loadTranslationFile,\n loadTranslationsForLocale,\n discoverLocales,\n preloadAllTranslations,\n clearTranslationCache,\n getCachedTranslations,\n setCachedTranslations,\n} from './loader.js';\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\n/**\n * Common locale codes as constants\n */\nexport const Locales = {\n // English\n EN_US: 'en-US' as const,\n EN_GB: 'en-GB' as const,\n EN_AU: 'en-AU' as const,\n EN_CA: 'en-CA' as const,\n EN_IN: 'en-IN' as const,\n // Spanish\n ES_ES: 'es-ES' as const,\n ES_MX: 'es-MX' as const,\n // French\n FR_FR: 'fr-FR' as const,\n FR_CA: 'fr-CA' as const,\n // German\n DE_DE: 'de-DE' as const,\n DE_AT: 'de-AT' as const,\n DE_CH: 'de-CH' as const,\n // Italian\n IT_IT: 'it-IT' as const,\n // Portuguese\n PT_PT: 'pt-PT' as const,\n PT_BR: 'pt-BR' as const,\n // Russian\n RU_RU: 'ru-RU' as const,\n // Chinese\n ZH_CN: 'zh-CN' as const,\n ZH_TW: 'zh-TW' as const,\n ZH_HK: 'zh-HK' as const,\n // Japanese\n JA_JP: 'ja-JP' as const,\n // Korean\n KO_KR: 'ko-KR' as const,\n // Arabic\n AR_SA: 'ar-SA' as const,\n AR_AE: 'ar-AE' as const,\n // Hindi\n HI_IN: 'hi-IN' as const,\n // Tamil\n TA_IN: 'ta-IN' as const,\n // Dutch\n NL_NL: 'nl-NL' as const,\n // Polish\n PL_PL: 'pl-PL' as const,\n // Turkish\n TR_TR: 'tr-TR' as const,\n // Vietnamese\n VI_VN: 'vi-VN' as const,\n // Thai\n TH_TH: 'th-TH' as const,\n // Indonesian\n ID_ID: 'id-ID' as const,\n // Hebrew\n HE_IL: 'he-IL' as const,\n // Ukrainian\n UK_UA: 'uk-UA' as const,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_I18N_CONFIG = {\n defaultLocale: 'en-US',\n fallbackLocale: 'en-US',\n enableCache: true,\n lazyLoad: false,\n logMissing: true,\n returnKeyOnMissing: true,\n} as const;\n","/**\n * I18n Module Types\n *\n * Type definitions for internationalization support\n */\n\n/**\n * Supported locale codes (BCP 47 format)\n * Language-Region pattern: xx-XX\n */\nexport type LocaleCode =\n // English variants\n | 'en-US'\n | 'en-GB'\n | 'en-AU'\n | 'en-CA'\n | 'en-IN'\n // Spanish variants\n | 'es-ES'\n | 'es-MX'\n | 'es-AR'\n // French variants\n | 'fr-FR'\n | 'fr-CA'\n | 'fr-BE'\n // German variants\n | 'de-DE'\n | 'de-AT'\n | 'de-CH'\n // Italian\n | 'it-IT'\n // Portuguese variants\n | 'pt-PT'\n | 'pt-BR'\n // Russian\n | 'ru-RU'\n // Chinese variants\n | 'zh-CN'\n | 'zh-TW'\n | 'zh-HK'\n // Japanese\n | 'ja-JP'\n // Korean\n | 'ko-KR'\n // Arabic variants\n | 'ar-SA'\n | 'ar-AE'\n | 'ar-EG'\n // Hindi\n | 'hi-IN'\n // Bengali\n | 'bn-IN'\n | 'bn-BD'\n // Tamil\n | 'ta-IN'\n // Telugu\n | 'te-IN'\n // Malayalam\n | 'ml-IN'\n // Dutch\n | 'nl-NL'\n | 'nl-BE'\n // Polish\n | 'pl-PL'\n // Turkish\n | 'tr-TR'\n // Vietnamese\n | 'vi-VN'\n // Thai\n | 'th-TH'\n // Indonesian\n | 'id-ID'\n // Malay\n | 'ms-MY'\n // Swedish\n | 'sv-SE'\n // Norwegian\n | 'nb-NO'\n // Danish\n | 'da-DK'\n // Finnish\n | 'fi-FI'\n // Greek\n | 'el-GR'\n // Czech\n | 'cs-CZ'\n // Romanian\n | 'ro-RO'\n // Hungarian\n | 'hu-HU'\n // Hebrew\n | 'he-IL'\n // Ukrainian\n | 'uk-UA'\n // Generic fallback (allow any valid BCP 47)\n | string;\n\n/**\n * Language code (ISO 639-1)\n */\nexport type LanguageCode =\n | 'en'\n | 'es'\n | 'fr'\n | 'de'\n | 'it'\n | 'pt'\n | 'ru'\n | 'zh'\n | 'ja'\n | 'ko'\n | 'ar'\n | 'hi'\n | 'bn'\n | 'ta'\n | 'te'\n | 'ml'\n | 'nl'\n | 'pl'\n | 'tr'\n | 'vi'\n | 'th'\n | 'id'\n | 'ms'\n | 'sv'\n | 'nb'\n | 'da'\n | 'fi'\n | 'el'\n | 'cs'\n | 'ro'\n | 'hu'\n | 'he'\n | 'uk'\n | string;\n\n/**\n * Translation dictionary type\n * Supports nested keys like { errors: { notFound: \"...\" } }\n * Includes null to match JSON data which may contain null values\n */\nexport type TranslationDictionary = {\n [key: string]: string | TranslationDictionary | null;\n};\n\n/**\n * Flattened translation map\n */\nexport type FlatTranslationMap = Record<string, string>;\n\n/**\n * Translation variables for interpolation\n */\nexport type TranslationVariables = Record<string, string | number | boolean>;\n\n/**\n * Pluralization rules\n */\nexport interface PluralForms {\n zero?: string;\n one: string;\n two?: string;\n few?: string;\n many?: string;\n other: string;\n}\n\n/**\n * Translation function type\n */\nexport type TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string) => string;\n\n/**\n * Plural translation function type\n */\nexport type PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables) => string;\n\n/**\n * I18n configuration options\n */\nexport interface I18nConfig {\n /** Default locale if none specified */\n defaultLocale: LocaleCode;\n /** Fallback locale when translation is missing */\n fallbackLocale?: LocaleCode;\n /** Path to locales directory */\n localesPath: string;\n /** Supported locales (if empty, all locales in directory are supported) */\n supportedLocales?: LocaleCode[];\n /** Whether to load translations lazily */\n lazyLoad?: boolean;\n /** Cache translations in memory */\n enableCache?: boolean;\n /** Namespace for this service (e.g., 'tags', 'auth') */\n namespace?: string;\n /** Log missing translations */\n logMissing?: boolean;\n /** Return key on missing translation instead of empty string */\n returnKeyOnMissing?: boolean;\n}\n\n/**\n * Parsed locale information\n */\nexport interface ParsedLocale {\n /** Full locale code (e.g., 'en-US') */\n locale: LocaleCode;\n /** Language code (e.g., 'en') */\n language: LanguageCode;\n /** Region code (e.g., 'US') */\n region?: string;\n /** Quality factor from Accept-Language header (0-1) */\n quality: number;\n}\n\n/**\n * I18n context for requests\n */\nexport interface I18nContext {\n /** Current locale */\n locale: LocaleCode;\n /** Language code */\n language: LanguageCode;\n /** Region code */\n region?: string;\n /** Geography: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE') — from x-geo-country header */\n country?: string;\n /** Geography: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR') — from x-geo-currency header */\n currency?: string;\n /** Geography: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York') — from x-geo-timezone header */\n timezone?: string;\n /** Translation function */\n t: TranslateFunction;\n /** Plural translation function */\n tp: PluralTranslateFunction;\n /** Format number for locale */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format currency for locale */\n formatCurrency: (value: number, currency: string) => string;\n /** Format date for locale */\n formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Format relative time for locale */\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => string;\n}\n\n/**\n * I18n instance interface\n */\nexport interface II18n {\n /** Get current locale */\n getLocale(): LocaleCode;\n /** Set current locale */\n setLocale(locale: LocaleCode): void;\n /** Get supported locales */\n getSupportedLocales(): LocaleCode[];\n /** Check if locale is supported */\n isSupported(locale: LocaleCode): boolean;\n /** Translate a key */\n t: TranslateFunction;\n /** Translate with pluralization */\n tp: PluralTranslateFunction;\n /** Create context for request */\n createContext(locale: LocaleCode): I18nContext;\n /** Load translations for a locale */\n loadLocale(locale: LocaleCode): Promise<void>;\n /** Get all translations for a locale */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined;\n}\n\n/**\n * Language direction\n */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * Language metadata\n */\nexport interface LanguageInfo {\n code: LanguageCode;\n name: string;\n nativeName: string;\n direction: TextDirection;\n locales: LocaleCode[];\n}\n\n/**\n * RTL languages\n */\nexport const RTL_LANGUAGES: LanguageCode[] = ['ar', 'he'];\n\n/**\n * Get text direction for a language\n */\nexport function getTextDirection(language: LanguageCode): TextDirection {\n return RTL_LANGUAGES.includes(language) ? 'rtl' : 'ltr';\n}\n","/**\n * I18n Parser Module\n *\n * Parses Accept-Language headers and locale strings\n */\n\nimport type { LocaleCode, LanguageCode, ParsedLocale } from './types.js';\n\n/**\n * Parse a single locale string (e.g., 'en-US', 'fr;q=0.9')\n */\nexport function parseLocaleString(localeStr: string): ParsedLocale | null {\n const trimmed = localeStr.trim();\n if (!trimmed || trimmed === '*') {\n return null;\n }\n\n // Parse quality factor if present (e.g., 'en-US;q=0.9')\n const [localePart, ...params] = trimmed.split(';');\n let quality = 1.0;\n\n for (const param of params) {\n const [key, value] = param.trim().split('=');\n if (key?.toLowerCase() === 'q' && value) {\n const parsed = parseFloat(value);\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n quality = parsed;\n }\n }\n }\n\n const locale = localePart?.trim();\n if (!locale) {\n return null;\n }\n\n // Parse language and region\n const parts = locale.split('-');\n const language = parts[0]?.toLowerCase() as LanguageCode;\n const region = parts[1]?.toUpperCase();\n\n // Reconstruct proper locale code\n const normalizedLocale = region ? `${language}-${region}` : language;\n\n return {\n locale: normalizedLocale,\n language,\n region,\n quality,\n };\n}\n\n/**\n * Parse Accept-Language header\n *\n * Example: 'en-US,en;q=0.9,fr;q=0.8,de;q=0.7'\n *\n * @param header The Accept-Language header value\n * @returns Array of parsed locales sorted by quality (highest first)\n */\nexport function parseAcceptLanguage(header: string | null | undefined): ParsedLocale[] {\n if (!header || header.trim() === '') {\n return [];\n }\n\n const locales: ParsedLocale[] = [];\n\n // Split by comma and parse each part\n const parts = header.split(',');\n for (const part of parts) {\n const parsed = parseLocaleString(part);\n if (parsed) {\n locales.push(parsed);\n }\n }\n\n // Sort by quality factor (highest first)\n locales.sort((a, b) => b.quality - a.quality);\n\n return locales;\n}\n\n/**\n * Extract locale from request headers\n *\n * Checks in order:\n * 1. X-Locale header (explicit override)\n * 2. X-Language header (explicit override)\n * 3. Accept-Language header\n *\n * @param request Web API Request object\n * @param defaultLocale Default locale to return if none found\n * @returns The best matching locale\n */\nexport function extractLocaleFromRequest(request: Request, defaultLocale: LocaleCode = 'en-US'): ParsedLocale {\n // Check explicit locale header first\n const explicitLocale = request.headers.get('x-locale') || request.headers.get('x-language');\n if (explicitLocale) {\n const parsed = parseLocaleString(explicitLocale);\n if (parsed) {\n return parsed;\n }\n }\n\n // Parse Accept-Language header\n const acceptLanguage = request.headers.get('accept-language');\n const parsedLocales = parseAcceptLanguage(acceptLanguage);\n\n if (parsedLocales.length > 0) {\n return parsedLocales[0]!;\n }\n\n // Return default locale\n const [language, region] = defaultLocale.split('-');\n return {\n locale: defaultLocale,\n language: language as LanguageCode,\n region: region,\n quality: 1.0,\n };\n}\n\n/**\n * Normalize a locale code to standard format\n *\n * @param locale The locale to normalize\n * @returns Normalized locale (e.g., 'en-us' -> 'en-US')\n */\nexport function normalizeLocale(locale: string): LocaleCode {\n const parts = locale.trim().split(/[-_]/);\n const language = parts[0]?.toLowerCase();\n const region = parts[1]?.toUpperCase();\n\n if (region) {\n return `${language}-${region}`;\n }\n return language as LocaleCode;\n}\n\n/**\n * Get the language code from a locale\n */\nexport function getLanguageFromLocale(locale: LocaleCode): LanguageCode {\n return locale.split('-')[0] as LanguageCode;\n}\n\n/**\n * Get the region code from a locale\n */\nexport function getRegionFromLocale(locale: LocaleCode): string | undefined {\n const parts = locale.split('-');\n return parts[1];\n}\n\n/**\n * Find the best matching locale from available locales\n *\n * @param requested Requested locales (sorted by preference)\n * @param available Available locales\n * @param defaultLocale Default locale to use if no match\n * @returns The best matching locale\n */\nexport function findBestMatch(\n requested: ParsedLocale[],\n available: LocaleCode[],\n defaultLocale: LocaleCode\n): LocaleCode {\n const availableSet = new Set(available.map((l) => l.toLowerCase()));\n\n for (const req of requested) {\n // Try exact match first (e.g., 'en-US')\n if (availableSet.has(req.locale.toLowerCase())) {\n // Return with proper casing from available\n return available.find((l) => l.toLowerCase() === req.locale.toLowerCase()) || req.locale;\n }\n\n // Try language-only match (e.g., 'en')\n if (availableSet.has(req.language.toLowerCase())) {\n return available.find((l) => l.toLowerCase() === req.language.toLowerCase()) || req.language;\n }\n\n // Try to find any locale with the same language\n const langMatch = available.find((l) => getLanguageFromLocale(l).toLowerCase() === req.language.toLowerCase());\n if (langMatch) {\n return langMatch;\n }\n }\n\n return defaultLocale;\n}\n","/**\n * I18n Loader Module\n *\n * Loads and manages translation files from the filesystem\n */\n\nimport { readdir, stat } from 'fs/promises';\nimport { join, extname, basename, resolve, relative } from 'path';\nimport type { LocaleCode, TranslationDictionary, FlatTranslationMap, I18nConfig } from './types.js';\nimport { normalizeLocale, getLanguageFromLocale } from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Translation cache\n */\nconst translationCache = new Map<string, FlatTranslationMap>();\n\n/**\n * Validate that a file path is within the allowed base directory\n * Prevents directory traversal attacks\n *\n * @param filePath The file path to validate\n * @param baseDir The base directory that must contain the file\n * @returns The resolved absolute path if valid\n * @throws Error if path escapes the base directory\n */\nfunction validateFilePath(filePath: string, baseDir: string): string {\n const resolvedBase = resolve(baseDir);\n const resolvedPath = resolve(filePath);\n const relativePath = relative(resolvedBase, resolvedPath);\n\n // If relative path starts with '..' or is absolute, it's outside base directory\n if (relativePath.startsWith('..') || resolve(relativePath) === relativePath) {\n throw new Error(`Invalid file path: ${filePath} is outside base directory ${baseDir}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely read a file with path validation\n * Path is validated before reading to prevent directory traversal attacks\n */\nasync function safeReadFile(filePath: string, baseDir: string): Promise<string> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return Bun.file(validatedPath).text();\n}\n\n/**\n * Safely stat a file with path validation\n * Path is validated before stat to prevent directory traversal attacks\n */\nasync function safeStat(filePath: string, baseDir: string): Promise<Awaited<ReturnType<typeof stat>> | null> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return stat(validatedPath).catch(() => null);\n}\n\n/**\n * Safely read directory with path validation\n * Path is validated before readdir to prevent directory traversal attacks\n */\nasync function safeReaddir(dirPath: string, baseDir: string): Promise<string[]> {\n const validatedPath = validateFilePath(dirPath, baseDir);\n return readdir(validatedPath);\n}\n\n/**\n * Flatten a nested translation dictionary\n *\n * @param obj The nested dictionary\n * @param prefix Current key prefix\n * @returns Flattened key-value map\n */\nexport function flattenDictionary(obj: TranslationDictionary, prefix = ''): FlatTranslationMap {\n const result: FlatTranslationMap = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'string') {\n result[fullKey] = value;\n } else if (value !== null && typeof value === 'object') {\n // Check null first to avoid different-types-comparison warning\n // (typeof null === 'object' is a JavaScript quirk)\n Object.assign(result, flattenDictionary(value, fullKey));\n }\n }\n\n return result;\n}\n\n/**\n * Load a single translation file\n *\n * @param filePath Path to the translation file\n * @param baseDir Base directory for validation\n * @returns The loaded translations\n */\nexport async function loadTranslationFile(filePath: string, baseDir: string): Promise<TranslationDictionary> {\n try {\n const content = await safeReadFile(filePath, baseDir);\n const data = JSON.parse(content) as TranslationDictionary;\n return data;\n } catch (error) {\n logger.error(`[I18n] Failed to load translation file: ${filePath}`, error);\n return {};\n }\n}\n\n/**\n * Get cache key for translations\n */\nfunction getCacheKey(namespace: string | undefined, locale: LocaleCode): string {\n return namespace ? `${namespace}:${locale}` : locale;\n}\n\n/**\n * Load translations for a locale from a directory\n *\n * Supports multiple file formats:\n * - locales/en-US.json (single file per locale)\n * - locales/en-US/common.json (directory per locale with namespace files)\n * - locales/en.json (language-only fallback)\n *\n * @param config I18n configuration\n * @param locale The locale to load\n * @returns Flattened translations map\n */\nexport async function loadTranslationsForLocale(config: I18nConfig, locale: LocaleCode): Promise<FlatTranslationMap> {\n const cacheKey = getCacheKey(config.namespace, locale);\n\n // Check cache first\n if (config.enableCache !== false && translationCache.has(cacheKey)) {\n return translationCache.get(cacheKey)!;\n }\n\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const result: FlatTranslationMap = {};\n\n // Try loading in order of specificity\n const pathsToTry = [\n // Most specific: full locale\n join(config.localesPath, `${normalizedLocale}.json`),\n // Directory format\n join(config.localesPath, normalizedLocale),\n // Language only fallback\n join(config.localesPath, `${language}.json`),\n // Language directory\n join(config.localesPath, language),\n ];\n\n for (const path of pathsToTry) {\n try {\n const stats = await safeStat(path, config.localesPath);\n if (!stats) continue;\n\n if (stats.isFile() && path.endsWith('.json')) {\n // Single file\n const translations = await loadTranslationFile(path, config.localesPath);\n const flattened = flattenDictionary(translations);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded translations from ${path}`);\n break;\n } else if (stats.isDirectory()) {\n // Directory with multiple namespace files\n const files = await safeReaddir(path, config.localesPath);\n for (const file of files) {\n if (extname(file) === '.json') {\n const namespace = basename(file, '.json');\n const filePath = join(path, file);\n const translations = await loadTranslationFile(filePath, config.localesPath);\n const flattened = flattenDictionary(translations, namespace);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded namespace ${namespace} from ${filePath}`);\n }\n }\n break;\n }\n } catch {\n // Continue trying next path\n }\n }\n\n // If nothing loaded and we have a fallback, try that\n if (Object.keys(result).length === 0 && config.fallbackLocale && config.fallbackLocale !== locale) {\n logger.warn(`[I18n] No translations found for ${locale}, trying fallback ${config.fallbackLocale}`);\n const fallbackTranslations = await loadTranslationsForLocale(\n { ...config, fallbackLocale: undefined },\n config.fallbackLocale\n );\n Object.assign(result, fallbackTranslations);\n }\n\n // Cache the result\n if (config.enableCache !== false) {\n translationCache.set(cacheKey, result);\n }\n\n return result;\n}\n\n/**\n * Discover available locales in a directory\n *\n * @param localesPath Path to locales directory\n * @returns Array of available locale codes\n */\nexport async function discoverLocales(localesPath: string): Promise<LocaleCode[]> {\n const locales: LocaleCode[] = [];\n\n try {\n const validatedBasePath = resolve(localesPath);\n const entries = await readdir(validatedBasePath);\n\n for (const entry of entries) {\n const entryPath = join(validatedBasePath, entry);\n const stats = await safeStat(entryPath, validatedBasePath);\n if (!stats) continue;\n\n if (stats.isFile() && entry.endsWith('.json')) {\n // Single file: en-US.json or en.json\n const locale = basename(entry, '.json');\n locales.push(normalizeLocale(locale));\n } else if (stats.isDirectory()) {\n // Directory: en-US/ or en/\n locales.push(normalizeLocale(entry));\n }\n }\n } catch (error) {\n logger.error(`[I18n] Failed to discover locales in ${localesPath}`, error);\n }\n\n return locales;\n}\n\n/**\n * Preload all translations for supported locales\n *\n * @param config I18n configuration\n */\nexport async function preloadAllTranslations(config: I18nConfig): Promise<void> {\n const locales = config.supportedLocales || (await discoverLocales(config.localesPath));\n\n logger.info(`[I18n] Preloading translations for ${locales.length} locales...`);\n\n await Promise.all(\n locales.map(async (locale) => {\n try {\n await loadTranslationsForLocale(config, locale);\n } catch (error) {\n logger.error(`[I18n] Failed to preload locale ${locale}`, error);\n }\n })\n );\n\n logger.info(`[I18n] Preloaded translations for: ${locales.join(', ')}`);\n}\n\n/**\n * Clear the translation cache\n *\n * @param namespace Optional namespace to clear (clears all if not provided)\n */\nexport function clearTranslationCache(namespace?: string): void {\n if (namespace) {\n for (const key of translationCache.keys()) {\n if (key.startsWith(`${namespace}:`)) {\n translationCache.delete(key);\n }\n }\n } else {\n translationCache.clear();\n }\n}\n\n/**\n * Get cached translations for a locale\n */\nexport function getCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode\n): FlatTranslationMap | undefined {\n return translationCache.get(getCacheKey(namespace, locale));\n}\n\n/**\n * Set translations in cache (useful for testing or dynamic loading)\n */\nexport function setCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode,\n translations: FlatTranslationMap\n): void {\n translationCache.set(getCacheKey(namespace, locale), translations);\n}\n","/**\n * I18n Class\n *\n * Main internationalization class providing translation and formatting functions\n */\n\nimport type {\n LocaleCode,\n LanguageCode,\n I18nConfig,\n I18nContext,\n II18n,\n FlatTranslationMap,\n TranslationVariables,\n TranslateFunction,\n PluralTranslateFunction,\n} from './types.js';\nimport { getTextDirection } from './types.js';\nimport { loadTranslationsForLocale, preloadAllTranslations, discoverLocales, getCachedTranslations } from './loader.js';\nimport {\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n extractLocaleFromRequest,\n} from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Pluralization category based on CLDR rules\n */\ntype PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\n/**\n * English and most Germanic/Romance languages (simple one/other)\n */\nfunction getEnglishPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * French pluralization (0 or 1 = one, else other)\n */\nfunction getFrenchPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0 || absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * Slavic languages (Russian, Ukrainian) - complex: one, few, many, other\n */\nfunction getSlavicPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (mod10 === 1 && mod100 !== 11) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n if (mod10 === 0 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 11 && mod100 <= 14)) return 'many';\n return 'other';\n}\n\n/**\n * Arabic pluralization (zero, one, two, few, many, other)\n */\nfunction getArabicPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0) return 'zero';\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n const mod100 = absCount % 100;\n if (mod100 >= 3 && mod100 <= 10) return 'few';\n if (mod100 >= 11 && mod100 <= 99) return 'many';\n return 'other';\n}\n\n/**\n * Polish/Czech pluralization (one, few, many)\n */\nfunction getPolishCzechPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (absCount === 1) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n return 'many';\n}\n\n/**\n * Romanian pluralization (one, few, other)\n */\nfunction getRomanianPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n const mod100 = absCount % 100;\n if (absCount === 0 || (mod100 >= 1 && mod100 <= 19)) return 'few';\n return 'other';\n}\n\n/**\n * Hebrew pluralization (one, two, other)\n */\nfunction getHebrewPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n return 'other';\n}\n\n/**\n * Get plural category for a count in a given language\n * Based on CLDR plural rules: https://cldr.unicode.org/index/cldr-spec/plural-rules\n */\nfunction getPluralCategory(language: LanguageCode, count: number): PluralCategory {\n const absCount = Math.abs(count);\n\n // English and most Germanic/Romance languages\n const englishLanguages = [\n 'en',\n 'de',\n 'es',\n 'it',\n 'nl',\n 'sv',\n 'da',\n 'nb',\n 'fi',\n 'pt',\n 'el',\n 'hu',\n 'tr',\n 'id',\n 'ms',\n 'th',\n 'vi',\n 'ko',\n 'zh',\n 'ja',\n ];\n if (englishLanguages.includes(language)) {\n return getEnglishPluralCategory(absCount);\n }\n\n // French\n if (language === 'fr') {\n return getFrenchPluralCategory(absCount);\n }\n\n // Russian, Ukrainian\n if (language === 'ru' || language === 'uk') {\n return getSlavicPluralCategory(absCount);\n }\n\n // Arabic\n if (language === 'ar') {\n return getArabicPluralCategory(absCount);\n }\n\n // Polish, Czech\n if (language === 'pl' || language === 'cs') {\n return getPolishCzechPluralCategory(absCount);\n }\n\n // Romanian\n if (language === 'ro') {\n return getRomanianPluralCategory(absCount);\n }\n\n // Hebrew\n if (language === 'he') {\n return getHebrewPluralCategory(absCount);\n }\n\n // Default: simple singular/plural\n return getEnglishPluralCategory(absCount);\n}\n\n/**\n * Interpolate variables in a translation string\n *\n * Supports:\n * - {{variable}} - simple interpolation\n * - {{variable, number}} - number formatting (future)\n * - {{variable, date}} - date formatting (future)\n */\nfunction interpolate(text: string, variables?: TranslationVariables): string {\n if (!variables || !text) {\n return text;\n }\n\n // Use more specific pattern to avoid catastrophic backtracking\n // Matches {{ variableName }} with word characters (alphanumeric and underscore)\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key: string) => {\n const value = variables[key.trim()];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if variable not found\n });\n}\n\n/**\n * I18n Class\n *\n * Main class for internationalization functionality\n */\nexport class I18n implements II18n {\n private config: I18nConfig;\n private currentLocale: LocaleCode;\n private supportedLocales: LocaleCode[] = [];\n private initialized = false;\n\n constructor(config: I18nConfig) {\n this.config = {\n ...config,\n fallbackLocale: config.fallbackLocale || 'en-US',\n enableCache: config.enableCache !== false,\n returnKeyOnMissing: config.returnKeyOnMissing !== false,\n logMissing: config.logMissing !== false,\n };\n this.currentLocale = normalizeLocale(config.defaultLocale);\n }\n\n /**\n * Initialize the i18n instance\n * Discovers available locales and optionally preloads translations\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Discover available locales\n if (this.config.supportedLocales && this.config.supportedLocales.length > 0) {\n this.supportedLocales = this.config.supportedLocales;\n } else {\n this.supportedLocales = await discoverLocales(this.config.localesPath);\n }\n\n // Preload translations if not lazy loading\n if (!this.config.lazyLoad) {\n await preloadAllTranslations(this.config);\n }\n\n this.initialized = true;\n logger.info(`[I18n] Initialized with ${this.supportedLocales.length} locales, default: ${this.currentLocale}`);\n }\n\n /**\n * Get current locale\n */\n getLocale(): LocaleCode {\n return this.currentLocale;\n }\n\n /**\n * Set current locale\n */\n setLocale(locale: LocaleCode): void {\n this.currentLocale = normalizeLocale(locale);\n }\n\n /**\n * Get supported locales\n */\n getSupportedLocales(): LocaleCode[] {\n return [...this.supportedLocales];\n }\n\n /**\n * Check if a locale is supported\n */\n isSupported(locale: LocaleCode): boolean {\n const normalized = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalized);\n\n return this.supportedLocales.some((l) => {\n const supportedNorm = normalizeLocale(l);\n // Exact match or language match\n return supportedNorm === normalized || getLanguageFromLocale(supportedNorm) === language;\n });\n }\n\n /**\n * Load translations for a specific locale\n */\n async loadLocale(locale: LocaleCode): Promise<void> {\n await loadTranslationsForLocale(this.config, locale);\n }\n\n /**\n * Get all translations for a locale\n */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined {\n return getCachedTranslations(this.config.namespace, locale);\n }\n\n /**\n * Translate a key\n */\n t: TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string): string => {\n return this.translate(this.currentLocale, key, variables, defaultValue);\n };\n\n /**\n * Translate with pluralization\n */\n tp: PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables): string => {\n return this.translatePlural(this.currentLocale, key, count, variables);\n };\n\n /**\n * Internal translate method\n */\n private translate(locale: LocaleCode, key: string, variables?: TranslationVariables, defaultValue?: string): string {\n const translations = getCachedTranslations(this.config.namespace, locale);\n let text = translations?.[key];\n\n // Try fallback locale if not found\n if (!text && this.config.fallbackLocale && locale !== this.config.fallbackLocale) {\n const fallbackTranslations = getCachedTranslations(this.config.namespace, this.config.fallbackLocale);\n text = fallbackTranslations?.[key];\n }\n\n // Try language-only fallback\n if (!text) {\n const language = getLanguageFromLocale(locale);\n if (language !== locale) {\n const langTranslations = getCachedTranslations(this.config.namespace, language);\n text = langTranslations?.[key];\n }\n }\n\n if (!text) {\n if (this.config.logMissing) {\n logger.warn(`[I18n] Missing translation for key: ${key} in locale: ${locale}`);\n }\n // Return default value, key, or empty string — interpolated.\n //\n // The caller's fallback is a real message, not a placeholder for one, so\n // it gets the same `{{var}}` substitution a found translation does.\n // Without this a missing key degrades to raw markup in user-facing output\n // (e.g. a careers confirmation email reading \"Hi {{name}}, thanks for\n // applying for the {{position}} role\"), which is worse than the untranslated\n // English it was meant to fall back to.\n return interpolate(defaultValue ?? (this.config.returnKeyOnMissing ? key : ''), variables);\n }\n\n return interpolate(text, variables);\n }\n\n /**\n * Internal translate with pluralization\n */\n private translatePlural(locale: LocaleCode, key: string, count: number, variables?: TranslationVariables): string {\n const language = getLanguageFromLocale(locale);\n const category = getPluralCategory(language, count);\n\n // Try plural-specific key first (e.g., 'items.one', 'items.other')\n const pluralKey = `${key}.${category}`;\n let text = this.translate(locale, pluralKey, undefined, '');\n\n // Fallback to 'other' if specific form not found\n if (!text && category !== 'other') {\n text = this.translate(locale, `${key}.other`, undefined, '');\n }\n\n // Final fallback to base key\n if (!text) {\n text = this.translate(locale, key, undefined, key);\n }\n\n return interpolate(text, { ...variables, count });\n }\n\n /**\n * Create an i18n context for a specific locale\n */\n createContext(locale: LocaleCode): I18nContext {\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const region = getRegionFromLocale(normalizedLocale);\n\n // Create bound translate functions for this locale\n const t: TranslateFunction = (key, variables, defaultValue) => {\n return this.translate(normalizedLocale, key, variables, defaultValue);\n };\n\n const tp: PluralTranslateFunction = (key, count, variables) => {\n return this.translatePlural(normalizedLocale, key, count, variables);\n };\n\n const formatNumber = (value: number, options?: Intl.NumberFormatOptions): string => {\n return new Intl.NumberFormat(normalizedLocale, options).format(value);\n };\n\n const formatCurrency = (value: number, currency: string): string => {\n return new Intl.NumberFormat(normalizedLocale, {\n style: 'currency',\n currency,\n }).format(value);\n };\n\n const formatDate = (date: Date | string, options?: Intl.DateTimeFormatOptions): string => {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(normalizedLocale, options).format(dateObj);\n };\n\n const formatRelativeTime = (value: number, unit: Intl.RelativeTimeFormatUnit): string => {\n return new Intl.RelativeTimeFormat(normalizedLocale, { numeric: 'auto' }).format(value, unit);\n };\n\n return {\n locale: normalizedLocale,\n language,\n region,\n t,\n tp,\n formatNumber,\n formatCurrency,\n formatDate,\n formatRelativeTime,\n };\n }\n\n /**\n * Create context from a request\n */\n createContextFromRequest(request: Request): I18nContext {\n const parsed = extractLocaleFromRequest(request, this.config.defaultLocale);\n const bestMatch = findBestMatch([parsed], this.supportedLocales, this.config.defaultLocale);\n return this.createContext(bestMatch);\n }\n\n /**\n * Get language metadata\n */\n getLanguageInfo(locale: LocaleCode): {\n code: LanguageCode;\n direction: 'ltr' | 'rtl';\n locale: LocaleCode;\n region?: string;\n } {\n const language = getLanguageFromLocale(locale);\n const region = getRegionFromLocale(locale);\n const direction = getTextDirection(language);\n\n return {\n code: language,\n direction,\n locale,\n region,\n };\n }\n}\n\n/**\n * Singleton instance (optional, for simpler usage)\n */\nlet globalI18n: I18n | null = null;\n\n/**\n * Initialize global i18n instance\n */\nexport async function initializeI18n(config: I18nConfig): Promise<I18n> {\n globalI18n = new I18n(config);\n await globalI18n.initialize();\n return globalI18n;\n}\n\n/**\n * Get global i18n instance\n */\nexport function getI18n(): I18n | null {\n return globalI18n;\n}\n\n/**\n * Create a new i18n instance (for isolated use)\n */\nexport function createI18n(config: I18nConfig): I18n {\n return new I18n(config);\n}\n","/**\n * I18n Translation Helpers\n *\n * Provides utilities for getting translated messages from GraphQL/request context.\n * These helpers work with any context that has an optional `i18n` property.\n *\n * Falls back to the provided default message if i18n is not available or translation is missing.\n *\n * @example\n * ```typescript\n * import { t, createTranslator } from '@burdenoff/be-sdk';\n *\n * // Direct usage with context\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n * const message = t(ctx, 'tags.errors.keyExists', 'Tag {{key}} already exists', { key: 'my-tag' });\n *\n * // Create a bound translator for a specific context\n * const translate = createTranslator(ctx);\n * const message = translate('tags.errors.notFound', 'Tag not found');\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { I18nContext, TranslationVariables } from './types.js';\n\n/**\n * Context with optional i18n\n * Works with any object that has an optional i18n property\n */\nexport interface I18nCapableContext {\n i18n?: I18nContext;\n}\n\n/**\n * Interpolate variables in a string\n *\n * @param text - Text with {{variable}} placeholders\n * @param variables - Variables to interpolate\n * @returns Interpolated string\n */\nfunction interpolateVariables(text: string, variables?: TranslationVariables): string {\n if (!variables) return text;\n\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Get a translated message from context\n *\n * This is the primary function for getting translations in providers and resolvers.\n * It gracefully handles cases where i18n is not available by returning the default message.\n *\n * @param ctx - Context with optional i18n (GraphQL context, request context, etc.)\n * @param key - Translation key (e.g., 'tags.errors.notFound')\n * @param defaultMessage - Fallback message if translation not found\n * @param variables - Optional variables for interpolation\n * @returns Translated message or default message\n *\n * @example\n * ```typescript\n * // Simple usage\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n *\n * // With variables\n * const message = t(ctx, 'tags.errors.keyAlreadyExists', 'Tag with key {{key}} already exists', { key: 'my-tag' });\n *\n * // In a GraphQL resolver\n * if (!userId) {\n * throw new Error(t(context, 'common.errors.notAuthenticated', 'User not authenticated'));\n * }\n * ```\n */\nexport function t(\n ctx: I18nCapableContext,\n key: string,\n defaultMessage: string,\n variables?: TranslationVariables\n): string {\n // If i18n is not available, interpolate and return default message\n if (!ctx.i18n?.t) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n // Get translation with fallback to default\n const translated = ctx.i18n.t(key, variables, defaultMessage);\n\n // If translation returns the key (not found), use default message\n if (translated === key) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n return translated;\n}\n\n/**\n * Translator function type\n */\nexport type Translator = (key: string, defaultMessage: string, variables?: TranslationVariables) => string;\n\n/**\n * Create a bound translator function for a specific context\n *\n * This is useful when you need to pass a translator to services or\n * when you want to avoid repeating the context parameter.\n *\n * @param ctx - Context with optional i18n\n * @returns Translate function bound to the context\n *\n * @example\n * ```typescript\n * // Create translator\n * const translate = createTranslator(ctx);\n *\n * // Use it multiple times\n * const msg1 = translate('tags.errors.notFound', 'Tag not found');\n * const msg2 = translate('tags.errors.keyExists', 'Key {{key}} exists', { key: 'foo' });\n *\n * // Pass to a service\n * await someService.process(data, { translate });\n * ```\n */\nexport function createTranslator(ctx: I18nCapableContext): Translator {\n return (key: string, defaultMessage: string, variables?: TranslationVariables) => {\n return t(ctx, key, defaultMessage, variables);\n };\n}\n\n/**\n * Check if context has i18n support\n *\n * @param ctx - Context to check\n * @returns True if i18n is available and initialized\n */\nexport function hasI18n(ctx: I18nCapableContext): ctx is I18nCapableContext & { i18n: I18nContext } {\n return ctx.i18n?.t !== undefined;\n}\n\n/**\n * Get the current locale from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLocale - Default locale if i18n not available\n * @returns Current locale code\n */\nexport function getLocale(ctx: I18nCapableContext, defaultLocale: string = 'en-US'): string {\n return ctx.i18n?.locale ?? defaultLocale;\n}\n\n/**\n * Get the current language from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLanguage - Default language if i18n not available\n * @returns Current language code\n */\nexport function getLanguage(ctx: I18nCapableContext, defaultLanguage: string = 'en'): string {\n return ctx.i18n?.language ?? defaultLanguage;\n}\n"]}
@@ -1,5 +1,5 @@
1
- export { E as EvaluationContext, F as FeatureFlagProvider, a as FeatureFlagProviderConfig, b as FlagEvaluation, c as FlagType, G as GatedOperationType, O as OperationsFlagGatePluginOptions, R as ResolutionDetails, d as createOperationsFlagGatePlugin } from '../index-BTgCpWAg.js';
2
- import '../types-BuP_sFzk.js';
1
+ export { E as EvaluationContext, F as FeatureFlagProvider, a as FeatureFlagProviderConfig, b as FlagEvaluation, c as FlagType, G as GatedOperationType, O as OperationsFlagGatePluginOptions, R as ResolutionDetails, d as createOperationsFlagGatePlugin } from '../index-C8DEfUQd.js';
2
+ import '../types-Dg2F8FNa.js';
3
3
  import 'graphql';
4
4
  import 'graphql-yoga';
5
5
  import '../client-CCXpAZ2r.js';
@@ -1,4 +1,4 @@
1
- export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t } from '../chunk-ULFFX3YE.js';
1
+ export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t } from '../chunk-UJG32VIP.js';
2
2
  import '../chunk-CBZNP6RF.js';
3
3
  import '../chunk-XE4OXN2W.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { Y as YogaPlugin } from './types-BuP_sFzk.js';
1
+ import { Y as YogaPlugin } from './types-Dg2F8FNa.js';
2
2
 
3
3
  type FlagType = 'BOOLEAN' | 'STRING' | 'NUMBER' | 'JSON';
4
4
  interface EvaluationContext {
package/dist/index.d.ts CHANGED
@@ -34,12 +34,12 @@ export { a as Instrumentation } from './index-CXPvdXhS.js';
34
34
  export { i as Layer } from './index-BCUkR8sC.js';
35
35
  export { i as Crypto } from './index-e_18DzAg.js';
36
36
  export { i as Gateway } from './index-Dy6neH2G.js';
37
- export { i as FeatureFlags } from './index-BTgCpWAg.js';
37
+ export { i as FeatureFlags } from './index-C8DEfUQd.js';
38
38
  export { i as Captcha, R as RecaptchaVerifyOptions, a as RecaptchaVerifyResult, b as isCaptchaEnabled, v as verifyCaptcha, c as verifyCaptchaIfEnabled } from './index-B70b5mYS.js';
39
39
  export { i as Platform } from './index-PJZzGd8r.js';
40
40
  export { C as CircuitBreakerConfig, h as DEFAULT_CIRCUIT_BREAKER_CONFIG, i as DEFAULT_GATEWAY_RETRY_CONFIG, D as DEFAULT_GATEWAY_ROUTING, b as DEFAULT_LAYER_RESOURCES, c as DEFAULT_LAYER_STREAMS, f as GatewayRequestHeaders, g as GatewayRetryConfig, G as GatewayRoutingConfig, L as LayerConfig, a as LayerFullConfig, d as LayerGatewayConfig, e as LayerResourceUrls, S as ServiceLayer } from './layer-GNAVXBMf.js';
41
41
  export { S as ShutdownDisposable, d as disposeAll, g as getRegisteredDisposableCount, r as registerDisposable, u as unregisterDisposable } from './shutdown-registry-CW9LryO8.js';
42
- import './types-BuP_sFzk.js';
42
+ import './types-Dg2F8FNa.js';
43
43
  import 'graphql';
44
44
  import 'graphql-yoga';
45
45
  import './client-CCXpAZ2r.js';
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ import { QueueType, EventQueueFactory } from './chunk-JNJSSBKO.js';
24
24
  export { graphql_exports as GraphQL } from './chunk-UM32ZA3G.js';
25
25
  import './chunk-QLVKMWFA.js';
26
26
  import './chunk-S7LWYERE.js';
27
- export { i18n_exports as I18n, createTranslator, getLanguage, getLocale, hasI18n, t } from './chunk-ULFFX3YE.js';
27
+ export { i18n_exports as I18n, createTranslator, getLanguage, getLocale, hasI18n, t } from './chunk-UJG32VIP.js';
28
28
  export { init_exports as Init } from './chunk-J4GHZLIY.js';
29
29
  export { RESOURCE_CAP_DEFAULTS, ResourceCapExceededError, ResourceCapsModule, configureResourceCaps, getResourceCaps } from './chunk-XWVP4MC6.js';
30
30
  import './chunk-AWPNRV3L.js';
@@ -35,15 +35,15 @@ export { layer_exports as Layer } from './chunk-7UJXIX4I.js';
35
35
  import './chunk-VFCMR5GX.js';
36
36
  import { ContextManager } from './chunk-RZOFS2BQ.js';
37
37
  export { ContextManager } from './chunk-RZOFS2BQ.js';
38
+ import { AuthModule } from './chunk-RXMOV3YE.js';
39
+ export { AuthModule } from './chunk-RXMOV3YE.js';
40
+ export { utils_exports as Utils } from './chunk-B7I4TABG.js';
38
41
  export { cache_exports as Cache } from './chunk-NSGICODT.js';
39
42
  import { disposeAll } from './chunk-VBXPFYZ5.js';
40
43
  export { lifecycle_exports as Lifecycle, disposeAll, getRegisteredDisposableCount, registerDisposable, unregisterDisposable } from './chunk-VBXPFYZ5.js';
41
44
  export { captcha_exports as Captcha, isCaptchaEnabled, verifyCaptcha, verifyCaptchaIfEnabled } from './chunk-YMZEUTD2.js';
42
- import { AuthModule } from './chunk-RXMOV3YE.js';
43
- export { AuthModule } from './chunk-RXMOV3YE.js';
44
- export { utils_exports as Utils } from './chunk-B7I4TABG.js';
45
- export { crypto_exports as Crypto } from './chunk-SBS4S2PJ.js';
46
45
  export { createInternalClient, createInternalClientForTenant, createInternalClientForWorkspaces } from './chunk-VI4VSNTI.js';
46
+ export { crypto_exports as Crypto } from './chunk-SBS4S2PJ.js';
47
47
  import { DatabaseModule } from './chunk-A6DGEZJ4.js';
48
48
  export { DatabaseModule } from './chunk-A6DGEZJ4.js';
49
49
  import { APIError, NetworkError, TimeoutError, ValidationError } from './chunk-QGBXVNRM.js';
@@ -1,5 +1,5 @@
1
- import { W as WorkspaceSecret, I as IActor, J as JWTPayload, S as ServerDefinition, a as ServerInstance, b as ITenant, G as GraphQLContext, Y as YogaPlugin } from '../types-BuP_sFzk.js';
2
- export { C as ConsentContext, E as ElysiaApp, c as IContextFilterInput, d as IOperationContext, e as IOrganization, f as IProduct, g as IProject, h as ITracking, i as IWorkspace, M as ModuleGraphConfig, P as PrismaClientConstructor, R as RESTEndpoint, j as ServerConfig, k as ServerI18nConfig, l as ServerInfo, m as WspaceGraphQLContext } from '../types-BuP_sFzk.js';
1
+ import { W as WorkspaceSecret, I as IActor, J as JWTPayload, S as ServerDefinition, a as ServerInstance, b as ITenant, G as GraphQLContext, Y as YogaPlugin } from '../types-Dg2F8FNa.js';
2
+ export { C as ConsentContext, E as ElysiaApp, c as IContextFilterInput, d as IOperationContext, e as IOrganization, f as IProduct, g as IProject, h as ITracking, i as IWorkspace, M as ModuleGraphConfig, P as PrismaClientConstructor, R as RESTEndpoint, j as ServerConfig, k as ServerI18nConfig, l as ServerInfo, m as WspaceGraphQLContext } from '../types-Dg2F8FNa.js';
3
3
  import * as jose from 'jose';
4
4
  import { VerifyOptions } from 'jsonwebtoken';
5
5
  import { I as I18n } from '../i18n-DrdPTann.js';
@@ -2,7 +2,7 @@ import { createHumanReadableErrorPlugin, formatHttpError, normalizeGraphQLRespon
2
2
  export { UserFacingGraphQLError, createHttpErrorResponse, createHumanReadableErrorPlugin, createWorkspaceGuardPlugin, formatHttpError, normalizeError, normalizeExecutionResultErrors, normalizeGraphQLResponse, normalizeGraphQLResponsePayload, toUserFacingGraphQLError } from '../chunk-OQLDXOZ3.js';
3
3
  import { getWorkspaceQuotaRegistry } from '../chunk-U4HHNEFE.js';
4
4
  import { setWorkspaceContext } from '../chunk-KESVEZB2.js';
5
- import { I18n } from '../chunk-ULFFX3YE.js';
5
+ import { I18n } from '../chunk-UJG32VIP.js';
6
6
  import { getMetricsRegistry } from '../chunk-AWPNRV3L.js';
7
7
  import { ContextManager } from '../chunk-RZOFS2BQ.js';
8
8
  import { logger } from '../chunk-CBZNP6RF.js';
@@ -569,6 +569,7 @@ async function createServer(definition) {
569
569
  }
570
570
  const isDev = config.environment !== "production";
571
571
  const enablePlayground = config.enablePlayground ?? isDev;
572
+ const batching = config.batching ?? true;
572
573
  const workspaceGuardEnabled = config.workspaceGuard?.enabled ?? boundary === "wspace";
573
574
  logger.info(`[Server] Boundary: ${boundary}, workspace guard: ${workspaceGuardEnabled ? "enabled" : "disabled"}`);
574
575
  const workspaceGuardPlugins = workspaceGuardEnabled ? [
@@ -578,7 +579,9 @@ async function createServer(definition) {
578
579
  })
579
580
  ] : [];
580
581
  const graphqlEndpoint = config.graphqlEndpoint || "/graphql";
581
- logger.info("[Server] Setting up GraphQL Yoga with provided schema...");
582
+ logger.info("[Server] Setting up GraphQL Yoga with provided schema...", {
583
+ batching
584
+ });
582
585
  const responseHeadersPlugin = {
583
586
  onResponse: /* @__PURE__ */ __name(({ response, serverContext }) => {
584
587
  const yogaContext = serverContext;
@@ -593,6 +596,7 @@ async function createServer(definition) {
593
596
  graphqlEndpoint,
594
597
  schema,
595
598
  graphiql: enablePlayground,
599
+ batching,
596
600
  logging: {
597
601
  debug: /* @__PURE__ */ __name((...args) => logger.debug("[GraphQL]", ...args), "debug"),
598
602
  info: /* @__PURE__ */ __name((...args) => logger.info("[GraphQL]", ...args), "info"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/auth.ts","../../src/server/context.ts","../../src/server/security.ts","../../src/server/quotaGaugeRefresh.ts","../../src/server/server.ts"],"names":["getDbFn","getDb","prismaModule","joseModule","jwtModule","getJose","getJwt","jwt","default","authConfig","configureAuth","config","logger","debug","fetchWorkspaceSecret","workspaceId","db","workspace","client","findUnique","where","id","jwtSecret","JSON","parse","stringify","error","warn","configureDefaultAuth","generateSymmetricSecret","joseLib","secret","generateSecret","jwk","exportJWK","verifyJWT","token","options","decoded","decode","complete","payload","verifiedJwt","verify","mapPayloadToActor","decodedJwt","decodeJwt","workspace_id","workspaceSecret","keyLikeSecret","importJWK","jwtVerify","err","decodeJWT","sub","type","actor_type","tenant_id","org_id","isAdmin","authCheck","actor","Error","workspaceCheck","context","actorId","requireWorkspace","orgCheck","organization","orgId","tenantCheck","tenant","contextOptions","configureContext","getHeader","request","key","headers","get","toLowerCase","undefined","compareSecret","provided","expected","providedBuffer","Buffer","from","expectedBuffer","length","crypto","timingSafeEqual","shouldTrustActorHeaders","nodeEnv","process","env","expectedGatewayToken","providedGatewayToken","extractTracking","forwardedFor","realIp","ip","split","trim","userAgent","extractActor","actorType","userRole","authHeader","startsWith","substring","extractTenant","tenantId","tenantEndpoint","endpoint","defaultTenant","extractOrganization","extractWorkspace","extractProject","projectId","extractProduct","productId","extractGeography","country","currency","timezone","toUpperCase","extractConsentContext","grantedBy","scopesHeader","grantedAtHeader","expiresAtHeader","scopes","map","s","grantedAt","Date","expiresAt","buildContext","project","product","tracking","consentContext","i18n","createContextFromRequest","geo","locale","language","t","tp","formatNumber","value","String","formatCurrency","formatDate","date","formatRelativeTime","unit","onBehalfOf","wsCtxPayload","organizationId","rawHeader","setWorkspaceContext","ContextManager","setCfAccessContext","responseHeaders","Headers","getContextOptions","LOCALHOST_ORIGINS","normalizeCorsOrigins","origins","environment","normalized","Array","isArray","origin","filter","Boolean","includes","resolveAllowedCorsOrigin","requestOrigin","allowedOrigins","canAccessGraphExport","envMs","name","fallback","raw","parsed","Number","parseInt","isFinite","QUOTA_GAUGE_TTL_MS","QUOTA_GAUGE_REFRESH_TIMEOUT_MS","createQuotaGaugeRefresher","opts","ttlMs","timeoutMs","now","refreshedAt","inFlight","refresh","timer","Promise","race","resolve","collect","then","setTimeout","clearTimeout","lastRefreshedAt","serverStartTime","quotaGaugeRefresher","getWorkspaceQuotaRegistry","collectAll","createServer","definition","prismaClient","schema","moduleGraph","restEndpoints","yogaPlugins","customBuildContext","workspaceExtensionConfig","disableWorkspaceExtension","onShutdown","Elysia","BunAdapter","cors","createYoga","initializeDatabase","getDatabaseManager","createSecurityPlugin","createMetricsPlugin","createWorkspaceGuardPlugin","info","serviceName","boundary","shouldEnableWorkspaceExtension","workspaceExtension","connect","registerShutdownHandlers","enableWorkspaceExtension","i18nInstance","enabled","localesPath","I18n","defaultLocale","fallbackLocale","supportedLocales","namespace","lazyLoad","logMissing","enableCache","returnKeyOnMissing","initialize","getSupportedLocales","join","isDev","enablePlayground","workspaceGuardEnabled","workspaceGuard","workspaceGuardPlugins","whitelistedOperations","graphqlEndpoint","responseHeadersPlugin","onResponse","response","serverContext","yogaContext","forEach","append","yoga","graphiql","logging","args","plugins","createHumanReadableErrorPlugin","defaultContext","app","adapter","corsOrigins","use","credentials","allowedHeaders","methods","rawBodyEndpoints","ep","rawBody","rawBodyPaths","Map","path","rawBodyMatchers","regexPattern","replace","regex","RegExp","matchRawBodyEndpoint","pathname","exactMatch","isMatch","test","onRequest","url","URL","method","isHealthRoute","buildCorsHeaders","allowedOrigin","rawBodyEndpoint","corsHeaders","Response","status","text","result","handler","Object","entries","set","body","statusText","formatted","formatHttpError","promClientMod","prom","collectDefaultMetrics","register","promBody","metrics","sdkBody","getMetricsRegistry","toPrometheusFormat","combined","contentType","yogaRoutes","shouldHandleByYoga","yogaResponse","normalizeGraphQLResponse","fetch","csrfSkipRoutes","loginEndpoints","enableCSRF","enableSessionSecurity","healthResponse","service","version","serviceVersion","timestamp","toISOString","getSchema","query","exportAll","types","entityTypes","exportEntities","exportRelationships","createHttpErrorResponse","post","put","patch","delete","host","port","serverInstance","server","start","listen","hostname","elysiaApp","stop","shutdown","disconnect","getInfo","uptime","Math","floor","getTime","startedAt","gracefulShutdown","signal","exit","on","configureServerAuth"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Server Auth Module\n *\n * JWT verification with workspace secret fetching for microservices.\n * Handles HS256 tokens with secrets stored in workspace database.\n */\n\nimport { logger } from '../logger/index.js';\nimport type { IActor, JWTPayload, WorkspaceSecret } from './types.js';\n\n// Type imports from packages\nimport type * as jose from 'jose';\nimport type { VerifyOptions, Jwt, JwtPayload } from 'jsonwebtoken';\n\n/**\n * Workspace model interface for fetching JWT secrets\n */\ninterface WorkspaceModel {\n findUnique: (args: { where: { id: string } }) => Promise<{ jwtSecret?: unknown } | null>;\n}\n\ninterface DbClient {\n client: {\n workspace: WorkspaceModel;\n };\n}\n\n// Import getDb dynamically to avoid circular dependencies\nlet getDbFn: (() => DbClient) | null = null;\n\nasync function getDb(): Promise<DbClient> {\n if (!getDbFn) {\n const prismaModule = await import('../prisma/index.js');\n // Use unknown first then cast to avoid type inference issues\n getDbFn = prismaModule.getDb as unknown as () => DbClient;\n }\n return getDbFn();\n}\n\n// Interface for the subset of jsonwebtoken we use\ninterface JwtModule {\n decode(token: string, options?: { complete?: boolean }): string | Jwt | JwtPayload | null;\n verify(token: string, secretOrPublicKey: string, options?: VerifyOptions): string | JwtPayload;\n}\n\n// Module cache for dynamic imports\nlet joseModule: typeof jose | null = null;\nlet jwtModule: JwtModule | null = null;\n\nasync function getJose(): Promise<typeof jose> {\n if (!joseModule) {\n joseModule = await import('jose');\n }\n return joseModule;\n}\n\nasync function getJwt(): Promise<JwtModule> {\n if (!jwtModule) {\n const jwt = await import('jsonwebtoken');\n // Handle both ESM and CJS module formats\n jwtModule = (jwt as { default?: JwtModule }).default ?? jwt;\n }\n return jwtModule;\n}\n\n/**\n * Fetch workspace secret callback type\n */\nexport type FetchWorkspaceSecretFn = (workspaceId: string) => Promise<WorkspaceSecret | null>;\n\n/**\n * Auth configuration\n */\nexport interface AuthConfig {\n /** Function to fetch workspace JWT secret from database */\n fetchWorkspaceSecret: FetchWorkspaceSecretFn;\n}\n\nlet authConfig: AuthConfig | null = null;\n\n/**\n * Configure auth module with workspace secret fetching\n */\nexport function configureAuth(config: AuthConfig): void {\n authConfig = config;\n logger.debug('[ServerAuth] Auth configured');\n}\n\n/**\n * Default workspace secret fetcher\n *\n * Fetches JWT secret from workspace database. This is the standard implementation\n * that works with any microservice that has access to the workspace model.\n *\n * @param workspaceId - Workspace ID from JWT\n * @returns WorkspaceSecret or null if not found\n */\nexport async function fetchWorkspaceSecret(workspaceId: string): Promise<WorkspaceSecret | null> {\n try {\n const db = await getDb();\n const workspace = await db.client.workspace.findUnique({\n where: { id: workspaceId },\n });\n\n if (!workspace?.jwtSecret) {\n logger.debug('[ServerAuth] No JWT secret found for workspace', { workspaceId });\n return null;\n }\n\n return JSON.parse(JSON.stringify(workspace.jwtSecret)) as WorkspaceSecret;\n } catch (error) {\n logger.warn('[ServerAuth] Error fetching workspace secret', { workspaceId, error });\n return null;\n }\n}\n\n/**\n * Configure auth with default workspace secret fetcher\n *\n * This is automatically called by createServer if no custom auth is configured.\n */\nexport function configureDefaultAuth(): void {\n if (!authConfig) {\n configureAuth({ fetchWorkspaceSecret });\n logger.debug('[ServerAuth] Default auth configured with built-in workspace secret fetcher');\n }\n}\n\n/**\n * Generate a symmetric secret key for JWT signing\n * @returns JWK object with the generated key\n */\nexport async function generateSymmetricSecret(): Promise<jose.JWK> {\n const joseLib = await getJose();\n const secret = await joseLib.generateSecret('HS256');\n const jwk = await joseLib.exportJWK(secret);\n return jwk;\n}\n\n/**\n * Verify JWT token for workspace-scoped authentication\n *\n * @param token - JWT token to verify\n * @param secret - Optional secret for verification (if not provided, fetches from workspace)\n * @param options - JWT verification options\n * @returns Verified actor information or null if invalid\n */\nexport async function verifyJWT(token: string, secret?: string, options: VerifyOptions = {}): Promise<IActor | null> {\n try {\n const jwt = await getJwt();\n const joseLib = await getJose();\n\n // Decode to check algorithm and extract workspace_id\n const decoded = jwt.decode(token, { complete: true });\n\n if (!decoded || typeof decoded === 'string' || !decoded.payload || typeof decoded.payload !== 'object') {\n logger.warn('[ServerAuth] Invalid token format');\n return null;\n }\n\n // For workspace-scoped HS256 tokens\n if (secret) {\n // Use provided secret\n const verifiedJwt = jwt.verify(token, secret, options) as JWTPayload;\n return mapPayloadToActor(verifiedJwt);\n }\n\n // Fetch secret from workspace database\n const decodedJwt = joseLib.decodeJwt(token) as JWTPayload;\n if (!decodedJwt.workspace_id) {\n logger.warn('[ServerAuth] No workspace_id found in token');\n return null;\n }\n\n if (!authConfig?.fetchWorkspaceSecret) {\n logger.error('[ServerAuth] Auth not configured - call configureAuth() first');\n return null;\n }\n\n const workspaceSecret = await authConfig.fetchWorkspaceSecret(decodedJwt.workspace_id);\n if (!workspaceSecret) {\n logger.warn('[ServerAuth] Workspace secret not found');\n return null;\n }\n\n const keyLikeSecret = await joseLib.importJWK(workspaceSecret, 'HS256');\n const verifiedJwt = await joseLib.jwtVerify(token, keyLikeSecret, options as jose.JWTVerifyOptions);\n return mapPayloadToActor(verifiedJwt.payload as unknown as JWTPayload);\n } catch (err) {\n logger.warn('[ServerAuth] Error verifying JWT:', err);\n return null;\n }\n}\n\n/**\n * Decode JWT without verification (for extracting claims)\n */\nexport async function decodeJWT(token: string): Promise<JWTPayload | null> {\n try {\n const joseLib = await getJose();\n return await joseLib.decodeJwt(token);\n } catch {\n return null;\n }\n}\n\n/**\n * Map JWT payload to IActor interface\n */\nfunction mapPayloadToActor(payload: JWTPayload): IActor {\n return {\n id: payload.sub,\n type: payload.actor_type ?? 'user',\n workspace_id: payload.workspace_id,\n tenant_id: payload.tenant_id,\n org_id: payload.org_id,\n isAdmin: payload['isAdmin'] as boolean | undefined,\n };\n}\n\n/**\n * Check if actor is authenticated\n */\nexport function authCheck(actor: IActor | null): IActor {\n if (!actor) {\n throw new Error('Please sign in');\n }\n return actor;\n}\n\n/**\n * Check workspace context and return actor ID and workspace ID\n */\nexport function workspaceCheck(context: { actor: IActor | null; workspace: { id: string } | null }): {\n actorId: string;\n workspaceId: string;\n} {\n const actor = authCheck(context.actor);\n\n if (!context.workspace?.id) {\n throw new Error('Please switch to a workspace');\n }\n\n return {\n actorId: actor.id,\n workspaceId: context.workspace.id,\n };\n}\n\n/**\n * Require workspace context - type narrowing guard for wspace layer services\n *\n * Validates that both actor and workspace are present in the context,\n * and returns a type-narrowed context where workspace and actor are guaranteed non-null.\n * Use this at the start of resolvers in wspace services to get typed access\n * to workspace context without optional chaining.\n *\n * @throws Error if actor is not authenticated\n * @throws Error if workspace context is missing\n *\n * @example\n * ```typescript\n * // In a resolver:\n * const ctx = requireWorkspace(context);\n * const workspaceId = ctx.workspace.id; // no optional chaining needed\n * const actorId = ctx.actor.id; // no optional chaining needed\n * ```\n */\nexport function requireWorkspace<T extends { actor: IActor | null; workspace: { id: string } | null }>(\n context: T\n): T & { actor: IActor; workspace: { id: string } } {\n // Validate actor is authenticated (throws if null)\n authCheck(context.actor);\n\n if (!context.workspace?.id) {\n throw new Error('Please switch to a workspace');\n }\n\n // Return the same context object with narrowed types\n return context as T & { actor: IActor; workspace: { id: string } };\n}\n\n/**\n * Check organization context and return actor ID and org ID\n */\nexport function orgCheck(context: { actor: IActor | null; organization: { id: string } | null }): {\n actorId: string;\n orgId: string;\n} {\n const actor = authCheck(context.actor);\n\n if (!context.organization?.id) {\n throw new Error('Please switch to an organization');\n }\n\n return {\n actorId: actor.id,\n orgId: context.organization.id,\n };\n}\n\n/**\n * Check tenant context and return tenant ID\n */\nexport function tenantCheck(context: { tenant: { id: string } | null }): string {\n if (!context.tenant?.id) {\n throw new Error('Tenant context is required');\n }\n return context.tenant.id;\n}\n\n/**\n * Get effective actor ID for \"on behalf of\" tracking\n *\n * When an app or service acts with user consent, returns the delegating user's ID.\n * Otherwise returns the direct actor ID.\n *\n * This is used to determine the `onBehalfOf` field in database audit trails:\n * - If actor is user → returns user ID (self-action)\n * - If actor is app/service with consent → returns grantedBy user ID\n * - If actor is app/service without consent → returns actor ID (self-action)\n *\n * @param context - GraphQL context with actor and optional consent context\n * @returns Effective actor ID (the responsible principal)\n *\n * @example\n * ```typescript\n * // User acting directly\n * context.actor = { id: \"user-123\", type: \"user\" }\n * context.consentContext = undefined\n * getEffectiveActorId(context) // → \"user-123\"\n *\n * // Bot acting on behalf of user\n * context.actor = { id: \"bot-456\", type: \"service\" }\n * context.consentContext = { grantedBy: \"user-789\" }\n * getEffectiveActorId(context) // → \"user-789\"\n *\n * // App acting without consent (self-action)\n * context.actor = { id: \"app-abc\", type: \"app\" }\n * context.consentContext = undefined\n * getEffectiveActorId(context) // → \"app-abc\"\n * ```\n */\nexport function getEffectiveActorId(context: {\n actor: IActor | null;\n consentContext?: { grantedBy: string } | null;\n}): string | null {\n if (!context.actor) {\n return null;\n }\n\n // If actor is app or service acting with user consent, return the delegating user\n if (\n (context.actor.type === 'app' || context.actor.type === 'service' || context.actor.type === 'service_account') &&\n context.consentContext?.grantedBy\n ) {\n return context.consentContext.grantedBy;\n }\n\n // Otherwise return the direct actor (user self-action or app/service self-action)\n return context.actor.id;\n}\n","/**\n * Server Context Module\n *\n * Builds GraphQL context from request headers, JWT, and configuration.\n * Automatically populates actor, tenant, workspace, and tracking information.\n *\n * **Actor-Based Authentication:**\n * - Production: Gateway verifies JWT → populates x-actor-* headers → services trust headers\n * - Development: Services verify JWT directly and build actor from payload\n *\n * Uses standard Web API Request (compatible with Bun/Elysia).\n */\n\nimport { logger } from '../logger/index.js';\nimport crypto from 'node:crypto';\nimport { verifyJWT } from './auth.js';\nimport type {\n GraphQLContext,\n IActor,\n ITenant,\n IOrganization,\n IWorkspace,\n IProject,\n IProduct,\n ITracking,\n} from './types.js';\nimport type { I18n, I18nContext } from '../i18n/index.js';\nimport { setWorkspaceContext } from '../prisma/workspace-extension.js';\nimport { ContextManager } from '../context/index.js';\n\n/**\n * Context builder options\n */\nexport interface ContextBuilderOptions {\n /** Database getter function */\n getDb: () => unknown;\n /** Default tenant info (optional) */\n defaultTenant?: ITenant;\n /** I18n instance (optional) */\n i18n?: I18n;\n}\n\nlet contextOptions: ContextBuilderOptions | null = null;\n\n/**\n * Configure context builder\n */\nexport function configureContext(options: ContextBuilderOptions): void {\n contextOptions = options;\n logger.debug('[ServerContext] Context builder configured');\n}\n\n/**\n * Extract header value from standard Web API Request\n */\nfunction getHeader(request: Request, key: string): string | undefined {\n return request.headers.get(key.toLowerCase()) ?? undefined;\n}\n\nfunction compareSecret(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided);\n const expectedBuffer = Buffer.from(expected);\n\n if (providedBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(providedBuffer, expectedBuffer);\n}\n\nexport function shouldTrustActorHeaders(\n request: Request,\n nodeEnv: string | undefined = process.env['NODE_ENV'],\n expectedGatewayToken: string | undefined = process.env['TRUSTED_GATEWAY_TOKEN'] ??\n process.env['INTERNAL_SERVICE_TOKEN']\n): boolean {\n if (!getHeader(request, 'x-actor-id')) {\n return false;\n }\n\n if (nodeEnv === 'production') {\n return true;\n }\n\n const providedGatewayToken =\n getHeader(request, 'x-internal-service-token') || getHeader(request, 'x-gateway-auth-token');\n if (!expectedGatewayToken || !providedGatewayToken) {\n return false;\n }\n\n return compareSecret(providedGatewayToken, expectedGatewayToken);\n}\n\n/**\n * Extract tracking information from request\n */\nfunction extractTracking(request: Request): ITracking {\n // Get IP from various possible headers\n const forwardedFor = getHeader(request, 'x-forwarded-for');\n const realIp = getHeader(request, 'x-real-ip');\n const ip = forwardedFor?.split(',')[0]?.trim() || realIp || undefined;\n\n return {\n ip,\n userAgent: getHeader(request, 'user-agent'),\n };\n}\n\n/**\n * Extract actor from gateway-injected headers or authorization header\n *\n * **Actor-Based Authentication:**\n * - If x-actor-id header exists, trust it (gateway-authenticated)\n * - Otherwise fall back to JWT verification (direct access in dev)\n *\n * This allows:\n * - Production: Gateway verifies JWT → populates x-actor-* headers → services trust headers\n * - Development: Direct service access with JWT → service verifies JWT itself\n * - Development testing: Direct headers → service trusts headers\n */\nasync function extractActor(request: Request): Promise<IActor | null> {\n // Check for gateway-injected actor headers first\n const actorId = getHeader(request, 'x-actor-id');\n\n if (actorId && shouldTrustActorHeaders(request)) {\n // Gateway has already verified JWT and populated context headers\n // Trust the headers (gateway is the security perimeter)\n logger.debug('[ServerContext] Using gateway-authenticated actor from headers');\n\n const actorType = getHeader(request, 'x-actor-type') || 'user';\n const userRole = getHeader(request, 'x-user-role');\n\n return {\n id: actorId,\n type: actorType,\n workspace_id: getHeader(request, 'x-workspace-id'),\n tenant_id: getHeader(request, 'x-tenant-id'),\n org_id: getHeader(request, 'x-org-id') || getHeader(request, 'x-organization-id'),\n isAdmin:\n actorType === 'super_admin' ||\n userRole === 'TENANT_ADMIN' ||\n userRole === 'SUPER_ADMIN' ||\n userRole === 'PLATFORM_ADMIN',\n };\n }\n\n if (actorId) {\n logger.warn('[ServerContext] Ignoring untrusted actor headers and falling back to JWT verification');\n }\n\n // FALLBACK: No gateway headers, verify JWT directly (dev/testing mode)\n const authHeader = getHeader(request, 'authorization');\n\n if (!authHeader?.startsWith('Bearer ')) {\n return null;\n }\n\n const token = authHeader.substring(7);\n\n try {\n logger.debug('[ServerContext] No gateway headers, verifying JWT directly for actor (dev mode)');\n const payload = await verifyJWT(token);\n\n if (!payload) {\n return null;\n }\n\n // Build actor from JWT payload\n return {\n id: payload.id,\n type: 'user', // Default to 'user' if not specified\n workspace_id: payload.workspace_id,\n };\n } catch (error) {\n logger.warn('[ServerContext] Invalid JWT token:', error);\n return null;\n }\n}\n\n/**\n * Extract tenant from headers\n */\nfunction extractTenant(request: Request): ITenant | null {\n // Check headers\n const tenantId = getHeader(request, 'x-tenant-id');\n const tenantEndpoint = getHeader(request, 'x-tenant-endpoint');\n\n if (tenantId) {\n return {\n id: tenantId,\n endpoint: tenantEndpoint || '',\n };\n }\n\n // Fall back to default tenant if configured\n return contextOptions?.defaultTenant || null;\n}\n\n/**\n * Extract organization from headers\n */\nfunction extractOrganization(request: Request): IOrganization | null {\n const orgId = getHeader(request, 'x-org-id') || getHeader(request, 'x-organization-id');\n\n if (orgId) {\n return { id: orgId };\n }\n\n return null;\n}\n\n/**\n * Extract workspace from headers or actor\n */\nfunction extractWorkspace(request: Request, actor: IActor | null): IWorkspace | null {\n // Check headers first\n const workspaceId = getHeader(request, 'x-workspace-id');\n\n if (workspaceId) {\n return { id: workspaceId };\n }\n\n // Fall back to workspace_id from actor\n if (actor?.workspace_id) {\n return { id: actor.workspace_id };\n }\n\n return null;\n}\n\n/**\n * Extract project from headers\n */\nfunction extractProject(request: Request): IProject | null {\n const projectId = getHeader(request, 'x-project-id');\n\n if (projectId) {\n return { id: projectId };\n }\n\n return null;\n}\n\n/**\n * Extract product from headers\n */\nfunction extractProduct(request: Request): IProduct | null {\n const productId = getHeader(request, 'x-product-id');\n\n if (productId) {\n return { id: productId };\n }\n\n return null;\n}\n\n/**\n * Extract geography context from headers\n *\n * Geography headers carry the user's selected location context,\n * used for currency defaults, tax calculations, payment routing,\n * data residency, and regional support.\n *\n * Headers:\n * - x-geo-country: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE')\n * - x-geo-currency: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR')\n * - x-geo-timezone: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York')\n */\nfunction extractGeography(request: Request): { country?: string; currency?: string; timezone?: string } {\n const country = getHeader(request, 'x-geo-country');\n const currency = getHeader(request, 'x-geo-currency');\n const timezone = getHeader(request, 'x-geo-timezone');\n\n return {\n country: country?.toUpperCase() || undefined,\n currency: currency?.toUpperCase() || undefined,\n timezone: timezone || undefined,\n };\n}\n\n/**\n * Extract consent context from headers\n *\n * When an app or service acts on behalf of a user (with user consent),\n * the gateway forwards consent headers. This function extracts them.\n *\n * Headers:\n * - x-consent-granted-by: Actor ID who granted consent (delegating user)\n * - x-consent-scope: Comma-separated scopes\n * - x-consent-granted-at: ISO timestamp when consent was granted\n * - x-consent-expires-at: ISO timestamp when consent expires\n */\nfunction extractConsentContext(request: Request): import('./types.js').ConsentContext | null {\n const grantedBy = getHeader(request, 'x-consent-granted-by');\n\n // If no grantedBy, there's no consent delegation\n if (!grantedBy) {\n return null;\n }\n\n const scopesHeader = getHeader(request, 'x-consent-scope');\n const grantedAtHeader = getHeader(request, 'x-consent-granted-at');\n const expiresAtHeader = getHeader(request, 'x-consent-expires-at');\n\n return {\n grantedBy,\n scopes: scopesHeader ? scopesHeader.split(',').map((s) => s.trim()) : undefined,\n grantedAt: grantedAtHeader ? new Date(grantedAtHeader) : undefined,\n expiresAt: expiresAtHeader ? new Date(expiresAtHeader) : undefined,\n };\n}\n\n/**\n * Build GraphQL context from standard Web Request\n *\n * Also sets the workspace context in AsyncLocalStorage for automatic\n * Prisma workspaceId injection via the workspace extension.\n */\nexport async function buildContext(request: Request): Promise<GraphQLContext> {\n if (!contextOptions) {\n throw new Error('[ServerContext] Context not configured - call configureContext() first');\n }\n\n // Extract actor from headers/JWT\n const actor = await extractActor(request);\n\n // Extract all context parts\n const tenant = extractTenant(request);\n const organization = extractOrganization(request);\n const workspace = extractWorkspace(request, actor);\n const project = extractProject(request);\n const product = extractProduct(request);\n const tracking = extractTracking(request);\n const consentContext = extractConsentContext(request);\n\n // Build i18n context if configured\n let i18n: I18nContext | undefined;\n if (contextOptions.i18n) {\n i18n = contextOptions.i18n.createContextFromRequest(request);\n }\n\n // Merge geography context from x-geo-* headers into i18n\n const geo = extractGeography(request);\n if (geo.country || geo.currency || geo.timezone) {\n if (i18n) {\n // Merge geography fields into existing i18n context\n if (geo.country) i18n.country = geo.country;\n if (geo.currency) i18n.currency = geo.currency;\n if (geo.timezone) i18n.timezone = geo.timezone;\n } else {\n // Create minimal i18n context with geography only (when i18n module not configured)\n i18n = {\n locale: 'en-US',\n language: 'en',\n country: geo.country,\n currency: geo.currency,\n timezone: geo.timezone,\n t: (key: string) => key,\n tp: (key: string) => key,\n formatNumber: (value: number) => String(value),\n formatCurrency: (value: number, currency: string) => `${currency} ${value}`,\n formatDate: (date: Date | string) => String(date),\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => `${value} ${unit}`,\n };\n }\n }\n\n // Determine onBehalfOf for audit trails\n // If actor is app/service with consent → use grantedBy (delegating user)\n // Otherwise → use actor.id (self-action)\n const onBehalfOf =\n (actor?.type === 'app' || actor?.type === 'service' || actor?.type === 'service_account') &&\n consentContext?.grantedBy\n ? consentContext.grantedBy\n : actor?.id;\n\n // Set workspace context in AsyncLocalStorage for Prisma workspace extension\n // This enables automatic workspaceId injection on create/update operations\n const wsCtxPayload = {\n workspaceId: workspace?.id,\n tenantId: tenant?.id,\n actorId: actor?.id,\n actorType: actor?.type,\n organizationId: organization?.id,\n projectId: project?.id,\n onBehalfOf,\n };\n\n logger.debug('[ServerContext] Setting workspace context', {\n workspaceId: wsCtxPayload.workspaceId ?? 'NONE',\n actorId: wsCtxPayload.actorId ?? 'NONE',\n rawHeader: getHeader(request, 'x-workspace-id') ?? 'MISSING',\n });\n\n setWorkspaceContext(wsCtxPayload);\n\n // Capture the Cloudflare Access service token for cross-layer calls.\n // NOTE: this path populates the Prisma workspace store (above), NOT the\n // general ContextManager ALS — so cross-layer clients reading\n // ContextManager.getCfAccessHeaders() would otherwise see nothing here.\n // Record it explicitly (module-level fallback) so resolver-initiated\n // cross-layer calls re-present it. No-op unless the gateway forwarded the\n // headers (alpha only; gated upstream on cf-ray).\n ContextManager.setCfAccessContext(\n getHeader(request, 'cf-access-client-id'),\n getHeader(request, 'cf-access-client-secret'),\n getHeader(request, 'x-cf-authorization')\n );\n\n return {\n request,\n actor,\n tenant,\n organization,\n workspace,\n project,\n product,\n tracking,\n consentContext: consentContext || undefined,\n onBehalfOf: onBehalfOf || actor?.id || '',\n db: contextOptions.getDb(),\n i18n,\n responseHeaders: new Headers(),\n };\n}\n\n/**\n * Get context options\n */\nexport function getContextOptions(): ContextBuilderOptions | null {\n return contextOptions;\n}\n","import type { IActor } from './types.js';\n\nconst LOCALHOST_ORIGINS = [\n 'http://localhost:3000',\n 'http://localhost:4000',\n 'http://localhost:5173',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:4000',\n 'http://127.0.0.1:5173',\n];\n\nexport function normalizeCorsOrigins(\n origins: string | string[] | undefined,\n environment: 'development' | 'staging' | 'production' | undefined\n): string[] {\n const normalized = (Array.isArray(origins) ? origins : origins?.split(',') || [])\n .map((origin) => origin.trim())\n .filter(Boolean);\n\n if (normalized.length === 0) {\n return environment === 'production' ? [] : LOCALHOST_ORIGINS;\n }\n\n if (normalized.includes('*')) {\n return environment === 'production' ? [] : LOCALHOST_ORIGINS;\n }\n\n return normalized;\n}\n\nexport function resolveAllowedCorsOrigin(requestOrigin: string | null, allowedOrigins: string[]): string | null {\n if (!requestOrigin) {\n return allowedOrigins[0] ?? null;\n }\n\n return allowedOrigins.includes(requestOrigin) ? requestOrigin : null;\n}\n\nexport function canAccessGraphExport(actor: IActor | null): boolean {\n if (!actor) {\n return false;\n }\n\n return actor.isAdmin === true || ['service', 'super_admin'].includes(actor.type);\n}\n","/**\n * Workspace quota gauge refresh throttling for the `/metrics` route.\n *\n * `WorkspaceQuotaRegistry.collectAll()` issues Prisma groupBy queries. Running\n * it inline on every Prometheus scrape made `/metrics` exactly as slow as the\n * database: services that registered quota collectors routinely exceeded a 30s\n * `scrape_timeout` and were recorded as down, even though the endpoint itself\n * was healthy.\n *\n * Scrapes are far more frequent than these values meaningfully change, so\n * refresh on a TTL, bound each refresh, and let concurrent scrapes share one\n * in-flight attempt. A slow or unavailable database then degrades gauge\n * freshness instead of failing the scrape.\n *\n * @module server/quotaGaugeRefresh\n */\n\n/**\n * Read a positive-integer millisecond setting from the environment.\n *\n * Anything unset, non-numeric, or <= 0 falls back to the default: an operator\n * typo must not silently disable the throttle that keeps `/metrics` fast.\n */\nexport function envMs(name: string, fallback: number): number {\n const raw = process.env[name];\n if (!raw) return fallback;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\n/**\n * How long a gauge snapshot is considered fresh.\n *\n * Override with `BOFF_QUOTA_GAUGE_TTL_MS` — raise it when the database is under\n * load and quota freshness matters less than scrape latency.\n */\nexport const QUOTA_GAUGE_TTL_MS = envMs('BOFF_QUOTA_GAUGE_TTL_MS', 60_000);\n\n/**\n * Upper bound on a single refresh, so a slow database cannot stall a scrape.\n *\n * Override with `BOFF_QUOTA_GAUGE_TIMEOUT_MS`. Keep it comfortably below the\n * Prometheus `scrape_timeout`, or a slow refresh still fails the scrape.\n */\nexport const QUOTA_GAUGE_REFRESH_TIMEOUT_MS = envMs('BOFF_QUOTA_GAUGE_TIMEOUT_MS', 5_000);\n\nexport interface QuotaGaugeRefresherOptions {\n /** Performs the actual (expensive) collection. */\n collect: () => Promise<unknown>;\n ttlMs?: number;\n timeoutMs?: number;\n /** Injectable clock, for tests. */\n now?: () => number;\n}\n\nexport interface QuotaGaugeRefresher {\n /** Refresh if stale. Never rejects. */\n refresh: () => Promise<void>;\n /** Epoch ms of the last completed attempt (0 when never run). */\n lastRefreshedAt: () => number;\n}\n\n/**\n * Build a TTL-throttled, timeout-bounded, single-flight refresher.\n *\n * `refresh()` never rejects — `/metrics` must keep serving prom-client and SDK\n * registry output even when the quota registry is unconfigured or erroring.\n * A failed attempt does not advance the TTL, so the next scrape retries.\n */\nexport function createQuotaGaugeRefresher(opts: QuotaGaugeRefresherOptions): QuotaGaugeRefresher {\n const ttlMs = opts.ttlMs ?? QUOTA_GAUGE_TTL_MS;\n const timeoutMs = opts.timeoutMs ?? QUOTA_GAUGE_REFRESH_TIMEOUT_MS;\n const now = opts.now ?? ((): number => Date.now());\n\n let refreshedAt = 0;\n let inFlight: Promise<void> | null = null;\n\n const refresh = async (): Promise<void> => {\n if (refreshedAt !== 0 && now() - refreshedAt < ttlMs) return;\n\n if (!inFlight) {\n inFlight = (async (): Promise<void> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.resolve(opts.collect()).then(() => undefined),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, timeoutMs);\n }),\n ]);\n // Stamp only on a completed attempt; a throw leaves the TTL expired\n // so the next scrape retries rather than serving a stale snapshot\n // forever.\n refreshedAt = now();\n } catch {\n /* unconfigured registry or failed query — keep the previous snapshot */\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n inFlight = null;\n }\n })();\n }\n\n await inFlight;\n };\n\n return { refresh, lastRefreshedAt: (): number => refreshedAt };\n}\n","/**\n * Server Module\n *\n * Main server bootstrapping with Elysia, GraphQL Yoga, and middleware.\n * Uses Bun runtime for high-performance GraphQL services.\n *\n * Provides a simple API for microservices to start a fully configured server.\n */\n\nimport { logger } from '../logger/index.js';\nimport { configureAuth, configureDefaultAuth, type FetchWorkspaceSecretFn } from './auth.js';\nimport { configureContext, buildContext } from './context.js';\nimport type {\n ServerDefinition,\n ServerInstance,\n ServerInfo,\n ElysiaApp,\n BunServerHandle,\n YogaPlugin,\n GraphQLContext,\n} from './types.js';\nimport { I18n } from '../i18n/index.js';\nimport { canAccessGraphExport, normalizeCorsOrigins, resolveAllowedCorsOrigin } from './security.js';\nimport { getMetricsRegistry } from '../instrumentation/metrics-collector.js';\nimport { getWorkspaceQuotaRegistry } from '../metrics/index.js';\nimport { createQuotaGaugeRefresher } from './quotaGaugeRefresh.js';\nimport {\n createHttpErrorResponse,\n createHumanReadableErrorPlugin,\n formatHttpError,\n normalizeGraphQLResponse,\n} from './errors.js';\n\n// Store startup time for uptime calculation\nlet serverStartTime: Date | null = null;\n\n// Workspace quota gauges cost Prisma groupBy queries, so /metrics refreshes\n// them on a TTL rather than on every scrape. See ./quotaGaugeRefresh.ts.\nconst quotaGaugeRefresher = createQuotaGaugeRefresher({\n collect: () => getWorkspaceQuotaRegistry().collectAll(),\n});\n\n/**\n * Create and configure a server instance using Elysia + GraphQL Yoga\n */\nexport async function createServer(definition: ServerDefinition): Promise<ServerInstance> {\n const {\n config,\n prismaClient,\n schema,\n moduleGraph,\n restEndpoints,\n yogaPlugins,\n buildContext: customBuildContext,\n workspaceExtensionConfig,\n disableWorkspaceExtension,\n onShutdown,\n } = definition;\n\n // Dynamic imports to avoid requiring these as hard dependencies\n const { Elysia } = await import('elysia');\n const { BunAdapter } = await import('elysia/adapter/bun');\n const { cors } = await import('@elysiajs/cors');\n const { createYoga } = await import('graphql-yoga');\n const { initializeDatabase, getDb, getDatabaseManager } = await import('../prisma/index.js');\n const { createSecurityPlugin } = await import('../middleware/index.js');\n const { createMetricsPlugin } = await import('../observability/index.js');\n const { createWorkspaceGuardPlugin } = await import('./workspace-guard.js');\n\n logger.info(`[Server] Initializing ${config.serviceName}...`);\n\n // Detect boundary from config or service name — needed before database and guard setup\n const boundary =\n config.boundary ??\n (config.serviceName.startsWith('wspace-')\n ? 'wspace'\n : config.serviceName.startsWith('global-')\n ? 'global'\n : 'wspace'); // fail-closed: default to wspace (stricter)\n\n // Initialize database\n // Workspace extension is auto-disabled for global boundary services unless explicitly enabled\n const shouldEnableWorkspaceExtension =\n disableWorkspaceExtension === true ? false : disableWorkspaceExtension === false ? true : boundary === 'wspace'; // auto-detect: enabled for wspace, disabled for global\n\n logger.info('[Server] Initializing database...', {\n boundary,\n workspaceExtension: shouldEnableWorkspaceExtension,\n });\n\n const { connect } = initializeDatabase(prismaClient, config.serviceName, {\n registerShutdownHandlers: false, // Server manages shutdown handlers itself\n enableWorkspaceExtension: shouldEnableWorkspaceExtension,\n ...(workspaceExtensionConfig ? { workspaceExtensionConfig } : {}),\n });\n await connect();\n\n // Initialize i18n if configured\n let i18nInstance: I18n | undefined;\n if (config.i18n?.enabled && config.i18n.localesPath) {\n logger.info('[Server] Initializing i18n...');\n i18nInstance = new I18n({\n defaultLocale: config.i18n.defaultLocale || 'en-US',\n fallbackLocale: config.i18n.fallbackLocale || 'en-US',\n localesPath: config.i18n.localesPath,\n supportedLocales: config.i18n.supportedLocales,\n namespace: config.i18n.namespace || config.serviceName,\n lazyLoad: config.i18n.lazyLoad,\n logMissing: config.i18n.logMissing ?? true,\n enableCache: true,\n returnKeyOnMissing: true,\n });\n await i18nInstance.initialize();\n logger.info(`[Server] i18n initialized with locales: ${i18nInstance.getSupportedLocales().join(', ')}`);\n }\n\n // Configure context builder\n configureContext({\n getDb: () => getDb(),\n i18n: i18nInstance,\n });\n\n // Auto-configure auth with default workspace secret fetcher if not already configured\n configureDefaultAuth();\n\n // Initialize module graph if provided\n if (moduleGraph) {\n logger.info('[Server] Initializing module graph...');\n await moduleGraph.initialize();\n }\n\n // Determine if playground/introspection should be enabled\n const isDev = config.environment !== 'production';\n const enablePlayground = config.enablePlayground ?? isDev;\n\n // Build workspace guard plugin — auto-enabled for wspace boundary only\n const workspaceGuardEnabled = config.workspaceGuard?.enabled ?? boundary === 'wspace';\n logger.info(`[Server] Boundary: ${boundary}, workspace guard: ${workspaceGuardEnabled ? 'enabled' : 'disabled'}`);\n\n const workspaceGuardPlugins = workspaceGuardEnabled\n ? [\n createWorkspaceGuardPlugin({\n enabled: true,\n whitelistedOperations: config.workspaceGuard?.whitelistedOperations,\n }),\n ]\n : [];\n\n // Create GraphQL Yoga instance\n const graphqlEndpoint = config.graphqlEndpoint || '/graphql';\n logger.info('[Server] Setting up GraphQL Yoga with provided schema...');\n\n const responseHeadersPlugin: YogaPlugin = {\n onResponse: ({ response, serverContext }: { response: Response; serverContext: unknown }) => {\n const yogaContext = serverContext as GraphQLContext;\n if (yogaContext?.responseHeaders) {\n yogaContext.responseHeaders.forEach((value: string, key: string) => {\n response.headers.append(key, value);\n });\n }\n },\n };\n\n const yoga = createYoga<{ request: Request }>({\n graphqlEndpoint,\n schema, // Use the schema provided by microservice\n graphiql: enablePlayground,\n logging: {\n debug: (...args) => logger.debug('[GraphQL]', ...args),\n info: (...args) => logger.info('[GraphQL]', ...args),\n warn: (...args) => logger.warn('[GraphQL]', ...args),\n error: (...args) => logger.error('[GraphQL]', ...args),\n },\n plugins: [\n createHumanReadableErrorPlugin({ serviceName: config.serviceName, environment: config.environment }),\n ...workspaceGuardPlugins,\n responseHeadersPlugin,\n ...(yogaPlugins || []),\n ],\n context: async ({ request }) => {\n // Build default context\n const defaultContext = await buildContext(request);\n\n // Apply custom context builder if provided\n if (customBuildContext) {\n return customBuildContext(defaultContext);\n }\n\n return defaultContext;\n },\n });\n\n // Create Elysia instance with Bun adapter\n const app = new Elysia({ adapter: BunAdapter });\n\n // Register CORS middleware\n const corsOrigins = normalizeCorsOrigins(config.corsOrigins, config.environment);\n\n app.use(\n cors({\n origin: corsOrigins,\n credentials: corsOrigins.length > 0,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'X-Tenant-ID',\n 'X-Workspace-ID',\n 'X-Org-ID',\n 'X-Project-ID',\n 'X-Product-ID',\n 'X-CSRF-Token',\n 'X-Service-Name',\n 'Accept-Language',\n 'X-Locale',\n 'X-Language',\n 'X-Geo-Country',\n 'X-Geo-Currency',\n 'X-Geo-Timezone',\n // Actor headers (gateway-injected or dev mode)\n 'X-Actor-ID',\n 'X-Actor-Type',\n 'X-Internal-Service-Token',\n 'X-Gateway-Auth-Token',\n ],\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n })\n );\n\n // Collect raw body endpoints for early interception\n const rawBodyEndpoints = (restEndpoints || []).filter((ep) => ep.rawBody);\n const rawBodyPaths = new Map(rawBodyEndpoints.map((ep) => [ep.path, ep]));\n const rawBodyMatchers = rawBodyEndpoints.map((endpoint) => {\n const regexPattern = endpoint.path.replace(/:[^/]+/g, '[^/]+');\n return {\n endpoint,\n regexPattern,\n regex: new RegExp(`^${regexPattern}$`),\n };\n });\n\n // Helper to match pathname against endpoint patterns (including :param placeholders)\n const matchRawBodyEndpoint = (pathname: string): (typeof rawBodyEndpoints)[0] | undefined => {\n // First try exact match (for non-parameterized paths)\n const exactMatch = rawBodyPaths.get(pathname);\n if (exactMatch) return exactMatch;\n\n // Try pattern matching for parameterized paths like /webhooks/slack/:channelId\n for (const { endpoint, regex, regexPattern } of rawBodyMatchers) {\n const isMatch = regex.test(pathname);\n logger.debug(\n `[Server] Checking ${pathname} against pattern ${endpoint.path} (regex: ${regexPattern}), match: ${isMatch}`\n );\n if (isMatch) {\n logger.debug(`[Server] Matched ${pathname} to pattern ${endpoint.path}`);\n return endpoint;\n }\n }\n\n logger.debug(`[Server] No raw body endpoint match for ${pathname}, rawBodyEndpoints: ${rawBodyEndpoints.length}`);\n return undefined;\n };\n\n // Handle GraphQL, metrics, and raw body requests BEFORE any middleware that consumes the body\n // This is critical because Yoga needs the raw request body stream\n // and webhook endpoints need raw body for signature verification\n // onRequest runs before onParse (body parsing) and onBeforeHandle\n app.onRequest(async ({ request }) => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n logger.debug(`[Server] onRequest: ${request.method} ${pathname}`);\n const isHealthRoute = pathname === '/health' || pathname.startsWith('/health/');\n\n // Build CORS headers helper\n const buildCorsHeaders = (): Record<string, string> => {\n const origin = request.headers.get('origin') || '*';\n const allowedOrigin = resolveAllowedCorsOrigin(origin === '*' ? null : origin, corsOrigins);\n const headers: Record<string, string> = {\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers':\n 'Content-Type, Authorization, X-Tenant-ID, X-Workspace-ID, X-Org-ID, X-Project-ID, X-Product-ID, X-CSRF-Token, X-Service-Name, Accept-Language, X-Locale, X-Language, X-Geo-Country, X-Geo-Currency, X-Geo-Timezone, X-Actor-ID, X-Actor-Type, X-Internal-Service-Token, X-Gateway-Auth-Token',\n };\n\n if (allowedOrigin) {\n headers['Access-Control-Allow-Origin'] = allowedOrigin;\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n\n return headers;\n };\n\n // Check if this is a raw body endpoint (webhooks) - now supports parameterized paths\n const rawBodyEndpoint = isHealthRoute ? undefined : matchRawBodyEndpoint(pathname);\n if (rawBodyEndpoint) {\n logger.debug(`[Server] Matched raw body endpoint: ${pathname} -> ${rawBodyEndpoint.path}`);\n const corsHeaders = buildCorsHeaders();\n\n // Handle CORS preflight for raw body endpoints\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n });\n }\n\n // Only process if method matches\n if (request.method !== rawBodyEndpoint.method) {\n return undefined; // Let other handlers deal with it\n }\n\n try {\n // Read raw body BEFORE any parsing\n const rawBody = await request.text();\n\n // Build context without consuming body (body already read)\n const context = await buildContext(request);\n\n // Call the handler with raw body\n const result = await rawBodyEndpoint.handler(request, context, rawBody);\n\n // If handler returns a Response, use it directly\n if (result instanceof Response) {\n // Add CORS headers\n const headers = new Headers(result.headers);\n for (const [key, value] of Object.entries(corsHeaders)) {\n headers.set(key, value);\n }\n return new Response(result.body, {\n status: result.status,\n statusText: result.statusText,\n headers,\n });\n }\n\n // Otherwise, serialize as JSON\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...corsHeaders,\n });\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers,\n });\n } catch (error) {\n logger.error(`[Server] Raw body endpoint error (${pathname}):`, error);\n const corsHeaders = buildCorsHeaders();\n const formatted = formatHttpError(error, {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n return new Response(JSON.stringify(formatted.body), {\n status: formatted.status,\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n });\n }\n }\n\n // Serve Prometheus metrics via prom-client at /metrics.\n // The graphql-yoga prometheus plugin populates the same default registry,\n // so GraphQL-level metrics (operation durations, error counts, etc.) are\n // included automatically without needing Yoga to handle this route.\n //\n // Also includes SDK MetricsRegistry metrics (business counters/histograms\n // created via @burdenoff/be-sdk/instrumentation factories) so that custom\n // service metrics are available without a separate /api/metrics endpoint.\n if (pathname === '/metrics' && request.method === 'GET') {\n try {\n const promClientMod = 'prom-client';\n const prom = (await import(promClientMod)) as unknown as {\n register: { metrics: () => Promise<string> | string; contentType?: string };\n collectDefaultMetrics: (opts?: Record<string, unknown>) => void;\n };\n try {\n prom.collectDefaultMetrics({ register: prom.register });\n } catch {\n /* already called */\n }\n const promBody = await prom.register.metrics();\n\n // Append SDK MetricsRegistry metrics (business counters, histograms,\n // gauges) that are created via @burdenoff/be-sdk/instrumentation\n // factories. The toPrometheusFormat() method is deliberately not cached\n // — each scrape gets a fresh snapshot including dynamic label values.\n //\n // Workspace quota gauges are different: collectAll() issues Prisma\n // groupBy queries, so running it inline on every scrape made /metrics\n // as slow as the database. Services registering quota collectors\n // routinely blew a 30s Prometheus scrape_timeout and reported as down.\n // Refresh on a TTL and bound each refresh, so a slow or unavailable\n // database degrades gauge freshness instead of failing the scrape.\n let sdkBody = '';\n await quotaGaugeRefresher.refresh();\n try {\n sdkBody = getMetricsRegistry().toPrometheusFormat();\n } catch {\n /* MetricsRegistry not initialised; serve prom-client output alone */\n }\n\n const combined = sdkBody ? `${promBody}\\n${sdkBody}` : promBody;\n return new Response(combined, {\n status: 200,\n headers: {\n 'Content-Type': prom.register.contentType ?? 'text/plain; version=0.0.4; charset=utf-8',\n },\n });\n } catch {\n // fall through — prom-client not installed; let Yoga handle as fallback\n }\n }\n\n // Routes that should be handled by Yoga (GraphQL endpoint only)\n const yogaRoutes = [graphqlEndpoint, `${graphqlEndpoint}/`, '/metrics'];\n const shouldHandleByYoga = yogaRoutes.includes(pathname);\n\n if (shouldHandleByYoga) {\n const corsHeaders = buildCorsHeaders();\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n });\n }\n\n // Get response from Yoga\n const yogaResponse = await normalizeGraphQLResponse(await yoga.fetch(request), {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n\n // Add CORS headers to Yoga response\n const headers = new Headers(yogaResponse.headers);\n for (const [key, value] of Object.entries(corsHeaders)) {\n headers.set(key, value);\n }\n\n // Return response with CORS headers\n return new Response(yogaResponse.body, {\n status: yogaResponse.status,\n statusText: yogaResponse.statusText,\n headers,\n });\n }\n // Return undefined to continue to next handlers for non-GraphQL requests\n return undefined;\n });\n\n // Register metrics middleware (after GraphQL interception)\n app.use(createMetricsPlugin());\n\n // Register security middleware (after GraphQL interception)\n app.use(\n createSecurityPlugin({\n csrfSkipRoutes: config.csrfSkipRoutes || ['/graphql', '/health', '/api/graph/'],\n loginEndpoints: config.loginEndpoints || [],\n enableCSRF: config.enableCSRF ?? false, // Disabled by default for GraphQL services\n enableSessionSecurity: config.enableSessionSecurity ?? false,\n })\n );\n\n // Health check endpoints\n // /health - General health check\n // /health/live - Kubernetes liveness probe\n // /health/ready - Kubernetes readiness probe\n // /health/startup - Kubernetes startup probe\n const healthResponse = () => ({\n status: 'healthy',\n service: config.serviceName,\n version: config.serviceVersion || '1.0.0',\n timestamp: new Date().toISOString(),\n });\n\n app.get('/health', healthResponse);\n app.get('/health/live', healthResponse);\n app.get('/health/ready', healthResponse);\n app.get('/health/startup', healthResponse);\n\n // Graph API endpoints (if moduleGraph provided)\n if (moduleGraph) {\n // Get graph configuration schema\n app.get('/api/graph/schema', async ({ request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n return moduleGraph.getSchema();\n });\n\n // Export all graph data\n app.get('/api/graph/export', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId } = query as { organizationId?: string; workspaceId?: string };\n return moduleGraph.exportAll(organizationId, workspaceId);\n });\n\n // Export entities only\n app.get('/api/graph/entities', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId, types } = query as {\n organizationId?: string;\n workspaceId?: string;\n types?: string;\n };\n const entityTypes = types?.split(',').map((t) => t.trim());\n return moduleGraph.exportEntities(organizationId, workspaceId, entityTypes);\n });\n\n // Export relationships only\n app.get('/api/graph/relationships', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId } = query as { organizationId?: string; workspaceId?: string };\n return moduleGraph.exportRelationships(organizationId, workspaceId);\n });\n }\n\n // Register custom REST endpoints (skip rawBody endpoints - they're handled in onRequest)\n if (restEndpoints && restEndpoints.length > 0) {\n for (const endpoint of restEndpoints) {\n // Skip rawBody endpoints - they're intercepted in onRequest before body parsing\n if (endpoint.rawBody) {\n logger.info(`[Server] Raw body endpoint registered: ${endpoint.method} ${endpoint.path}`);\n continue;\n }\n\n const handler = async ({ request }: { request: Request }): Promise<unknown> => {\n try {\n const context = await buildContext(request);\n return await endpoint.handler(request, context);\n } catch (error) {\n logger.error(`[Server] REST endpoint error (${endpoint.path}):`, error);\n return createHttpErrorResponse(error, {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n };\n\n switch (endpoint.method) {\n case 'GET':\n app.get(endpoint.path, handler);\n break;\n case 'POST':\n app.post(endpoint.path, handler);\n break;\n case 'PUT':\n app.put(endpoint.path, handler);\n break;\n case 'PATCH':\n app.patch(endpoint.path, handler);\n break;\n case 'DELETE':\n app.delete(endpoint.path, handler);\n break;\n }\n }\n }\n\n const host = config.host || '0.0.0.0';\n const port = config.port;\n\n // Create server instance\n const serverInstance: ServerInstance = {\n app: app as unknown as ElysiaApp,\n server: null,\n start: async () => {\n serverStartTime = new Date();\n\n // Call listen() which starts the server and makes app.server available\n app.listen({\n port,\n hostname: host,\n });\n\n // Access the Bun server instance from the app\n // Cast through unknown to satisfy TypeScript since Elysia's types are complex\n const elysiaApp = app as unknown as { server: BunServerHandle | null };\n serverInstance.server = elysiaApp.server;\n\n logger.info(`🚀 ${config.serviceName} is running at http://${host}:${port}${graphqlEndpoint}`);\n },\n stop: async () => {\n logger.info(`[Server] Stopping ${config.serviceName}...`);\n\n if (onShutdown) {\n await onShutdown();\n }\n\n if (moduleGraph) {\n await moduleGraph.shutdown();\n }\n\n await getDatabaseManager().disconnect();\n\n if (serverInstance.server) {\n serverInstance.server.stop();\n }\n\n logger.info(`[Server] ${config.serviceName} stopped`);\n },\n getInfo: (): ServerInfo => {\n const uptime = serverStartTime ? Math.floor((Date.now() - serverStartTime.getTime()) / 1000) : 0;\n\n return {\n serviceName: config.serviceName,\n serviceVersion: config.serviceVersion || '1.0.0',\n environment: config.environment || 'development',\n port,\n host,\n graphqlEndpoint,\n startedAt: serverStartTime?.toISOString() || '',\n uptime,\n };\n },\n };\n\n // Setup graceful shutdown handlers\n const gracefulShutdown = async (signal: string): Promise<never> => {\n logger.info(`[Server] ${signal} received, shutting down gracefully...`);\n await serverInstance.stop();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => {\n void gracefulShutdown('SIGTERM');\n });\n process.on('SIGINT', () => {\n void gracefulShutdown('SIGINT');\n });\n\n return serverInstance;\n}\n\n/**\n * Configure auth with workspace secret fetcher\n *\n * This should be called before creating the server if using workspace-scoped JWT\n */\nexport function configureServerAuth(fetchWorkspaceSecret: FetchWorkspaceSecretFn): void {\n configureAuth({ fetchWorkspaceSecret });\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/auth.ts","../../src/server/context.ts","../../src/server/security.ts","../../src/server/quotaGaugeRefresh.ts","../../src/server/server.ts"],"names":["getDbFn","getDb","prismaModule","joseModule","jwtModule","getJose","getJwt","jwt","default","authConfig","configureAuth","config","logger","debug","fetchWorkspaceSecret","workspaceId","db","workspace","client","findUnique","where","id","jwtSecret","JSON","parse","stringify","error","warn","configureDefaultAuth","generateSymmetricSecret","joseLib","secret","generateSecret","jwk","exportJWK","verifyJWT","token","options","decoded","decode","complete","payload","verifiedJwt","verify","mapPayloadToActor","decodedJwt","decodeJwt","workspace_id","workspaceSecret","keyLikeSecret","importJWK","jwtVerify","err","decodeJWT","sub","type","actor_type","tenant_id","org_id","isAdmin","authCheck","actor","Error","workspaceCheck","context","actorId","requireWorkspace","orgCheck","organization","orgId","tenantCheck","tenant","contextOptions","configureContext","getHeader","request","key","headers","get","toLowerCase","undefined","compareSecret","provided","expected","providedBuffer","Buffer","from","expectedBuffer","length","crypto","timingSafeEqual","shouldTrustActorHeaders","nodeEnv","process","env","expectedGatewayToken","providedGatewayToken","extractTracking","forwardedFor","realIp","ip","split","trim","userAgent","extractActor","actorType","userRole","authHeader","startsWith","substring","extractTenant","tenantId","tenantEndpoint","endpoint","defaultTenant","extractOrganization","extractWorkspace","extractProject","projectId","extractProduct","productId","extractGeography","country","currency","timezone","toUpperCase","extractConsentContext","grantedBy","scopesHeader","grantedAtHeader","expiresAtHeader","scopes","map","s","grantedAt","Date","expiresAt","buildContext","project","product","tracking","consentContext","i18n","createContextFromRequest","geo","locale","language","t","tp","formatNumber","value","String","formatCurrency","formatDate","date","formatRelativeTime","unit","onBehalfOf","wsCtxPayload","organizationId","rawHeader","setWorkspaceContext","ContextManager","setCfAccessContext","responseHeaders","Headers","getContextOptions","LOCALHOST_ORIGINS","normalizeCorsOrigins","origins","environment","normalized","Array","isArray","origin","filter","Boolean","includes","resolveAllowedCorsOrigin","requestOrigin","allowedOrigins","canAccessGraphExport","envMs","name","fallback","raw","parsed","Number","parseInt","isFinite","QUOTA_GAUGE_TTL_MS","QUOTA_GAUGE_REFRESH_TIMEOUT_MS","createQuotaGaugeRefresher","opts","ttlMs","timeoutMs","now","refreshedAt","inFlight","refresh","timer","Promise","race","resolve","collect","then","setTimeout","clearTimeout","lastRefreshedAt","serverStartTime","quotaGaugeRefresher","getWorkspaceQuotaRegistry","collectAll","createServer","definition","prismaClient","schema","moduleGraph","restEndpoints","yogaPlugins","customBuildContext","workspaceExtensionConfig","disableWorkspaceExtension","onShutdown","Elysia","BunAdapter","cors","createYoga","initializeDatabase","getDatabaseManager","createSecurityPlugin","createMetricsPlugin","createWorkspaceGuardPlugin","info","serviceName","boundary","shouldEnableWorkspaceExtension","workspaceExtension","connect","registerShutdownHandlers","enableWorkspaceExtension","i18nInstance","enabled","localesPath","I18n","defaultLocale","fallbackLocale","supportedLocales","namespace","lazyLoad","logMissing","enableCache","returnKeyOnMissing","initialize","getSupportedLocales","join","isDev","enablePlayground","batching","workspaceGuardEnabled","workspaceGuard","workspaceGuardPlugins","whitelistedOperations","graphqlEndpoint","responseHeadersPlugin","onResponse","response","serverContext","yogaContext","forEach","append","yoga","graphiql","logging","args","plugins","createHumanReadableErrorPlugin","defaultContext","app","adapter","corsOrigins","use","credentials","allowedHeaders","methods","rawBodyEndpoints","ep","rawBody","rawBodyPaths","Map","path","rawBodyMatchers","regexPattern","replace","regex","RegExp","matchRawBodyEndpoint","pathname","exactMatch","isMatch","test","onRequest","url","URL","method","isHealthRoute","buildCorsHeaders","allowedOrigin","rawBodyEndpoint","corsHeaders","Response","status","text","result","handler","Object","entries","set","body","statusText","formatted","formatHttpError","promClientMod","prom","collectDefaultMetrics","register","promBody","metrics","sdkBody","getMetricsRegistry","toPrometheusFormat","combined","contentType","yogaRoutes","shouldHandleByYoga","yogaResponse","normalizeGraphQLResponse","fetch","csrfSkipRoutes","loginEndpoints","enableCSRF","enableSessionSecurity","healthResponse","service","version","serviceVersion","timestamp","toISOString","getSchema","query","exportAll","types","entityTypes","exportEntities","exportRelationships","createHttpErrorResponse","post","put","patch","delete","host","port","serverInstance","server","start","listen","hostname","elysiaApp","stop","shutdown","disconnect","getInfo","uptime","Math","floor","getTime","startedAt","gracefulShutdown","signal","exit","on","configureServerAuth"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Server Auth Module\n *\n * JWT verification with workspace secret fetching for microservices.\n * Handles HS256 tokens with secrets stored in workspace database.\n */\n\nimport { logger } from '../logger/index.js';\nimport type { IActor, JWTPayload, WorkspaceSecret } from './types.js';\n\n// Type imports from packages\nimport type * as jose from 'jose';\nimport type { VerifyOptions, Jwt, JwtPayload } from 'jsonwebtoken';\n\n/**\n * Workspace model interface for fetching JWT secrets\n */\ninterface WorkspaceModel {\n findUnique: (args: { where: { id: string } }) => Promise<{ jwtSecret?: unknown } | null>;\n}\n\ninterface DbClient {\n client: {\n workspace: WorkspaceModel;\n };\n}\n\n// Import getDb dynamically to avoid circular dependencies\nlet getDbFn: (() => DbClient) | null = null;\n\nasync function getDb(): Promise<DbClient> {\n if (!getDbFn) {\n const prismaModule = await import('../prisma/index.js');\n // Use unknown first then cast to avoid type inference issues\n getDbFn = prismaModule.getDb as unknown as () => DbClient;\n }\n return getDbFn();\n}\n\n// Interface for the subset of jsonwebtoken we use\ninterface JwtModule {\n decode(token: string, options?: { complete?: boolean }): string | Jwt | JwtPayload | null;\n verify(token: string, secretOrPublicKey: string, options?: VerifyOptions): string | JwtPayload;\n}\n\n// Module cache for dynamic imports\nlet joseModule: typeof jose | null = null;\nlet jwtModule: JwtModule | null = null;\n\nasync function getJose(): Promise<typeof jose> {\n if (!joseModule) {\n joseModule = await import('jose');\n }\n return joseModule;\n}\n\nasync function getJwt(): Promise<JwtModule> {\n if (!jwtModule) {\n const jwt = await import('jsonwebtoken');\n // Handle both ESM and CJS module formats\n jwtModule = (jwt as { default?: JwtModule }).default ?? jwt;\n }\n return jwtModule;\n}\n\n/**\n * Fetch workspace secret callback type\n */\nexport type FetchWorkspaceSecretFn = (workspaceId: string) => Promise<WorkspaceSecret | null>;\n\n/**\n * Auth configuration\n */\nexport interface AuthConfig {\n /** Function to fetch workspace JWT secret from database */\n fetchWorkspaceSecret: FetchWorkspaceSecretFn;\n}\n\nlet authConfig: AuthConfig | null = null;\n\n/**\n * Configure auth module with workspace secret fetching\n */\nexport function configureAuth(config: AuthConfig): void {\n authConfig = config;\n logger.debug('[ServerAuth] Auth configured');\n}\n\n/**\n * Default workspace secret fetcher\n *\n * Fetches JWT secret from workspace database. This is the standard implementation\n * that works with any microservice that has access to the workspace model.\n *\n * @param workspaceId - Workspace ID from JWT\n * @returns WorkspaceSecret or null if not found\n */\nexport async function fetchWorkspaceSecret(workspaceId: string): Promise<WorkspaceSecret | null> {\n try {\n const db = await getDb();\n const workspace = await db.client.workspace.findUnique({\n where: { id: workspaceId },\n });\n\n if (!workspace?.jwtSecret) {\n logger.debug('[ServerAuth] No JWT secret found for workspace', { workspaceId });\n return null;\n }\n\n return JSON.parse(JSON.stringify(workspace.jwtSecret)) as WorkspaceSecret;\n } catch (error) {\n logger.warn('[ServerAuth] Error fetching workspace secret', { workspaceId, error });\n return null;\n }\n}\n\n/**\n * Configure auth with default workspace secret fetcher\n *\n * This is automatically called by createServer if no custom auth is configured.\n */\nexport function configureDefaultAuth(): void {\n if (!authConfig) {\n configureAuth({ fetchWorkspaceSecret });\n logger.debug('[ServerAuth] Default auth configured with built-in workspace secret fetcher');\n }\n}\n\n/**\n * Generate a symmetric secret key for JWT signing\n * @returns JWK object with the generated key\n */\nexport async function generateSymmetricSecret(): Promise<jose.JWK> {\n const joseLib = await getJose();\n const secret = await joseLib.generateSecret('HS256');\n const jwk = await joseLib.exportJWK(secret);\n return jwk;\n}\n\n/**\n * Verify JWT token for workspace-scoped authentication\n *\n * @param token - JWT token to verify\n * @param secret - Optional secret for verification (if not provided, fetches from workspace)\n * @param options - JWT verification options\n * @returns Verified actor information or null if invalid\n */\nexport async function verifyJWT(token: string, secret?: string, options: VerifyOptions = {}): Promise<IActor | null> {\n try {\n const jwt = await getJwt();\n const joseLib = await getJose();\n\n // Decode to check algorithm and extract workspace_id\n const decoded = jwt.decode(token, { complete: true });\n\n if (!decoded || typeof decoded === 'string' || !decoded.payload || typeof decoded.payload !== 'object') {\n logger.warn('[ServerAuth] Invalid token format');\n return null;\n }\n\n // For workspace-scoped HS256 tokens\n if (secret) {\n // Use provided secret\n const verifiedJwt = jwt.verify(token, secret, options) as JWTPayload;\n return mapPayloadToActor(verifiedJwt);\n }\n\n // Fetch secret from workspace database\n const decodedJwt = joseLib.decodeJwt(token) as JWTPayload;\n if (!decodedJwt.workspace_id) {\n logger.warn('[ServerAuth] No workspace_id found in token');\n return null;\n }\n\n if (!authConfig?.fetchWorkspaceSecret) {\n logger.error('[ServerAuth] Auth not configured - call configureAuth() first');\n return null;\n }\n\n const workspaceSecret = await authConfig.fetchWorkspaceSecret(decodedJwt.workspace_id);\n if (!workspaceSecret) {\n logger.warn('[ServerAuth] Workspace secret not found');\n return null;\n }\n\n const keyLikeSecret = await joseLib.importJWK(workspaceSecret, 'HS256');\n const verifiedJwt = await joseLib.jwtVerify(token, keyLikeSecret, options as jose.JWTVerifyOptions);\n return mapPayloadToActor(verifiedJwt.payload as unknown as JWTPayload);\n } catch (err) {\n logger.warn('[ServerAuth] Error verifying JWT:', err);\n return null;\n }\n}\n\n/**\n * Decode JWT without verification (for extracting claims)\n */\nexport async function decodeJWT(token: string): Promise<JWTPayload | null> {\n try {\n const joseLib = await getJose();\n return await joseLib.decodeJwt(token);\n } catch {\n return null;\n }\n}\n\n/**\n * Map JWT payload to IActor interface\n */\nfunction mapPayloadToActor(payload: JWTPayload): IActor {\n return {\n id: payload.sub,\n type: payload.actor_type ?? 'user',\n workspace_id: payload.workspace_id,\n tenant_id: payload.tenant_id,\n org_id: payload.org_id,\n isAdmin: payload['isAdmin'] as boolean | undefined,\n };\n}\n\n/**\n * Check if actor is authenticated\n */\nexport function authCheck(actor: IActor | null): IActor {\n if (!actor) {\n throw new Error('Please sign in');\n }\n return actor;\n}\n\n/**\n * Check workspace context and return actor ID and workspace ID\n */\nexport function workspaceCheck(context: { actor: IActor | null; workspace: { id: string } | null }): {\n actorId: string;\n workspaceId: string;\n} {\n const actor = authCheck(context.actor);\n\n if (!context.workspace?.id) {\n throw new Error('Please switch to a workspace');\n }\n\n return {\n actorId: actor.id,\n workspaceId: context.workspace.id,\n };\n}\n\n/**\n * Require workspace context - type narrowing guard for wspace layer services\n *\n * Validates that both actor and workspace are present in the context,\n * and returns a type-narrowed context where workspace and actor are guaranteed non-null.\n * Use this at the start of resolvers in wspace services to get typed access\n * to workspace context without optional chaining.\n *\n * @throws Error if actor is not authenticated\n * @throws Error if workspace context is missing\n *\n * @example\n * ```typescript\n * // In a resolver:\n * const ctx = requireWorkspace(context);\n * const workspaceId = ctx.workspace.id; // no optional chaining needed\n * const actorId = ctx.actor.id; // no optional chaining needed\n * ```\n */\nexport function requireWorkspace<T extends { actor: IActor | null; workspace: { id: string } | null }>(\n context: T\n): T & { actor: IActor; workspace: { id: string } } {\n // Validate actor is authenticated (throws if null)\n authCheck(context.actor);\n\n if (!context.workspace?.id) {\n throw new Error('Please switch to a workspace');\n }\n\n // Return the same context object with narrowed types\n return context as T & { actor: IActor; workspace: { id: string } };\n}\n\n/**\n * Check organization context and return actor ID and org ID\n */\nexport function orgCheck(context: { actor: IActor | null; organization: { id: string } | null }): {\n actorId: string;\n orgId: string;\n} {\n const actor = authCheck(context.actor);\n\n if (!context.organization?.id) {\n throw new Error('Please switch to an organization');\n }\n\n return {\n actorId: actor.id,\n orgId: context.organization.id,\n };\n}\n\n/**\n * Check tenant context and return tenant ID\n */\nexport function tenantCheck(context: { tenant: { id: string } | null }): string {\n if (!context.tenant?.id) {\n throw new Error('Tenant context is required');\n }\n return context.tenant.id;\n}\n\n/**\n * Get effective actor ID for \"on behalf of\" tracking\n *\n * When an app or service acts with user consent, returns the delegating user's ID.\n * Otherwise returns the direct actor ID.\n *\n * This is used to determine the `onBehalfOf` field in database audit trails:\n * - If actor is user → returns user ID (self-action)\n * - If actor is app/service with consent → returns grantedBy user ID\n * - If actor is app/service without consent → returns actor ID (self-action)\n *\n * @param context - GraphQL context with actor and optional consent context\n * @returns Effective actor ID (the responsible principal)\n *\n * @example\n * ```typescript\n * // User acting directly\n * context.actor = { id: \"user-123\", type: \"user\" }\n * context.consentContext = undefined\n * getEffectiveActorId(context) // → \"user-123\"\n *\n * // Bot acting on behalf of user\n * context.actor = { id: \"bot-456\", type: \"service\" }\n * context.consentContext = { grantedBy: \"user-789\" }\n * getEffectiveActorId(context) // → \"user-789\"\n *\n * // App acting without consent (self-action)\n * context.actor = { id: \"app-abc\", type: \"app\" }\n * context.consentContext = undefined\n * getEffectiveActorId(context) // → \"app-abc\"\n * ```\n */\nexport function getEffectiveActorId(context: {\n actor: IActor | null;\n consentContext?: { grantedBy: string } | null;\n}): string | null {\n if (!context.actor) {\n return null;\n }\n\n // If actor is app or service acting with user consent, return the delegating user\n if (\n (context.actor.type === 'app' || context.actor.type === 'service' || context.actor.type === 'service_account') &&\n context.consentContext?.grantedBy\n ) {\n return context.consentContext.grantedBy;\n }\n\n // Otherwise return the direct actor (user self-action or app/service self-action)\n return context.actor.id;\n}\n","/**\n * Server Context Module\n *\n * Builds GraphQL context from request headers, JWT, and configuration.\n * Automatically populates actor, tenant, workspace, and tracking information.\n *\n * **Actor-Based Authentication:**\n * - Production: Gateway verifies JWT → populates x-actor-* headers → services trust headers\n * - Development: Services verify JWT directly and build actor from payload\n *\n * Uses standard Web API Request (compatible with Bun/Elysia).\n */\n\nimport { logger } from '../logger/index.js';\nimport crypto from 'node:crypto';\nimport { verifyJWT } from './auth.js';\nimport type {\n GraphQLContext,\n IActor,\n ITenant,\n IOrganization,\n IWorkspace,\n IProject,\n IProduct,\n ITracking,\n} from './types.js';\nimport type { I18n, I18nContext } from '../i18n/index.js';\nimport { setWorkspaceContext } from '../prisma/workspace-extension.js';\nimport { ContextManager } from '../context/index.js';\n\n/**\n * Context builder options\n */\nexport interface ContextBuilderOptions {\n /** Database getter function */\n getDb: () => unknown;\n /** Default tenant info (optional) */\n defaultTenant?: ITenant;\n /** I18n instance (optional) */\n i18n?: I18n;\n}\n\nlet contextOptions: ContextBuilderOptions | null = null;\n\n/**\n * Configure context builder\n */\nexport function configureContext(options: ContextBuilderOptions): void {\n contextOptions = options;\n logger.debug('[ServerContext] Context builder configured');\n}\n\n/**\n * Extract header value from standard Web API Request\n */\nfunction getHeader(request: Request, key: string): string | undefined {\n return request.headers.get(key.toLowerCase()) ?? undefined;\n}\n\nfunction compareSecret(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided);\n const expectedBuffer = Buffer.from(expected);\n\n if (providedBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(providedBuffer, expectedBuffer);\n}\n\nexport function shouldTrustActorHeaders(\n request: Request,\n nodeEnv: string | undefined = process.env['NODE_ENV'],\n expectedGatewayToken: string | undefined = process.env['TRUSTED_GATEWAY_TOKEN'] ??\n process.env['INTERNAL_SERVICE_TOKEN']\n): boolean {\n if (!getHeader(request, 'x-actor-id')) {\n return false;\n }\n\n if (nodeEnv === 'production') {\n return true;\n }\n\n const providedGatewayToken =\n getHeader(request, 'x-internal-service-token') || getHeader(request, 'x-gateway-auth-token');\n if (!expectedGatewayToken || !providedGatewayToken) {\n return false;\n }\n\n return compareSecret(providedGatewayToken, expectedGatewayToken);\n}\n\n/**\n * Extract tracking information from request\n */\nfunction extractTracking(request: Request): ITracking {\n // Get IP from various possible headers\n const forwardedFor = getHeader(request, 'x-forwarded-for');\n const realIp = getHeader(request, 'x-real-ip');\n const ip = forwardedFor?.split(',')[0]?.trim() || realIp || undefined;\n\n return {\n ip,\n userAgent: getHeader(request, 'user-agent'),\n };\n}\n\n/**\n * Extract actor from gateway-injected headers or authorization header\n *\n * **Actor-Based Authentication:**\n * - If x-actor-id header exists, trust it (gateway-authenticated)\n * - Otherwise fall back to JWT verification (direct access in dev)\n *\n * This allows:\n * - Production: Gateway verifies JWT → populates x-actor-* headers → services trust headers\n * - Development: Direct service access with JWT → service verifies JWT itself\n * - Development testing: Direct headers → service trusts headers\n */\nasync function extractActor(request: Request): Promise<IActor | null> {\n // Check for gateway-injected actor headers first\n const actorId = getHeader(request, 'x-actor-id');\n\n if (actorId && shouldTrustActorHeaders(request)) {\n // Gateway has already verified JWT and populated context headers\n // Trust the headers (gateway is the security perimeter)\n logger.debug('[ServerContext] Using gateway-authenticated actor from headers');\n\n const actorType = getHeader(request, 'x-actor-type') || 'user';\n const userRole = getHeader(request, 'x-user-role');\n\n return {\n id: actorId,\n type: actorType,\n workspace_id: getHeader(request, 'x-workspace-id'),\n tenant_id: getHeader(request, 'x-tenant-id'),\n org_id: getHeader(request, 'x-org-id') || getHeader(request, 'x-organization-id'),\n isAdmin:\n actorType === 'super_admin' ||\n userRole === 'TENANT_ADMIN' ||\n userRole === 'SUPER_ADMIN' ||\n userRole === 'PLATFORM_ADMIN',\n };\n }\n\n if (actorId) {\n logger.warn('[ServerContext] Ignoring untrusted actor headers and falling back to JWT verification');\n }\n\n // FALLBACK: No gateway headers, verify JWT directly (dev/testing mode)\n const authHeader = getHeader(request, 'authorization');\n\n if (!authHeader?.startsWith('Bearer ')) {\n return null;\n }\n\n const token = authHeader.substring(7);\n\n try {\n logger.debug('[ServerContext] No gateway headers, verifying JWT directly for actor (dev mode)');\n const payload = await verifyJWT(token);\n\n if (!payload) {\n return null;\n }\n\n // Build actor from JWT payload\n return {\n id: payload.id,\n type: 'user', // Default to 'user' if not specified\n workspace_id: payload.workspace_id,\n };\n } catch (error) {\n logger.warn('[ServerContext] Invalid JWT token:', error);\n return null;\n }\n}\n\n/**\n * Extract tenant from headers\n */\nfunction extractTenant(request: Request): ITenant | null {\n // Check headers\n const tenantId = getHeader(request, 'x-tenant-id');\n const tenantEndpoint = getHeader(request, 'x-tenant-endpoint');\n\n if (tenantId) {\n return {\n id: tenantId,\n endpoint: tenantEndpoint || '',\n };\n }\n\n // Fall back to default tenant if configured\n return contextOptions?.defaultTenant || null;\n}\n\n/**\n * Extract organization from headers\n */\nfunction extractOrganization(request: Request): IOrganization | null {\n const orgId = getHeader(request, 'x-org-id') || getHeader(request, 'x-organization-id');\n\n if (orgId) {\n return { id: orgId };\n }\n\n return null;\n}\n\n/**\n * Extract workspace from headers or actor\n */\nfunction extractWorkspace(request: Request, actor: IActor | null): IWorkspace | null {\n // Check headers first\n const workspaceId = getHeader(request, 'x-workspace-id');\n\n if (workspaceId) {\n return { id: workspaceId };\n }\n\n // Fall back to workspace_id from actor\n if (actor?.workspace_id) {\n return { id: actor.workspace_id };\n }\n\n return null;\n}\n\n/**\n * Extract project from headers\n */\nfunction extractProject(request: Request): IProject | null {\n const projectId = getHeader(request, 'x-project-id');\n\n if (projectId) {\n return { id: projectId };\n }\n\n return null;\n}\n\n/**\n * Extract product from headers\n */\nfunction extractProduct(request: Request): IProduct | null {\n const productId = getHeader(request, 'x-product-id');\n\n if (productId) {\n return { id: productId };\n }\n\n return null;\n}\n\n/**\n * Extract geography context from headers\n *\n * Geography headers carry the user's selected location context,\n * used for currency defaults, tax calculations, payment routing,\n * data residency, and regional support.\n *\n * Headers:\n * - x-geo-country: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE')\n * - x-geo-currency: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR')\n * - x-geo-timezone: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York')\n */\nfunction extractGeography(request: Request): { country?: string; currency?: string; timezone?: string } {\n const country = getHeader(request, 'x-geo-country');\n const currency = getHeader(request, 'x-geo-currency');\n const timezone = getHeader(request, 'x-geo-timezone');\n\n return {\n country: country?.toUpperCase() || undefined,\n currency: currency?.toUpperCase() || undefined,\n timezone: timezone || undefined,\n };\n}\n\n/**\n * Extract consent context from headers\n *\n * When an app or service acts on behalf of a user (with user consent),\n * the gateway forwards consent headers. This function extracts them.\n *\n * Headers:\n * - x-consent-granted-by: Actor ID who granted consent (delegating user)\n * - x-consent-scope: Comma-separated scopes\n * - x-consent-granted-at: ISO timestamp when consent was granted\n * - x-consent-expires-at: ISO timestamp when consent expires\n */\nfunction extractConsentContext(request: Request): import('./types.js').ConsentContext | null {\n const grantedBy = getHeader(request, 'x-consent-granted-by');\n\n // If no grantedBy, there's no consent delegation\n if (!grantedBy) {\n return null;\n }\n\n const scopesHeader = getHeader(request, 'x-consent-scope');\n const grantedAtHeader = getHeader(request, 'x-consent-granted-at');\n const expiresAtHeader = getHeader(request, 'x-consent-expires-at');\n\n return {\n grantedBy,\n scopes: scopesHeader ? scopesHeader.split(',').map((s) => s.trim()) : undefined,\n grantedAt: grantedAtHeader ? new Date(grantedAtHeader) : undefined,\n expiresAt: expiresAtHeader ? new Date(expiresAtHeader) : undefined,\n };\n}\n\n/**\n * Build GraphQL context from standard Web Request\n *\n * Also sets the workspace context in AsyncLocalStorage for automatic\n * Prisma workspaceId injection via the workspace extension.\n */\nexport async function buildContext(request: Request): Promise<GraphQLContext> {\n if (!contextOptions) {\n throw new Error('[ServerContext] Context not configured - call configureContext() first');\n }\n\n // Extract actor from headers/JWT\n const actor = await extractActor(request);\n\n // Extract all context parts\n const tenant = extractTenant(request);\n const organization = extractOrganization(request);\n const workspace = extractWorkspace(request, actor);\n const project = extractProject(request);\n const product = extractProduct(request);\n const tracking = extractTracking(request);\n const consentContext = extractConsentContext(request);\n\n // Build i18n context if configured\n let i18n: I18nContext | undefined;\n if (contextOptions.i18n) {\n i18n = contextOptions.i18n.createContextFromRequest(request);\n }\n\n // Merge geography context from x-geo-* headers into i18n\n const geo = extractGeography(request);\n if (geo.country || geo.currency || geo.timezone) {\n if (i18n) {\n // Merge geography fields into existing i18n context\n if (geo.country) i18n.country = geo.country;\n if (geo.currency) i18n.currency = geo.currency;\n if (geo.timezone) i18n.timezone = geo.timezone;\n } else {\n // Create minimal i18n context with geography only (when i18n module not configured)\n i18n = {\n locale: 'en-US',\n language: 'en',\n country: geo.country,\n currency: geo.currency,\n timezone: geo.timezone,\n t: (key: string) => key,\n tp: (key: string) => key,\n formatNumber: (value: number) => String(value),\n formatCurrency: (value: number, currency: string) => `${currency} ${value}`,\n formatDate: (date: Date | string) => String(date),\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => `${value} ${unit}`,\n };\n }\n }\n\n // Determine onBehalfOf for audit trails\n // If actor is app/service with consent → use grantedBy (delegating user)\n // Otherwise → use actor.id (self-action)\n const onBehalfOf =\n (actor?.type === 'app' || actor?.type === 'service' || actor?.type === 'service_account') &&\n consentContext?.grantedBy\n ? consentContext.grantedBy\n : actor?.id;\n\n // Set workspace context in AsyncLocalStorage for Prisma workspace extension\n // This enables automatic workspaceId injection on create/update operations\n const wsCtxPayload = {\n workspaceId: workspace?.id,\n tenantId: tenant?.id,\n actorId: actor?.id,\n actorType: actor?.type,\n organizationId: organization?.id,\n projectId: project?.id,\n onBehalfOf,\n };\n\n logger.debug('[ServerContext] Setting workspace context', {\n workspaceId: wsCtxPayload.workspaceId ?? 'NONE',\n actorId: wsCtxPayload.actorId ?? 'NONE',\n rawHeader: getHeader(request, 'x-workspace-id') ?? 'MISSING',\n });\n\n setWorkspaceContext(wsCtxPayload);\n\n // Capture the Cloudflare Access service token for cross-layer calls.\n // NOTE: this path populates the Prisma workspace store (above), NOT the\n // general ContextManager ALS — so cross-layer clients reading\n // ContextManager.getCfAccessHeaders() would otherwise see nothing here.\n // Record it explicitly (module-level fallback) so resolver-initiated\n // cross-layer calls re-present it. No-op unless the gateway forwarded the\n // headers (alpha only; gated upstream on cf-ray).\n ContextManager.setCfAccessContext(\n getHeader(request, 'cf-access-client-id'),\n getHeader(request, 'cf-access-client-secret'),\n getHeader(request, 'x-cf-authorization')\n );\n\n return {\n request,\n actor,\n tenant,\n organization,\n workspace,\n project,\n product,\n tracking,\n consentContext: consentContext || undefined,\n onBehalfOf: onBehalfOf || actor?.id || '',\n db: contextOptions.getDb(),\n i18n,\n responseHeaders: new Headers(),\n };\n}\n\n/**\n * Get context options\n */\nexport function getContextOptions(): ContextBuilderOptions | null {\n return contextOptions;\n}\n","import type { IActor } from './types.js';\n\nconst LOCALHOST_ORIGINS = [\n 'http://localhost:3000',\n 'http://localhost:4000',\n 'http://localhost:5173',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:4000',\n 'http://127.0.0.1:5173',\n];\n\nexport function normalizeCorsOrigins(\n origins: string | string[] | undefined,\n environment: 'development' | 'staging' | 'production' | undefined\n): string[] {\n const normalized = (Array.isArray(origins) ? origins : origins?.split(',') || [])\n .map((origin) => origin.trim())\n .filter(Boolean);\n\n if (normalized.length === 0) {\n return environment === 'production' ? [] : LOCALHOST_ORIGINS;\n }\n\n if (normalized.includes('*')) {\n return environment === 'production' ? [] : LOCALHOST_ORIGINS;\n }\n\n return normalized;\n}\n\nexport function resolveAllowedCorsOrigin(requestOrigin: string | null, allowedOrigins: string[]): string | null {\n if (!requestOrigin) {\n return allowedOrigins[0] ?? null;\n }\n\n return allowedOrigins.includes(requestOrigin) ? requestOrigin : null;\n}\n\nexport function canAccessGraphExport(actor: IActor | null): boolean {\n if (!actor) {\n return false;\n }\n\n return actor.isAdmin === true || ['service', 'super_admin'].includes(actor.type);\n}\n","/**\n * Workspace quota gauge refresh throttling for the `/metrics` route.\n *\n * `WorkspaceQuotaRegistry.collectAll()` issues Prisma groupBy queries. Running\n * it inline on every Prometheus scrape made `/metrics` exactly as slow as the\n * database: services that registered quota collectors routinely exceeded a 30s\n * `scrape_timeout` and were recorded as down, even though the endpoint itself\n * was healthy.\n *\n * Scrapes are far more frequent than these values meaningfully change, so\n * refresh on a TTL, bound each refresh, and let concurrent scrapes share one\n * in-flight attempt. A slow or unavailable database then degrades gauge\n * freshness instead of failing the scrape.\n *\n * @module server/quotaGaugeRefresh\n */\n\n/**\n * Read a positive-integer millisecond setting from the environment.\n *\n * Anything unset, non-numeric, or <= 0 falls back to the default: an operator\n * typo must not silently disable the throttle that keeps `/metrics` fast.\n */\nexport function envMs(name: string, fallback: number): number {\n const raw = process.env[name];\n if (!raw) return fallback;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\n/**\n * How long a gauge snapshot is considered fresh.\n *\n * Override with `BOFF_QUOTA_GAUGE_TTL_MS` — raise it when the database is under\n * load and quota freshness matters less than scrape latency.\n */\nexport const QUOTA_GAUGE_TTL_MS = envMs('BOFF_QUOTA_GAUGE_TTL_MS', 60_000);\n\n/**\n * Upper bound on a single refresh, so a slow database cannot stall a scrape.\n *\n * Override with `BOFF_QUOTA_GAUGE_TIMEOUT_MS`. Keep it comfortably below the\n * Prometheus `scrape_timeout`, or a slow refresh still fails the scrape.\n */\nexport const QUOTA_GAUGE_REFRESH_TIMEOUT_MS = envMs('BOFF_QUOTA_GAUGE_TIMEOUT_MS', 5_000);\n\nexport interface QuotaGaugeRefresherOptions {\n /** Performs the actual (expensive) collection. */\n collect: () => Promise<unknown>;\n ttlMs?: number;\n timeoutMs?: number;\n /** Injectable clock, for tests. */\n now?: () => number;\n}\n\nexport interface QuotaGaugeRefresher {\n /** Refresh if stale. Never rejects. */\n refresh: () => Promise<void>;\n /** Epoch ms of the last completed attempt (0 when never run). */\n lastRefreshedAt: () => number;\n}\n\n/**\n * Build a TTL-throttled, timeout-bounded, single-flight refresher.\n *\n * `refresh()` never rejects — `/metrics` must keep serving prom-client and SDK\n * registry output even when the quota registry is unconfigured or erroring.\n * A failed attempt does not advance the TTL, so the next scrape retries.\n */\nexport function createQuotaGaugeRefresher(opts: QuotaGaugeRefresherOptions): QuotaGaugeRefresher {\n const ttlMs = opts.ttlMs ?? QUOTA_GAUGE_TTL_MS;\n const timeoutMs = opts.timeoutMs ?? QUOTA_GAUGE_REFRESH_TIMEOUT_MS;\n const now = opts.now ?? ((): number => Date.now());\n\n let refreshedAt = 0;\n let inFlight: Promise<void> | null = null;\n\n const refresh = async (): Promise<void> => {\n if (refreshedAt !== 0 && now() - refreshedAt < ttlMs) return;\n\n if (!inFlight) {\n inFlight = (async (): Promise<void> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.resolve(opts.collect()).then(() => undefined),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, timeoutMs);\n }),\n ]);\n // Stamp only on a completed attempt; a throw leaves the TTL expired\n // so the next scrape retries rather than serving a stale snapshot\n // forever.\n refreshedAt = now();\n } catch {\n /* unconfigured registry or failed query — keep the previous snapshot */\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n inFlight = null;\n }\n })();\n }\n\n await inFlight;\n };\n\n return { refresh, lastRefreshedAt: (): number => refreshedAt };\n}\n","/**\n * Server Module\n *\n * Main server bootstrapping with Elysia, GraphQL Yoga, and middleware.\n * Uses Bun runtime for high-performance GraphQL services.\n *\n * Provides a simple API for microservices to start a fully configured server.\n */\n\nimport { logger } from '../logger/index.js';\nimport { configureAuth, configureDefaultAuth, type FetchWorkspaceSecretFn } from './auth.js';\nimport { configureContext, buildContext } from './context.js';\nimport type {\n ServerDefinition,\n ServerInstance,\n ServerInfo,\n ElysiaApp,\n BunServerHandle,\n YogaPlugin,\n GraphQLContext,\n} from './types.js';\nimport { I18n } from '../i18n/index.js';\nimport { canAccessGraphExport, normalizeCorsOrigins, resolveAllowedCorsOrigin } from './security.js';\nimport { getMetricsRegistry } from '../instrumentation/metrics-collector.js';\nimport { getWorkspaceQuotaRegistry } from '../metrics/index.js';\nimport { createQuotaGaugeRefresher } from './quotaGaugeRefresh.js';\nimport {\n createHttpErrorResponse,\n createHumanReadableErrorPlugin,\n formatHttpError,\n normalizeGraphQLResponse,\n} from './errors.js';\n\n// Store startup time for uptime calculation\nlet serverStartTime: Date | null = null;\n\n// Workspace quota gauges cost Prisma groupBy queries, so /metrics refreshes\n// them on a TTL rather than on every scrape. See ./quotaGaugeRefresh.ts.\nconst quotaGaugeRefresher = createQuotaGaugeRefresher({\n collect: () => getWorkspaceQuotaRegistry().collectAll(),\n});\n\n/**\n * Create and configure a server instance using Elysia + GraphQL Yoga\n */\nexport async function createServer(definition: ServerDefinition): Promise<ServerInstance> {\n const {\n config,\n prismaClient,\n schema,\n moduleGraph,\n restEndpoints,\n yogaPlugins,\n buildContext: customBuildContext,\n workspaceExtensionConfig,\n disableWorkspaceExtension,\n onShutdown,\n } = definition;\n\n // Dynamic imports to avoid requiring these as hard dependencies\n const { Elysia } = await import('elysia');\n const { BunAdapter } = await import('elysia/adapter/bun');\n const { cors } = await import('@elysiajs/cors');\n const { createYoga } = await import('graphql-yoga');\n const { initializeDatabase, getDb, getDatabaseManager } = await import('../prisma/index.js');\n const { createSecurityPlugin } = await import('../middleware/index.js');\n const { createMetricsPlugin } = await import('../observability/index.js');\n const { createWorkspaceGuardPlugin } = await import('./workspace-guard.js');\n\n logger.info(`[Server] Initializing ${config.serviceName}...`);\n\n // Detect boundary from config or service name — needed before database and guard setup\n const boundary =\n config.boundary ??\n (config.serviceName.startsWith('wspace-')\n ? 'wspace'\n : config.serviceName.startsWith('global-')\n ? 'global'\n : 'wspace'); // fail-closed: default to wspace (stricter)\n\n // Initialize database\n // Workspace extension is auto-disabled for global boundary services unless explicitly enabled\n const shouldEnableWorkspaceExtension =\n disableWorkspaceExtension === true ? false : disableWorkspaceExtension === false ? true : boundary === 'wspace'; // auto-detect: enabled for wspace, disabled for global\n\n logger.info('[Server] Initializing database...', {\n boundary,\n workspaceExtension: shouldEnableWorkspaceExtension,\n });\n\n const { connect } = initializeDatabase(prismaClient, config.serviceName, {\n registerShutdownHandlers: false, // Server manages shutdown handlers itself\n enableWorkspaceExtension: shouldEnableWorkspaceExtension,\n ...(workspaceExtensionConfig ? { workspaceExtensionConfig } : {}),\n });\n await connect();\n\n // Initialize i18n if configured\n let i18nInstance: I18n | undefined;\n if (config.i18n?.enabled && config.i18n.localesPath) {\n logger.info('[Server] Initializing i18n...');\n i18nInstance = new I18n({\n defaultLocale: config.i18n.defaultLocale || 'en-US',\n fallbackLocale: config.i18n.fallbackLocale || 'en-US',\n localesPath: config.i18n.localesPath,\n supportedLocales: config.i18n.supportedLocales,\n namespace: config.i18n.namespace || config.serviceName,\n lazyLoad: config.i18n.lazyLoad,\n logMissing: config.i18n.logMissing ?? true,\n enableCache: true,\n returnKeyOnMissing: true,\n });\n await i18nInstance.initialize();\n logger.info(`[Server] i18n initialized with locales: ${i18nInstance.getSupportedLocales().join(', ')}`);\n }\n\n // Configure context builder\n configureContext({\n getDb: () => getDb(),\n i18n: i18nInstance,\n });\n\n // Auto-configure auth with default workspace secret fetcher if not already configured\n configureDefaultAuth();\n\n // Initialize module graph if provided\n if (moduleGraph) {\n logger.info('[Server] Initializing module graph...');\n await moduleGraph.initialize();\n }\n\n // Determine if playground/introspection should be enabled\n const isDev = config.environment !== 'production';\n const enablePlayground = config.enablePlayground ?? isDev;\n\n // Enable GraphQL-over-HTTP batching by default so subgraphs accept the batched\n // array POSTs the federation gateway forwards from Apollo Client BatchHttpLink.\n // The default limit (10) matches the workspace gateway's batching limit.\n const batching = config.batching ?? true;\n\n // Build workspace guard plugin — auto-enabled for wspace boundary only\n const workspaceGuardEnabled = config.workspaceGuard?.enabled ?? boundary === 'wspace';\n logger.info(`[Server] Boundary: ${boundary}, workspace guard: ${workspaceGuardEnabled ? 'enabled' : 'disabled'}`);\n\n const workspaceGuardPlugins = workspaceGuardEnabled\n ? [\n createWorkspaceGuardPlugin({\n enabled: true,\n whitelistedOperations: config.workspaceGuard?.whitelistedOperations,\n }),\n ]\n : [];\n\n // Create GraphQL Yoga instance\n const graphqlEndpoint = config.graphqlEndpoint || '/graphql';\n logger.info('[Server] Setting up GraphQL Yoga with provided schema...', {\n batching,\n });\n\n const responseHeadersPlugin: YogaPlugin = {\n onResponse: ({ response, serverContext }: { response: Response; serverContext: unknown }) => {\n const yogaContext = serverContext as GraphQLContext;\n if (yogaContext?.responseHeaders) {\n yogaContext.responseHeaders.forEach((value: string, key: string) => {\n response.headers.append(key, value);\n });\n }\n },\n };\n\n const yoga = createYoga<{ request: Request }>({\n graphqlEndpoint,\n schema, // Use the schema provided by microservice\n graphiql: enablePlayground,\n batching,\n logging: {\n debug: (...args) => logger.debug('[GraphQL]', ...args),\n info: (...args) => logger.info('[GraphQL]', ...args),\n warn: (...args) => logger.warn('[GraphQL]', ...args),\n error: (...args) => logger.error('[GraphQL]', ...args),\n },\n plugins: [\n createHumanReadableErrorPlugin({ serviceName: config.serviceName, environment: config.environment }),\n ...workspaceGuardPlugins,\n responseHeadersPlugin,\n ...(yogaPlugins || []),\n ],\n context: async ({ request }) => {\n // Build default context\n const defaultContext = await buildContext(request);\n\n // Apply custom context builder if provided\n if (customBuildContext) {\n return customBuildContext(defaultContext);\n }\n\n return defaultContext;\n },\n });\n\n // Create Elysia instance with Bun adapter\n const app = new Elysia({ adapter: BunAdapter });\n\n // Register CORS middleware\n const corsOrigins = normalizeCorsOrigins(config.corsOrigins, config.environment);\n\n app.use(\n cors({\n origin: corsOrigins,\n credentials: corsOrigins.length > 0,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'X-Tenant-ID',\n 'X-Workspace-ID',\n 'X-Org-ID',\n 'X-Project-ID',\n 'X-Product-ID',\n 'X-CSRF-Token',\n 'X-Service-Name',\n 'Accept-Language',\n 'X-Locale',\n 'X-Language',\n 'X-Geo-Country',\n 'X-Geo-Currency',\n 'X-Geo-Timezone',\n // Actor headers (gateway-injected or dev mode)\n 'X-Actor-ID',\n 'X-Actor-Type',\n 'X-Internal-Service-Token',\n 'X-Gateway-Auth-Token',\n ],\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n })\n );\n\n // Collect raw body endpoints for early interception\n const rawBodyEndpoints = (restEndpoints || []).filter((ep) => ep.rawBody);\n const rawBodyPaths = new Map(rawBodyEndpoints.map((ep) => [ep.path, ep]));\n const rawBodyMatchers = rawBodyEndpoints.map((endpoint) => {\n const regexPattern = endpoint.path.replace(/:[^/]+/g, '[^/]+');\n return {\n endpoint,\n regexPattern,\n regex: new RegExp(`^${regexPattern}$`),\n };\n });\n\n // Helper to match pathname against endpoint patterns (including :param placeholders)\n const matchRawBodyEndpoint = (pathname: string): (typeof rawBodyEndpoints)[0] | undefined => {\n // First try exact match (for non-parameterized paths)\n const exactMatch = rawBodyPaths.get(pathname);\n if (exactMatch) return exactMatch;\n\n // Try pattern matching for parameterized paths like /webhooks/slack/:channelId\n for (const { endpoint, regex, regexPattern } of rawBodyMatchers) {\n const isMatch = regex.test(pathname);\n logger.debug(\n `[Server] Checking ${pathname} against pattern ${endpoint.path} (regex: ${regexPattern}), match: ${isMatch}`\n );\n if (isMatch) {\n logger.debug(`[Server] Matched ${pathname} to pattern ${endpoint.path}`);\n return endpoint;\n }\n }\n\n logger.debug(`[Server] No raw body endpoint match for ${pathname}, rawBodyEndpoints: ${rawBodyEndpoints.length}`);\n return undefined;\n };\n\n // Handle GraphQL, metrics, and raw body requests BEFORE any middleware that consumes the body\n // This is critical because Yoga needs the raw request body stream\n // and webhook endpoints need raw body for signature verification\n // onRequest runs before onParse (body parsing) and onBeforeHandle\n app.onRequest(async ({ request }) => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n logger.debug(`[Server] onRequest: ${request.method} ${pathname}`);\n const isHealthRoute = pathname === '/health' || pathname.startsWith('/health/');\n\n // Build CORS headers helper\n const buildCorsHeaders = (): Record<string, string> => {\n const origin = request.headers.get('origin') || '*';\n const allowedOrigin = resolveAllowedCorsOrigin(origin === '*' ? null : origin, corsOrigins);\n const headers: Record<string, string> = {\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers':\n 'Content-Type, Authorization, X-Tenant-ID, X-Workspace-ID, X-Org-ID, X-Project-ID, X-Product-ID, X-CSRF-Token, X-Service-Name, Accept-Language, X-Locale, X-Language, X-Geo-Country, X-Geo-Currency, X-Geo-Timezone, X-Actor-ID, X-Actor-Type, X-Internal-Service-Token, X-Gateway-Auth-Token',\n };\n\n if (allowedOrigin) {\n headers['Access-Control-Allow-Origin'] = allowedOrigin;\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n\n return headers;\n };\n\n // Check if this is a raw body endpoint (webhooks) - now supports parameterized paths\n const rawBodyEndpoint = isHealthRoute ? undefined : matchRawBodyEndpoint(pathname);\n if (rawBodyEndpoint) {\n logger.debug(`[Server] Matched raw body endpoint: ${pathname} -> ${rawBodyEndpoint.path}`);\n const corsHeaders = buildCorsHeaders();\n\n // Handle CORS preflight for raw body endpoints\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n });\n }\n\n // Only process if method matches\n if (request.method !== rawBodyEndpoint.method) {\n return undefined; // Let other handlers deal with it\n }\n\n try {\n // Read raw body BEFORE any parsing\n const rawBody = await request.text();\n\n // Build context without consuming body (body already read)\n const context = await buildContext(request);\n\n // Call the handler with raw body\n const result = await rawBodyEndpoint.handler(request, context, rawBody);\n\n // If handler returns a Response, use it directly\n if (result instanceof Response) {\n // Add CORS headers\n const headers = new Headers(result.headers);\n for (const [key, value] of Object.entries(corsHeaders)) {\n headers.set(key, value);\n }\n return new Response(result.body, {\n status: result.status,\n statusText: result.statusText,\n headers,\n });\n }\n\n // Otherwise, serialize as JSON\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...corsHeaders,\n });\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers,\n });\n } catch (error) {\n logger.error(`[Server] Raw body endpoint error (${pathname}):`, error);\n const corsHeaders = buildCorsHeaders();\n const formatted = formatHttpError(error, {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n return new Response(JSON.stringify(formatted.body), {\n status: formatted.status,\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n });\n }\n }\n\n // Serve Prometheus metrics via prom-client at /metrics.\n // The graphql-yoga prometheus plugin populates the same default registry,\n // so GraphQL-level metrics (operation durations, error counts, etc.) are\n // included automatically without needing Yoga to handle this route.\n //\n // Also includes SDK MetricsRegistry metrics (business counters/histograms\n // created via @burdenoff/be-sdk/instrumentation factories) so that custom\n // service metrics are available without a separate /api/metrics endpoint.\n if (pathname === '/metrics' && request.method === 'GET') {\n try {\n const promClientMod = 'prom-client';\n const prom = (await import(promClientMod)) as unknown as {\n register: { metrics: () => Promise<string> | string; contentType?: string };\n collectDefaultMetrics: (opts?: Record<string, unknown>) => void;\n };\n try {\n prom.collectDefaultMetrics({ register: prom.register });\n } catch {\n /* already called */\n }\n const promBody = await prom.register.metrics();\n\n // Append SDK MetricsRegistry metrics (business counters, histograms,\n // gauges) that are created via @burdenoff/be-sdk/instrumentation\n // factories. The toPrometheusFormat() method is deliberately not cached\n // — each scrape gets a fresh snapshot including dynamic label values.\n //\n // Workspace quota gauges are different: collectAll() issues Prisma\n // groupBy queries, so running it inline on every scrape made /metrics\n // as slow as the database. Services registering quota collectors\n // routinely blew a 30s Prometheus scrape_timeout and reported as down.\n // Refresh on a TTL and bound each refresh, so a slow or unavailable\n // database degrades gauge freshness instead of failing the scrape.\n let sdkBody = '';\n await quotaGaugeRefresher.refresh();\n try {\n sdkBody = getMetricsRegistry().toPrometheusFormat();\n } catch {\n /* MetricsRegistry not initialised; serve prom-client output alone */\n }\n\n const combined = sdkBody ? `${promBody}\\n${sdkBody}` : promBody;\n return new Response(combined, {\n status: 200,\n headers: {\n 'Content-Type': prom.register.contentType ?? 'text/plain; version=0.0.4; charset=utf-8',\n },\n });\n } catch {\n // fall through — prom-client not installed; let Yoga handle as fallback\n }\n }\n\n // Routes that should be handled by Yoga (GraphQL endpoint only)\n const yogaRoutes = [graphqlEndpoint, `${graphqlEndpoint}/`, '/metrics'];\n const shouldHandleByYoga = yogaRoutes.includes(pathname);\n\n if (shouldHandleByYoga) {\n const corsHeaders = buildCorsHeaders();\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n });\n }\n\n // Get response from Yoga\n const yogaResponse = await normalizeGraphQLResponse(await yoga.fetch(request), {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n\n // Add CORS headers to Yoga response\n const headers = new Headers(yogaResponse.headers);\n for (const [key, value] of Object.entries(corsHeaders)) {\n headers.set(key, value);\n }\n\n // Return response with CORS headers\n return new Response(yogaResponse.body, {\n status: yogaResponse.status,\n statusText: yogaResponse.statusText,\n headers,\n });\n }\n // Return undefined to continue to next handlers for non-GraphQL requests\n return undefined;\n });\n\n // Register metrics middleware (after GraphQL interception)\n app.use(createMetricsPlugin());\n\n // Register security middleware (after GraphQL interception)\n app.use(\n createSecurityPlugin({\n csrfSkipRoutes: config.csrfSkipRoutes || ['/graphql', '/health', '/api/graph/'],\n loginEndpoints: config.loginEndpoints || [],\n enableCSRF: config.enableCSRF ?? false, // Disabled by default for GraphQL services\n enableSessionSecurity: config.enableSessionSecurity ?? false,\n })\n );\n\n // Health check endpoints\n // /health - General health check\n // /health/live - Kubernetes liveness probe\n // /health/ready - Kubernetes readiness probe\n // /health/startup - Kubernetes startup probe\n const healthResponse = () => ({\n status: 'healthy',\n service: config.serviceName,\n version: config.serviceVersion || '1.0.0',\n timestamp: new Date().toISOString(),\n });\n\n app.get('/health', healthResponse);\n app.get('/health/live', healthResponse);\n app.get('/health/ready', healthResponse);\n app.get('/health/startup', healthResponse);\n\n // Graph API endpoints (if moduleGraph provided)\n if (moduleGraph) {\n // Get graph configuration schema\n app.get('/api/graph/schema', async ({ request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n return moduleGraph.getSchema();\n });\n\n // Export all graph data\n app.get('/api/graph/export', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId } = query as { organizationId?: string; workspaceId?: string };\n return moduleGraph.exportAll(organizationId, workspaceId);\n });\n\n // Export entities only\n app.get('/api/graph/entities', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId, types } = query as {\n organizationId?: string;\n workspaceId?: string;\n types?: string;\n };\n const entityTypes = types?.split(',').map((t) => t.trim());\n return moduleGraph.exportEntities(organizationId, workspaceId, entityTypes);\n });\n\n // Export relationships only\n app.get('/api/graph/relationships', async ({ query, request, set }) => {\n const context = await buildContext(request);\n if (!canAccessGraphExport(context.actor)) {\n set.status = 403;\n return { error: 'Forbidden' };\n }\n\n const { organizationId, workspaceId } = query as { organizationId?: string; workspaceId?: string };\n return moduleGraph.exportRelationships(organizationId, workspaceId);\n });\n }\n\n // Register custom REST endpoints (skip rawBody endpoints - they're handled in onRequest)\n if (restEndpoints && restEndpoints.length > 0) {\n for (const endpoint of restEndpoints) {\n // Skip rawBody endpoints - they're intercepted in onRequest before body parsing\n if (endpoint.rawBody) {\n logger.info(`[Server] Raw body endpoint registered: ${endpoint.method} ${endpoint.path}`);\n continue;\n }\n\n const handler = async ({ request }: { request: Request }): Promise<unknown> => {\n try {\n const context = await buildContext(request);\n return await endpoint.handler(request, context);\n } catch (error) {\n logger.error(`[Server] REST endpoint error (${endpoint.path}):`, error);\n return createHttpErrorResponse(error, {\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n };\n\n switch (endpoint.method) {\n case 'GET':\n app.get(endpoint.path, handler);\n break;\n case 'POST':\n app.post(endpoint.path, handler);\n break;\n case 'PUT':\n app.put(endpoint.path, handler);\n break;\n case 'PATCH':\n app.patch(endpoint.path, handler);\n break;\n case 'DELETE':\n app.delete(endpoint.path, handler);\n break;\n }\n }\n }\n\n const host = config.host || '0.0.0.0';\n const port = config.port;\n\n // Create server instance\n const serverInstance: ServerInstance = {\n app: app as unknown as ElysiaApp,\n server: null,\n start: async () => {\n serverStartTime = new Date();\n\n // Call listen() which starts the server and makes app.server available\n app.listen({\n port,\n hostname: host,\n });\n\n // Access the Bun server instance from the app\n // Cast through unknown to satisfy TypeScript since Elysia's types are complex\n const elysiaApp = app as unknown as { server: BunServerHandle | null };\n serverInstance.server = elysiaApp.server;\n\n logger.info(`🚀 ${config.serviceName} is running at http://${host}:${port}${graphqlEndpoint}`);\n },\n stop: async () => {\n logger.info(`[Server] Stopping ${config.serviceName}...`);\n\n if (onShutdown) {\n await onShutdown();\n }\n\n if (moduleGraph) {\n await moduleGraph.shutdown();\n }\n\n await getDatabaseManager().disconnect();\n\n if (serverInstance.server) {\n serverInstance.server.stop();\n }\n\n logger.info(`[Server] ${config.serviceName} stopped`);\n },\n getInfo: (): ServerInfo => {\n const uptime = serverStartTime ? Math.floor((Date.now() - serverStartTime.getTime()) / 1000) : 0;\n\n return {\n serviceName: config.serviceName,\n serviceVersion: config.serviceVersion || '1.0.0',\n environment: config.environment || 'development',\n port,\n host,\n graphqlEndpoint,\n startedAt: serverStartTime?.toISOString() || '',\n uptime,\n };\n },\n };\n\n // Setup graceful shutdown handlers\n const gracefulShutdown = async (signal: string): Promise<never> => {\n logger.info(`[Server] ${signal} received, shutting down gracefully...`);\n await serverInstance.stop();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => {\n void gracefulShutdown('SIGTERM');\n });\n process.on('SIGINT', () => {\n void gracefulShutdown('SIGINT');\n });\n\n return serverInstance;\n}\n\n/**\n * Configure auth with workspace secret fetcher\n *\n * This should be called before creating the server if using workspace-scoped JWT\n */\nexport function configureServerAuth(fetchWorkspaceSecret: FetchWorkspaceSecretFn): void {\n configureAuth({ fetchWorkspaceSecret });\n}\n"]}
@@ -94,6 +94,9 @@ interface ServerConfig {
94
94
  sessionSecret?: string;
95
95
  enablePlayground?: boolean;
96
96
  enableIntrospection?: boolean;
97
+ batching?: boolean | {
98
+ limit?: number;
99
+ };
97
100
  csrfSkipRoutes?: string[];
98
101
  loginEndpoints?: string[];
99
102
  enableCSRF?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/be-sdk",
3
- "version": "2026.815.1",
3
+ "version": "2026.820.1",
4
4
  "description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/index.ts","../src/i18n/types.ts","../src/i18n/parser.ts","../src/i18n/loader.ts","../src/i18n/i18n.ts","../src/i18n/helpers.ts"],"names":["RTL_LANGUAGES","getTextDirection","language","includes","parseLocaleString","localeStr","trimmed","trim","localePart","params","split","quality","param","key","value","toLowerCase","parsed","parseFloat","isNaN","locale","parts","region","toUpperCase","normalizedLocale","parseAcceptLanguage","header","locales","part","push","sort","a","b","extractLocaleFromRequest","request","defaultLocale","explicitLocale","headers","get","acceptLanguage","parsedLocales","length","normalizeLocale","getLanguageFromLocale","getRegionFromLocale","findBestMatch","requested","available","availableSet","Set","map","l","req","has","find","langMatch","translationCache","Map","validateFilePath","filePath","baseDir","resolvedBase","resolve","resolvedPath","relativePath","relative","startsWith","Error","safeReadFile","validatedPath","Bun","file","text","safeStat","stat","catch","safeReaddir","dirPath","readdir","flattenDictionary","obj","prefix","result","Object","entries","fullKey","assign","loadTranslationFile","content","data","JSON","parse","error","logger","getCacheKey","namespace","loadTranslationsForLocale","config","cacheKey","enableCache","pathsToTry","join","localesPath","path","stats","isFile","endsWith","translations","flattened","debug","isDirectory","files","extname","basename","keys","fallbackLocale","warn","fallbackTranslations","undefined","set","discoverLocales","validatedBasePath","entry","entryPath","preloadAllTranslations","supportedLocales","info","Promise","all","clearTranslationCache","delete","clear","getCachedTranslations","setCachedTranslations","getEnglishPluralCategory","absCount","getFrenchPluralCategory","getSlavicPluralCategory","mod10","mod100","getArabicPluralCategory","getPolishCzechPluralCategory","getRomanianPluralCategory","getHebrewPluralCategory","getPluralCategory","count","Math","abs","englishLanguages","interpolate","variables","replace","match","String","I18n","currentLocale","initialized","returnKeyOnMissing","logMissing","initialize","lazyLoad","getLocale","setLocale","getSupportedLocales","isSupported","normalized","some","supportedNorm","loadLocale","getTranslations","t","defaultValue","translate","tp","translatePlural","langTranslations","category","pluralKey","createContext","formatNumber","options","Intl","NumberFormat","format","formatCurrency","currency","style","formatDate","date","dateObj","Date","DateTimeFormat","formatRelativeTime","unit","RelativeTimeFormat","numeric","createContextFromRequest","bestMatch","getLanguageInfo","direction","code","globalI18n","initializeI18n","getI18n","createI18n","interpolateVariables","ctx","defaultMessage","i18n","translated","createTranslator","hasI18n","getLanguage","defaultLanguage","Locales","EN_US","EN_GB","EN_AU","EN_CA","EN_IN","ES_ES","ES_MX","FR_FR","FR_CA","DE_DE","DE_AT","DE_CH","IT_IT","PT_PT","PT_BR","RU_RU","ZH_CN","ZH_TW","ZH_HK","JA_JP","KO_KR","AR_SA","AR_AE","HI_IN","TA_IN","NL_NL","PL_PL","TR_TR","VI_VN","TH_TH","ID_ID","HE_IL","UK_UA","DEFAULT_I18N_CONFIG"],"mappings":"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","file":"chunk-ULFFX3YE.js","sourcesContent":["/**\n * I18n Module\n *\n * Comprehensive internationalization support for backend services.\n *\n * Features:\n * - Load translations from JSON files\n * - Accept-Language header parsing\n * - Translation with variable interpolation\n * - Pluralization support (CLDR rules)\n * - Locale-aware formatting (numbers, dates, currencies)\n * - Request context integration\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk/i18n';\n *\n * // Initialize\n * const i18n = new I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * // Create context for a request\n * const ctx = i18n.createContextFromRequest(request);\n *\n * // Translate\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * // => \"Tag not found\"\n *\n * // Pluralize\n * const items = ctx.tp('items', 5, { count: 5 });\n * // => \"5 items\"\n * ```\n *\n * @packageDocumentation\n */\n\n// Core i18n class and functions\nexport { I18n, initializeI18n, getI18n, createI18n } from './i18n.js';\n\n// Context-based translation helpers (for use in resolvers/providers)\nexport {\n t,\n createTranslator,\n hasI18n,\n getLocale,\n getLanguage,\n type I18nCapableContext,\n type Translator,\n} from './helpers.js';\n\n// Types\nexport type {\n LocaleCode,\n LanguageCode,\n TranslationDictionary,\n FlatTranslationMap,\n TranslationVariables,\n PluralForms,\n TranslateFunction,\n PluralTranslateFunction,\n I18nConfig,\n ParsedLocale,\n I18nContext,\n II18n,\n TextDirection,\n LanguageInfo,\n} from './types.js';\n\n// Type helpers\nexport { RTL_LANGUAGES, getTextDirection } from './types.js';\n\n// Parser functions\nexport {\n parseLocaleString,\n parseAcceptLanguage,\n extractLocaleFromRequest,\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n} from './parser.js';\n\n// Loader functions\nexport {\n flattenDictionary,\n loadTranslationFile,\n loadTranslationsForLocale,\n discoverLocales,\n preloadAllTranslations,\n clearTranslationCache,\n getCachedTranslations,\n setCachedTranslations,\n} from './loader.js';\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\n/**\n * Common locale codes as constants\n */\nexport const Locales = {\n // English\n EN_US: 'en-US' as const,\n EN_GB: 'en-GB' as const,\n EN_AU: 'en-AU' as const,\n EN_CA: 'en-CA' as const,\n EN_IN: 'en-IN' as const,\n // Spanish\n ES_ES: 'es-ES' as const,\n ES_MX: 'es-MX' as const,\n // French\n FR_FR: 'fr-FR' as const,\n FR_CA: 'fr-CA' as const,\n // German\n DE_DE: 'de-DE' as const,\n DE_AT: 'de-AT' as const,\n DE_CH: 'de-CH' as const,\n // Italian\n IT_IT: 'it-IT' as const,\n // Portuguese\n PT_PT: 'pt-PT' as const,\n PT_BR: 'pt-BR' as const,\n // Russian\n RU_RU: 'ru-RU' as const,\n // Chinese\n ZH_CN: 'zh-CN' as const,\n ZH_TW: 'zh-TW' as const,\n ZH_HK: 'zh-HK' as const,\n // Japanese\n JA_JP: 'ja-JP' as const,\n // Korean\n KO_KR: 'ko-KR' as const,\n // Arabic\n AR_SA: 'ar-SA' as const,\n AR_AE: 'ar-AE' as const,\n // Hindi\n HI_IN: 'hi-IN' as const,\n // Tamil\n TA_IN: 'ta-IN' as const,\n // Dutch\n NL_NL: 'nl-NL' as const,\n // Polish\n PL_PL: 'pl-PL' as const,\n // Turkish\n TR_TR: 'tr-TR' as const,\n // Vietnamese\n VI_VN: 'vi-VN' as const,\n // Thai\n TH_TH: 'th-TH' as const,\n // Indonesian\n ID_ID: 'id-ID' as const,\n // Hebrew\n HE_IL: 'he-IL' as const,\n // Ukrainian\n UK_UA: 'uk-UA' as const,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_I18N_CONFIG = {\n defaultLocale: 'en-US',\n fallbackLocale: 'en-US',\n enableCache: true,\n lazyLoad: false,\n logMissing: true,\n returnKeyOnMissing: true,\n} as const;\n","/**\n * I18n Module Types\n *\n * Type definitions for internationalization support\n */\n\n/**\n * Supported locale codes (BCP 47 format)\n * Language-Region pattern: xx-XX\n */\nexport type LocaleCode =\n // English variants\n | 'en-US'\n | 'en-GB'\n | 'en-AU'\n | 'en-CA'\n | 'en-IN'\n // Spanish variants\n | 'es-ES'\n | 'es-MX'\n | 'es-AR'\n // French variants\n | 'fr-FR'\n | 'fr-CA'\n | 'fr-BE'\n // German variants\n | 'de-DE'\n | 'de-AT'\n | 'de-CH'\n // Italian\n | 'it-IT'\n // Portuguese variants\n | 'pt-PT'\n | 'pt-BR'\n // Russian\n | 'ru-RU'\n // Chinese variants\n | 'zh-CN'\n | 'zh-TW'\n | 'zh-HK'\n // Japanese\n | 'ja-JP'\n // Korean\n | 'ko-KR'\n // Arabic variants\n | 'ar-SA'\n | 'ar-AE'\n | 'ar-EG'\n // Hindi\n | 'hi-IN'\n // Bengali\n | 'bn-IN'\n | 'bn-BD'\n // Tamil\n | 'ta-IN'\n // Telugu\n | 'te-IN'\n // Malayalam\n | 'ml-IN'\n // Dutch\n | 'nl-NL'\n | 'nl-BE'\n // Polish\n | 'pl-PL'\n // Turkish\n | 'tr-TR'\n // Vietnamese\n | 'vi-VN'\n // Thai\n | 'th-TH'\n // Indonesian\n | 'id-ID'\n // Malay\n | 'ms-MY'\n // Swedish\n | 'sv-SE'\n // Norwegian\n | 'nb-NO'\n // Danish\n | 'da-DK'\n // Finnish\n | 'fi-FI'\n // Greek\n | 'el-GR'\n // Czech\n | 'cs-CZ'\n // Romanian\n | 'ro-RO'\n // Hungarian\n | 'hu-HU'\n // Hebrew\n | 'he-IL'\n // Ukrainian\n | 'uk-UA'\n // Generic fallback (allow any valid BCP 47)\n | string;\n\n/**\n * Language code (ISO 639-1)\n */\nexport type LanguageCode =\n | 'en'\n | 'es'\n | 'fr'\n | 'de'\n | 'it'\n | 'pt'\n | 'ru'\n | 'zh'\n | 'ja'\n | 'ko'\n | 'ar'\n | 'hi'\n | 'bn'\n | 'ta'\n | 'te'\n | 'ml'\n | 'nl'\n | 'pl'\n | 'tr'\n | 'vi'\n | 'th'\n | 'id'\n | 'ms'\n | 'sv'\n | 'nb'\n | 'da'\n | 'fi'\n | 'el'\n | 'cs'\n | 'ro'\n | 'hu'\n | 'he'\n | 'uk'\n | string;\n\n/**\n * Translation dictionary type\n * Supports nested keys like { errors: { notFound: \"...\" } }\n * Includes null to match JSON data which may contain null values\n */\nexport type TranslationDictionary = {\n [key: string]: string | TranslationDictionary | null;\n};\n\n/**\n * Flattened translation map\n */\nexport type FlatTranslationMap = Record<string, string>;\n\n/**\n * Translation variables for interpolation\n */\nexport type TranslationVariables = Record<string, string | number | boolean>;\n\n/**\n * Pluralization rules\n */\nexport interface PluralForms {\n zero?: string;\n one: string;\n two?: string;\n few?: string;\n many?: string;\n other: string;\n}\n\n/**\n * Translation function type\n */\nexport type TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string) => string;\n\n/**\n * Plural translation function type\n */\nexport type PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables) => string;\n\n/**\n * I18n configuration options\n */\nexport interface I18nConfig {\n /** Default locale if none specified */\n defaultLocale: LocaleCode;\n /** Fallback locale when translation is missing */\n fallbackLocale?: LocaleCode;\n /** Path to locales directory */\n localesPath: string;\n /** Supported locales (if empty, all locales in directory are supported) */\n supportedLocales?: LocaleCode[];\n /** Whether to load translations lazily */\n lazyLoad?: boolean;\n /** Cache translations in memory */\n enableCache?: boolean;\n /** Namespace for this service (e.g., 'tags', 'auth') */\n namespace?: string;\n /** Log missing translations */\n logMissing?: boolean;\n /** Return key on missing translation instead of empty string */\n returnKeyOnMissing?: boolean;\n}\n\n/**\n * Parsed locale information\n */\nexport interface ParsedLocale {\n /** Full locale code (e.g., 'en-US') */\n locale: LocaleCode;\n /** Language code (e.g., 'en') */\n language: LanguageCode;\n /** Region code (e.g., 'US') */\n region?: string;\n /** Quality factor from Accept-Language header (0-1) */\n quality: number;\n}\n\n/**\n * I18n context for requests\n */\nexport interface I18nContext {\n /** Current locale */\n locale: LocaleCode;\n /** Language code */\n language: LanguageCode;\n /** Region code */\n region?: string;\n /** Geography: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE') — from x-geo-country header */\n country?: string;\n /** Geography: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR') — from x-geo-currency header */\n currency?: string;\n /** Geography: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York') — from x-geo-timezone header */\n timezone?: string;\n /** Translation function */\n t: TranslateFunction;\n /** Plural translation function */\n tp: PluralTranslateFunction;\n /** Format number for locale */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format currency for locale */\n formatCurrency: (value: number, currency: string) => string;\n /** Format date for locale */\n formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Format relative time for locale */\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => string;\n}\n\n/**\n * I18n instance interface\n */\nexport interface II18n {\n /** Get current locale */\n getLocale(): LocaleCode;\n /** Set current locale */\n setLocale(locale: LocaleCode): void;\n /** Get supported locales */\n getSupportedLocales(): LocaleCode[];\n /** Check if locale is supported */\n isSupported(locale: LocaleCode): boolean;\n /** Translate a key */\n t: TranslateFunction;\n /** Translate with pluralization */\n tp: PluralTranslateFunction;\n /** Create context for request */\n createContext(locale: LocaleCode): I18nContext;\n /** Load translations for a locale */\n loadLocale(locale: LocaleCode): Promise<void>;\n /** Get all translations for a locale */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined;\n}\n\n/**\n * Language direction\n */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * Language metadata\n */\nexport interface LanguageInfo {\n code: LanguageCode;\n name: string;\n nativeName: string;\n direction: TextDirection;\n locales: LocaleCode[];\n}\n\n/**\n * RTL languages\n */\nexport const RTL_LANGUAGES: LanguageCode[] = ['ar', 'he'];\n\n/**\n * Get text direction for a language\n */\nexport function getTextDirection(language: LanguageCode): TextDirection {\n return RTL_LANGUAGES.includes(language) ? 'rtl' : 'ltr';\n}\n","/**\n * I18n Parser Module\n *\n * Parses Accept-Language headers and locale strings\n */\n\nimport type { LocaleCode, LanguageCode, ParsedLocale } from './types.js';\n\n/**\n * Parse a single locale string (e.g., 'en-US', 'fr;q=0.9')\n */\nexport function parseLocaleString(localeStr: string): ParsedLocale | null {\n const trimmed = localeStr.trim();\n if (!trimmed || trimmed === '*') {\n return null;\n }\n\n // Parse quality factor if present (e.g., 'en-US;q=0.9')\n const [localePart, ...params] = trimmed.split(';');\n let quality = 1.0;\n\n for (const param of params) {\n const [key, value] = param.trim().split('=');\n if (key?.toLowerCase() === 'q' && value) {\n const parsed = parseFloat(value);\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n quality = parsed;\n }\n }\n }\n\n const locale = localePart?.trim();\n if (!locale) {\n return null;\n }\n\n // Parse language and region\n const parts = locale.split('-');\n const language = parts[0]?.toLowerCase() as LanguageCode;\n const region = parts[1]?.toUpperCase();\n\n // Reconstruct proper locale code\n const normalizedLocale = region ? `${language}-${region}` : language;\n\n return {\n locale: normalizedLocale,\n language,\n region,\n quality,\n };\n}\n\n/**\n * Parse Accept-Language header\n *\n * Example: 'en-US,en;q=0.9,fr;q=0.8,de;q=0.7'\n *\n * @param header The Accept-Language header value\n * @returns Array of parsed locales sorted by quality (highest first)\n */\nexport function parseAcceptLanguage(header: string | null | undefined): ParsedLocale[] {\n if (!header || header.trim() === '') {\n return [];\n }\n\n const locales: ParsedLocale[] = [];\n\n // Split by comma and parse each part\n const parts = header.split(',');\n for (const part of parts) {\n const parsed = parseLocaleString(part);\n if (parsed) {\n locales.push(parsed);\n }\n }\n\n // Sort by quality factor (highest first)\n locales.sort((a, b) => b.quality - a.quality);\n\n return locales;\n}\n\n/**\n * Extract locale from request headers\n *\n * Checks in order:\n * 1. X-Locale header (explicit override)\n * 2. X-Language header (explicit override)\n * 3. Accept-Language header\n *\n * @param request Web API Request object\n * @param defaultLocale Default locale to return if none found\n * @returns The best matching locale\n */\nexport function extractLocaleFromRequest(request: Request, defaultLocale: LocaleCode = 'en-US'): ParsedLocale {\n // Check explicit locale header first\n const explicitLocale = request.headers.get('x-locale') || request.headers.get('x-language');\n if (explicitLocale) {\n const parsed = parseLocaleString(explicitLocale);\n if (parsed) {\n return parsed;\n }\n }\n\n // Parse Accept-Language header\n const acceptLanguage = request.headers.get('accept-language');\n const parsedLocales = parseAcceptLanguage(acceptLanguage);\n\n if (parsedLocales.length > 0) {\n return parsedLocales[0]!;\n }\n\n // Return default locale\n const [language, region] = defaultLocale.split('-');\n return {\n locale: defaultLocale,\n language: language as LanguageCode,\n region: region,\n quality: 1.0,\n };\n}\n\n/**\n * Normalize a locale code to standard format\n *\n * @param locale The locale to normalize\n * @returns Normalized locale (e.g., 'en-us' -> 'en-US')\n */\nexport function normalizeLocale(locale: string): LocaleCode {\n const parts = locale.trim().split(/[-_]/);\n const language = parts[0]?.toLowerCase();\n const region = parts[1]?.toUpperCase();\n\n if (region) {\n return `${language}-${region}`;\n }\n return language as LocaleCode;\n}\n\n/**\n * Get the language code from a locale\n */\nexport function getLanguageFromLocale(locale: LocaleCode): LanguageCode {\n return locale.split('-')[0] as LanguageCode;\n}\n\n/**\n * Get the region code from a locale\n */\nexport function getRegionFromLocale(locale: LocaleCode): string | undefined {\n const parts = locale.split('-');\n return parts[1];\n}\n\n/**\n * Find the best matching locale from available locales\n *\n * @param requested Requested locales (sorted by preference)\n * @param available Available locales\n * @param defaultLocale Default locale to use if no match\n * @returns The best matching locale\n */\nexport function findBestMatch(\n requested: ParsedLocale[],\n available: LocaleCode[],\n defaultLocale: LocaleCode\n): LocaleCode {\n const availableSet = new Set(available.map((l) => l.toLowerCase()));\n\n for (const req of requested) {\n // Try exact match first (e.g., 'en-US')\n if (availableSet.has(req.locale.toLowerCase())) {\n // Return with proper casing from available\n return available.find((l) => l.toLowerCase() === req.locale.toLowerCase()) || req.locale;\n }\n\n // Try language-only match (e.g., 'en')\n if (availableSet.has(req.language.toLowerCase())) {\n return available.find((l) => l.toLowerCase() === req.language.toLowerCase()) || req.language;\n }\n\n // Try to find any locale with the same language\n const langMatch = available.find((l) => getLanguageFromLocale(l).toLowerCase() === req.language.toLowerCase());\n if (langMatch) {\n return langMatch;\n }\n }\n\n return defaultLocale;\n}\n","/**\n * I18n Loader Module\n *\n * Loads and manages translation files from the filesystem\n */\n\nimport { readdir, stat } from 'fs/promises';\nimport { join, extname, basename, resolve, relative } from 'path';\nimport type { LocaleCode, TranslationDictionary, FlatTranslationMap, I18nConfig } from './types.js';\nimport { normalizeLocale, getLanguageFromLocale } from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Translation cache\n */\nconst translationCache = new Map<string, FlatTranslationMap>();\n\n/**\n * Validate that a file path is within the allowed base directory\n * Prevents directory traversal attacks\n *\n * @param filePath The file path to validate\n * @param baseDir The base directory that must contain the file\n * @returns The resolved absolute path if valid\n * @throws Error if path escapes the base directory\n */\nfunction validateFilePath(filePath: string, baseDir: string): string {\n const resolvedBase = resolve(baseDir);\n const resolvedPath = resolve(filePath);\n const relativePath = relative(resolvedBase, resolvedPath);\n\n // If relative path starts with '..' or is absolute, it's outside base directory\n if (relativePath.startsWith('..') || resolve(relativePath) === relativePath) {\n throw new Error(`Invalid file path: ${filePath} is outside base directory ${baseDir}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely read a file with path validation\n * Path is validated before reading to prevent directory traversal attacks\n */\nasync function safeReadFile(filePath: string, baseDir: string): Promise<string> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return Bun.file(validatedPath).text();\n}\n\n/**\n * Safely stat a file with path validation\n * Path is validated before stat to prevent directory traversal attacks\n */\nasync function safeStat(filePath: string, baseDir: string): Promise<Awaited<ReturnType<typeof stat>> | null> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return stat(validatedPath).catch(() => null);\n}\n\n/**\n * Safely read directory with path validation\n * Path is validated before readdir to prevent directory traversal attacks\n */\nasync function safeReaddir(dirPath: string, baseDir: string): Promise<string[]> {\n const validatedPath = validateFilePath(dirPath, baseDir);\n return readdir(validatedPath);\n}\n\n/**\n * Flatten a nested translation dictionary\n *\n * @param obj The nested dictionary\n * @param prefix Current key prefix\n * @returns Flattened key-value map\n */\nexport function flattenDictionary(obj: TranslationDictionary, prefix = ''): FlatTranslationMap {\n const result: FlatTranslationMap = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'string') {\n result[fullKey] = value;\n } else if (value !== null && typeof value === 'object') {\n // Check null first to avoid different-types-comparison warning\n // (typeof null === 'object' is a JavaScript quirk)\n Object.assign(result, flattenDictionary(value, fullKey));\n }\n }\n\n return result;\n}\n\n/**\n * Load a single translation file\n *\n * @param filePath Path to the translation file\n * @param baseDir Base directory for validation\n * @returns The loaded translations\n */\nexport async function loadTranslationFile(filePath: string, baseDir: string): Promise<TranslationDictionary> {\n try {\n const content = await safeReadFile(filePath, baseDir);\n const data = JSON.parse(content) as TranslationDictionary;\n return data;\n } catch (error) {\n logger.error(`[I18n] Failed to load translation file: ${filePath}`, error);\n return {};\n }\n}\n\n/**\n * Get cache key for translations\n */\nfunction getCacheKey(namespace: string | undefined, locale: LocaleCode): string {\n return namespace ? `${namespace}:${locale}` : locale;\n}\n\n/**\n * Load translations for a locale from a directory\n *\n * Supports multiple file formats:\n * - locales/en-US.json (single file per locale)\n * - locales/en-US/common.json (directory per locale with namespace files)\n * - locales/en.json (language-only fallback)\n *\n * @param config I18n configuration\n * @param locale The locale to load\n * @returns Flattened translations map\n */\nexport async function loadTranslationsForLocale(config: I18nConfig, locale: LocaleCode): Promise<FlatTranslationMap> {\n const cacheKey = getCacheKey(config.namespace, locale);\n\n // Check cache first\n if (config.enableCache !== false && translationCache.has(cacheKey)) {\n return translationCache.get(cacheKey)!;\n }\n\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const result: FlatTranslationMap = {};\n\n // Try loading in order of specificity\n const pathsToTry = [\n // Most specific: full locale\n join(config.localesPath, `${normalizedLocale}.json`),\n // Directory format\n join(config.localesPath, normalizedLocale),\n // Language only fallback\n join(config.localesPath, `${language}.json`),\n // Language directory\n join(config.localesPath, language),\n ];\n\n for (const path of pathsToTry) {\n try {\n const stats = await safeStat(path, config.localesPath);\n if (!stats) continue;\n\n if (stats.isFile() && path.endsWith('.json')) {\n // Single file\n const translations = await loadTranslationFile(path, config.localesPath);\n const flattened = flattenDictionary(translations);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded translations from ${path}`);\n break;\n } else if (stats.isDirectory()) {\n // Directory with multiple namespace files\n const files = await safeReaddir(path, config.localesPath);\n for (const file of files) {\n if (extname(file) === '.json') {\n const namespace = basename(file, '.json');\n const filePath = join(path, file);\n const translations = await loadTranslationFile(filePath, config.localesPath);\n const flattened = flattenDictionary(translations, namespace);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded namespace ${namespace} from ${filePath}`);\n }\n }\n break;\n }\n } catch {\n // Continue trying next path\n }\n }\n\n // If nothing loaded and we have a fallback, try that\n if (Object.keys(result).length === 0 && config.fallbackLocale && config.fallbackLocale !== locale) {\n logger.warn(`[I18n] No translations found for ${locale}, trying fallback ${config.fallbackLocale}`);\n const fallbackTranslations = await loadTranslationsForLocale(\n { ...config, fallbackLocale: undefined },\n config.fallbackLocale\n );\n Object.assign(result, fallbackTranslations);\n }\n\n // Cache the result\n if (config.enableCache !== false) {\n translationCache.set(cacheKey, result);\n }\n\n return result;\n}\n\n/**\n * Discover available locales in a directory\n *\n * @param localesPath Path to locales directory\n * @returns Array of available locale codes\n */\nexport async function discoverLocales(localesPath: string): Promise<LocaleCode[]> {\n const locales: LocaleCode[] = [];\n\n try {\n const validatedBasePath = resolve(localesPath);\n const entries = await readdir(validatedBasePath);\n\n for (const entry of entries) {\n const entryPath = join(validatedBasePath, entry);\n const stats = await safeStat(entryPath, validatedBasePath);\n if (!stats) continue;\n\n if (stats.isFile() && entry.endsWith('.json')) {\n // Single file: en-US.json or en.json\n const locale = basename(entry, '.json');\n locales.push(normalizeLocale(locale));\n } else if (stats.isDirectory()) {\n // Directory: en-US/ or en/\n locales.push(normalizeLocale(entry));\n }\n }\n } catch (error) {\n logger.error(`[I18n] Failed to discover locales in ${localesPath}`, error);\n }\n\n return locales;\n}\n\n/**\n * Preload all translations for supported locales\n *\n * @param config I18n configuration\n */\nexport async function preloadAllTranslations(config: I18nConfig): Promise<void> {\n const locales = config.supportedLocales || (await discoverLocales(config.localesPath));\n\n logger.info(`[I18n] Preloading translations for ${locales.length} locales...`);\n\n await Promise.all(\n locales.map(async (locale) => {\n try {\n await loadTranslationsForLocale(config, locale);\n } catch (error) {\n logger.error(`[I18n] Failed to preload locale ${locale}`, error);\n }\n })\n );\n\n logger.info(`[I18n] Preloaded translations for: ${locales.join(', ')}`);\n}\n\n/**\n * Clear the translation cache\n *\n * @param namespace Optional namespace to clear (clears all if not provided)\n */\nexport function clearTranslationCache(namespace?: string): void {\n if (namespace) {\n for (const key of translationCache.keys()) {\n if (key.startsWith(`${namespace}:`)) {\n translationCache.delete(key);\n }\n }\n } else {\n translationCache.clear();\n }\n}\n\n/**\n * Get cached translations for a locale\n */\nexport function getCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode\n): FlatTranslationMap | undefined {\n return translationCache.get(getCacheKey(namespace, locale));\n}\n\n/**\n * Set translations in cache (useful for testing or dynamic loading)\n */\nexport function setCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode,\n translations: FlatTranslationMap\n): void {\n translationCache.set(getCacheKey(namespace, locale), translations);\n}\n","/**\n * I18n Class\n *\n * Main internationalization class providing translation and formatting functions\n */\n\nimport type {\n LocaleCode,\n LanguageCode,\n I18nConfig,\n I18nContext,\n II18n,\n FlatTranslationMap,\n TranslationVariables,\n TranslateFunction,\n PluralTranslateFunction,\n} from './types.js';\nimport { getTextDirection } from './types.js';\nimport { loadTranslationsForLocale, preloadAllTranslations, discoverLocales, getCachedTranslations } from './loader.js';\nimport {\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n extractLocaleFromRequest,\n} from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Pluralization category based on CLDR rules\n */\ntype PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\n/**\n * English and most Germanic/Romance languages (simple one/other)\n */\nfunction getEnglishPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * French pluralization (0 or 1 = one, else other)\n */\nfunction getFrenchPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0 || absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * Slavic languages (Russian, Ukrainian) - complex: one, few, many, other\n */\nfunction getSlavicPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (mod10 === 1 && mod100 !== 11) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n if (mod10 === 0 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 11 && mod100 <= 14)) return 'many';\n return 'other';\n}\n\n/**\n * Arabic pluralization (zero, one, two, few, many, other)\n */\nfunction getArabicPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0) return 'zero';\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n const mod100 = absCount % 100;\n if (mod100 >= 3 && mod100 <= 10) return 'few';\n if (mod100 >= 11 && mod100 <= 99) return 'many';\n return 'other';\n}\n\n/**\n * Polish/Czech pluralization (one, few, many)\n */\nfunction getPolishCzechPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (absCount === 1) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n return 'many';\n}\n\n/**\n * Romanian pluralization (one, few, other)\n */\nfunction getRomanianPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n const mod100 = absCount % 100;\n if (absCount === 0 || (mod100 >= 1 && mod100 <= 19)) return 'few';\n return 'other';\n}\n\n/**\n * Hebrew pluralization (one, two, other)\n */\nfunction getHebrewPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n return 'other';\n}\n\n/**\n * Get plural category for a count in a given language\n * Based on CLDR plural rules: https://cldr.unicode.org/index/cldr-spec/plural-rules\n */\nfunction getPluralCategory(language: LanguageCode, count: number): PluralCategory {\n const absCount = Math.abs(count);\n\n // English and most Germanic/Romance languages\n const englishLanguages = [\n 'en',\n 'de',\n 'es',\n 'it',\n 'nl',\n 'sv',\n 'da',\n 'nb',\n 'fi',\n 'pt',\n 'el',\n 'hu',\n 'tr',\n 'id',\n 'ms',\n 'th',\n 'vi',\n 'ko',\n 'zh',\n 'ja',\n ];\n if (englishLanguages.includes(language)) {\n return getEnglishPluralCategory(absCount);\n }\n\n // French\n if (language === 'fr') {\n return getFrenchPluralCategory(absCount);\n }\n\n // Russian, Ukrainian\n if (language === 'ru' || language === 'uk') {\n return getSlavicPluralCategory(absCount);\n }\n\n // Arabic\n if (language === 'ar') {\n return getArabicPluralCategory(absCount);\n }\n\n // Polish, Czech\n if (language === 'pl' || language === 'cs') {\n return getPolishCzechPluralCategory(absCount);\n }\n\n // Romanian\n if (language === 'ro') {\n return getRomanianPluralCategory(absCount);\n }\n\n // Hebrew\n if (language === 'he') {\n return getHebrewPluralCategory(absCount);\n }\n\n // Default: simple singular/plural\n return getEnglishPluralCategory(absCount);\n}\n\n/**\n * Interpolate variables in a translation string\n *\n * Supports:\n * - {{variable}} - simple interpolation\n * - {{variable, number}} - number formatting (future)\n * - {{variable, date}} - date formatting (future)\n */\nfunction interpolate(text: string, variables?: TranslationVariables): string {\n if (!variables || !text) {\n return text;\n }\n\n // Use more specific pattern to avoid catastrophic backtracking\n // Matches {{ variableName }} with word characters (alphanumeric and underscore)\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key: string) => {\n const value = variables[key.trim()];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if variable not found\n });\n}\n\n/**\n * I18n Class\n *\n * Main class for internationalization functionality\n */\nexport class I18n implements II18n {\n private config: I18nConfig;\n private currentLocale: LocaleCode;\n private supportedLocales: LocaleCode[] = [];\n private initialized = false;\n\n constructor(config: I18nConfig) {\n this.config = {\n ...config,\n fallbackLocale: config.fallbackLocale || 'en-US',\n enableCache: config.enableCache !== false,\n returnKeyOnMissing: config.returnKeyOnMissing !== false,\n logMissing: config.logMissing !== false,\n };\n this.currentLocale = normalizeLocale(config.defaultLocale);\n }\n\n /**\n * Initialize the i18n instance\n * Discovers available locales and optionally preloads translations\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Discover available locales\n if (this.config.supportedLocales && this.config.supportedLocales.length > 0) {\n this.supportedLocales = this.config.supportedLocales;\n } else {\n this.supportedLocales = await discoverLocales(this.config.localesPath);\n }\n\n // Preload translations if not lazy loading\n if (!this.config.lazyLoad) {\n await preloadAllTranslations(this.config);\n }\n\n this.initialized = true;\n logger.info(`[I18n] Initialized with ${this.supportedLocales.length} locales, default: ${this.currentLocale}`);\n }\n\n /**\n * Get current locale\n */\n getLocale(): LocaleCode {\n return this.currentLocale;\n }\n\n /**\n * Set current locale\n */\n setLocale(locale: LocaleCode): void {\n this.currentLocale = normalizeLocale(locale);\n }\n\n /**\n * Get supported locales\n */\n getSupportedLocales(): LocaleCode[] {\n return [...this.supportedLocales];\n }\n\n /**\n * Check if a locale is supported\n */\n isSupported(locale: LocaleCode): boolean {\n const normalized = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalized);\n\n return this.supportedLocales.some((l) => {\n const supportedNorm = normalizeLocale(l);\n // Exact match or language match\n return supportedNorm === normalized || getLanguageFromLocale(supportedNorm) === language;\n });\n }\n\n /**\n * Load translations for a specific locale\n */\n async loadLocale(locale: LocaleCode): Promise<void> {\n await loadTranslationsForLocale(this.config, locale);\n }\n\n /**\n * Get all translations for a locale\n */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined {\n return getCachedTranslations(this.config.namespace, locale);\n }\n\n /**\n * Translate a key\n */\n t: TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string): string => {\n return this.translate(this.currentLocale, key, variables, defaultValue);\n };\n\n /**\n * Translate with pluralization\n */\n tp: PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables): string => {\n return this.translatePlural(this.currentLocale, key, count, variables);\n };\n\n /**\n * Internal translate method\n */\n private translate(locale: LocaleCode, key: string, variables?: TranslationVariables, defaultValue?: string): string {\n const translations = getCachedTranslations(this.config.namespace, locale);\n let text = translations?.[key];\n\n // Try fallback locale if not found\n if (!text && this.config.fallbackLocale && locale !== this.config.fallbackLocale) {\n const fallbackTranslations = getCachedTranslations(this.config.namespace, this.config.fallbackLocale);\n text = fallbackTranslations?.[key];\n }\n\n // Try language-only fallback\n if (!text) {\n const language = getLanguageFromLocale(locale);\n if (language !== locale) {\n const langTranslations = getCachedTranslations(this.config.namespace, language);\n text = langTranslations?.[key];\n }\n }\n\n if (!text) {\n if (this.config.logMissing) {\n logger.warn(`[I18n] Missing translation for key: ${key} in locale: ${locale}`);\n }\n // Return default value, key, or empty string\n return defaultValue ?? (this.config.returnKeyOnMissing ? key : '');\n }\n\n return interpolate(text, variables);\n }\n\n /**\n * Internal translate with pluralization\n */\n private translatePlural(locale: LocaleCode, key: string, count: number, variables?: TranslationVariables): string {\n const language = getLanguageFromLocale(locale);\n const category = getPluralCategory(language, count);\n\n // Try plural-specific key first (e.g., 'items.one', 'items.other')\n const pluralKey = `${key}.${category}`;\n let text = this.translate(locale, pluralKey, undefined, '');\n\n // Fallback to 'other' if specific form not found\n if (!text && category !== 'other') {\n text = this.translate(locale, `${key}.other`, undefined, '');\n }\n\n // Final fallback to base key\n if (!text) {\n text = this.translate(locale, key, undefined, key);\n }\n\n return interpolate(text, { ...variables, count });\n }\n\n /**\n * Create an i18n context for a specific locale\n */\n createContext(locale: LocaleCode): I18nContext {\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const region = getRegionFromLocale(normalizedLocale);\n\n // Create bound translate functions for this locale\n const t: TranslateFunction = (key, variables, defaultValue) => {\n return this.translate(normalizedLocale, key, variables, defaultValue);\n };\n\n const tp: PluralTranslateFunction = (key, count, variables) => {\n return this.translatePlural(normalizedLocale, key, count, variables);\n };\n\n const formatNumber = (value: number, options?: Intl.NumberFormatOptions): string => {\n return new Intl.NumberFormat(normalizedLocale, options).format(value);\n };\n\n const formatCurrency = (value: number, currency: string): string => {\n return new Intl.NumberFormat(normalizedLocale, {\n style: 'currency',\n currency,\n }).format(value);\n };\n\n const formatDate = (date: Date | string, options?: Intl.DateTimeFormatOptions): string => {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(normalizedLocale, options).format(dateObj);\n };\n\n const formatRelativeTime = (value: number, unit: Intl.RelativeTimeFormatUnit): string => {\n return new Intl.RelativeTimeFormat(normalizedLocale, { numeric: 'auto' }).format(value, unit);\n };\n\n return {\n locale: normalizedLocale,\n language,\n region,\n t,\n tp,\n formatNumber,\n formatCurrency,\n formatDate,\n formatRelativeTime,\n };\n }\n\n /**\n * Create context from a request\n */\n createContextFromRequest(request: Request): I18nContext {\n const parsed = extractLocaleFromRequest(request, this.config.defaultLocale);\n const bestMatch = findBestMatch([parsed], this.supportedLocales, this.config.defaultLocale);\n return this.createContext(bestMatch);\n }\n\n /**\n * Get language metadata\n */\n getLanguageInfo(locale: LocaleCode): {\n code: LanguageCode;\n direction: 'ltr' | 'rtl';\n locale: LocaleCode;\n region?: string;\n } {\n const language = getLanguageFromLocale(locale);\n const region = getRegionFromLocale(locale);\n const direction = getTextDirection(language);\n\n return {\n code: language,\n direction,\n locale,\n region,\n };\n }\n}\n\n/**\n * Singleton instance (optional, for simpler usage)\n */\nlet globalI18n: I18n | null = null;\n\n/**\n * Initialize global i18n instance\n */\nexport async function initializeI18n(config: I18nConfig): Promise<I18n> {\n globalI18n = new I18n(config);\n await globalI18n.initialize();\n return globalI18n;\n}\n\n/**\n * Get global i18n instance\n */\nexport function getI18n(): I18n | null {\n return globalI18n;\n}\n\n/**\n * Create a new i18n instance (for isolated use)\n */\nexport function createI18n(config: I18nConfig): I18n {\n return new I18n(config);\n}\n","/**\n * I18n Translation Helpers\n *\n * Provides utilities for getting translated messages from GraphQL/request context.\n * These helpers work with any context that has an optional `i18n` property.\n *\n * Falls back to the provided default message if i18n is not available or translation is missing.\n *\n * @example\n * ```typescript\n * import { t, createTranslator } from '@burdenoff/be-sdk';\n *\n * // Direct usage with context\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n * const message = t(ctx, 'tags.errors.keyExists', 'Tag {{key}} already exists', { key: 'my-tag' });\n *\n * // Create a bound translator for a specific context\n * const translate = createTranslator(ctx);\n * const message = translate('tags.errors.notFound', 'Tag not found');\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { I18nContext, TranslationVariables } from './types.js';\n\n/**\n * Context with optional i18n\n * Works with any object that has an optional i18n property\n */\nexport interface I18nCapableContext {\n i18n?: I18nContext;\n}\n\n/**\n * Interpolate variables in a string\n *\n * @param text - Text with {{variable}} placeholders\n * @param variables - Variables to interpolate\n * @returns Interpolated string\n */\nfunction interpolateVariables(text: string, variables?: TranslationVariables): string {\n if (!variables) return text;\n\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Get a translated message from context\n *\n * This is the primary function for getting translations in providers and resolvers.\n * It gracefully handles cases where i18n is not available by returning the default message.\n *\n * @param ctx - Context with optional i18n (GraphQL context, request context, etc.)\n * @param key - Translation key (e.g., 'tags.errors.notFound')\n * @param defaultMessage - Fallback message if translation not found\n * @param variables - Optional variables for interpolation\n * @returns Translated message or default message\n *\n * @example\n * ```typescript\n * // Simple usage\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n *\n * // With variables\n * const message = t(ctx, 'tags.errors.keyAlreadyExists', 'Tag with key {{key}} already exists', { key: 'my-tag' });\n *\n * // In a GraphQL resolver\n * if (!userId) {\n * throw new Error(t(context, 'common.errors.notAuthenticated', 'User not authenticated'));\n * }\n * ```\n */\nexport function t(\n ctx: I18nCapableContext,\n key: string,\n defaultMessage: string,\n variables?: TranslationVariables\n): string {\n // If i18n is not available, interpolate and return default message\n if (!ctx.i18n?.t) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n // Get translation with fallback to default\n const translated = ctx.i18n.t(key, variables, defaultMessage);\n\n // If translation returns the key (not found), use default message\n if (translated === key) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n return translated;\n}\n\n/**\n * Translator function type\n */\nexport type Translator = (key: string, defaultMessage: string, variables?: TranslationVariables) => string;\n\n/**\n * Create a bound translator function for a specific context\n *\n * This is useful when you need to pass a translator to services or\n * when you want to avoid repeating the context parameter.\n *\n * @param ctx - Context with optional i18n\n * @returns Translate function bound to the context\n *\n * @example\n * ```typescript\n * // Create translator\n * const translate = createTranslator(ctx);\n *\n * // Use it multiple times\n * const msg1 = translate('tags.errors.notFound', 'Tag not found');\n * const msg2 = translate('tags.errors.keyExists', 'Key {{key}} exists', { key: 'foo' });\n *\n * // Pass to a service\n * await someService.process(data, { translate });\n * ```\n */\nexport function createTranslator(ctx: I18nCapableContext): Translator {\n return (key: string, defaultMessage: string, variables?: TranslationVariables) => {\n return t(ctx, key, defaultMessage, variables);\n };\n}\n\n/**\n * Check if context has i18n support\n *\n * @param ctx - Context to check\n * @returns True if i18n is available and initialized\n */\nexport function hasI18n(ctx: I18nCapableContext): ctx is I18nCapableContext & { i18n: I18nContext } {\n return ctx.i18n?.t !== undefined;\n}\n\n/**\n * Get the current locale from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLocale - Default locale if i18n not available\n * @returns Current locale code\n */\nexport function getLocale(ctx: I18nCapableContext, defaultLocale: string = 'en-US'): string {\n return ctx.i18n?.locale ?? defaultLocale;\n}\n\n/**\n * Get the current language from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLanguage - Default language if i18n not available\n * @returns Current language code\n */\nexport function getLanguage(ctx: I18nCapableContext, defaultLanguage: string = 'en'): string {\n return ctx.i18n?.language ?? defaultLanguage;\n}\n"]}