{"version":3,"sources":["../src/config.ts"],"names":["ALGORITHM","IV_LENGTH","ENC_PREFIX","ENC_SUFFIX","getEncryptionKey","keyEnv","process","env","KOATTY_CONFIG_KEY","scryptSync","encrypt","plaintext","key","derivedKey","Error","iv","randomBytes","cipher","createCipheriv","encrypted","Buffer","concat","update","final","tag","getAuthTag","payload","toString","decrypt","encryptedValue","startsWith","endsWith","slice","length","data","from","MIN_PAYLOAD_LENGTH","subarray","decipher","createDecipheriv","setAuthTag","decryptConfigValues","conf","parentPath","k","Object","keys","currentPath","err","message","String","rc","require","LoadConfigs","loadPath","baseDir","pattern","ignore","KOATTY_ENV","NODE_ENV","Load","name","path","exp","tempConf","includes","t","lastIndexOf","replace","parseEnv","isObject","forEach","element","isString","value","isTrueEmpty","Config","type","target","propertyKey","propName","IOCContainer","savePropertyData","TAGGED_ARGS","method","app","getApp","config"],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2022-02-18 11:19:55\n * @LastEditTime: 2024-11-06 14:14:20\n */\nimport { IOCContainer, TAGGED_ARGS } from \"koatty_container\";\nimport * as Helper from \"koatty_lib\";\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from \"crypto\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst IV_LENGTH = 16;\nconst ENC_PREFIX = \"ENC(AES256:\";\nconst ENC_SUFFIX = \")\";\n\nfunction getEncryptionKey(): Buffer | null {\n  const keyEnv = process.env.KOATTY_CONFIG_KEY;\n  if (!keyEnv) return null;\n  return scryptSync(keyEnv, \"koatty-config-salt\", 32);\n}\n\nexport function encrypt(plaintext: string, key?: Buffer): string {\n  const derivedKey = key || getEncryptionKey();\n  if (!derivedKey) throw new Error(\"KOATTY_CONFIG_KEY environment variable is required for encryption\");\n  const iv = randomBytes(IV_LENGTH);\n  const cipher = createCipheriv(ALGORITHM, derivedKey, iv);\n  const encrypted = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n  const tag = cipher.getAuthTag();\n  const payload = Buffer.concat([iv, tag, encrypted]).toString(\"base64\");\n  return `${ENC_PREFIX}${payload}${ENC_SUFFIX}`;\n}\n\nexport function decrypt(encryptedValue: string, key?: Buffer): string {\n  if (!encryptedValue.startsWith(ENC_PREFIX) || !encryptedValue.endsWith(ENC_SUFFIX)) return encryptedValue;\n  const derivedKey = key || getEncryptionKey();\n  if (!derivedKey) throw new Error(\"KOATTY_CONFIG_KEY environment variable is required for decryption\");\n  const payload = encryptedValue.slice(ENC_PREFIX.length, -ENC_SUFFIX.length);\n  const data = Buffer.from(payload, \"base64\");\n  const MIN_PAYLOAD_LENGTH = IV_LENGTH + 16 + 1;\n  if (data.length < MIN_PAYLOAD_LENGTH) {\n    throw new Error(`Invalid encrypted payload: too short (${data.length} bytes, minimum ${MIN_PAYLOAD_LENGTH})`);\n  }\n  const iv = data.subarray(0, IV_LENGTH);\n  const tag = data.subarray(IV_LENGTH, IV_LENGTH + 16);\n  const encrypted = data.subarray(IV_LENGTH + 16);\n  const decipher = createDecipheriv(ALGORITHM, derivedKey, iv);\n  decipher.setAuthTag(tag);\n  try {\n    return decipher.update(encrypted) + decipher.final(\"utf8\");\n  } catch {\n    throw new Error(\"Failed to decrypt config value. Check KOATTY_CONFIG_KEY.\");\n  }\n}\n\nfunction decryptConfigValues(conf: any, parentPath = \"\"): void {\n  if (!conf || typeof conf !== \"object\") return;\n  for (const k of Object.keys(conf)) {\n    const currentPath = parentPath ? `${parentPath}.${k}` : k;\n    try {\n      if (typeof conf[k] === \"string\" && conf[k].startsWith(ENC_PREFIX) && conf[k].endsWith(ENC_SUFFIX)) {\n        conf[k] = decrypt(conf[k]);\n      } else if (typeof conf[k] === \"object\" && conf[k] !== null) {\n        decryptConfigValues(conf[k], currentPath);\n      }\n    } catch (err) {\n      throw new Error(`Failed to decrypt config key '${currentPath}': ${err instanceof Error ? err.message : String(err)}`);\n    }\n  }\n}\nimport { Load } from \"koatty_loader\";\nconst rc = require(\"run-con\");\n/**\n * LoadConfigs\n *\n * @export\n * @param {string[]} loadPath\n * @param {string} [baseDir]\n * @param {string[]} [pattern]\n * @param {string[]} [ignore]\n * @returns {*}  \n */\nexport function LoadConfigs(loadPath: string[], baseDir?: string, pattern?: string[], ignore?: string[]) {\n  const conf: Record<string, any> = {};\n  const env = process.env.KOATTY_ENV || process.env.NODE_ENV || \"\";\n\n  Load(loadPath, baseDir, (name: string, path: string, exp: any) => {\n    let tempConf: any = {};\n    if (name.includes(\"_\")) {\n      const t = name.slice(name.lastIndexOf(\"_\") + 1);\n      if (t && env.startsWith(t)) {\n        name = name.replace(`_${t}`, \"\");\n        tempConf = rc(name, { [name]: parseEnv(exp) });\n      }\n    } else {\n      tempConf = rc(name, { [name]: parseEnv(exp) });\n    }\n    conf[name] = tempConf[name];\n  }, pattern, ignore);\n\n  decryptConfigValues(conf);\n  return conf;\n}\n\n/**\n * parse process.env to replace ${}\n *\n * @param {*} conf\n * @returns {*}  \n */\nfunction parseEnv(conf: any) {\n  if (!Helper.isObject(conf)) return conf;\n  Object.keys(conf).forEach(key => {\n    const element = conf[key];\n    if (Helper.isObject(element)) {\n      conf[key] = parseEnv(element);\n    } else if (Helper.isString(element) && element.startsWith(\"${\") && element.endsWith(\"}\")) {\n      const value = process.env[element.slice(2, -1)] || \"\";\n      conf[key] = Helper.isTrueEmpty(value) ? \"\" : value;\n    }\n  });\n  return conf;\n}\n\n/**\n * Indicates that an decorated configuration as a property.\n *\n * @export\n * @param {string} identifier configuration key\n * @param {string} [type] configuration type\n * @returns {PropertyDecorator}\n */\nexport function Config(key?: string, type?: string): PropertyDecorator {\n  return (target: object, propertyKey: string | symbol) => {\n    const propName = typeof propertyKey === 'symbol' ? propertyKey.toString() : propertyKey;\n    IOCContainer.savePropertyData(TAGGED_ARGS, {\n      name: propertyKey,\n      method: () => {\n        const app = IOCContainer.getApp();\n        if (!app?.config) {\n          return null;\n        }\n        key = key || propName;\n        type = type || \"config\";\n        return app.config(key, type);\n      }\n    }, target, propertyKey);\n  };\n}\n"]}