@dxos/config 0.3.11-main.c01834e → 0.3.11-main.d7d4c52
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.
- package/dist/lib/browser/index.mjs +11 -1
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +24 -8
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/plugin/node/{chunk-FFIS4ASS.cjs → chunk-LSZOKWT5.cjs} +7 -6
- package/dist/plugin/node/chunk-LSZOKWT5.cjs.map +7 -0
- package/dist/plugin/node/esbuild-plugin.cjs +2 -2
- package/dist/plugin/node/meta.json +1 -1
- package/dist/plugin/node/rollup-plugin.cjs +2 -2
- package/dist/plugin/node/vite-plugin.cjs +2 -2
- package/dist/types/src/config.d.ts +4 -1
- package/dist/types/src/config.d.ts.map +1 -1
- package/dist/types/src/loaders/index.d.ts +4 -0
- package/dist/types/src/loaders/index.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/plugin/node/chunk-FFIS4ASS.cjs.map +0 -7
|
@@ -5,6 +5,7 @@ import * as defs from "@dxos/protocols/proto/dxos/config";
|
|
|
5
5
|
import { boolean } from "boolean";
|
|
6
6
|
import defaultsDeep from "lodash.defaultsdeep";
|
|
7
7
|
import get from "lodash.get";
|
|
8
|
+
import isMatch from "lodash.ismatch";
|
|
8
9
|
import set from "lodash.set";
|
|
9
10
|
import { InvalidConfigError, schema } from "@dxos/protocols";
|
|
10
11
|
var configRootType = schema.getCodecForType("dxos.config.Config");
|
|
@@ -73,7 +74,6 @@ var Config = class {
|
|
|
73
74
|
/**
|
|
74
75
|
* Creates an immutable instance.
|
|
75
76
|
* @constructor
|
|
76
|
-
* @param objects
|
|
77
77
|
*/
|
|
78
78
|
constructor(config = {}, ...objects) {
|
|
79
79
|
this._config = validateConfig(defaultsDeep(config, ...objects, {
|
|
@@ -97,6 +97,16 @@ var Config = class {
|
|
|
97
97
|
return get(this._config, key, defaultValue);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
|
+
* Get unique key.
|
|
101
|
+
*/
|
|
102
|
+
find(path, test) {
|
|
103
|
+
const values = get(this._config, path);
|
|
104
|
+
if (!Array.isArray(values)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
return values.find((value) => isMatch(value, test));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
100
110
|
* Returns config key without type checking.
|
|
101
111
|
*
|
|
102
112
|
* @deprecated Use the type-checked version.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/index.ts", "../../../src/config.ts", "../../../src/loaders/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 './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 set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\nexport class Config {\n private readonly _config: any;\n\n /**\n * Creates an immutable instance.\n * @constructor\n
|
|
5
|
-
"mappings": ";AAKA,YAAYA,UAAU;;;ACDtB,SAASC,eAAe;AACxB,OAAOC,kBAAkB;AACzB,OAAOC,SAAS;AAChB,OAAOC,SAAS;AAEhB,SAASC,oBAAoBC,cAAc;AAM3C,IAAMC,iBAAiBC,OAAOC,gBAAgB,oBAAA;AAgBvC,IAAMC,mBAAmB,CAACC,MAAmBC,WAAAA;AAClD,QAAMC,SAAS,CAAC;AAEhB,aAAW,CAACC,KAAK,EAAEC,MAAMC,KAAI,CAAE,KAAKC,OAAOC,QAAQP,IAAAA,GAAO;AACxD,QAAIQ,QAAQP,OAAOE,GAAAA;AAEnB,QAAIK,UAAUC,QAAW;AACvB,UAAIJ,MAAM;AACR,gBAAQA,MAAAA;UACN,KAAK,WAAW;AACdG,oBAAQE,QAAQF,KAAAA;AAChB;UACF;UAEA,KAAK,UAAU;AACbA,oBAAQG,OAAOH,KAAAA;AACf;UACF;UAEA,KAAK,UAAU;AACb;UACF;UAEA,KAAK,QAAQ;AACXA,oBAAQA,QAAQI,KAAKC,MAAML,KAAAA,IAAS;AACpC;UACF;UAEA,SAAS;AACP,kBAAM,IAAIM,MAAM,iBAAiBT,IAAAA,EAAM;UACzC;QACF;MACF;AAEAU,UAAIb,QAAQE,MAAMI,KAAAA;IACpB;EACF;AAEA,SAAON;AACT;AAOO,IAAMc,iBAAiB,CAAChB,MAAmBC,WAAAA;AAChD,QAAMC,SAA8B,CAAC;AAErC,aAAW,CAACC,KAAK,EAAEC,MAAMC,KAAI,CAAE,KAAKC,OAAOC,QAAQP,IAAAA,GAAO;AACxD,UAAMQ,QAAQS,IAAIhB,QAAQG,IAAAA;AAC1B,QAAII,UAAUC,QAAW;AACvB,cAAQJ,MAAAA;QACN,KAAK;AACHH,iBAAOC,GAAAA,IAAOS,KAAKM,UAAUV,KAAAA;AAC7B;QACF;AACEN,iBAAOC,GAAAA,IAAOK;MAClB;IACF;EACF;AAEA,SAAON;AACT;AAKO,IAAMiB,iBAAiB,CAACjB,WAAAA;AAC7B,MAAI,EAAE,aAAaA,SAAS;AAC1B,UAAM,IAAIkB,mBAAmB,uBAAA;EAC/B;AAEA,MAAIlB,QAAQmB,YAAY,GAAG;AACzB,UAAM,IAAID,mBAAmB,2BAA2BlB,OAAOmB,OAAO,EAAE;EAC1E;AAEA,QAAMC,QAAQ1B,eAAe2B,UAAUC,OAAOtB,MAAAA;AAC9C,MAAIoB,OAAO;AACT,UAAM,IAAIF,mBAAmBE,KAAAA;EAC/B;AAEA,SAAOpB;AACT;AAMO,IAAMuB,SAAN,MAAMA
|
|
6
|
-
"names": ["defs", "boolean", "defaultsDeep", "get", "set", "InvalidConfigError", "schema", "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", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "getUnchecked", "getOrThrow", "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 './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';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\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 { 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// 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", "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", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getUnchecked", "getOrThrow", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/config/src/config.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/sdk/config/src/config.ts":{"bytes":14897,"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}],"format":"esm"},"packages/sdk/config/src/loaders/browser.js":{"bytes":866,"imports":[{"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":2748,"imports":[],"format":"esm"},"packages/sdk/config/src/index.ts":{"bytes":1143,"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":"(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":11033},"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/log","kind":"import-statement","external":true}],"exports":["Config","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","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":3349},"packages/sdk/config/src/loaders/browser.js":{"bytesInOutput":610},"packages/sdk/config/src/types.ts":{"bytesInOutput":102}},"bytes":4486}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -36,6 +36,7 @@ __export(node_exports, {
|
|
|
36
36
|
FILE_DYNAMICS: () => FILE_DYNAMICS,
|
|
37
37
|
FILE_ENVS: () => FILE_ENVS,
|
|
38
38
|
Local: () => Local,
|
|
39
|
+
Profile: () => Profile,
|
|
39
40
|
definitions: () => definitions,
|
|
40
41
|
defs: () => defs,
|
|
41
42
|
mapFromKeyValues: () => mapFromKeyValues,
|
|
@@ -47,13 +48,14 @@ var defs = __toESM(require("@dxos/protocols/proto/dxos/config"));
|
|
|
47
48
|
var import_boolean = require("boolean");
|
|
48
49
|
var import_lodash = __toESM(require("lodash.defaultsdeep"));
|
|
49
50
|
var import_lodash2 = __toESM(require("lodash.get"));
|
|
50
|
-
var import_lodash3 = __toESM(require("lodash.
|
|
51
|
+
var import_lodash3 = __toESM(require("lodash.ismatch"));
|
|
52
|
+
var import_lodash4 = __toESM(require("lodash.set"));
|
|
51
53
|
var import_protocols = require("@dxos/protocols");
|
|
52
54
|
var import_js_yaml = __toESM(require("js-yaml"));
|
|
53
55
|
var import_node_fs = __toESM(require("node:fs"));
|
|
54
56
|
var import_node_path = __toESM(require("node:path"));
|
|
55
57
|
var import_js_yaml2 = __toESM(require("js-yaml"));
|
|
56
|
-
var
|
|
58
|
+
var import_lodash5 = __toESM(require("lodash.set"));
|
|
57
59
|
var import_node_child_process = require("node:child_process");
|
|
58
60
|
var import_node_fs2 = require("node:fs");
|
|
59
61
|
var import_node_path2 = require("node:path");
|
|
@@ -87,7 +89,7 @@ var mapFromKeyValues = (spec, values) => {
|
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
|
-
(0,
|
|
92
|
+
(0, import_lodash4.default)(config, path2, value);
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
return config;
|
|
@@ -125,7 +127,6 @@ var Config = class {
|
|
|
125
127
|
/**
|
|
126
128
|
* Creates an immutable instance.
|
|
127
129
|
* @constructor
|
|
128
|
-
* @param objects
|
|
129
130
|
*/
|
|
130
131
|
constructor(config = {}, ...objects) {
|
|
131
132
|
this._config = validateConfig((0, import_lodash.default)(config, ...objects, {
|
|
@@ -149,6 +150,16 @@ var Config = class {
|
|
|
149
150
|
return (0, import_lodash2.default)(this._config, key, defaultValue);
|
|
150
151
|
}
|
|
151
152
|
/**
|
|
153
|
+
* Get unique key.
|
|
154
|
+
*/
|
|
155
|
+
find(path2, test) {
|
|
156
|
+
const values = (0, import_lodash2.default)(this._config, path2);
|
|
157
|
+
if (!Array.isArray(values)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
return values.find((value) => (0, import_lodash3.default)(value, test));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
152
163
|
* Returns config key without type checking.
|
|
153
164
|
*
|
|
154
165
|
* @deprecated Use the type-checked version.
|
|
@@ -181,6 +192,10 @@ var maybeLoadFile = (file) => {
|
|
|
181
192
|
} catch (err) {
|
|
182
193
|
}
|
|
183
194
|
};
|
|
195
|
+
var Profile = (profile = "default") => {
|
|
196
|
+
const configFile = import_node_path.default.join(process.env.HOME ?? "~", `.config/dx/profile/${profile}.yml`);
|
|
197
|
+
return maybeLoadFile(configFile);
|
|
198
|
+
};
|
|
184
199
|
var Local = () => ({});
|
|
185
200
|
var Dynamics = () => ({});
|
|
186
201
|
var Envs = (basePath = DEFAULT_BASE_PATH) => {
|
|
@@ -208,7 +223,7 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
|
|
|
208
223
|
if (key === "__CONFIG_DEFAULTS__") {
|
|
209
224
|
Object.entries(process.env).forEach(([key2, value2]) => {
|
|
210
225
|
if (key2.startsWith("DX_") || env?.includes(key2)) {
|
|
211
|
-
(0,
|
|
226
|
+
(0, import_lodash5.default)(content, [
|
|
212
227
|
"runtime",
|
|
213
228
|
"app",
|
|
214
229
|
"env",
|
|
@@ -223,19 +238,19 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
|
|
|
223
238
|
}).replace("\n", "");
|
|
224
239
|
const packagePath = import_pkg_up.default.sync();
|
|
225
240
|
const packageJson = packagePath && JSON.parse((0, import_node_fs2.readFileSync)(packagePath, "utf-8"));
|
|
226
|
-
(0,
|
|
241
|
+
(0, import_lodash5.default)(content, [
|
|
227
242
|
"runtime",
|
|
228
243
|
"app",
|
|
229
244
|
"build",
|
|
230
245
|
"timestamp"
|
|
231
246
|
], timestamp);
|
|
232
|
-
(0,
|
|
247
|
+
(0, import_lodash5.default)(content, [
|
|
233
248
|
"runtime",
|
|
234
249
|
"app",
|
|
235
250
|
"build",
|
|
236
251
|
"commitHash"
|
|
237
252
|
], commitHash);
|
|
238
|
-
(0,
|
|
253
|
+
(0, import_lodash5.default)(content, [
|
|
239
254
|
"runtime",
|
|
240
255
|
"app",
|
|
241
256
|
"build",
|
|
@@ -279,6 +294,7 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
|
|
|
279
294
|
FILE_DYNAMICS,
|
|
280
295
|
FILE_ENVS,
|
|
281
296
|
Local,
|
|
297
|
+
Profile,
|
|
282
298
|
definitions,
|
|
283
299
|
defs,
|
|
284
300
|
mapFromKeyValues,
|
|
@@ -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/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 './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 set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\nexport class Config {\n private readonly _config: any;\n\n /**\n * Creates an immutable instance.\n * @constructor\n * @param objects\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 * 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 { 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 * Development config.\n */\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// 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 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": "
|
|
6
|
-
"names": ["import_lodash", "import_js_yaml", "import_node_fs", "import_node_path", "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", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "getUnchecked", "getOrThrow", "FILE_DEFAULTS", "FILE_ENVS", "FILE_DYNAMICS", "DEFAULT_BASE_PATH", "resolve", "process", "cwd", "maybeLoadFile", "file", "yaml", "load", "fs", "readFileSync", "encoding", "err", "Local", "Dynamics", "Envs", "basePath", "content", "
|
|
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 './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';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\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 { 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// 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 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", "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", "Config", "constructor", "objects", "_config", "defaultsDeep", "defaultValue", "find", "test", "Array", "isArray", "isMatch", "getUnchecked", "getOrThrow", "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", "CWD", "definitions", "configPath", "envPath", "devPath", "mode", "NODE_ENV", "publicUrl", "KEYS_TO_FILE", "__CONFIG_DEFAULTS__", "__CONFIG_ENVS__", "__CONFIG_LOCAL__", "reduce", "prev", "forEach", "startsWith", "includes", "timestamp", "Date", "toISOString", "commitHash", "DX_COMMIT_HASH", "execSync", "replace", "packagePath", "pkgUp", "sync", "packageJson", "log", "__DXOS_CONFIG__", "dynamic"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/config/src/config.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/sdk/config/src/config.ts":{"bytes":14897,"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}],"format":"esm"},"packages/sdk/config/src/types.ts":{"bytes":2748,"imports":[],"format":"esm"},"packages/sdk/config/src/loaders/index.ts":{"bytes":5534,"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":"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/plugin/definitions.ts":{"bytes":10742,"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":1498,"imports":[],"format":"esm"},"packages/sdk/config/src/plugin/index.ts":{"bytes":558,"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":1143,"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/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":17488},"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":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","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","Defaults","Dynamics","Envs","FILE_DEFAULTS","FILE_DYNAMICS","FILE_ENVS","Local","Profile","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":3367},"packages/sdk/config/src/loaders/index.ts":{"bytesInOutput":805},"packages/sdk/config/src/types.ts":{"bytesInOutput":102},"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2721},"packages/sdk/config/src/plugin/index.ts":{"bytesInOutput":0}},"bytes":7539}}}
|
|
@@ -26,11 +26,11 @@ 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
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_LSZOKWT5_exports = {};
|
|
30
|
+
__export(chunk_LSZOKWT5_exports, {
|
|
31
31
|
definitions: () => definitions
|
|
32
32
|
});
|
|
33
|
-
module.exports = __toCommonJS(
|
|
33
|
+
module.exports = __toCommonJS(chunk_LSZOKWT5_exports);
|
|
34
34
|
var import_js_yaml = __toESM(require("js-yaml"));
|
|
35
35
|
var import_lodash = __toESM(require("lodash.set"));
|
|
36
36
|
var import_node_child_process = require("node:child_process");
|
|
@@ -41,7 +41,8 @@ var import_log = require("@dxos/log");
|
|
|
41
41
|
var import_boolean = require("boolean");
|
|
42
42
|
var import_lodash2 = __toESM(require("lodash.defaultsdeep"));
|
|
43
43
|
var import_lodash3 = __toESM(require("lodash.get"));
|
|
44
|
-
var import_lodash4 = __toESM(require("lodash.
|
|
44
|
+
var import_lodash4 = __toESM(require("lodash.ismatch"));
|
|
45
|
+
var import_lodash5 = __toESM(require("lodash.set"));
|
|
45
46
|
var import_protocols = require("@dxos/protocols");
|
|
46
47
|
var configRootType = import_protocols.schema.getCodecForType("dxos.config.Config");
|
|
47
48
|
var mapFromKeyValues = (spec, values) => {
|
|
@@ -71,7 +72,7 @@ var mapFromKeyValues = (spec, values) => {
|
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
(0,
|
|
75
|
+
(0, import_lodash5.default)(config, path, value);
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
return config;
|
|
@@ -161,4 +162,4 @@ var definitions = ({ configPath, envPath, devPath, mode = process.env.NODE_ENV,
|
|
|
161
162
|
0 && (module.exports = {
|
|
162
163
|
definitions
|
|
163
164
|
});
|
|
164
|
-
//# sourceMappingURL=chunk-
|
|
165
|
+
//# sourceMappingURL=chunk-LSZOKWT5.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 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';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\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", "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", "version", "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
|
|
24
|
+
var import_chunk_LSZOKWT5 = require("./chunk-LSZOKWT5.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,
|
|
31
|
+
Object.entries((0, import_chunk_LSZOKWT5.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":
|
|
1
|
+
{"inputs":{"packages/sdk/config/src/config.ts":{"bytes":14897,"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}],"format":"esm"},"packages/sdk/config/src/plugin/definitions.ts":{"bytes":10742,"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":2584,"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":2068,"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":3319,"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-LSZOKWT5.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-LSZOKWT5.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-LSZOKWT5.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-LSZOKWT5.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":11064},"packages/sdk/config/dist/plugin/node/chunk-LSZOKWT5.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}],"exports":["definitions"],"inputs":{"packages/sdk/config/src/plugin/definitions.ts":{"bytesInOutput":2719},"packages/sdk/config/src/config.ts":{"bytesInOutput":1058}},"bytes":3985}}}
|
|
@@ -21,9 +21,9 @@ __export(rollup_plugin_exports, {
|
|
|
21
21
|
ConfigPlugin: () => ConfigPlugin
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(rollup_plugin_exports);
|
|
24
|
-
var
|
|
24
|
+
var import_chunk_LSZOKWT5 = require("./chunk-LSZOKWT5.cjs");
|
|
25
25
|
var ConfigPlugin = (options = {}) => {
|
|
26
|
-
const contents = Object.entries((0,
|
|
26
|
+
const contents = Object.entries((0, import_chunk_LSZOKWT5.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
|
|
24
|
+
var import_chunk_LSZOKWT5 = require("./chunk-LSZOKWT5.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,
|
|
32
|
+
const define = Object.entries((0, import_chunk_LSZOKWT5.definitions)({
|
|
33
33
|
...options,
|
|
34
34
|
configPath,
|
|
35
35
|
envPath,
|
|
@@ -38,7 +38,6 @@ export declare class Config {
|
|
|
38
38
|
/**
|
|
39
39
|
* Creates an immutable instance.
|
|
40
40
|
* @constructor
|
|
41
|
-
* @param objects
|
|
42
41
|
*/
|
|
43
42
|
constructor(config?: ConfigProto, ...objects: ConfigProto[]);
|
|
44
43
|
/**
|
|
@@ -53,6 +52,10 @@ export declare class Config {
|
|
|
53
52
|
* @returns The config value or undefined if the option is not present.
|
|
54
53
|
*/
|
|
55
54
|
get<K extends ConfigKey>(key: K, defaultValue?: DeepIndex<ConfigProto, ParseKey<K>>): DeepIndex<ConfigProto, ParseKey<K>>;
|
|
55
|
+
/**
|
|
56
|
+
* Get unique key.
|
|
57
|
+
*/
|
|
58
|
+
find<T = any>(path: string, test: object): T | undefined;
|
|
56
59
|
/**
|
|
57
60
|
* Returns config key without type checking.
|
|
58
61
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"
|
|
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;AAE/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;;;GAGG;AACH,qBAAa,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/loaders/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAqB/E;;GAEG;AACH,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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/loaders/index.ts"],"names":[],"mappings":"AAQA,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/config",
|
|
3
|
-
"version": "0.3.11-main.
|
|
3
|
+
"version": "0.3.11-main.d7d4c52",
|
|
4
4
|
"description": "Config utilities",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -29,16 +29,18 @@
|
|
|
29
29
|
"js-yaml": "^4.1.0",
|
|
30
30
|
"lodash.defaultsdeep": "^4.6.1",
|
|
31
31
|
"lodash.get": "^4.4.2",
|
|
32
|
+
"lodash.ismatch": "^4.4.0",
|
|
32
33
|
"lodash.set": "^4.3.2",
|
|
33
34
|
"pkg-up": "^3.1.0",
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/
|
|
35
|
+
"@dxos/node-std": "0.3.11-main.d7d4c52",
|
|
36
|
+
"@dxos/protocols": "0.3.11-main.d7d4c52",
|
|
37
|
+
"@dxos/log": "0.3.11-main.d7d4c52"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
39
40
|
"@types/js-yaml": "^4.0.5",
|
|
40
41
|
"@types/lodash.defaultsdeep": "^4.6.6",
|
|
41
42
|
"@types/lodash.get": "^4.4.7",
|
|
43
|
+
"@types/lodash.ismatch": "^4.4.9",
|
|
42
44
|
"@types/lodash.set": "^4.3.7",
|
|
43
45
|
"webpack": "^5.88.2"
|
|
44
46
|
},
|
|
@@ -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 set from 'lodash.set';\n\nimport { InvalidConfigError, schema } from '@dxos/protocols';\nimport { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config';\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\n/**\n * Global configuration object.\n * NOTE: Config objects are immutable.\n */\nexport class Config {\n private readonly _config: any;\n\n /**\n * Creates an immutable instance.\n * @constructor\n * @param objects\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 * 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", "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", "version", "err", "log", "__DXOS_CONFIG__", "dynamic"]
|
|
7
|
-
}
|