@grnsft/if
Version:
Impact Framework
92 lines • 11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Sci = void 0;
const zod_1 = require("zod");
const interfaces_1 = require("@grnsft/if-core/interfaces");
const validations_1 = require("../../../common/util/validations");
const utils_1 = require("@grnsft/if-core/utils");
const validations_2 = require("../../../common/util/validations");
const config_1 = require("../../config");
const { MissingInputDataError, ConfigError } = utils_1.ERRORS;
const { MISSING_FUNCTIONAL_UNIT_CONFIG, MISSING_FUNCTIONAL_UNIT_INPUT, SCI_MISSING_FN_UNIT, ZERO_DIVISION, MISSING_CONFIG, } = config_1.STRINGS;
exports.Sci = (0, interfaces_1.PluginFactory)({
metadata: {
inputs: {
carbon: {
description: 'an amount of carbon emitted into the atmosphere',
unit: 'gCO2e',
'aggregation-method': {
time: 'sum',
component: 'sum',
},
},
'functional-unit': {
description: 'the name of the functional unit in which the final SCI value should be expressed, e.g. requests, users',
unit: 'none',
'aggregation-method': {
time: 'sum',
component: 'sum',
},
},
},
outputs: {
sci: {
description: 'carbon expressed in terms of the given functional unit',
unit: 'gCO2e',
'aggregation-method': {
time: 'avg',
component: 'sum',
},
},
},
},
configValidation: (config) => {
if (!config || !Object.keys(config)?.length) {
throw new ConfigError(MISSING_CONFIG);
}
const schema = zod_1.z
.object({
'functional-unit': zod_1.z.string(),
})
.refine(data => data['functional-unit'], {
message: MISSING_FUNCTIONAL_UNIT_CONFIG,
});
return (0, validations_1.validate)(schema, config);
},
inputValidation: (input, config) => {
const functionalUnit = config['functional-unit'];
if (!(functionalUnit in input && input[functionalUnit] >= 0)) {
throw new MissingInputDataError(MISSING_FUNCTIONAL_UNIT_INPUT);
}
const schema = zod_1.z
.object({
carbon: zod_1.z.number().gte(0),
duration: zod_1.z.number().gte(1),
})
.refine(validations_2.allDefined, {
message: SCI_MISSING_FN_UNIT(config['functional-unit']),
});
return (0, validations_1.validate)(schema, input);
},
implementation: async (inputs, config) => {
return inputs.map((input, index) => {
const functionalUnit = isNaN(config['functional-unit'])
? input[config['functional-unit']]
: config['functional-unit'];
if (functionalUnit === 0) {
console.warn(ZERO_DIVISION('Sci', index));
return {
...input,
sci: input['carbon'],
};
}
const calculatedResult = input['carbon'] / functionalUnit;
return {
...input,
sci: calculatedResult,
};
});
},
allowArithmeticExpressions: ['functional-unit'],
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3NjaS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0I7QUFFdEIsMkRBQXlEO0FBR3pELGtFQUEwRDtBQUUxRCxpREFBNkM7QUFFN0Msa0VBQTREO0FBRTVELHlDQUFxQztBQUVyQyxNQUFNLEVBQUMscUJBQXFCLEVBQUUsV0FBVyxFQUFDLEdBQUcsY0FBTSxDQUFDO0FBQ3BELE1BQU0sRUFDSiw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsY0FBYyxHQUNmLEdBQUcsZ0JBQU8sQ0FBQztBQUVDLFFBQUEsR0FBRyxHQUFHLElBQUEsMEJBQWEsRUFBQztJQUMvQixRQUFRLEVBQUU7UUFDUixNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUU7Z0JBQ04sV0FBVyxFQUFFLGlEQUFpRDtnQkFDOUQsSUFBSSxFQUFFLE9BQU87Z0JBQ2Isb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLFNBQVMsRUFBRSxLQUFLO2lCQUNqQjthQUNGO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCLFdBQVcsRUFDVCx3R0FBd0c7Z0JBQzFHLElBQUksRUFBRSxNQUFNO2dCQUNaLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsS0FBSztvQkFDWCxTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsR0FBRyxFQUFFO2dCQUNILFdBQVcsRUFBRSx3REFBd0Q7Z0JBQ3JFLElBQUksRUFBRSxPQUFPO2dCQUNiLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsS0FBSztvQkFDWCxTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRjtTQUNGO0tBQ0Y7SUFDRCxnQkFBZ0IsRUFBRSxDQUFDLE1BQW9CLEVBQUUsRUFBRTtRQUN6QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUU7WUFDM0MsTUFBTSxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN2QztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQUM7YUFDYixNQUFNLENBQUM7WUFDTixpQkFBaUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1NBQzlCLENBQUM7YUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUN2QyxPQUFPLEVBQUUsOEJBQThCO1NBQ3hDLENBQUMsQ0FBQztRQUVMLE9BQU8sSUFBQSxzQkFBUSxFQUF5QixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELGVBQWUsRUFBRSxDQUFDLEtBQW1CLEVBQUUsTUFBb0IsRUFBRSxFQUFFO1FBQzdELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxDQUFDLGNBQWMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQzVELE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBQzthQUNiLE1BQU0sQ0FBQztZQUNOLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUIsQ0FBQzthQUNELE1BQU0sQ0FBQyx3QkFBVSxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN4RCxDQUFDLENBQUM7UUFFTCxPQUFPLElBQUEsc0JBQVEsRUFBeUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQXNCLEVBQUUsTUFBb0IsRUFBRSxFQUFFO1FBQ3JFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUU5QixJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUUxQyxPQUFPO29CQUNMLEdBQUcsS0FBSztvQkFDUixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQztpQkFDckIsQ0FBQzthQUNIO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYyxDQUFDO1lBRTFELE9BQU87Z0JBQ0wsR0FBRyxLQUFLO2dCQUNSLEdBQUcsRUFBRSxnQkFBZ0I7YUFDdEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELDBCQUEwQixFQUFFLENBQUMsaUJBQWlCLENBQUM7Q0FDaEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge1BsdWdpbkZhY3Rvcnl9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q29uZmlnUGFyYW1zLCBQbHVnaW5QYXJhbXN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5cbmltcG9ydCB7dmFsaWRhdGV9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlsL3ZhbGlkYXRpb25zJztcblxuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5cbmltcG9ydCB7YWxsRGVmaW5lZH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtNaXNzaW5nSW5wdXREYXRhRXJyb3IsIENvbmZpZ0Vycm9yfSA9IEVSUk9SUztcbmNvbnN0IHtcbiAgTUlTU0lOR19GVU5DVElPTkFMX1VOSVRfQ09ORklHLFxuICBNSVNTSU5HX0ZVTkNUSU9OQUxfVU5JVF9JTlBVVCxcbiAgU0NJX01JU1NJTkdfRk5fVU5JVCxcbiAgWkVST19ESVZJU0lPTixcbiAgTUlTU0lOR19DT05GSUcsXG59ID0gU1RSSU5HUztcblxuZXhwb3J0IGNvbnN0IFNjaSA9IFBsdWdpbkZhY3Rvcnkoe1xuICBtZXRhZGF0YToge1xuICAgIGlucHV0czoge1xuICAgICAgY2FyYm9uOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnYW4gYW1vdW50IG9mIGNhcmJvbiBlbWl0dGVkIGludG8gdGhlIGF0bW9zcGhlcmUnLFxuICAgICAgICB1bml0OiAnZ0NPMmUnLFxuICAgICAgICAnYWdncmVnYXRpb24tbWV0aG9kJzoge1xuICAgICAgICAgIHRpbWU6ICdzdW0nLFxuICAgICAgICAgIGNvbXBvbmVudDogJ3N1bScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgJ2Z1bmN0aW9uYWwtdW5pdCc6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbmFsIHVuaXQgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSB2YWx1ZSBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIHJlcXVlc3RzLCB1c2VycycsXG4gICAgICAgIHVuaXQ6ICdub25lJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnc3VtJyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdzdW0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG91dHB1dHM6IHtcbiAgICAgIHNjaToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ2NhcmJvbiBleHByZXNzZWQgaW4gdGVybXMgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uYWwgdW5pdCcsXG4gICAgICAgIHVuaXQ6ICdnQ08yZScsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ2F2ZycsXG4gICAgICAgICAgY29tcG9uZW50OiAnc3VtJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgaWYgKCFjb25maWcgfHwgIU9iamVjdC5rZXlzKGNvbmZpZyk/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKE1JU1NJTkdfQ09ORklHKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ2Z1bmN0aW9uYWwtdW5pdCc6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ2Z1bmN0aW9uYWwtdW5pdCddLCB7XG4gICAgICAgIG1lc3NhZ2U6IE1JU1NJTkdfRlVOQ1RJT05BTF9VTklUX0NPTkZJRyxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgY29uZmlnKTtcbiAgfSxcbiAgaW5wdXRWYWxpZGF0aW9uOiAoaW5wdXQ6IFBsdWdpblBhcmFtcywgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgICBjb25zdCBmdW5jdGlvbmFsVW5pdCA9IGNvbmZpZ1snZnVuY3Rpb25hbC11bml0J107XG5cbiAgICBpZiAoIShmdW5jdGlvbmFsVW5pdCBpbiBpbnB1dCAmJiBpbnB1dFtmdW5jdGlvbmFsVW5pdF0gPj0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nSW5wdXREYXRhRXJyb3IoTUlTU0lOR19GVU5DVElPTkFMX1VOSVRfSU5QVVQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBjYXJib246IHoubnVtYmVyKCkuZ3RlKDApLFxuICAgICAgICBkdXJhdGlvbjogei5udW1iZXIoKS5ndGUoMSksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShhbGxEZWZpbmVkLCB7XG4gICAgICAgIG1lc3NhZ2U6IFNDSV9NSVNTSU5HX0ZOX1VOSVQoY29uZmlnWydmdW5jdGlvbmFsLXVuaXQnXSksXG4gICAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0KTtcbiAgfSxcbiAgaW1wbGVtZW50YXRpb246IGFzeW5jIChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uYWxVbml0ID0gaXNOYU4oY29uZmlnWydmdW5jdGlvbmFsLXVuaXQnXSlcbiAgICAgICAgPyBpbnB1dFtjb25maWdbJ2Z1bmN0aW9uYWwtdW5pdCddXVxuICAgICAgICA6IGNvbmZpZ1snZnVuY3Rpb25hbC11bml0J107XG5cbiAgICAgIGlmIChmdW5jdGlvbmFsVW5pdCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oWkVST19ESVZJU0lPTignU2NpJywgaW5kZXgpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmlucHV0LFxuICAgICAgICAgIHNjaTogaW5wdXRbJ2NhcmJvbiddLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgY2FsY3VsYXRlZFJlc3VsdCA9IGlucHV0WydjYXJib24nXSAvIGZ1bmN0aW9uYWxVbml0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgc2NpOiBjYWxjdWxhdGVkUmVzdWx0LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsb3dBcml0aG1ldGljRXhwcmVzc2lvbnM6IFsnZnVuY3Rpb25hbC11bml0J10sXG59KTtcbiJdfQ==