{"version":3,"sources":["jsdelivr-header.js","/npm/solar-rad@0.0.4/dist/index.js"],"names":[],"mappings":"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","file":"/npm/solar-rad@0.0.4/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/solar-rad@0.0.4/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aggregate = exports.fetch = void 0;\nconst tslib_1 = require(\"tslib\");\nconst axios = require('axios');\nconst md5 = require('md5');\nconst moment_1 = tslib_1.__importDefault(require(\"moment\"));\nconst _ = require('lodash');\nconst csvjson = require('csvjson');\nlet Promise = require('bluebird');\nconst debug = require('debug');\nconst info = debug(`solar-rad:info`);\nconst error = debug(`solar-rad:error`);\nconst trace = debug(`solar-rad:trace`);\nconst warn = debug(`solar-rad:warn`);\nasync function fetch({ years, name, affiliation, interval, email, reason, lat, lon, api_key, attributes, leap, utc, mailing_list }) {\n    if (!api_key) {\n        api_key = \"DEMO_KEY\";\n        warn(`API Key (\"api_key\") undefined. Using the DEMO_KEY, but rate limits are substantially reduced. Please sign up for an API key at https://developer.nrel.gov/signup/.`);\n    }\n    if (!lat || !lon) {\n        throw new Error(`Latitude (\"lat\") ${lat} or Longitude (\"lon\"): ${lon} value missing.`);\n    }\n    if (!years) {\n        throw new Error('Missing key \"years\"');\n    }\n    if (!Array.isArray(years)) {\n        throw new Error('Key \"years\" should be an array of year strings or integer values');\n    }\n    if (!attributes) {\n        info(`Key \"attributes\" undefined. Defaulting to: \"air_temperature,clearsky_dhi,clearsky_dni,clearsky_ghi,cloud_type,dew_point,dhi,dni,fill_flag,ghi,relative_humidity,solar_zenith_angle,surface_albedo,surface_pressure,total_precipitable_water,wind_direction,wind_speed\"`);\n        attributes = 'air_temperature,clearsky_dhi,clearsky_dni,clearsky_ghi,cloud_type,dew_point,dhi,dni,fill_flag,ghi,relative_humidity,solar_zenith_angle,surface_albedo,surface_pressure,total_precipitable_water,wind_direction,wind_speed';\n    }\n    if (!leap) {\n        info(`Key \"leap\" undefined. Defaulting to: \"true\".`);\n        leap = 'true';\n    }\n    if (!interval) {\n        info(`Key \"interval\" undefined. Defaulting to \"60\" (minutes).`);\n        interval = '60';\n    }\n    if (!utc) {\n        info(`Key \"utc\" undefined. Defaulting to \"false\".`);\n        utc = 'false';\n    }\n    if (!mailing_list) {\n        info(`Key \"mailing_list\" undefined. Defaulting to \"false\".`);\n        mailing_list = 'false';\n    }\n    if (!name) {\n        info(`Key \"name\" undefined. Defaulting to 'undefined'.`);\n    }\n    if (!reason) {\n        info(`Key \"reason\" undefined. Defaulting to 'demonstration'.`);\n        reason = 'demonstration';\n    }\n    if (!affiliation) {\n        info(`Key \"affiliation\" undefined. Defaulting to 'undefined'.`);\n    }\n    if (!email) {\n        throw new Error(`Missing \"email\" key.`);\n    }\n    let data = {};\n    let template = {};\n    info('YEARS', years);\n    await Promise.each(years.sort(), async (yr) => {\n        let url = `https://developer.nrel.gov/api/nsrdb/v2/solar/psm3-download.csv?wkt=POINT(${lon}%20${lat})&names=${yr}&leap_day=${leap}&interval=${interval}&utc=${utc}&full_name=${name}&email=${email}&affiliation=${affiliation}&mailing_list=${mailing_list}&reason=${reason}&api_key=${api_key}&attributes=${attributes}`;\n        trace(`URL: ${url}`);\n        info('Getting year:', yr);\n        var response = await axios.get(url).catch(async (err) => {\n            error(err);\n            if (err.response.status === 400) {\n                if (err.response && err.response.data && err.response.data.errors) {\n                    let errIndex = err.response.data.errors.findIndex(v => v.indexOf(\"The required 'years' or 'names' parameter must be a number between\") > -1);\n                    if (errIndex > -1) {\n                        let yearsStr = err.response.data.errors[errIndex].substr(-13);\n                        error(`Year ${yr} unavailable. Key \"years\" should range between ${yearsStr}`);\n                        throw new Error(`Year ${yr} unavailable. Key \"years\" should range between ${yearsStr}`);\n                    }\n                }\n            }\n            else\n                throw err;\n        });\n        if (response && response.data) {\n            var options = { delimiter: ',', quote: '\"' };\n            let lines = response.data.split('\\n');\n            let info = csvjson.toObject(lines.splice(0, 2).join('\\n'));\n            let yearData = csvjson.toObject(lines.join('\\n'), options);\n            template = templateFromInfo(info);\n            let temp = md5(JSON.stringify(template));\n            template.id = temp;\n            yearData.forEach((y) => {\n                let mom = (0, moment_1.default)().year(y.Year).month(y.Month - 1).date(y.Day).hour(y.Hour).minute(y.Minute).seconds(0).millisecond(0);\n                let time = mom.format();\n                let obj = _.cloneDeep(y);\n                obj.template = template.id;\n                obj.time = time;\n                data[time] = obj;\n            });\n        }\n    });\n    return { data, template };\n}\nexports.fetch = fetch;\nfunction templateFromInfo(info) {\n    let template = {};\n    Object.keys(info[0]).forEach((key) => {\n        if (/Units$/.test(key)) {\n            let k = key.slice(0, -6);\n            template[k] = { units: info[0][key] };\n        }\n        else if (/^Cloud Type/.test(key)) {\n            let code = key.substring(11);\n            template['Cloud Type'] = template['Cloud Type'] || { enumerate: {} };\n            template['Cloud Type'].enumerate[code] = info[0][key];\n        }\n        else if (/^Fill Flag/.test(key)) {\n            let code = key.substring(10);\n            template['Fill Flag'] = template['Fill Flag'] || { enumerate: {} };\n            template['Fill Flag'].enumerate[code] = info[0][key];\n        }\n        else if (/^Wind Speed/.test(key)) {\n            template[key] = { units: info[0][key] };\n        }\n        else if (key === 'Elevation') {\n            template[key] = {\n                value: info[0][key],\n                units: 'meters'\n            };\n        }\n        else\n            template[key] = info[0][key];\n    });\n    return template;\n}\nfunction aggregate(data, aggregation) {\n    if (aggregation === 'daily') {\n        let skips = ['Year', 'Month', 'Day', 'Hour', 'Minute', 'Fill Flag', 'Fill Flags', 'time', 'template', 'date'];\n        let output = {};\n        let count = 0;\n        let agg = {};\n        let aggDate;\n        Object.keys(data || {}).forEach((time) => {\n            let item = data[time];\n            let mom = (0, moment_1.default)(item.time);\n            let date = mom.format('YYYY-MM-DD');\n            if (!aggDate || aggDate !== date) {\n                if (count > 0) {\n                    Object.keys(agg)\n                        .filter(key => !skips.includes(key))\n                        .forEach((key) => {\n                        agg[key] = agg[key] / count;\n                    });\n                    output[aggDate] = agg;\n                }\n                count = 1;\n                agg = {\n                    \"Fill Flags\": item[\"Fill Flag\"] && item[\"Fill Flag\"] !== \"0\" ? [item[\"Fill Flag\"]] : [],\n                    template: item.template\n                };\n                aggDate = date;\n                Object.keys(item)\n                    .filter(key => !skips.includes(key))\n                    .forEach((key) => {\n                    agg[key] = parseFloat(item[key]);\n                });\n                agg.time = date;\n            }\n            else {\n                count++;\n                if (agg[\"Fill Flags\"] && item[\"Fill Flag\"] && item[\"Fill Flag\"] !== \"0\") {\n                    agg[\"Fill Flags\"].push(item[\"Fill Flag\"]);\n                }\n                Object.keys(item)\n                    .filter(key => !skips.includes(key))\n                    .forEach(key => {\n                    agg[key] += parseFloat(item[key]);\n                });\n            }\n        });\n        return output;\n    }\n}\nexports.aggregate = aggregate;\nmodule.exports = {\n    fetch,\n    aggregate,\n};\n"]}