@grnsft/if 0.2.0 → 0.3.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.
Files changed (88) hide show
  1. package/.commitlintrc.js +4 -7
  2. package/CONTRIBUTING.md +2 -12
  3. package/README.md +8 -4
  4. package/Refactor-migration-guide.md +342 -0
  5. package/build/{models/export-csv.d.ts → builtins/export-csv-raw.d.ts} +1 -1
  6. package/build/builtins/export-csv-raw.js +129 -0
  7. package/build/builtins/export-csv.d.ts +10 -0
  8. package/build/builtins/export-csv.js +83 -0
  9. package/build/builtins/export-log.js +18 -0
  10. package/build/builtins/export-yaml.js +27 -0
  11. package/build/builtins/group-by.d.ts +5 -0
  12. package/build/builtins/group-by.js +56 -0
  13. package/build/{models → builtins}/index.js +1 -1
  14. package/build/{models → builtins}/time-sync.d.ts +2 -2
  15. package/build/builtins/time-sync.js +304 -0
  16. package/build/config/config.js +2 -2
  17. package/build/config/params.js +56 -1
  18. package/build/config/strings.d.ts +4 -2
  19. package/build/config/strings.js +7 -9
  20. package/build/index.js +3 -1
  21. package/build/lib/aggregate.d.ts +1 -1
  22. package/build/lib/aggregate.js +4 -3
  23. package/build/lib/compute.js +9 -10
  24. package/build/lib/exhaust.js +8 -5
  25. package/build/lib/initialize.d.ts +2 -2
  26. package/build/lib/initialize.js +9 -5
  27. package/build/lib/load.d.ts +33 -2
  28. package/build/lib/load.js +4 -4
  29. package/build/lib/parameterize.d.ts +1 -1
  30. package/build/lib/parameterize.js +6 -4
  31. package/build/types/aggregation.d.ts +0 -1
  32. package/build/types/aggregation.js +1 -1
  33. package/build/types/compute.d.ts +3 -3
  34. package/build/types/compute.js +1 -1
  35. package/build/types/interface.d.ts +14 -1
  36. package/build/types/interface.js +6 -1
  37. package/build/types/manifest.d.ts +9 -40
  38. package/build/types/manifest.js +1 -1
  39. package/build/types/parameters.d.ts +2 -12
  40. package/build/types/parameters.js +1 -1
  41. package/build/types/plugin-storage.d.ts +6 -0
  42. package/build/types/plugin-storage.js +3 -0
  43. package/build/util/aggregation-helper.d.ts +1 -1
  44. package/build/util/aggregation-helper.js +11 -12
  45. package/build/util/errors.d.ts +1 -1
  46. package/build/util/errors.js +2 -2
  47. package/build/util/json.js +25 -5
  48. package/build/util/log-memoize.d.ts +3 -0
  49. package/build/util/log-memoize.js +19 -0
  50. package/build/util/logger.d.ts +1 -1
  51. package/build/util/logger.js +2 -3
  52. package/build/util/plugin-storage.d.ts +14 -0
  53. package/build/util/plugin-storage.js +34 -0
  54. package/build/util/validations.d.ts +144 -11
  55. package/build/util/validations.js +19 -17
  56. package/examples/manifests/asim-demo.yml +74 -0
  57. package/examples/manifests/basic-demo.yml +4 -9
  58. package/examples/manifests/boavizta-cloud.yml +20 -0
  59. package/examples/manifests/cim.yml +3 -3
  60. package/examples/manifests/divide.yml +38 -0
  61. package/examples/manifests/generics.yml +4 -4
  62. package/examples/manifests/group-by.yml +13 -13
  63. package/examples/manifests/mock-observation.yml +2 -2
  64. package/examples/manifests/nesting-demo.yml +2 -2
  65. package/examples/manifests/nesting.yml +16 -16
  66. package/examples/manifests/pipeline-demo-1.yml +4 -4
  67. package/examples/manifests/pipeline-demo-2.yml +9 -9
  68. package/examples/manifests/pipeline-demo.yml +10 -10
  69. package/examples/manifests/pipeline-teads-sci.yml +4 -4
  70. package/examples/manifests/pipeline-with-generics.yml +8 -8
  71. package/examples/manifests/pipeline-with-mocks.yml +10 -10
  72. package/examples/manifests/regex.yml +23 -0
  73. package/package.json +8 -5
  74. package/src/builtins/README.md +852 -0
  75. package/build/models/export-csv.js +0 -129
  76. package/build/models/export-log.js +0 -18
  77. package/build/models/export-yaml.js +0 -24
  78. package/build/models/group-by.d.ts +0 -11
  79. package/build/models/group-by.js +0 -56
  80. package/build/models/time-sync.js +0 -304
  81. package/build/types/initialize.d.ts +0 -4
  82. package/build/types/initialize.js +0 -3
  83. package/build/types/load.d.ts +0 -7
  84. package/build/types/load.js +0 -3
  85. package/src/models/README.md +0 -268
  86. /package/build/{models → builtins}/export-log.d.ts +0 -0
  87. /package/build/{models → builtins}/export-yaml.d.ts +0 -0
  88. /package/build/{models → builtins}/index.d.ts +0 -0
@@ -1,129 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ExportCsv = void 0;
27
- const fs = __importStar(require("fs/promises"));
28
- const errors_1 = require("../util/errors");
29
- const { WriteFileError, CliInputError } = errors_1.ERRORS;
30
- const ExportCsv = () => {
31
- /**
32
- * handle a tree leaf, where there are no child nodes, by adding it as key->value pair to the flat map
33
- * and capturing key as a header
34
- */
35
- const handleLeafValue = (value, fullPath, key, flatMap, headers) => {
36
- if (fullPath.includes('outputs')) {
37
- headers.add(key);
38
- flatMap[fullPath] = value;
39
- }
40
- };
41
- /**
42
- * handle a tree node, recursively traverse the children and append their results to the flat map and captured headers
43
- */
44
- const handleNodeValue = (value, fullPath, flatMap, headers) => {
45
- const [subFlatMap, subHeaders] = extractFlatMapAndHeaders(value, fullPath);
46
- if (Object.keys(subFlatMap).length > 0) {
47
- Object.entries(subFlatMap).forEach(([subKey, value]) => {
48
- flatMap[subKey] = value;
49
- });
50
- subHeaders.forEach(subHeader => {
51
- headers.add(subHeader);
52
- });
53
- }
54
- };
55
- /**
56
- * Handles a key at the top level of the tree
57
- */
58
- const handleKey = (value, key, prefix, flatMap, headers) => {
59
- const fullPath = prefix ? `${prefix}.${key}` : key;
60
- if (value !== null && typeof value === 'object') {
61
- return handleNodeValue(value, fullPath, flatMap, headers);
62
- }
63
- return handleLeafValue(value, fullPath, key, flatMap, headers);
64
- };
65
- /**
66
- * qrecursively extract a flat map and headers from the hierarcial tree
67
- */
68
- const extractFlatMapAndHeaders = (tree, prefix = '') => {
69
- const headers = new Set();
70
- const flatMap = [];
71
- for (const key in tree) {
72
- if (key in tree) {
73
- handleKey(tree[key], key, prefix, flatMap, headers);
74
- }
75
- }
76
- return [flatMap, headers];
77
- };
78
- /**
79
- * extract the id of the key, that is removing the last token (which is the index).
80
- * in this manner, multiple keys that identical besides their index share the same id.
81
- */
82
- const extractIdHelper = (key) => {
83
- const parts = key.split('.');
84
- parts.pop();
85
- return parts.join('.');
86
- };
87
- /**
88
- * generate a CSV formatted string based on a flat key->value map, headers and ids
89
- */
90
- const getCsvString = (map, headers, ids) => {
91
- const csvRows = [];
92
- csvRows.push(['id', ...headers].join(','));
93
- ids.forEach(id => {
94
- const rowData = [id];
95
- headers.forEach(header => {
96
- const value = map[`${id}.${header}`] ?? '';
97
- rowData.push(value.toString());
98
- });
99
- csvRows.push(rowData.join(','));
100
- });
101
- return csvRows.join('\n');
102
- };
103
- /**
104
- * write the given string content to a file at the provided path
105
- */
106
- const writeOutputFile = async (content, outputPath) => {
107
- try {
108
- await fs.writeFile(`${outputPath}.csv`, content);
109
- }
110
- catch (error) {
111
- throw new WriteFileError(`Failed to write CSV to ${outputPath}: ${error}`);
112
- }
113
- };
114
- /**
115
- * export the provided tree content to a CSV file, represented in a flat structure
116
- */
117
- const execute = async (tree, _context, outputPath) => {
118
- if (!outputPath) {
119
- throw new CliInputError('Output path is required.');
120
- }
121
- const [extractredFlatMap, extractedHeaders] = extractFlatMapAndHeaders(tree);
122
- const ids = new Set(Object.keys(extractredFlatMap).map(key => extractIdHelper(key)));
123
- const csvString = getCsvString(extractredFlatMap, extractedHeaders, ids);
124
- writeOutputFile(csvString, outputPath);
125
- };
126
- return { execute };
127
- };
128
- exports.ExportCsv = ExportCsv;
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LWNzdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbHMvZXhwb3J0LWNzdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUFrQztBQUVsQywyQ0FBc0M7QUFLdEMsTUFBTSxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFFeEMsTUFBTSxTQUFTLEdBQUcsR0FBMkIsRUFBRTtJQUNwRDs7O09BR0c7SUFDSCxNQUFNLGVBQWUsR0FBRyxDQUN0QixLQUFVLEVBQ1YsUUFBZ0IsRUFDaEIsR0FBUSxFQUNSLE9BQTZCLEVBQzdCLE9BQW9CLEVBQ3BCLEVBQUU7UUFDRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLGVBQWUsR0FBRyxDQUN0QixLQUFVLEVBQ1YsUUFBZ0IsRUFDaEIsT0FBNEIsRUFDNUIsT0FBb0IsRUFDcEIsRUFBRTtRQUNGLE1BQU0sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTNFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDckQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUVILFVBQVUsQ0FB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QUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2xEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxNQUFNLElBQUksY0FBYyxDQUN0QiwwQkFBMEIsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUNqRCxDQUFDO1NBQ0g7SUFDSCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFTLEVBQUUsUUFBaUIsRUFBRSxVQUFrQixFQUFFLEVBQUU7UUFDekUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE1BQU0sSUFBSSxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUNyRDtRQUVELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxHQUN6Qyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNoRSxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDO0lBRUYsT0FBTyxFQUFDLE9BQU8sRUFBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWpKVyxRQUFBLFNBQVMsYUFpSnBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQge0VSUk9SU30gZnJvbSAnLi4vdXRpbC9lcnJvcnMnO1xuXG5pbXBvcnQge0V4aGF1c3RQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uL3R5cGVzL2V4aGF1c3QtcGx1Z2luLWludGVyZmFjZSc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL3R5cGVzL21hbmlmZXN0JztcblxuY29uc3Qge1dyaXRlRmlsZUVycm9yLCBDbGlJbnB1dEVycm9yfSA9IEVSUk9SUztcblxuZXhwb3J0IGNvbnN0IEV4cG9ydENzdiA9ICgpOiBFeGhhdXN0UGx1Z2luSW50ZXJmYWNlID0+IHtcbiAgLyoqXG4gICAqIGhhbmRsZSBhIHRyZWUgbGVhZiwgd2hlcmUgdGhlcmUgYXJlIG5vIGNoaWxkIG5vZGVzLCBieSBhZGRpbmcgaXQgYXMga2V5LT52YWx1ZSBwYWlyIHRvIHRoZSBmbGF0IG1hcFxuICAgKiBhbmQgY2FwdHVyaW5nIGtleSBhcyBhIGhlYWRlclxuICAgKi9cbiAgY29uc3QgaGFuZGxlTGVhZlZhbHVlID0gKFxuICAgIHZhbHVlOiBhbnksXG4gICAgZnVsbFBhdGg6IHN0cmluZyxcbiAgICBrZXk6IGFueSxcbiAgICBmbGF0TWFwOiB7W2tleTogc3RyaW5nXTogYW55fSxcbiAgICBoZWFkZXJzOiBTZXQ8c3RyaW5nPlxuICApID0+IHtcbiAgICBpZiAoZnVsbFBhdGguaW5jbHVkZXMoJ291dHB1dHMnKSkge1xuICAgICAgaGVhZGVycy5hZGQoa2V5KTtcbiAgICAgIGZsYXRNYXBbZnVsbFBhdGhdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBoYW5kbGUgYSB0cmVlIG5vZGUsIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBjaGlsZHJlbiBhbmQgYXBwZW5kIHRoZWlyIHJlc3VsdHMgdG8gdGhlIGZsYXQgbWFwIGFuZCBjYXB0dXJlZCBoZWFkZXJzXG4gICAqL1xuICBjb25zdCBoYW5kbGVOb2RlVmFsdWUgPSAoXG4gICAgdmFsdWU6IGFueSxcbiAgICBmdWxsUGF0aDogc3RyaW5nLFxuICAgIGZsYXRNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgaGVhZGVyczogU2V0PHN0cmluZz5cbiAgKSA9PiB7XG4gICAgY29uc3QgW3N1YkZsYXRNYXAsIHN1YkhlYWRlcnNdID0gZXh0cmFjdEZsYXRNYXBBbmRIZWFkZXJzKHZhbHVlLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoc3ViRmxhdE1hcCkubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoc3ViRmxhdE1hcCkuZm9yRWFjaCgoW3N1YktleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGZsYXRNYXBbc3ViS2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIHN1YkhlYWRlcnMuZm9yRWFjaChzdWJIZWFkZXIgPT4ge1xuICAgICAgICBoZWFkZXJzLmFkZChzdWJIZWFkZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEga2V5IGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRyZWVcbiAgICovXG4gIGNvbnN0IGhhbmRsZUtleSA9IChcbiAgICB2YWx1ZTogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGZsYXRNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgaGVhZGVyczogU2V0PHN0cmluZz5cbiAgKSA9PiB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGhhbmRsZU5vZGVWYWx1ZSh2YWx1ZSwgZnVsbFBhdGgsIGZsYXRNYXAsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVMZWFmVmFsdWUodmFsdWUsIGZ1bGxQYXRoLCBrZXksIGZsYXRNYXAsIGhlYWRlcnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBxcmVjdXJzaXZlbHkgZXh0cmFjdCBhIGZsYXQgbWFwIGFuZCBoZWFkZXJzIGZyb20gdGhlIGhpZXJhcmNpYWwgdHJlZVxuICAgKi9cbiAgY29uc3QgZXh0cmFjdEZsYXRNYXBBbmRIZWFkZXJzID0gKFxuICAgIHRyZWU6IGFueSxcbiAgICBwcmVmaXggPSAnJ1xuICApOiBbUmVjb3JkPHN0cmluZywgYW55PiwgU2V0PHN0cmluZz5dID0+IHtcbiAgICBjb25zdCBoZWFkZXJzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBmbGF0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmVlKSB7XG4gICAgICBpZiAoa2V5IGluIHRyZWUpIHtcbiAgICAgICAgaGFuZGxlS2V5KHRyZWVba2V5XSwga2V5LCBwcmVmaXgsIGZsYXRNYXAsIGhlYWRlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbZmxhdE1hcCwgaGVhZGVyc107XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3QgdGhlIGlkIG9mIHRoZSBrZXksIHRoYXQgaXMgcmVtb3ZpbmcgdGhlIGxhc3QgdG9rZW4gKHdoaWNoIGlzIHRoZSBpbmRleCkuXG4gICAqIGluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBrZXlzIHRoYXQgaWRlbnRpY2FsIGJlc2lkZXMgdGhlaXIgaW5kZXggc2hhcmUgdGhlIHNhbWUgaWQuXG4gICAqL1xuICBjb25zdCBleHRyYWN0SWRIZWxwZXIgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgcGFydHMucG9wKCk7XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignLicpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZSBhIENTViBmb3JtYXR0ZWQgc3RyaW5nIGJhc2VkIG9uIGEgZmxhdCBrZXktPnZhbHVlIG1hcCwgaGVhZGVycyBhbmQgaWRzXG4gICAqL1xuICBjb25zdCBnZXRDc3ZTdHJpbmcgPSAoXG4gICAgbWFwOiB7W2tleTogc3RyaW5nXTogYW55fSxcbiAgICBoZWFkZXJzOiBTZXQ8c3RyaW5nPixcbiAgICBpZHM6IFNldDxzdHJpbmc+XG4gICk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgY3N2Um93czogc3RyaW5nW10gPSBbXTtcbiAgICBjc3ZSb3dzLnB1c2goWydpZCcsIC4uLmhlYWRlcnNdLmpvaW4oJywnKSk7XG5cbiAgICBpZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICBjb25zdCByb3dEYXRhID0gW2lkXTtcblxuICAgICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWFwW2Ake2lkfS4ke2hlYWRlcn1gXSA/PyAnJztcbiAgICAgICAgcm93RGF0YS5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgICBjc3ZSb3dzLnB1c2gocm93RGF0YS5qb2luKCcsJykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNzdlJvd3Muam9pbignXFxuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHdyaXRlIHRoZSBnaXZlbiBzdHJpbmcgY29udGVudCB0byBhIGZpbGUgYXQgdGhlIHByb3ZpZGVkIHBhdGhcbiAgICovXG4gIGNvbnN0IHdyaXRlT3V0cHV0RmlsZSA9IGFzeW5jIChjb250ZW50OiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7b3V0cHV0UGF0aH0uY3N2YCwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBXcml0ZUZpbGVFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB3cml0ZSBDU1YgdG8gJHtvdXRwdXRQYXRofTogJHtlcnJvcn1gXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogZXhwb3J0IHRoZSBwcm92aWRlZCB0cmVlIGNvbnRlbnQgdG8gYSBDU1YgZmlsZSwgcmVwcmVzZW50ZWQgaW4gYSBmbGF0IHN0cnVjdHVyZVxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0cmVlOiBhbnksIF9jb250ZXh0OiBDb250ZXh0LCBvdXRwdXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW91dHB1dFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBDbGlJbnB1dEVycm9yKCdPdXRwdXQgcGF0aCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZXh0cmFjdHJlZEZsYXRNYXAsIGV4dHJhY3RlZEhlYWRlcnNdID1cbiAgICAgIGV4dHJhY3RGbGF0TWFwQW5kSGVhZGVycyh0cmVlKTtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmFjdHJlZEZsYXRNYXApLm1hcChrZXkgPT4gZXh0cmFjdElkSGVscGVyKGtleSkpXG4gICAgKTtcbiAgICBjb25zdCBjc3ZTdHJpbmcgPSBnZXRDc3ZTdHJpbmcoZXh0cmFjdHJlZEZsYXRNYXAsIGV4dHJhY3RlZEhlYWRlcnMsIGlkcyk7XG5cbiAgICB3cml0ZU91dHB1dEZpbGUoY3N2U3RyaW5nLCBvdXRwdXRQYXRoKTtcbiAgfTtcblxuICByZXR1cm4ge2V4ZWN1dGV9O1xufTtcbiJdfQ==
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExportLog = void 0;
4
- const ExportLog = () => {
5
- /**
6
- * Logs output manifest in console.
7
- */
8
- const execute = async (tree, context) => {
9
- const outputFile = {
10
- ...context,
11
- tree,
12
- };
13
- console.log(JSON.stringify(outputFile, null, 2));
14
- };
15
- return { execute };
16
- };
17
- exports.ExportLog = ExportLog;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbHMvZXhwb3J0LWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFTyxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7SUFDNUI7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBUyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtRQUNwRCxNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLE9BQU87WUFDVixJQUFJO1NBQ0wsQ0FBQztRQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0lBRUYsT0FBTyxFQUFDLE9BQU8sRUFBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWRXLFFBQUEsU0FBUyxhQWNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29udGV4dH0gZnJvbSAnLi4vdHlwZXMvbWFuaWZlc3QnO1xuXG5leHBvcnQgY29uc3QgRXhwb3J0TG9nID0gKCkgPT4ge1xuICAvKipcbiAgICogTG9ncyBvdXRwdXQgbWFuaWZlc3QgaW4gY29uc29sZS5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyAodHJlZTogYW55LCBjb250ZXh0OiBDb250ZXh0KSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0RmlsZSA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICB0cmVlLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShvdXRwdXRGaWxlLCBudWxsLCAyKSk7XG4gIH07XG5cbiAgcmV0dXJuIHtleGVjdXRlfTtcbn07XG4iXX0=
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExportYaml = void 0;
4
- const yaml_1 = require("../util/yaml");
5
- const errors_1 = require("../util/errors");
6
- const { CliInputError } = errors_1.ERRORS;
7
- const ExportYaml = () => {
8
- /**
9
- * Saves output file in YAML format.
10
- */
11
- const execute = async (tree, context, outputPath) => {
12
- if (!outputPath) {
13
- throw new CliInputError('Output path is required.');
14
- }
15
- const outputFile = {
16
- ...context,
17
- tree,
18
- };
19
- await (0, yaml_1.saveYamlFileAs)(outputFile, `${outputPath}.yaml`);
20
- };
21
- return { execute };
22
- };
23
- exports.ExportYaml = ExportYaml;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LXlhbWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWxzL2V4cG9ydC15YW1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUE0QztBQUU1QywyQ0FBc0M7QUFJdEMsTUFBTSxFQUFDLGFBQWEsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUV4QixNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7SUFDN0I7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBUyxFQUFFLE9BQWdCLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1FBQ3hFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixNQUFNLElBQUksYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLE9BQU87WUFDVixJQUFJO1NBQ0wsQ0FBQztRQUVGLE1BQU0sSUFBQSxxQkFBYyxFQUFDLFVBQVUsRUFBRSxHQUFHLFVBQVUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDO0lBRUYsT0FBTyxFQUFDLE9BQU8sRUFBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWxCVyxRQUFBLFVBQVUsY0FrQnJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzYXZlWWFtbEZpbGVBc30gZnJvbSAnLi4vdXRpbC95YW1sJztcblxuaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4uL3V0aWwvZXJyb3JzJztcblxuaW1wb3J0IHtDb250ZXh0fSBmcm9tICcuLi90eXBlcy9tYW5pZmVzdCc7XG5cbmNvbnN0IHtDbGlJbnB1dEVycm9yfSA9IEVSUk9SUztcblxuZXhwb3J0IGNvbnN0IEV4cG9ydFlhbWwgPSAoKSA9PiB7XG4gIC8qKlxuICAgKiBTYXZlcyBvdXRwdXQgZmlsZSBpbiBZQU1MIGZvcm1hdC5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyAodHJlZTogYW55LCBjb250ZXh0OiBDb250ZXh0LCBvdXRwdXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW91dHB1dFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBDbGlJbnB1dEVycm9yKCdPdXRwdXQgcGF0aCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRGaWxlID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHRyZWUsXG4gICAgfTtcblxuICAgIGF3YWl0IHNhdmVZYW1sRmlsZUFzKG91dHB1dEZpbGUsIGAke291dHB1dFBhdGh9LnlhbWxgKTtcbiAgfTtcblxuICByZXR1cm4ge2V4ZWN1dGV9O1xufTtcbiJdfQ==
@@ -1,11 +0,0 @@
1
- import { PluginParams } from '../types/interface';
2
- import { GroupByConfig } from '../types/group-by';
3
- /**
4
- * Plugin for inputs grouping.
5
- */
6
- export declare const GroupBy: () => {
7
- metadata: {
8
- kind: string;
9
- };
10
- execute: (inputs: PluginParams[], config: GroupByConfig) => any;
11
- };
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GroupBy = void 0;
4
- const errors_1 = require("../util/errors");
5
- const config_1 = require("../config");
6
- const { InvalidGrouping } = errors_1.ERRORS;
7
- const { INVALID_GROUP_BY } = config_1.STRINGS;
8
- /**
9
- * Plugin for inputs grouping.
10
- */
11
- const GroupBy = () => {
12
- const metadata = {
13
- kind: 'groupby',
14
- };
15
- /**
16
- * Creates structure to insert inputs by groups.
17
- */
18
- const appendGroup = (value, object, groups) => {
19
- if (groups.length > 0) {
20
- const group = groups.shift();
21
- object.children = object.children ?? {};
22
- object.children[group] = object.children[group] ?? {};
23
- if (groups.length === 0) {
24
- if (object.children[group].inputs &&
25
- object.children[group].inputs.length > 0) {
26
- object.children[group].inputs.push(value);
27
- }
28
- else {
29
- object.children[group].inputs = [value];
30
- }
31
- }
32
- appendGroup(value, object.children[group], groups);
33
- }
34
- return object;
35
- };
36
- /**
37
- * Interates over inputs, grabs config-group types values for each one.
38
- * Based on grouping types, initializes the structure grouped structure.
39
- */
40
- const execute = (inputs, config) => inputs.reduce((acc, input) => {
41
- const groups = config.group.map(groupType => {
42
- if (!input[groupType]) {
43
- throw new InvalidGrouping(INVALID_GROUP_BY(groupType));
44
- }
45
- return input[groupType];
46
- });
47
- acc = {
48
- ...acc,
49
- ...appendGroup(input, acc, groups),
50
- };
51
- return acc;
52
- }, {}).children;
53
- return { metadata, execute };
54
- };
55
- exports.GroupBy = GroupBy;
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWxzL2dyb3VwLWJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUFzQztBQUV0QyxzQ0FBa0M7QUFLbEMsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUVqQyxNQUFNLEVBQUMsZ0JBQWdCLEVBQUMsR0FBRyxnQkFBTyxDQUFDO0FBRW5DOztHQUVHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO0lBQzFCLE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsS0FBbUIsRUFDbkIsTUFBVyxFQUNYLE1BQWdCLEVBQ1gsRUFBRTtRQUNQLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBWSxDQUFDO1lBRXZDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixJQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtvQkFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEM7b0JBQ0EsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1lBRUQsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFzQixFQUFFLE1BQXFCLEVBQUUsRUFBRSxDQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUN4RDtZQUVELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsR0FBRyxHQUFHO1lBQ0osR0FBRyxHQUFHO1lBQ04sR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUM7U0FDbkMsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUV6QixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQTNEVyxRQUFBLE9BQU8sV0EyRGxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4uL3V0aWwvZXJyb3JzJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbXBvcnQge1BsdWdpblBhcmFtc30gZnJvbSAnLi4vdHlwZXMvaW50ZXJmYWNlJztcbmltcG9ydCB7R3JvdXBCeUNvbmZpZ30gZnJvbSAnLi4vdHlwZXMvZ3JvdXAtYnknO1xuXG5jb25zdCB7SW52YWxpZEdyb3VwaW5nfSA9IEVSUk9SUztcblxuY29uc3Qge0lOVkFMSURfR1JPVVBfQll9ID0gU1RSSU5HUztcblxuLyoqXG4gKiBQbHVnaW4gZm9yIGlucHV0cyBncm91cGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdyb3VwQnkgPSAoKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIGtpbmQ6ICdncm91cGJ5JyxcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJ1Y3R1cmUgdG8gaW5zZXJ0IGlucHV0cyBieSBncm91cHMuXG4gICAqL1xuICBjb25zdCBhcHBlbmRHcm91cCA9IChcbiAgICB2YWx1ZTogUGx1Z2luUGFyYW1zLFxuICAgIG9iamVjdDogYW55LFxuICAgIGdyb3Vwczogc3RyaW5nW11cbiAgKTogYW55ID0+IHtcbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuXG4gICAgICBvYmplY3QuY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW4gPz8ge307XG4gICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdID0gb2JqZWN0LmNoaWxkcmVuW2dyb3VwXSA/PyB7fTtcblxuICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdC5jaGlsZHJlbltncm91cF0uaW5wdXRzICYmXG4gICAgICAgICAgb2JqZWN0LmNoaWxkcmVuW2dyb3VwXS5pbnB1dHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdLmlucHV0cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdLmlucHV0cyA9IFt2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBwZW5kR3JvdXAodmFsdWUsIG9iamVjdC5jaGlsZHJlbltncm91cF0sIGdyb3Vwcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcblxuICAvKipcbiAgICogSW50ZXJhdGVzIG92ZXIgaW5wdXRzLCBncmFicyBjb25maWctZ3JvdXAgdHlwZXMgdmFsdWVzIGZvciBlYWNoIG9uZS5cbiAgICogQmFzZWQgb24gZ3JvdXBpbmcgdHlwZXMsIGluaXRpYWxpemVzIHRoZSBzdHJ1Y3R1cmUgZ3JvdXBlZCBzdHJ1Y3R1cmUuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10sIGNvbmZpZzogR3JvdXBCeUNvbmZpZykgPT5cbiAgICBpbnB1dHMucmVkdWNlKChhY2MsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cHMgPSBjb25maWcuZ3JvdXAubWFwKGdyb3VwVHlwZSA9PiB7XG4gICAgICAgIGlmICghaW5wdXRbZ3JvdXBUeXBlXSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkR3JvdXBpbmcoSU5WQUxJRF9HUk9VUF9CWShncm91cFR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnB1dFtncm91cFR5cGVdO1xuICAgICAgfSk7XG5cbiAgICAgIGFjYyA9IHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICAuLi5hcHBlbmRHcm91cChpbnB1dCwgYWNjLCBncm91cHMpLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBhbnkpLmNoaWxkcmVuO1xuXG4gIHJldHVybiB7bWV0YWRhdGEsIGV4ZWN1dGV9O1xufTtcbiJdfQ==
@@ -1,304 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimeSync = void 0;
4
- const types_1 = require("node:util/types");
5
- const luxon_1 = require("luxon");
6
- const zod_1 = require("zod");
7
- const parameterize_1 = require("../lib/parameterize");
8
- const errors_1 = require("../util/errors");
9
- const config_1 = require("../config");
10
- const validations_1 = require("../util/validations");
11
- const { InputValidationError } = errors_1.ERRORS;
12
- const { INVALID_TIME_NORMALIZATION, INVALID_OBSERVATION_OVERLAP, AVOIDING_PADDING_BY_EDGES, } = config_1.STRINGS;
13
- const TimeSync = (globalConfig) => {
14
- const metadata = {
15
- kind: 'execute',
16
- };
17
- /**
18
- * Take input array and return time-synchronized input array.
19
- */
20
- const execute = (inputs) => {
21
- const validatedConfig = validateGlobalConfig();
22
- const timeParams = {
23
- startTime: luxon_1.DateTime.fromISO(validatedConfig['start-time']),
24
- endTime: luxon_1.DateTime.fromISO(validatedConfig['end-time']),
25
- interval: validatedConfig.interval,
26
- allowPadding: validatedConfig['allow-padding'],
27
- };
28
- const pad = checkForPadding(inputs, timeParams);
29
- validatePadding(pad, timeParams);
30
- const paddedInputs = padInputs(inputs, pad, timeParams);
31
- const flattenInputs = paddedInputs.reduce((acc, input, index) => {
32
- const safeInput = Object.assign({}, input, validateInput(input, index));
33
- const currentMoment = parseDate(safeInput.timestamp);
34
- /** Checks if not the first input, then check consistency with previous ones. */
35
- if (index > 0) {
36
- const previousInput = paddedInputs[index - 1];
37
- const previousInputTimestamp = parseDate(previousInput.timestamp);
38
- /** Checks for timestamps overlap. */
39
- if (parseDate(previousInput.timestamp).plus({
40
- seconds: previousInput.duration,
41
- }) > currentMoment) {
42
- throw new InputValidationError(INVALID_OBSERVATION_OVERLAP);
43
- }
44
- const compareableTime = previousInputTimestamp.plus({
45
- seconds: previousInput.duration,
46
- });
47
- const timelineGapSize = currentMoment
48
- .diff(compareableTime)
49
- .as('seconds');
50
- /** Checks if there is gap in timeline. */
51
- if (timelineGapSize > 1) {
52
- acc.push(...getZeroishInputPerSecondBetweenRange(compareableTime, currentMoment, safeInput));
53
- }
54
- }
55
- /** Break down current observation. */
56
- for (let i = 0; i < safeInput.duration; i++) {
57
- const normalizedInput = breakDownInput(safeInput, i);
58
- acc.push(normalizedInput);
59
- }
60
- return trimInputsByGlobalTimeline(acc, timeParams);
61
- }, []);
62
- const sortedInputs = flattenInputs.sort((a, b) => parseDate(a.timestamp).diff(parseDate(b.timestamp)).as('seconds'));
63
- return resampleInputs(sortedInputs, timeParams);
64
- };
65
- const parseDate = (date) => {
66
- if (!date)
67
- return luxon_1.DateTime.invalid('Invalid date');
68
- // dates are passed to time-sync.ts both in ISO 8601 format
69
- // and as a Date object (from the deserialization of a YAML file)
70
- // if the YAML parser fails to identify as a date, it passes as a string
71
- if ((0, types_1.isDate)(date)) {
72
- return luxon_1.DateTime.fromJSDate(date);
73
- }
74
- if (typeof date === 'string') {
75
- return luxon_1.DateTime.fromISO(date);
76
- }
77
- throw new InputValidationError(`Unexpected date datatype: ${typeof date}: ${date}`);
78
- };
79
- /**
80
- * Validates input parameters.
81
- */
82
- const validateInput = (input, index) => {
83
- const schema = zod_1.z.object({
84
- timestamp: zod_1.z
85
- .string({
86
- required_error: `required in input[${index}]`,
87
- })
88
- .datetime({
89
- message: `invalid datetime in input[${index}]`,
90
- })
91
- .or(zod_1.z.date()),
92
- duration: zod_1.z.number(),
93
- });
94
- return (0, validations_1.validate)(schema, input);
95
- };
96
- /**
97
- * Validates global config parameters.
98
- */
99
- const validateGlobalConfig = () => {
100
- if (globalConfig === undefined) {
101
- throw new InputValidationError(INVALID_TIME_NORMALIZATION);
102
- }
103
- const schema = zod_1.z
104
- .object({
105
- 'start-time': zod_1.z.string().datetime(),
106
- 'end-time': zod_1.z.string().datetime(),
107
- interval: zod_1.z.number(),
108
- 'allow-padding': zod_1.z.boolean(),
109
- })
110
- .refine(data => data['start-time'] < data['end-time'], {
111
- message: '`start-time` should be lower than `end-time`',
112
- });
113
- return (0, validations_1.validate)(schema, globalConfig);
114
- };
115
- /**
116
- * Calculates minimal factor.
117
- */
118
- const convertPerInterval = (value, duration) => value / duration;
119
- /**
120
- * Normalize time per given second.
121
- */
122
- const normalizeTimePerSecond = (currentRoundMoment, i) => {
123
- const thisMoment = parseDate(currentRoundMoment).startOf('second');
124
- return thisMoment.plus({ seconds: i });
125
- };
126
- /**
127
- * Breaks down input per minimal time unit.
128
- */
129
- const breakDownInput = (input, i) => {
130
- const inputKeys = Object.keys(input);
131
- return inputKeys.reduce((acc, key) => {
132
- const method = parameterize_1.parameterize.getAggregationMethod(key);
133
- if (key === 'timestamp') {
134
- const perSecond = normalizeTimePerSecond(input.timestamp, i);
135
- acc[key] = perSecond.toUTC().toISO() ?? '';
136
- return acc;
137
- }
138
- /** @todo use user defined resolution later */
139
- if (key === 'duration') {
140
- acc[key] = 1;
141
- return acc;
142
- }
143
- acc[key] =
144
- method === 'sum'
145
- ? convertPerInterval(input[key], input['duration'])
146
- : input[key];
147
- return acc;
148
- }, {});
149
- };
150
- /**
151
- * Populates object to fill the gaps in observational timeline using zeroish values.
152
- */
153
- const fillWithZeroishInput = (input, missingTimestamp) => {
154
- const metrics = Object.keys(input);
155
- return metrics.reduce((acc, metric) => {
156
- if (metric === 'timestamp') {
157
- acc[metric] = missingTimestamp.startOf('second').toUTC().toISO() ?? '';
158
- return acc;
159
- }
160
- /** @todo later will be changed to user defined interval */
161
- if (metric === 'duration') {
162
- acc[metric] = 1;
163
- return acc;
164
- }
165
- if (metric === 'time-reserved') {
166
- acc[metric] = acc['duration'];
167
- return acc;
168
- }
169
- const method = parameterize_1.parameterize.getAggregationMethod(metric);
170
- if (method === 'avg' || method === 'sum') {
171
- acc[metric] = 0;
172
- return acc;
173
- }
174
- acc[metric] = input[metric];
175
- return acc;
176
- }, {});
177
- };
178
- /**
179
- * Checks if `error on padding` is enabled and padding is needed. If so, then throws error.
180
- */
181
- const validatePadding = (pad, params) => {
182
- const { start, end } = pad;
183
- const isPaddingNeeded = start || end;
184
- if (!params.allowPadding && isPaddingNeeded) {
185
- throw new InputValidationError(AVOIDING_PADDING_BY_EDGES(start, end));
186
- }
187
- };
188
- /**
189
- * Checks if padding is needed either at start of the timeline or the end and returns status.
190
- */
191
- const checkForPadding = (inputs, params) => {
192
- const startDiffInSeconds = parseDate(inputs[0].timestamp)
193
- .diff(params.startTime)
194
- .as('seconds');
195
- const lastInput = inputs[inputs.length - 1];
196
- const endDiffInSeconds = parseDate(lastInput.timestamp)
197
- .plus({ second: lastInput.duration })
198
- .diff(params.endTime)
199
- .as('seconds');
200
- return {
201
- start: startDiffInSeconds > 0,
202
- end: endDiffInSeconds < 0,
203
- };
204
- };
205
- /**
206
- * Iterates over given inputs frame, meanwhile checking if aggregation method is `sum`, then calculates it.
207
- * For methods is `avg` and `none` calculating average of the frame.
208
- */
209
- const resampleInputFrame = (inputsInTimeslot) => {
210
- return inputsInTimeslot.reduce((acc, input, index, inputs) => {
211
- const metrics = Object.keys(input);
212
- metrics.forEach(metric => {
213
- const method = parameterize_1.parameterize.getAggregationMethod(metric);
214
- acc[metric] = acc[metric] ?? 0;
215
- if (metric === 'timestamp') {
216
- acc[metric] = inputs[0][metric];
217
- return;
218
- }
219
- if (method === 'sum') {
220
- acc[metric] += input[metric];
221
- return;
222
- }
223
- if (method === 'none') {
224
- acc[metric] = input[metric];
225
- return;
226
- }
227
- /**
228
- * If timeslot contains records more than one, then divide each metric by the timeslot length,
229
- * so that their sum yields the timeslot average.
230
- */
231
- if (inputsInTimeslot.length > 1 &&
232
- index === inputsInTimeslot.length - 1) {
233
- acc[metric] /= inputsInTimeslot.length;
234
- return;
235
- }
236
- acc[metric] += input[metric];
237
- });
238
- return acc;
239
- }, {});
240
- };
241
- /**
242
- * Takes each array frame with interval length, then aggregating them together as from units.yaml file.
243
- */
244
- const resampleInputs = (inputs, params) => {
245
- return inputs.reduce((acc, _input, index, inputs) => {
246
- const frameStart = index * params.interval;
247
- const frameEnd = (index + 1) * params.interval;
248
- const inputsFrame = inputs.slice(frameStart, frameEnd);
249
- const resampledInput = resampleInputFrame(inputsFrame);
250
- /** Checks if resampled input is not empty, then includes in result. */
251
- if (Object.keys(resampledInput).length > 0) {
252
- acc.push(resampledInput);
253
- }
254
- return acc;
255
- }, []);
256
- };
257
- /**
258
- * Pads zeroish inputs from the beginning or at the end of the inputs if needed.
259
- */
260
- const padInputs = (inputs, pad, params) => {
261
- const { start, end } = pad;
262
- const paddedFromBeginning = [];
263
- if (start) {
264
- paddedFromBeginning.push(...getZeroishInputPerSecondBetweenRange(params.startTime, parseDate(inputs[0].timestamp), inputs[0]));
265
- }
266
- const paddedArray = paddedFromBeginning.concat(inputs);
267
- if (end) {
268
- const lastInput = inputs[inputs.length - 1];
269
- const lastInputEnd = parseDate(lastInput.timestamp).plus({
270
- seconds: lastInput.duration,
271
- });
272
- paddedArray.push(...getZeroishInputPerSecondBetweenRange(lastInputEnd, params.endTime.plus({ seconds: 1 }), lastInput));
273
- }
274
- return paddedArray;
275
- };
276
- const getZeroishInputPerSecondBetweenRange = (startDate, endDate, templateInput) => {
277
- const array = [];
278
- const dateRange = luxon_1.Interval.fromDateTimes(startDate, endDate);
279
- for (const interval of dateRange.splitBy({ second: 1 })) {
280
- array.push(fillWithZeroishInput(templateInput,
281
- // as far as I can tell, start will never be null
282
- // because if we pass an invalid start/endDate to
283
- // Interval, we get a zero length array as the range
284
- interval.start || luxon_1.DateTime.invalid('not expected - start is null')));
285
- }
286
- return array;
287
- };
288
- /*
289
- * Checks if input's timestamp is included in global specified period then leaves it, otherwise.
290
- */
291
- const trimInputsByGlobalTimeline = (inputs, params) => {
292
- return inputs.reduce((acc, item) => {
293
- const { timestamp } = item;
294
- if (parseDate(timestamp) >= params.startTime &&
295
- parseDate(timestamp) <= params.endTime) {
296
- acc.push(item);
297
- }
298
- return acc;
299
- }, []);
300
- };
301
- return { metadata, execute };
302
- };
303
- exports.TimeSync = TimeSync;
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy90aW1lLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLGlDQUE2RDtBQUM3RCw2QkFBc0I7QUFFdEIsc0RBQWlEO0FBRWpELDJDQUFzQztBQUV0QyxzQ0FBa0M7QUFTbEMscURBQTZDO0FBRTdDLE1BQU0sRUFBQyxvQkFBb0IsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUV0QyxNQUFNLEVBQ0osMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQix5QkFBeUIsR0FDMUIsR0FBRyxnQkFBTyxDQUFDO0FBRUwsTUFBTSxRQUFRLEdBQUcsQ0FDdEIsWUFBa0MsRUFDakIsRUFBRTtJQUNuQixNQUFNLFFBQVEsR0FBRztRQUNmLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBc0IsRUFBa0IsRUFBRTtRQUN6RCxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLFNBQVMsRUFBRSxnQkFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLGdCQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RCxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7WUFDbEMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxlQUFlLENBQUM7U0FDL0MsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsZUFBZSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqQyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV4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LENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRTtZQUNyRCxLQUFLLENBQUMsSUFBSSxDQUNSLG9CQUFvQixDQUNsQixhQUFhO1lBQ2IsaURBQWlEO1lBQ2pELGlEQUFpRDtZQUNqRCxvREFBb0Q7WUFDcEQsUUFBUSxDQUFDLEtBQUssSUFBSSxnQkFBUSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUNuRSxDQUNGLENBQUM7U0FDSDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLDBCQUEwQixHQUFHLENBQ2pDLE1BQXNCLEVBQ3RCLE1BQWtCLEVBQ0YsRUFBRTtRQUNsQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFtQixFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2pELE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxJQUFJLENBQUM7WUFFekIsSUFDRSxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVM7Z0JBQ3hDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUN0QztnQkFDQSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hCO1lBRUQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBb0IsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQztJQUVGLE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBaGFXLFFBQUEsUUFBUSxZQWdhbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzRGF0ZX0gZnJvbSAnbm9kZTp1dGlsL3R5cGVzJztcbmltcG9ydCB7RGF0ZVRpbWUsIERhdGVUaW1lTWF5YmVWYWxpZCwgSW50ZXJ2YWx9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtwYXJhbWV0ZXJpemV9IGZyb20gJy4uL2xpYi9wYXJhbWV0ZXJpemUnO1xuXG5pbXBvcnQge0VSUk9SU30gZnJvbSAnLi4vdXRpbC9lcnJvcnMnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7UGx1Z2luUGFyYW1zfSBmcm9tICcuLi90eXBlcy9pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgUGFkZGluZ1JlY2VpcHQsXG4gIFRpbWVOb3JtYWxpemVyQ29uZmlnLFxuICBUaW1lUGFyYW1zLFxufSBmcm9tICcuLi90eXBlcy90aW1lLXN5bmMnO1xuaW1wb3J0IHtQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uL3R5cGVzL2ludGVyZmFjZSc7XG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi91dGlsL3ZhbGlkYXRpb25zJztcblxuY29uc3Qge0lucHV0VmFsaWRhdGlvbkVycm9yfSA9IEVSUk9SUztcblxuY29uc3Qge1xuICBJTlZBTElEX1RJTUVfTk9STUFMSVpBVElPTixcbiAgSU5WQUxJRF9PQlNFUlZBVElPTl9PVkVSTEFQLFxuICBBVk9JRElOR19QQURESU5HX0JZX0VER0VTLFxufSA9IFNUUklOR1M7XG5cbmV4cG9ydCBjb25zdCBUaW1lU3luYyA9IChcbiAgZ2xvYmFsQ29uZmlnOiBUaW1lTm9ybWFsaXplckNvbmZpZ1xuKTogUGx1Z2luSW50ZXJmYWNlID0+IHtcbiAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAga2luZDogJ2V4ZWN1dGUnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlIGlucHV0IGFycmF5IGFuZCByZXR1cm4gdGltZS1zeW5jaHJvbml6ZWQgaW5wdXQgYXJyYXkuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdGVkQ29uZmlnID0gdmFsaWRhdGVHbG9iYWxDb25maWcoKTtcbiAgICBjb25zdCB0aW1lUGFyYW1zID0ge1xuICAgICAgc3RhcnRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKHZhbGlkYXRlZENvbmZpZ1snc3RhcnQtdGltZSddKSxcbiAgICAgIGVuZFRpbWU6IERhdGVUaW1lLmZyb21JU08odmFsaWRhdGVkQ29uZmlnWydlbmQtdGltZSddKSxcbiAgICAgIGludGVydmFsOiB2YWxpZGF0ZWRDb25maWcuaW50ZXJ2YWwsXG4gICAgICBhbGxvd1BhZGRpbmc6IHZhbGlkYXRlZENvbmZpZ1snYWxsb3ctcGFkZGluZyddLFxuICAgIH07XG5cbiAgICBjb25zdCBwYWQgPSBjaGVja0ZvclBhZGRpbmcoaW5wdXRzLCB0aW1lUGFyYW1zKTtcbiAgICB2YWxpZGF0ZVBhZGRpbmcocGFkLCB0aW1lUGFyYW1zKTtcblxuICAgIGNvbnN0IHBhZGRlZElucHV0cyA9IHBhZElucHV0cyhpbnB1dHMsIHBhZCwgdGltZVBhcmFtcyk7XG5cbiAgICBjb25zdCBmbGF0dGVuSW5wdXRzID0gcGFkZGVkSW5wdXRzLnJlZHVjZShcbiAgICAgIChhY2M6IFBsdWdpblBhcmFtc1tdLCBpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZUlucHV0ID0gT2JqZWN0LmFzc2lnbih7fSwgaW5wdXQsIHZhbGlkYXRlSW5wdXQoaW5wdXQsIGluZGV4KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb21lbnQgPSBwYXJzZURhdGUoc2FmZUlucHV0LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiBub3QgdGhlIGZpcnN0IGlucHV0LCB0aGVuIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggcHJldmlvdXMgb25lcy4gKi9cbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXQgPSBwYWRkZWRJbnB1dHNbaW5kZXggLSAxXTtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0lucHV0VGltZXN0YW1wID0gcGFyc2VEYXRlKHByZXZpb3VzSW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAgIC8qKiBDaGVja3MgZm9yIHRpbWVzdGFtcHMgb3ZlcmxhcC4gKi9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICAgICAgICBzZWNvbmRzOiBwcmV2aW91c0lucHV0LmR1cmF0aW9uLFxuICAgICAgICAgICAgfSkgPiBjdXJyZW50TW9tZW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW5wdXRWYWxpZGF0aW9uRXJyb3IoSU5WQUxJRF9PQlNFUlZBVElPTl9PVkVSTEFQKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21wYXJlYWJsZVRpbWUgPSBwcmV2aW91c0lucHV0VGltZXN0YW1wLnBsdXMoe1xuICAgICAgICAgICAgc2Vjb25kczogcHJldmlvdXNJbnB1dC5kdXJhdGlvbixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRpbWVsaW5lR2FwU2l6ZSA9IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICAgIC5kaWZmKGNvbXBhcmVhYmxlVGltZSlcbiAgICAgICAgICAgIC5hcygnc2Vjb25kcycpO1xuXG4gICAgICAgICAgLyoqIENoZWNrcyBpZiB0aGVyZSBpcyBnYXAgaW4gdGltZWxpbmUuICovXG4gICAgICAgICAgaWYgKHRpbWVsaW5lR2FwU2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKFxuICAgICAgICAgICAgICAuLi5nZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UoXG4gICAgICAgICAgICAgICAgY29tcGFyZWFibGVUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRNb21lbnQsXG4gICAgICAgICAgICAgICAgc2FmZUlucHV0XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBCcmVhayBkb3duIGN1cnJlbnQgb2JzZXJ2YXRpb24uICovXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FmZUlucHV0LmR1cmF0aW9uOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkSW5wdXQgPSBicmVha0Rvd25JbnB1dChzYWZlSW5wdXQsIGkpO1xuXG4gICAgICAgICAgYWNjLnB1c2gobm9ybWFsaXplZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZShhY2MsIHRpbWVQYXJhbXMpO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIFBsdWdpblBhcmFtc1tdXG4gICAgKTtcblxuICAgIGNvbnN0IHNvcnRlZElucHV0cyA9IGZsYXR0ZW5JbnB1dHMuc29ydCgoYSwgYikgPT5cbiAgICAgIHBhcnNlRGF0ZShhLnRpbWVzdGFtcCkuZGlmZihwYXJzZURhdGUoYi50aW1lc3RhbXApKS5hcygnc2Vjb25kcycpXG4gICAgKTtcblxuICAgIHJldHVybiByZXNhbXBsZUlucHV0cyhzb3J0ZWRJbnB1dHMsIHRpbWVQYXJhbXMpIGFzIFBsdWdpblBhcmFtc1tdO1xuICB9O1xuXG4gIGNvbnN0IHBhcnNlRGF0ZSA9IChkYXRlOiBEYXRlIHwgc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBkYXRlJyk7XG4gICAgLy8gZGF0ZXMgYXJlIHBhc3NlZCB0byB0aW1lLXN5bmMudHMgYm90aCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAvLyBhbmQgYXMgYSBEYXRlIG9iamVjdCAoZnJvbSB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgWUFNTCBmaWxlKVxuICAgIC8vIGlmIHRoZSBZQU1MIHBhcnNlciBmYWlscyB0byBpZGVudGlmeSBhcyBhIGRhdGUsIGl0IHBhc3NlcyBhcyBhIHN0cmluZ1xuICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUlTTyhkYXRlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZGF0ZSBkYXRhdHlwZTogJHt0eXBlb2YgZGF0ZX06ICR7ZGF0ZX1gXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlucHV0IHBhcmFtZXRlcnMuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZUlucHV0ID0gKGlucHV0OiBQbHVnaW5QYXJhbXMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICB0aW1lc3RhbXA6IHpcbiAgICAgICAgLnN0cmluZyh7XG4gICAgICAgICAgcmVxdWlyZWRfZXJyb3I6IGByZXF1aXJlZCBpbiBpbnB1dFske2luZGV4fV1gLFxuICAgICAgICB9KVxuICAgICAgICAuZGF0ZXRpbWUoe1xuICAgICAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkIGRhdGV0aW1lIGluIGlucHV0WyR7aW5kZXh9XWAsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcih6LmRhdGUoKSksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0KTtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIGdsb2JhbCBjb25maWcgcGFyYW1ldGVycy5cbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlR2xvYmFsQ29uZmlnID0gKCkgPT4ge1xuICAgIGlmIChnbG9iYWxDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKElOVkFMSURfVElNRV9OT1JNQUxJWkFUSU9OKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3N0YXJ0LXRpbWUnOiB6LnN0cmluZygpLmRhdGV0aW1lKCksXG4gICAgICAgICdlbmQtdGltZSc6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKSxcbiAgICAgICAgaW50ZXJ2YWw6IHoubnVtYmVyKCksXG4gICAgICAgICdhbGxvdy1wYWRkaW5nJzogei5ib29sZWFuKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ3N0YXJ0LXRpbWUnXSA8IGRhdGFbJ2VuZC10aW1lJ10sIHtcbiAgICAgICAgbWVzc2FnZTogJ2BzdGFydC10aW1lYCBzaG91bGQgYmUgbG93ZXIgdGhhbiBgZW5kLXRpbWVgJyxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgZ2xvYmFsQ29uZmlnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBtaW5pbWFsIGZhY3Rvci5cbiAgICovXG4gIGNvbnN0IGNvbnZlcnRQZXJJbnRlcnZhbCA9ICh2YWx1ZTogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyKSA9PlxuICAgIHZhbHVlIC8gZHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSB0aW1lIHBlciBnaXZlbiBzZWNvbmQuXG4gICAqL1xuICBjb25zdCBub3JtYWxpemVUaW1lUGVyU2Vjb25kID0gKFxuICAgIGN1cnJlbnRSb3VuZE1vbWVudDogRGF0ZSB8IHN0cmluZyxcbiAgICBpOiBudW1iZXJcbiAgKSA9PiB7XG4gICAgY29uc3QgdGhpc01vbWVudCA9IHBhcnNlRGF0ZShjdXJyZW50Um91bmRNb21lbnQpLnN0YXJ0T2YoJ3NlY29uZCcpO1xuICAgIHJldHVybiB0aGlzTW9tZW50LnBsdXMoe3NlY29uZHM6IGl9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEJyZWFrcyBkb3duIGlucHV0IHBlciBtaW5pbWFsIHRpbWUgdW5pdC5cbiAgICovXG4gIGNvbnN0IGJyZWFrRG93bklucHV0ID0gKGlucHV0OiBQbHVnaW5QYXJhbXMsIGk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGlucHV0S2V5cyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgIHJldHVybiBpbnB1dEtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gcGFyYW1ldGVyaXplLmdldEFnZ3JlZ2F0aW9uTWV0aG9kKGtleSk7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgIGNvbnN0IHBlclNlY29uZCA9IG5vcm1hbGl6ZVRpbWVQZXJTZWNvbmQoaW5wdXQudGltZXN0YW1wLCBpKTtcbiAgICAgICAgYWNjW2tleV0gPSBwZXJTZWNvbmQudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIC8qKiBAdG9kbyB1c2UgdXNlciBkZWZpbmVkIHJlc29sdXRpb24gbGF0ZXIgKi9cbiAgICAgIGlmIChrZXkgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgICAgYWNjW2tleV0gPSAxO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGFjY1trZXldID1cbiAgICAgICAgbWV0aG9kID09PSAnc3VtJ1xuICAgICAgICAgID8gY29udmVydFBlckludGVydmFsKGlucHV0W2tleV0sIGlucHV0WydkdXJhdGlvbiddKVxuICAgICAgICAgIDogaW5wdXRba2V5XTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgb2JqZWN0IHRvIGZpbGwgdGhlIGdhcHMgaW4gb2JzZXJ2YXRpb25hbCB0aW1lbGluZSB1c2luZyB6ZXJvaXNoIHZhbHVlcy5cbiAgICovXG4gIGNvbnN0IGZpbGxXaXRoWmVyb2lzaElucHV0ID0gKFxuICAgIGlucHV0OiBQbHVnaW5QYXJhbXMsXG4gICAgbWlzc2luZ1RpbWVzdGFtcDogRGF0ZVRpbWVNYXliZVZhbGlkXG4gICkgPT4ge1xuICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG5cbiAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICBpZiAobWV0cmljID09PSAndGltZXN0YW1wJykge1xuICAgICAgICBhY2NbbWV0cmljXSA9IG1pc3NpbmdUaW1lc3RhbXAuc3RhcnRPZignc2Vjb25kJykudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIC8qKiBAdG9kbyBsYXRlciB3aWxsIGJlIGNoYW5nZWQgdG8gdXNlciBkZWZpbmVkIGludGVydmFsICovXG4gICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgIGFjY1ttZXRyaWNdID0gMTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0cmljID09PSAndGltZS1yZXNlcnZlZCcpIHtcbiAgICAgICAgYWNjW21ldHJpY10gPSBhY2NbJ2R1cmF0aW9uJ107XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kID0gcGFyYW1ldGVyaXplLmdldEFnZ3JlZ2F0aW9uTWV0aG9kKG1ldHJpYyk7XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdhdmcnIHx8IG1ldGhvZCA9PT0gJ3N1bScpIHtcbiAgICAgICAgYWNjW21ldHJpY10gPSAwO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYGVycm9yIG9uIHBhZGRpbmdgIGlzIGVuYWJsZWQgYW5kIHBhZGRpbmcgaXMgbmVlZGVkLiBJZiBzbywgdGhlbiB0aHJvd3MgZXJyb3IuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgY29uc3Qge3N0YXJ0LCBlbmR9ID0gcGFkO1xuICAgIGNvbnN0IGlzUGFkZGluZ05lZWRlZCA9IHN0YXJ0IHx8IGVuZDtcbiAgICBpZiAoIXBhcmFtcy5hbGxvd1BhZGRpbmcgJiYgaXNQYWRkaW5nTmVlZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW5wdXRWYWxpZGF0aW9uRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcGFkZGluZyBpcyBuZWVkZWQgZWl0aGVyIGF0IHN0YXJ0IG9mIHRoZSB0aW1lbGluZSBvciB0aGUgZW5kIGFuZCByZXR1cm5zIHN0YXR1cy5cbiAgICovXG4gIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhcmFtczogVGltZVBhcmFtc1xuICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgY29uc3Qgc3RhcnREaWZmSW5TZWNvbmRzID0gcGFyc2VEYXRlKGlucHV0c1swXS50aW1lc3RhbXApXG4gICAgICAuZGlmZihwYXJhbXMuc3RhcnRUaW1lKVxuICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuXG4gICAgY29uc3QgZW5kRGlmZkluU2Vjb25kcyA9IHBhcnNlRGF0ZShsYXN0SW5wdXQudGltZXN0YW1wKVxuICAgICAgLnBsdXMoe3NlY29uZDogbGFzdElucHV0LmR1cmF0aW9ufSlcbiAgICAgIC5kaWZmKHBhcmFtcy5lbmRUaW1lKVxuICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICBlbmQ6IGVuZERpZmZJblNlY29uZHMgPCAwLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZ2l2ZW4gaW5wdXRzIGZyYW1lLCBtZWFud2hpbGUgY2hlY2tpbmcgaWYgYWdncmVnYXRpb24gbWV0aG9kIGlzIGBzdW1gLCB0aGVuIGNhbGN1bGF0ZXMgaXQuXG4gICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBjb25zdCByZXNhbXBsZUlucHV0RnJhbWUgPSAoaW5wdXRzSW5UaW1lc2xvdDogUGx1Z2luUGFyYW1zW10pID0+IHtcbiAgICByZXR1cm4gaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG5cbiAgICAgIG1ldHJpY3MuZm9yRWFjaChtZXRyaWMgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBwYXJhbWV0ZXJpemUuZ2V0QWdncmVnYXRpb25NZXRob2QobWV0cmljKTtcbiAgICAgICAgYWNjW21ldHJpY10gPSBhY2NbbWV0cmljXSA/PyAwO1xuXG4gICAgICAgIGlmIChtZXRyaWMgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBpbnB1dHNbMF1bbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdzdW0nKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aW1lc2xvdCBjb250YWlucyByZWNvcmRzIG1vcmUgdGhhbiBvbmUsIHRoZW4gZGl2aWRlIGVhY2ggbWV0cmljIGJ5IHRoZSB0aW1lc2xvdCBsZW5ndGgsXG4gICAgICAgICAqICBzbyB0aGF0IHRoZWlyIHN1bSB5aWVsZHMgdGhlIHRpbWVzbG90IGF2ZXJhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5wdXRzSW5UaW1lc2xvdC5sZW5ndGggPiAxICYmXG4gICAgICAgICAgaW5kZXggPT09IGlucHV0c0luVGltZXNsb3QubGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSAvPSBpbnB1dHNJblRpbWVzbG90Lmxlbmd0aDtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjY1ttZXRyaWNdICs9IGlucHV0W21ldHJpY107XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlcyBlYWNoIGFycmF5IGZyYW1lIHdpdGggaW50ZXJ2YWwgbGVuZ3RoLCB0aGVuIGFnZ3JlZ2F0aW5nIHRoZW0gdG9nZXRoZXIgYXMgZnJvbSB1bml0cy55YW1sIGZpbGUuXG4gICAqL1xuICBjb25zdCByZXNhbXBsZUlucHV0cyA9IChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBwYXJhbXM6IFRpbWVQYXJhbXMpID0+IHtcbiAgICByZXR1cm4gaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgX2lucHV0LCBpbmRleCwgaW5wdXRzKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZVN0YXJ0ID0gaW5kZXggKiBwYXJhbXMuaW50ZXJ2YWw7XG4gICAgICBjb25zdCBmcmFtZUVuZCA9IChpbmRleCArIDEpICogcGFyYW1zLmludGVydmFsO1xuICAgICAgY29uc3QgaW5wdXRzRnJhbWUgPSBpbnB1dHMuc2xpY2UoZnJhbWVTdGFydCwgZnJhbWVFbmQpO1xuXG4gICAgICBjb25zdCByZXNhbXBsZWRJbnB1dCA9IHJlc2FtcGxlSW5wdXRGcmFtZShpbnB1dHNGcmFtZSk7XG5cbiAgICAgIC8qKiBDaGVja3MgaWYgcmVzYW1wbGVkIGlucHV0IGlzIG5vdCBlbXB0eSwgdGhlbiBpbmNsdWRlcyBpbiByZXN1bHQuICovXG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVzYW1wbGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWNjLnB1c2gocmVzYW1wbGVkSW5wdXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIFBsdWdpblBhcmFtc1tdKTtcbiAgfTtcblxuICAvKipcbiAgICogUGFkcyB6ZXJvaXNoIGlucHV0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXRzIGlmIG5lZWRlZC5cbiAgICovXG4gIGNvbnN0IHBhZElucHV0cyA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhZDogUGFkZGluZ1JlY2VpcHQsXG4gICAgcGFyYW1zOiBUaW1lUGFyYW1zXG4gICk6IFBsdWdpblBhcmFtc1tdID0+IHtcbiAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgY29uc3QgcGFkZGVkRnJvbUJlZ2lubmluZyA9IFtdO1xuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBwYWRkZWRGcm9tQmVnaW5uaW5nLnB1c2goXG4gICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICBwYXJhbXMuc3RhcnRUaW1lLFxuICAgICAgICAgIHBhcnNlRGF0ZShpbnB1dHNbMF0udGltZXN0YW1wKSxcbiAgICAgICAgICBpbnB1dHNbMF1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWRkZWRBcnJheSA9IHBhZGRlZEZyb21CZWdpbm5pbmcuY29uY2F0KGlucHV0cyk7XG5cbiAgICBpZiAoZW5kKSB7XG4gICAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbGFzdElucHV0RW5kID0gcGFyc2VEYXRlKGxhc3RJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICBzZWNvbmRzOiBsYXN0SW5wdXQuZHVyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIHBhZGRlZEFycmF5LnB1c2goXG4gICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICBsYXN0SW5wdXRFbmQsXG4gICAgICAgICAgcGFyYW1zLmVuZFRpbWUucGx1cyh7c2Vjb25kczogMX0pLFxuICAgICAgICAgIGxhc3RJbnB1dFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGVkQXJyYXk7XG4gIH07XG5cbiAgY29uc3QgZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlID0gKFxuICAgIHN0YXJ0RGF0ZTogRGF0ZVRpbWVNYXliZVZhbGlkLFxuICAgIGVuZERhdGU6IERhdGVUaW1lTWF5YmVWYWxpZCxcbiAgICB0ZW1wbGF0ZUlucHV0OiBQbHVnaW5QYXJhbXNcbiAgKSA9PiB7XG4gICAgY29uc3QgYXJyYXk6IFBsdWdpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgZGF0ZVJhbmdlID0gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIGZvciAoY29uc3QgaW50ZXJ2YWwgb2YgZGF0ZVJhbmdlLnNwbGl0Qnkoe3NlY29uZDogMX0pKSB7XG4gICAgICBhcnJheS5wdXNoKFxuICAgICAgICBmaWxsV2l0aFplcm9pc2hJbnB1dChcbiAgICAgICAgICB0ZW1wbGF0ZUlucHV0LFxuICAgICAgICAgIC8vIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBzdGFydCB3aWxsIG5ldmVyIGJlIG51bGxcbiAgICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIHBhc3MgYW4gaW52YWxpZCBzdGFydC9lbmREYXRlIHRvXG4gICAgICAgICAgLy8gSW50ZXJ2YWwsIHdlIGdldCBhIHplcm8gbGVuZ3RoIGFycmF5IGFzIHRoZSByYW5nZVxuICAgICAgICAgIGludGVydmFsLnN0YXJ0IHx8IERhdGVUaW1lLmludmFsaWQoJ25vdCBleHBlY3RlZCAtIHN0YXJ0IGlzIG51bGwnKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH07XG5cbiAgLypcbiAgICogQ2hlY2tzIGlmIGlucHV0J3MgdGltZXN0YW1wIGlzIGluY2x1ZGVkIGluIGdsb2JhbCBzcGVjaWZpZWQgcGVyaW9kIHRoZW4gbGVhdmVzIGl0LCBvdGhlcndpc2UuXG4gICAqL1xuICBjb25zdCB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZSA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhcmFtczogVGltZVBhcmFtc1xuICApOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgcmV0dXJuIGlucHV0cy5yZWR1Y2UoKGFjYzogUGx1Z2luUGFyYW1zW10sIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHt0aW1lc3RhbXB9ID0gaXRlbTtcblxuICAgICAgaWYgKFxuICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA+PSBwYXJhbXMuc3RhcnRUaW1lICYmXG4gICAgICAgIHBhcnNlRGF0ZSh0aW1lc3RhbXApIDw9IHBhcmFtcy5lbmRUaW1lXG4gICAgICApIHtcbiAgICAgICAgYWNjLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgUGx1Z2luUGFyYW1zW10pO1xuICB9O1xuXG4gIHJldHVybiB7bWV0YWRhdGEsIGV4ZWN1dGV9O1xufTtcbiJdfQ==
@@ -1,4 +0,0 @@
1
- import { PluginInterface } from './interface';
2
- export type PluginsStorage = {
3
- [key: string]: PluginInterface;
4
- };
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9pbml0aWFsaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BsdWdpbkludGVyZmFjZX0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5leHBvcnQgdHlwZSBQbHVnaW5zU3RvcmFnZSA9IHtcbiAgW2tleTogc3RyaW5nXTogUGx1Z2luSW50ZXJmYWNlO1xufTtcbiJdfQ==