{
  "version": 3,
  "sources": ["../../../src/plugin/definitions.ts", "../../../src/config.ts"],
  "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pkgUp from 'pkg-up';\nimport { parse } from 'yaml';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { setDeep } from '@dxos/util';\n\nimport { mapFromKeyValues } from '../config';\nimport { type ConfigPluginOpts } from './types';\n\nconst CWD = process.cwd();\n\nexport const definitions = ({\n  configPath,\n  envPath,\n  devPath,\n  mode = process.env.NODE_ENV,\n  publicUrl = '',\n  env,\n}: ConfigPluginOpts) => {\n  const KEYS_TO_FILE = {\n    __CONFIG_DEFAULTS__: configPath?.length ? configPath : resolve(CWD, 'dx.yml'),\n    __CONFIG_ENVS__: envPath?.length ? envPath : resolve(CWD, 'dx-env.yml'),\n  } as { [key: string]: string };\n  if (mode !== 'production') {\n    KEYS_TO_FILE.__CONFIG_LOCAL__ = devPath ?? resolve(CWD, 'dx-local.yml');\n  }\n\n  return Object.entries(KEYS_TO_FILE).reduce(\n    (prev, [key, value]) => {\n      invariant(key);\n      let content = {};\n      try {\n        content = parse(readFileSync(value, 'utf-8')) as any;\n\n        // Map environment variables to config values.\n        if (key === '__CONFIG_ENVS__') {\n          content = mapFromKeyValues(content, process.env);\n        }\n\n        if (key === '__CONFIG_DEFAULTS__') {\n          // Load app environment variables into default config.\n          Object.entries(process.env).forEach(([key, value]) => {\n            if (key.startsWith('DX_') || env?.includes(key)) {\n              setDeep(content, ['runtime', 'app', 'env', key], value);\n            }\n          });\n\n          // Set build info automatically if available.\n          try {\n            const timestamp = new Date().toISOString();\n            const commitHash =\n              process.env.DX_COMMIT_HASH ??\n              execSync('git rev-parse --short HEAD', { encoding: 'utf-8' }).replace('\\n', '');\n            const packagePath = pkgUp.sync();\n            const packageJson = packagePath && JSON.parse(readFileSync(packagePath, 'utf-8'));\n            setDeep(content, ['runtime', 'app', 'build', 'timestamp'], timestamp);\n            setDeep(content, ['runtime', 'app', 'build', 'commitHash'], commitHash);\n            setDeep(content, ['runtime', 'app', 'build', 'version'], packageJson?.version);\n          } catch {}\n        }\n      } catch (err: any) {\n        if (err.message.includes('YAMLException')) {\n          log.error(`Failed to parse file ${value}:`, err);\n        } else {\n          log(`Failed to load file ${value}:`, err);\n        }\n\n        if (key === '__CONFIG_DEFAULTS__') {\n          // Default config is required.\n          throw new Error(`Failed to load default config file from ${value}`);\n        }\n      }\n\n      return {\n        ...prev,\n        [key]: content,\n      };\n    },\n    {\n      __CONFIG_DEFAULTS__: {},\n      __CONFIG_ENVS__: {},\n      __CONFIG_LOCAL__: {},\n      __DXOS_CONFIG__: { dynamic: mode === 'production', publicUrl },\n    },\n  );\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport isMatch from 'lodash.ismatch';\n\nimport { InvalidConfigError } from '@dxos/protocols';\nimport { schema } from '@dxos/protocols/proto';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\nimport { trace } from '@dxos/tracing';\nimport { getDeep, setDeep } from '@dxos/util';\n\nimport { type ConfigKey, type DeepIndex, type ParseKey } from './types';\n\ntype MappingSpec = Record<string, { path: string; type?: string }>;\nconst configRootType = schema.getCodecForType('dxos.config.Config');\n\n/**\n * Maps the given objects onto a flattened set of (key x values).\n * Expects parsed yaml content of the form:\n *\n * ```\n * ENV_VAR:\n *   path: config.selector.path\n * ```\n *\n * @param {object} spec\n * @param {object} values\n * @return {object}\n */\nexport const mapFromKeyValues = (spec: MappingSpec, values: Record<string, any>) => {\n  const config = {};\n\n  for (const [key, { path, type }] of Object.entries(spec)) {\n    let value = values[key];\n    if (value !== undefined) {\n      if (type) {\n        switch (type) {\n          case 'boolean': {\n            value = String(value).toLowerCase() === 'true' || value === '1';\n            break;\n          }\n\n          case 'number': {\n            value = Number(value);\n            break;\n          }\n\n          case 'string': {\n            break;\n          }\n\n          case 'json': {\n            value = value ? JSON.parse(value) : null;\n            break;\n          }\n\n          default: {\n            throw new Error(`Invalid type: ${type}`);\n          }\n        }\n      }\n\n      setDeep(config, path.split('.'), value);\n    }\n  }\n\n  return config;\n};\n\n/**\n * Maps the given flattend set of (key x values) onto a JSON object.\n * @param {object} spec\n * @param {object} values\n */\nexport const mapToKeyValues = (spec: MappingSpec, values: any) => {\n  const config: Record<string, any> = {};\n\n  for (const [key, { path, type }] of Object.entries(spec)) {\n    const value = getDeep(values, path.split('.'));\n    if (value !== undefined) {\n      switch (type) {\n        case 'json':\n          config[key] = JSON.stringify(value);\n          break;\n        default:\n          config[key] = value;\n      }\n    }\n  }\n\n  return config;\n};\n\n/**\n * Validate config object.\n */\nexport const validateConfig = (config: ConfigProto): ConfigProto => {\n  if (!('version' in config)) {\n    throw new InvalidConfigError({ message: 'Version not specified' });\n  }\n\n  if (config?.version !== 1) {\n    throw new InvalidConfigError({ message: `Invalid config version: ${config.version}` });\n  }\n\n  const error = configRootType.protoType.verify(config);\n  if (error) {\n    throw new InvalidConfigError({ message: String(error) });\n  }\n\n  return config;\n};\n\nexport const ConfigResource = Symbol.for('dxos.resource.Config');\n\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\n@trace.resource({ annotation: ConfigResource })\nexport class Config {\n  private readonly _config: any;\n\n  /**\n   * Creates an immutable instance.\n   * @constructor\n   */\n  constructor(config: ConfigProto = {}, ...objects: ConfigProto[]) {\n    this._config = validateConfig(defaultsDeep(config, ...objects, { version: 1 }));\n  }\n\n  /**\n   * Returns an immutable config JSON object.\n   */\n  get values(): ConfigProto {\n    return this._config;\n  }\n\n  /**\n   * Returns the given config property.\n   *\n   * @param key A key in the config object. Can be a nested property with keys separated by dots: 'services.signal.server'.\n   * @param defaultValue Default value to return if option is not present in the config.\n   * @returns The config value or undefined if the option is not present.\n   */\n  get<K extends ConfigKey>(\n    key: K,\n    defaultValue?: DeepIndex<ConfigProto, ParseKey<K>>,\n  ): DeepIndex<ConfigProto, ParseKey<K>> | undefined {\n    return getDeep(this._config, key.split('.')) ?? defaultValue;\n  }\n\n  /**\n   * Get unique key.\n   */\n  find<T = any>(path: string, test: object): T | undefined {\n    const values = getDeep(this._config, path.split('.'));\n    if (!Array.isArray(values)) {\n      return;\n    }\n\n    return values.find((value) => isMatch(value, test));\n  }\n\n  /**\n   * Returns the given config property or throw if it doesn't exist.\n   *\n   * @param key A key in the config object. Can be a nested property with keys separated by dots: 'services.signal.server'.\n   */\n  getOrThrow<K extends ConfigKey>(key: K): Exclude<DeepIndex<ConfigProto, ParseKey<K>>, undefined> {\n    const value: DeepIndex<ConfigProto, ParseKey<K>> | undefined = getDeep(this._config, key.split('.'));\n    if (!value) {\n      throw new Error(`Config option not present: ${key}`);\n    }\n    return value;\n  }\n}\n"],
  "mappings": "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",
  "names": ["execSync", "readFileSync", "resolve", "pkgUp", "parse", "invariant", "log", "setDeep", "defaultsDeep", "isMatch", "InvalidConfigError", "schema", "trace", "getDeep", "setDeep", "configRootType", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "String", "toLowerCase", "Number", "JSON", "parse", "Error", "split", "validateConfig", "config", "InvalidConfigError", "message", "version", "error", "configRootType", "protoType", "verify", "String", "ConfigResource", "Symbol", "for", "Config", "_config", "objects", "defaultsDeep", "values", "get", "key", "defaultValue", "getDeep", "split", "find", "path", "test", "Array", "isArray", "value", "isMatch", "getOrThrow", "Error", "resource", "annotation", "process", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "configPath", "length", "resolve", "CWD", "__CONFIG_ENVS__", "envPath", "mode", "entries", "reduce", "prev", "key", "value", "content", "parse", "Object", "forEach", "setDeep", "encoding", "replace", "packagePath", "packageJson", "timestamp", "commitHash", "log", "error", "err", "__CONFIG_LOCAL__", "__DXOS_CONFIG__", "publicUrl"]
}
