@dxos/config 0.6.7 → 0.6.8-main.3be982f

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.
@@ -4,11 +4,10 @@ import * as defs from "@dxos/protocols/proto/dxos/config";
4
4
  // packages/sdk/config/src/config.ts
5
5
  import { boolean } from "boolean";
6
6
  import defaultsDeep from "lodash.defaultsdeep";
7
- import get from "lodash.get";
8
7
  import isMatch from "lodash.ismatch";
9
- import set from "lodash.set";
10
8
  import { InvalidConfigError, schema } from "@dxos/protocols";
11
9
  import { trace } from "@dxos/tracing";
10
+ import { getDeep, setDeep } from "@dxos/util";
12
11
  function _ts_decorate(decorators, target, key, desc) {
13
12
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
13
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -47,7 +46,7 @@ var mapFromKeyValues = (spec, values) => {
47
46
  }
48
47
  }
49
48
  }
50
- set(config, path, value);
49
+ setDeep(config, path.split("."), value);
51
50
  }
52
51
  }
53
52
  return config;
@@ -55,7 +54,7 @@ var mapFromKeyValues = (spec, values) => {
55
54
  var mapToKeyValues = (spec, values) => {
56
55
  const config = {};
57
56
  for (const [key, { path, type }] of Object.entries(spec)) {
58
- const value = get(values, path);
57
+ const value = getDeep(values, path.split("."));
59
58
  if (value !== void 0) {
60
59
  switch (type) {
61
60
  case "json":
@@ -106,33 +105,25 @@ var Config = class {
106
105
  * @returns The config value or undefined if the option is not present.
107
106
  */
108
107
  get(key, defaultValue) {
109
- return get(this._config, key, defaultValue);
108
+ return getDeep(this._config, key.split(".")) ?? defaultValue;
110
109
  }
111
110
  /**
112
111
  * Get unique key.
113
112
  */
114
113
  find(path, test) {
115
- const values = get(this._config, path);
114
+ const values = getDeep(this._config, path.split("."));
116
115
  if (!Array.isArray(values)) {
117
116
  return;
118
117
  }
119
118
  return values.find((value) => isMatch(value, test));
120
119
  }
121
120
  /**
122
- * Returns config key without type checking.
123
- *
124
- * @deprecated Use the type-checked version.
125
- */
126
- getUnchecked(key, defaultValue) {
127
- return get(this._config, key, defaultValue);
128
- }
129
- /**
130
121
  * Returns the given config property or throw if it doesn't exist.
131
122
  *
132
123
  * @param key A key in the config object. Can be a nested property with keys separated by dots: 'services.signal.server'.
133
124
  */
134
125
  getOrThrow(key) {
135
- const value = get(this._config, key);
126
+ const value = getDeep(this._config, key.split("."));
136
127
  if (!value) {
137
128
  throw new Error(`Config option not present: ${key}`);
138
129
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts", "../../../src/config.ts", "../../../src/loaders/browser.js", "../../../src/savers/browser.js", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\n// TODO(burdon): Why is this exported? (Rename).\nexport * as defs from '@dxos/protocols/proto/dxos/config';\n\nexport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport * from './config';\nexport * from './loaders';\nexport * from './savers';\nexport * from './plugin';\nexport * from './types';\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport get from 'lodash.get';\nimport isMatch from 'lodash.ismatch';\nimport set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\nimport { trace } from '@dxos/tracing';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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 set(config, path, 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 = get(values, path);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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>> {\n return get(this._config, key, defaultValue);\n }\n\n /**\n * Get unique key.\n */\n find<T = any>(path: string, test: object): T | undefined {\n const values = get(this._config, path);\n if (!Array.isArray(values)) {\n return;\n }\n\n return values.find((value) => isMatch(value, test));\n }\n\n /**\n * Returns config key without type checking.\n *\n * @deprecated Use the type-checked version.\n */\n getUnchecked<T>(key: string, defaultValue?: T): T {\n return get(this._config, key, defaultValue);\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 = get(this._config, key);\n if (!value) {\n throw new Error(`Config option not present: ${key}`);\n }\n return value;\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\n/* THIS FILE WILL BE LOADED BY CONTEXT REPLACEMENT PLUGIN IN BROWSER ENVS. */\n\n/* global __DXOS_CONFIG__ __CONFIG_ENVS__ __CONFIG_DEFAULTS__ __CONFIG_LOCAL__ */\n\nimport localforage from 'localforage';\n\nimport { log } from '@dxos/log';\n\nconst CONFIG_ENDPOINT = '/.well-known/dx/config';\n\nexport const Local = () => {\n return __CONFIG_LOCAL__;\n};\n\nexport const Dynamics = async () => {\n const { publicUrl = '', dynamic } = __DXOS_CONFIG__;\n if (!dynamic) {\n log('dynamics disabled');\n return {};\n }\n\n log('fetching config...', { publicUrl });\n return await fetch(`${publicUrl}${CONFIG_ENDPOINT}`)\n .then((res) => res.json())\n .catch((error) => {\n log.warn('Failed to fetch dynamic config.', error);\n return {};\n });\n};\n\nexport const Envs = () => {\n return __CONFIG_ENVS__;\n};\n\nexport const Defaults = () => {\n return __CONFIG_DEFAULTS__;\n};\n\n/**\n * Settings config from browser storage.\n */\nexport const Storage = async () => {\n try {\n const config = await localforage.getItem('dxos.org/settings/config');\n if (config) {\n return config;\n }\n } catch (err) {\n log.warn('Failed to load config', { err });\n }\n return {};\n};\n\nexport const Remote = (target, authenticationToken) => {\n if (!target) {\n return {};\n }\n\n try {\n const url = new URL(target);\n const protocol = url.protocol.slice(0, -1);\n\n return {\n runtime: {\n client: {\n // TODO(burdon): Remove vault.html.\n remoteSource: url.origin + (protocol.startsWith('http') ? '/vault.html' : ''),\n remoteSourceAuthenticationToken: authenticationToken,\n },\n },\n };\n } catch (err) {\n log.catch(err);\n return {};\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\n/* THIS FILE WILL BE LOADED BY CONTEXT REPLACEMENT PLUGIN IN BROWSER ENVS. */\n\nimport localforage from 'localforage';\n\nimport { log } from '@dxos/log';\n\nlet PERFORMING_CONFIG_SAVE = false;\n\nexport const SaveConfig = async (config) => {\n if (PERFORMING_CONFIG_SAVE) {\n log.warn('Already performing config save');\n return;\n }\n PERFORMING_CONFIG_SAVE = true;\n\n try {\n await localforage.setItem('dxos.org/settings/config', config);\n } catch (err) {\n log.warn('Failed to save config', { err });\n return {};\n } finally {\n PERFORMING_CONFIG_SAVE = false;\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const FILE_DEFAULTS = 'defaults.yml';\nexport const FILE_ENVS = 'envs-map.yml';\nexport const FILE_DYNAMICS = 'config.yml';\n\ntype DotPrefix<T extends string> = T extends '' ? '' : `.${T}`;\n\n/**\n * Returns all dot-separated nested keys for an object.\n *\n * Read more: https://stackoverflow.com/a/68404823.\n */\ntype DotNestedKeys<T> = (\n T extends object\n ? {\n [K in Exclude<keyof T, symbol>]: `${K}${DotPrefix<DotNestedKeys<T[K]>>}`;\n }[Exclude<keyof T, symbol>]\n : ''\n) extends infer D\n ? Extract<D, string>\n : never;\n\n/**\n * Parse a dot separated nested key into an array of keys.\n *\n * Example: 'services.signal.server' -> ['services', 'signal', 'server'].\n */\nexport type ParseKey<K extends string> = K extends `${infer L}.${infer Rest}` ? [L, ...ParseKey<Rest>] : [K];\n\n/**\n * Array of types that can act as an object key.\n */\ntype Keys = (keyof any)[];\n\n/**\n * Retrieves a property type in a series of nested objects.\n *\n * Read more: https://stackoverflow.com/a/61648690.\n */\nexport type DeepIndex<T, KS extends Keys, Fail = undefined> = KS extends [infer F, ...infer R]\n ? F extends keyof Exclude<T, undefined>\n ? R extends Keys\n ? DeepIndex<Exclude<T, undefined>[F], R, Fail>\n : Fail\n : Fail\n : T;\n\n/**\n * Any nested dot separated key that can be in config.\n */\n// TODO(egorgripasov): Clean once old config deprecated.\nexport type ConfigKey = DotNestedKeys<ConfigProto>;\n"],
5
- "mappings": "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",
6
- "names": ["defs", "boolean", "defaultsDeep", "get", "isMatch", "set", "InvalidConfigError", "schema", "trace", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "set", "mapToKeyValues", "get", "stringify", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getUnchecked", "getOrThrow", "trace", "resource", "annotation", "localforage", "log", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS"]
4
+ "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\n// TODO(burdon): Why is this exported? (Rename).\nexport * as defs from '@dxos/protocols/proto/dxos/config';\n\nexport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport * from './config';\nexport * from './loaders';\nexport * from './savers';\nexport * from './plugin';\nexport * from './types';\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport isMatch from 'lodash.ismatch';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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", "//\n// Copyright 2021 DXOS.org\n//\n\n/* THIS FILE WILL BE LOADED BY CONTEXT REPLACEMENT PLUGIN IN BROWSER ENVS. */\n\n/* global __DXOS_CONFIG__ __CONFIG_ENVS__ __CONFIG_DEFAULTS__ __CONFIG_LOCAL__ */\n\nimport localforage from 'localforage';\n\nimport { log } from '@dxos/log';\n\nconst CONFIG_ENDPOINT = '/.well-known/dx/config';\n\nexport const Local = () => {\n return __CONFIG_LOCAL__;\n};\n\nexport const Dynamics = async () => {\n const { publicUrl = '', dynamic } = __DXOS_CONFIG__;\n if (!dynamic) {\n log('dynamics disabled');\n return {};\n }\n\n log('fetching config...', { publicUrl });\n return await fetch(`${publicUrl}${CONFIG_ENDPOINT}`)\n .then((res) => res.json())\n .catch((error) => {\n log.warn('Failed to fetch dynamic config.', error);\n return {};\n });\n};\n\nexport const Envs = () => {\n return __CONFIG_ENVS__;\n};\n\nexport const Defaults = () => {\n return __CONFIG_DEFAULTS__;\n};\n\n/**\n * Settings config from browser storage.\n */\nexport const Storage = async () => {\n try {\n const config = await localforage.getItem('dxos.org/settings/config');\n if (config) {\n return config;\n }\n } catch (err) {\n log.warn('Failed to load config', { err });\n }\n return {};\n};\n\nexport const Remote = (target, authenticationToken) => {\n if (!target) {\n return {};\n }\n\n try {\n const url = new URL(target);\n const protocol = url.protocol.slice(0, -1);\n\n return {\n runtime: {\n client: {\n // TODO(burdon): Remove vault.html.\n remoteSource: url.origin + (protocol.startsWith('http') ? '/vault.html' : ''),\n remoteSourceAuthenticationToken: authenticationToken,\n },\n },\n };\n } catch (err) {\n log.catch(err);\n return {};\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\n/* THIS FILE WILL BE LOADED BY CONTEXT REPLACEMENT PLUGIN IN BROWSER ENVS. */\n\nimport localforage from 'localforage';\n\nimport { log } from '@dxos/log';\n\nlet PERFORMING_CONFIG_SAVE = false;\n\nexport const SaveConfig = async (config) => {\n if (PERFORMING_CONFIG_SAVE) {\n log.warn('Already performing config save');\n return;\n }\n PERFORMING_CONFIG_SAVE = true;\n\n try {\n await localforage.setItem('dxos.org/settings/config', config);\n } catch (err) {\n log.warn('Failed to save config', { err });\n return {};\n } finally {\n PERFORMING_CONFIG_SAVE = false;\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const FILE_DEFAULTS = 'defaults.yml';\nexport const FILE_ENVS = 'envs-map.yml';\nexport const FILE_DYNAMICS = 'config.yml';\n\ntype DotPrefix<T extends string> = T extends '' ? '' : `.${T}`;\n\n/**\n * Returns all dot-separated nested keys for an object.\n *\n * Read more: https://stackoverflow.com/a/68404823.\n */\ntype DotNestedKeys<T> = (\n T extends object\n ? {\n [K in Exclude<keyof T, symbol>]: `${K}${DotPrefix<DotNestedKeys<T[K]>>}`;\n }[Exclude<keyof T, symbol>]\n : ''\n) extends infer D\n ? Extract<D, string>\n : never;\n\n/**\n * Parse a dot separated nested key into an array of keys.\n *\n * Example: 'services.signal.server' -> ['services', 'signal', 'server'].\n */\nexport type ParseKey<K extends string> = K extends `${infer L}.${infer Rest}` ? [L, ...ParseKey<Rest>] : [K];\n\n/**\n * Array of types that can act as an object key.\n */\ntype Keys = (keyof any)[];\n\n/**\n * Retrieves a property type in a series of nested objects.\n *\n * Read more: https://stackoverflow.com/a/61648690.\n */\nexport type DeepIndex<T, KS extends Keys, Fail = undefined> = KS extends [infer F, ...infer R]\n ? F extends keyof Exclude<T, undefined>\n ? R extends Keys\n ? DeepIndex<Exclude<T, undefined>[F], R, Fail>\n : Fail\n : Fail\n : T;\n\n/**\n * Any nested dot separated key that can be in config.\n */\n// TODO(egorgripasov): Clean once old config deprecated.\nexport type ConfigKey = DotNestedKeys<ConfigProto>;\n"],
5
+ "mappings": "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",
6
+ "names": ["defs", "boolean", "defaultsDeep", "isMatch", "InvalidConfigError", "schema", "trace", "getDeep", "setDeep", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "setDeep", "split", "mapToKeyValues", "getDeep", "stringify", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "get", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getOrThrow", "trace", "resource", "annotation", "localforage", "log", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":16265,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/loaders/browser.js":{"bytes":1725,"imports":[{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/savers/browser.js":{"bytes":613,"imports":[{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"(disabled):packages/sdk/config/src/plugin":{"bytes":0,"imports":[]},"packages/sdk/config/src/types.ts":{"bytes":2780,"imports":[],"format":"esm"},"packages/sdk/config/src/index.ts":{"bytes":1265,"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/sdk/config/src/loaders/browser.js","kind":"import-statement","original":"./loaders"},{"path":"packages/sdk/config/src/savers/browser.js","kind":"import-statement","original":"./savers"},{"path":"(disabled):packages/sdk/config/src/plugin","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":13952},"packages/sdk/config/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["Config","ConfigResource","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","Remote","SaveConfig","Storage","defs","mapFromKeyValues","mapToKeyValues","validateConfig"],"entryPoint":"packages/sdk/config/src/index.ts","inputs":{"packages/sdk/config/src/index.ts":{"bytesInOutput":59},"packages/sdk/config/src/config.ts":{"bytesInOutput":4087},"packages/sdk/config/src/loaders/browser.js":{"bytesInOutput":1394},"packages/sdk/config/src/savers/browser.js":{"bytesInOutput":499},"packages/sdk/config/src/types.ts":{"bytesInOutput":102}},"bytes":6606}}}
1
+ {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":15943,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/loaders/browser.js":{"bytes":1725,"imports":[{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/savers/browser.js":{"bytes":613,"imports":[{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"(disabled):packages/sdk/config/src/plugin":{"bytes":0,"imports":[]},"packages/sdk/config/src/types.ts":{"bytes":2780,"imports":[],"format":"esm"},"packages/sdk/config/src/index.ts":{"bytes":1265,"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/sdk/config/src/loaders/browser.js","kind":"import-statement","original":"./loaders"},{"path":"packages/sdk/config/src/savers/browser.js","kind":"import-statement","original":"./savers"},{"path":"(disabled):packages/sdk/config/src/plugin","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":13849},"packages/sdk/config/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"localforage","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["Config","ConfigResource","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","Remote","SaveConfig","Storage","defs","mapFromKeyValues","mapToKeyValues","validateConfig"],"entryPoint":"packages/sdk/config/src/index.ts","inputs":{"packages/sdk/config/src/index.ts":{"bytesInOutput":59},"packages/sdk/config/src/config.ts":{"bytesInOutput":3955},"packages/sdk/config/src/loaders/browser.js":{"bytesInOutput":1394},"packages/sdk/config/src/savers/browser.js":{"bytesInOutput":499},"packages/sdk/config/src/types.ts":{"bytesInOutput":102}},"bytes":6474}}}
@@ -51,22 +51,21 @@ module.exports = __toCommonJS(node_exports);
51
51
  var defs = __toESM(require("@dxos/protocols/proto/dxos/config"));
52
52
  var import_boolean = require("boolean");
53
53
  var import_lodash = __toESM(require("lodash.defaultsdeep"));
54
- var import_lodash2 = __toESM(require("lodash.get"));
55
- var import_lodash3 = __toESM(require("lodash.ismatch"));
56
- var import_lodash4 = __toESM(require("lodash.set"));
54
+ var import_lodash2 = __toESM(require("lodash.ismatch"));
57
55
  var import_protocols = require("@dxos/protocols");
58
56
  var import_tracing = require("@dxos/tracing");
57
+ var import_util = require("@dxos/util");
59
58
  var import_js_yaml = __toESM(require("js-yaml"));
60
59
  var import_node_fs = __toESM(require("node:fs"));
61
60
  var import_node_path = __toESM(require("node:path"));
62
61
  var import_log = require("@dxos/log");
63
62
  var import_js_yaml2 = __toESM(require("js-yaml"));
64
- var import_lodash5 = __toESM(require("lodash.set"));
65
63
  var import_node_child_process = require("node:child_process");
66
64
  var import_node_fs2 = require("node:fs");
67
65
  var import_node_path2 = require("node:path");
68
66
  var import_pkg_up = __toESM(require("pkg-up"));
69
67
  var import_log2 = require("@dxos/log");
68
+ var import_util2 = require("@dxos/util");
70
69
  function _ts_decorate(decorators, target, key, desc) {
71
70
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
72
71
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -105,7 +104,7 @@ var mapFromKeyValues = (spec, values) => {
105
104
  }
106
105
  }
107
106
  }
108
- (0, import_lodash4.default)(config, path2, value);
107
+ (0, import_util.setDeep)(config, path2.split("."), value);
109
108
  }
110
109
  }
111
110
  return config;
@@ -113,7 +112,7 @@ var mapFromKeyValues = (spec, values) => {
113
112
  var mapToKeyValues = (spec, values) => {
114
113
  const config = {};
115
114
  for (const [key, { path: path2, type }] of Object.entries(spec)) {
116
- const value = (0, import_lodash2.default)(values, path2);
115
+ const value = (0, import_util.getDeep)(values, path2.split("."));
117
116
  if (value !== void 0) {
118
117
  switch (type) {
119
118
  case "json":
@@ -164,25 +163,17 @@ var Config = class {
164
163
  * @returns The config value or undefined if the option is not present.
165
164
  */
166
165
  get(key, defaultValue) {
167
- return (0, import_lodash2.default)(this._config, key, defaultValue);
166
+ return (0, import_util.getDeep)(this._config, key.split(".")) ?? defaultValue;
168
167
  }
169
168
  /**
170
169
  * Get unique key.
171
170
  */
172
171
  find(path2, test) {
173
- const values = (0, import_lodash2.default)(this._config, path2);
172
+ const values = (0, import_util.getDeep)(this._config, path2.split("."));
174
173
  if (!Array.isArray(values)) {
175
174
  return;
176
175
  }
177
- return values.find((value) => (0, import_lodash3.default)(value, test));
178
- }
179
- /**
180
- * Returns config key without type checking.
181
- *
182
- * @deprecated Use the type-checked version.
183
- */
184
- getUnchecked(key, defaultValue) {
185
- return (0, import_lodash2.default)(this._config, key, defaultValue);
176
+ return values.find((value) => (0, import_lodash2.default)(value, test));
186
177
  }
187
178
  /**
188
179
  * Returns the given config property or throw if it doesn't exist.
@@ -190,7 +181,7 @@ var Config = class {
190
181
  * @param key A key in the config object. Can be a nested property with keys separated by dots: 'services.signal.server'.
191
182
  */
192
183
  getOrThrow(key) {
193
- const value = (0, import_lodash2.default)(this._config, key);
184
+ const value = (0, import_util.getDeep)(this._config, key.split("."));
194
185
  if (!value) {
195
186
  throw new Error(`Config option not present: ${key}`);
196
187
  }
@@ -275,7 +266,7 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
275
266
  if (key === "__CONFIG_DEFAULTS__") {
276
267
  Object.entries(process.env).forEach(([key2, value2]) => {
277
268
  if (key2.startsWith("DX_") || env?.includes(key2)) {
278
- (0, import_lodash5.default)(content, [
269
+ (0, import_util2.setDeep)(content, [
279
270
  "runtime",
280
271
  "app",
281
272
  "env",
@@ -290,19 +281,19 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
290
281
  }).replace("\n", "");
291
282
  const packagePath = import_pkg_up.default.sync();
292
283
  const packageJson = packagePath && JSON.parse((0, import_node_fs2.readFileSync)(packagePath, "utf-8"));
293
- (0, import_lodash5.default)(content, [
284
+ (0, import_util2.setDeep)(content, [
294
285
  "runtime",
295
286
  "app",
296
287
  "build",
297
288
  "timestamp"
298
289
  ], timestamp);
299
- (0, import_lodash5.default)(content, [
290
+ (0, import_util2.setDeep)(content, [
300
291
  "runtime",
301
292
  "app",
302
293
  "build",
303
294
  "commitHash"
304
295
  ], commitHash);
305
- (0, import_lodash5.default)(content, [
296
+ (0, import_util2.setDeep)(content, [
306
297
  "runtime",
307
298
  "app",
308
299
  "build",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts", "../../../src/config.ts", "../../../src/loaders/index.ts", "../../../src/types.ts", "../../../src/savers/index.ts", "../../../src/plugin/definitions.ts"],
4
- "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\n// TODO(burdon): Why is this exported? (Rename).\nexport * as defs from '@dxos/protocols/proto/dxos/config';\n\nexport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport * from './config';\nexport * from './loaders';\nexport * from './savers';\nexport * from './plugin';\nexport * from './types';\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport get from 'lodash.get';\nimport isMatch from 'lodash.ismatch';\nimport set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\nimport { trace } from '@dxos/tracing';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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 set(config, path, 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 = get(values, path);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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>> {\n return get(this._config, key, defaultValue);\n }\n\n /**\n * Get unique key.\n */\n find<T = any>(path: string, test: object): T | undefined {\n const values = get(this._config, path);\n if (!Array.isArray(values)) {\n return;\n }\n\n return values.find((value) => isMatch(value, test));\n }\n\n /**\n * Returns config key without type checking.\n *\n * @deprecated Use the type-checked version.\n */\n getUnchecked<T>(key: string, defaultValue?: T): T {\n return get(this._config, key, defaultValue);\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 = get(this._config, key);\n if (!value) {\n throw new Error(`Config option not present: ${key}`);\n }\n return value;\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { log } from '@dxos/log';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nimport { mapFromKeyValues } from '../config';\nimport { FILE_DEFAULTS, FILE_ENVS } from '../types';\n\n// TODO(burdon): Move code out of index file.\n\nconst DEFAULT_BASE_PATH = path.resolve(process.cwd(), 'config');\n\nconst maybeLoadFile = (file: string): any => {\n try {\n return yaml.load(fs.readFileSync(file, { encoding: 'utf8' }));\n } catch (err: any) {\n // Ignored.\n }\n};\n\n//\n// NOTE: Export LocalStorage and Dynamics for typescript to typecheck browser code (see ConfigPlugin).\n//\n\n/**\n * Profile\n */\nexport const Profile = (profile = 'default') => {\n const configFile = path.join(process.env.HOME ?? '~', `.config/dx/profile/${profile}.yml`);\n return maybeLoadFile(configFile) as ConfigProto;\n};\n\n/**\n * Development config.\n */\n// TODO(burdon): Rename or reconcile with Profile above?\nexport const Local = (): Partial<ConfigProto> => ({});\n\n/**\n * Provided dynamically by server.\n */\nexport const Dynamics = (): Partial<ConfigProto> => ({});\n\n/**\n * ENV variable (key/value) map.\n */\nexport const Envs = (basePath = DEFAULT_BASE_PATH): Partial<ConfigProto> => {\n const content = maybeLoadFile(path.resolve(basePath, FILE_ENVS));\n return content ? mapFromKeyValues(content, process.env) : {};\n};\n\n/**\n * JSON config.\n */\nexport const Defaults = (basePath = DEFAULT_BASE_PATH): Partial<ConfigProto> =>\n maybeLoadFile(path.resolve(basePath, FILE_DEFAULTS)) ?? {};\n\n/**\n * Load config from storage.\n */\nexport const Storage = async (): Promise<Partial<ConfigProto>> => ({});\n\nexport const Remote = (target: string | undefined, authenticationToken?: string): Partial<ConfigProto> => {\n if (!target) {\n return {};\n }\n\n try {\n const url = new URL(target);\n const protocol = url.protocol.slice(0, -1);\n return {\n runtime: {\n client: {\n // TODO(burdon): Remove vault.html.\n remoteSource: url.origin + (protocol.startsWith('http') ? '/vault.html' : ''),\n remoteSourceAuthenticationToken: authenticationToken,\n },\n },\n };\n } catch (err) {\n log.catch(err);\n return {};\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const FILE_DEFAULTS = 'defaults.yml';\nexport const FILE_ENVS = 'envs-map.yml';\nexport const FILE_DYNAMICS = 'config.yml';\n\ntype DotPrefix<T extends string> = T extends '' ? '' : `.${T}`;\n\n/**\n * Returns all dot-separated nested keys for an object.\n *\n * Read more: https://stackoverflow.com/a/68404823.\n */\ntype DotNestedKeys<T> = (\n T extends object\n ? {\n [K in Exclude<keyof T, symbol>]: `${K}${DotPrefix<DotNestedKeys<T[K]>>}`;\n }[Exclude<keyof T, symbol>]\n : ''\n) extends infer D\n ? Extract<D, string>\n : never;\n\n/**\n * Parse a dot separated nested key into an array of keys.\n *\n * Example: 'services.signal.server' -> ['services', 'signal', 'server'].\n */\nexport type ParseKey<K extends string> = K extends `${infer L}.${infer Rest}` ? [L, ...ParseKey<Rest>] : [K];\n\n/**\n * Array of types that can act as an object key.\n */\ntype Keys = (keyof any)[];\n\n/**\n * Retrieves a property type in a series of nested objects.\n *\n * Read more: https://stackoverflow.com/a/61648690.\n */\nexport type DeepIndex<T, KS extends Keys, Fail = undefined> = KS extends [infer F, ...infer R]\n ? F extends keyof Exclude<T, undefined>\n ? R extends Keys\n ? DeepIndex<Exclude<T, undefined>[F], R, Fail>\n : Fail\n : Fail\n : T;\n\n/**\n * Any nested dot separated key that can be in config.\n */\n// TODO(egorgripasov): Clean once old config deprecated.\nexport type ConfigKey = DotNestedKeys<ConfigProto>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const SaveConfig = async (_: ConfigProto) => {};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport set from 'lodash.set';\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pkgUp from 'pkg-up';\n\nimport { log } from '@dxos/log';\n\nimport { type ConfigPluginOpts } from './types';\nimport { mapFromKeyValues } from '../config';\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 ?? resolve(CWD, 'dx.yml'),\n __CONFIG_ENVS__: envPath ?? resolve(CWD, 'dx-env.yml'),\n } as { [key: string]: string };\n\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 let content = {};\n\n try {\n content = yaml.load(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 set(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 set(content, ['runtime', 'app', 'build', 'timestamp'], timestamp);\n set(content, ['runtime', 'app', 'build', 'commitHash'], commitHash);\n set(content, ['runtime', 'app', 'build', 'version'], packageJson?.version);\n } catch {}\n }\n } catch (err: any) {\n log(`Failed to load file ${value}:`, err);\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 __DXOS_CONFIG__: { dynamic: mode === 'production', publicUrl },\n __CONFIG_DEFAULTS__: {},\n __CONFIG_ENVS__: {},\n __CONFIG_LOCAL__: {},\n },\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_lodash", "import_js_yaml", "import_node_fs", "import_node_path", "import_log", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "set", "mapToKeyValues", "get", "stringify", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getUnchecked", "getOrThrow", "trace", "resource", "annotation", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS", "DEFAULT_BASE_PATH", "resolve", "process", "cwd", "maybeLoadFile", "file", "yaml", "load", "fs", "readFileSync", "encoding", "err", "Profile", "profile", "configFile", "join", "env", "HOME", "Local", "Dynamics", "Envs", "basePath", "content", "Defaults", "Storage", "Remote", "target", "authenticationToken", "url", "URL", "protocol", "slice", "runtime", "client", "remoteSource", "origin", "startsWith", "remoteSourceAuthenticationToken", "log", "catch", "SaveConfig", "_", "CWD", "definitions", "configPath", "envPath", "devPath", "mode", "NODE_ENV", "publicUrl", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "__CONFIG_ENVS__", "__CONFIG_LOCAL__", "reduce", "prev", "forEach", "includes", "timestamp", "Date", "toISOString", "commitHash", "DX_COMMIT_HASH", "execSync", "replace", "packagePath", "pkgUp", "sync", "packageJson", "__DXOS_CONFIG__", "dynamic"]
4
+ "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\n// TODO(burdon): Why is this exported? (Rename).\nexport * as defs from '@dxos/protocols/proto/dxos/config';\n\nexport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport * from './config';\nexport * from './loaders';\nexport * from './savers';\nexport * from './plugin';\nexport * from './types';\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport isMatch from 'lodash.ismatch';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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", "//\n// Copyright 2021 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { log } from '@dxos/log';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nimport { mapFromKeyValues } from '../config';\nimport { FILE_DEFAULTS, FILE_ENVS } from '../types';\n\n// TODO(burdon): Move code out of index file.\n\nconst DEFAULT_BASE_PATH = path.resolve(process.cwd(), 'config');\n\nconst maybeLoadFile = (file: string): any => {\n try {\n return yaml.load(fs.readFileSync(file, { encoding: 'utf8' }));\n } catch (err: any) {\n // Ignored.\n }\n};\n\n//\n// NOTE: Export LocalStorage and Dynamics for typescript to typecheck browser code (see ConfigPlugin).\n//\n\n/**\n * Profile\n */\nexport const Profile = (profile = 'default') => {\n const configFile = path.join(process.env.HOME ?? '~', `.config/dx/profile/${profile}.yml`);\n return maybeLoadFile(configFile) as ConfigProto;\n};\n\n/**\n * Development config.\n */\n// TODO(burdon): Rename or reconcile with Profile above?\nexport const Local = (): Partial<ConfigProto> => ({});\n\n/**\n * Provided dynamically by server.\n */\nexport const Dynamics = (): Partial<ConfigProto> => ({});\n\n/**\n * ENV variable (key/value) map.\n */\nexport const Envs = (basePath = DEFAULT_BASE_PATH): Partial<ConfigProto> => {\n const content = maybeLoadFile(path.resolve(basePath, FILE_ENVS));\n return content ? mapFromKeyValues(content, process.env) : {};\n};\n\n/**\n * JSON config.\n */\nexport const Defaults = (basePath = DEFAULT_BASE_PATH): Partial<ConfigProto> =>\n maybeLoadFile(path.resolve(basePath, FILE_DEFAULTS)) ?? {};\n\n/**\n * Load config from storage.\n */\nexport const Storage = async (): Promise<Partial<ConfigProto>> => ({});\n\nexport const Remote = (target: string | undefined, authenticationToken?: string): Partial<ConfigProto> => {\n if (!target) {\n return {};\n }\n\n try {\n const url = new URL(target);\n const protocol = url.protocol.slice(0, -1);\n return {\n runtime: {\n client: {\n // TODO(burdon): Remove vault.html.\n remoteSource: url.origin + (protocol.startsWith('http') ? '/vault.html' : ''),\n remoteSourceAuthenticationToken: authenticationToken,\n },\n },\n };\n } catch (err) {\n log.catch(err);\n return {};\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const FILE_DEFAULTS = 'defaults.yml';\nexport const FILE_ENVS = 'envs-map.yml';\nexport const FILE_DYNAMICS = 'config.yml';\n\ntype DotPrefix<T extends string> = T extends '' ? '' : `.${T}`;\n\n/**\n * Returns all dot-separated nested keys for an object.\n *\n * Read more: https://stackoverflow.com/a/68404823.\n */\ntype DotNestedKeys<T> = (\n T extends object\n ? {\n [K in Exclude<keyof T, symbol>]: `${K}${DotPrefix<DotNestedKeys<T[K]>>}`;\n }[Exclude<keyof T, symbol>]\n : ''\n) extends infer D\n ? Extract<D, string>\n : never;\n\n/**\n * Parse a dot separated nested key into an array of keys.\n *\n * Example: 'services.signal.server' -> ['services', 'signal', 'server'].\n */\nexport type ParseKey<K extends string> = K extends `${infer L}.${infer Rest}` ? [L, ...ParseKey<Rest>] : [K];\n\n/**\n * Array of types that can act as an object key.\n */\ntype Keys = (keyof any)[];\n\n/**\n * Retrieves a property type in a series of nested objects.\n *\n * Read more: https://stackoverflow.com/a/61648690.\n */\nexport type DeepIndex<T, KS extends Keys, Fail = undefined> = KS extends [infer F, ...infer R]\n ? F extends keyof Exclude<T, undefined>\n ? R extends Keys\n ? DeepIndex<Exclude<T, undefined>[F], R, Fail>\n : Fail\n : Fail\n : T;\n\n/**\n * Any nested dot separated key that can be in config.\n */\n// TODO(egorgripasov): Clean once old config deprecated.\nexport type ConfigKey = DotNestedKeys<ConfigProto>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\n\nexport const SaveConfig = async (_: ConfigProto) => {};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pkgUp from 'pkg-up';\n\nimport { log } from '@dxos/log';\nimport { setDeep } from '@dxos/util';\n\nimport { type ConfigPluginOpts } from './types';\nimport { mapFromKeyValues } from '../config';\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 ?? resolve(CWD, 'dx.yml'),\n __CONFIG_ENVS__: envPath ?? resolve(CWD, 'dx-env.yml'),\n } as { [key: string]: string };\n\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 let content = {};\n\n try {\n content = yaml.load(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 log(`Failed to load file ${value}:`, err);\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 __DXOS_CONFIG__: { dynamic: mode === 'production', publicUrl },\n __CONFIG_DEFAULTS__: {},\n __CONFIG_ENVS__: {},\n __CONFIG_LOCAL__: {},\n },\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_lodash", "import_js_yaml", "import_node_fs", "import_node_path", "import_log", "import_util", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "setDeep", "split", "mapToKeyValues", "getDeep", "stringify", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "get", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getOrThrow", "trace", "resource", "annotation", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS", "DEFAULT_BASE_PATH", "resolve", "process", "cwd", "maybeLoadFile", "file", "yaml", "load", "fs", "readFileSync", "encoding", "err", "Profile", "profile", "configFile", "join", "env", "HOME", "Local", "Dynamics", "Envs", "basePath", "content", "Defaults", "Storage", "Remote", "target", "authenticationToken", "url", "URL", "protocol", "slice", "runtime", "client", "remoteSource", "origin", "startsWith", "remoteSourceAuthenticationToken", "log", "catch", "SaveConfig", "_", "CWD", "definitions", "configPath", "envPath", "devPath", "mode", "NODE_ENV", "publicUrl", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "__CONFIG_ENVS__", "__CONFIG_LOCAL__", "reduce", "prev", "forEach", "includes", "timestamp", "Date", "toISOString", "commitHash", "DX_COMMIT_HASH", "execSync", "replace", "packagePath", "pkgUp", "sync", "packageJson", "__DXOS_CONFIG__", "dynamic"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":16265,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/types.ts":{"bytes":2780,"imports":[],"format":"esm"},"packages/sdk/config/src/loaders/index.ts":{"bytes":8383,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/sdk/config/src/savers/index.ts":{"bytes":711,"imports":[],"format":"esm"},"packages/sdk/config/src/plugin/definitions.ts":{"bytes":10894,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"}],"format":"esm"},"packages/sdk/config/src/plugin/types.ts":{"bytes":1530,"imports":[],"format":"esm"},"packages/sdk/config/src/plugin/index.ts":{"bytes":590,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"},{"path":"packages/sdk/config/src/plugin/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/sdk/config/src/index.ts":{"bytes":1265,"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/sdk/config/src/loaders/index.ts","kind":"import-statement","original":"./loaders"},{"path":"packages/sdk/config/src/savers/index.ts","kind":"import-statement","original":"./savers"},{"path":"packages/sdk/config/src/plugin/index.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":19532},"packages/sdk/config/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["Config","ConfigResource","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","Profile","Remote","SaveConfig","Storage","definitions","defs","mapFromKeyValues","mapToKeyValues","validateConfig"],"entryPoint":"packages/sdk/config/src/index.ts","inputs":{"packages/sdk/config/src/index.ts":{"bytesInOutput":59},"packages/sdk/config/src/config.ts":{"bytesInOutput":4105},"packages/sdk/config/src/loaders/index.ts":{"bytesInOutput":1562},"packages/sdk/config/src/types.ts":{"bytesInOutput":102},"packages/sdk/config/src/savers/index.ts":{"bytesInOutput":35},"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2732},"packages/sdk/config/src/plugin/index.ts":{"bytesInOutput":0}},"bytes":9177}}}
1
+ {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":15943,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/types.ts":{"bytes":2780,"imports":[],"format":"esm"},"packages/sdk/config/src/loaders/index.ts":{"bytes":8383,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/sdk/config/src/savers/index.ts":{"bytes":711,"imports":[],"format":"esm"},"packages/sdk/config/src/plugin/definitions.ts":{"bytes":10962,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"}],"format":"esm"},"packages/sdk/config/src/plugin/types.ts":{"bytes":1530,"imports":[],"format":"esm"},"packages/sdk/config/src/plugin/index.ts":{"bytes":590,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"},{"path":"packages/sdk/config/src/plugin/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/sdk/config/src/index.ts":{"bytes":1265,"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/sdk/config/src/loaders/index.ts","kind":"import-statement","original":"./loaders"},{"path":"packages/sdk/config/src/savers/index.ts","kind":"import-statement","original":"./savers"},{"path":"packages/sdk/config/src/plugin/index.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/config/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":19468},"packages/sdk/config/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/config","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["Config","ConfigResource","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","Profile","Remote","SaveConfig","Storage","definitions","defs","mapFromKeyValues","mapToKeyValues","validateConfig"],"entryPoint":"packages/sdk/config/src/index.ts","inputs":{"packages/sdk/config/src/index.ts":{"bytesInOutput":59},"packages/sdk/config/src/config.ts":{"bytesInOutput":3973},"packages/sdk/config/src/loaders/index.ts":{"bytesInOutput":1562},"packages/sdk/config/src/types.ts":{"bytesInOutput":102},"packages/sdk/config/src/savers/index.ts":{"bytesInOutput":35},"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2767},"packages/sdk/config/src/plugin/index.ts":{"bytesInOutput":0}},"bytes":9080}}}
@@ -26,25 +26,24 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_XX2MVHOV_exports = {};
30
- __export(chunk_XX2MVHOV_exports, {
29
+ var chunk_DFQX2BND_exports = {};
30
+ __export(chunk_DFQX2BND_exports, {
31
31
  definitions: () => definitions
32
32
  });
33
- module.exports = __toCommonJS(chunk_XX2MVHOV_exports);
33
+ module.exports = __toCommonJS(chunk_DFQX2BND_exports);
34
34
  var import_js_yaml = __toESM(require("js-yaml"));
35
- var import_lodash = __toESM(require("lodash.set"));
36
35
  var import_node_child_process = require("node:child_process");
37
36
  var import_node_fs = require("node:fs");
38
37
  var import_node_path = require("node:path");
39
38
  var import_pkg_up = __toESM(require("pkg-up"));
40
39
  var import_log = require("@dxos/log");
40
+ var import_util = require("@dxos/util");
41
41
  var import_boolean = require("boolean");
42
- var import_lodash2 = __toESM(require("lodash.defaultsdeep"));
43
- var import_lodash3 = __toESM(require("lodash.get"));
44
- var import_lodash4 = __toESM(require("lodash.ismatch"));
45
- var import_lodash5 = __toESM(require("lodash.set"));
42
+ var import_lodash = __toESM(require("lodash.defaultsdeep"));
43
+ var import_lodash2 = __toESM(require("lodash.ismatch"));
46
44
  var import_protocols = require("@dxos/protocols");
47
45
  var import_tracing = require("@dxos/tracing");
46
+ var import_util2 = require("@dxos/util");
48
47
  function _ts_decorate(decorators, target, key, desc) {
49
48
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
50
49
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -83,7 +82,7 @@ var mapFromKeyValues = (spec, values) => {
83
82
  }
84
83
  }
85
84
  }
86
- (0, import_lodash5.default)(config, path, value);
85
+ (0, import_util2.setDeep)(config, path.split("."), value);
87
86
  }
88
87
  }
89
88
  return config;
@@ -108,7 +107,7 @@ var Config = class {
108
107
  * @constructor
109
108
  */
110
109
  constructor(config = {}, ...objects) {
111
- this._config = validateConfig((0, import_lodash2.default)(config, ...objects, {
110
+ this._config = validateConfig((0, import_lodash.default)(config, ...objects, {
112
111
  version: 1
113
112
  }));
114
113
  }
@@ -126,25 +125,17 @@ var Config = class {
126
125
  * @returns The config value or undefined if the option is not present.
127
126
  */
128
127
  get(key, defaultValue) {
129
- return (0, import_lodash3.default)(this._config, key, defaultValue);
128
+ return (0, import_util2.getDeep)(this._config, key.split(".")) ?? defaultValue;
130
129
  }
131
130
  /**
132
131
  * Get unique key.
133
132
  */
134
133
  find(path, test) {
135
- const values = (0, import_lodash3.default)(this._config, path);
134
+ const values = (0, import_util2.getDeep)(this._config, path.split("."));
136
135
  if (!Array.isArray(values)) {
137
136
  return;
138
137
  }
139
- return values.find((value) => (0, import_lodash4.default)(value, test));
140
- }
141
- /**
142
- * Returns config key without type checking.
143
- *
144
- * @deprecated Use the type-checked version.
145
- */
146
- getUnchecked(key, defaultValue) {
147
- return (0, import_lodash3.default)(this._config, key, defaultValue);
138
+ return values.find((value) => (0, import_lodash2.default)(value, test));
148
139
  }
149
140
  /**
150
141
  * Returns the given config property or throw if it doesn't exist.
@@ -152,7 +143,7 @@ var Config = class {
152
143
  * @param key A key in the config object. Can be a nested property with keys separated by dots: 'services.signal.server'.
153
144
  */
154
145
  getOrThrow(key) {
155
- const value = (0, import_lodash3.default)(this._config, key);
146
+ const value = (0, import_util2.getDeep)(this._config, key.split("."));
156
147
  if (!value) {
157
148
  throw new Error(`Config option not present: ${key}`);
158
149
  }
@@ -184,7 +175,7 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
184
175
  if (key === "__CONFIG_DEFAULTS__") {
185
176
  Object.entries(process.env).forEach(([key2, value2]) => {
186
177
  if (key2.startsWith("DX_") || env?.includes(key2)) {
187
- (0, import_lodash.default)(content, [
178
+ (0, import_util.setDeep)(content, [
188
179
  "runtime",
189
180
  "app",
190
181
  "env",
@@ -199,19 +190,19 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
199
190
  }).replace("\n", "");
200
191
  const packagePath = import_pkg_up.default.sync();
201
192
  const packageJson = packagePath && JSON.parse((0, import_node_fs.readFileSync)(packagePath, "utf-8"));
202
- (0, import_lodash.default)(content, [
193
+ (0, import_util.setDeep)(content, [
203
194
  "runtime",
204
195
  "app",
205
196
  "build",
206
197
  "timestamp"
207
198
  ], timestamp);
208
- (0, import_lodash.default)(content, [
199
+ (0, import_util.setDeep)(content, [
209
200
  "runtime",
210
201
  "app",
211
202
  "build",
212
203
  "commitHash"
213
204
  ], commitHash);
214
- (0, import_lodash.default)(content, [
205
+ (0, import_util.setDeep)(content, [
215
206
  "runtime",
216
207
  "app",
217
208
  "build",
@@ -249,4 +240,4 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
249
240
  0 && (module.exports = {
250
241
  definitions
251
242
  });
252
- //# sourceMappingURL=chunk-XX2MVHOV.cjs.map
243
+ //# sourceMappingURL=chunk-DFQX2BND.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugin/definitions.ts", "../../../src/config.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pkgUp from 'pkg-up';\n\nimport { log } from '@dxos/log';\nimport { setDeep } from '@dxos/util';\n\nimport { type ConfigPluginOpts } from './types';\nimport { mapFromKeyValues } from '../config';\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 ?? resolve(CWD, 'dx.yml'),\n __CONFIG_ENVS__: envPath ?? resolve(CWD, 'dx-env.yml'),\n } as { [key: string]: string };\n\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 let content = {};\n\n try {\n content = yaml.load(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 log(`Failed to load file ${value}:`, err);\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 __DXOS_CONFIG__: { dynamic: mode === 'production', publicUrl },\n __CONFIG_DEFAULTS__: {},\n __CONFIG_ENVS__: {},\n __CONFIG_LOCAL__: {},\n },\n );\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport isMatch from 'lodash.ismatch';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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"],
5
+ "mappings": "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",
6
+ "names": ["import_lodash", "import_util", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "setDeep", "split", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "get", "defaultValue", "getDeep", "find", "test", "Array", "isArray", "isMatch", "getOrThrow", "trace", "resource", "annotation", "CWD", "process", "cwd", "definitions", "configPath", "envPath", "devPath", "mode", "env", "NODE_ENV", "publicUrl", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "resolve", "__CONFIG_ENVS__", "__CONFIG_LOCAL__", "reduce", "prev", "content", "yaml", "load", "readFileSync", "forEach", "startsWith", "includes", "timestamp", "Date", "toISOString", "commitHash", "DX_COMMIT_HASH", "execSync", "encoding", "replace", "packagePath", "pkgUp", "sync", "packageJson", "err", "log", "__DXOS_CONFIG__", "dynamic"]
7
+ }
@@ -21,14 +21,14 @@ __export(esbuild_plugin_exports, {
21
21
  ConfigPlugin: () => ConfigPlugin
22
22
  });
23
23
  module.exports = __toCommonJS(esbuild_plugin_exports);
24
- var import_chunk_XX2MVHOV = require("./chunk-XX2MVHOV.cjs");
24
+ var import_chunk_DFQX2BND = require("./chunk-DFQX2BND.cjs");
25
25
  var ConfigPlugin = (options = {}) => {
26
26
  return {
27
27
  name: "dxos-config",
28
28
  setup: ({ initialOptions }) => {
29
29
  const esbuildOptions = initialOptions;
30
30
  esbuildOptions.define ||= {};
31
- Object.entries((0, import_chunk_XX2MVHOV.definitions)({
31
+ Object.entries((0, import_chunk_DFQX2BND.definitions)({
32
32
  ...options,
33
33
  mode: process.env.NODE_ENV
34
34
  })).reduce((define, [key, value]) => {
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":16265,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/plugin/definitions.ts":{"bytes":10894,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"}],"format":"esm"},"packages/sdk/config/src/plugin/esbuild-plugin.ts":{"bytes":2636,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"packages/sdk/config/src/plugin/rollup-plugin.ts":{"bytes":2112,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"packages/sdk/config/src/plugin/vite-plugin.ts":{"bytes":3379,"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/plugin/node/esbuild-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1346},"packages/sdk/config/dist/plugin/node/esbuild-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-XX2MVHOV.cjs","kind":"import-statement"}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/esbuild-plugin.ts","inputs":{"packages/sdk/config/src/plugin/esbuild-plugin.ts":{"bytesInOutput":443}},"bytes":621},"packages/sdk/config/dist/plugin/node/rollup-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1102},"packages/sdk/config/dist/plugin/node/rollup-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-XX2MVHOV.cjs","kind":"import-statement"}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/rollup-plugin.ts","inputs":{"packages/sdk/config/src/plugin/rollup-plugin.ts":{"bytesInOutput":288}},"bytes":464},"packages/sdk/config/dist/plugin/node/vite-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1707},"packages/sdk/config/dist/plugin/node/vite-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-XX2MVHOV.cjs","kind":"import-statement"},{"path":"node:path","kind":"import-statement","external":true}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/vite-plugin.ts","inputs":{"packages/sdk/config/src/plugin/vite-plugin.ts":{"bytesInOutput":634}},"bytes":806},"packages/sdk/config/dist/plugin/node/chunk-XX2MVHOV.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12715},"packages/sdk/config/dist/plugin/node/chunk-XX2MVHOV.cjs":{"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"lodash.set","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"exports":["definitions"],"inputs":{"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2719},"packages/sdk/config/src/config.ts":{"bytesInOutput":3705}},"bytes":6632}}}
1
+ {"inputs":{"packages/sdk/config/src/config.ts":{"bytes":15943,"imports":[{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/config/src/plugin/definitions.ts":{"bytes":10962,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/config.ts","kind":"import-statement","original":"../config"}],"format":"esm"},"packages/sdk/config/src/plugin/esbuild-plugin.ts":{"bytes":2636,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"packages/sdk/config/src/plugin/rollup-plugin.ts":{"bytes":2112,"imports":[{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"packages/sdk/config/src/plugin/vite-plugin.ts":{"bytes":3379,"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"packages/sdk/config/src/plugin/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"}},"outputs":{"packages/sdk/config/dist/plugin/node/esbuild-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1346},"packages/sdk/config/dist/plugin/node/esbuild-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-DFQX2BND.cjs","kind":"import-statement"}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/esbuild-plugin.ts","inputs":{"packages/sdk/config/src/plugin/esbuild-plugin.ts":{"bytesInOutput":443}},"bytes":621},"packages/sdk/config/dist/plugin/node/rollup-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1102},"packages/sdk/config/dist/plugin/node/rollup-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-DFQX2BND.cjs","kind":"import-statement"}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/rollup-plugin.ts","inputs":{"packages/sdk/config/src/plugin/rollup-plugin.ts":{"bytesInOutput":288}},"bytes":464},"packages/sdk/config/dist/plugin/node/vite-plugin.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1707},"packages/sdk/config/dist/plugin/node/vite-plugin.cjs":{"imports":[{"path":"packages/sdk/config/dist/plugin/node/chunk-DFQX2BND.cjs","kind":"import-statement"},{"path":"node:path","kind":"import-statement","external":true}],"exports":["ConfigPlugin"],"entryPoint":"packages/sdk/config/src/plugin/vite-plugin.ts","inputs":{"packages/sdk/config/src/plugin/vite-plugin.ts":{"bytesInOutput":634}},"bytes":806},"packages/sdk/config/dist/plugin/node/chunk-DFQX2BND.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12650},"packages/sdk/config/dist/plugin/node/chunk-DFQX2BND.cjs":{"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"boolean","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"lodash.ismatch","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["definitions"],"inputs":{"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2754},"packages/sdk/config/src/config.ts":{"bytesInOutput":3558}},"bytes":6520}}}
@@ -21,9 +21,9 @@ __export(rollup_plugin_exports, {
21
21
  ConfigPlugin: () => ConfigPlugin
22
22
  });
23
23
  module.exports = __toCommonJS(rollup_plugin_exports);
24
- var import_chunk_XX2MVHOV = require("./chunk-XX2MVHOV.cjs");
24
+ var import_chunk_DFQX2BND = require("./chunk-DFQX2BND.cjs");
25
25
  var ConfigPlugin = (options = {}) => {
26
- const contents = Object.entries((0, import_chunk_XX2MVHOV.definitions)({
26
+ const contents = Object.entries((0, import_chunk_DFQX2BND.definitions)({
27
27
  ...options,
28
28
  mode: process.env.NODE_ENV
29
29
  })).map(([key, value]) => `globalThis.${key} = ${JSON.stringify(value)};`).join("\n");
@@ -21,7 +21,7 @@ __export(vite_plugin_exports, {
21
21
  ConfigPlugin: () => ConfigPlugin
22
22
  });
23
23
  module.exports = __toCommonJS(vite_plugin_exports);
24
- var import_chunk_XX2MVHOV = require("./chunk-XX2MVHOV.cjs");
24
+ var import_chunk_DFQX2BND = require("./chunk-DFQX2BND.cjs");
25
25
  var import_node_path = require("node:path");
26
26
  var ConfigPlugin = (options = {}) => ({
27
27
  name: "dxos-config",
@@ -29,7 +29,7 @@ var ConfigPlugin = (options = {}) => ({
29
29
  const configPath = root && (0, import_node_path.resolve)(root, options.configPath ?? "dx.yml");
30
30
  const envPath = root && (0, import_node_path.resolve)(root, options.envPath ?? "dx-env.yml");
31
31
  const devPath = root && (0, import_node_path.resolve)(root, options.devPath ?? "dx-local.yml");
32
- const define = Object.entries((0, import_chunk_XX2MVHOV.definitions)({
32
+ const define = Object.entries((0, import_chunk_DFQX2BND.definitions)({
33
33
  ...options,
34
34
  configPath,
35
35
  envPath,
@@ -52,17 +52,11 @@ export declare class Config {
52
52
  * @param defaultValue Default value to return if option is not present in the config.
53
53
  * @returns The config value or undefined if the option is not present.
54
54
  */
55
- get<K extends ConfigKey>(key: K, defaultValue?: DeepIndex<ConfigProto, ParseKey<K>>): DeepIndex<ConfigProto, ParseKey<K>>;
55
+ get<K extends ConfigKey>(key: K, defaultValue?: DeepIndex<ConfigProto, ParseKey<K>>): DeepIndex<ConfigProto, ParseKey<K>> | undefined;
56
56
  /**
57
57
  * Get unique key.
58
58
  */
59
59
  find<T = any>(path: string, test: object): T | undefined;
60
- /**
61
- * Returns config key without type checking.
62
- *
63
- * @deprecated Use the type-checked version.
64
- */
65
- getUnchecked<T>(key: string, defaultValue?: T): T;
66
60
  /**
67
61
  * Returns the given config property or throw if it doesn't exist.
68
62
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAG/E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExE,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAGnE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,SAAU,WAAW,UAAU,OAAO,MAAM,EAAE,GAAG,CAAC,OAuC9E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,SAAU,WAAW,UAAU,GAAG,wBAiB5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,WAAY,WAAW,KAAG,WAepD,CAAC;AAEF,eAAO,MAAM,cAAc,eAAqC,CAAC;AAEjE;;;GAGG;AACH,qBACa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAE9B;;;OAGG;gBACS,MAAM,GAAE,WAAgB,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE;IAI/D;;OAEG;IACH,IAAI,MAAM,IAAI,WAAW,CAExB;IAED;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,SAAS,SAAS,EACrB,GAAG,EAAE,CAAC,EACN,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GACjD,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAItC;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IASxD;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAIjD;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CAOjG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAI/E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExE,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAGnE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,SAAU,WAAW,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OAuC9E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,SAAU,WAAW,UAAU,GAAG,wBAiB5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,WAAY,WAAW,KAAG,WAepD,CAAC;AAEF,eAAO,MAAM,cAAc,eAAqC,CAAC;AAEjE;;;GAGG;AACH,qBACa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAE9B;;;OAGG;gBACS,MAAM,GAAE,WAAgB,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE;IAI/D;;OAEG;IACH,IAAI,MAAM,IAAI,WAAW,CAExB;IAED;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,SAAS,SAAS,EACrB,GAAG,EAAE,CAAC,EACN,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GACjD,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;IAIlD;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IASxD;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CAOjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/loaders/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAqB/E;;GAEG;AACH,eAAO,MAAM,OAAO,mCAGnB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,KAAK,QAAO,QAAQ,WAAW,CAAS,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,QAAQ,QAAO,QAAQ,WAAW,CAAS,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,IAAI,yBAAmC,QAAQ,WAAW,CAGtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,yBAAmC,QAAQ,WAAW,CACf,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,OAAO,QAAa,QAAQ,QAAQ,WAAW,CAAC,CAAS,CAAC;AAEvE,eAAO,MAAM,MAAM,WAAY,MAAM,GAAG,SAAS,wBAAwB,MAAM,KAAG,QAAQ,WAAW,CAqBpG,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/loaders/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAqB/E;;GAEG;AACH,eAAO,MAAM,OAAO,wBAEkB,WACrC,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,KAAK,QAAO,OAAO,CAAC,WAAW,CAAS,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,QAAQ,QAAO,OAAO,CAAC,WAAW,CAAS,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,IAAI,yBAAmC,OAAO,CAAC,WAAW,CAGtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,yBAAmC,OAAO,CAAC,WAAW,CACf,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,OAAO,QAAa,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAS,CAAC;AAEvE,eAAO,MAAM,MAAM,WAAY,MAAM,GAAG,SAAS,wBAAwB,MAAM,KAAG,OAAO,CAAC,WAAW,CAqBpG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/config",
3
- "version": "0.6.7",
3
+ "version": "0.6.8-main.3be982f",
4
4
  "description": "Config utilities",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -30,21 +30,18 @@
30
30
  "js-yaml": "^4.1.0",
31
31
  "localforage": "^1.10.0",
32
32
  "lodash.defaultsdeep": "^4.6.1",
33
- "lodash.get": "^4.4.2",
34
33
  "lodash.ismatch": "^4.4.0",
35
- "lodash.set": "^4.3.2",
36
34
  "pkg-up": "^3.1.0",
37
- "@dxos/log": "0.6.7",
38
- "@dxos/node-std": "0.6.7",
39
- "@dxos/tracing": "0.6.7",
40
- "@dxos/protocols": "0.6.7"
35
+ "@dxos/log": "0.6.8-main.3be982f",
36
+ "@dxos/node-std": "0.6.8-main.3be982f",
37
+ "@dxos/protocols": "0.6.8-main.3be982f",
38
+ "@dxos/tracing": "0.6.8-main.3be982f",
39
+ "@dxos/util": "0.6.8-main.3be982f"
41
40
  },
42
41
  "devDependencies": {
43
42
  "@types/js-yaml": "^4.0.5",
44
43
  "@types/lodash.defaultsdeep": "^4.6.6",
45
- "@types/lodash.get": "^4.4.7",
46
44
  "@types/lodash.ismatch": "^4.4.9",
47
- "@types/lodash.set": "^4.3.7",
48
45
  "webpack": "^5.88.2"
49
46
  },
50
47
  "publishConfig": {
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugin/definitions.ts", "../../../src/config.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport set from 'lodash.set';\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pkgUp from 'pkg-up';\n\nimport { log } from '@dxos/log';\n\nimport { type ConfigPluginOpts } from './types';\nimport { mapFromKeyValues } from '../config';\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 ?? resolve(CWD, 'dx.yml'),\n __CONFIG_ENVS__: envPath ?? resolve(CWD, 'dx-env.yml'),\n } as { [key: string]: string };\n\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 let content = {};\n\n try {\n content = yaml.load(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 set(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 set(content, ['runtime', 'app', 'build', 'timestamp'], timestamp);\n set(content, ['runtime', 'app', 'build', 'commitHash'], commitHash);\n set(content, ['runtime', 'app', 'build', 'version'], packageJson?.version);\n } catch {}\n }\n } catch (err: any) {\n log(`Failed to load file ${value}:`, err);\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 __DXOS_CONFIG__: { dynamic: mode === 'production', publicUrl },\n __CONFIG_DEFAULTS__: {},\n __CONFIG_ENVS__: {},\n __CONFIG_LOCAL__: {},\n },\n );\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { boolean } from 'boolean';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport get from 'lodash.get';\nimport isMatch from 'lodash.ismatch';\nimport set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\nimport { trace } from '@dxos/tracing';\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 *\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\n if (value !== undefined) {\n if (type) {\n switch (type) {\n case 'boolean': {\n value = boolean(value);\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 set(config, path, 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 = get(values, path);\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('Version not specified');\n }\n\n if (config?.version !== 1) {\n throw new InvalidConfigError(`Invalid config version: ${config.version}`);\n }\n\n const error = configRootType.protoType.verify(config);\n if (error) {\n throw new InvalidConfigError(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>> {\n return get(this._config, key, defaultValue);\n }\n\n /**\n * Get unique key.\n */\n find<T = any>(path: string, test: object): T | undefined {\n const values = get(this._config, path);\n if (!Array.isArray(values)) {\n return;\n }\n\n return values.find((value) => isMatch(value, test));\n }\n\n /**\n * Returns config key without type checking.\n *\n * @deprecated Use the type-checked version.\n */\n getUnchecked<T>(key: string, defaultValue?: T): T {\n return get(this._config, key, defaultValue);\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 = get(this._config, key);\n if (!value) {\n throw new Error(`Config option not present: ${key}`);\n }\n return value;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_lodash", "configRootType", "schema", "getCodecForType", "mapFromKeyValues", "spec", "values", "config", "key", "path", "type", "Object", "entries", "value", "undefined", "boolean", "Number", "JSON", "parse", "Error", "set", "validateConfig", "InvalidConfigError", "version", "error", "protoType", "verify", "ConfigResource", "Symbol", "for", "Config", "constructor", "objects", "_config", "defaultsDeep", "get", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getUnchecked", "getOrThrow", "trace", "resource", "annotation", "CWD", "process", "cwd", "definitions", "configPath", "envPath", "devPath", "mode", "env", "NODE_ENV", "publicUrl", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "resolve", "__CONFIG_ENVS__", "__CONFIG_LOCAL__", "reduce", "prev", "content", "yaml", "load", "readFileSync", "forEach", "startsWith", "includes", "timestamp", "Date", "toISOString", "commitHash", "DX_COMMIT_HASH", "execSync", "encoding", "replace", "packagePath", "pkgUp", "sync", "packageJson", "err", "log", "__DXOS_CONFIG__", "dynamic"]
7
- }