configuru 0.6.2 → 1.1.0
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/.eslintrc.js +9 -1
- package/.github/ISSUE_TEMPLATE/bug_report.yaml +47 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yaml +41 -0
- package/.github/pull_request_template.md +3 -23
- package/.github/workflows/lint.yml +3 -3
- package/.github/workflows/npm-publish.yml +2 -2
- package/.github/workflows/test.yml +1 -4
- package/README.md +7 -10
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/helpers.js.map +1 -1
- package/dist/lib/loader.js +2 -2
- package/dist/lib/loader.js.map +1 -1
- package/dist/lib/polishers.d.ts +4 -4
- package/dist/lib/polishers.js +2 -2
- package/dist/lib/polishers.js.map +1 -1
- package/dist/lib/storage.js +22 -4
- package/dist/lib/storage.js.map +1 -1
- package/dist/test/storage.test.js +17 -0
- package/dist/test/storage.test.js.map +1 -1
- package/logo.png +0 -0
- package/package.json +10 -14
- package/src/index.ts +1 -1
- package/src/lib/loader.ts +2 -2
- package/src/lib/polishers.ts +1 -1
- package/src/lib/storage.ts +25 -4
- package/src/test/storage.test.ts +33 -0
- package/wiki/advanced-usage.md +10 -10
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -37
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -18
package/.eslintrc.js
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: 🐛 Bug Report
|
|
2
|
+
description: File a bug report.
|
|
3
|
+
title: "🐛 "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
## 🐛 Bug
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: bug_description
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened?
|
|
14
|
+
description: Describe the bug what you encountered.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: textarea
|
|
18
|
+
id: reproduction
|
|
19
|
+
attributes:
|
|
20
|
+
label: Reproduction steps
|
|
21
|
+
description: Please provide the steps to reproduce the bug.
|
|
22
|
+
value: |
|
|
23
|
+
-
|
|
24
|
+
-
|
|
25
|
+
-
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: markdown
|
|
29
|
+
attributes:
|
|
30
|
+
value: |
|
|
31
|
+
## 💡 Solution
|
|
32
|
+
- type: textarea
|
|
33
|
+
id: solution_description
|
|
34
|
+
attributes:
|
|
35
|
+
label: What would you like to happen?
|
|
36
|
+
description: Describe the solution you'd like.
|
|
37
|
+
validations:
|
|
38
|
+
required: true
|
|
39
|
+
- type: markdown
|
|
40
|
+
attributes:
|
|
41
|
+
value: |
|
|
42
|
+
## 🔧 Environment
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: context
|
|
45
|
+
attributes:
|
|
46
|
+
label: Additional context
|
|
47
|
+
description: Please provide any relevant information about your environment.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: ✨ Feature Request
|
|
2
|
+
description: Request a new feature.
|
|
3
|
+
title: "✨ "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
## ⚠️ Problem
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: related_problem
|
|
12
|
+
attributes:
|
|
13
|
+
label: Is your feature request related to a problem?
|
|
14
|
+
description: Please describe the problem you are facing.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: markdown
|
|
18
|
+
attributes:
|
|
19
|
+
value: |
|
|
20
|
+
## 💡 Solution
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: solution_description
|
|
23
|
+
attributes:
|
|
24
|
+
label: What feature would you like to see?
|
|
25
|
+
description: Describe the solution.
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: alternative_solution
|
|
30
|
+
attributes:
|
|
31
|
+
label: What alternatives have you considered?
|
|
32
|
+
description: Describe any alternative features you've considered.
|
|
33
|
+
- type: markdown
|
|
34
|
+
attributes:
|
|
35
|
+
value: |
|
|
36
|
+
## 🔧 Environment
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: context
|
|
39
|
+
attributes:
|
|
40
|
+
label: Additional context
|
|
41
|
+
description: "Please provide any relevant information about your environment."
|
|
@@ -1,25 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
### PR addresses:
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
-
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> Leave one line, update issue reference
|
|
8
|
-
|
|
9
|
-
Fixes #?
|
|
10
|
-
Related #?
|
|
11
|
-
|
|
12
|
-
## Types of changes
|
|
13
|
-
|
|
14
|
-
> Tick all that applies or specify details
|
|
15
|
-
|
|
16
|
-
- [ ] 🐛 Bugfix
|
|
17
|
-
- [ ] ✨ New feature
|
|
18
|
-
- [ ] 💥 Breaking change
|
|
19
|
-
- [ ] 📝 Documentation
|
|
20
|
-
- [ ] ♻️ Refactor
|
|
21
|
-
- [ ] ✅ Tests
|
|
22
|
-
|
|
23
|
-
## Discussion
|
|
24
|
-
|
|
25
|
-
> Need help or want to discuss a proposal that is not related to inline code comment?
|
|
5
|
+
Fixes #
|
|
@@ -12,7 +12,7 @@ jobs:
|
|
|
12
12
|
lint:
|
|
13
13
|
strategy:
|
|
14
14
|
matrix:
|
|
15
|
-
node-version: [
|
|
15
|
+
node-version: [18, 20, 22]
|
|
16
16
|
runs-on: ubuntu-latest
|
|
17
17
|
steps:
|
|
18
18
|
- name: Check out code
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
run: npm i --ignore-scripts
|
|
28
28
|
|
|
29
29
|
- name: Run tests
|
|
30
|
-
run: npm run
|
|
30
|
+
run: npm run lint:check
|
|
31
31
|
|
|
32
32
|
- name: Run tests
|
|
33
|
-
run: npm run
|
|
33
|
+
run: npm run prettier:check
|
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
build:
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
version: [
|
|
14
|
+
version: [18, 20, 22]
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
17
|
- uses: actions/checkout@v3
|
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
- uses: actions/checkout@v3
|
|
29
29
|
- uses: actions/setup-node@v3
|
|
30
30
|
with:
|
|
31
|
-
node-version:
|
|
31
|
+
node-version: 18
|
|
32
32
|
registry-url: https://registry.npmjs.org/
|
|
33
33
|
- run: npm i --ignore-scripts
|
|
34
34
|
- run: npm run build
|
|
@@ -12,7 +12,7 @@ jobs:
|
|
|
12
12
|
tests:
|
|
13
13
|
strategy:
|
|
14
14
|
matrix:
|
|
15
|
-
node-version: [
|
|
15
|
+
node-version: [18, 20, 22]
|
|
16
16
|
runs-on: ubuntu-latest
|
|
17
17
|
steps:
|
|
18
18
|
- name: Check out code
|
|
@@ -28,6 +28,3 @@ jobs:
|
|
|
28
28
|
|
|
29
29
|
- name: Run tests with coverage
|
|
30
30
|
run: npm run test:coverage
|
|
31
|
-
|
|
32
|
-
- name: Run codecov
|
|
33
|
-
run: npm run test:codecov
|
package/README.md
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
4
|
|
|
5
|
-
<h1>Configuru
|
|
6
|
-
|
|
7
|
-
[](https://travis-ci.com/AckeeCZ/configuru)
|
|
8
|
-
[](https://www.npmjs.com/package/configuru)
|
|
9
|
-
[](https://codecov.io/gh/AckeeCZ/configuru)
|
|
10
|
-
[](https://snyk.io/test/github/AckeeCZ/configuru?targetFile=package.json)
|
|
11
|
-
[](https://david-dm.org/AckeeCZ/configuru)
|
|
12
|
-
[](https://david-dm.org/AckeeCZ/configuru?type=dev)
|
|
5
|
+
<h1>Configuru</h1>
|
|
13
6
|
|
|
14
7
|
Manage the configuration of your Nodejs application with multiple environments and custom preferences, utilizing Configuru in CI and development as well!
|
|
15
8
|
|
|
9
|
+
Improve the DX when managing the configuration files, get inline help and more with the [VS Code extension](https://github.com/AckeeCZ/configuru-extension).
|
|
10
|
+
|
|
16
11
|
</div>
|
|
17
12
|
|
|
18
13
|
## Features
|
|
@@ -20,7 +15,7 @@ Manage the configuration of your Nodejs application with multiple environments a
|
|
|
20
15
|
Configuru is a library for configuration management. Merge default project configuration with your user config, you can link yo your project. Atop of that, override your configuration with system environment variables.
|
|
21
16
|
|
|
22
17
|
- :relieved: Tailored for multi-developer comfort
|
|
23
|
-
- :sparkles: Cast and transforms inputs to correct type
|
|
18
|
+
- :sparkles: Cast and transforms inputs to the correct type
|
|
24
19
|
- :blue_heart: Typescript friendly
|
|
25
20
|
- :muscle: Designed for multi-environment apps
|
|
26
21
|
- :see_no_evil: Anonymized configuration for logger
|
|
@@ -45,6 +40,8 @@ npm install configuru
|
|
|
45
40
|
|
|
46
41
|
3. _(optional)_ As a developer (or environment), create a custom override file (e.g. `~/.env/my-project.jsonc`) and save the path in your `CFG_JSON_PATH`.
|
|
47
42
|
|
|
43
|
+
Tip: Use inline secrets like `CFG_JSON_PATH='{"mysecret":"Sssshhh..."}'` or load from GCP Secret Manager: `CFG_JSON_PATH=$(gcloud secrets versions access latest --project=myproject --secret=mysecret)`
|
|
44
|
+
|
|
48
45
|
4. Create a configuration module (e.g. `config.ts`)
|
|
49
46
|
|
|
50
47
|
```typescript
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { createLoader } from './lib/loader';
|
|
2
|
-
export { values,
|
|
2
|
+
export { values, maskedValues } from './lib/polishers';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.maskedValues = exports.values = exports.createLoader = void 0;
|
|
4
4
|
var loader_1 = require("./lib/loader");
|
|
5
5
|
Object.defineProperty(exports, "createLoader", { enumerable: true, get: function () { return loader_1.createLoader; } });
|
|
6
6
|
var polishers_1 = require("./lib/polishers");
|
|
7
7
|
Object.defineProperty(exports, "values", { enumerable: true, get: function () { return polishers_1.values; } });
|
|
8
|
-
Object.defineProperty(exports, "
|
|
8
|
+
Object.defineProperty(exports, "maskedValues", { enumerable: true, get: function () { return polishers_1.maskedValues; } });
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAAlC,sGAAA,YAAY,OAAA;AACrB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAAlC,sGAAA,YAAY,OAAA;AACrB,6CAAsD;AAA7C,mGAAA,MAAM,OAAA;AAAE,yGAAA,YAAY,OAAA"}
|
package/dist/lib/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/lib/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA0C;AAEnC,IAAM,SAAS,GAAG,UAAC,GAAQ,IAAK,OAAA,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAjC,CAAiC,CAAA;AAA3D,QAAA,SAAS,aAAkD;AAEjE,IAAM,SAAS,GAAG,UAAC,CAAM;IAC9B,OAAA,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAA/C,CAA+C,CAAA;AADpC,QAAA,SAAS,aAC2B;AAC1C,IAAM,QAAQ,GAAG,UAAI,CAAI,IAAK,OAAA,CAAC,EAAD,CAAC,CAAA;AAAzB,QAAA,QAAQ,YAAiB;AAE/B,IAAM,QAAQ,GAAG,UAAC,CAAM;IAC7B,OAAA,OAAO,CAAC,KAAK,QAAQ;QACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB;AADvD,CACuD,CAAA;AAF5C,QAAA,QAAQ,YAEoC;AAE5C,QAAA,KAAK,GAAG;IACnB,KAAK,EAAE,UAAC,IAAY;QAClB,IAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,IAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/lib/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA0C;AAEnC,IAAM,SAAS,GAAG,UAAC,GAAQ,IAAK,OAAA,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAjC,CAAiC,CAAA;AAA3D,QAAA,SAAS,aAAkD;AAEjE,IAAM,SAAS,GAAG,UAAC,CAAM;IAC9B,OAAA,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAA/C,CAA+C,CAAA;AADpC,QAAA,SAAS,aAC2B;AAC1C,IAAM,QAAQ,GAAG,UAAI,CAAI,IAAK,OAAA,CAAC,EAAD,CAAC,CAAA;AAAzB,QAAA,QAAQ,YAAiB;AAE/B,IAAM,QAAQ,GAAG,UAAC,CAAM;IAC7B,OAAA,OAAO,CAAC,KAAK,QAAQ;QACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB;AADvD,CACuD,CAAA;AAF5C,QAAA,QAAQ,YAEoC;AAE5C,QAAA,KAAK,GAAG;IACnB,KAAK,EAAE,UAAC,IAAY;QAClB,IAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,IAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,WAAW,CACnB,UAAG,UAAU,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,0BAChD,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAChB,CACH,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA"}
|
package/dist/lib/loader.js
CHANGED
|
@@ -22,15 +22,15 @@ var defaultOpts = {
|
|
|
22
22
|
var createAtomLoaderFactory = function (storage) {
|
|
23
23
|
var load = function (transform, hidden, nullable) {
|
|
24
24
|
return function (key) {
|
|
25
|
+
var value = storage[key];
|
|
25
26
|
var safeTransform = function (x) {
|
|
26
27
|
try {
|
|
27
28
|
return transform(x);
|
|
28
29
|
}
|
|
29
|
-
catch (
|
|
30
|
+
catch (_error) {
|
|
30
31
|
throw new Error("Failed to transform value >".concat(String(value), "< from key >").concat(key, "<"));
|
|
31
32
|
}
|
|
32
33
|
};
|
|
33
|
-
var value = storage[key];
|
|
34
34
|
var missing = value === undefined || value === null;
|
|
35
35
|
if (!nullable && missing) {
|
|
36
36
|
throw new Error("Missing required value ".concat(key));
|
package/dist/lib/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/lib/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,qCAAqC;AACrC,qCAA+C;AAQ/C,IAAM,WAAW,GAAwB;IACvC,iBAAiB,EAAE,MAAM;IACzB,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACzC,OAAO,EAAE,SAAS;CACnB,CAAA;AAcM,IAAM,uBAAuB,GAAG,UAAC,OAAyB;IAC/D,IAAM,IAAI,GACR,UACE,SAAwB,EACxB,MAAe,EACf,QAAiB;QAEnB,OAAA,UAAC,GAAW;YACV,IAAM,aAAa,GAAG,UAAC,CAAM;gBAC3B,IAAI;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/lib/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,qCAAqC;AACrC,qCAA+C;AAQ/C,IAAM,WAAW,GAAwB;IACvC,iBAAiB,EAAE,MAAM;IACzB,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACzC,OAAO,EAAE,SAAS;CACnB,CAAA;AAcM,IAAM,uBAAuB,GAAG,UAAC,OAAyB;IAC/D,IAAM,IAAI,GACR,UACE,SAAwB,EACxB,MAAe,EACf,QAAiB;QAEnB,OAAA,UAAC,GAAW;YACV,IAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1B,IAAM,aAAa,GAAG,UAAC,CAAM;gBAC3B,IAAI,CAAC;oBACH,OAAO,SAAS,CAAC,CAAC,CAAC,CAAA;gBACrB,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CACb,qCAA8B,MAAM,CAAC,KAAK,CAAC,yBAAe,GAAG,MAAG,CACjE,CAAA;gBACH,CAAC;YACH,CAAC,CAAA;YACD,IAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAA;YACrD,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,iCAA0B,GAAG,CAAE,CAAC,CAAA;YAClD,CAAC;YACD,OAAO;gBACL,MAAM,QAAA;gBACN,QAAQ,UAAA;gBACR,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,aAAa,CAAC,KAAK,CAAS;gBACrD,gBAAgB,EAAE,IAAI;aACvB,CAAA;QACH,CAAC;IAtBD,CAsBC,CAAA;IACH,OAAO,UAAI,SAAwB;QACjC,OAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAW,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;YACrD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAW,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;gBAC5D,QAAQ,EAAE,IAAI,CAAU,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;aAC/C,CAAC;YACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAU,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;gBAC7D,MAAM,EAAE,IAAI,CAAU,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;aAC7C,CAAC;SACH,CAAC;IAPF,CAOE,CAAA;AACN,CAAC,CAAA;AAvCY,QAAA,uBAAuB,2BAuCnC;AAEM,IAAM,YAAY,GAAG,UAAC,IAAuC;IAAvC,qBAAA,EAAA,kBAAuC;IAClE,IAAI,yBAAQ,WAAW,GAAK,IAAI,CAAE,CAAA;IAClC,IAAM,aAAa,GAAG,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAA;IAC/C,IAAM,UAAU,GAAG,IAAA,+BAAuB,EAAC,aAAa,CAAC,CAAA;IACzD,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;QAC1B,IAAI,EAAE,UAAU,CAAC,mBAAS,CAAC;QAC3B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,MAAM,EAAE,UAAI,EAAiB,IAAK,OAAA,UAAU,CAAC,EAAE,CAAC,EAAd,CAAc;KACjD,CAAA;AACH,CAAC,CAAA;AAXY,QAAA,YAAY,gBAWxB"}
|
package/dist/lib/polishers.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { LoadedValue } from './loader';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
type LoadedToValue<X> = X extends LoadedValue<any, any> ? X['value'] extends Record<any, any> ? Values<X['value']> : X['value'] : X;
|
|
3
|
+
type Values<C> = C extends (...args: any[]) => any ? C : C extends Record<any, any> ? {
|
|
4
4
|
[K in keyof C]: C[K] extends LoadedValue<any, any> ? LoadedToValue<C[K]> : Values<C[K]>;
|
|
5
5
|
} : C;
|
|
6
|
-
|
|
6
|
+
type AnonymousValues<C> = C extends (...args: any[]) => any ? C : C extends Record<any, any> ? {
|
|
7
7
|
[K in keyof C]: C[K] extends LoadedValue<any, any> ? string : AnonymousValues<C[K]>;
|
|
8
8
|
} : C;
|
|
9
9
|
export declare const values: <T extends Record<any, any>>(config: T) => Values<T>;
|
|
10
|
-
export declare const
|
|
10
|
+
export declare const maskedValues: <T extends Record<any, any>>(config: T) => AnonymousValues<T>;
|
|
11
11
|
export {};
|
package/dist/lib/polishers.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.maskedValues = exports.values = void 0;
|
|
4
4
|
var helpers_1 = require("./helpers");
|
|
5
5
|
var isLoadedValue = function (x) {
|
|
6
6
|
return Object.keys(x || {}).includes('__CONFIGURU_LEAF');
|
|
@@ -23,7 +23,7 @@ var mapConfig = function (fn) {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
exports.values = mapConfig(function (x) { return x.value; });
|
|
26
|
-
exports.
|
|
26
|
+
exports.maskedValues = mapConfig(function (x) {
|
|
27
27
|
return x.hidden ? (0, helpers_1.anonymize)(x.rawValue) : x.value;
|
|
28
28
|
});
|
|
29
29
|
//# sourceMappingURL=polishers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polishers.js","sourceRoot":"","sources":["../../src/lib/polishers.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AA6B/C,IAAM,aAAa,GAAG,UAAC,CAAM;IAC3B,OAAA,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAAjD,CAAiD,CAAA;AAEnD,IAAM,SAAS,GACb,UAAC,EAAqC;IACtC,OAAA,UAAC,GAAQ;QACP,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"polishers.js","sourceRoot":"","sources":["../../src/lib/polishers.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AA6B/C,IAAM,aAAa,GAAG,UAAC,CAAM;IAC3B,OAAA,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAAjD,CAAiD,CAAA;AAEnD,IAAM,SAAS,GACb,UAAC,EAAqC;IACtC,OAAA,UAAC,GAAQ;QACP,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,IAAA,kBAAQ,EAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAC,GAAQ,EAAE,GAAG;gBAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;gBAClC,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,EAAE,CAAC,CAAA;QACR,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;AAdD,CAcC,CAAA;AAEU,QAAA,MAAM,GAAG,SAAS,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAE9B,CAAA;AACD,QAAA,YAAY,GAAG,SAAS,CAAC,UAAA,CAAC;IACrC,OAAA,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,mBAAS,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;AAA1C,CAA0C,CACsB,CAAA"}
|
package/dist/lib/storage.js
CHANGED
|
@@ -28,7 +28,7 @@ var fileExistsSync = function (path) {
|
|
|
28
28
|
try {
|
|
29
29
|
return (0, fs_1.statSync)(path).isFile();
|
|
30
30
|
}
|
|
31
|
-
catch (
|
|
31
|
+
catch (_error) {
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
};
|
|
@@ -41,6 +41,14 @@ var fromPairs = function (pairs) {
|
|
|
41
41
|
};
|
|
42
42
|
var uniq = function (xs) { return Array.from(new Set(xs)); };
|
|
43
43
|
var keys = Object.keys;
|
|
44
|
+
var loadInline = function (secrets) {
|
|
45
|
+
try {
|
|
46
|
+
return helpers_1.JSONC.parse(secrets);
|
|
47
|
+
}
|
|
48
|
+
catch (_a) {
|
|
49
|
+
throw new Error('Invalid inline secrets');
|
|
50
|
+
}
|
|
51
|
+
};
|
|
44
52
|
var loadFile = function (filePath) {
|
|
45
53
|
if (!filePath)
|
|
46
54
|
return {};
|
|
@@ -59,13 +67,23 @@ var loadFile = function (filePath) {
|
|
|
59
67
|
try {
|
|
60
68
|
return helpers_1.JSONC.parse((0, fs_1.readFileSync)(resolvedPath, 'utf-8'));
|
|
61
69
|
}
|
|
62
|
-
catch (
|
|
70
|
+
catch (_error) {
|
|
63
71
|
throw new Error("Invalid config file in ".concat((0, path_1.join)((0, path_1.resolve)('.'), resolvedPath)));
|
|
64
72
|
}
|
|
65
73
|
};
|
|
74
|
+
var isInlineSecret = function (secretsOrFilename) {
|
|
75
|
+
var _a;
|
|
76
|
+
return (_a = secretsOrFilename === null || secretsOrFilename === void 0 ? void 0 : secretsOrFilename.trim().startsWith('{')) !== null && _a !== void 0 ? _a : false;
|
|
77
|
+
};
|
|
78
|
+
var loadSecrets = function (secretsOrFilename) {
|
|
79
|
+
if (isInlineSecret(secretsOrFilename)) {
|
|
80
|
+
return loadInline(secretsOrFilename);
|
|
81
|
+
}
|
|
82
|
+
return loadFile(secretsOrFilename);
|
|
83
|
+
};
|
|
66
84
|
var createConfigStorage = function (opts) {
|
|
67
|
-
var defaultConfig =
|
|
68
|
-
var userConfig =
|
|
85
|
+
var defaultConfig = loadSecrets(opts.defaultConfigPath);
|
|
86
|
+
var userConfig = loadSecrets(opts.userConfigPath);
|
|
69
87
|
var envConfig = {};
|
|
70
88
|
if (opts.envMode === 'default' || opts.envMode === 'merged') {
|
|
71
89
|
var configKeys = __spreadArray(__spreadArray([], keys(defaultConfig), true), (opts.envMode === 'merged' ? keys(userConfig) : []), true);
|
package/dist/lib/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,yBAA2C;AAC3C,6BAAmD;AACnD,qCAAiC;AAGjC,IAAM,cAAc,GAAG,UAAC,IAAY;IAClC,IAAI;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable sonarjs/no-duplicate-string */
|
|
3
4
|
var path_1 = require("path");
|
|
4
5
|
var storage_1 = require("../lib/storage");
|
|
5
6
|
describe('storage', function () {
|
|
@@ -58,5 +59,21 @@ describe('storage', function () {
|
|
|
58
59
|
envMode: 'default',
|
|
59
60
|
})).toMatchInlineSnapshot("\n Object {\n \"bar\": \"3\",\n \"baz\": 2,\n \"defaultConfig\": true,\n \"foo\": \"env\",\n \"quix\": false,\n \"userConfig\": true,\n }\n ");
|
|
60
61
|
});
|
|
62
|
+
test('Default configuration can be inline', function () {
|
|
63
|
+
expect((0, storage_1.createConfigStorage)({
|
|
64
|
+
defaultConfigPath: JSON.stringify({
|
|
65
|
+
inlinesecret: 'secret',
|
|
66
|
+
}),
|
|
67
|
+
})).toMatchInlineSnapshot("\n Object {\n \"inlinesecret\": \"secret\",\n }\n ");
|
|
68
|
+
});
|
|
69
|
+
test('User configuration can be inline', function () {
|
|
70
|
+
expect((0, storage_1.createConfigStorage)({
|
|
71
|
+
defaultConfigPath: (0, path_1.resolve)(__dirname, './sandbox/default.json'),
|
|
72
|
+
userConfigPath: JSON.stringify({
|
|
73
|
+
bar: 'inline',
|
|
74
|
+
inlinesecret: 'secret',
|
|
75
|
+
}),
|
|
76
|
+
})).toMatchInlineSnapshot("\n Object {\n \"bar\": \"inline\",\n \"baz\": 2,\n \"defaultConfig\": true,\n \"foo\": \"default\",\n \"inlinesecret\": \"secret\",\n }\n ");
|
|
77
|
+
});
|
|
61
78
|
});
|
|
62
79
|
//# sourceMappingURL=storage.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../src/test/storage.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../src/test/storage.test.ts"],"names":[],"mappings":"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"}
|
package/logo.png
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "configuru",
|
|
3
3
|
"description": "Manage the configuration of your Nodejs application with multiple environments and custom preferences, utilizing Configuru in CI and development as well!",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"author": "Jaroslav Šmolík <grissius@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
7
7
|
"Jaroslav Šmolík <grissius@gmail.com>"
|
|
8
8
|
],
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"engines": {
|
|
11
|
-
"node": ">=
|
|
11
|
+
"node": ">=18"
|
|
12
12
|
},
|
|
13
13
|
"repository": {
|
|
14
14
|
"type": "git",
|
|
@@ -36,30 +36,26 @@
|
|
|
36
36
|
"build": "tsc",
|
|
37
37
|
"test": "jest",
|
|
38
38
|
"test:coverage": "npm run test -- --collectCoverage",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"cs:prettier:fix": "npm run cs:prettier:check -- --write '**/*.{ts,js,json,md}'",
|
|
39
|
+
"lint:check": "eslint --ignore-path .gitignore '**/*.ts' -f codeframe",
|
|
40
|
+
"lint:fix": "npm run lint:check -- --fix",
|
|
41
|
+
"prettier:check": "prettier --ignore-path .gitignore --check '**/*.{ts,js,json,md}'",
|
|
42
|
+
"prettier:fix": "npm run prettier:check -- --write '**/*.{ts,js,json,md}'",
|
|
44
43
|
"prepare": "husky install",
|
|
45
|
-
"docs": "typedoc --options typedoc.json src/lib/*.ts"
|
|
46
|
-
"check": "npm-check -i app -i errors -i config -i index & exit 0"
|
|
44
|
+
"docs": "typedoc --options typedoc.json src/lib/*.ts"
|
|
47
45
|
},
|
|
48
46
|
"dependencies": {
|
|
49
47
|
"jsonc-parser": "^3.1.0"
|
|
50
48
|
},
|
|
51
49
|
"devDependencies": {
|
|
52
|
-
"@ackee/styleguide-backend-config": "^0.
|
|
50
|
+
"@ackee/styleguide-backend-config": "^0.5.0",
|
|
53
51
|
"@types/jest": "^28.1.4",
|
|
54
52
|
"@types/node": "^18.0.3",
|
|
55
|
-
"codecov": "^3.8.2",
|
|
56
53
|
"husky": "^8.0.1",
|
|
57
54
|
"jest": "^28.1.2",
|
|
58
55
|
"lint-staged": "^13.0.3",
|
|
59
|
-
"npm-check": "^5.9.2",
|
|
60
56
|
"prettier": "^2.7.1",
|
|
61
57
|
"ts-jest": "^28.0.5",
|
|
62
|
-
"typedoc": "^0.
|
|
63
|
-
"typescript": "^4.
|
|
58
|
+
"typedoc": "^0.25.4",
|
|
59
|
+
"typescript": "^5.4.5"
|
|
64
60
|
}
|
|
65
61
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { createLoader } from './lib/loader'
|
|
2
|
-
export { values,
|
|
2
|
+
export { values, maskedValues } from './lib/polishers'
|
package/src/lib/loader.ts
CHANGED
|
@@ -33,16 +33,16 @@ export const createAtomLoaderFactory = (storage: Record<any, any>) => {
|
|
|
33
33
|
nullable: boolean
|
|
34
34
|
) =>
|
|
35
35
|
(key: string): LoadedValue<T, N> => {
|
|
36
|
+
const value = storage[key]
|
|
36
37
|
const safeTransform = (x: any) => {
|
|
37
38
|
try {
|
|
38
39
|
return transform(x)
|
|
39
|
-
} catch (
|
|
40
|
+
} catch (_error) {
|
|
40
41
|
throw new Error(
|
|
41
42
|
`Failed to transform value >${String(value)}< from key >${key}<`
|
|
42
43
|
)
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
const value = storage[key]
|
|
46
46
|
const missing = value === undefined || value === null
|
|
47
47
|
if (!nullable && missing) {
|
|
48
48
|
throw new Error(`Missing required value ${key}`)
|
package/src/lib/polishers.ts
CHANGED
|
@@ -51,6 +51,6 @@ const mapConfig =
|
|
|
51
51
|
export const values = mapConfig(x => x.value) as <T extends Record<any, any>>(
|
|
52
52
|
config: T
|
|
53
53
|
) => Values<T>
|
|
54
|
-
export const
|
|
54
|
+
export const maskedValues = mapConfig(x =>
|
|
55
55
|
x.hidden ? anonymize(x.rawValue) : x.value
|
|
56
56
|
) as <T extends Record<any, any>>(config: T) => AnonymousValues<T>
|
package/src/lib/storage.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { ConfigLoaderOptions } from './loader'
|
|
|
6
6
|
const fileExistsSync = (path: string) => {
|
|
7
7
|
try {
|
|
8
8
|
return statSync(path).isFile()
|
|
9
|
-
} catch (
|
|
9
|
+
} catch (_error) {
|
|
10
10
|
return false
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -15,6 +15,14 @@ const fromPairs = (pairs: Array<[keyof any, any]>) =>
|
|
|
15
15
|
const uniq = <T>(xs: T[]) => Array.from(new Set(xs))
|
|
16
16
|
const { keys } = Object
|
|
17
17
|
|
|
18
|
+
const loadInline = (secrets: string) => {
|
|
19
|
+
try {
|
|
20
|
+
return JSONC.parse(secrets)
|
|
21
|
+
} catch {
|
|
22
|
+
throw new Error('Invalid inline secrets')
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
18
26
|
const loadFile = (filePath?: string) => {
|
|
19
27
|
if (!filePath) return {}
|
|
20
28
|
const { dir, name } = parse(filePath)
|
|
@@ -33,21 +41,34 @@ const loadFile = (filePath?: string) => {
|
|
|
33
41
|
}
|
|
34
42
|
try {
|
|
35
43
|
return JSONC.parse(readFileSync(resolvedPath, 'utf-8'))
|
|
36
|
-
} catch (
|
|
44
|
+
} catch (_error) {
|
|
37
45
|
throw new Error(
|
|
38
46
|
`Invalid config file in ${join(resolve('.'), resolvedPath)}`
|
|
39
47
|
)
|
|
40
48
|
}
|
|
41
49
|
}
|
|
42
50
|
|
|
51
|
+
const isInlineSecret = (
|
|
52
|
+
secretsOrFilename?: string
|
|
53
|
+
): secretsOrFilename is string => {
|
|
54
|
+
return secretsOrFilename?.trim().startsWith('{') ?? false
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const loadSecrets = (secretsOrFilename?: string) => {
|
|
58
|
+
if (isInlineSecret(secretsOrFilename)) {
|
|
59
|
+
return loadInline(secretsOrFilename)
|
|
60
|
+
}
|
|
61
|
+
return loadFile(secretsOrFilename)
|
|
62
|
+
}
|
|
63
|
+
|
|
43
64
|
export const createConfigStorage = (
|
|
44
65
|
opts: Pick<
|
|
45
66
|
ConfigLoaderOptions,
|
|
46
67
|
'defaultConfigPath' | 'userConfigPath' | 'envMode'
|
|
47
68
|
>
|
|
48
69
|
): Record<any, any> => {
|
|
49
|
-
const defaultConfig =
|
|
50
|
-
const userConfig =
|
|
70
|
+
const defaultConfig = loadSecrets(opts.defaultConfigPath)
|
|
71
|
+
const userConfig = loadSecrets(opts.userConfigPath)
|
|
51
72
|
let envConfig: any = {}
|
|
52
73
|
if (opts.envMode === 'default' || opts.envMode === 'merged') {
|
|
53
74
|
const configKeys = [
|
package/src/test/storage.test.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable sonarjs/no-duplicate-string */
|
|
1
2
|
import { resolve } from 'path'
|
|
2
3
|
import { createConfigStorage } from '../lib/storage'
|
|
3
4
|
|
|
@@ -97,4 +98,36 @@ describe('storage', () => {
|
|
|
97
98
|
}
|
|
98
99
|
`)
|
|
99
100
|
})
|
|
101
|
+
test('Default configuration can be inline', () => {
|
|
102
|
+
expect(
|
|
103
|
+
createConfigStorage({
|
|
104
|
+
defaultConfigPath: JSON.stringify({
|
|
105
|
+
inlinesecret: 'secret',
|
|
106
|
+
}),
|
|
107
|
+
})
|
|
108
|
+
).toMatchInlineSnapshot(`
|
|
109
|
+
Object {
|
|
110
|
+
"inlinesecret": "secret",
|
|
111
|
+
}
|
|
112
|
+
`)
|
|
113
|
+
})
|
|
114
|
+
test('User configuration can be inline', () => {
|
|
115
|
+
expect(
|
|
116
|
+
createConfigStorage({
|
|
117
|
+
defaultConfigPath: resolve(__dirname, './sandbox/default.json'),
|
|
118
|
+
userConfigPath: JSON.stringify({
|
|
119
|
+
bar: 'inline',
|
|
120
|
+
inlinesecret: 'secret',
|
|
121
|
+
}),
|
|
122
|
+
})
|
|
123
|
+
).toMatchInlineSnapshot(`
|
|
124
|
+
Object {
|
|
125
|
+
"bar": "inline",
|
|
126
|
+
"baz": 2,
|
|
127
|
+
"defaultConfig": true,
|
|
128
|
+
"foo": "default",
|
|
129
|
+
"inlinesecret": "secret",
|
|
130
|
+
}
|
|
131
|
+
`)
|
|
132
|
+
})
|
|
100
133
|
})
|
package/wiki/advanced-usage.md
CHANGED
|
@@ -18,7 +18,7 @@ const { configurable, static } = values(configSchema)
|
|
|
18
18
|
`config.ts`
|
|
19
19
|
|
|
20
20
|
```typescript
|
|
21
|
-
import { createLoader, values,
|
|
21
|
+
import { createLoader, values, maskedValues } from 'configuru'
|
|
22
22
|
const loader = createLoader()
|
|
23
23
|
|
|
24
24
|
// create `buildConfig` function, we will use two loaders
|
|
@@ -28,30 +28,30 @@ const configSchema = {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export default values(configSchema)
|
|
31
|
-
export const
|
|
31
|
+
export const maskedConfig = maskedValues(configSchema)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
`foo.ts`
|
|
35
35
|
|
|
36
36
|
```typescript
|
|
37
|
-
import config, {
|
|
37
|
+
import config, { maskedValues } from './config'
|
|
38
38
|
|
|
39
39
|
// use in your app, never log
|
|
40
40
|
config.apiKey // szvor4VYgS79z3QSBtmN0dJeyXbg1Xip
|
|
41
41
|
|
|
42
42
|
// don't use, is truncated (or hidden for shorter vars) but okay-ish to log
|
|
43
|
-
|
|
43
|
+
maskedConfig.apiKey // [redacted]
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
### Options
|
|
47
47
|
|
|
48
48
|
```typescript
|
|
49
|
-
import { createLoader } from 'configuru'
|
|
49
|
+
import { createLoader } from 'configuru'
|
|
50
50
|
const loader = createLoader({
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
})
|
|
51
|
+
defaultConfigPath: 'default-config', // defaults to ".env"
|
|
52
|
+
userConfigPath: process.env.USER_CONFIG, // defaults to process.env.CFG_JSON_PATH
|
|
53
|
+
envMode: 'all', // defaults to "default"
|
|
54
|
+
})
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
1. `defaultConfigPath`: Where to look for your default config JSON file (provide null to skip)
|
|
@@ -140,7 +140,7 @@ const schema = {
|
|
|
140
140
|
})('HOSTS'),
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
console.log(
|
|
143
|
+
console.log(maskedValues(schema))
|
|
144
144
|
// [
|
|
145
145
|
// {
|
|
146
146
|
// "host": "host1",
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Bug report
|
|
3
|
-
about: Create a report to help us improve
|
|
4
|
-
title: ''
|
|
5
|
-
labels: bug
|
|
6
|
-
assignees: ''
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**Describe the bug**
|
|
10
|
-
|
|
11
|
-
> A clear and concise description of what the bug is.
|
|
12
|
-
|
|
13
|
-
**To Reproduce**
|
|
14
|
-
|
|
15
|
-
> Add code snippets, or minimal working example with repo
|
|
16
|
-
|
|
17
|
-
**Expected behavior**
|
|
18
|
-
|
|
19
|
-
> A clear and concise description of what you expected to happen.
|
|
20
|
-
|
|
21
|
-
**Additional context**
|
|
22
|
-
|
|
23
|
-
Configuru version: `x.y.z`
|
|
24
|
-
Relevant environemnt variables / configuration files:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
CFG_JSON_PATH=~/.env/my-project.jsonc
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
```jsonc
|
|
31
|
-
{
|
|
32
|
-
// HTTP server
|
|
33
|
-
"SERVER_PORT": 3000 // port the server will be listening on
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
> ⚠️ BEWARE OF SHARING CONFIDENT INFORMATION, BE SURE TO SUGGEST JUST A STRUCTURE OR SAFE VALUES
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Feature request
|
|
3
|
-
about: Suggest an idea for this project
|
|
4
|
-
title: ''
|
|
5
|
-
labels: ''
|
|
6
|
-
assignees: ''
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**Is your feature request related to a problem? Please describe.**
|
|
10
|
-
|
|
11
|
-
> A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
-
|
|
13
|
-
**Describe the solution you'd like**
|
|
14
|
-
|
|
15
|
-
> A clear and concise description of what you want to happen.
|
|
16
|
-
|
|
17
|
-
**Additional context**
|
|
18
|
-
Add any other context, alternatives, related issues etc.
|