necessary 10.0.7 → 11.0.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/.rc +23 -0
- package/README.md +10 -13
- package/lib/constants.js +10 -2
- package/lib/utilities/configuration.js +106 -28
- package/package.json +1 -1
- package/src/constants.js +4 -0
- package/src/utilities/configuration.js +149 -33
package/.rc
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"environments": [
|
|
3
|
+
{
|
|
4
|
+
"name": "production",
|
|
5
|
+
"nameCheck": [
|
|
6
|
+
"ENVIRONMENT"
|
|
7
|
+
],
|
|
8
|
+
"liveReload": false,
|
|
9
|
+
"staticHost": "https://static.djalbat.com",
|
|
10
|
+
"enableStaticRouter": false
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "development",
|
|
14
|
+
"nameCheck": [
|
|
15
|
+
"ENVIRONMENT"
|
|
16
|
+
],
|
|
17
|
+
"port": 8080,
|
|
18
|
+
"liveReload": true,
|
|
19
|
+
"staticHost": "http://localhost:8080",
|
|
20
|
+
"enableStaticRouter": true
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
package/README.md
CHANGED
|
@@ -437,19 +437,17 @@ const stats = getStats("root/etc"); // returns stats for the 'root/etc' director
|
|
|
437
437
|
|
|
438
438
|
A single `rc()` function for runtime configuration.
|
|
439
439
|
|
|
440
|
-
* The `rc()` function parses a JSON runtime configuration file of a certain format and provides the information therein by assigning it to itself:
|
|
440
|
+
* The `rc()` function parses a JSON runtime configuration file of a certain format and provides the information therein by assigning it to itself. For example:
|
|
441
441
|
|
|
442
442
|
```
|
|
443
443
|
rc();
|
|
444
444
|
|
|
445
445
|
const { logOptions } = rc;
|
|
446
446
|
|
|
447
|
-
setLogOptions(logOptions);
|
|
448
|
-
// fileBaseName,
|
|
449
|
-
// directoryPath }
|
|
447
|
+
setLogOptions(logOptions);
|
|
450
448
|
```
|
|
451
449
|
|
|
452
|
-
|
|
450
|
+
The default name for the file is `.rc` and it must be present in the current working directory. It must have the following format:
|
|
453
451
|
|
|
454
452
|
```
|
|
455
453
|
{
|
|
@@ -466,17 +464,16 @@ By default it will parse a file called `.rc` in the current working directory. T
|
|
|
466
464
|
}
|
|
467
465
|
```
|
|
468
466
|
|
|
469
|
-
|
|
467
|
+
If an environment name is not passed as the `rc()` function's argument then it will try to find the environment name by the following means:
|
|
470
468
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
```
|
|
469
|
+
1. Checking the `process.argv` array for an `--environment` argument.
|
|
470
|
+
2. Checking the `proxess.env` object for an `ENVIRONMENT` environment variable.
|
|
474
471
|
|
|
475
|
-
|
|
472
|
+
If neither of these checks are successful then it will return the first element of the `enviromnents` array.
|
|
476
473
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
474
|
+
Note that it will not try to assign the `name` property of the chosen environment to itself, because functions already have a `name` property.
|
|
475
|
+
|
|
476
|
+
Before returning the JSON, it will search for uppercase strings. If such a string is the name of an environment variable, it will be replaced by the environment variable's value. This means that you can choose to keep sensitive information out of the runtime configuration and therefore, for instance, safely commit it to the repository.
|
|
480
477
|
|
|
481
478
|
You can change the base extension of the file that is parsed, that is the part of the extension between the leading dot and `rc`, by making use of the `setRCBaseExtension()` function:
|
|
482
479
|
|
package/lib/constants.js
CHANGED
|
@@ -2,18 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
exports.CONTENT_TYPE = exports.EMPTY_STRING = exports.ACCEPT = exports.CTRL_C = exports.ERROR = exports.UTF8 = void 0;
|
|
5
|
+
exports.CONTENT_TYPE = exports.EMPTY_STRING = exports.ENVIRONMENT = exports.BOOLEAN = exports.NUMBER = exports.ACCEPT = exports.STRING = exports.CTRL_C = exports.ERROR = exports.UTF8 = void 0;
|
|
6
6
|
var UTF8 = "utf8";
|
|
7
7
|
exports.UTF8 = UTF8;
|
|
8
8
|
var ERROR = "error";
|
|
9
9
|
exports.ERROR = ERROR;
|
|
10
10
|
var CTRL_C = "^C";
|
|
11
11
|
exports.CTRL_C = CTRL_C;
|
|
12
|
+
var STRING = "string";
|
|
13
|
+
exports.STRING = STRING;
|
|
12
14
|
var ACCEPT = "accept";
|
|
13
15
|
exports.ACCEPT = ACCEPT;
|
|
16
|
+
var NUMBER = "number";
|
|
17
|
+
exports.NUMBER = NUMBER;
|
|
18
|
+
var BOOLEAN = "boolean";
|
|
19
|
+
exports.BOOLEAN = BOOLEAN;
|
|
20
|
+
var ENVIRONMENT = "ENVIRONMENT";
|
|
21
|
+
exports.ENVIRONMENT = ENVIRONMENT;
|
|
14
22
|
var EMPTY_STRING = "";
|
|
15
23
|
exports.EMPTY_STRING = EMPTY_STRING;
|
|
16
24
|
var CONTENT_TYPE = "content-type";
|
|
17
25
|
exports.CONTENT_TYPE = CONTENT_TYPE;
|
|
18
26
|
|
|
19
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBVVEY4ID0gXCJ1dGY4XCI7XG5leHBvcnQgY29uc3QgRVJST1IgPSBcImVycm9yXCI7XG5leHBvcnQgY29uc3QgQ1RSTF9DID0gXCJeQ1wiO1xuZXhwb3J0IGNvbnN0IFNUUklORyA9IFwic3RyaW5nXCI7XG5leHBvcnQgY29uc3QgQUNDRVBUID0gXCJhY2NlcHRcIjtcbmV4cG9ydCBjb25zdCBOVU1CRVIgPSBcIm51bWJlclwiO1xuZXhwb3J0IGNvbnN0IEJPT0xFQU4gPSBcImJvb2xlYW5cIjtcbmV4cG9ydCBjb25zdCBFTlZJUk9OTUVOVCA9IFwiRU5WSVJPTk1FTlRcIjtcbmV4cG9ydCBjb25zdCBFTVBUWV9TVFJJTkcgPSBcIlwiO1xuZXhwb3J0IGNvbnN0IENPTlRFTlRfVFlQRSA9IFwiY29udGVudC10eXBlXCI7XG4iXSwibmFtZXMiOlsiVVRGOCIsIkVSUk9SIiwiQ1RSTF9DIiwiU1RSSU5HIiwiQUNDRVBUIiwiTlVNQkVSIiwiQk9PTEVBTiIsIkVOVklST05NRU5UIiwiRU1QVFlfU1RSSU5HIiwiQ09OVEVOVF9UWVBFIl0sIm1hcHBpbmdzIjoiQUFBQSxDQUFZOzs7OztBQUVMLEdBQUssQ0FBQ0EsSUFBSSxHQUFHLENBQU07UUFBYkEsSUFBSSxHQUFKQSxJQUFJO0FBQ1YsR0FBSyxDQUFDQyxLQUFLLEdBQUcsQ0FBTztRQUFmQSxLQUFLLEdBQUxBLEtBQUs7QUFDWCxHQUFLLENBQUNDLE1BQU0sR0FBRyxDQUFJO1FBQWJBLE1BQU0sR0FBTkEsTUFBTTtBQUNaLEdBQUssQ0FBQ0MsTUFBTSxHQUFHLENBQVE7UUFBakJBLE1BQU0sR0FBTkEsTUFBTTtBQUNaLEdBQUssQ0FBQ0MsTUFBTSxHQUFHLENBQVE7UUFBakJBLE1BQU0sR0FBTkEsTUFBTTtBQUNaLEdBQUssQ0FBQ0MsTUFBTSxHQUFHLENBQVE7UUFBakJBLE1BQU0sR0FBTkEsTUFBTTtBQUNaLEdBQUssQ0FBQ0MsT0FBTyxHQUFHLENBQVM7UUFBbkJBLE9BQU8sR0FBUEEsT0FBTztBQUNiLEdBQUssQ0FBQ0MsV0FBVyxHQUFHLENBQWE7UUFBM0JBLFdBQVcsR0FBWEEsV0FBVztBQUNqQixHQUFLLENBQUNDLFlBQVksR0FBRyxDQUFFO1FBQWpCQSxZQUFZLEdBQVpBLFlBQVk7QUFDbEIsR0FBSyxDQUFDQyxZQUFZLEdBQUcsQ0FBYztRQUE3QkEsWUFBWSxHQUFaQSxZQUFZIn0=
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
exports.default = void 0;
|
|
6
6
|
var _array = require("../utilities/array");
|
|
7
7
|
var _defaults = require("../defaults");
|
|
8
|
+
var _constants = require("../constants");
|
|
8
9
|
var _fileSystem = require("../utilities/fileSystem");
|
|
9
10
|
function _instanceof(left, right) {
|
|
10
11
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
@@ -13,6 +14,9 @@ function _instanceof(left, right) {
|
|
|
13
14
|
return left instanceof right;
|
|
14
15
|
}
|
|
15
16
|
}
|
|
17
|
+
var _typeof = function(obj) {
|
|
18
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
19
|
+
};
|
|
16
20
|
if (!globalThis.rc) {
|
|
17
21
|
globalThis.rc = _rc;
|
|
18
22
|
}
|
|
@@ -22,28 +26,13 @@ var _default = {
|
|
|
22
26
|
};
|
|
23
27
|
exports.default = _default;
|
|
24
28
|
var baseExtension = _defaults.DEFAULT_RC_BASE_EXTENSION;
|
|
25
|
-
function _rc() {
|
|
26
|
-
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
environmentName = environmentNameOrArgv; ///
|
|
33
|
-
}
|
|
34
|
-
var json = readRCFile(), environments = json.environments;
|
|
35
|
-
if (environmentName === null) {
|
|
36
|
-
var firstEnvironment = (0, _array).first(environments);
|
|
37
|
-
environment1 = firstEnvironment; ///
|
|
38
|
-
} else {
|
|
39
|
-
environment1 = environments.find(function(environment) {
|
|
40
|
-
var name = environment.name, found = name === environmentName;
|
|
41
|
-
return found;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
delete environment1.name;
|
|
45
|
-
Object.assign(rc, environment1);
|
|
46
|
-
return environment1;
|
|
29
|
+
function _rc(environmentName) {
|
|
30
|
+
environmentName = environmentName || environmentNameFromArgv() || environmentNameFromEnv(); ///
|
|
31
|
+
var json = readRCFile();
|
|
32
|
+
var environment = findEnvironment(json, environmentName);
|
|
33
|
+
json = environment; ///
|
|
34
|
+
replaceEnvironmentVariables(json);
|
|
35
|
+
Object.assign(rc, environment);
|
|
47
36
|
}
|
|
48
37
|
function readRCFile() {
|
|
49
38
|
var rcFilePath = rcFilePathFromNothing(), rcFileContent = (0, _fileSystem).readFile(rcFilePath), json = JSON.parse(rcFileContent);
|
|
@@ -90,9 +79,34 @@ Object.assign(_rc, {
|
|
|
90
79
|
createVacuousRCFile: createVacuousRCFile,
|
|
91
80
|
setRCBaseExtension: setRCBaseExtension
|
|
92
81
|
});
|
|
93
|
-
function
|
|
82
|
+
function findEnvironment(json, environmentName) {
|
|
83
|
+
var environment1;
|
|
84
|
+
var environments = json.environments;
|
|
85
|
+
if (environmentName === null) {
|
|
86
|
+
var firstEnvironment = (0, _array).first(environments);
|
|
87
|
+
environment1 = firstEnvironment; ///
|
|
88
|
+
} else {
|
|
89
|
+
environment1 = environments.find(function(environment) {
|
|
90
|
+
var name = environment.name;
|
|
91
|
+
if (name === environmentName) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
delete environment1.name;
|
|
97
|
+
return environment1;
|
|
98
|
+
}
|
|
99
|
+
function rcFilePathFromNothing() {
|
|
100
|
+
var rcFilePath = "./.".concat(baseExtension, "rc");
|
|
101
|
+
return rcFilePath;
|
|
102
|
+
}
|
|
103
|
+
function environmentNameFromEnv() {
|
|
104
|
+
var environmentName = process.env[_constants.ENVIRONMENT] || null;
|
|
105
|
+
return environmentName;
|
|
106
|
+
}
|
|
107
|
+
function environmentNameFromArgv() {
|
|
94
108
|
var environmentName = null;
|
|
95
|
-
argv.find(function(argument) {
|
|
109
|
+
process.argv.find(function(argument) {
|
|
96
110
|
var matches = argument.match(/--environment=(.+)/), found = matches !== null;
|
|
97
111
|
if (found) {
|
|
98
112
|
var secondMatch = (0, _array).second(matches);
|
|
@@ -102,9 +116,73 @@ function environmentNameFromArgv(argv) {
|
|
|
102
116
|
});
|
|
103
117
|
return environmentName;
|
|
104
118
|
}
|
|
105
|
-
function
|
|
106
|
-
var
|
|
107
|
-
|
|
119
|
+
function replaceEnvironmentVariable(string) {
|
|
120
|
+
var value = null;
|
|
121
|
+
var stringUpperCase = isStringUpperCase(string);
|
|
122
|
+
if (stringUpperCase) {
|
|
123
|
+
var name = string; ///
|
|
124
|
+
value = process.env[name] || null;
|
|
125
|
+
}
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
function replaceEnvironmentVariables(environment) {
|
|
129
|
+
var json = environment;
|
|
130
|
+
var jsonArray = isJSONArray(json), jsonObject = isJSONObject(json);
|
|
131
|
+
if (false) {
|
|
132
|
+
///
|
|
133
|
+
} else if (jsonArray) {
|
|
134
|
+
var array = json, length = array.length;
|
|
135
|
+
for(var index = 0; index < length; index++){
|
|
136
|
+
var json1 = array[index], jsonString = isJSONString(json1);
|
|
137
|
+
if (jsonString) {
|
|
138
|
+
var string = json1, value = replaceEnvironmentVariable(string);
|
|
139
|
+
if (value !== null) {
|
|
140
|
+
array[index] = value;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
} else if (jsonObject) {
|
|
145
|
+
var object = json; ///
|
|
146
|
+
for(var name in object){
|
|
147
|
+
var json2 = object[name], jsonString1 = isJSONString(json2);
|
|
148
|
+
if (jsonString1) {
|
|
149
|
+
var string1 = json2, value1 = replaceEnvironmentVariable(string1); ///
|
|
150
|
+
if (value1 !== null) {
|
|
151
|
+
object[name] = value1;
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
replaceEnvironmentVariables(json2);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function isJSONArray(json) {
|
|
160
|
+
var jsonArray = _instanceof(json, Array);
|
|
161
|
+
return jsonArray;
|
|
162
|
+
}
|
|
163
|
+
function isJSONObject(json) {
|
|
164
|
+
var jsonArray = isJSONArray(json), jsonPrimitive = isJSONPrimitive(json), jsonObject = !jsonArray && !jsonPrimitive;
|
|
165
|
+
return jsonObject;
|
|
166
|
+
}
|
|
167
|
+
function isJSONString(json) {
|
|
168
|
+
var jsonString = (typeof json === "undefined" ? "undefined" : _typeof(json)) === _constants.STRING;
|
|
169
|
+
return jsonString;
|
|
170
|
+
}
|
|
171
|
+
function isJSONNumber(json) {
|
|
172
|
+
var jsonNumber = (typeof json === "undefined" ? "undefined" : _typeof(json)) === _constants.NUMBER;
|
|
173
|
+
return jsonNumber;
|
|
174
|
+
}
|
|
175
|
+
function isJSONBoolean(json) {
|
|
176
|
+
var jsonBoolean = (typeof json === "undefined" ? "undefined" : _typeof(json)) === _constants.BOOLEAN;
|
|
177
|
+
return jsonBoolean;
|
|
178
|
+
}
|
|
179
|
+
function isJSONPrimitive(json) {
|
|
180
|
+
var jsonString = isJSONString(json), jsonNumber = isJSONNumber(json), jsonBoolean = isJSONBoolean(json), jsonPrimitive = jsonString || jsonNumber || jsonBoolean;
|
|
181
|
+
return jsonPrimitive;
|
|
182
|
+
}
|
|
183
|
+
function isStringUpperCase(string) {
|
|
184
|
+
var upperCaseString = string.toUpperCase(), stringUpperCase = string === upperCaseString;
|
|
185
|
+
return stringUpperCase;
|
|
108
186
|
}
|
|
109
187
|
|
|
110
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29uZmlndXJhdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgZmlyc3QsIHNlY29uZCB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXJyYXlcIjtcbmltcG9ydCB7IERFRkFVTFRfUkNfQkFTRV9FWFRFTlNJT04gfSBmcm9tIFwiLi4vZGVmYXVsdHNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUsIGNoZWNrRmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvZmlsZVN5c3RlbVwiO1xuXG5pZiAoIWdsb2JhbFRoaXMucmMpIHtcbiAgZ2xvYmFsVGhpcy5yYyA9IF9yYztcbn1cblxuY29uc3QgeyByYyB9ID0gZ2xvYmFsVGhpcztcblxuZXhwb3J0IGRlZmF1bHQge1xuICByY1xufTtcblxubGV0IGJhc2VFeHRlbnNpb24gPSBERUZBVUxUX1JDX0JBU0VfRVhURU5TSU9OO1xuXG5mdW5jdGlvbiBfcmMoZW52aXJvbm1lbnROYW1lT3JBcmd2ID0gbnVsbCkge1xuICBsZXQgZW52aXJvbm1lbnQsXG4gICAgICBlbnZpcm9ubWVudE5hbWUsXG4gICAgICBlbnZpcm9ubWVudE5hbWVPckFyZ3ZBcmd2ID0gKGVudmlyb25tZW50TmFtZU9yQXJndiBpbnN0YW5jZW9mIEFycmF5KTtcblxuICBpZiAoZW52aXJvbm1lbnROYW1lT3JBcmd2QXJndikge1xuICAgIGNvbnN0IGFyZ3YgPSBlbnZpcm9ubWVudE5hbWVPckFyZ3Y7IC8vL1xuXG4gICAgZW52aXJvbm1lbnROYW1lID0gZW52aXJvbm1lbnROYW1lRnJvbUFyZ3YoYXJndik7XG4gIH0gZWxzZSB7XG4gICAgZW52aXJvbm1lbnROYW1lID0gZW52aXJvbm1lbnROYW1lT3JBcmd2OyAgLy8vXG4gIH1cblxuICBjb25zdCBqc29uID0gcmVhZFJDRmlsZSgpLFxuICAgICAgICB7IGVudmlyb25tZW50cyB9ID0ganNvbjtcblxuICBpZiAoZW52aXJvbm1lbnROYW1lID09PSBudWxsKSB7XG4gICAgY29uc3QgZmlyc3RFbnZpcm9ubWVudCA9IGZpcnN0KGVudmlyb25tZW50cyk7XG5cbiAgICBlbnZpcm9ubWVudCA9IGZpcnN0RW52aXJvbm1lbnQ7IC8vL1xuICB9IGVsc2Uge1xuICAgIGVudmlyb25tZW50ID0gZW52aXJvbm1lbnRzLmZpbmQoKGVudmlyb25tZW50KSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGVudmlyb25tZW50LFxuICAgICAgICAgICAgZm91bmQgPSAobmFtZSA9PT0gZW52aXJvbm1lbnROYW1lKTtcblxuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlIGVudmlyb25tZW50Lm5hbWU7XG5cbiAgT2JqZWN0LmFzc2lnbihyYywgZW52aXJvbm1lbnQpO1xuXG4gIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuZnVuY3Rpb24gcmVhZFJDRmlsZSgpIHtcbiAgY29uc3QgcmNGaWxlUGF0aCA9IHJjRmlsZVBhdGhGcm9tTm90aGluZygpLFxuICAgICAgICByY0ZpbGVDb250ZW50ID0gcmVhZEZpbGUocmNGaWxlUGF0aCksXG4gICAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJjRmlsZUNvbnRlbnQpO1xuXG4gIHJldHVybiBqc29uOyAgICAgIFxufVxuXG5mdW5jdGlvbiB3cml0ZVJDRmlsZShqc29uKSB7XG4gIGNvbnN0IHJjRmlsZVBhdGggPSByY0ZpbGVQYXRoRnJvbU5vdGhpbmcoKSxcbiAgICAgICAgcmRGaWxlQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIFwiICBcIik7XG5cbiAgd3JpdGVGaWxlKHJjRmlsZVBhdGgsIHJkRmlsZUNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSQ0ZpbGUoYWRkZWRQcm9wZXJ0aWVzLCAuLi5kZWxldGVkUHJvcGVydHlOYW1lcykge1xuICBsZXQganNvbiA9IHJlYWRSQ0ZpbGUoKTtcblxuICBpZiAoYWRkZWRQcm9wZXJ0aWVzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihqc29uLCBhZGRlZFByb3BlcnRpZXMpO1xuICB9XG5cbiAgZGVsZXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoZGVsZXRlZFByb3BlcnR5TmFtZSkgPT4ge1xuICAgIGRlbGV0ZSBqc29uW2RlbGV0ZWRQcm9wZXJ0eU5hbWVdO1xuICB9KTtcblxuICB3cml0ZVJDRmlsZShqc29uKTsgICAgICBcbn1cblxuZnVuY3Rpb24gY2hlY2tSQ0ZpbGVFeGlzdHMoKSB7XG4gIGNvbnN0IHJjRmlsZVBhdGggPSByY0ZpbGVQYXRoRnJvbU5vdGhpbmcoKSxcbiAgICAgICAgcmNGaWxlRXhpc3RzID0gY2hlY2tGaWxlRXhpc3RzKHJjRmlsZVBhdGgpO1xuXG4gIHJldHVybiByY0ZpbGVFeGlzdHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZhY3VvdXNSQ0ZpbGUoKSB7XG4gIGNvbnN0IGpzb24gPSB7XG4gICAgXCJlbnZpcm9ubWVudHNcIjogW1xuICAgICAge31cbiAgICBdXG4gIH07XG5cbiAgd3JpdGVSQ0ZpbGUoanNvbik7XG59XG5cbmZ1bmN0aW9uIHNldFJDQmFzZUV4dGVuc2lvbihyY0Jhc2VFeHRlbnNpb24pIHsgYmFzZUV4dGVuc2lvbiA9IHJjQmFzZUV4dGVuc2lvbjsgfVxuXG5PYmplY3QuYXNzaWduKF9yYywge1xuICByZWFkUkNGaWxlLFxuICB3cml0ZVJDRmlsZSxcbiAgdXBkYXRlUkNGaWxlLFxuICBjaGVja1JDRmlsZUV4aXN0cyxcbiAgY3JlYXRlVmFjdW91c1JDRmlsZSxcbiAgc2V0UkNCYXNlRXh0ZW5zaW9uXG59KTtcblxuZnVuY3Rpb24gZW52aXJvbm1lbnROYW1lRnJvbUFyZ3YoYXJndikge1xuICBsZXQgZW52aXJvbm1lbnROYW1lID0gbnVsbDtcblxuICBhcmd2LmZpbmQoKGFyZ3VtZW50KSA9PiB7ICAvLy9cbiAgICBjb25zdCBtYXRjaGVzID0gYXJndW1lbnQubWF0Y2goLy0tZW52aXJvbm1lbnQ9KC4rKS8pLFxuICAgICAgICAgIGZvdW5kID0gKG1hdGNoZXMgIT09IG51bGwpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBjb25zdCBzZWNvbmRNYXRjaCA9IHNlY29uZChtYXRjaGVzKTtcblxuICAgICAgZW52aXJvbm1lbnROYW1lID0gc2Vjb25kTWF0Y2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9KTtcblxuICByZXR1cm4gZW52aXJvbm1lbnROYW1lO1xufVxuXG5mdW5jdGlvbiByY0ZpbGVQYXRoRnJvbU5vdGhpbmcoKSB7XG4gIGNvbnN0IHJjRmlsZVBhdGggPSBgLi8uJHtiYXNlRXh0ZW5zaW9ufXJjYDtcblxuICByZXR1cm4gcmNGaWxlUGF0aDtcbn1cbiJdLCJuYW1lcyI6WyJnbG9iYWxUaGlzIiwicmMiLCJfcmMiLCJiYXNlRXh0ZW5zaW9uIiwiZW52aXJvbm1lbnROYW1lT3JBcmd2IiwiZW52aXJvbm1lbnQiLCJlbnZpcm9ubWVudE5hbWUiLCJlbnZpcm9ubWVudE5hbWVPckFyZ3ZBcmd2IiwiQXJyYXkiLCJhcmd2IiwiZW52aXJvbm1lbnROYW1lRnJvbUFyZ3YiLCJqc29uIiwicmVhZFJDRmlsZSIsImVudmlyb25tZW50cyIsImZpcnN0RW52aXJvbm1lbnQiLCJmaW5kIiwibmFtZSIsImZvdW5kIiwiT2JqZWN0IiwiYXNzaWduIiwicmNGaWxlUGF0aCIsInJjRmlsZVBhdGhGcm9tTm90aGluZyIsInJjRmlsZUNvbnRlbnQiLCJKU09OIiwicGFyc2UiLCJ3cml0ZVJDRmlsZSIsInJkRmlsZUNvbnRlbnQiLCJzdHJpbmdpZnkiLCJ1cGRhdGVSQ0ZpbGUiLCJhZGRlZFByb3BlcnRpZXMiLCJkZWxldGVkUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJkZWxldGVkUHJvcGVydHlOYW1lIiwiY2hlY2tSQ0ZpbGVFeGlzdHMiLCJyY0ZpbGVFeGlzdHMiLCJjcmVhdGVWYWN1b3VzUkNGaWxlIiwic2V0UkNCYXNlRXh0ZW5zaW9uIiwicmNCYXNlRXh0ZW5zaW9uIiwiYXJndW1lbnQi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
|
|
188
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29uZmlndXJhdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgZmlyc3QsIHNlY29uZCB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXJyYXlcIjtcbmltcG9ydCB7IERFRkFVTFRfUkNfQkFTRV9FWFRFTlNJT04gfSBmcm9tIFwiLi4vZGVmYXVsdHNcIjtcbmltcG9ydCB7IFNUUklORywgTlVNQkVSLCBCT09MRUFOLCBFTlZJUk9OTUVOVCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUsIGNoZWNrRmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvZmlsZVN5c3RlbVwiO1xuXG5pZiAoIWdsb2JhbFRoaXMucmMpIHtcbiAgZ2xvYmFsVGhpcy5yYyA9IF9yYztcbn1cblxuY29uc3QgeyByYyB9ID0gZ2xvYmFsVGhpcztcblxuZXhwb3J0IGRlZmF1bHQge1xuICByY1xufTtcblxubGV0IGJhc2VFeHRlbnNpb24gPSBERUZBVUxUX1JDX0JBU0VfRVhURU5TSU9OO1xuXG5mdW5jdGlvbiBfcmMoZW52aXJvbm1lbnROYW1lKSB7XG4gIGVudmlyb25tZW50TmFtZSA9IGVudmlyb25tZW50TmFtZSB8fCBlbnZpcm9ubWVudE5hbWVGcm9tQXJndigpIHx8IGVudmlyb25tZW50TmFtZUZyb21FbnYoKTsgLy8vXG5cbiAgbGV0IGpzb24gPSByZWFkUkNGaWxlKCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnQgPSBmaW5kRW52aXJvbm1lbnQoanNvbiwgZW52aXJvbm1lbnROYW1lKTtcblxuICBqc29uID0gZW52aXJvbm1lbnQ7IC8vL1xuXG4gIHJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlcyhqc29uKTtcblxuICBPYmplY3QuYXNzaWduKHJjLCBlbnZpcm9ubWVudCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRSQ0ZpbGUoKSB7XG4gIGNvbnN0IHJjRmlsZVBhdGggPSByY0ZpbGVQYXRoRnJvbU5vdGhpbmcoKSxcbiAgICAgICAgcmNGaWxlQ29udGVudCA9IHJlYWRGaWxlKHJjRmlsZVBhdGgpLFxuICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyY0ZpbGVDb250ZW50KTtcblxuICByZXR1cm4ganNvbjsgICAgICBcbn1cblxuZnVuY3Rpb24gd3JpdGVSQ0ZpbGUoanNvbikge1xuICBjb25zdCByY0ZpbGVQYXRoID0gcmNGaWxlUGF0aEZyb21Ob3RoaW5nKCksXG4gICAgICAgIHJkRmlsZUNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCBcIiAgXCIpO1xuXG4gIHdyaXRlRmlsZShyY0ZpbGVQYXRoLCByZEZpbGVDb250ZW50KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUkNGaWxlKGFkZGVkUHJvcGVydGllcywgLi4uZGVsZXRlZFByb3BlcnR5TmFtZXMpIHtcbiAgbGV0IGpzb24gPSByZWFkUkNGaWxlKCk7XG5cbiAgaWYgKGFkZGVkUHJvcGVydGllcykge1xuICAgIE9iamVjdC5hc3NpZ24oanNvbiwgYWRkZWRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGRlbGV0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGRlbGV0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcbiAgICBkZWxldGUganNvbltkZWxldGVkUHJvcGVydHlOYW1lXTtcbiAgfSk7XG5cbiAgd3JpdGVSQ0ZpbGUoanNvbik7ICAgICAgXG59XG5cbmZ1bmN0aW9uIGNoZWNrUkNGaWxlRXhpc3RzKCkge1xuICBjb25zdCByY0ZpbGVQYXRoID0gcmNGaWxlUGF0aEZyb21Ob3RoaW5nKCksXG4gICAgICAgIHJjRmlsZUV4aXN0cyA9IGNoZWNrRmlsZUV4aXN0cyhyY0ZpbGVQYXRoKTtcblxuICByZXR1cm4gcmNGaWxlRXhpc3RzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWYWN1b3VzUkNGaWxlKCkge1xuICBjb25zdCBqc29uID0ge1xuICAgIFwiZW52aXJvbm1lbnRzXCI6IFtcbiAgICAgIHt9XG4gICAgXVxuICB9O1xuXG4gIHdyaXRlUkNGaWxlKGpzb24pO1xufVxuXG5mdW5jdGlvbiBzZXRSQ0Jhc2VFeHRlbnNpb24ocmNCYXNlRXh0ZW5zaW9uKSB7IGJhc2VFeHRlbnNpb24gPSByY0Jhc2VFeHRlbnNpb247IH1cblxuT2JqZWN0LmFzc2lnbihfcmMsIHtcbiAgcmVhZFJDRmlsZSxcbiAgd3JpdGVSQ0ZpbGUsXG4gIHVwZGF0ZVJDRmlsZSxcbiAgY2hlY2tSQ0ZpbGVFeGlzdHMsXG4gIGNyZWF0ZVZhY3VvdXNSQ0ZpbGUsXG4gIHNldFJDQmFzZUV4dGVuc2lvblxufSk7XG5cbmZ1bmN0aW9uIGZpbmRFbnZpcm9ubWVudChqc29uLCBlbnZpcm9ubWVudE5hbWUpIHtcbiAgbGV0IGVudmlyb25tZW50O1xuICBjb25zdCB7IGVudmlyb25tZW50cyB9ID0ganNvbjtcblxuICBpZiAoZW52aXJvbm1lbnROYW1lID09PSBudWxsKSB7XG4gICAgY29uc3QgZmlyc3RFbnZpcm9ubWVudCA9IGZpcnN0KGVudmlyb25tZW50cyk7XG5cbiAgICBlbnZpcm9ubWVudCA9IGZpcnN0RW52aXJvbm1lbnQ7IC8vL1xuICB9IGVsc2Uge1xuICAgIGVudmlyb25tZW50ID0gZW52aXJvbm1lbnRzLmZpbmQoKGVudmlyb25tZW50KSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGVudmlyb25tZW50O1xuXG4gICAgICBpZihuYW1lID09PSBlbnZpcm9ubWVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUgZW52aXJvbm1lbnQubmFtZVxuXG4gIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuZnVuY3Rpb24gcmNGaWxlUGF0aEZyb21Ob3RoaW5nKCkge1xuICBjb25zdCByY0ZpbGVQYXRoID0gYC4vLiR7YmFzZUV4dGVuc2lvbn1yY2A7XG5cbiAgcmV0dXJuIHJjRmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGVudmlyb25tZW50TmFtZUZyb21FbnYoKSB7XG4gIGNvbnN0IGVudmlyb25tZW50TmFtZSA9IHByb2Nlc3MuZW52W0VOVklST05NRU5UXSB8fCBudWxsO1xuXG4gIHJldHVybiBlbnZpcm9ubWVudE5hbWU7XG59XG5cbmZ1bmN0aW9uIGVudmlyb25tZW50TmFtZUZyb21Bcmd2KCkge1xuICBsZXQgZW52aXJvbm1lbnROYW1lID0gbnVsbDtcblxuICBwcm9jZXNzLmFyZ3YuZmluZCgoYXJndW1lbnQpID0+IHsgIC8vL1xuICAgIGNvbnN0IG1hdGNoZXMgPSBhcmd1bWVudC5tYXRjaCgvLS1lbnZpcm9ubWVudD0oLispLyksXG4gICAgICAgICAgZm91bmQgPSAobWF0Y2hlcyAhPT0gbnVsbCk7XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIGNvbnN0IHNlY29uZE1hdGNoID0gc2Vjb25kKG1hdGNoZXMpO1xuXG4gICAgICBlbnZpcm9ubWVudE5hbWUgPSBzZWNvbmRNYXRjaDtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH0pO1xuXG4gIHJldHVybiBlbnZpcm9ubWVudE5hbWU7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlKHN0cmluZykge1xuICBsZXQgdmFsdWUgPSBudWxsO1xuXG4gIGNvbnN0IHN0cmluZ1VwcGVyQ2FzZSA9IGlzU3RyaW5nVXBwZXJDYXNlKHN0cmluZyk7XG5cbiAgaWYgKHN0cmluZ1VwcGVyQ2FzZSkge1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmc7ICAvLy9cblxuICAgIHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV0gfHwgbnVsbDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUVudmlyb25tZW50VmFyaWFibGVzKGVudmlyb25tZW50KSB7XG4gIGxldCBqc29uID0gZW52aXJvbm1lbnQ7XG5cbiAgY29uc3QganNvbkFycmF5ID0gaXNKU09OQXJyYXkoanNvbiksXG4gICAgICAgIGpzb25PYmplY3QgPSBpc0pTT05PYmplY3QoanNvbik7XG5cbiAgaWYgKGZhbHNlKSB7XG4gICAgLy8vXG4gIH0gZWxzZSBpZiAoanNvbkFycmF5KSB7XG4gICAgY29uc3QgYXJyYXkgPSBqc29uLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpzb24gPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBqc29uU3RyaW5nID0gaXNKU09OU3RyaW5nKGpzb24pO1xuXG4gICAgICBpZiAoanNvblN0cmluZykge1xuICAgICAgICBjb25zdCBzdHJpbmcgPSBqc29uLFxuICAgICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlKHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoanNvbk9iamVjdCkge1xuICAgIGNvbnN0IG9iamVjdCA9IGpzb247ICAvLy9cblxuICAgIGZvciAobGV0IG5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICBjb25zdCBqc29uID0gb2JqZWN0W25hbWVdLFxuICAgICAgICAgICAganNvblN0cmluZyA9IGlzSlNPTlN0cmluZyhqc29uKTtcblxuICAgICAgaWYgKGpzb25TdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0ganNvbiwgIC8vL1xuICAgICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlKHN0cmluZyk7ICAvLy9cblxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBvYmplY3RbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlICB7XG4gICAgICAgIHJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlcyhqc29uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNKU09OQXJyYXkoanNvbikge1xuICBjb25zdCBqc29uQXJyYXkgPSAoanNvbiBpbnN0YW5jZW9mIEFycmF5KTtcblxuICByZXR1cm4ganNvbkFycmF5O1xufVxuXG5mdW5jdGlvbiBpc0pTT05PYmplY3QoanNvbikge1xuICBjb25zdCBqc29uQXJyYXkgPSBpc0pTT05BcnJheShqc29uKSxcbiAgICAgICAganNvblByaW1pdGl2ZSA9IGlzSlNPTlByaW1pdGl2ZShqc29uKSxcbiAgICAgICAganNvbk9iamVjdCA9ICghanNvbkFycmF5ICYmICEganNvblByaW1pdGl2ZSk7XG5cbiAgcmV0dXJuIGpzb25PYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGlzSlNPTlN0cmluZyhqc29uKSB7XG4gIGNvbnN0IGpzb25TdHJpbmcgPSAodHlwZW9mIGpzb24gPT09IFNUUklORyk7XG5cbiAgcmV0dXJuIGpzb25TdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzSlNPTk51bWJlcihqc29uKSB7XG4gIGNvbnN0IGpzb25OdW1iZXIgPSAodHlwZW9mIGpzb24gPT09IE5VTUJFUik7XG5cbiAgcmV0dXJuIGpzb25OdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGlzSlNPTkJvb2xlYW4oanNvbikge1xuICBjb25zdCBqc29uQm9vbGVhbiA9ICh0eXBlb2YganNvbiA9PT0gQk9PTEVBTik7XG5cbiAgcmV0dXJuIGpzb25Cb29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc0pTT05QcmltaXRpdmUoanNvbikge1xuICBjb25zdCBqc29uU3RyaW5nID0gaXNKU09OU3RyaW5nKGpzb24pLFxuICAgICAgICBqc29uTnVtYmVyID0gaXNKU09OTnVtYmVyKGpzb24pLFxuICAgICAgICBqc29uQm9vbGVhbiA9IGlzSlNPTkJvb2xlYW4oanNvbiksXG4gICAgICAgIGpzb25QcmltaXRpdmUgPSAoanNvblN0cmluZyB8fCBqc29uTnVtYmVyIHx8IGpzb25Cb29sZWFuKTtcblxuICByZXR1cm4ganNvblByaW1pdGl2ZTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdVcHBlckNhc2Uoc3RyaW5nKSB7XG4gIGNvbnN0IHVwcGVyQ2FzZVN0cmluZyA9IHN0cmluZy50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBzdHJpbmdVcHBlckNhc2UgPSAoc3RyaW5nID09PSB1cHBlckNhc2VTdHJpbmcpO1xuXG4gIHJldHVybiBzdHJpbmdVcHBlckNhc2U7XG59XG4iXSwibmFtZXMiOlsiZ2xvYmFsVGhpcyIsInJjIiwiX3JjIiwiYmFzZUV4dGVuc2lvbiIsImVudmlyb25tZW50TmFtZSIsImVudmlyb25tZW50TmFtZUZyb21Bcmd2IiwiZW52aXJvbm1lbnROYW1lRnJvbUVudiIsImpzb24iLCJyZWFkUkNGaWxlIiwiZW52aXJvbm1lbnQiLCJmaW5kRW52aXJvbm1lbnQiLCJyZXBsYWNlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJyY0ZpbGVQYXRoIiwicmNGaWxlUGF0aEZyb21Ob3RoaW5nIiwicmNGaWxlQ29udGVudCIsIkpTT04iLCJwYXJzZSIsIndyaXRlUkNGaWxlIiwicmRGaWxlQ29udGVudCIsInN0cmluZ2lmeSIsInVwZGF0ZVJDRmlsZSIsImFkZGVkUHJvcGVydGllcyIsImRlbGV0ZWRQcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsImRlbGV0ZWRQcm9wZXJ0eU5hbWUiLCJjaGVja1JDRmlsZUV4aXN0cyIsInJjRmlsZUV4aXN0cyIsImNyZWF0ZVZhY3VvdXNSQ0ZpbGUiLCJzZXRSQ0Jhc2VFeHRlbnNpb24iLCJyY0Jhc2VFeHRlbnNpb24iLCJlbnZpcm9ubWVudHMiLCJmaXJzdEVudmlyb25tZW50IiwiZmluZCIsIm5hbWUiLCJwcm9jZXNzIiwiZW52IiwiYXJndiIsImFyZ3VtZW50IiwibWF0Y2hlcyIsIm1hdGNoIiwiZm91bmQiLCJzZWNvbmRNYXRjaCIsInJlcGxhY2VFbnZpcm9ubWVudFZhcmlhYmxlIiwic3RyaW5nIiwidmFsdWUiLCJzdHJpbmdVcHBlckNhc2UiLCJpc1N0cmluZ1VwcGVyQ2FzZSIsImpzb25BcnJheSIsImlzSlNPTkFycmF5IiwianNvbk9iamVjdCIsImlzSlNPTk9iamVjdCIsImFycmF5IiwibGVuZ3RoIiwiaW5kZXgiLCJqc29uU3RyaW5nIiwiaXNKU09OU3RyaW5nIiwib2JqZWN0IiwiQXJyYXkiLCJqc29uUHJpbWl0aXZlIiwiaXNKU09OUHJpbWl0aXZlIiwiaXNKU09OTnVtYmVyIiwianNvbk51bWJlciIsImlzSlNPTkJvb2xlYW4iLCJqc29uQm9vbGVhbiIsInVwcGVyQ2FzZVN0cmluZyIsInRvVXBwZXJDYXNlIl0sIm1hcHBpbmdzIjoiQUFBQSxDQUFZOzs7OztBQUVrQixHQUFvQixDQUFwQixNQUFvQjtBQUNSLEdBQWEsQ0FBYixTQUFhO0FBQ0YsR0FBYyxDQUFkLFVBQWM7QUFDZCxHQUF5QixDQUF6QixXQUF5Qjs7Ozs7Ozs7Ozs7QUFFOUUsRUFBRSxHQUFHQSxVQUFVLENBQUNDLEVBQUUsRUFBRSxDQUFDO0lBQ25CRCxVQUFVLENBQUNDLEVBQUUsR0FBR0MsR0FBRztBQUNyQixDQUFDO0FBRUQsR0FBSyxDQUFHRCxFQUFFLEdBQUtELFVBQVUsQ0FBakJDLEVBQUU7ZUFFSyxDQUFDO0lBQ2RBLEVBQUUsRUFBRkEsRUFBRTtBQUNKLENBQUM7O0FBRUQsR0FBRyxDQUFDRSxhQUFhLEdBZHlCLFNBQWE7U0FnQjlDRCxHQUFHLENBQUNFLGVBQWUsRUFBRSxDQUFDO0lBQzdCQSxlQUFlLEdBQUdBLGVBQWUsSUFBSUMsdUJBQXVCLE1BQU1DLHNCQUFzQixHQUFJLENBQUcsQUFBSCxFQUFHLEFBQUgsQ0FBRztJQUUvRixHQUFHLENBQUNDLElBQUksR0FBR0MsVUFBVTtJQUVyQixHQUFLLENBQUNDLFdBQVcsR0FBR0MsZUFBZSxDQUFDSCxJQUFJLEVBQUVILGVBQWU7SUFFekRHLElBQUksR0FBR0UsV0FBVyxDQUFFLENBQUcsQUFBSCxFQUFHLEFBQUgsQ0FBRztJQUV2QkUsMkJBQTJCLENBQUNKLElBQUk7SUFFaENLLE1BQU0s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
|
package/package.json
CHANGED
package/src/constants.js
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
export const UTF8 = "utf8";
|
|
4
4
|
export const ERROR = "error";
|
|
5
5
|
export const CTRL_C = "^C";
|
|
6
|
+
export const STRING = "string";
|
|
6
7
|
export const ACCEPT = "accept";
|
|
8
|
+
export const NUMBER = "number";
|
|
9
|
+
export const BOOLEAN = "boolean";
|
|
10
|
+
export const ENVIRONMENT = "ENVIRONMENT";
|
|
7
11
|
export const EMPTY_STRING = "";
|
|
8
12
|
export const CONTENT_TYPE = "content-type";
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { first, second } from "../utilities/array";
|
|
4
4
|
import { DEFAULT_RC_BASE_EXTENSION } from "../defaults";
|
|
5
|
+
import { STRING, NUMBER, BOOLEAN, ENVIRONMENT } from "../constants";
|
|
5
6
|
import { readFile, writeFile, checkFileExists } from "../utilities/fileSystem";
|
|
6
7
|
|
|
7
8
|
if (!globalThis.rc) {
|
|
@@ -16,40 +17,18 @@ export default {
|
|
|
16
17
|
|
|
17
18
|
let baseExtension = DEFAULT_RC_BASE_EXTENSION;
|
|
18
19
|
|
|
19
|
-
function _rc(
|
|
20
|
-
|
|
21
|
-
environmentName,
|
|
22
|
-
environmentNameOrArgvArgv = (environmentNameOrArgv instanceof Array);
|
|
20
|
+
function _rc(environmentName) {
|
|
21
|
+
environmentName = environmentName || environmentNameFromArgv() || environmentNameFromEnv(); ///
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
const argv = environmentNameOrArgv; ///
|
|
26
|
-
|
|
27
|
-
environmentName = environmentNameFromArgv(argv);
|
|
28
|
-
} else {
|
|
29
|
-
environmentName = environmentNameOrArgv; ///
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const json = readRCFile(),
|
|
33
|
-
{ environments } = json;
|
|
34
|
-
|
|
35
|
-
if (environmentName === null) {
|
|
36
|
-
const firstEnvironment = first(environments);
|
|
23
|
+
let json = readRCFile();
|
|
37
24
|
|
|
38
|
-
|
|
39
|
-
} else {
|
|
40
|
-
environment = environments.find((environment) => {
|
|
41
|
-
const { name } = environment,
|
|
42
|
-
found = (name === environmentName);
|
|
25
|
+
const environment = findEnvironment(json, environmentName);
|
|
43
26
|
|
|
44
|
-
|
|
45
|
-
});
|
|
46
|
-
}
|
|
27
|
+
json = environment; ///
|
|
47
28
|
|
|
48
|
-
|
|
29
|
+
replaceEnvironmentVariables(json);
|
|
49
30
|
|
|
50
31
|
Object.assign(rc, environment);
|
|
51
|
-
|
|
52
|
-
return environment;
|
|
53
32
|
}
|
|
54
33
|
|
|
55
34
|
function readRCFile() {
|
|
@@ -109,10 +88,45 @@ Object.assign(_rc, {
|
|
|
109
88
|
setRCBaseExtension
|
|
110
89
|
});
|
|
111
90
|
|
|
112
|
-
function
|
|
91
|
+
function findEnvironment(json, environmentName) {
|
|
92
|
+
let environment;
|
|
93
|
+
const { environments } = json;
|
|
94
|
+
|
|
95
|
+
if (environmentName === null) {
|
|
96
|
+
const firstEnvironment = first(environments);
|
|
97
|
+
|
|
98
|
+
environment = firstEnvironment; ///
|
|
99
|
+
} else {
|
|
100
|
+
environment = environments.find((environment) => {
|
|
101
|
+
const { name } = environment;
|
|
102
|
+
|
|
103
|
+
if(name === environmentName) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
delete environment.name
|
|
110
|
+
|
|
111
|
+
return environment;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function rcFilePathFromNothing() {
|
|
115
|
+
const rcFilePath = `./.${baseExtension}rc`;
|
|
116
|
+
|
|
117
|
+
return rcFilePath;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function environmentNameFromEnv() {
|
|
121
|
+
const environmentName = process.env[ENVIRONMENT] || null;
|
|
122
|
+
|
|
123
|
+
return environmentName;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function environmentNameFromArgv() {
|
|
113
127
|
let environmentName = null;
|
|
114
128
|
|
|
115
|
-
argv.find((argument) => { ///
|
|
129
|
+
process.argv.find((argument) => { ///
|
|
116
130
|
const matches = argument.match(/--environment=(.+)/),
|
|
117
131
|
found = (matches !== null);
|
|
118
132
|
|
|
@@ -128,8 +142,110 @@ function environmentNameFromArgv(argv) {
|
|
|
128
142
|
return environmentName;
|
|
129
143
|
}
|
|
130
144
|
|
|
131
|
-
function
|
|
132
|
-
|
|
145
|
+
function replaceEnvironmentVariable(string) {
|
|
146
|
+
let value = null;
|
|
133
147
|
|
|
134
|
-
|
|
148
|
+
const stringUpperCase = isStringUpperCase(string);
|
|
149
|
+
|
|
150
|
+
if (stringUpperCase) {
|
|
151
|
+
const name = string; ///
|
|
152
|
+
|
|
153
|
+
value = process.env[name] || null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function replaceEnvironmentVariables(environment) {
|
|
160
|
+
let json = environment;
|
|
161
|
+
|
|
162
|
+
const jsonArray = isJSONArray(json),
|
|
163
|
+
jsonObject = isJSONObject(json);
|
|
164
|
+
|
|
165
|
+
if (false) {
|
|
166
|
+
///
|
|
167
|
+
} else if (jsonArray) {
|
|
168
|
+
const array = json,
|
|
169
|
+
length = array.length;
|
|
170
|
+
|
|
171
|
+
for (let index = 0; index < length; index++) {
|
|
172
|
+
const json = array[index],
|
|
173
|
+
jsonString = isJSONString(json);
|
|
174
|
+
|
|
175
|
+
if (jsonString) {
|
|
176
|
+
const string = json,
|
|
177
|
+
value = replaceEnvironmentVariable(string);
|
|
178
|
+
|
|
179
|
+
if (value !== null) {
|
|
180
|
+
array[index] = value;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} else if (jsonObject) {
|
|
185
|
+
const object = json; ///
|
|
186
|
+
|
|
187
|
+
for (let name in object) {
|
|
188
|
+
const json = object[name],
|
|
189
|
+
jsonString = isJSONString(json);
|
|
190
|
+
|
|
191
|
+
if (jsonString) {
|
|
192
|
+
const string = json, ///
|
|
193
|
+
value = replaceEnvironmentVariable(string); ///
|
|
194
|
+
|
|
195
|
+
if (value !== null) {
|
|
196
|
+
object[name] = value;
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
replaceEnvironmentVariables(json);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function isJSONArray(json) {
|
|
206
|
+
const jsonArray = (json instanceof Array);
|
|
207
|
+
|
|
208
|
+
return jsonArray;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function isJSONObject(json) {
|
|
212
|
+
const jsonArray = isJSONArray(json),
|
|
213
|
+
jsonPrimitive = isJSONPrimitive(json),
|
|
214
|
+
jsonObject = (!jsonArray && ! jsonPrimitive);
|
|
215
|
+
|
|
216
|
+
return jsonObject;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function isJSONString(json) {
|
|
220
|
+
const jsonString = (typeof json === STRING);
|
|
221
|
+
|
|
222
|
+
return jsonString;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function isJSONNumber(json) {
|
|
226
|
+
const jsonNumber = (typeof json === NUMBER);
|
|
227
|
+
|
|
228
|
+
return jsonNumber;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function isJSONBoolean(json) {
|
|
232
|
+
const jsonBoolean = (typeof json === BOOLEAN);
|
|
233
|
+
|
|
234
|
+
return jsonBoolean;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function isJSONPrimitive(json) {
|
|
238
|
+
const jsonString = isJSONString(json),
|
|
239
|
+
jsonNumber = isJSONNumber(json),
|
|
240
|
+
jsonBoolean = isJSONBoolean(json),
|
|
241
|
+
jsonPrimitive = (jsonString || jsonNumber || jsonBoolean);
|
|
242
|
+
|
|
243
|
+
return jsonPrimitive;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function isStringUpperCase(string) {
|
|
247
|
+
const upperCaseString = string.toUpperCase(),
|
|
248
|
+
stringUpperCase = (string === upperCaseString);
|
|
249
|
+
|
|
250
|
+
return stringUpperCase;
|
|
135
251
|
}
|