@grnsft/if 0.3.4 → 0.4.0-beta.1
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/.commitlintrc.js +0 -1
- package/.lintstagedrc.js +6 -0
- package/README.md +12 -8
- package/Refactor-migration-guide.md +6 -6
- package/build/builtins/coefficient/index.d.ts +3 -0
- package/build/builtins/coefficient/index.js +51 -0
- package/build/builtins/coefficient/types.d.ts +5 -0
- package/build/builtins/coefficient/types.js +3 -0
- package/build/builtins/csv-lookup/index.d.ts +2 -0
- package/build/builtins/csv-lookup/index.js +181 -0
- package/build/builtins/divide/index.d.ts +2 -0
- package/build/builtins/divide/index.js +67 -0
- package/build/builtins/exponent/index.d.ts +3 -0
- package/build/builtins/exponent/index.js +72 -0
- package/build/builtins/exponent/types.d.ts +5 -0
- package/build/builtins/exponent/types.js +3 -0
- package/build/builtins/export-csv-raw.js +4 -1
- package/build/builtins/export-csv.js +4 -1
- package/build/builtins/export-log.js +4 -2
- package/build/builtins/export-yaml.js +4 -1
- package/build/builtins/index.d.ts +13 -0
- package/build/builtins/index.js +28 -2
- package/build/builtins/interpolation/index.d.ts +2 -0
- package/build/builtins/interpolation/index.js +146 -0
- package/build/builtins/interpolation/types.d.ts +5 -0
- package/build/builtins/interpolation/types.js +10 -0
- package/build/builtins/mock-observations/helpers/common-generator.d.ts +3 -0
- package/build/builtins/mock-observations/helpers/common-generator.js +32 -0
- package/build/builtins/mock-observations/helpers/rand-int-generator.d.ts +3 -0
- package/build/builtins/mock-observations/helpers/rand-int-generator.js +58 -0
- package/build/builtins/mock-observations/index.d.ts +3 -0
- package/build/builtins/mock-observations/index.js +116 -0
- package/build/builtins/mock-observations/interfaces/index.d.ts +6 -0
- package/build/builtins/mock-observations/interfaces/index.js +3 -0
- package/build/builtins/mock-observations/types.d.ts +13 -0
- package/build/builtins/mock-observations/types.js +3 -0
- package/build/builtins/multiply/index.d.ts +3 -0
- package/build/builtins/multiply/index.js +63 -0
- package/build/builtins/multiply/types.d.ts +4 -0
- package/build/builtins/multiply/types.js +3 -0
- package/build/builtins/regex/index.d.ts +3 -0
- package/build/builtins/regex/index.js +78 -0
- package/build/builtins/sci/config.d.ts +1 -0
- package/build/builtins/sci/config.js +44 -0
- package/build/builtins/sci/index.d.ts +3 -0
- package/build/builtins/sci/index.js +69 -0
- package/build/builtins/sci-embodied/index.d.ts +2 -0
- package/build/builtins/sci-embodied/index.js +115 -0
- package/build/builtins/shell/index.d.ts +3 -0
- package/build/builtins/shell/index.js +58 -0
- package/build/builtins/subtract/index.d.ts +3 -0
- package/build/builtins/subtract/index.js +75 -0
- package/build/builtins/subtract/types.d.ts +4 -0
- package/build/builtins/subtract/types.js +3 -0
- package/build/builtins/sum/index.d.ts +3 -0
- package/build/builtins/sum/index.js +61 -0
- package/build/builtins/sum/types.d.ts +4 -0
- package/build/builtins/sum/types.js +3 -0
- package/build/config/config.d.ts +8 -2
- package/build/config/config.js +34 -1
- package/build/config/strings.d.ts +22 -0
- package/build/config/strings.js +23 -1
- package/build/diff.d.ts +2 -0
- package/build/diff.js +41 -0
- package/build/index.js +8 -4
- package/build/lib/aggregate.js +5 -1
- package/build/lib/compare.d.ts +10 -0
- package/build/lib/compare.js +56 -0
- package/build/lib/compute.js +9 -1
- package/build/lib/environment.js +9 -3
- package/build/lib/exhaust.js +3 -2
- package/build/lib/initialize.js +5 -2
- package/build/lib/load.d.ts +48 -0
- package/build/lib/load.js +51 -2
- package/build/lib/parameterize.js +8 -4
- package/build/types/common.d.ts +4 -0
- package/build/types/common.js +3 -0
- package/build/types/helpers.d.ts +4 -0
- package/build/types/helpers.js +3 -0
- package/build/types/interface.d.ts +2 -1
- package/build/types/interface.js +1 -1
- package/build/types/lib/compare.d.ts +7 -0
- package/build/types/lib/compare.js +3 -0
- package/build/types/process-args.d.ts +7 -1
- package/build/types/process-args.js +1 -1
- package/build/types/util/args.d.ts +4 -0
- package/build/types/util/args.js +3 -0
- package/build/util/args.d.ts +7 -2
- package/build/util/args.js +49 -11
- package/build/util/debug-logger.d.ts +4 -0
- package/build/util/debug-logger.js +117 -0
- package/build/util/errors.d.ts +1 -1
- package/build/util/errors.js +6 -1
- package/build/util/helpers.d.ts +23 -0
- package/build/util/helpers.js +116 -2
- package/build/util/log-memoize.d.ts +1 -1
- package/build/util/log-memoize.js +1 -1
- package/build/util/validations.d.ts +59 -51
- package/build/util/validations.js +49 -18
- package/github-processes.md +16 -42
- package/manifests/bugs/aggregation-error-wrong-metric.yml +6 -6
- package/manifests/bugs/azure-importer-ignoring-defaults.yml +3 -3
- package/manifests/bugs/azure-importer-incorrect-calculation.yml +2 -2
- package/manifests/bugs/mock-observations-failure-duration-is-zero.yml +34 -0
- package/manifests/bugs/pipeline-error-uninitialized-plugin.yml +1 -1
- package/manifests/bugs/pipeline-ordering-error.yml +6 -6
- package/manifests/bugs/sci-embodied-missing-resources-total.yml +23 -0
- package/manifests/examples/generics.yml +3 -3
- package/manifests/examples/instance-metadata.yml +36 -0
- package/manifests/examples/mock-cpu-util-to-carbon.yml +3 -3
- package/manifests/examples/nesting.yml +37 -10
- package/manifests/examples/pipeline-teads-sci.yml +17 -9
- package/manifests/examples/pipeline-with-aggregate.yml +24 -9
- package/manifests/examples/pipeline-with-mocks.yml +26 -9
- package/manifests/examples/sci.yml +131 -0
- package/manifests/examples/teads-curve.yml +78 -0
- package/manifests/features/aggregate-failure-inalid-metrics.yml +43 -0
- package/manifests/features/aggregate-failure-missing-metric-in-inputs.yml +43 -0
- package/manifests/integrations/cloud-metadata-divide-boavizta.yml +1 -1
- package/manifests/integrations/mock-obs-group-by-cloud-meta.yml +51 -0
- package/manifests/integrations/mock-obs-groupby.yml +2 -2
- package/manifests/integrations/mock-obs-time-sync.yml +1 -1
- package/manifests/plugins/cloud-metadata/failure-invalid-instance-type.yaml +21 -0
- package/manifests/plugins/cloud-metadata/failure-invalid-vendor.yaml +1 -1
- package/manifests/plugins/cloud-metadata/failure-missing-cloud-vendor.yml +21 -0
- package/manifests/plugins/cloud-metadata/success.yml +1 -1
- package/manifests/plugins/coefficient/failure-invalid-config-input-param.yml +1 -1
- package/manifests/plugins/coefficient/failure-output-param-is-null.yaml +24 -0
- package/manifests/plugins/coefficient/success.yml +1 -1
- package/manifests/plugins/csv-lookup/failure-missing-column.yml +26 -0
- package/manifests/plugins/csv-lookup/failure-missing-output.yml +26 -0
- package/manifests/plugins/csv-lookup/success-renaming.yml +26 -0
- package/manifests/plugins/csv-lookup/success.yml +26 -0
- package/manifests/plugins/divide/failure-denominator-equal-zero.yml +39 -0
- package/manifests/plugins/divide/failure-invalid-config-denominator.yml +1 -1
- package/manifests/plugins/divide/failure-missing-numerator.yml +39 -0
- package/manifests/plugins/divide/success.yml +2 -2
- package/manifests/plugins/groupby/failure-missing-cloud-instance-type.yml +49 -0
- package/manifests/plugins/interpolation/interpolation.yml +24 -0
- package/manifests/plugins/mock-observations/failure-invalid-config-cpu-range.yml +1 -1
- package/manifests/plugins/mock-observations/failure-invalid-memory-utilization-range.yml +34 -0
- package/manifests/plugins/mock-observations/failure-missing-timestamp-from-param.yml +34 -0
- package/manifests/plugins/mock-observations/success.yml +2 -2
- package/manifests/plugins/multiply/failure-input-parameter-is-missing.yml +1 -1
- package/manifests/plugins/multiply/success-with-multiple-inputs.yml +32 -0
- package/manifests/plugins/multiply/success.yml +3 -3
- package/manifests/plugins/regex/failure-missing-input-param.yml +1 -1
- package/manifests/plugins/regex/failure-not-matching-with-regex.yml +24 -0
- package/manifests/plugins/regex/success.yml +2 -2
- package/manifests/plugins/sci/failure-invalid-config-value.yml +2 -3
- package/manifests/plugins/sci/failure-missing-input-param.yml +27 -0
- package/manifests/plugins/sci/success.yml +5 -4
- package/manifests/plugins/{sci-m → sci-embodied}/failure-invalid-default-emission-value.yml +5 -6
- package/manifests/plugins/sci-embodied/failure-missing-expected-lifespan.yml +23 -0
- package/manifests/plugins/{sci-m → sci-embodied}/success.yml +5 -6
- package/manifests/plugins/shell/failure-invalid-command.yml +1 -1
- package/manifests/plugins/shell/success.yml +1 -2
- package/manifests/plugins/sum/failure-missing-input-param.yml +1 -1
- package/manifests/plugins/sum/failure-missing-output-param.yml +28 -0
- package/manifests/plugins/sum/success.yml +1 -1
- package/manifests/plugins/tdp-finder/failure-unsupported-physical-processor.yml +19 -0
- package/manifests/plugins/time-sync/failure-missing-global-config.yml +34 -0
- package/package.json +10 -2
- package/src/builtins/README.md +5 -5
- package/src/builtins/coefficient/README.md +92 -0
- package/src/builtins/csv-lookup/README.md +142 -0
- package/src/builtins/divide/README.md +95 -0
- package/src/builtins/exponent/README.md +97 -0
- package/src/builtins/interpolation/README.md +168 -0
- package/src/builtins/mock-observations/README.md +97 -0
- package/src/builtins/multiply/README.md +94 -0
- package/src/builtins/regex/README.md +91 -0
- package/src/builtins/sci/README.md +89 -0
- package/src/builtins/sci-embodied/README.md +110 -0
- package/src/builtins/shell/README.md +130 -0
- package/src/builtins/subtract/README.md +94 -0
- package/src/builtins/sum/README.md +91 -0
- package/.env +0 -5
- package/coverage/clover.xml +0 -1590
- package/coverage/coverage-final.json +0 -50
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/builtins/coefficient/index.html +0 -116
- package/coverage/lcov-report/builtins/coefficient/index.ts.html +0 -295
- package/coverage/lcov-report/builtins/csv-lookup/index.html +0 -116
- package/coverage/lcov-report/builtins/csv-lookup/index.ts.html +0 -832
- package/coverage/lcov-report/builtins/divide/index.html +0 -116
- package/coverage/lcov-report/builtins/divide/index.ts.html +0 -361
- package/coverage/lcov-report/builtins/exponent/index.html +0 -116
- package/coverage/lcov-report/builtins/exponent/index.ts.html +0 -355
- package/coverage/lcov-report/builtins/export-csv-raw.ts.html +0 -553
- package/coverage/lcov-report/builtins/export-csv.ts.html +0 -433
- package/coverage/lcov-report/builtins/export-log.ts.html +0 -145
- package/coverage/lcov-report/builtins/export-yaml.ts.html +0 -184
- package/coverage/lcov-report/builtins/group-by.ts.html +0 -364
- package/coverage/lcov-report/builtins/index.html +0 -206
- package/coverage/lcov-report/builtins/index.ts.html +0 -130
- package/coverage/lcov-report/builtins/interpolation/index.html +0 -131
- package/coverage/lcov-report/builtins/interpolation/index.ts.html +0 -670
- package/coverage/lcov-report/builtins/interpolation/types.ts.html +0 -100
- package/coverage/lcov-report/builtins/mock-observations/helpers/common-generator.ts.html +0 -181
- package/coverage/lcov-report/builtins/mock-observations/helpers/index.html +0 -131
- package/coverage/lcov-report/builtins/mock-observations/helpers/rand-int-generator.ts.html +0 -295
- package/coverage/lcov-report/builtins/mock-observations/index.html +0 -116
- package/coverage/lcov-report/builtins/mock-observations/index.ts.html +0 -613
- package/coverage/lcov-report/builtins/multiply/index.html +0 -116
- package/coverage/lcov-report/builtins/multiply/index.ts.html +0 -337
- package/coverage/lcov-report/builtins/regex/index.html +0 -116
- package/coverage/lcov-report/builtins/regex/index.ts.html +0 -379
- package/coverage/lcov-report/builtins/sci/config.ts.html +0 -205
- package/coverage/lcov-report/builtins/sci/index.html +0 -116
- package/coverage/lcov-report/builtins/sci/index.ts.html +0 -331
- package/coverage/lcov-report/builtins/sci-embodied/index.html +0 -116
- package/coverage/lcov-report/builtins/sci-embodied/index.ts.html +0 -481
- package/coverage/lcov-report/builtins/shell/index.html +0 -116
- package/coverage/lcov-report/builtins/shell/index.ts.html +0 -283
- package/coverage/lcov-report/builtins/subtract/index.html +0 -116
- package/coverage/lcov-report/builtins/subtract/index.ts.html +0 -373
- package/coverage/lcov-report/builtins/sum/index.html +0 -116
- package/coverage/lcov-report/builtins/sum/index.ts.html +0 -340
- package/coverage/lcov-report/builtins/time-sync.ts.html +0 -1459
- package/coverage/lcov-report/config/config.ts.html +0 -334
- package/coverage/lcov-report/config/index.html +0 -161
- package/coverage/lcov-report/config/index.ts.html +0 -94
- package/coverage/lcov-report/config/params.ts.html +0 -697
- package/coverage/lcov-report/config/strings.ts.html +0 -415
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -386
- package/coverage/lcov-report/lib/aggregate.ts.html +0 -331
- package/coverage/lcov-report/lib/compare.ts.html +0 -283
- package/coverage/lcov-report/lib/compute.ts.html +0 -391
- package/coverage/lcov-report/lib/environment.ts.html +0 -343
- package/coverage/lcov-report/lib/exhaust.ts.html +0 -283
- package/coverage/lcov-report/lib/index.html +0 -221
- package/coverage/lcov-report/lib/initialize.ts.html +0 -388
- package/coverage/lcov-report/lib/load.ts.html +0 -268
- package/coverage/lcov-report/lib/parameterize.ts.html +0 -283
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov-report/types/aggregation.ts.html +0 -94
- package/coverage/lcov-report/types/index.html +0 -146
- package/coverage/lcov-report/types/interface.ts.html +0 -181
- package/coverage/lcov-report/types/parameters.ts.html +0 -106
- package/coverage/lcov-report/util/aggregation-helper.ts.html +0 -286
- package/coverage/lcov-report/util/args.ts.html +0 -508
- package/coverage/lcov-report/util/errors.ts.html +0 -232
- package/coverage/lcov-report/util/helpers.ts.html +0 -613
- package/coverage/lcov-report/util/index.html +0 -266
- package/coverage/lcov-report/util/json.ts.html +0 -115
- package/coverage/lcov-report/util/log-memoize.ts.html +0 -145
- package/coverage/lcov-report/util/logger.ts.html +0 -151
- package/coverage/lcov-report/util/os-checker.ts.html +0 -421
- package/coverage/lcov-report/util/plugin-storage.ts.html +0 -199
- package/coverage/lcov-report/util/validations.ts.html +0 -526
- package/coverage/lcov-report/util/yaml.ts.html +0 -193
- package/coverage/lcov.info +0 -2811
- package/src/__tests__/integration/manifest/sci-e.yaml +0 -23
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockObservations = void 0;
|
|
4
|
+
const luxon_1 = require("luxon");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const validations_1 = require("../../util/validations");
|
|
7
|
+
const common_generator_1 = require("./helpers/common-generator");
|
|
8
|
+
const rand_int_generator_1 = require("./helpers/rand-int-generator");
|
|
9
|
+
const MockObservations = (globalConfig) => {
|
|
10
|
+
const metadata = {
|
|
11
|
+
kind: 'execute',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Generate sets of mocked observations based on config.
|
|
15
|
+
*/
|
|
16
|
+
const execute = (inputs) => {
|
|
17
|
+
const { duration, timeBuckets, components, generators } = generateParamsFromConfig();
|
|
18
|
+
const generatorToHistory = new Map();
|
|
19
|
+
generators.forEach(generator => {
|
|
20
|
+
generatorToHistory.set(generator, []);
|
|
21
|
+
});
|
|
22
|
+
const defaults = inputs && inputs[0];
|
|
23
|
+
return Object.entries(components).reduce((acc, item) => {
|
|
24
|
+
const component = item[1];
|
|
25
|
+
timeBuckets.forEach(timeBucket => {
|
|
26
|
+
const observation = createObservation({ duration, component, timeBucket, generators }, generatorToHistory);
|
|
27
|
+
acc.push(Object.assign({}, defaults, observation));
|
|
28
|
+
});
|
|
29
|
+
return acc;
|
|
30
|
+
}, []);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Validates global config parameters.
|
|
34
|
+
*/
|
|
35
|
+
const validateGlobalConfig = () => {
|
|
36
|
+
const schema = zod_1.z.object({
|
|
37
|
+
'timestamp-from': zod_1.z.string(),
|
|
38
|
+
'timestamp-to': zod_1.z.string(),
|
|
39
|
+
duration: zod_1.z.number(),
|
|
40
|
+
components: zod_1.z.array(zod_1.z.record(zod_1.z.string())),
|
|
41
|
+
generators: zod_1.z.object({
|
|
42
|
+
common: zod_1.z.record(zod_1.z.string().or(zod_1.z.number())),
|
|
43
|
+
randint: zod_1.z.record(zod_1.z.object({ min: zod_1.z.number(), max: zod_1.z.number() })),
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
return (0, validations_1.validate)(schema, globalConfig);
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Configures the MockObservations Plugin for IF
|
|
50
|
+
*/
|
|
51
|
+
const generateParamsFromConfig = () => {
|
|
52
|
+
const { 'timestamp-from': timestampFrom, 'timestamp-to': timestampTo, duration, generators, components, } = validateGlobalConfig();
|
|
53
|
+
const convertedTimestampFrom = luxon_1.DateTime.fromISO(timestampFrom, {
|
|
54
|
+
zone: 'UTC',
|
|
55
|
+
});
|
|
56
|
+
const convertedTimestampTo = luxon_1.DateTime.fromISO(timestampTo, { zone: 'UTC' });
|
|
57
|
+
return {
|
|
58
|
+
duration,
|
|
59
|
+
timeBuckets: createTimeBuckets(convertedTimestampFrom, convertedTimestampTo, duration),
|
|
60
|
+
generators: createGenerators(generators),
|
|
61
|
+
components,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/*
|
|
65
|
+
* create time buckets based on start time, end time and duration of each bucket.
|
|
66
|
+
*/
|
|
67
|
+
const createTimeBuckets = (timestampFrom, timestampTo, duration, timeBuckets = []) => {
|
|
68
|
+
if (timestampFrom < timestampTo ||
|
|
69
|
+
timestampFrom.plus(luxon_1.Duration.fromObject({ seconds: duration })) < timestampTo) {
|
|
70
|
+
return createTimeBuckets(timestampFrom.plus(luxon_1.Duration.fromObject({ seconds: duration })), timestampTo, duration, [...timeBuckets, timestampFrom]);
|
|
71
|
+
}
|
|
72
|
+
return timeBuckets;
|
|
73
|
+
};
|
|
74
|
+
/*
|
|
75
|
+
* create generators based on a given config
|
|
76
|
+
*/
|
|
77
|
+
const createGenerators = (generatorsConfig) => {
|
|
78
|
+
const createCommonGenerator = (config) => [
|
|
79
|
+
(0, common_generator_1.CommonGenerator)(config),
|
|
80
|
+
];
|
|
81
|
+
const createRandIntGenerators = (config) => {
|
|
82
|
+
return Object.entries(config).map(([fieldToPopulate, value]) => (0, rand_int_generator_1.RandIntGenerator)(fieldToPopulate, value));
|
|
83
|
+
};
|
|
84
|
+
return Object.entries(generatorsConfig).flatMap(([key, value]) => key === 'randint'
|
|
85
|
+
? createRandIntGenerators(value).flat()
|
|
86
|
+
: createCommonGenerator(value));
|
|
87
|
+
};
|
|
88
|
+
/*
|
|
89
|
+
* Creates time buckets based on start time, end time and duration of each bucket.
|
|
90
|
+
*/
|
|
91
|
+
const createObservation = (observationParams, generatorToHistory) => {
|
|
92
|
+
const { duration, component, timeBucket, generators } = observationParams;
|
|
93
|
+
const timestamp = timeBucket.toISO();
|
|
94
|
+
const generateObservation = (generator) => {
|
|
95
|
+
const history = generatorToHistory.get(generator) || [];
|
|
96
|
+
const generated = generator.next(history);
|
|
97
|
+
generatorToHistory.set(generator, [...history, generated.value]);
|
|
98
|
+
return generated;
|
|
99
|
+
};
|
|
100
|
+
const generateObservations = (gen) => generateObservation(gen);
|
|
101
|
+
const generatedValues = generators.map(generateObservations);
|
|
102
|
+
const initialObservation = {
|
|
103
|
+
timestamp,
|
|
104
|
+
duration,
|
|
105
|
+
...component,
|
|
106
|
+
};
|
|
107
|
+
const generatedObservation = generatedValues.reduce((observation, generated) => Object.assign(observation, generated), initialObservation);
|
|
108
|
+
return generatedObservation;
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
metadata,
|
|
112
|
+
execute,
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
exports.MockObservations = MockObservations;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvbW9jay1vYnNlcnZhdGlvbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQXlDO0FBQ3pDLDZCQUFzQjtBQUt0Qix3REFBZ0Q7QUFFaEQsaUVBQTJEO0FBQzNELHFFQUE4RDtBQUl2RCxNQUFNLGdCQUFnQixHQUFHLENBQUMsWUFBMEIsRUFBaUIsRUFBRTtJQUM1RSxNQUFNLFFBQVEsR0FBRztRQUNmLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBc0IsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUMsR0FDbkQsd0JBQXdCLEVBQUUsQ0FBQztRQUM3QixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBRTFELFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0Isa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQW1CLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDckUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUNuQyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBQyxFQUM3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Q0FBQyxDQUFDO1lBRS9ELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUVqRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUM7UUFFRixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBYyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRSxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0QsTUFBTSxrQkFBa0IsR0FBaUI7WUFDdkMsU0FBUztZQUNULFFBQVE7WUFDUixHQUFHLFNBQVM7U0FDYixDQUFDO1FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUNqRCxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUNqRSxrQkFBa0IsQ0FDbkIsQ0FBQztRQUVGLE9BQU8sb0JBQW9DLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLFFBQVE7UUFDUixPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWxLVyxRQUFBLGdCQUFnQixvQkFrSzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEYXRlVGltZSwgRHVyYXRpb259IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtFeGVjdXRlUGx1Z2luLCBQbHVnaW5QYXJhbXN9IGZyb20gJy4uLy4uL3R5cGVzL2ludGVyZmFjZSc7XG5pbXBvcnQge0NvbmZpZ1BhcmFtcywgS2V5VmFsdWVQYWlyfSBmcm9tICcuLi8uLi90eXBlcy9jb21tb24nO1xuXG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi91dGlsL3ZhbGlkYXRpb25zJztcblxuaW1wb3J0IHtDb21tb25HZW5lcmF0b3J9IGZyb20gJy4vaGVscGVycy9jb21tb24tZ2VuZXJhdG9yJztcbmltcG9ydCB7UmFuZEludEdlbmVyYXRvcn0gZnJvbSAnLi9oZWxwZXJzL3JhbmQtaW50LWdlbmVyYXRvcic7XG5pbXBvcnQge0dlbmVyYXRvcn0gZnJvbSAnLi9pbnRlcmZhY2VzL2luZGV4JztcbmltcG9ydCB7T2JzZXJ2YXRpb25QYXJhbXN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgTW9ja09ic2VydmF0aW9ucyA9IChnbG9iYWxDb25maWc6IENvbmZpZ1BhcmFtcyk6IEV4ZWN1dGVQbHVnaW4gPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICBraW5kOiAnZXhlY3V0ZScsXG4gIH07XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNldHMgb2YgbW9ja2VkIG9ic2VydmF0aW9ucyBiYXNlZCBvbiBjb25maWcuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pID0+IHtcbiAgICBjb25zdCB7ZHVyYXRpb24sIHRpbWVCdWNrZXRzLCBjb21wb25lbnRzLCBnZW5lcmF0b3JzfSA9XG4gICAgICBnZW5lcmF0ZVBhcmFtc0Zyb21Db25maWcoKTtcbiAgICBjb25zdCBnZW5lcmF0b3JUb0hpc3RvcnkgPSBuZXcgTWFwPEdlbmVyYXRvciwgbnVtYmVyW10+KCk7XG5cbiAgICBnZW5lcmF0b3JzLmZvckVhY2goZ2VuZXJhdG9yID0+IHtcbiAgICAgIGdlbmVyYXRvclRvSGlzdG9yeS5zZXQoZ2VuZXJhdG9yLCBbXSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyA9IGlucHV0cyAmJiBpbnB1dHNbMF07XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykucmVkdWNlKChhY2M6IFBsdWdpblBhcmFtc1tdLCBpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtWzFdO1xuICAgICAgdGltZUJ1Y2tldHMuZm9yRWFjaCh0aW1lQnVja2V0ID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YXRpb24gPSBjcmVhdGVPYnNlcnZhdGlvbihcbiAgICAgICAgICB7ZHVyYXRpb24sIGNvbXBvbmVudCwgdGltZUJ1Y2tldCwgZ2VuZXJhdG9yc30sXG4gICAgICAgICAgZ2VuZXJhdG9yVG9IaXN0b3J5XG4gICAgICAgICk7XG5cbiAgICAgICAgYWNjLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9ic2VydmF0aW9uKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBnbG9iYWwgY29uZmlnIHBhcmFtZXRlcnMuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZUdsb2JhbENvbmZpZyA9ICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICAndGltZXN0YW1wLWZyb20nOiB6LnN0cmluZygpLFxuICAgICAgJ3RpbWVzdGFtcC10byc6IHouc3RyaW5nKCksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICAgIGNvbXBvbmVudHM6IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSkpLFxuICAgICAgZ2VuZXJhdG9yczogei5vYmplY3Qoe1xuICAgICAgICBjb21tb246IHoucmVjb3JkKHouc3RyaW5nKCkub3Ioei5udW1iZXIoKSkpLFxuICAgICAgICByYW5kaW50OiB6LnJlY29yZCh6Lm9iamVjdCh7bWluOiB6Lm51bWJlcigpLCBtYXg6IHoubnVtYmVyKCl9KSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGdsb2JhbENvbmZpZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIE1vY2tPYnNlcnZhdGlvbnMgUGx1Z2luIGZvciBJRlxuICAgKi9cbiAgY29uc3QgZ2VuZXJhdGVQYXJhbXNGcm9tQ29uZmlnID0gKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICd0aW1lc3RhbXAtZnJvbSc6IHRpbWVzdGFtcEZyb20sXG4gICAgICAndGltZXN0YW1wLXRvJzogdGltZXN0YW1wVG8sXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGdlbmVyYXRvcnMsXG4gICAgICBjb21wb25lbnRzLFxuICAgIH0gPSB2YWxpZGF0ZUdsb2JhbENvbmZpZygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZFRpbWVzdGFtcEZyb20gPSBEYXRlVGltZS5mcm9tSVNPKHRpbWVzdGFtcEZyb20sIHtcbiAgICAgIHpvbmU6ICdVVEMnLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnZlcnRlZFRpbWVzdGFtcFRvID0gRGF0ZVRpbWUuZnJvbUlTTyh0aW1lc3RhbXBUbywge3pvbmU6ICdVVEMnfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHVyYXRpb24sXG4gICAgICB0aW1lQnVja2V0czogY3JlYXRlVGltZUJ1Y2tldHMoXG4gICAgICAgIGNvbnZlcnRlZFRpbWVzdGFtcEZyb20sXG4gICAgICAgIGNvbnZlcnRlZFRpbWVzdGFtcFRvLFxuICAgICAgICBkdXJhdGlvblxuICAgICAgKSxcbiAgICAgIGdlbmVyYXRvcnM6IGNyZWF0ZUdlbmVyYXRvcnMoZ2VuZXJhdG9ycyksXG4gICAgICBjb21wb25lbnRzLFxuICAgIH07XG4gIH07XG5cbiAgLypcbiAgICogY3JlYXRlIHRpbWUgYnVja2V0cyBiYXNlZCBvbiBzdGFydCB0aW1lLCBlbmQgdGltZSBhbmQgZHVyYXRpb24gb2YgZWFjaCBidWNrZXQuXG4gICAqL1xuICBjb25zdCBjcmVhdGVUaW1lQnVja2V0cyA9IChcbiAgICB0aW1lc3RhbXBGcm9tOiBEYXRlVGltZSxcbiAgICB0aW1lc3RhbXBUbzogRGF0ZVRpbWUsXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICB0aW1lQnVja2V0czogRGF0ZVRpbWVbXSA9IFtdXG4gICk6IERhdGVUaW1lW10gPT4ge1xuICAgIGlmIChcbiAgICAgIHRpbWVzdGFtcEZyb20gPCB0aW1lc3RhbXBUbyB8fFxuICAgICAgdGltZXN0YW1wRnJvbS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3Qoe3NlY29uZHM6IGR1cmF0aW9ufSkpIDwgdGltZXN0YW1wVG9cbiAgICApIHtcbiAgICAgIHJldHVybiBjcmVhdGVUaW1lQnVja2V0cyhcbiAgICAgICAgdGltZXN0YW1wRnJvbS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3Qoe3NlY29uZHM6IGR1cmF0aW9ufSkpLFxuICAgICAgICB0aW1lc3RhbXBUbyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIFsuLi50aW1lQnVja2V0cywgdGltZXN0YW1wRnJvbV1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aW1lQnVja2V0cztcbiAgfTtcblxuICAvKlxuICAgKiBjcmVhdGUgZ2VuZXJhdG9ycyBiYXNlZCBvbiBhIGdpdmVuIGNvbmZpZ1xuICAgKi9cbiAgY29uc3QgY3JlYXRlR2VuZXJhdG9ycyA9IChnZW5lcmF0b3JzQ29uZmlnOiBvYmplY3QpOiBHZW5lcmF0b3JbXSA9PiB7XG4gICAgY29uc3QgY3JlYXRlQ29tbW9uR2VuZXJhdG9yID0gKGNvbmZpZzogYW55KTogR2VuZXJhdG9yW10gPT4gW1xuICAgICAgQ29tbW9uR2VuZXJhdG9yKGNvbmZpZyksXG4gICAgXTtcblxuICAgIGNvbnN0IGNyZWF0ZVJhbmRJbnRHZW5lcmF0b3JzID0gKGNvbmZpZzogYW55KTogR2VuZXJhdG9yW10gPT4ge1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbmZpZykubWFwKChbZmllbGRUb1BvcHVsYXRlLCB2YWx1ZV0pID0+XG4gICAgICAgIFJhbmRJbnRHZW5lcmF0b3IoZmllbGRUb1BvcHVsYXRlLCB2YWx1ZSBhcyBLZXlWYWx1ZVBhaXIpXG4gICAgICApO1xuICAgIH07XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2VuZXJhdG9yc0NvbmZpZykuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAga2V5ID09PSAncmFuZGludCdcbiAgICAgICAgPyBjcmVhdGVSYW5kSW50R2VuZXJhdG9ycyh2YWx1ZSkuZmxhdCgpXG4gICAgICAgIDogY3JlYXRlQ29tbW9uR2VuZXJhdG9yKHZhbHVlKVxuICAgICk7XG4gIH07XG5cbiAgLypcbiAgICogQ3JlYXRlcyB0aW1lIGJ1Y2tldHMgYmFzZWQgb24gc3RhcnQgdGltZSwgZW5kIHRpbWUgYW5kIGR1cmF0aW9uIG9mIGVhY2ggYnVja2V0LlxuICAgKi9cbiAgY29uc3QgY3JlYXRlT2JzZXJ2YXRpb24gPSAoXG4gICAgb2JzZXJ2YXRpb25QYXJhbXM6IE9ic2VydmF0aW9uUGFyYW1zLFxuICAgIGdlbmVyYXRvclRvSGlzdG9yeTogTWFwPEdlbmVyYXRvciwgbnVtYmVyW10+XG4gICk6IFBsdWdpblBhcmFtcyA9PiB7XG4gICAgY29uc3Qge2R1cmF0aW9uLCBjb21wb25lbnQsIHRpbWVCdWNrZXQsIGdlbmVyYXRvcnN9ID0gb2JzZXJ2YXRpb25QYXJhbXM7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGltZUJ1Y2tldC50b0lTTygpO1xuXG4gICAgY29uc3QgZ2VuZXJhdGVPYnNlcnZhdGlvbiA9IChnZW5lcmF0b3I6IEdlbmVyYXRvcikgPT4ge1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGdlbmVyYXRvclRvSGlzdG9yeS5nZXQoZ2VuZXJhdG9yKSB8fCBbXTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdlbmVyYXRvci5uZXh0KGhpc3RvcnkpO1xuXG4gICAgICBnZW5lcmF0b3JUb0hpc3Rvcnkuc2V0KGdlbmVyYXRvciwgWy4uLmhpc3RvcnksIGdlbmVyYXRlZC52YWx1ZV0pO1xuXG4gICAgICByZXR1cm4gZ2VuZXJhdGVkO1xuICAgIH07XG5cbiAgICBjb25zdCBnZW5lcmF0ZU9ic2VydmF0aW9ucyA9IChnZW46IEdlbmVyYXRvcikgPT4gZ2VuZXJhdGVPYnNlcnZhdGlvbihnZW4pO1xuICAgIGNvbnN0IGdlbmVyYXRlZFZhbHVlcyA9IGdlbmVyYXRvcnMubWFwKGdlbmVyYXRlT2JzZXJ2YXRpb25zKTtcbiAgICBjb25zdCBpbml0aWFsT2JzZXJ2YXRpb246IFBsdWdpblBhcmFtcyA9IHtcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgLi4uY29tcG9uZW50LFxuICAgIH07XG4gICAgY29uc3QgZ2VuZXJhdGVkT2JzZXJ2YXRpb24gPSBnZW5lcmF0ZWRWYWx1ZXMucmVkdWNlKFxuICAgICAgKG9ic2VydmF0aW9uLCBnZW5lcmF0ZWQpID0+IE9iamVjdC5hc3NpZ24ob2JzZXJ2YXRpb24sIGdlbmVyYXRlZCksXG4gICAgICBpbml0aWFsT2JzZXJ2YXRpb25cbiAgICApO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlZE9ic2VydmF0aW9uIGFzIFBsdWdpblBhcmFtcztcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1ldGFkYXRhLFxuICAgIGV4ZWN1dGUsXG4gIH07XG59O1xuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYnVpbHRpbnMvbW9jay1vYnNlcnZhdGlvbnMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgR2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogZ2VuZXJhdGUgdGhlIG5leHQgdmFsdWUsIG9wdGlvbmFsbHkgYmFzZWQgb24gaGlzdG9yaWNhbCB2YWx1ZXNcbiAgICovXG4gIG5leHQ6IChoaXN0b3JpY2FsOiBPYmplY3RbXSB8IHVuZGVmaW5lZCkgPT4gT2JqZWN0O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { Generator } from './interfaces/index';
|
|
3
|
+
export type ObservationParams = {
|
|
4
|
+
duration: number;
|
|
5
|
+
timeBucket: DateTime;
|
|
6
|
+
component: Record<string, string>;
|
|
7
|
+
generators: Generator[];
|
|
8
|
+
};
|
|
9
|
+
export type RandIntGeneratorParams = {
|
|
10
|
+
name: string;
|
|
11
|
+
min: number;
|
|
12
|
+
max: number;
|
|
13
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvbW9jay1vYnNlcnZhdGlvbnMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJ2x1eG9uJztcblxuaW1wb3J0IHtHZW5lcmF0b3J9IGZyb20gJy4vaW50ZXJmYWNlcy9pbmRleCc7XG5cbmV4cG9ydCB0eXBlIE9ic2VydmF0aW9uUGFyYW1zID0ge1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICB0aW1lQnVja2V0OiBEYXRlVGltZTtcbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBnZW5lcmF0b3JzOiBHZW5lcmF0b3JbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJhbmRJbnRHZW5lcmF0b3JQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Multiply = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const helpers_1 = require("../../util/helpers");
|
|
6
|
+
const errors_1 = require("../../util/errors");
|
|
7
|
+
const validations_1 = require("../../util/validations");
|
|
8
|
+
const { InputValidationError } = errors_1.ERRORS;
|
|
9
|
+
const Multiply = (globalConfig) => {
|
|
10
|
+
const errorBuilder = (0, helpers_1.buildErrorMessage)(exports.Multiply.name);
|
|
11
|
+
const metadata = {
|
|
12
|
+
kind: 'execute',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Checks global config value are valid.
|
|
16
|
+
*/
|
|
17
|
+
const validateGlobalConfig = () => {
|
|
18
|
+
const globalConfigSchema = zod_1.z.object({
|
|
19
|
+
'input-parameters': zod_1.z.array(zod_1.z.string()),
|
|
20
|
+
'output-parameter': zod_1.z.string().min(1),
|
|
21
|
+
});
|
|
22
|
+
return (0, validations_1.validate)(globalConfigSchema, globalConfig);
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Checks for required fields in input.
|
|
26
|
+
*/
|
|
27
|
+
const validateSingleInput = (input, inputParameters) => {
|
|
28
|
+
inputParameters.forEach(metricToMultiply => {
|
|
29
|
+
if (input[metricToMultiply] === undefined ||
|
|
30
|
+
isNaN(input[metricToMultiply])) {
|
|
31
|
+
throw new InputValidationError(errorBuilder({
|
|
32
|
+
message: `${metricToMultiply} is missing from the input array`,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return input;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Calculate the product of each input parameter.
|
|
40
|
+
*/
|
|
41
|
+
const execute = (inputs) => {
|
|
42
|
+
const safeGlobalConfig = validateGlobalConfig();
|
|
43
|
+
const inputParameters = safeGlobalConfig['input-parameters'];
|
|
44
|
+
const outputParameter = safeGlobalConfig['output-parameter'];
|
|
45
|
+
return inputs.map(input => {
|
|
46
|
+
const safeInput = validateSingleInput(input, inputParameters);
|
|
47
|
+
return {
|
|
48
|
+
...input,
|
|
49
|
+
[outputParameter]: calculateProduct(safeInput, inputParameters),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Calculates the product of the energy components.
|
|
55
|
+
*/
|
|
56
|
+
const calculateProduct = (input, inputParameters) => inputParameters.reduce((accumulator, metricToMultiply) => accumulator * input[metricToMultiply], 1);
|
|
57
|
+
return {
|
|
58
|
+
metadata,
|
|
59
|
+
execute,
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
exports.Multiply = Multiply;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvbXVsdGlwbHkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXNCO0FBRXRCLGdEQUFxRDtBQUNyRCw4Q0FBeUM7QUFDekMsd0RBQWdEO0FBS2hELE1BQU0sRUFBQyxvQkFBb0IsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUUvQixNQUFNLFFBQVEsR0FBRyxDQUFDLFlBQTRCLEVBQWlCLEVBQUU7SUFDdEUsTUFBTSxZQUFZLEdBQUcsSUFBQSwyQkFBaUIsRUFBQyxnQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2xDLGtCQUFrQixFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLGtCQUFrQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBQSxzQkFBUSxFQUNiLGtCQUFrQixFQUNsQixZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixLQUFtQixFQUNuQixlQUF5QixFQUN6QixFQUFFO1FBQ0YsZUFBZSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3pDLElBQ0UsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssU0FBUztnQkFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQzlCO2dCQUNBLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsWUFBWSxDQUFDO29CQUNYLE9BQU8sRUFBRSxHQUFHLGdCQUFnQixrQ0FBa0M7aUJBQy9ELENBQUMsQ0FDSCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQXNCLEVBQWtCLEVBQUU7UUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUU3RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRTlELE9BQU87Z0JBQ0wsR0FBRyxLQUFLO2dCQUNSLENBQUMsZUFBZSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQzthQUNoRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFtQixFQUFFLGVBQXlCLEVBQUUsRUFBRSxDQUMxRSxlQUFlLENBQUMsTUFBTSxDQUNwQixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN4RSxDQUFDLENBQ0YsQ0FBQztJQUVKLE9BQU87UUFDTCxRQUFRO1FBQ1IsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDLENBQUM7QUEzRVcsUUFBQSxRQUFRLFlBMkVuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7en0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtidWlsZEVycm9yTWVzc2FnZX0gZnJvbSAnLi4vLi4vdXRpbC9oZWxwZXJzJztcbmltcG9ydCB7RVJST1JTfSBmcm9tICcuLi8uLi91dGlsL2Vycm9ycyc7XG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi91dGlsL3ZhbGlkYXRpb25zJztcblxuaW1wb3J0IHtFeGVjdXRlUGx1Z2luLCBQbHVnaW5QYXJhbXN9IGZyb20gJy4uLy4uL3R5cGVzL2ludGVyZmFjZSc7XG5pbXBvcnQge011bHRpcGx5Q29uZmlnfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3Qge0lucHV0VmFsaWRhdGlvbkVycm9yfSA9IEVSUk9SUztcblxuZXhwb3J0IGNvbnN0IE11bHRpcGx5ID0gKGdsb2JhbENvbmZpZzogTXVsdGlwbHlDb25maWcpOiBFeGVjdXRlUGx1Z2luID0+IHtcbiAgY29uc3QgZXJyb3JCdWlsZGVyID0gYnVpbGRFcnJvck1lc3NhZ2UoTXVsdGlwbHkubmFtZSk7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIGtpbmQ6ICdleGVjdXRlJyxcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGdsb2JhbCBjb25maWcgdmFsdWUgYXJlIHZhbGlkLlxuICAgKi9cbiAgY29uc3QgdmFsaWRhdGVHbG9iYWxDb25maWcgPSAoKSA9PiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgJ2lucHV0LXBhcmFtZXRlcnMnOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgJ291dHB1dC1wYXJhbWV0ZXInOiB6LnN0cmluZygpLm1pbigxKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBnbG9iYWxDb25maWdTY2hlbWE+PihcbiAgICAgIGdsb2JhbENvbmZpZ1NjaGVtYSxcbiAgICAgIGdsb2JhbENvbmZpZ1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBmb3IgcmVxdWlyZWQgZmllbGRzIGluIGlucHV0LlxuICAgKi9cbiAgY29uc3QgdmFsaWRhdGVTaW5nbGVJbnB1dCA9IChcbiAgICBpbnB1dDogUGx1Z2luUGFyYW1zLFxuICAgIGlucHV0UGFyYW1ldGVyczogc3RyaW5nW11cbiAgKSA9PiB7XG4gICAgaW5wdXRQYXJhbWV0ZXJzLmZvckVhY2gobWV0cmljVG9NdWx0aXBseSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlucHV0W21ldHJpY1RvTXVsdGlwbHldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgaXNOYU4oaW5wdXRbbWV0cmljVG9NdWx0aXBseV0pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGVycm9yQnVpbGRlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBgJHttZXRyaWNUb011bHRpcGx5fSBpcyBtaXNzaW5nIGZyb20gdGhlIGlucHV0IGFycmF5YCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb2YgZWFjaCBpbnB1dCBwYXJhbWV0ZXIuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgY29uc3Qgc2FmZUdsb2JhbENvbmZpZyA9IHZhbGlkYXRlR2xvYmFsQ29uZmlnKCk7XG4gICAgY29uc3QgaW5wdXRQYXJhbWV0ZXJzID0gc2FmZUdsb2JhbENvbmZpZ1snaW5wdXQtcGFyYW1ldGVycyddO1xuICAgIGNvbnN0IG91dHB1dFBhcmFtZXRlciA9IHNhZmVHbG9iYWxDb25maWdbJ291dHB1dC1wYXJhbWV0ZXInXTtcblxuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHNhZmVJbnB1dCA9IHZhbGlkYXRlU2luZ2xlSW5wdXQoaW5wdXQsIGlucHV0UGFyYW1ldGVycyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0LFxuICAgICAgICBbb3V0cHV0UGFyYW1ldGVyXTogY2FsY3VsYXRlUHJvZHVjdChzYWZlSW5wdXQsIGlucHV0UGFyYW1ldGVycyksXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBwcm9kdWN0IG9mIHRoZSBlbmVyZ3kgY29tcG9uZW50cy5cbiAgICovXG4gIGNvbnN0IGNhbGN1bGF0ZVByb2R1Y3QgPSAoaW5wdXQ6IFBsdWdpblBhcmFtcywgaW5wdXRQYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT5cbiAgICBpbnB1dFBhcmFtZXRlcnMucmVkdWNlKFxuICAgICAgKGFjY3VtdWxhdG9yLCBtZXRyaWNUb011bHRpcGx5KSA9PiBhY2N1bXVsYXRvciAqIGlucHV0W21ldHJpY1RvTXVsdGlwbHldLFxuICAgICAgMVxuICAgICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXRhZGF0YSxcbiAgICBleGVjdXRlLFxuICB9O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvbXVsdGlwbHkvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE11bHRpcGx5Q29uZmlnID0ge1xuICAnaW5wdXQtcGFyYW1ldGVycyc6IHN0cmluZ1tdO1xuICAnb3V0cHV0LXBhcmFtZXRlcic6IHN0cmluZztcbn07XG4iXX0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Regex = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const helpers_1 = require("../../util/helpers");
|
|
6
|
+
const errors_1 = require("../../util/errors");
|
|
7
|
+
const validations_1 = require("../../util/validations");
|
|
8
|
+
const { InputValidationError, ConfigValidationError } = errors_1.ERRORS;
|
|
9
|
+
const Regex = (globalConfig) => {
|
|
10
|
+
const errorBuilder = (0, helpers_1.buildErrorMessage)(exports.Regex.name);
|
|
11
|
+
const metadata = {
|
|
12
|
+
kind: 'execute',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Checks global config value are valid.
|
|
16
|
+
*/
|
|
17
|
+
const validateGlobalConfig = () => {
|
|
18
|
+
if (!globalConfig) {
|
|
19
|
+
throw new ConfigValidationError(errorBuilder({ message: 'Configuration data is missing' }));
|
|
20
|
+
}
|
|
21
|
+
const schema = zod_1.z.object({
|
|
22
|
+
parameter: zod_1.z.string().min(1),
|
|
23
|
+
match: zod_1.z.string().min(1),
|
|
24
|
+
output: zod_1.z.string(),
|
|
25
|
+
});
|
|
26
|
+
return (0, validations_1.validate)(schema, globalConfig);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Checks for required fields in input.
|
|
30
|
+
*/
|
|
31
|
+
const validateSingleInput = (input, parameter) => {
|
|
32
|
+
if (!input[parameter]) {
|
|
33
|
+
throw new InputValidationError(errorBuilder({
|
|
34
|
+
message: `\`${parameter}\` is missing from the input`,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
return input;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Executes the regex of the given parameter.
|
|
41
|
+
*/
|
|
42
|
+
const execute = (inputs) => {
|
|
43
|
+
const safeGlobalConfig = validateGlobalConfig();
|
|
44
|
+
const { parameter: parameter, match, output } = safeGlobalConfig;
|
|
45
|
+
return inputs.map(input => {
|
|
46
|
+
const safeInput = Object.assign({}, input, validateSingleInput(input, parameter));
|
|
47
|
+
return {
|
|
48
|
+
...input,
|
|
49
|
+
[output]: extractMatching(safeInput, parameter, match),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Extracts a substring from the given input parameter that matches the provided regular expression pattern.
|
|
55
|
+
*/
|
|
56
|
+
const extractMatching = (input, parameter, match) => {
|
|
57
|
+
if (!match.startsWith('/')) {
|
|
58
|
+
match = '/' + match;
|
|
59
|
+
}
|
|
60
|
+
if (!match.endsWith('/g') && !match.endsWith('/')) {
|
|
61
|
+
match += '/';
|
|
62
|
+
}
|
|
63
|
+
const regex = eval(match);
|
|
64
|
+
const matchedItem = input[parameter].match(regex);
|
|
65
|
+
if (!matchedItem || !matchedItem[0]) {
|
|
66
|
+
throw new InputValidationError(errorBuilder({
|
|
67
|
+
message: `\`${input[parameter]}\` does not match the ${match} regex expression`,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
return matchedItem[0];
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
metadata,
|
|
74
|
+
execute,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
exports.Regex = Regex;
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvcmVnZXgvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXNCO0FBRXRCLGdEQUFxRDtBQUNyRCw4Q0FBeUM7QUFDekMsd0RBQWdEO0FBS2hELE1BQU0sRUFBQyxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUV0RCxNQUFNLEtBQUssR0FBRyxDQUFDLFlBQTBCLEVBQWlCLEVBQUU7SUFDakUsTUFBTSxZQUFZLEdBQUcsSUFBQSwyQkFBaUIsRUFBQyxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQUc7UUFDZixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsRUFBRTtRQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxxQkFBcUIsQ0FDN0IsWUFBWSxDQUFDLEVBQUMsT0FBTyxFQUFFLCtCQUErQixFQUFDLENBQUMsQ0FDekQsQ0FBQztTQUNIO1FBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0QixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUIsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1NBQ25CLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBQSxzQkFBUSxFQUF5QixNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBbUIsRUFBRSxTQUFpQixFQUFFLEVBQUU7UUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQixNQUFNLElBQUksb0JBQW9CLENBQzVCLFlBQVksQ0FBQztnQkFDWCxPQUFPLEVBQUUsS0FBSyxTQUFTLDhCQUE4QjthQUN0RCxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBc0IsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsZ0JBQWdCLENBQUM7UUFFL0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzdCLEVBQUUsRUFDRixLQUFLLEVBQ0wsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUN0QyxDQUFDO1lBRUYsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsQ0FBQyxNQUFNLENBQUMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7YUFDdkQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLGVBQWUsR0FBRyxDQUN0QixLQUFtQixFQUNuQixTQUFpQixFQUNqQixLQUFhLEVBQ2IsRUFBRTtRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELEtBQUssSUFBSSxHQUFHLENBQUM7U0FDZDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixZQUFZLENBQUM7Z0JBQ1gsT0FBTyxFQUFFLEtBQUssS0FBSyxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsS0FBSyxtQkFBbUI7YUFDaEYsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUVELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRO1FBQ1IsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDLENBQUM7QUE5RlcsUUFBQSxLQUFLLFNBOEZoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7en0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtidWlsZEVycm9yTWVzc2FnZX0gZnJvbSAnLi4vLi4vdXRpbC9oZWxwZXJzJztcbmltcG9ydCB7RVJST1JTfSBmcm9tICcuLi8uLi91dGlsL2Vycm9ycyc7XG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi91dGlsL3ZhbGlkYXRpb25zJztcblxuaW1wb3J0IHtFeGVjdXRlUGx1Z2luLCBQbHVnaW5QYXJhbXN9IGZyb20gJy4uLy4uL3R5cGVzL2ludGVyZmFjZSc7XG5pbXBvcnQge0NvbmZpZ1BhcmFtc30gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9uJztcblxuY29uc3Qge0lucHV0VmFsaWRhdGlvbkVycm9yLCBDb25maWdWYWxpZGF0aW9uRXJyb3J9ID0gRVJST1JTO1xuXG5leHBvcnQgY29uc3QgUmVnZXggPSAoZ2xvYmFsQ29uZmlnOiBDb25maWdQYXJhbXMpOiBFeGVjdXRlUGx1Z2luID0+IHtcbiAgY29uc3QgZXJyb3JCdWlsZGVyID0gYnVpbGRFcnJvck1lc3NhZ2UoUmVnZXgubmFtZSk7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIGtpbmQ6ICdleGVjdXRlJyxcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGdsb2JhbCBjb25maWcgdmFsdWUgYXJlIHZhbGlkLlxuICAgKi9cbiAgY29uc3QgdmFsaWRhdGVHbG9iYWxDb25maWcgPSAoKSA9PiB7XG4gICAgaWYgKCFnbG9iYWxDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBDb25maWdWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGVycm9yQnVpbGRlcih7bWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gZGF0YSBpcyBtaXNzaW5nJ30pXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICBwYXJhbWV0ZXI6IHouc3RyaW5nKCkubWluKDEpLFxuICAgICAgbWF0Y2g6IHouc3RyaW5nKCkubWluKDEpLFxuICAgICAgb3V0cHV0OiB6LnN0cmluZygpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgZ2xvYmFsQ29uZmlnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gaW5wdXQuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZVNpbmdsZUlucHV0ID0gKGlucHV0OiBQbHVnaW5QYXJhbXMsIHBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFpbnB1dFtwYXJhbWV0ZXJdKSB7XG4gICAgICB0aHJvdyBuZXcgSW5wdXRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGVycm9yQnVpbGRlcih7XG4gICAgICAgICAgbWVzc2FnZTogYFxcYCR7cGFyYW1ldGVyfVxcYCBpcyBtaXNzaW5nIGZyb20gdGhlIGlucHV0YCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgcmVnZXggb2YgdGhlIGdpdmVuIHBhcmFtZXRlci5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSkgPT4ge1xuICAgIGNvbnN0IHNhZmVHbG9iYWxDb25maWcgPSB2YWxpZGF0ZUdsb2JhbENvbmZpZygpO1xuICAgIGNvbnN0IHtwYXJhbWV0ZXI6IHBhcmFtZXRlciwgbWF0Y2gsIG91dHB1dH0gPSBzYWZlR2xvYmFsQ29uZmlnO1xuXG4gICAgcmV0dXJuIGlucHV0cy5tYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3Qgc2FmZUlucHV0ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGlucHV0LFxuICAgICAgICB2YWxpZGF0ZVNpbmdsZUlucHV0KGlucHV0LCBwYXJhbWV0ZXIpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgW291dHB1dF06IGV4dHJhY3RNYXRjaGluZyhzYWZlSW5wdXQsIHBhcmFtZXRlciwgbWF0Y2gpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXh0cmFjdHMgYSBzdWJzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcGFyYW1ldGVyIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uXG4gICAqL1xuICBjb25zdCBleHRyYWN0TWF0Y2hpbmcgPSAoXG4gICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICBwYXJhbWV0ZXI6IHN0cmluZyxcbiAgICBtYXRjaDogc3RyaW5nXG4gICkgPT4ge1xuICAgIGlmICghbWF0Y2guc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICBtYXRjaCA9ICcvJyArIG1hdGNoO1xuICAgIH1cblxuICAgIGlmICghbWF0Y2guZW5kc1dpdGgoJy9nJykgJiYgIW1hdGNoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIG1hdGNoICs9ICcvJztcbiAgICB9XG5cbiAgICBjb25zdCByZWdleCA9IGV2YWwobWF0Y2gpO1xuICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaW5wdXRbcGFyYW1ldGVyXS5tYXRjaChyZWdleCk7XG5cbiAgICBpZiAoIW1hdGNoZWRJdGVtIHx8ICFtYXRjaGVkSXRlbVswXSkge1xuICAgICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBlcnJvckJ1aWxkZXIoe1xuICAgICAgICAgIG1lc3NhZ2U6IGBcXGAke2lucHV0W3BhcmFtZXRlcl19XFxgIGRvZXMgbm90IG1hdGNoIHRoZSAke21hdGNofSByZWdleCBleHByZXNzaW9uYCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtWzBdO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbWV0YWRhdGEsXG4gICAgZXhlY3V0ZSxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TIME_UNITS_IN_SECONDS: Record<string, number>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TIME_UNITS_IN_SECONDS = void 0;
|
|
4
|
+
exports.TIME_UNITS_IN_SECONDS = {
|
|
5
|
+
s: 1,
|
|
6
|
+
second: 1,
|
|
7
|
+
sec: 1,
|
|
8
|
+
secs: 1,
|
|
9
|
+
seconds: 1,
|
|
10
|
+
min: 60,
|
|
11
|
+
mins: 60,
|
|
12
|
+
minute: 60,
|
|
13
|
+
minutes: 60,
|
|
14
|
+
h: 3600,
|
|
15
|
+
hs: 3600,
|
|
16
|
+
hr: 3600,
|
|
17
|
+
hrs: 3600,
|
|
18
|
+
hour: 3600,
|
|
19
|
+
hours: 3600,
|
|
20
|
+
d: 86400,
|
|
21
|
+
ds: 86400,
|
|
22
|
+
day: 86400,
|
|
23
|
+
days: 86400,
|
|
24
|
+
w: 604800,
|
|
25
|
+
ws: 604800,
|
|
26
|
+
wk: 604800,
|
|
27
|
+
wks: 604800,
|
|
28
|
+
week: 604800,
|
|
29
|
+
weeks: 604800,
|
|
30
|
+
m: 2419200,
|
|
31
|
+
mnth: 2419200,
|
|
32
|
+
mth: 2419200,
|
|
33
|
+
mnths: 2419200,
|
|
34
|
+
mths: 2419200,
|
|
35
|
+
month: 2419200,
|
|
36
|
+
months: 2419200,
|
|
37
|
+
y: 31536000,
|
|
38
|
+
ys: 31536000,
|
|
39
|
+
yr: 31536000,
|
|
40
|
+
yrs: 31536000,
|
|
41
|
+
year: 31536000,
|
|
42
|
+
years: 31536000,
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2J1aWx0aW5zL3NjaS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxxQkFBcUIsR0FBMkI7SUFDM0QsQ0FBQyxFQUFFLENBQUM7SUFDSixNQUFNLEVBQUUsQ0FBQztJQUNULEdBQUcsRUFBRSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxFQUFFO0lBQ1AsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtJQUNWLE9BQU8sRUFBRSxFQUFFO0lBQ1gsQ0FBQyxFQUFFLElBQUk7SUFDUCxFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsR0FBRyxFQUFFLElBQUk7SUFDVCxJQUFJLEVBQUUsSUFBSTtJQUNWLEtBQUssRUFBRSxJQUFJO0lBQ1gsQ0FBQyxFQUFFLEtBQUs7SUFDUixFQUFFLEVBQUUsS0FBSztJQUNULEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLEtBQUs7SUFDWCxDQUFDLEVBQUUsTUFBTTtJQUNULEVBQUUsRUFBRSxNQUFNO0lBQ1YsRUFBRSxFQUFFLE1BQU07SUFDVixHQUFHLEVBQUUsTUFBTTtJQUNYLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE1BQU07SUFDYixDQUFDLEVBQUUsT0FBTztJQUNWLElBQUksRUFBRSxPQUFPO0lBQ2IsR0FBRyxFQUFFLE9BQU87SUFDWixLQUFLLEVBQUUsT0FBTztJQUNkLElBQUksRUFBRSxPQUFPO0lBQ2IsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsT0FBTztJQUNmLENBQUMsRUFBRSxRQUFRO0lBQ1gsRUFBRSxFQUFFLFFBQVE7SUFDWixFQUFFLEVBQUUsUUFBUTtJQUNaLEdBQUcsRUFBRSxRQUFRO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsUUFBUTtDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFRJTUVfVU5JVFNfSU5fU0VDT05EUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgczogMSxcbiAgc2Vjb25kOiAxLFxuICBzZWM6IDEsXG4gIHNlY3M6IDEsXG4gIHNlY29uZHM6IDEsXG4gIG1pbjogNjAsXG4gIG1pbnM6IDYwLFxuICBtaW51dGU6IDYwLFxuICBtaW51dGVzOiA2MCxcbiAgaDogMzYwMCxcbiAgaHM6IDM2MDAsXG4gIGhyOiAzNjAwLFxuICBocnM6IDM2MDAsXG4gIGhvdXI6IDM2MDAsXG4gIGhvdXJzOiAzNjAwLFxuICBkOiA4NjQwMCxcbiAgZHM6IDg2NDAwLFxuICBkYXk6IDg2NDAwLFxuICBkYXlzOiA4NjQwMCxcbiAgdzogNjA0ODAwLFxuICB3czogNjA0ODAwLFxuICB3azogNjA0ODAwLFxuICB3a3M6IDYwNDgwMCxcbiAgd2VlazogNjA0ODAwLFxuICB3ZWVrczogNjA0ODAwLFxuICBtOiAyNDE5MjAwLFxuICBtbnRoOiAyNDE5MjAwLFxuICBtdGg6IDI0MTkyMDAsXG4gIG1udGhzOiAyNDE5MjAwLFxuICBtdGhzOiAyNDE5MjAwLFxuICBtb250aDogMjQxOTIwMCxcbiAgbW9udGhzOiAyNDE5MjAwLFxuICB5OiAzMTUzNjAwMCxcbiAgeXM6IDMxNTM2MDAwLFxuICB5cjogMzE1MzYwMDAsXG4gIHlyczogMzE1MzYwMDAsXG4gIHllYXI6IDMxNTM2MDAwLFxuICB5ZWFyczogMzE1MzYwMDAsXG59O1xuIl19
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Sci = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const validations_1 = require("../../util/validations");
|
|
6
|
+
const helpers_1 = require("../../util/helpers");
|
|
7
|
+
const errors_1 = require("../../util/errors");
|
|
8
|
+
const { InputValidationError } = errors_1.ERRORS;
|
|
9
|
+
const Sci = (globalConfig) => {
|
|
10
|
+
const errorBuilder = (0, helpers_1.buildErrorMessage)(exports.Sci.name);
|
|
11
|
+
const metadata = {
|
|
12
|
+
kind: 'execute',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Validates node and gloabl configs.
|
|
16
|
+
*/
|
|
17
|
+
const validateConfig = (config) => {
|
|
18
|
+
const errorMessage = '`functional-unit` should be provided in your global config';
|
|
19
|
+
const schema = zod_1.z
|
|
20
|
+
.object({
|
|
21
|
+
'functional-unit': zod_1.z.string(),
|
|
22
|
+
})
|
|
23
|
+
.refine(data => data['functional-unit'], {
|
|
24
|
+
message: errorMessage,
|
|
25
|
+
});
|
|
26
|
+
return (0, validations_1.validate)(schema, config);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Calculate the total emissions for a list of inputs.
|
|
30
|
+
*/
|
|
31
|
+
const execute = (inputs) => {
|
|
32
|
+
return inputs.map(input => {
|
|
33
|
+
const safeInput = validateInput(input);
|
|
34
|
+
const sci = safeInput['carbon'] > 0
|
|
35
|
+
? safeInput['carbon'] / input[globalConfig['functional-unit']]
|
|
36
|
+
: 0;
|
|
37
|
+
return {
|
|
38
|
+
...input,
|
|
39
|
+
sci,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Checks for fields in input.
|
|
45
|
+
*/
|
|
46
|
+
const validateInput = (input) => {
|
|
47
|
+
const message = `'carbon' and ${globalConfig['functional-unit']} should be present in your input data.`;
|
|
48
|
+
const validatedConfig = validateConfig(globalConfig);
|
|
49
|
+
if (!(validatedConfig['functional-unit'] in input &&
|
|
50
|
+
input[validatedConfig['functional-unit']] > 0)) {
|
|
51
|
+
throw new InputValidationError(errorBuilder({
|
|
52
|
+
message: 'functional-unit value is missing from input data or it is not a positive integer',
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
const schema = zod_1.z
|
|
56
|
+
.object({
|
|
57
|
+
carbon: zod_1.z.number().gte(0),
|
|
58
|
+
duration: zod_1.z.number().gte(1),
|
|
59
|
+
})
|
|
60
|
+
.refine(validations_1.allDefined, { message });
|
|
61
|
+
return (0, validations_1.validate)(schema, input);
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
metadata,
|
|
65
|
+
execute,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
exports.Sci = Sci;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvc2NpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUFzQjtBQUt0Qix3REFBNEQ7QUFDNUQsZ0RBQXFEO0FBQ3JELDhDQUF5QztBQUV6QyxNQUFNLEVBQUMsb0JBQW9CLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFFL0IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUEwQixFQUFpQixFQUFFO0lBQy9ELE1BQU0sWUFBWSxHQUFHLElBQUEsMkJBQWlCLEVBQUMsV0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFxQixFQUFFLEVBQUU7UUFDL0MsTUFBTSxZQUFZLEdBQ2hCLDREQUE0RCxDQUFDO1FBRS9ELE1BQU0sTUFBTSxHQUFHLE9BQUM7YUFDYixNQUFNLENBQUM7WUFDTixpQkFBaUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1NBQzlCLENBQUM7YUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUN2QyxPQUFPLEVBQUUsWUFBWTtTQUN0QixDQUFDLENBQUM7UUFFTCxPQUFPLElBQUEsc0JBQVEsRUFBeUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFzQixFQUFrQixFQUFFO1FBQ3pELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxHQUFHLEdBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsR0FBRzthQUNKLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFtQixFQUFFLEVBQUU7UUFDNUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyx3Q0FBd0MsQ0FBQztRQUV4RyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckQsSUFDRSxDQUFDLENBQ0MsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksS0FBSztZQUMzQyxLQUFLLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQzlDLEVBQ0Q7WUFDQSxNQUFNLElBQUksb0JBQW9CLENBQzVCLFlBQVksQ0FBQztnQkFDWCxPQUFPLEVBQ0wsa0ZBQWtGO2FBQ3JGLENBQUMsQ0FDSCxDQUFDO1NBQ0g7UUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFDO2FBQ2IsTUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDO2FBQ0QsTUFBTSxDQUFDLHdCQUFVLEVBQUUsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBQSxzQkFBUSxFQUF5QixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLFFBQVE7UUFDUixPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQTdFVyxRQUFBLEdBQUcsT0E2RWQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7RXhlY3V0ZVBsdWdpbiwgUGx1Z2luUGFyYW1zfSBmcm9tICcuLi8uLi90eXBlcy9pbnRlcmZhY2UnO1xuaW1wb3J0IHtDb25maWdQYXJhbXN9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmltcG9ydCB7dmFsaWRhdGUsIGFsbERlZmluZWR9IGZyb20gJy4uLy4uL3V0aWwvdmFsaWRhdGlvbnMnO1xuaW1wb3J0IHtidWlsZEVycm9yTWVzc2FnZX0gZnJvbSAnLi4vLi4vdXRpbC9oZWxwZXJzJztcbmltcG9ydCB7RVJST1JTfSBmcm9tICcuLi8uLi91dGlsL2Vycm9ycyc7XG5cbmNvbnN0IHtJbnB1dFZhbGlkYXRpb25FcnJvcn0gPSBFUlJPUlM7XG5cbmV4cG9ydCBjb25zdCBTY2kgPSAoZ2xvYmFsQ29uZmlnOiBDb25maWdQYXJhbXMpOiBFeGVjdXRlUGx1Z2luID0+IHtcbiAgY29uc3QgZXJyb3JCdWlsZGVyID0gYnVpbGRFcnJvck1lc3NhZ2UoU2NpLm5hbWUpO1xuICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICBraW5kOiAnZXhlY3V0ZScsXG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBub2RlIGFuZCBnbG9hYmwgY29uZmlncy5cbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlQ29uZmlnID0gKGNvbmZpZz86IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAnYGZ1bmN0aW9uYWwtdW5pdGAgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHlvdXIgZ2xvYmFsIGNvbmZpZyc7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ2Z1bmN0aW9uYWwtdW5pdCc6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ2Z1bmN0aW9uYWwtdW5pdCddLCB7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgY29uZmlnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHMuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3Qgc2FmZUlucHV0ID0gdmFsaWRhdGVJbnB1dChpbnB1dCk7XG4gICAgICBjb25zdCBzY2kgPVxuICAgICAgICBzYWZlSW5wdXRbJ2NhcmJvbiddID4gMFxuICAgICAgICAgID8gc2FmZUlucHV0WydjYXJib24nXSAvIGlucHV0W2dsb2JhbENvbmZpZ1snZnVuY3Rpb25hbC11bml0J11dXG4gICAgICAgICAgOiAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIHNjaSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBmb3IgZmllbGRzIGluIGlucHV0LlxuICAgKi9cbiAgY29uc3QgdmFsaWRhdGVJbnB1dCA9IChpbnB1dDogUGx1Z2luUGFyYW1zKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGAnY2FyYm9uJyBhbmQgJHtnbG9iYWxDb25maWdbJ2Z1bmN0aW9uYWwtdW5pdCddfSBzaG91bGQgYmUgcHJlc2VudCBpbiB5b3VyIGlucHV0IGRhdGEuYDtcblxuICAgIGNvbnN0IHZhbGlkYXRlZENvbmZpZyA9IHZhbGlkYXRlQ29uZmlnKGdsb2JhbENvbmZpZyk7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICB2YWxpZGF0ZWRDb25maWdbJ2Z1bmN0aW9uYWwtdW5pdCddIGluIGlucHV0ICYmXG4gICAgICAgIGlucHV0W3ZhbGlkYXRlZENvbmZpZ1snZnVuY3Rpb25hbC11bml0J11dID4gMFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBlcnJvckJ1aWxkZXIoe1xuICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAnZnVuY3Rpb25hbC11bml0IHZhbHVlIGlzIG1pc3NpbmcgZnJvbSBpbnB1dCBkYXRhIG9yIGl0IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXInLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgY2FyYm9uOiB6Lm51bWJlcigpLmd0ZSgwKSxcbiAgICAgICAgZHVyYXRpb246IHoubnVtYmVyKCkuZ3RlKDEpLFxuICAgICAgfSlcbiAgICAgIC5yZWZpbmUoYWxsRGVmaW5lZCwge21lc3NhZ2V9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1ldGFkYXRhLFxuICAgIGV4ZWN1dGUsXG4gIH07XG59O1xuIl19
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SciEmbodied = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const validations_1 = require("../../util/validations");
|
|
6
|
+
const SciEmbodied = () => {
|
|
7
|
+
const metadata = {
|
|
8
|
+
kind: 'execute',
|
|
9
|
+
};
|
|
10
|
+
const METRICS = [
|
|
11
|
+
'device/emissions-embodied',
|
|
12
|
+
'device/expected-lifespan',
|
|
13
|
+
'resources-reserved',
|
|
14
|
+
'vcpus-allocated',
|
|
15
|
+
'resources-total',
|
|
16
|
+
'vcpus-total',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Calculate the Embodied carbon for a list of inputs.
|
|
20
|
+
*/
|
|
21
|
+
const execute = (inputs) => {
|
|
22
|
+
return inputs.map(input => {
|
|
23
|
+
const safeInput = validateInput(input);
|
|
24
|
+
return {
|
|
25
|
+
...input,
|
|
26
|
+
'carbon-embodied': calculateEmbodiedCarbon(safeInput),
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Calculate the Embodied carbon for the input.
|
|
32
|
+
* M = totalEmissions * (duration/ExpectedLifespan) * (resourcesReserved/totalResources)
|
|
33
|
+
*/
|
|
34
|
+
const calculateEmbodiedCarbon = (input) => {
|
|
35
|
+
const totalEmissions = input['device/emissions-embodied'];
|
|
36
|
+
const duration = input['duration'];
|
|
37
|
+
const expectedLifespan = input['device/expected-lifespan'];
|
|
38
|
+
const resourcesReserved = input['vcpus-allocated'] || input['resources-reserved'];
|
|
39
|
+
const totalResources = input['vcpus-total'] || input['resources-total'];
|
|
40
|
+
return (totalEmissions *
|
|
41
|
+
(duration / expectedLifespan) *
|
|
42
|
+
(resourcesReserved / totalResources));
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Checks for required fields in input.
|
|
46
|
+
*/
|
|
47
|
+
const validateInput = (input) => {
|
|
48
|
+
const errorMessage = (unit) => `not a valid number in input. Please provide it as \`${unit}\``;
|
|
49
|
+
const commonSchemaPart = (errorMessage) => ({
|
|
50
|
+
'device/emissions-embodied': zod_1.z
|
|
51
|
+
.number({
|
|
52
|
+
invalid_type_error: errorMessage('gCO2e'),
|
|
53
|
+
})
|
|
54
|
+
.gte(0)
|
|
55
|
+
.min(0),
|
|
56
|
+
'device/expected-lifespan': zod_1.z
|
|
57
|
+
.number({
|
|
58
|
+
invalid_type_error: errorMessage('gCO2e'),
|
|
59
|
+
})
|
|
60
|
+
.gte(0)
|
|
61
|
+
.min(0),
|
|
62
|
+
duration: zod_1.z
|
|
63
|
+
.number({
|
|
64
|
+
invalid_type_error: errorMessage('seconds'),
|
|
65
|
+
})
|
|
66
|
+
.gte(1),
|
|
67
|
+
});
|
|
68
|
+
const vcpusSchemaPart = {
|
|
69
|
+
'vcpus-allocated': zod_1.z
|
|
70
|
+
.number({
|
|
71
|
+
invalid_type_error: errorMessage('count'),
|
|
72
|
+
})
|
|
73
|
+
.gte(0)
|
|
74
|
+
.min(0),
|
|
75
|
+
'vcpus-total': zod_1.z
|
|
76
|
+
.number({
|
|
77
|
+
invalid_type_error: errorMessage('count'),
|
|
78
|
+
})
|
|
79
|
+
.gte(0)
|
|
80
|
+
.min(0),
|
|
81
|
+
};
|
|
82
|
+
const resourcesSchemaPart = {
|
|
83
|
+
'resources-reserved': zod_1.z
|
|
84
|
+
.number({
|
|
85
|
+
invalid_type_error: errorMessage('count'),
|
|
86
|
+
})
|
|
87
|
+
.gte(0)
|
|
88
|
+
.min(0),
|
|
89
|
+
'resources-total': zod_1.z
|
|
90
|
+
.number({
|
|
91
|
+
invalid_type_error: errorMessage('count'),
|
|
92
|
+
})
|
|
93
|
+
.gte(0)
|
|
94
|
+
.min(0),
|
|
95
|
+
};
|
|
96
|
+
const schemaWithVcpus = zod_1.z.object({
|
|
97
|
+
...commonSchemaPart(errorMessage),
|
|
98
|
+
...vcpusSchemaPart,
|
|
99
|
+
});
|
|
100
|
+
const schemaWithResources = zod_1.z.object({
|
|
101
|
+
...commonSchemaPart(errorMessage),
|
|
102
|
+
...resourcesSchemaPart,
|
|
103
|
+
});
|
|
104
|
+
const schema = schemaWithVcpus.or(schemaWithResources).refine(validations_1.allDefined, {
|
|
105
|
+
message: `All ${METRICS} should be present.`,
|
|
106
|
+
});
|
|
107
|
+
return (0, validations_1.validate)(schema, input);
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
metadata,
|
|
111
|
+
execute,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
exports.SciEmbodied = SciEmbodied;
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVpbHRpbnMvc2NpLWVtYm9kaWVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUFzQjtBQUl0Qix3REFBNEQ7QUFFckQsTUFBTSxXQUFXLEdBQUcsR0FBa0IsRUFBRTtJQUM3QyxNQUFNLFFBQVEsR0FBRztRQUNmLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRztRQUNkLDJCQUEyQjtRQUMzQiwwQkFBMEI7UUFDMUIsb0JBQW9CO1FBQ3BCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsYUFBYTtLQUNkLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBc0IsRUFBRSxFQUFFO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdkMsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsU0FBUyxDQUFDO2FBQ3RELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxLQUFtQixFQUFFLEVBQUU7UUFDdEQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDM0QsTUFBTSxpQkFBaUIsR0FDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQUcs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LE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBNUhXLFFBQUEsV0FBVyxlQTRIdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7RXhlY3V0ZVBsdWdpbiwgUGx1Z2luUGFyYW1zfSBmcm9tICcuLi8uLi90eXBlcy9pbnRlcmZhY2UnO1xuXG5pbXBvcnQge3ZhbGlkYXRlLCBhbGxEZWZpbmVkfSBmcm9tICcuLi8uLi91dGlsL3ZhbGlkYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IFNjaUVtYm9kaWVkID0gKCk6IEV4ZWN1dGVQbHVnaW4gPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICBraW5kOiAnZXhlY3V0ZScsXG4gIH07XG5cbiAgY29uc3QgTUVUUklDUyA9IFtcbiAgICAnZGV2aWNlL2VtaXNzaW9ucy1lbWJvZGllZCcsXG4gICAgJ2RldmljZS9leHBlY3RlZC1saWZlc3BhbicsXG4gICAgJ3Jlc291cmNlcy1yZXNlcnZlZCcsXG4gICAgJ3ZjcHVzLWFsbG9jYXRlZCcsXG4gICAgJ3Jlc291cmNlcy10b3RhbCcsXG4gICAgJ3ZjcHVzLXRvdGFsJyxcbiAgXTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBFbWJvZGllZCBjYXJib24gZm9yIGEgbGlzdCBvZiBpbnB1dHMuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pID0+IHtcbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBjb25zdCBzYWZlSW5wdXQgPSB2YWxpZGF0ZUlucHV0KGlucHV0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgICdjYXJib24tZW1ib2RpZWQnOiBjYWxjdWxhdGVFbWJvZGllZENhcmJvbihzYWZlSW5wdXQpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBFbWJvZGllZCBjYXJib24gZm9yIHRoZSBpbnB1dC5cbiAgICogTSA9IHRvdGFsRW1pc3Npb25zICogKGR1cmF0aW9uL0V4cGVjdGVkTGlmZXNwYW4pICogKHJlc291cmNlc1Jlc2VydmVkL3RvdGFsUmVzb3VyY2VzKVxuICAgKi9cbiAgY29uc3QgY2FsY3VsYXRlRW1ib2RpZWRDYXJib24gPSAoaW5wdXQ6IFBsdWdpblBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHRvdGFsRW1pc3Npb25zID0gaW5wdXRbJ2RldmljZS9lbWlzc2lvbnMtZW1ib2RpZWQnXTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGlucHV0WydkdXJhdGlvbiddO1xuICAgIGNvbnN0IGV4cGVjdGVkTGlmZXNwYW4gPSBpbnB1dFsnZGV2aWNlL2V4cGVjdGVkLWxpZmVzcGFuJ107XG4gICAgY29uc3QgcmVzb3VyY2VzUmVzZXJ2ZWQgPVxuICAgICAgaW5wdXRbJ3ZjcHVzLWFsbG9jYXRlZCddIHx8IGlucHV0WydyZXNvdXJjZXMtcmVzZXJ2ZWQnXTtcbiAgICBjb25zdCB0b3RhbFJlc291cmNlcyA9IGlucHV0Wyd2Y3B1cy10b3RhbCddIHx8IGlucHV0WydyZXNvdXJjZXMtdG90YWwnXTtcblxuICAgIHJldHVybiAoXG4gICAgICB0b3RhbEVtaXNzaW9ucyAqXG4gICAgICAoZHVyYXRpb24gLyBleHBlY3RlZExpZmVzcGFuKSAqXG4gICAgICAocmVzb3VyY2VzUmVzZXJ2ZWQgLyB0b3RhbFJlc291cmNlcylcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiBpbnB1dC5cbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSW5wdXQgPSAoaW5wdXQ6IFBsdWdpblBhcmFtcykgPT4ge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICh1bml0OiBzdHJpbmcpID0+XG4gICAgICBgbm90IGEgdmFsaWQgbnVtYmVyIGluIGlucHV0LiBQbGVhc2UgcHJvdmlkZSBpdCBhcyBcXGAke3VuaXR9XFxgYDtcblxuICAgIGNvbnN0IGNvbW1vblNjaGVtYVBhcnQgPSAoZXJyb3JNZXNzYWdlOiAodW5pdDogc3RyaW5nKSA9PiBzdHJpbmcpID0+ICh7XG4gICAgICAnZGV2aWNlL2VtaXNzaW9ucy1lbWJvZGllZCc6IHpcbiAgICAgICAgLm51bWJlcih7XG4gICAgICAgICAgaW52YWxpZF90eXBlX2Vycm9yOiBlcnJvck1lc3NhZ2UoJ2dDTzJlJyksXG4gICAgICAgIH0pXG4gICAgICAgIC5ndGUoMClcbiAgICAgICAgLm1pbigwKSxcbiAgICAgICdkZXZpY2UvZXhwZWN0ZWQtbGlmZXNwYW4nOiB6XG4gICAgICAgIC5udW1iZXIoe1xuICAgICAgICAgIGludmFsaWRfdHlwZV9lcnJvcjogZXJyb3JNZXNzYWdlKCdnQ08yZScpLFxuICAgICAgICB9KVxuICAgICAgICAuZ3RlKDApXG4gICAgICAgIC5taW4oMCksXG4gICAgICBkdXJhdGlvbjogelxuICAgICAgICAubnVtYmVyKHtcbiAgICAgICAgICBpbnZhbGlkX3R5cGVfZXJyb3I6IGVycm9yTWVzc2FnZSgnc2Vjb25kcycpLFxuICAgICAgICB9KVxuICAgICAgICAuZ3RlKDEpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdmNwdXNTY2hlbWFQYXJ0ID0ge1xuICAgICAgJ3ZjcHVzLWFsbG9jYXRlZCc6IHpcbiAgICAgICAgLm51bWJlcih7XG4gICAgICAgICAgaW52YWxpZF90eXBlX2Vycm9yOiBlcnJvck1lc3NhZ2UoJ2NvdW50JyksXG4gICAgICAgIH0pXG4gICAgICAgIC5ndGUoMClcbiAgICAgICAgLm1pbigwKSxcbiAgICAgICd2Y3B1cy10b3RhbCc6IHpcbiAgICAgICAgLm51bWJlcih7XG4gICAgICAgICAgaW52YWxpZF90eXBlX2Vycm9yOiBlcnJvck1lc3NhZ2UoJ2NvdW50JyksXG4gICAgICAgIH0pXG4gICAgICAgIC5ndGUoMClcbiAgICAgICAgLm1pbigwKSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzb3VyY2VzU2NoZW1hUGFydCA9IHtcbiAgICAgICdyZXNvdXJjZXMtcmVzZXJ2ZWQnOiB6XG4gICAgICAgIC5udW1iZXIoe1xuICAgICAgICAgIGludmFsaWRfdHlwZV9lcnJvcjogZXJyb3JNZXNzYWdlKCdjb3VudCcpLFxuICAgICAgICB9KVxuICAgICAgICAuZ3RlKDApXG4gICAgICAgIC5taW4oMCksXG4gICAgICAncmVzb3VyY2VzLXRvdGFsJzogelxuICAgICAgICAubnVtYmVyKHtcbiAgICAgICAgICBpbnZhbGlkX3R5cGVfZXJyb3I6IGVycm9yTWVzc2FnZSgnY291bnQnKSxcbiAgICAgICAgfSlcbiAgICAgICAgLmd0ZSgwKVxuICAgICAgICAubWluKDApLFxuICAgIH07XG5cbiAgICBjb25zdCBzY2hlbWFXaXRoVmNwdXMgPSB6Lm9iamVjdCh7XG4gICAgICAuLi5jb21tb25TY2hlbWFQYXJ0KGVycm9yTWVzc2FnZSksXG4gICAgICAuLi52Y3B1c1NjaGVtYVBhcnQsXG4gICAgfSk7XG4gICAgY29uc3Qgc2NoZW1hV2l0aFJlc291cmNlcyA9IHoub2JqZWN0KHtcbiAgICAgIC4uLmNvbW1vblNjaGVtYVBhcnQoZXJyb3JNZXNzYWdlKSxcbiAgICAgIC4uLnJlc291cmNlc1NjaGVtYVBhcnQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFXaXRoVmNwdXMub3Ioc2NoZW1hV2l0aFJlc291cmNlcykucmVmaW5lKGFsbERlZmluZWQsIHtcbiAgICAgIG1lc3NhZ2U6IGBBbGwgJHtNRVRSSUNTfSBzaG91bGQgYmUgcHJlc2VudC5gLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgaW5wdXQpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbWV0YWRhdGEsXG4gICAgZXhlY3V0ZSxcbiAgfTtcbn07XG4iXX0=
|