balena-settings-client 5.0.3 → 5.0.4-build-drop-lodash-1eab7d7f4d034e4efb1b0ae553200b857ca25a43-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.versionbot/CHANGELOG.yml +47 -1
- package/CHANGELOG.md +10 -0
- package/build/defaults.js +2 -2
- package/build/defaults.js.map +1 -1
- package/build/environment.d.ts +3 -2
- package/build/environment.js +11 -6
- package/build/environment.js.map +1 -1
- package/build/settings.d.ts +1 -1
- package/build/settings.js +36 -5
- package/build/settings.js.map +1 -1
- package/build/utils.d.ts +3 -9
- package/build/utils.js +13 -7
- package/build/utils.js.map +1 -1
- package/build/yaml.js.map +1 -1
- package/lib/environment.ts +7 -6
- package/lib/settings.ts +34 -11
- package/lib/utils.ts +15 -7
- package/package.json +5 -6
- package/tests/e2e/test.ts +22 -3
- package/tests/utils.spec.ts +11 -2
- package/tsconfig.json +2 -1
|
@@ -1,3 +1,49 @@
|
|
|
1
|
+
- commits:
|
|
2
|
+
- subject: test fix
|
|
3
|
+
hash: 1eab7d7f4d034e4efb1b0ae553200b857ca25a43
|
|
4
|
+
body: ""
|
|
5
|
+
footer:
|
|
6
|
+
Change-type: patch
|
|
7
|
+
change-type: patch
|
|
8
|
+
author: Matthew Yarmolinsky
|
|
9
|
+
- subject: Replace `lodash` with `es-toolkit`
|
|
10
|
+
hash: 01a7fd44f4577e7a53579d6cb20dfa8a4f97c08a
|
|
11
|
+
body: ""
|
|
12
|
+
footer:
|
|
13
|
+
Change-type: patch
|
|
14
|
+
change-type: patch
|
|
15
|
+
author: Matthew Yarmolinsky
|
|
16
|
+
- subject: Add dependency `es-toolkit`
|
|
17
|
+
hash: f22280a959117d429786b079e338f6be84d8bb25
|
|
18
|
+
body: ""
|
|
19
|
+
footer:
|
|
20
|
+
Change-type: patch
|
|
21
|
+
change-type: patch
|
|
22
|
+
author: Matthew Yarmolinsky
|
|
23
|
+
- subject: Drop `lodash` as a dependency
|
|
24
|
+
hash: 03410f92fe297c2c0cc9d8f256d056147b45b0ac
|
|
25
|
+
body: ""
|
|
26
|
+
footer:
|
|
27
|
+
Change-type: patch
|
|
28
|
+
change-type: patch
|
|
29
|
+
author: Matthew Yarmolinsky
|
|
30
|
+
- subject: "tsconfig: Add `es2019` to `lib` and skip lib check"
|
|
31
|
+
hash: 28bbf523bbc58b60a782619eb26413121a9e0409
|
|
32
|
+
body: ""
|
|
33
|
+
footer:
|
|
34
|
+
Change-type: patch
|
|
35
|
+
change-type: patch
|
|
36
|
+
author: Matthew Yarmolinsky
|
|
37
|
+
- subject: Update `jsdoc-to-markdown`
|
|
38
|
+
hash: 441e6ee5e676ee59a132f4949f9583791269db41
|
|
39
|
+
body: ""
|
|
40
|
+
footer:
|
|
41
|
+
Change-type: patch
|
|
42
|
+
change-type: patch
|
|
43
|
+
author: Matthew Yarmolinsky
|
|
44
|
+
version: 5.0.4
|
|
45
|
+
title: ""
|
|
46
|
+
date: 2025-12-22T23:22:26.981Z
|
|
1
47
|
- commits:
|
|
2
48
|
- subject: Update TypeScript to 5.1.3
|
|
3
49
|
hash: 9127d3d46c063abbd8a55af1a53492de54fb1154
|
|
@@ -8,7 +54,7 @@
|
|
|
8
54
|
author: Thodoris Greasidis
|
|
9
55
|
version: 5.0.3
|
|
10
56
|
title: ""
|
|
11
|
-
date: 2023-06-
|
|
57
|
+
date: 2023-06-02T16:18:50.436Z
|
|
12
58
|
- commits:
|
|
13
59
|
- subject: Update Typescript to v5.0.2 to fix master
|
|
14
60
|
hash: f83a096015ccb7bdd6195c8cc0fbbe16ce62ae5f
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
+
# v5.0.4
|
|
8
|
+
## (2025-12-22)
|
|
9
|
+
|
|
10
|
+
* test fix [Matthew Yarmolinsky]
|
|
11
|
+
* Replace `lodash` with `es-toolkit` [Matthew Yarmolinsky]
|
|
12
|
+
* Add dependency `es-toolkit` [Matthew Yarmolinsky]
|
|
13
|
+
* Drop `lodash` as a dependency [Matthew Yarmolinsky]
|
|
14
|
+
* tsconfig: Add `es2019` to `lib` and skip lib check [Matthew Yarmolinsky]
|
|
15
|
+
* Update `jsdoc-to-markdown` [Matthew Yarmolinsky]
|
|
16
|
+
|
|
7
17
|
# v5.0.3
|
|
8
18
|
## (2023-06-02)
|
|
9
19
|
|
package/build/defaults.js
CHANGED
|
@@ -116,12 +116,12 @@ module.exports = {
|
|
|
116
116
|
* @property {Number} imageCacheTime - image cache time
|
|
117
117
|
* @memberof defaults
|
|
118
118
|
*/
|
|
119
|
-
imageCacheTime: 1 * 1000 * 60 * 60 * 24 * 7,
|
|
119
|
+
imageCacheTime: 1 * 1000 * 60 * 60 * 24 * 7, // 1 week in milliseconds
|
|
120
120
|
/**
|
|
121
121
|
* @property {Number} tokenRefreshInterval - token refresh interval
|
|
122
122
|
* @memberof defaults
|
|
123
123
|
*/
|
|
124
|
-
tokenRefreshInterval: 1 * 1000 * 60 * 60,
|
|
124
|
+
tokenRefreshInterval: 1 * 1000 * 60 * 60, // 1 hour in milliseconds
|
|
125
125
|
/**
|
|
126
126
|
* @property {String} apiKeyVariable - api key environment variable
|
|
127
127
|
* @memberof defaults
|
package/build/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../lib/defaults.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;AAEF,mCAAqC;AACrC,sCAAwC;AACxC,6BAAwC;AAOxC,iBAAS;IACR;;;OAGG;IACH,SAAS,EAAE,kBAAkB;IAE7B;;;OAGG;IACH,MAAM;QACL,OAAO,sBAAe,IAAI,CAAC,SAAS,CAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,MAAM;QACL,OAAO,cAAO,IAAI,CAAC,SAAS,CAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,WAAW;QACV,OAAO,mBAAY,IAAI,CAAC,SAAS,CAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,OAAO,oBAAa,IAAI,CAAC,SAAS,CAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,QAAQ;QACP,OAAO,wBAAiB,IAAI,CAAC,SAAS,CAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,OAAO,4BAAqB,IAAI,CAAC,SAAS,CAAE,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,QAAQ;QACP,IAAI,IAAI,CAAC,SAAS,KAAK,kBAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../lib/defaults.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;AAEF,mCAAqC;AACrC,sCAAwC;AACxC,6BAAwC;AAOxC,iBAAS;IACR;;;OAGG;IACH,SAAS,EAAE,kBAAkB;IAE7B;;;OAGG;IACH,MAAM;QACL,OAAO,sBAAe,IAAI,CAAC,SAAS,CAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,MAAM;QACL,OAAO,cAAO,IAAI,CAAC,SAAS,CAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,WAAW;QACV,OAAO,mBAAY,IAAI,CAAC,SAAS,CAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,OAAO,oBAAa,IAAI,CAAC,SAAS,CAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,QAAQ;QACP,OAAO,wBAAiB,IAAI,CAAC,SAAS,CAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,OAAO,4BAAqB,IAAI,CAAC,SAAS,CAAE,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,QAAQ;QACP,IAAI,IAAI,CAAC,SAAS,KAAK,kBAAkB,EAAE,CAAC;YAC3C,OAAO,oBAAoB,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,KAAK,oBAAoB,EAAE,CAAC;YACpD,OAAO,4BAA4B,CAAC;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO,gBAAgB,CAAC;QACzB,CAAC;QACD,OAAO,kBAAW,IAAI,CAAC,SAAS,CAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,SAAS;QACR,OAAO,iBAAU,IAAI,CAAC,SAAS,CAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,aAAa,EAAE,IAAA,WAAQ,EAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErD;;;OAGG;IACH,iBAAiB,EAAE,IAAA,WAAQ,EAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEvD;;;OAGG;IACH,cAAc;QACb,OAAO,IAAA,WAAQ,EAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,OAAO,IAAA,WAAQ,EAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,yBAAyB;IAEtE;;;OAGG;IACH,oBAAoB,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,yBAAyB;IAEnE;;;OAGG;IACH,cAAc,EAAE,gBAAgB;CAChC,CAAC"}
|
package/build/environment.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _ from 'lodash';
|
|
2
1
|
/**
|
|
3
2
|
* @summary Get setting name from environment variable
|
|
4
3
|
* @function
|
|
@@ -50,4 +49,6 @@ export declare const isSettingVariable: (variable: string) => boolean;
|
|
|
50
49
|
*/
|
|
51
50
|
export declare const parse: (environment: {
|
|
52
51
|
[k: string]: string | undefined;
|
|
53
|
-
}) =>
|
|
52
|
+
}) => {
|
|
53
|
+
[k: string]: string | undefined;
|
|
54
|
+
};
|
package/build/environment.js
CHANGED
|
@@ -16,7 +16,7 @@ limitations under the License.
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.parse = exports.isSettingVariable = exports.getSettingName = void 0;
|
|
19
|
-
var
|
|
19
|
+
var es_toolkit_1 = require("es-toolkit");
|
|
20
20
|
/**
|
|
21
21
|
* @summary Get setting name from environment variable
|
|
22
22
|
* @function
|
|
@@ -36,7 +36,7 @@ var getSettingName = function (variable) {
|
|
|
36
36
|
if (!variable) {
|
|
37
37
|
throw new Error('Missing variable name');
|
|
38
38
|
}
|
|
39
|
-
return
|
|
39
|
+
return (0, es_toolkit_1.camelCase)(variable
|
|
40
40
|
.replace(/^(BALENARC|RESINRC)_/i, '')
|
|
41
41
|
.replace(/(^|_)RESIN(_|$)/, '$1BALENA$2'));
|
|
42
42
|
};
|
|
@@ -79,10 +79,15 @@ exports.isSettingVariable = isSettingVariable;
|
|
|
79
79
|
* > }
|
|
80
80
|
*/
|
|
81
81
|
var parse = function (environment) {
|
|
82
|
-
return
|
|
83
|
-
.
|
|
84
|
-
|
|
85
|
-
.
|
|
82
|
+
return Object.fromEntries(Object.entries(environment)
|
|
83
|
+
.filter(function (_a) {
|
|
84
|
+
var k = _a[0], v = _a[1];
|
|
85
|
+
return (0, exports.isSettingVariable)(k) && !!v;
|
|
86
|
+
})
|
|
87
|
+
.map(function (_a) {
|
|
88
|
+
var k = _a[0], v = _a[1];
|
|
89
|
+
return [(0, exports.getSettingName)(k), v];
|
|
90
|
+
}));
|
|
86
91
|
};
|
|
87
92
|
exports.parse = parse;
|
|
88
93
|
//# sourceMappingURL=environment.js.map
|
package/build/environment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../lib/environment.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF,
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../lib/environment.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF,yCAAuC;AAEvC;;;;;;;;;;;;;GAaG;AACI,IAAM,cAAc,GAAG,UAAC,QAAiB;IAC/C,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAA,sBAAS,EACf,QAAQ;SACN,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;SACpC,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAC1C,CAAC;AACH,CAAC,CAAC;AAVW,QAAA,cAAc,kBAUzB;AAEF;;;;;;;;;;;;;;;GAeG;AACI,IAAM,iBAAiB,GAAG,UAAC,QAAgB;IACjD,OAAA,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;AAA3C,CAA2C,CAAC;AADhC,QAAA,iBAAiB,qBACe;AAE7C;;;;;;;;;;;;;;;;GAgBG;AACI,IAAM,KAAK,GAAG,UAAC,WAAgD;IACrE,OAAA,MAAM,CAAC,WAAW,CACjB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SACzB,MAAM,CAAC,UAAC,EAAM;YAAL,CAAC,QAAA,EAAE,CAAC,QAAA;QAAM,OAAA,IAAA,yBAAiB,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAA3B,CAA2B,CAAC;SAC/C,GAAG,CAAC,UAAC,EAAM;YAAL,CAAC,QAAA,EAAE,CAAC,QAAA;QAAM,OAAA,CAAC,IAAA,sBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAAtB,CAAsB,CAAC,CACzC;AAJD,CAIC,CAAC;AALU,QAAA,KAAK,SAKf"}
|
package/build/settings.d.ts
CHANGED
package/build/settings.js
CHANGED
|
@@ -61,7 +61,7 @@ exports.getAll = exports.get = void 0;
|
|
|
61
61
|
* @module settings
|
|
62
62
|
*/
|
|
63
63
|
var fs = require("fs");
|
|
64
|
-
var
|
|
64
|
+
var es_toolkit_1 = require("es-toolkit");
|
|
65
65
|
var config = require("./config");
|
|
66
66
|
var defaults = require("./defaults");
|
|
67
67
|
var environment = require("./environment");
|
|
@@ -89,10 +89,37 @@ var readConfigFile = function (file) {
|
|
|
89
89
|
}
|
|
90
90
|
};
|
|
91
91
|
var replaceResinKeys = function (parsedConfig) {
|
|
92
|
-
return
|
|
92
|
+
return Object.fromEntries(Object.entries(parsedConfig).map(function (_a) {
|
|
93
|
+
var key = _a[0], value = _a[1];
|
|
94
|
+
return [
|
|
95
|
+
key.replace('resin', 'balena'),
|
|
96
|
+
value,
|
|
97
|
+
];
|
|
98
|
+
}));
|
|
93
99
|
};
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
// Helper to safely transform if the file exists
|
|
101
|
+
var safeLoad = function (path, transform) {
|
|
102
|
+
var resolvedConfig = readConfigFile(path);
|
|
103
|
+
if (!resolvedConfig) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return transform ? transform(resolvedConfig) : resolvedConfig;
|
|
107
|
+
};
|
|
108
|
+
var getSettings = (0, es_toolkit_1.once)(function () {
|
|
109
|
+
var settingsSources = [
|
|
110
|
+
{},
|
|
111
|
+
defaults,
|
|
112
|
+
safeLoad(config.paths.userLegacy, replaceResinKeys),
|
|
113
|
+
safeLoad(config.paths.user),
|
|
114
|
+
safeLoad(config.paths.projectLegacy, replaceResinKeys),
|
|
115
|
+
safeLoad(config.paths.project),
|
|
116
|
+
environment.parse(process.env),
|
|
117
|
+
];
|
|
118
|
+
return settingsSources
|
|
119
|
+
.filter(function (source) { return source != null; })
|
|
120
|
+
.reduce(function (acc, source) {
|
|
121
|
+
return utils.mergeObjects(acc, source);
|
|
122
|
+
}, {});
|
|
96
123
|
});
|
|
97
124
|
/**
|
|
98
125
|
* @summary Get a setting
|
|
@@ -122,7 +149,11 @@ exports.get = get;
|
|
|
122
149
|
*/
|
|
123
150
|
var getAll = function () {
|
|
124
151
|
var settings = getSettings();
|
|
125
|
-
|
|
152
|
+
for (var _i = 0, _a = Object.keys(settings); _i < _a.length; _i++) {
|
|
153
|
+
var name = _a[_i];
|
|
154
|
+
settings[name] = (0, exports.get)(name);
|
|
155
|
+
}
|
|
156
|
+
return settings;
|
|
126
157
|
};
|
|
127
158
|
exports.getAll = getAll;
|
|
128
159
|
//# sourceMappingURL=settings.js.map
|
package/build/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../lib/settings.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,uBAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../lib/settings.ts"],"names":[],"mappings":"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"}
|
package/build/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { merge } from 'es-toolkit';
|
|
1
2
|
/**
|
|
2
3
|
* @summary Merge objects into one
|
|
3
4
|
* @function
|
|
@@ -12,18 +13,11 @@
|
|
|
12
13
|
* @example
|
|
13
14
|
* const first = { foo: 'bar' }
|
|
14
15
|
* const second = { foo: 'baz' }
|
|
15
|
-
* const third = { foo: 'qux' }
|
|
16
16
|
*
|
|
17
|
-
* console.log(utils.mergeObjects(first, second
|
|
17
|
+
* console.log(utils.mergeObjects(first, second))
|
|
18
18
|
* > { foo: 'qux' }
|
|
19
19
|
*/
|
|
20
|
-
export declare const mergeObjects:
|
|
21
|
-
<TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
|
|
22
|
-
<TObject_1, TSource1, TSource2>(object: TObject_1, source1: TSource1, source2: TSource2): TObject_1 & TSource1 & TSource2;
|
|
23
|
-
<TObject_2, TSource1_1, TSource2_1, TSource3>(object: TObject_2, source1: TSource1_1, source2: TSource2_1, source3: TSource3): TObject_2 & TSource1_1 & TSource2_1 & TSource3;
|
|
24
|
-
<TObject_3, TSource1_2, TSource2_2, TSource3_1, TSource4>(object: TObject_3, source1: TSource1_2, source2: TSource2_2, source3: TSource3_1, source4: TSource4): TObject_3 & TSource1_2 & TSource2_2 & TSource3_1 & TSource4;
|
|
25
|
-
(object: any, ...otherArgs: any[]): any;
|
|
26
|
-
};
|
|
20
|
+
export declare const mergeObjects: typeof merge;
|
|
27
21
|
/**
|
|
28
22
|
* @summary Evaluate a setting property
|
|
29
23
|
* @function
|
package/build/utils.js
CHANGED
|
@@ -16,7 +16,7 @@ limitations under the License.
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.evaluateSetting = exports.mergeObjects = void 0;
|
|
19
|
-
var
|
|
19
|
+
var es_toolkit_1 = require("es-toolkit");
|
|
20
20
|
/**
|
|
21
21
|
* @summary Merge objects into one
|
|
22
22
|
* @function
|
|
@@ -31,17 +31,23 @@ var _ = require("lodash");
|
|
|
31
31
|
* @example
|
|
32
32
|
* const first = { foo: 'bar' }
|
|
33
33
|
* const second = { foo: 'baz' }
|
|
34
|
-
* const third = { foo: 'qux' }
|
|
35
34
|
*
|
|
36
|
-
* console.log(utils.mergeObjects(first, second
|
|
35
|
+
* console.log(utils.mergeObjects(first, second))
|
|
37
36
|
* > { foo: 'qux' }
|
|
38
37
|
*/
|
|
39
|
-
// Notice that this function equals `
|
|
38
|
+
// Notice that this function equals `merge` and thus the latter
|
|
40
39
|
// could be used directly, making this function declaration unnecessary.
|
|
41
40
|
// However, we decided to create a new function for this in order to
|
|
42
41
|
// test specific behaviour that affects this module, like function
|
|
43
42
|
// merging.
|
|
44
|
-
exports.mergeObjects =
|
|
43
|
+
exports.mergeObjects = es_toolkit_1.merge;
|
|
44
|
+
var get = function (obj, path, defaultValue) {
|
|
45
|
+
// Regex to convert "users[0].name" -> "users.0.name"
|
|
46
|
+
var normalizedPath = path.replace(/\[(\d+)\]/g, '.$1');
|
|
47
|
+
var keys = normalizedPath.split('.');
|
|
48
|
+
var result = keys.reduce(function (acc, key) { return acc === null || acc === void 0 ? void 0 : acc[key]; }, obj);
|
|
49
|
+
return result !== null && result !== void 0 ? result : defaultValue;
|
|
50
|
+
};
|
|
45
51
|
/**
|
|
46
52
|
* @summary Evaluate a setting property
|
|
47
53
|
* @function
|
|
@@ -76,11 +82,11 @@ exports.mergeObjects = _.merge;
|
|
|
76
82
|
*/
|
|
77
83
|
var evaluateSetting = function (settings, property) {
|
|
78
84
|
if (settings === void 0) { settings = {}; }
|
|
79
|
-
var value =
|
|
85
|
+
var value = get(settings, property);
|
|
80
86
|
if (value == null) {
|
|
81
87
|
throw new Error("Setting not found: ".concat(property));
|
|
82
88
|
}
|
|
83
|
-
if (
|
|
89
|
+
if (typeof value === 'function') {
|
|
84
90
|
// This enables nifty things like dynamic
|
|
85
91
|
// settings that rely on other settings
|
|
86
92
|
value = value.call(settings);
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF,yCAAmC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AAEH,+DAA+D;AAC/D,wEAAwE;AACxE,oEAAoE;AACpE,kEAAkE;AAClE,WAAW;AACE,QAAA,YAAY,GAAG,kBAAK,CAAC;AAElC,IAAM,GAAG,GAAG,UAAC,GAAQ,EAAE,IAAY,EAAE,YAAkB;IACtD,qDAAqD;IACrD,IAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEzD,IAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG,IAAK,OAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,GAAG,CAAC,EAAV,CAAU,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,YAAY,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACI,IAAM,eAAe,GAAG,UAC9B,QAAwC,EACxC,QAAgB;IADhB,yBAAA,EAAA,aAAwC;IAGxC,IAAI,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6BAAsB,QAAQ,CAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QACjC,yCAAyC;QACzC,uCAAuC;QACvC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,KAAU,CAAC;AACnB,CAAC,CAAC;AAjBW,QAAA,eAAe,mBAiB1B"}
|
package/build/yaml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../lib/yaml.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF;;;;;;;;;;;;;;GAcG;AACI,IAAM,KAAK,GAAG,UAAC,IAAY;IACjC,IAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAA6B,CAAC;IAC9D,IAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../lib/yaml.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF;;;;;;;;;;;;;;GAcG;AACI,IAAM,KAAK,GAAG,UAAC,IAAY;IACjC,IAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAA6B,CAAC;IAC9D,IAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wBAAiB,IAAI,CAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAPW,QAAA,KAAK,SAOhB"}
|
package/lib/environment.ts
CHANGED
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
|
14
14
|
limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import
|
|
17
|
+
import { camelCase } from 'es-toolkit';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* @summary Get setting name from environment variable
|
|
@@ -35,7 +35,7 @@ export const getSettingName = (variable?: string) => {
|
|
|
35
35
|
if (!variable) {
|
|
36
36
|
throw new Error('Missing variable name');
|
|
37
37
|
}
|
|
38
|
-
return
|
|
38
|
+
return camelCase(
|
|
39
39
|
variable
|
|
40
40
|
.replace(/^(BALENARC|RESINRC)_/i, '')
|
|
41
41
|
.replace(/(^|_)RESIN(_|$)/, '$1BALENA$2'),
|
|
@@ -79,7 +79,8 @@ export const isSettingVariable = (variable: string) =>
|
|
|
79
79
|
* > }
|
|
80
80
|
*/
|
|
81
81
|
export const parse = (environment: { [k: string]: string | undefined }) =>
|
|
82
|
-
|
|
83
|
-
.
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
Object.fromEntries(
|
|
83
|
+
Object.entries(environment)
|
|
84
|
+
.filter(([k, v]) => isSettingVariable(k) && !!v)
|
|
85
|
+
.map(([k, v]) => [getSettingName(k), v]),
|
|
86
|
+
);
|
package/lib/settings.ts
CHANGED
|
@@ -60,7 +60,7 @@ limitations under the License.
|
|
|
60
60
|
*/
|
|
61
61
|
|
|
62
62
|
import * as fs from 'fs';
|
|
63
|
-
import
|
|
63
|
+
import { once } from 'es-toolkit';
|
|
64
64
|
|
|
65
65
|
import config = require('./config');
|
|
66
66
|
import defaults = require('./defaults');
|
|
@@ -91,19 +91,39 @@ const readConfigFile = (file: string): object => {
|
|
|
91
91
|
};
|
|
92
92
|
|
|
93
93
|
const replaceResinKeys = (parsedConfig: object) =>
|
|
94
|
-
|
|
94
|
+
Object.fromEntries(
|
|
95
|
+
Object.entries(parsedConfig).map(([key, value]) => [
|
|
96
|
+
key.replace('resin', 'balena'),
|
|
97
|
+
value,
|
|
98
|
+
]),
|
|
99
|
+
);
|
|
95
100
|
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
// Helper to safely transform if the file exists
|
|
102
|
+
const safeLoad = (path: string, transform?: (obj: any) => any) => {
|
|
103
|
+
const resolvedConfig = readConfigFile(path);
|
|
104
|
+
if (!resolvedConfig) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
return transform ? transform(resolvedConfig) : resolvedConfig;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const getSettings = once((): { [k: string]: string | undefined } => {
|
|
111
|
+
const settingsSources = [
|
|
98
112
|
{},
|
|
99
113
|
defaults,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
114
|
+
safeLoad(config.paths.userLegacy, replaceResinKeys),
|
|
115
|
+
safeLoad(config.paths.user),
|
|
116
|
+
safeLoad(config.paths.projectLegacy, replaceResinKeys),
|
|
117
|
+
safeLoad(config.paths.project),
|
|
104
118
|
environment.parse(process.env),
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
return settingsSources
|
|
122
|
+
.filter((source) => source != null)
|
|
123
|
+
.reduce((acc, source) => {
|
|
124
|
+
return utils.mergeObjects(acc, source);
|
|
125
|
+
}, {}) as Record<string, string | undefined>;
|
|
126
|
+
});
|
|
107
127
|
|
|
108
128
|
/**
|
|
109
129
|
* @summary Get a setting
|
|
@@ -133,5 +153,8 @@ export const get = <T>(name: string): T => {
|
|
|
133
153
|
*/
|
|
134
154
|
export const getAll = () => {
|
|
135
155
|
const settings = getSettings();
|
|
136
|
-
|
|
156
|
+
for (const name of Object.keys(settings)) {
|
|
157
|
+
settings[name] = get(name);
|
|
158
|
+
}
|
|
159
|
+
return settings;
|
|
137
160
|
};
|
package/lib/utils.ts
CHANGED
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
|
14
14
|
limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import
|
|
17
|
+
import { merge } from 'es-toolkit';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* @summary Merge objects into one
|
|
@@ -30,18 +30,26 @@ import * as _ from 'lodash';
|
|
|
30
30
|
* @example
|
|
31
31
|
* const first = { foo: 'bar' }
|
|
32
32
|
* const second = { foo: 'baz' }
|
|
33
|
-
* const third = { foo: 'qux' }
|
|
34
33
|
*
|
|
35
|
-
* console.log(utils.mergeObjects(first, second
|
|
34
|
+
* console.log(utils.mergeObjects(first, second))
|
|
36
35
|
* > { foo: 'qux' }
|
|
37
36
|
*/
|
|
38
37
|
|
|
39
|
-
// Notice that this function equals `
|
|
38
|
+
// Notice that this function equals `merge` and thus the latter
|
|
40
39
|
// could be used directly, making this function declaration unnecessary.
|
|
41
40
|
// However, we decided to create a new function for this in order to
|
|
42
41
|
// test specific behaviour that affects this module, like function
|
|
43
42
|
// merging.
|
|
44
|
-
export const mergeObjects =
|
|
43
|
+
export const mergeObjects = merge;
|
|
44
|
+
|
|
45
|
+
const get = (obj: any, path: string, defaultValue?: any) => {
|
|
46
|
+
// Regex to convert "users[0].name" -> "users.0.name"
|
|
47
|
+
const normalizedPath = path.replace(/\[(\d+)\]/g, '.$1');
|
|
48
|
+
|
|
49
|
+
const keys = normalizedPath.split('.');
|
|
50
|
+
const result = keys.reduce((acc, key) => acc?.[key], obj);
|
|
51
|
+
return result ?? defaultValue;
|
|
52
|
+
};
|
|
45
53
|
|
|
46
54
|
/**
|
|
47
55
|
* @summary Evaluate a setting property
|
|
@@ -79,13 +87,13 @@ export const evaluateSetting = <T>(
|
|
|
79
87
|
settings: object | undefined | null = {},
|
|
80
88
|
property: string,
|
|
81
89
|
): T => {
|
|
82
|
-
let value =
|
|
90
|
+
let value = get(settings, property);
|
|
83
91
|
|
|
84
92
|
if (value == null) {
|
|
85
93
|
throw new Error(`Setting not found: ${property}`);
|
|
86
94
|
}
|
|
87
95
|
|
|
88
|
-
if (
|
|
96
|
+
if (typeof value === 'function') {
|
|
89
97
|
// This enables nifty things like dynamic
|
|
90
98
|
// settings that rely on other settings
|
|
91
99
|
value = value.call(settings);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "balena-settings-client",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.4-build-drop-lodash-1eab7d7f4d034e4efb1b0ae553200b857ca25a43-1",
|
|
4
4
|
"description": "Balena client application shared settings",
|
|
5
5
|
"main": "build/settings.js",
|
|
6
6
|
"types": "build/settings.d.ts",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"chai-as-promised": "^7.1.1",
|
|
46
46
|
"common-tags": "^1.8.0",
|
|
47
47
|
"husky": "^4.2.5",
|
|
48
|
-
"jsdoc-to-markdown": "^
|
|
48
|
+
"jsdoc-to-markdown": "^9.1.3",
|
|
49
49
|
"lint-staged": "^10.1.6",
|
|
50
50
|
"mocha": "^6.2.3",
|
|
51
51
|
"require-npm4-to-publish": "^1.0.0",
|
|
@@ -58,11 +58,10 @@
|
|
|
58
58
|
"@resin.io/types-hidepath": "1.0.1",
|
|
59
59
|
"@resin.io/types-home-or-tmp": "3.0.0",
|
|
60
60
|
"@types/js-yaml": "3.11.1",
|
|
61
|
-
"
|
|
61
|
+
"es-toolkit": "^1.42.0",
|
|
62
62
|
"hidepath": "^1.0.0",
|
|
63
63
|
"home-or-tmp": "^2.0.0",
|
|
64
|
-
"js-yaml": "^3.4.0"
|
|
65
|
-
"lodash": "^4.17.15"
|
|
64
|
+
"js-yaml": "^3.4.0"
|
|
66
65
|
},
|
|
67
66
|
"husky": {
|
|
68
67
|
"hooks": {
|
|
@@ -76,6 +75,6 @@
|
|
|
76
75
|
]
|
|
77
76
|
},
|
|
78
77
|
"versionist": {
|
|
79
|
-
"publishedAt": "
|
|
78
|
+
"publishedAt": "2025-12-22T23:22:27.066Z"
|
|
80
79
|
}
|
|
81
80
|
}
|
package/tests/e2e/test.ts
CHANGED
|
@@ -2,7 +2,6 @@ import * as Promise from 'bluebird';
|
|
|
2
2
|
import * as childProcess from 'child_process';
|
|
3
3
|
import { stripIndent } from 'common-tags';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import * as _ from 'lodash';
|
|
6
5
|
import { expect, use } from 'chai';
|
|
7
6
|
import * as path from 'path';
|
|
8
7
|
import * as wary from 'wary';
|
|
@@ -18,8 +17,28 @@ const execAsync = Promise.promisify<[string, string], string, any>(
|
|
|
18
17
|
);
|
|
19
18
|
|
|
20
19
|
const handleExecResult = (stdout: string, stderr: string) => {
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
// Inside handleExecResult(error, stdout, stderr)
|
|
21
|
+
|
|
22
|
+
if (stderr) {
|
|
23
|
+
console.log('============= DEBUG CRASH REPORT =============');
|
|
24
|
+
|
|
25
|
+
// 1. Log stdout (sometimes errors end up here)
|
|
26
|
+
if (stdout) {
|
|
27
|
+
console.log('--- STDOUT ---');
|
|
28
|
+
console.log(stdout.toString()); // Ensure Buffer is converted
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 2. Log stderr
|
|
32
|
+
if (stderr) {
|
|
33
|
+
console.log('--- STDERR ---');
|
|
34
|
+
console.log(stderr.toString());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
console.log('==============================================');
|
|
38
|
+
|
|
39
|
+
// Throw a descriptive error
|
|
40
|
+
const message = (stderr || stdout || 'Unknown CLI Error').toString();
|
|
41
|
+
throw new Error(`CLI Failed: ${message}`);
|
|
23
42
|
}
|
|
24
43
|
return stdout.replace(/\n$/, '');
|
|
25
44
|
};
|
package/tests/utils.spec.ts
CHANGED
|
@@ -16,7 +16,12 @@ describe('Utils:', () => {
|
|
|
16
16
|
|
|
17
17
|
const third = { hello: 'world' };
|
|
18
18
|
|
|
19
|
-
const result =
|
|
19
|
+
const result = [first, second, third]
|
|
20
|
+
.filter((source) => source != null)
|
|
21
|
+
.reduce((acc, source) => {
|
|
22
|
+
return utils.mergeObjects(acc, source);
|
|
23
|
+
}, {});
|
|
24
|
+
|
|
20
25
|
expect(result).to.deep.equal({
|
|
21
26
|
hello: 'world',
|
|
22
27
|
foo: 'baz',
|
|
@@ -42,7 +47,11 @@ describe('Utils:', () => {
|
|
|
42
47
|
},
|
|
43
48
|
};
|
|
44
49
|
|
|
45
|
-
const result =
|
|
50
|
+
const result = [first, second, third]
|
|
51
|
+
.filter((source) => source != null)
|
|
52
|
+
.reduce((acc, source) => {
|
|
53
|
+
return utils.mergeObjects(acc, source);
|
|
54
|
+
}, {}) as Record<string, () => string>;
|
|
46
55
|
expect(result.foo()).to.equal('third');
|
|
47
56
|
});
|
|
48
57
|
});
|
package/tsconfig.json
CHANGED