@grnsft/if 0.7.0 → 0.7.2
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/build/common/config/index.d.ts +1 -0
- package/build/common/config/index.js +6 -0
- package/build/common/config/strings.d.ts +13 -0
- package/build/common/config/strings.js +21 -0
- package/build/common/lib/load.d.ts +6 -0
- package/build/common/lib/load.js +18 -0
- package/build/common/types/manifest.d.ts +13 -0
- package/build/common/types/manifest.js +3 -0
- package/build/common/util/debug-logger.d.ts +4 -0
- package/build/common/util/debug-logger.js +124 -0
- package/build/common/util/fs.d.ts +20 -0
- package/build/common/util/fs.js +94 -0
- package/build/common/util/helpers.d.ts +15 -0
- package/build/common/util/helpers.js +80 -0
- package/build/common/util/logger.d.ts +5 -0
- package/build/common/util/logger.js +39 -0
- package/build/common/util/validations.d.ts +465 -0
- package/build/common/util/validations.js +148 -0
- package/build/common/util/yaml.d.ts +12 -0
- package/build/common/util/yaml.js +59 -0
- package/build/if-check/config/config.d.ts +6 -0
- package/build/if-check/config/config.js +31 -0
- package/build/if-check/config/index.d.ts +2 -0
- package/build/if-check/config/index.js +8 -0
- package/build/if-check/config/strings.d.ts +11 -0
- package/build/if-check/config/strings.js +15 -0
- package/build/if-check/index.d.ts +2 -0
- package/build/if-check/index.js +98 -0
- package/build/if-check/types/process-args.d.ts +4 -0
- package/build/if-check/types/process-args.js +3 -0
- package/build/if-check/util/args.d.ts +10 -0
- package/build/if-check/util/args.js +56 -0
- package/build/if-check/util/helpers.d.ts +4 -0
- package/build/if-check/util/helpers.js +18 -0
- package/build/if-check/util/npm.d.ts +4 -0
- package/build/if-check/util/npm.js +59 -0
- package/build/if-csv/config/config.d.ts +6 -0
- package/build/if-csv/config/config.js +36 -0
- package/build/if-csv/config/index.d.ts +2 -0
- package/build/if-csv/config/index.js +8 -0
- package/build/if-csv/config/strings.d.ts +3 -0
- package/build/if-csv/config/strings.js +7 -0
- package/build/if-csv/index.d.ts +2 -0
- package/build/if-csv/index.js +63 -0
- package/build/if-csv/types/csv.d.ts +7 -0
- package/build/if-csv/types/csv.js +3 -0
- package/build/if-csv/types/process-args.d.ts +5 -0
- package/build/if-csv/types/process-args.js +3 -0
- package/build/if-csv/util/args.d.ts +12 -0
- package/build/if-csv/util/args.js +47 -0
- package/build/if-csv/util/helpers.d.ts +9 -0
- package/build/if-csv/util/helpers.js +95 -0
- package/build/if-diff/config/config.d.ts +6 -0
- package/build/if-diff/config/config.js +31 -0
- package/build/if-diff/config/index.d.ts +2 -0
- package/build/if-diff/config/index.js +8 -0
- package/build/if-diff/config/strings.d.ts +6 -0
- package/build/if-diff/config/strings.js +10 -0
- package/build/if-diff/index.d.ts +2 -0
- package/build/if-diff/index.js +46 -0
- package/build/if-diff/lib/compare.d.ts +10 -0
- package/build/if-diff/lib/compare.js +56 -0
- package/build/if-diff/lib/load.d.ts +63 -0
- package/build/if-diff/lib/load.js +51 -0
- package/build/if-diff/types/args.d.ts +5 -0
- package/build/if-diff/types/args.js +3 -0
- package/build/if-diff/types/compare.d.ts +7 -0
- package/build/if-diff/types/compare.js +3 -0
- package/build/if-diff/types/process-args.d.ts +4 -0
- package/build/if-diff/types/process-args.js +3 -0
- package/build/if-diff/util/args.d.ts +5 -0
- package/build/if-diff/util/args.js +51 -0
- package/build/if-diff/util/helpers.d.ts +13 -0
- package/build/if-diff/util/helpers.js +75 -0
- package/build/if-env/config/config.d.ts +6 -0
- package/build/if-env/config/config.js +37 -0
- package/build/if-env/config/index.d.ts +2 -0
- package/build/if-env/config/index.js +8 -0
- package/build/if-env/config/strings.d.ts +7 -0
- package/build/if-env/config/strings.js +11 -0
- package/build/if-env/index.d.ts +2 -0
- package/build/if-env/index.js +40 -0
- package/build/if-env/types/if-env.d.ts +8 -0
- package/build/if-env/types/if-env.js +3 -0
- package/build/if-env/types/npm.d.ts +9 -0
- package/build/if-env/types/npm.js +3 -0
- package/build/if-env/types/process-args.d.ts +5 -0
- package/build/if-env/types/process-args.js +3 -0
- package/build/if-env/util/args.d.ts +12 -0
- package/build/if-env/util/args.js +47 -0
- package/build/if-env/util/helpers.d.ts +20 -0
- package/build/if-env/util/helpers.js +94 -0
- package/build/if-env/util/npm.d.ts +24 -0
- package/build/if-env/util/npm.js +126 -0
- package/build/if-merge/config/config.d.ts +6 -0
- package/build/if-merge/config/config.js +43 -0
- package/build/if-merge/config/index.d.ts +2 -0
- package/build/if-merge/config/index.js +8 -0
- package/build/if-merge/config/strings.d.ts +5 -0
- package/build/if-merge/config/strings.js +9 -0
- package/build/if-merge/index.d.ts +2 -0
- package/build/if-merge/index.js +26 -0
- package/build/if-merge/types/process-args.d.ts +6 -0
- package/build/if-merge/types/process-args.js +3 -0
- package/build/if-merge/util/args.d.ts +9 -0
- package/build/if-merge/util/args.js +59 -0
- package/build/if-merge/util/helpers.d.ts +5 -0
- package/build/if-merge/util/helpers.js +83 -0
- package/build/if-run/builtins/coefficient/index.d.ts +16 -0
- package/build/if-run/builtins/coefficient/index.js +45 -0
- package/build/if-run/builtins/copy-param/index.d.ts +21 -0
- package/build/if-run/builtins/copy-param/index.js +58 -0
- package/build/if-run/builtins/csv-lookup/index.d.ts +16 -0
- package/build/if-run/builtins/csv-lookup/index.js +175 -0
- package/build/if-run/builtins/divide/index.d.ts +16 -0
- package/build/if-run/builtins/divide/index.js +68 -0
- package/build/if-run/builtins/exponent/index.d.ts +16 -0
- package/build/if-run/builtins/exponent/index.js +52 -0
- package/build/if-run/builtins/export-log.d.ts +4 -0
- package/build/if-run/builtins/export-log.js +44 -0
- package/build/if-run/builtins/export-yaml.d.ts +4 -0
- package/build/if-run/builtins/export-yaml.js +30 -0
- package/build/if-run/builtins/index.d.ts +16 -0
- package/build/if-run/builtins/index.js +36 -0
- package/build/if-run/builtins/interpolation/index.d.ts +16 -0
- package/build/if-run/builtins/interpolation/index.js +146 -0
- package/build/if-run/builtins/mock-observations/helpers/common-generator.d.ts +3 -0
- package/build/if-run/builtins/mock-observations/helpers/common-generator.js +29 -0
- package/build/if-run/builtins/mock-observations/helpers/rand-int-generator.d.ts +3 -0
- package/build/if-run/builtins/mock-observations/helpers/rand-int-generator.js +48 -0
- package/build/if-run/builtins/mock-observations/index.d.ts +16 -0
- package/build/if-run/builtins/mock-observations/index.js +108 -0
- package/build/if-run/builtins/mock-observations/interfaces/index.d.ts +6 -0
- package/build/if-run/builtins/mock-observations/interfaces/index.js +3 -0
- package/build/if-run/builtins/multiply/index.d.ts +16 -0
- package/build/if-run/builtins/multiply/index.js +47 -0
- package/build/if-run/builtins/regex/index.d.ts +16 -0
- package/build/if-run/builtins/regex/index.js +55 -0
- package/build/if-run/builtins/sci/index.d.ts +16 -0
- package/build/if-run/builtins/sci/index.js +92 -0
- package/build/if-run/builtins/sci-embodied/index.d.ts +16 -0
- package/build/if-run/builtins/sci-embodied/index.js +142 -0
- package/build/if-run/builtins/shell/index.d.ts +16 -0
- package/build/if-run/builtins/shell/index.js +50 -0
- package/build/if-run/builtins/subtract/index.d.ts +16 -0
- package/build/if-run/builtins/subtract/index.js +51 -0
- package/build/if-run/builtins/sum/index.d.ts +16 -0
- package/build/if-run/builtins/sum/index.js +37 -0
- package/build/if-run/builtins/time-converter/config.d.ts +1 -0
- package/build/if-run/builtins/time-converter/config.js +44 -0
- package/build/if-run/builtins/time-converter/index.d.ts +16 -0
- package/build/if-run/builtins/time-converter/index.js +63 -0
- package/build/if-run/builtins/time-sync/index.d.ts +31 -0
- package/build/if-run/builtins/time-sync/index.js +371 -0
- package/build/if-run/config/config.d.ts +9 -0
- package/build/if-run/config/config.js +79 -0
- package/build/if-run/config/index.d.ts +2 -0
- package/build/if-run/config/index.js +8 -0
- package/build/if-run/config/strings.d.ts +62 -0
- package/build/if-run/config/strings.js +81 -0
- package/build/if-run/index.d.ts +2 -0
- package/build/if-run/index.js +58 -0
- package/build/if-run/lib/aggregate.d.ts +14 -0
- package/build/if-run/lib/aggregate.js +130 -0
- package/build/if-run/lib/compute.d.ts +5 -0
- package/build/if-run/lib/compute.js +162 -0
- package/build/if-run/lib/environment.d.ts +5 -0
- package/build/if-run/lib/environment.js +75 -0
- package/build/if-run/lib/exhaust.d.ts +7 -0
- package/build/if-run/lib/exhaust.js +27 -0
- package/build/if-run/lib/explain.d.ts +9 -0
- package/build/if-run/lib/explain.js +97 -0
- package/build/if-run/lib/initialize.d.ts +10 -0
- package/build/if-run/lib/initialize.js +113 -0
- package/build/if-run/lib/regroup.d.ts +5 -0
- package/build/if-run/lib/regroup.js +59 -0
- package/build/if-run/types/aggregation.d.ts +2 -0
- package/build/if-run/types/aggregation.js +11 -0
- package/build/if-run/types/compute.d.ts +33 -0
- package/build/if-run/types/compute.js +3 -0
- package/build/if-run/types/environment.d.ts +18 -0
- package/build/if-run/types/environment.js +3 -0
- package/build/if-run/types/explain.d.ts +12 -0
- package/build/if-run/types/explain.js +3 -0
- package/build/if-run/types/plugin-storage.d.ts +6 -0
- package/build/if-run/types/plugin-storage.js +3 -0
- package/build/if-run/types/process-args.d.ts +27 -0
- package/build/if-run/types/process-args.js +3 -0
- package/build/if-run/util/aggregation-helper.d.ts +6 -0
- package/build/if-run/util/aggregation-helper.js +52 -0
- package/build/if-run/util/args.d.ts +9 -0
- package/build/if-run/util/args.js +61 -0
- package/build/if-run/util/helpers.d.ts +8 -0
- package/build/if-run/util/helpers.js +37 -0
- package/build/if-run/util/log-memoize.d.ts +3 -0
- package/build/if-run/util/log-memoize.js +19 -0
- package/build/if-run/util/os-checker.d.ts +7 -0
- package/build/if-run/util/os-checker.js +97 -0
- package/build/if-run/util/plugin-storage.d.ts +14 -0
- package/build/if-run/util/plugin-storage.js +34 -0
- package/manifests/examples/builtins/interpolation/success-with-off.yml +24 -0
- package/package.json +10 -9
- package/src/if-run/builtins/interpolation/README.md +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeConverter = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const interfaces_1 = require("@grnsft/if-core/interfaces");
|
|
6
|
+
const utils_1 = require("@grnsft/if-core/utils");
|
|
7
|
+
const validations_1 = require("../../../common/util/validations");
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
const config_2 = require("../../config");
|
|
10
|
+
const { ConfigError } = utils_1.ERRORS;
|
|
11
|
+
const { MISSING_CONFIG } = config_2.STRINGS;
|
|
12
|
+
exports.TimeConverter = (0, interfaces_1.PluginFactory)({
|
|
13
|
+
configValidation: (config) => {
|
|
14
|
+
if (!config || !Object.keys(config)?.length) {
|
|
15
|
+
throw new ConfigError(MISSING_CONFIG);
|
|
16
|
+
}
|
|
17
|
+
const timeUnitsValues = Object.keys(config_1.TIME_UNITS_IN_SECONDS);
|
|
18
|
+
const originalTimeUnitValuesWithDuration = [
|
|
19
|
+
'duration',
|
|
20
|
+
...timeUnitsValues,
|
|
21
|
+
];
|
|
22
|
+
const originalTimeUnitValues = timeUnitsValues;
|
|
23
|
+
const configSchema = zod_1.z.object({
|
|
24
|
+
'input-parameter': zod_1.z.string(),
|
|
25
|
+
'original-time-unit': zod_1.z.enum(originalTimeUnitValues),
|
|
26
|
+
'new-time-unit': zod_1.z.enum(originalTimeUnitValuesWithDuration),
|
|
27
|
+
'output-parameter': zod_1.z.string().min(1),
|
|
28
|
+
});
|
|
29
|
+
return (0, validations_1.validate)(configSchema, config);
|
|
30
|
+
},
|
|
31
|
+
inputValidation: (input, config) => {
|
|
32
|
+
const inputParameter = config['input-parameter'];
|
|
33
|
+
const schema = zod_1.z.object({
|
|
34
|
+
duration: zod_1.z.number().gte(1),
|
|
35
|
+
[inputParameter]: zod_1.z.number(),
|
|
36
|
+
});
|
|
37
|
+
return (0, validations_1.validate)(schema, input);
|
|
38
|
+
},
|
|
39
|
+
implementation: async (inputs, config) => {
|
|
40
|
+
const outputParameter = config['output-parameter'];
|
|
41
|
+
return inputs.map(input => ({
|
|
42
|
+
...input,
|
|
43
|
+
[outputParameter]: calculateEnergy(input, config),
|
|
44
|
+
}));
|
|
45
|
+
},
|
|
46
|
+
allowArithmeticExpressions: ['input-parameter'],
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Calculates the energy for given period.
|
|
50
|
+
*/
|
|
51
|
+
const calculateEnergy = (input, config) => {
|
|
52
|
+
const { 'original-time-unit': originalTimeUnit, 'input-parameter': inputParameter, 'new-time-unit': newTimeUnit, } = config;
|
|
53
|
+
const originalTimeUnitInSeoncds = config_1.TIME_UNITS_IN_SECONDS[originalTimeUnit];
|
|
54
|
+
const energyPerPeriod = isNaN(Number(inputParameter))
|
|
55
|
+
? input[inputParameter]
|
|
56
|
+
: inputParameter;
|
|
57
|
+
const timeUnit = newTimeUnit === 'duration'
|
|
58
|
+
? input.duration
|
|
59
|
+
: config_1.TIME_UNITS_IN_SECONDS[newTimeUnit];
|
|
60
|
+
const result = (energyPerPeriod / originalTimeUnitInSeoncds) * timeUnit;
|
|
61
|
+
return Number(result.toFixed(6));
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtY29udmVydGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUFzQjtBQUd0QiwyREFBeUQ7QUFDekQsaURBQTZDO0FBRTdDLGtFQUEwRDtBQUUxRCxxQ0FBK0M7QUFFL0MseUNBQXFDO0FBRXJDLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFDN0IsTUFBTSxFQUFDLGNBQWMsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFcEIsUUFBQSxhQUFhLEdBQUcsSUFBQSwwQkFBYSxFQUFDO0lBQ3pDLGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBRSxFQUFFO1FBQ3pDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUMzQyxNQUFNLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBcUIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sa0NBQWtDLEdBQUc7WUFDekMsVUFBVTtZQUNWLEdBQUcsZUFBZTtTQUNWLENBQUM7UUFDWCxNQUFNLHNCQUFzQixHQUFHLGVBQXdDLENBQUM7UUFFeEUsTUFBTSxZQUFZLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUM1QixpQkFBaUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1lBQzdCLG9CQUFvQixFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDcEQsZUFBZSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUM7WUFDM0Qsa0JBQWtCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFBLHNCQUFRLEVBQStCLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsZUFBZSxFQUFFLENBQUMsS0FBbUIsRUFBRSxNQUFvQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakQsTUFBTSxNQUFNLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0QixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1NBQzdCLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBQSxzQkFBUSxFQUF5QixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBc0IsRUFBRSxNQUFvQixFQUFFLEVBQUU7UUFDckUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbkQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixHQUFHLEtBQUs7WUFDUixDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1NBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELDBCQUEwQixFQUFFLENBQUMsaUJBQWlCLENBQUM7Q0FDaEQsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQW1CLEVBQUUsTUFBb0IsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFDSixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDdEMsaUJBQWlCLEVBQUUsY0FBYyxFQUNqQyxlQUFlLEVBQUUsV0FBVyxHQUM3QixHQUFHLE1BQU0sQ0FBQztJQUVYLE1BQU0seUJBQXlCLEdBQUcsOEJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxRSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbkIsTUFBTSxRQUFRLEdBQ1osV0FBVyxLQUFLLFVBQVU7UUFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRO1FBQ2hCLENBQUMsQ0FBQyw4QkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV6QyxNQUFNLE1BQU0sR0FBRyxDQUFDLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUV4RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge1BsdWdpblBhcmFtcywgQ29uZmlnUGFyYW1zfSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuaW1wb3J0IHtQbHVnaW5GYWN0b3J5fSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQge0VSUk9SU30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcblxuaW1wb3J0IHt2YWxpZGF0ZX0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5pbXBvcnQge1RJTUVfVU5JVFNfSU5fU0VDT05EU30gZnJvbSAnLi9jb25maWcnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtDb25maWdFcnJvcn0gPSBFUlJPUlM7XG5jb25zdCB7TUlTU0lOR19DT05GSUd9ID0gU1RSSU5HUztcblxuZXhwb3J0IGNvbnN0IFRpbWVDb252ZXJ0ZXIgPSBQbHVnaW5GYWN0b3J5KHtcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgaWYgKCFjb25maWcgfHwgIU9iamVjdC5rZXlzKGNvbmZpZyk/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKE1JU1NJTkdfQ09ORklHKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lVW5pdHNWYWx1ZXMgPSBPYmplY3Qua2V5cyhUSU1FX1VOSVRTX0lOX1NFQ09ORFMpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGltZVVuaXRWYWx1ZXNXaXRoRHVyYXRpb24gPSBbXG4gICAgICAnZHVyYXRpb24nLFxuICAgICAgLi4udGltZVVuaXRzVmFsdWVzLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgY29uc3Qgb3JpZ2luYWxUaW1lVW5pdFZhbHVlcyA9IHRpbWVVbml0c1ZhbHVlcyBhcyBbc3RyaW5nLCAuLi5zdHJpbmdbXV07XG5cbiAgICBjb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICAnaW5wdXQtcGFyYW1ldGVyJzogei5zdHJpbmcoKSxcbiAgICAgICdvcmlnaW5hbC10aW1lLXVuaXQnOiB6LmVudW0ob3JpZ2luYWxUaW1lVW5pdFZhbHVlcyksXG4gICAgICAnbmV3LXRpbWUtdW5pdCc6IHouZW51bShvcmlnaW5hbFRpbWVVbml0VmFsdWVzV2l0aER1cmF0aW9uKSxcbiAgICAgICdvdXRwdXQtcGFyYW1ldGVyJzogei5zdHJpbmcoKS5taW4oMSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2YgY29uZmlnU2NoZW1hPj4oY29uZmlnU2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbnB1dFZhbGlkYXRpb246IChpbnB1dDogUGx1Z2luUGFyYW1zLCBjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIGNvbnN0IGlucHV0UGFyYW1ldGVyID0gY29uZmlnWydpbnB1dC1wYXJhbWV0ZXInXTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICAgIGR1cmF0aW9uOiB6Lm51bWJlcigpLmd0ZSgxKSxcbiAgICAgIFtpbnB1dFBhcmFtZXRlcl06IHoubnVtYmVyKCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBpbnB1dCk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSwgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgICBjb25zdCBvdXRwdXRQYXJhbWV0ZXIgPSBjb25maWdbJ291dHB1dC1wYXJhbWV0ZXInXTtcblxuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+ICh7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIFtvdXRwdXRQYXJhbWV0ZXJdOiBjYWxjdWxhdGVFbmVyZ3koaW5wdXQsIGNvbmZpZyksXG4gICAgfSkpO1xuICB9LFxuICBhbGxvd0FyaXRobWV0aWNFeHByZXNzaW9uczogWydpbnB1dC1wYXJhbWV0ZXInXSxcbn0pO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGVuZXJneSBmb3IgZ2l2ZW4gcGVyaW9kLlxuICovXG5jb25zdCBjYWxjdWxhdGVFbmVyZ3kgPSAoaW5wdXQ6IFBsdWdpblBhcmFtcywgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgY29uc3Qge1xuICAgICdvcmlnaW5hbC10aW1lLXVuaXQnOiBvcmlnaW5hbFRpbWVVbml0LFxuICAgICdpbnB1dC1wYXJhbWV0ZXInOiBpbnB1dFBhcmFtZXRlcixcbiAgICAnbmV3LXRpbWUtdW5pdCc6IG5ld1RpbWVVbml0LFxuICB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IG9yaWdpbmFsVGltZVVuaXRJblNlb25jZHMgPSBUSU1FX1VOSVRTX0lOX1NFQ09ORFNbb3JpZ2luYWxUaW1lVW5pdF07XG4gIGNvbnN0IGVuZXJneVBlclBlcmlvZCA9IGlzTmFOKE51bWJlcihpbnB1dFBhcmFtZXRlcikpXG4gICAgPyBpbnB1dFtpbnB1dFBhcmFtZXRlcl1cbiAgICA6IGlucHV0UGFyYW1ldGVyO1xuICBjb25zdCB0aW1lVW5pdCA9XG4gICAgbmV3VGltZVVuaXQgPT09ICdkdXJhdGlvbidcbiAgICAgID8gaW5wdXQuZHVyYXRpb25cbiAgICAgIDogVElNRV9VTklUU19JTl9TRUNPTkRTW25ld1RpbWVVbml0XTtcblxuICBjb25zdCByZXN1bHQgPSAoZW5lcmd5UGVyUGVyaW9kIC8gb3JpZ2luYWxUaW1lVW5pdEluU2VvbmNkcykgKiB0aW1lVW5pdDtcblxuICByZXR1cm4gTnVtYmVyKHJlc3VsdC50b0ZpeGVkKDYpKTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PluginParams, MappingParams, TimeNormalizerConfig } from '@grnsft/if-core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Time synchronization plugin converted into framework integrated tool.
|
|
4
|
+
* It can't be requested in `initialize.plugins` section anymore. Instead describe configuration in context.
|
|
5
|
+
* @example
|
|
6
|
+
* ```yaml
|
|
7
|
+
* name: time-sync
|
|
8
|
+
* description: sample in time sync lib
|
|
9
|
+
* tags: sample, time, sync
|
|
10
|
+
* time-sync:
|
|
11
|
+
* start-time: '2023-12-12T00:00:00.000Z'
|
|
12
|
+
* end-time: '2023-12-12T00:01:00.000Z'
|
|
13
|
+
* interval: 5
|
|
14
|
+
* allow-padding: true
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare const TimeSync: (config: TimeNormalizerConfig | undefined, parametersMetadata: import("@grnsft/if-core/types").PluginParametersMetadata, mapping: MappingParams) => {
|
|
18
|
+
metadata: {
|
|
19
|
+
inputs: {
|
|
20
|
+
[x: string]: {
|
|
21
|
+
description: string;
|
|
22
|
+
unit: string;
|
|
23
|
+
'aggregation-method': import("@grnsft/if-core/types").AggregationOptions;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
outputs: import("@grnsft/if-core/types").ParameterMetadata;
|
|
27
|
+
};
|
|
28
|
+
execute: (inputs: PluginParams[]) => Promise<{
|
|
29
|
+
[x: string]: any;
|
|
30
|
+
}[]>;
|
|
31
|
+
};
|
|
@@ -0,0 +1,371 @@
|
|
|
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 utils_1 = require("@grnsft/if-core/utils");
|
|
8
|
+
const validations_1 = require("../../../common/util/validations");
|
|
9
|
+
const config_1 = require("../../config");
|
|
10
|
+
const aggregate_1 = require("../../lib/aggregate");
|
|
11
|
+
const interfaces_1 = require("@grnsft/if-core/interfaces");
|
|
12
|
+
luxon_1.Settings.defaultZone = 'utc';
|
|
13
|
+
const { ConfigError, InvalidDateInInputError, InvalidPaddingError, InvalidInputError, } = utils_1.ERRORS;
|
|
14
|
+
const { INCOMPATIBLE_RESOLUTION_WITH_INTERVAL, INCOMPATIBLE_RESOLUTION_WITH_GAPS, INCOMPATIBLE_RESOLUTION_WITH_INPUTS, INVALID_OBSERVATION_OVERLAP, AVOIDING_PADDING_BY_EDGES, INVALID_DATE_TYPE, START_LOWER_END, MISSING_CONFIG, } = config_1.STRINGS;
|
|
15
|
+
/**
|
|
16
|
+
* Time synchronization plugin converted into framework integrated tool.
|
|
17
|
+
* It can't be requested in `initialize.plugins` section anymore. Instead describe configuration in context.
|
|
18
|
+
* @example
|
|
19
|
+
* ```yaml
|
|
20
|
+
* name: time-sync
|
|
21
|
+
* description: sample in time sync lib
|
|
22
|
+
* tags: sample, time, sync
|
|
23
|
+
* time-sync:
|
|
24
|
+
* start-time: '2023-12-12T00:00:00.000Z'
|
|
25
|
+
* end-time: '2023-12-12T00:01:00.000Z'
|
|
26
|
+
* interval: 5
|
|
27
|
+
* allow-padding: true
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
exports.TimeSync = (0, interfaces_1.PluginFactory)({
|
|
31
|
+
metadata: {
|
|
32
|
+
inputs: {
|
|
33
|
+
timestamp: {
|
|
34
|
+
description: 'refers to the time of occurrence of the input',
|
|
35
|
+
unit: 'RFC3339',
|
|
36
|
+
'aggregation-method': {
|
|
37
|
+
time: 'none',
|
|
38
|
+
component: 'none',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
duration: {
|
|
42
|
+
description: 'refers to the duration of the input',
|
|
43
|
+
unit: 'seconds',
|
|
44
|
+
'aggregation-method': {
|
|
45
|
+
time: 'sum',
|
|
46
|
+
component: 'none',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
configValidation: (config) => {
|
|
52
|
+
if (!config || !Object.keys(config)?.length) {
|
|
53
|
+
throw new ConfigError(MISSING_CONFIG);
|
|
54
|
+
}
|
|
55
|
+
const schema = zod_1.z
|
|
56
|
+
.object({
|
|
57
|
+
'start-time': zod_1.z.string().datetime(),
|
|
58
|
+
'end-time': zod_1.z.string().datetime(),
|
|
59
|
+
interval: zod_1.z.number(),
|
|
60
|
+
'allow-padding': zod_1.z.boolean(),
|
|
61
|
+
'upsampling-resolution': zod_1.z.number().min(1).optional(),
|
|
62
|
+
})
|
|
63
|
+
.refine(data => data['start-time'] < data['end-time'], {
|
|
64
|
+
message: START_LOWER_END,
|
|
65
|
+
});
|
|
66
|
+
return (0, validations_1.validate)(schema, config);
|
|
67
|
+
},
|
|
68
|
+
inputValidation: (input, _config, index) => {
|
|
69
|
+
const schema = zod_1.z.object({
|
|
70
|
+
timestamp: zod_1.z.string().datetime({}).or(zod_1.z.date()),
|
|
71
|
+
duration: zod_1.z.number(),
|
|
72
|
+
});
|
|
73
|
+
return (0, validations_1.validate)(schema, input, index);
|
|
74
|
+
},
|
|
75
|
+
implementation: async (inputs, config, mapping) => {
|
|
76
|
+
/**
|
|
77
|
+
* Checks if a given duration is compatible with a given timeStep. If not, throws an error
|
|
78
|
+
*/
|
|
79
|
+
const validateIntervalForResample = (duration, timeStep, errorMessage) => {
|
|
80
|
+
if (duration % timeStep !== 0) {
|
|
81
|
+
throw new ConfigError(errorMessage);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Dates are passed to `time-sync` both in ISO 8601 format
|
|
86
|
+
* and as a Date object (from the deserialization of a YAML file).
|
|
87
|
+
* If the YAML parser fails to identify as a date, it passes as a string.
|
|
88
|
+
*/
|
|
89
|
+
const parseDate = (date) => {
|
|
90
|
+
if (!date) {
|
|
91
|
+
return luxon_1.DateTime.invalid('Invalid date');
|
|
92
|
+
}
|
|
93
|
+
if ((0, types_1.isDate)(date)) {
|
|
94
|
+
return luxon_1.DateTime.fromJSDate(date);
|
|
95
|
+
}
|
|
96
|
+
if (typeof date === 'string') {
|
|
97
|
+
return luxon_1.DateTime.fromISO(date);
|
|
98
|
+
}
|
|
99
|
+
throw new InvalidDateInInputError(INVALID_DATE_TYPE(date));
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Calculates minimal factor.
|
|
103
|
+
*/
|
|
104
|
+
const convertPerInterval = (value, duration, timeStep) => {
|
|
105
|
+
const samplesNumber = duration / timeStep;
|
|
106
|
+
return value / samplesNumber;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Normalize time per given second.
|
|
110
|
+
*/
|
|
111
|
+
const normalizeTimePerSecond = (currentRoundMoment, i) => {
|
|
112
|
+
const thisMoment = parseDate(currentRoundMoment).startOf('second');
|
|
113
|
+
return thisMoment.plus({ seconds: i });
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Breaks down input per minimal time unit.
|
|
117
|
+
*/
|
|
118
|
+
const breakDownInput = (input, i, params) => {
|
|
119
|
+
const metrics = Object.keys(input);
|
|
120
|
+
const timeStep = params.upsamplingResolution;
|
|
121
|
+
return metrics.reduce((acc, metric) => {
|
|
122
|
+
const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
|
|
123
|
+
if (metric === 'timestamp') {
|
|
124
|
+
const perSecond = normalizeTimePerSecond(input.timestamp, i);
|
|
125
|
+
acc[metric] = perSecond.toUTC().toISO() ?? '';
|
|
126
|
+
return acc;
|
|
127
|
+
}
|
|
128
|
+
if (metric === 'duration') {
|
|
129
|
+
acc[metric] = timeStep;
|
|
130
|
+
return acc;
|
|
131
|
+
}
|
|
132
|
+
if (aggregationParams.time === 'none') {
|
|
133
|
+
acc[metric] = null;
|
|
134
|
+
return acc;
|
|
135
|
+
}
|
|
136
|
+
acc[metric] =
|
|
137
|
+
aggregationParams.time === 'sum'
|
|
138
|
+
? convertPerInterval(input[metric], input['duration'], timeStep)
|
|
139
|
+
: input[metric];
|
|
140
|
+
return acc;
|
|
141
|
+
}, {});
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Populates object to fill the gaps in observational timeline using zeroish values.
|
|
145
|
+
*/
|
|
146
|
+
const fillWithZeroishInput = (input, missingTimestamp, timeStep) => {
|
|
147
|
+
const metrics = Object.keys(input);
|
|
148
|
+
return metrics.reduce((acc, metric) => {
|
|
149
|
+
if (metric === 'timestamp') {
|
|
150
|
+
acc[metric] =
|
|
151
|
+
missingTimestamp.startOf('second').toUTC().toISO() ?? '';
|
|
152
|
+
return acc;
|
|
153
|
+
}
|
|
154
|
+
if (metric === 'duration') {
|
|
155
|
+
acc[metric] = timeStep;
|
|
156
|
+
return acc;
|
|
157
|
+
}
|
|
158
|
+
if (metric === 'time-reserved' ||
|
|
159
|
+
(mapping &&
|
|
160
|
+
mapping['time-reserved'] &&
|
|
161
|
+
metric === mapping['time-reserved'])) {
|
|
162
|
+
acc[metric] = acc['duration'];
|
|
163
|
+
return acc;
|
|
164
|
+
}
|
|
165
|
+
const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
|
|
166
|
+
if (aggregationParams.time === 'none') {
|
|
167
|
+
acc[metric] = null;
|
|
168
|
+
return acc;
|
|
169
|
+
}
|
|
170
|
+
if (aggregationParams.time === 'avg' ||
|
|
171
|
+
aggregationParams.time === 'sum') {
|
|
172
|
+
acc[metric] = 0;
|
|
173
|
+
return acc;
|
|
174
|
+
}
|
|
175
|
+
if (aggregationParams.time === 'copy') {
|
|
176
|
+
acc[metric] = input[metric];
|
|
177
|
+
return acc;
|
|
178
|
+
}
|
|
179
|
+
return acc;
|
|
180
|
+
}, {});
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Checks if `error on padding` is enabled and padding is needed. If so, then throws error.
|
|
184
|
+
*/
|
|
185
|
+
const validatePadding = (pad, params) => {
|
|
186
|
+
const { start, end } = pad;
|
|
187
|
+
const isPaddingNeeded = start || end;
|
|
188
|
+
if (!params.allowPadding && isPaddingNeeded) {
|
|
189
|
+
throw new InvalidPaddingError(AVOIDING_PADDING_BY_EDGES(start, end));
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Checks if padding is needed either at start of the timeline or the end and returns status.
|
|
194
|
+
*/
|
|
195
|
+
const checkForPadding = (inputs, params) => {
|
|
196
|
+
const startDiffInSeconds = parseDate(inputs[0].timestamp)
|
|
197
|
+
.diff(params.startTime)
|
|
198
|
+
.as('seconds');
|
|
199
|
+
const lastInput = inputs[inputs.length - 1];
|
|
200
|
+
const endDiffInSeconds = parseDate(lastInput.timestamp)
|
|
201
|
+
.plus({ second: eval(lastInput.duration) })
|
|
202
|
+
.diff(params.endTime)
|
|
203
|
+
.as('seconds');
|
|
204
|
+
return {
|
|
205
|
+
start: startDiffInSeconds > 0,
|
|
206
|
+
end: endDiffInSeconds < 0,
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Iterates over given inputs frame, meanwhile checking if aggregation method is `sum`, then calculates it.
|
|
211
|
+
* For methods is `avg` and `none` calculating average of the frame.
|
|
212
|
+
*/
|
|
213
|
+
const resampleInputFrame = (inputsInTimeslot) => inputsInTimeslot.reduce((acc, input, index, inputs) => {
|
|
214
|
+
const metrics = Object.keys(input);
|
|
215
|
+
metrics.forEach(metric => {
|
|
216
|
+
const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
|
|
217
|
+
if (metric === 'timestamp') {
|
|
218
|
+
acc[metric] = inputs[0][metric];
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (metric === 'duration') {
|
|
222
|
+
aggregationParams.time = 'sum';
|
|
223
|
+
}
|
|
224
|
+
if (aggregationParams.time === 'none') {
|
|
225
|
+
acc[metric] = null;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
acc[metric] = acc[metric] ?? 0;
|
|
229
|
+
if (aggregationParams.time === 'sum') {
|
|
230
|
+
acc[metric] += input[metric];
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (aggregationParams.time === 'copy') {
|
|
234
|
+
acc[metric] = input[metric];
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* If timeslot contains records more than one, then divide each metric by the timeslot length,
|
|
239
|
+
* so that their sum yields the timeslot average.
|
|
240
|
+
*/
|
|
241
|
+
if (inputsInTimeslot.length > 1 &&
|
|
242
|
+
index === inputsInTimeslot.length - 1) {
|
|
243
|
+
acc[metric] /= inputsInTimeslot.length;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
acc[metric] += input[metric];
|
|
247
|
+
});
|
|
248
|
+
return acc;
|
|
249
|
+
}, {});
|
|
250
|
+
/**
|
|
251
|
+
* Takes each array frame with interval length, then aggregating them together as from units.yaml file.
|
|
252
|
+
*/
|
|
253
|
+
const resampleInputs = (inputs, params) => inputs.reduce((acc, _input, index, inputs) => {
|
|
254
|
+
const frameStart = (index * params.interval) / params.upsamplingResolution;
|
|
255
|
+
const frameEnd = ((index + 1) * params.interval) / params.upsamplingResolution;
|
|
256
|
+
const inputsFrame = inputs.slice(frameStart, frameEnd);
|
|
257
|
+
const resampledInput = resampleInputFrame(inputsFrame);
|
|
258
|
+
/** Checks if resampled input is not empty, then includes in result. */
|
|
259
|
+
if (Object.keys(resampledInput).length > 0) {
|
|
260
|
+
acc.push(resampledInput);
|
|
261
|
+
}
|
|
262
|
+
return acc;
|
|
263
|
+
}, []);
|
|
264
|
+
/**
|
|
265
|
+
* Pads zeroish inputs from the beginning or at the end of the inputs if needed.
|
|
266
|
+
*/
|
|
267
|
+
const padInputs = (inputs, pad, params) => {
|
|
268
|
+
const { start, end } = pad;
|
|
269
|
+
const paddedFromBeginning = [];
|
|
270
|
+
if (start) {
|
|
271
|
+
paddedFromBeginning.push(...getZeroishInputPerSecondBetweenRange({
|
|
272
|
+
startDate: params.startTime,
|
|
273
|
+
endDate: parseDate(inputs[0].timestamp),
|
|
274
|
+
timeStep: params.upsamplingResolution,
|
|
275
|
+
}, inputs[0]));
|
|
276
|
+
}
|
|
277
|
+
const paddedArray = paddedFromBeginning.concat(inputs);
|
|
278
|
+
if (end) {
|
|
279
|
+
const lastInput = inputs[inputs.length - 1];
|
|
280
|
+
const lastInputEnd = parseDate(lastInput.timestamp).plus({
|
|
281
|
+
seconds: eval(lastInput.duration),
|
|
282
|
+
});
|
|
283
|
+
paddedArray.push(...getZeroishInputPerSecondBetweenRange({
|
|
284
|
+
startDate: lastInputEnd,
|
|
285
|
+
endDate: params.endTime,
|
|
286
|
+
timeStep: params.upsamplingResolution,
|
|
287
|
+
}, lastInput));
|
|
288
|
+
}
|
|
289
|
+
return paddedArray;
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* Brakes down the given range by 1 second, and generates zeroish values.
|
|
293
|
+
*/
|
|
294
|
+
const getZeroishInputPerSecondBetweenRange = (params, input) => {
|
|
295
|
+
const array = [];
|
|
296
|
+
validateIntervalForResample(params.endDate.diff(params.startDate).as('seconds'), params.timeStep, INCOMPATIBLE_RESOLUTION_WITH_GAPS);
|
|
297
|
+
const dateRange = luxon_1.Interval.fromDateTimes(params.startDate, params.endDate);
|
|
298
|
+
for (const interval of dateRange.splitBy({ second: params.timeStep })) {
|
|
299
|
+
array.push(fillWithZeroishInput(input,
|
|
300
|
+
// as far as I can tell, start will never be null
|
|
301
|
+
// because if we pass an invalid start/endDate to
|
|
302
|
+
// Interval, we get a zero length array as the range
|
|
303
|
+
interval.start || luxon_1.DateTime.invalid('not expected - start is null'), params.timeStep));
|
|
304
|
+
}
|
|
305
|
+
return array;
|
|
306
|
+
};
|
|
307
|
+
/*
|
|
308
|
+
* Checks if input's timestamp is included in global specified period then leaves it, otherwise.
|
|
309
|
+
*/
|
|
310
|
+
const trimInputsByGlobalTimeline = (inputs, params) => inputs.reduce((acc, item) => {
|
|
311
|
+
const { timestamp } = item;
|
|
312
|
+
if (parseDate(timestamp) >= params.startTime &&
|
|
313
|
+
parseDate(timestamp) <= params.endTime) {
|
|
314
|
+
acc.push(item);
|
|
315
|
+
}
|
|
316
|
+
return acc;
|
|
317
|
+
}, []);
|
|
318
|
+
/** Implementation */
|
|
319
|
+
const timeParams = {
|
|
320
|
+
startTime: luxon_1.DateTime.fromISO(config['start-time']),
|
|
321
|
+
endTime: luxon_1.DateTime.fromISO(config['end-time']),
|
|
322
|
+
interval: config.interval,
|
|
323
|
+
allowPadding: config['allow-padding'],
|
|
324
|
+
upsamplingResolution: config['upsampling-resolution']
|
|
325
|
+
? config['upsampling-resolution']
|
|
326
|
+
: 1,
|
|
327
|
+
};
|
|
328
|
+
validateIntervalForResample(timeParams.interval, timeParams.upsamplingResolution, INCOMPATIBLE_RESOLUTION_WITH_INTERVAL);
|
|
329
|
+
const pad = checkForPadding(inputs, timeParams);
|
|
330
|
+
validatePadding(pad, timeParams);
|
|
331
|
+
const paddedInputs = padInputs(inputs, pad, timeParams);
|
|
332
|
+
const flattenInputs = paddedInputs.reduce((acc, input, index) => {
|
|
333
|
+
const currentMoment = parseDate(input.timestamp);
|
|
334
|
+
/** Checks if not the first input, then check consistency with previous ones. */
|
|
335
|
+
if (index > 0) {
|
|
336
|
+
const previousInput = paddedInputs[index - 1];
|
|
337
|
+
const previousInputTimestamp = parseDate(previousInput.timestamp);
|
|
338
|
+
/** Checks for timestamps overlap. */
|
|
339
|
+
if (parseDate(previousInput.timestamp).plus({
|
|
340
|
+
seconds: eval(previousInput.duration),
|
|
341
|
+
}) > currentMoment) {
|
|
342
|
+
throw new InvalidInputError(INVALID_OBSERVATION_OVERLAP);
|
|
343
|
+
}
|
|
344
|
+
const compareableTime = previousInputTimestamp.plus({
|
|
345
|
+
seconds: eval(previousInput.duration),
|
|
346
|
+
});
|
|
347
|
+
const timelineGapSize = currentMoment
|
|
348
|
+
.diff(compareableTime)
|
|
349
|
+
.as('seconds');
|
|
350
|
+
validateIntervalForResample(input.duration, timeParams.upsamplingResolution, INCOMPATIBLE_RESOLUTION_WITH_INPUTS);
|
|
351
|
+
if (timelineGapSize > 1) {
|
|
352
|
+
/** Checks if there is gap in timeline. */
|
|
353
|
+
acc.push(...getZeroishInputPerSecondBetweenRange({
|
|
354
|
+
startDate: compareableTime,
|
|
355
|
+
endDate: currentMoment,
|
|
356
|
+
timeStep: timeParams.upsamplingResolution,
|
|
357
|
+
}, input));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/** Break down current observation. */
|
|
361
|
+
for (let i = 0; i <= input.duration - timeParams.upsamplingResolution; i += timeParams.upsamplingResolution) {
|
|
362
|
+
const normalizedInput = breakDownInput(input, i, timeParams);
|
|
363
|
+
acc.push(normalizedInput);
|
|
364
|
+
}
|
|
365
|
+
return trimInputsByGlobalTimeline(acc, timeParams);
|
|
366
|
+
}, []);
|
|
367
|
+
const sortedInputs = flattenInputs.sort((a, b) => parseDate(a.timestamp).diff(parseDate(b.timestamp)).as('seconds'));
|
|
368
|
+
return resampleInputs(sortedInputs, timeParams);
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsaUNBQXVFO0FBQ3ZFLDZCQUFzQjtBQUN0QixpREFBNkM7QUFVN0Msa0VBQTBEO0FBRTFELHlDQUFxQztBQUNyQyxtREFBMEQ7QUFDMUQsMkRBQXlEO0FBRXpELGdCQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLEVBQ0osV0FBVyxFQUNYLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLEdBQUcsY0FBTSxDQUFDO0FBRVgsTUFBTSxFQUNKLHFDQUFxQyxFQUNyQyxpQ0FBaUMsRUFDakMsbUNBQW1DLEVBQ25DLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEdBQ2YsR0FBRyxnQkFBTyxDQUFDO0FBRVo7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDVSxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFhLEVBQXVCO0lBQzFELFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRTtnQkFDVCxXQUFXLEVBQUUsK0NBQStDO2dCQUM1RCxJQUFJLEVBQUUsU0FBUztnQkFDZixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLHFDQUFxQztnQkFDbEQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2Ysb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1NBQ0Y7S0FDRjtJQUNELGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBd0IsRUFBRTtRQUMvRCxJ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Q0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNEYXRlfSBmcm9tICdub2RlOnV0aWwvdHlwZXMnO1xuXG5pbXBvcnQge1NldHRpbmdzLCBEYXRlVGltZSwgRGF0ZVRpbWVNYXliZVZhbGlkLCBJbnRlcnZhbH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge1xuICBQbHVnaW5QYXJhbXMsXG4gIFBhZGRpbmdSZWNlaXB0LFxuICBNYXBwaW5nUGFyYW1zLFxuICBDb25maWdQYXJhbXMsXG4gIFRpbWVQYXJhbXMsXG4gIFRpbWVOb3JtYWxpemVyQ29uZmlnLFxufSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7Z2V0QWdncmVnYXRpb25JbmZvRm9yfSBmcm9tICcuLi8uLi9saWIvYWdncmVnYXRlJztcbmltcG9ydCB7UGx1Z2luRmFjdG9yeX0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL2ludGVyZmFjZXMnO1xuXG5TZXR0aW5ncy5kZWZhdWx0Wm9uZSA9ICd1dGMnO1xuXG5jb25zdCB7XG4gIENvbmZpZ0Vycm9yLFxuICBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcixcbiAgSW52YWxpZFBhZGRpbmdFcnJvcixcbiAgSW52YWxpZElucHV0RXJyb3IsXG59ID0gRVJST1JTO1xuXG5jb25zdCB7XG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfSU5URVJWQUwsXG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfR0FQUyxcbiAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlBVVFMsXG4gIElOVkFMSURfT0JTRVJWQVRJT05fT1ZFUkxBUCxcbiAgQVZPSURJTkdfUEFERElOR19CWV9FREdFUyxcbiAgSU5WQUxJRF9EQVRFX1RZUEUsXG4gIFNUQVJUX0xPV0VSX0VORCxcbiAgTUlTU0lOR19DT05GSUcsXG59ID0gU1RSSU5HUztcblxuLyoqXG4gKiBUaW1lIHN5bmNocm9uaXphdGlvbiBwbHVnaW4gY29udmVydGVkIGludG8gZnJhbWV3b3JrIGludGVncmF0ZWQgdG9vbC5cbiAqIEl0IGNhbid0IGJlIHJlcXVlc3RlZCBpbiBgaW5pdGlhbGl6ZS5wbHVnaW5zYCBzZWN0aW9uIGFueW1vcmUuIEluc3RlYWQgZGVzY3JpYmUgY29uZmlndXJhdGlvbiBpbiBjb250ZXh0LlxuICogQGV4YW1wbGVcbiAqIGBgYHlhbWxcbiAqIG5hbWU6IHRpbWUtc3luY1xuICogZGVzY3JpcHRpb246IHNhbXBsZSBpbiB0aW1lIHN5bmMgbGliXG4gKiB0YWdzOiBzYW1wbGUsIHRpbWUsIHN5bmNcbiAqIHRpbWUtc3luYzpcbiAqICAgc3RhcnQtdGltZTogJzIwMjMtMTItMTJUMDA6MDA6MDAuMDAwWidcbiAqICAgZW5kLXRpbWU6ICcyMDIzLTEyLTEyVDAwOjAxOjAwLjAwMFonXG4gKiAgIGludGVydmFsOiA1XG4gKiAgIGFsbG93LXBhZGRpbmc6IHRydWVcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgVGltZVN5bmMgPSBQbHVnaW5GYWN0b3J5PFRpbWVOb3JtYWxpemVyQ29uZmlnPih7XG4gIG1ldGFkYXRhOiB7XG4gICAgaW5wdXRzOiB7XG4gICAgICB0aW1lc3RhbXA6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIHRpbWUgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnUkZDMzMzOScsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ25vbmUnLFxuICAgICAgICAgIGNvbXBvbmVudDogJ25vbmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ3N1bScsXG4gICAgICAgICAgY29tcG9uZW50OiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNvbmZpZ1ZhbGlkYXRpb246IChjb25maWc6IENvbmZpZ1BhcmFtcyk6IFRpbWVOb3JtYWxpemVyQ29uZmlnID0+IHtcbiAgICBpZiAoIWNvbmZpZyB8fCAhT2JqZWN0LmtleXMoY29uZmlnKT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoTUlTU0lOR19DT05GSUcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAnc3RhcnQtdGltZSc6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKSxcbiAgICAgICAgJ2VuZC10aW1lJzogei5zdHJpbmcoKS5kYXRldGltZSgpLFxuICAgICAgICBpbnRlcnZhbDogei5udW1iZXIoKSxcbiAgICAgICAgJ2FsbG93LXBhZGRpbmcnOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgJ3Vwc2FtcGxpbmctcmVzb2x1dGlvbic6IHoubnVtYmVyKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ3N0YXJ0LXRpbWUnXSA8IGRhdGFbJ2VuZC10aW1lJ10sIHtcbiAgICAgICAgbWVzc2FnZTogU1RBUlRfTE9XRVJfRU5ELFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbnB1dFZhbGlkYXRpb246IChpbnB1dDogUGx1Z2luUGFyYW1zLCBfY29uZmlnOiBhbnksIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgdGltZXN0YW1wOiB6LnN0cmluZygpLmRhdGV0aW1lKHt9KS5vcih6LmRhdGUoKSksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0LCBpbmRleCk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoXG4gICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICBjb25maWcsXG4gICAgbWFwcGluZz86IE1hcHBpbmdQYXJhbXNcbiAgKSA9PiB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZHVyYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIGEgZ2l2ZW4gdGltZVN0ZXAuIElmIG5vdCwgdGhyb3dzIGFuIGVycm9yXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlID0gKFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIHRpbWVTdGVwOiBudW1iZXIsXG4gICAgICBlcnJvck1lc3NhZ2U6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGR1cmF0aW9uICUgdGltZVN0ZXAgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIGFyZSBwYXNzZWQgdG8gYHRpbWUtc3luY2AgYm90aCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAgKiBhbmQgYXMgYSBEYXRlIG9iamVjdCAoZnJvbSB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgWUFNTCBmaWxlKS5cbiAgICAgKiBJZiB0aGUgWUFNTCBwYXJzZXIgZmFpbHMgdG8gaWRlbnRpZnkgYXMgYSBkYXRlLCBpdCBwYXNzZXMgYXMgYSBzdHJpbmcuXG4gICAgICovXG4gICAgY29uc3QgcGFyc2VEYXRlID0gKGRhdGU6IERhdGUgfCBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08oZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcihJTlZBTElEX0RBVEVfVFlQRShkYXRlKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgbWluaW1hbCBmYWN0b3IuXG4gICAgICovXG4gICAgY29uc3QgY29udmVydFBlckludGVydmFsID0gKFxuICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgICB0aW1lU3RlcDogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYW1wbGVzTnVtYmVyID0gZHVyYXRpb24gLyB0aW1lU3RlcDtcblxuICAgICAgcmV0dXJuIHZhbHVlIC8gc2FtcGxlc051bWJlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRpbWUgcGVyIGdpdmVuIHNlY29uZC5cbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVUaW1lUGVyU2Vjb25kID0gKFxuICAgICAgY3VycmVudFJvdW5kTW9tZW50OiBEYXRlIHwgc3RyaW5nLFxuICAgICAgaTogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0aGlzTW9tZW50ID0gcGFyc2VEYXRlKGN1cnJlbnRSb3VuZE1vbWVudCkuc3RhcnRPZignc2Vjb25kJyk7XG5cbiAgICAgIHJldHVybiB0aGlzTW9tZW50LnBsdXMoe3NlY29uZHM6IGl9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJlYWtzIGRvd24gaW5wdXQgcGVyIG1pbmltYWwgdGltZSB1bml0LlxuICAgICAqL1xuICAgIGNvbnN0IGJyZWFrRG93bklucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIGk6IG51bWJlcixcbiAgICAgIHBhcmFtczogVGltZVBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcbiAgICAgIGNvbnN0IHRpbWVTdGVwID0gcGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uO1xuXG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICBjb25zdCBwZXJTZWNvbmQgPSBub3JtYWxpemVUaW1lUGVyU2Vjb25kKGlucHV0LnRpbWVzdGFtcCwgaSk7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBwZXJTZWNvbmQudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRyaWMgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IHRpbWVTdGVwO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnbm9uZScpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgIGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdzdW0nXG4gICAgICAgICAgICA/IGNvbnZlcnRQZXJJbnRlcnZhbChpbnB1dFttZXRyaWNdLCBpbnB1dFsnZHVyYXRpb24nXSwgdGltZVN0ZXApXG4gICAgICAgICAgICA6IGlucHV0W21ldHJpY107XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlcyBvYmplY3QgdG8gZmlsbCB0aGUgZ2FwcyBpbiBvYnNlcnZhdGlvbmFsIHRpbWVsaW5lIHVzaW5nIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbGxXaXRoWmVyb2lzaElucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIG1pc3NpbmdUaW1lc3RhbXA6IERhdGVUaW1lTWF5YmVWYWxpZCxcbiAgICAgIHRpbWVTdGVwOiBudW1iZXJcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGlmIChtZXRyaWMgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgICAgbWlzc2luZ1RpbWVzdGFtcC5zdGFydE9mKCdzZWNvbmQnKS50b1VUQygpLnRvSVNPKCkgPz8gJyc7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gdGltZVN0ZXA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldHJpYyA9PT0gJ3RpbWUtcmVzZXJ2ZWQnIHx8XG4gICAgICAgICAgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgIG1hcHBpbmdbJ3RpbWUtcmVzZXJ2ZWQnXSAmJlxuICAgICAgICAgICAgbWV0cmljID09PSBtYXBwaW5nWyd0aW1lLXJlc2VydmVkJ10pXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjWydkdXJhdGlvbiddO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gbnVsbDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdncmVnYXRpb25QYXJhbXMudGltZSA9PT0gJ2F2ZycgfHxcbiAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJ1xuICAgICAgICApIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IDA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdjb3B5Jykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZXJyb3Igb24gcGFkZGluZ2AgaXMgZW5hYmxlZCBhbmQgcGFkZGluZyBpcyBuZWVkZWQuIElmIHNvLCB0aGVuIHRocm93cyBlcnJvci5cbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBpc1BhZGRpbmdOZWVkZWQgPSBzdGFydCB8fCBlbmQ7XG5cbiAgICAgIGlmICghcGFyYW1zLmFsbG93UGFkZGluZyAmJiBpc1BhZGRpbmdOZWVkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYWRkaW5nRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBlaXRoZXIgYXQgc3RhcnQgb2YgdGhlIHRpbWVsaW5lIG9yIHRoZSBlbmQgYW5kIHJldHVybnMgc3RhdHVzLlxuICAgICAqL1xuICAgIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgICBjb25zdCBzdGFydERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUoaW5wdXRzWzBdLnRpbWVzdGFtcClcbiAgICAgICAgLmRpZmYocGFyYW1zLnN0YXJ0VGltZSlcbiAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgIGNvbnN0IGxhc3RJbnB1dCA9IGlucHV0c1tpbnB1dHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGNvbnN0IGVuZERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcClcbiAgICAgICAgLnBsdXMoe3NlY29uZDogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pfSlcbiAgICAgICAgLmRpZmYocGFyYW1zLmVuZFRpbWUpXG4gICAgICAgIC5hcygnc2Vjb25kcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICAgIGVuZDogZW5kRGlmZkluU2Vjb25kcyA8IDAsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGdpdmVuIGlucHV0cyBmcmFtZSwgbWVhbndoaWxlIGNoZWNraW5nIGlmIGFnZ3JlZ2F0aW9uIG1ldGhvZCBpcyBgc3VtYCwgdGhlbiBjYWxjdWxhdGVzIGl0LlxuICAgICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzYW1wbGVJbnB1dEZyYW1lID0gKGlucHV0c0luVGltZXNsb3Q6IFBsdWdpblBhcmFtc1tdKSA9PlxuICAgICAgaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgICAgICBtZXRyaWNzLmZvckVhY2gobWV0cmljID0+IHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblBhcmFtcyA9IGdldEFnZ3JlZ2F0aW9uSW5mb0ZvcihtZXRyaWMpO1xuXG4gICAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRzWzBdW21ldHJpY107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID0gJ3N1bSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjW21ldHJpY10gPz8gMDtcblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnY29weScpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIElmIHRpbWVzbG90IGNvbnRhaW5zIHJlY29yZHMgbW9yZSB0aGFuIG9uZSwgdGhlbiBkaXZpZGUgZWFjaCBtZXRyaWMgYnkgdGhlIHRpbWVzbG90IGxlbmd0aCxcbiAgICAgICAgICAgKiAgc28gdGhhdCB0aGVpciBzdW0geWllbGRzIHRoZSB0aW1lc2xvdCBhdmVyYWdlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlucHV0c0luVGltZXNsb3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgaW5kZXggPT09IGlucHV0c0luVGltZXNsb3QubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gLz0gaW5wdXRzSW5UaW1lc2xvdC5sZW5ndGg7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY2NbbWV0cmljXSArPSBpbnB1dFttZXRyaWNdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUGx1Z2luUGFyYW1zKTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGVhY2ggYXJyYXkgZnJhbWUgd2l0aCBpbnRlcnZhbCBsZW5ndGgsIHRoZW4gYWdncmVnYXRpbmcgdGhlbSB0b2dldGhlciBhcyBmcm9tIHVuaXRzLnlhbWwgZmlsZS5cbiAgICAgKi9cbiAgICBjb25zdCByZXNhbXBsZUlucHV0cyA9IChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBwYXJhbXM6IFRpbWVQYXJhbXMpID0+XG4gICAgICBpbnB1dHMucmVkdWNlKChhY2M6IFBsdWdpblBhcmFtc1tdLCBfaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWVTdGFydCA9XG4gICAgICAgICAgKGluZGV4ICogcGFyYW1zLmludGVydmFsKSAvIHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgY29uc3QgZnJhbWVFbmQgPVxuICAgICAgICAgICgoaW5kZXggKyAxKSAqIHBhcmFtcy5pbnRlcnZhbCkgLyBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG5cbiAgICAgICAgY29uc3QgaW5wdXRzRnJhbWUgPSBpbnB1dHMuc2xpY2UoZnJhbWVTdGFydCwgZnJhbWVFbmQpO1xuICAgICAgICBjb25zdCByZXNhbXBsZWRJbnB1dCA9IHJlc2FtcGxlSW5wdXRGcmFtZShpbnB1dHNGcmFtZSk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiByZXNhbXBsZWQgaW5wdXQgaXMgbm90IGVtcHR5LCB0aGVuIGluY2x1ZGVzIGluIHJlc3VsdC4gKi9cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc2FtcGxlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYWNjLnB1c2gocmVzYW1wbGVkSW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdIGFzIFBsdWdpblBhcmFtc1tdKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgemVyb2lzaCBpbnB1dHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0cyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkSW5wdXRzID0gKFxuICAgICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICAgIHBhZDogUGFkZGluZ1JlY2VpcHQsXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBwYWRkZWRGcm9tQmVnaW5uaW5nID0gW107XG5cbiAgICAgIGlmIChzdGFydCkge1xuICAgICAgICBwYWRkZWRGcm9tQmVnaW5uaW5nLnB1c2goXG4gICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGFydERhdGU6IHBhcmFtcy5zdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZERhdGU6IHBhcnNlRGF0ZShpbnB1dHNbMF0udGltZXN0YW1wKSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dHNbMF1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZGRlZEFycmF5ID0gcGFkZGVkRnJvbUJlZ2lubmluZy5jb25jYXQoaW5wdXRzKTtcblxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBsYXN0SW5wdXRFbmQgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgc2Vjb25kczogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgICAgcGFkZGVkQXJyYXkucHVzaChcbiAgICAgICAgICAuLi5nZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogbGFzdElucHV0RW5kLFxuICAgICAgICAgICAgICBlbmREYXRlOiBwYXJhbXMuZW5kVGltZSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0SW5wdXRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWRkZWRBcnJheTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJha2VzIGRvd24gdGhlIGdpdmVuIHJhbmdlIGJ5IDEgc2Vjb25kLCBhbmQgZ2VuZXJhdGVzIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZSA9IChcbiAgICAgIHBhcmFtczogUGx1Z2luUGFyYW1zLFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgYXJyYXk6IFBsdWdpblBhcmFtc1tdID0gW107XG4gICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgIHBhcmFtcy5lbmREYXRlLmRpZmYocGFyYW1zLnN0YXJ0RGF0ZSkuYXMoJ3NlY29uZHMnKSxcbiAgICAgICAgcGFyYW1zLnRpbWVTdGVwLFxuICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0dBUFNcbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRlUmFuZ2UgPSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKFxuICAgICAgICBwYXJhbXMuc3RhcnREYXRlLFxuICAgICAgICBwYXJhbXMuZW5kRGF0ZVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBpbnRlcnZhbCBvZiBkYXRlUmFuZ2Uuc3BsaXRCeSh7c2Vjb25kOiBwYXJhbXMudGltZVN0ZXB9KSkge1xuICAgICAgICBhcnJheS5wdXNoKFxuICAgICAgICAgIGZpbGxXaXRoWmVyb2lzaElucHV0KFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAvLyBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgc3RhcnQgd2lsbCBuZXZlciBiZSBudWxsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIHBhc3MgYW4gaW52YWxpZCBzdGFydC9lbmREYXRlIHRvXG4gICAgICAgICAgICAvLyBJbnRlcnZhbCwgd2UgZ2V0IGEgemVybyBsZW5ndGggYXJyYXkgYXMgdGhlIHJhbmdlXG4gICAgICAgICAgICBpbnRlcnZhbC5zdGFydCB8fCBEYXRlVGltZS5pbnZhbGlkKCdub3QgZXhwZWN0ZWQgLSBzdGFydCBpcyBudWxsJyksXG4gICAgICAgICAgICBwYXJhbXMudGltZVN0ZXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBDaGVja3MgaWYgaW5wdXQncyB0aW1lc3RhbXAgaXMgaW5jbHVkZWQgaW4gZ2xvYmFsIHNwZWNpZmllZCBwZXJpb2QgdGhlbiBsZWF2ZXMgaXQsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25zdCB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZSA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PlxuICAgICAgaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7dGltZXN0YW1wfSA9IGl0ZW07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcnNlRGF0ZSh0aW1lc3RhbXApID49IHBhcmFtcy5zdGFydFRpbWUgJiZcbiAgICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA8PSBwYXJhbXMuZW5kVGltZVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2MucHVzaChpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyBQbHVnaW5QYXJhbXNbXSk7XG5cbiAgICAvKiogSW1wbGVtZW50YXRpb24gKi9cbiAgICBjb25zdCB0aW1lUGFyYW1zID0ge1xuICAgICAgc3RhcnRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snc3RhcnQtdGltZSddIGFzIHN0cmluZyksXG4gICAgICBlbmRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snZW5kLXRpbWUnXSBhcyBzdHJpbmcpLFxuICAgICAgaW50ZXJ2YWw6IGNvbmZpZy5pbnRlcnZhbCxcbiAgICAgIGFsbG93UGFkZGluZzogY29uZmlnWydhbGxvdy1wYWRkaW5nJ10sXG4gICAgICB1cHNhbXBsaW5nUmVzb2x1dGlvbjogY29uZmlnWyd1cHNhbXBsaW5nLXJlc29sdXRpb24nXVxuICAgICAgICA/IGNvbmZpZ1sndXBzYW1wbGluZy1yZXNvbHV0aW9uJ11cbiAgICAgICAgOiAxLFxuICAgIH07XG4gICAgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlKFxuICAgICAgdGltZVBhcmFtcy5pbnRlcnZhbCxcbiAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOVEVSVkFMXG4gICAgKTtcbiAgICBjb25zdCBwYWQgPSBjaGVja0ZvclBhZGRpbmcoaW5wdXRzLCB0aW1lUGFyYW1zKTtcbiAgICB2YWxpZGF0ZVBhZGRpbmcocGFkLCB0aW1lUGFyYW1zKTtcbiAgICBjb25zdCBwYWRkZWRJbnB1dHMgPSBwYWRJbnB1dHMoaW5wdXRzLCBwYWQsIHRpbWVQYXJhbXMpO1xuXG4gICAgY29uc3QgZmxhdHRlbklucHV0cyA9IHBhZGRlZElucHV0cy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb21lbnQgPSBwYXJzZURhdGUoaW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAvKiogQ2hlY2tzIGlmIG5vdCB0aGUgZmlyc3QgaW5wdXQsIHRoZW4gY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBwcmV2aW91cyBvbmVzLiAqL1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNJbnB1dCA9IHBhZGRlZElucHV0c1tpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAgPSBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApO1xuXG4gICAgICAgICAgLyoqIENoZWNrcyBmb3IgdGltZXN0YW1wcyBvdmVybGFwLiAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcnNlRGF0ZShwcmV2aW91c0lucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgICAgIHNlY29uZHM6IGV2YWwocHJldmlvdXNJbnB1dC5kdXJhdGlvbiksXG4gICAgICAgICAgICB9KSA+IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5wdXRFcnJvcihJTlZBTElEX09CU0VSVkFUSU9OX09WRVJMQVApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbXBhcmVhYmxlVGltZSA9IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAucGx1cyh7XG4gICAgICAgICAgICBzZWNvbmRzOiBldmFsKHByZXZpb3VzSW5wdXQuZHVyYXRpb24pLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdGltZWxpbmVHYXBTaXplID0gY3VycmVudE1vbWVudFxuICAgICAgICAgICAgLmRpZmYoY29tcGFyZWFibGVUaW1lKVxuICAgICAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgICAgICBpbnB1dC5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOUFVUU1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGltZWxpbmVHYXBTaXplID4gMSkge1xuICAgICAgICAgICAgLyoqIENoZWNrcyBpZiB0aGVyZSBpcyBnYXAgaW4gdGltZWxpbmUuICovXG4gICAgICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogY29tcGFyZWFibGVUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogY3VycmVudE1vbWVudCxcbiAgICAgICAgICAgICAgICAgIHRpbWVTdGVwOiB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiogQnJlYWsgZG93biBjdXJyZW50IG9ic2VydmF0aW9uLiAqL1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICBpIDw9IGlucHV0LmR1cmF0aW9uIC0gdGltZVBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgICBpICs9IHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZElucHV0ID0gYnJlYWtEb3duSW5wdXQoaW5wdXQsIGksIHRpbWVQYXJhbXMpO1xuXG4gICAgICAgICAgYWNjLnB1c2gobm9ybWFsaXplZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZShhY2MsIHRpbWVQYXJhbXMpO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIFBsdWdpblBhcmFtc1tdXG4gICAgKTtcblxuICAgIGNvbnN0IHNvcnRlZElucHV0cyA9IGZsYXR0ZW5JbnB1dHMuc29ydCgoYSwgYikgPT5cbiAgICAgIHBhcnNlRGF0ZShhLnRpbWVzdGFtcCkuZGlmZihwYXJzZURhdGUoYi50aW1lc3RhbXApKS5hcygnc2Vjb25kcycpXG4gICAgKTtcblxuICAgIHJldHVybiByZXNhbXBsZUlucHV0cyhzb3J0ZWRJbnB1dHMsIHRpbWVQYXJhbXMpIGFzIFBsdWdpblBhcmFtc1tdO1xuICB9LFxufSk7XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ArgumentConfig, ParseOptions } from 'ts-command-line-args';
|
|
2
|
+
import { IfRunArgs } from '../types/process-args';
|
|
3
|
+
export declare const CONFIG: {
|
|
4
|
+
ARGS: ArgumentConfig<IfRunArgs>;
|
|
5
|
+
HELP: ParseOptions<any>;
|
|
6
|
+
GITHUB_PATH: string;
|
|
7
|
+
NATIVE_PLUGIN: string;
|
|
8
|
+
AGGREGATION_TIME_METRICS: string[];
|
|
9
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONFIG = void 0;
|
|
4
|
+
const config_1 = require("../../common/config");
|
|
5
|
+
const { DISCLAIMER_MESSAGE } = config_1.STRINGS;
|
|
6
|
+
exports.CONFIG = {
|
|
7
|
+
ARGS: {
|
|
8
|
+
manifest: {
|
|
9
|
+
type: String,
|
|
10
|
+
optional: true,
|
|
11
|
+
alias: 'm',
|
|
12
|
+
description: '[path to the input file]',
|
|
13
|
+
},
|
|
14
|
+
output: {
|
|
15
|
+
type: String,
|
|
16
|
+
optional: true,
|
|
17
|
+
alias: 'o',
|
|
18
|
+
description: '[path to the output file]',
|
|
19
|
+
},
|
|
20
|
+
'override-params': {
|
|
21
|
+
type: String,
|
|
22
|
+
optional: true,
|
|
23
|
+
alias: 'p',
|
|
24
|
+
description: '[path to a parameter file that overrides our defaults]',
|
|
25
|
+
},
|
|
26
|
+
'no-output': {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
optional: true,
|
|
29
|
+
alias: 'n',
|
|
30
|
+
description: '[prevent output to the console]',
|
|
31
|
+
},
|
|
32
|
+
help: {
|
|
33
|
+
type: Boolean,
|
|
34
|
+
optional: true,
|
|
35
|
+
alias: 'h',
|
|
36
|
+
description: '[prints out the above help instruction]',
|
|
37
|
+
},
|
|
38
|
+
append: {
|
|
39
|
+
type: Boolean,
|
|
40
|
+
optional: true,
|
|
41
|
+
alias: 'a',
|
|
42
|
+
description: '[append to outputs, instead of overwriting]',
|
|
43
|
+
},
|
|
44
|
+
debug: {
|
|
45
|
+
type: Boolean,
|
|
46
|
+
optional: true,
|
|
47
|
+
alias: 'd',
|
|
48
|
+
description: '[prints out debug logs to the console]',
|
|
49
|
+
},
|
|
50
|
+
observe: {
|
|
51
|
+
type: Boolean,
|
|
52
|
+
optional: true,
|
|
53
|
+
description: '[executes only observe pipeline of the manifest]',
|
|
54
|
+
},
|
|
55
|
+
regroup: {
|
|
56
|
+
type: Boolean,
|
|
57
|
+
optional: true,
|
|
58
|
+
description: '[executes only regroup pipeline of the manifest]',
|
|
59
|
+
},
|
|
60
|
+
compute: {
|
|
61
|
+
type: Boolean,
|
|
62
|
+
optional: true,
|
|
63
|
+
description: '[executes only compute pipeline of the manifest]',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
HELP: {
|
|
67
|
+
helpArg: 'help',
|
|
68
|
+
headerContentSections: [
|
|
69
|
+
{ header: 'Impact Framework', content: 'Helpful keywords:' },
|
|
70
|
+
],
|
|
71
|
+
footerContentSections: [
|
|
72
|
+
{ header: 'Green Software Foundation', content: DISCLAIMER_MESSAGE },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
GITHUB_PATH: 'https://github.com',
|
|
76
|
+
NATIVE_PLUGIN: 'if-plugins',
|
|
77
|
+
AGGREGATION_TIME_METRICS: ['timestamp', 'duration'],
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLXJ1bi9jb25maWcvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGdEQUE0QztBQUk1QyxNQUFNLEVBQUMsa0JBQWtCLEVBQUMsR0FBRyxnQkFBTyxDQUFDO0FBRXhCLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRTtRQUNKLFFBQVEsRUFBRTtZQUNSLElBQUksRUFBRSxNQUFNO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwwQkFBMEI7U0FDeEM7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDO1FBQ0QsaUJBQWlCLEVBQUU7WUFDakIsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLHdEQUF3RDtTQUN0RTtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7U0FDL0M7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUseUNBQXlDO1NBQ3ZEO1FBQ0QsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLDZDQUE2QztTQUMzRDtRQUNELEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSx3Q0FBd0M7U0FDdEQ7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLGtEQUFrRDtTQUNoRTtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsa0RBQWtEO1NBQ2hFO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxrREFBa0Q7U0FDaEU7S0FDMkI7SUFDOUIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLE1BQU07UUFDZixxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUM7U0FDM0Q7UUFDRCxxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUM7U0FDbkU7S0FDbUI7SUFDdEIsV0FBVyxFQUFFLG9CQUFvQjtJQUNqQyxhQUFhLEVBQUUsWUFBWTtJQUMzQix3QkFBd0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUM7Q0FDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXJndW1lbnRDb25maWcsIFBhcnNlT3B0aW9uc30gZnJvbSAndHMtY29tbWFuZC1saW5lLWFyZ3MnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25maWcnO1xuXG5pbXBvcnQge0lmUnVuQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcblxuY29uc3Qge0RJU0NMQUlNRVJfTUVTU0FHRX0gPSBTVFJJTkdTO1xuXG5leHBvcnQgY29uc3QgQ09ORklHID0ge1xuICBBUkdTOiB7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgYWxpYXM6ICdtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnW3BhdGggdG8gdGhlIGlucHV0IGZpbGVdJyxcbiAgICB9LFxuICAgIG91dHB1dDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ28nLFxuICAgICAgZGVzY3JpcHRpb246ICdbcGF0aCB0byB0aGUgb3V0cHV0IGZpbGVdJyxcbiAgICB9LFxuICAgICdvdmVycmlkZS1wYXJhbXMnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIGFsaWFzOiAncCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1twYXRoIHRvIGEgcGFyYW1ldGVyIGZpbGUgdGhhdCBvdmVycmlkZXMgb3VyIGRlZmF1bHRzXScsXG4gICAgfSxcbiAgICAnbm8tb3V0cHV0Jzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgYWxpYXM6ICduJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnW3ByZXZlbnQgb3V0cHV0IHRvIHRoZSBjb25zb2xlXScsXG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdbcHJpbnRzIG91dCB0aGUgYWJvdmUgaGVscCBpbnN0cnVjdGlvbl0nLFxuICAgIH0sXG4gICAgYXBwZW5kOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2EnLFxuICAgICAgZGVzY3JpcHRpb246ICdbYXBwZW5kIHRvIG91dHB1dHMsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmddJyxcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2QnLFxuICAgICAgZGVzY3JpcHRpb246ICdbcHJpbnRzIG91dCBkZWJ1ZyBsb2dzIHRvIHRoZSBjb25zb2xlXScsXG4gICAgfSxcbiAgICBvYnNlcnZlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IG9ic2VydmUgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgICByZWdyb3VwOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IHJlZ3JvdXAgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgICBjb21wdXRlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IGNvbXB1dGUgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgfSBhcyBBcmd1bWVudENvbmZpZzxJZlJ1bkFyZ3M+LFxuICBIRUxQOiB7XG4gICAgaGVscEFyZzogJ2hlbHAnLFxuICAgIGhlYWRlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0ltcGFjdCBGcmFtZXdvcmsnLCBjb250ZW50OiAnSGVscGZ1bCBrZXl3b3JkczonfSxcbiAgICBdLFxuICAgIGZvb3RlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0dyZWVuIFNvZnR3YXJlIEZvdW5kYXRpb24nLCBjb250ZW50OiBESVNDTEFJTUVSX01FU1NBR0V9LFxuICAgIF0sXG4gIH0gYXMgUGFyc2VPcHRpb25zPGFueT4sXG4gIEdJVEhVQl9QQVRIOiAnaHR0cHM6Ly9naXRodWIuY29tJyxcbiAgTkFUSVZFX1BMVUdJTjogJ2lmLXBsdWdpbnMnLFxuICBBR0dSRUdBVElPTl9USU1FX01FVFJJQ1M6IFsndGltZXN0YW1wJywgJ2R1cmF0aW9uJ10sXG59O1xuIl19
|