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 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); // Expects a plain old JavaScript object of the form { level,
448
- // fileBaseName,
449
- // directoryPath }
447
+ setLogOptions(logOptions);
450
448
  ```
451
449
 
452
- By default it will parse a file called `.rc` in the current working directory. This file should have the following format:
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
- In the absence of being passed an environment name, it will parse and return the first element of the `enviromnents` array. It will not try to assign the `name` property of the chosen environment to itself, by the way, because functions already have a `name` property. It can be instructed to a chose a specific environment thus:
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
- rc("production"); // Provides the 'production' environment
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
- Or you can pass `process.argv` if the command line arguments include something of the form `--environment=...`:
472
+ If neither of these checks are successful then it will return the first element of the `enviromnents` array.
476
473
 
477
- ```
478
- rc(process.argv); // Provides the 'development' if given '--environment=development'
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBVVEY4ID0gXCJ1dGY4XCI7XG5leHBvcnQgY29uc3QgRVJST1IgPSBcImVycm9yXCI7XG5leHBvcnQgY29uc3QgQ1RSTF9DID0gXCJeQ1wiO1xuZXhwb3J0IGNvbnN0IEFDQ0VQVCA9IFwiYWNjZXB0XCI7XG5leHBvcnQgY29uc3QgRU1QVFlfU1RSSU5HID0gXCJcIjtcbmV4cG9ydCBjb25zdCBDT05URU5UX1RZUEUgPSBcImNvbnRlbnQtdHlwZVwiO1xuIl0sIm5hbWVzIjpbIlVURjgiLCJFUlJPUiIsIkNUUkxfQyIsIkFDQ0VQVCIsIkVNUFRZX1NUUklORyIsIkNPTlRFTlRfVFlQRSJdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBWTs7Ozs7QUFFTCxHQUFLLENBQUNBLElBQUksR0FBRyxDQUFNO1FBQWJBLElBQUksR0FBSkEsSUFBSTtBQUNWLEdBQUssQ0FBQ0MsS0FBSyxHQUFHLENBQU87UUFBZkEsS0FBSyxHQUFMQSxLQUFLO0FBQ1gsR0FBSyxDQUFDQyxNQUFNLEdBQUcsQ0FBSTtRQUFiQSxNQUFNLEdBQU5BLE1BQU07QUFDWixHQUFLLENBQUNDLE1BQU0sR0FBRyxDQUFRO1FBQWpCQSxNQUFNLEdBQU5BLE1BQU07QUFDWixHQUFLLENBQUNDLFlBQVksR0FBRyxDQUFFO1FBQWpCQSxZQUFZLEdBQVpBLFlBQVk7QUFDbEIsR0FBSyxDQUFDQyxZQUFZLEdBQUcsQ0FBYztRQUE3QkEsWUFBWSxHQUFaQSxZQUFZIn0=
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
- var environmentNameOrArgv = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
27
- var environment1, environmentName, environmentNameOrArgvArgv = _instanceof(environmentNameOrArgv, Array);
28
- if (environmentNameOrArgvArgv) {
29
- var argv = environmentNameOrArgv; ///
30
- environmentName = environmentNameFromArgv(argv);
31
- } else {
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 environmentNameFromArgv(argv) {
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 rcFilePathFromNothing() {
106
- var rcFilePath = "./.".concat(baseExtension, "rc");
107
- return rcFilePath;
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "necessary",
3
3
  "author": "James Smith",
4
- "version": "10.0.7",
4
+ "version": "11.0.0",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/necessary",
7
7
  "description": "A collection of utility functions.",
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(environmentNameOrArgv = null) {
20
- let environment,
21
- environmentName,
22
- environmentNameOrArgvArgv = (environmentNameOrArgv instanceof Array);
20
+ function _rc(environmentName) {
21
+ environmentName = environmentName || environmentNameFromArgv() || environmentNameFromEnv(); ///
23
22
 
24
- if (environmentNameOrArgvArgv) {
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
- environment = firstEnvironment; ///
39
- } else {
40
- environment = environments.find((environment) => {
41
- const { name } = environment,
42
- found = (name === environmentName);
25
+ const environment = findEnvironment(json, environmentName);
43
26
 
44
- return found;
45
- });
46
- }
27
+ json = environment; ///
47
28
 
48
- delete environment.name;
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 environmentNameFromArgv(argv) {
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 rcFilePathFromNothing() {
132
- const rcFilePath = `./.${baseExtension}rc`;
145
+ function replaceEnvironmentVariable(string) {
146
+ let value = null;
133
147
 
134
- return rcFilePath;
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
  }