jaredpalmer / tsdx

Zero-config CLI for TypeScript package development
https://tsdx.io
MIT License
11.2k stars 505 forks source link

Receiving "TypeError: Classname is not a constructor" #1140

Open shevernitskiy opened 2 years ago

shevernitskiy commented 2 years ago

Current Behavior

Compiled lib with export default class Gismeteo do not work. I receive TypeError: Gismeteo is not a constructor

Expected behavior

It should work:(

Additional context

There are class Gismeteo { ... } and exports.default = Gismeteo;in cjs. Build with option --target node

My TS main file ```ts import axios from 'axios' import moment from 'moment' import { Cheerio, CheerioAPI, Element, load } from 'cheerio' import UserAgent from 'user-agents' import is_number from 'is-number' import { Endpoint, Unit, Wildcard } from './common/constants' import { GismeteoCityError } from './common/errors' import { CityUri, GismeteoMonth, GismeteoNow, GismeteoOptions, GismeteoTomorrow, GismeteoTwoWeeks } from './common/types' export default class Gismeteo { private _base_url: Endpoint private _unit: { temp: Unit pressure: Unit wind: Unit } private readonly _axios_config = { headers: { 'user-agent': new UserAgent().toString(), }, } constructor(options?: GismeteoOptions) { this._base_url = options?.lang === 'en' ? Endpoint.BASE_EN : Endpoint.BASE_RU this._unit = { temp: options?.unit_temp === 'F' ? Unit.TEMP_F : Unit.TEMP_C, pressure: options?.unit_pressure === 'hPa' ? Unit.PRESSURE_HPA : Unit.PRESSURE_MMHG, wind: options?.unit_wind === 'kmh' ? Unit.WIND_KMH : Unit.WIND_MS, } } public async getTwoWeeks(city: string): Promise { const city_uri = await this.getCityUri(city) return axios.get(`${this._base_url}${city_uri}${Endpoint.TWOWEEKS}`, this._axios_config).then(({ data }) => { const $ = load(data) let out: Partial[] = [] out = this.parseDates>($, Wildcard.TWOWEEKS_DATE) out = this.mergeArray(out, 'tmax', this.parseValue($, Wildcard.TWOWEEKS_TMAX)) out = this.mergeArray(out, 'tmin', this.parseValue($, Wildcard.TWOWEEKS_TMIN)) out = this.mergeArray(out, 'tavg', this.parseValue($, Wildcard.TWOWEEKS_TAVG)) out = this.mergeArray(out, 'pressure', this.parseValue($, Wildcard.TWOWEEKS_PRESSURE)) out = this.mergeArray(out, 'wind_speed', this.parseValue($, Wildcard.TWOWEEKS_WINDSPEED)) out = this.mergeArray(out, 'wind_gust', this.parseValue($, Wildcard.TWOWEEKS_WINDGUST)) out = this.mergeArray(out, 'wind_dir', this.parseValue($, Wildcard.TWOWEEKS_WINDDIR)) out = this.mergeArray(out, 'precipitation', this.parseValue($, Wildcard.TWOWEEKS_PRECIPITATION)) out = this.mergeArray(out, 'humidity', this.parseValue($, Wildcard.TWOWEEKS_HUMIDITY)) out = this.mergeArray(out, 'summary', this.parseAttr($, Wildcard.TWOWEEKS_SUMMARY, 'data-text')) out = this.mergeArray(out, 'geomagnetic', this.parseValue($, Wildcard.TWOWEEKS_GEOMAGNETIC)) if ($(Wildcard.TWOWEEKS_ROADS).length > 0) { out = this.mergeArray(out, 'road_condition', this.parseValue($, Wildcard.TWOWEEKS_ROADS)) } else { out = this.mergeArray(out, 'road_condition', new Array(out.length).fill('unknown')) } if ($(Wildcard.TWOWEEKS_POLLEN_BIRCH).length > 0) { out = this.mergeArray(out, 'pollen_birch', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_BIRCH)) } else { out = this.mergeArray(out, 'pollen_birch', new Array(out.length).fill(0)) } if ($(Wildcard.TWOWEEKS_POLLEN_GRASS).length > 0) { out = this.mergeArray(out, 'pollen_grass', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_GRASS)) } else { out = this.mergeArray(out, 'pollen_grass', new Array(out.length).fill(0)) } if ($(Wildcard.TWOWEEKS_POLLEN_RAGWEED).length > 0) { out = this.mergeArray(out, 'pollen_ragweed', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_RAGWEED)) } else { out = this.mergeArray(out, 'pollen_ragweed', new Array(out.length).fill(0)) } return out as GismeteoTwoWeeks[] }) } public async getMonth(city: string): Promise { const city_uri = await this.getCityUri(city) return axios.get(`${this._base_url}${city_uri}${Endpoint.MONTH}`, this._axios_config).then(({ data }) => { const $ = load(data) let out: Partial[] = [] out = this.parseDates>($, Wildcard.MONTH_DATE) out = this.mergeArray(out, 'tmax', this.parseValue($, Wildcard.MONTH_TMAX)) out = this.mergeArray(out, 'tmin', this.parseValue($, Wildcard.MONTH_TMIN)) return out as GismeteoMonth[] }) } public async getNow(city: string): Promise { const city_uri = await this.getCityUri(city) return axios.get(`${this._base_url}${city_uri}${Endpoint.NOW}`, this._axios_config).then(({ data }) => { const $ = load(data) const out: GismeteoNow = { temp: this.numberify($(this.unitToWildcard(Wildcard.NOW_TEMP)).text()), temp_feels: this.numberify($(this.unitToWildcard(Wildcard.NOW_TEMPFEELS)).text()), wind_speed: this.numberify(this.parentText($, Wildcard.NOW_WINDSPEED)), wind_dir: $(this.unitToWildcard(Wildcard.NOW_WINDDIR)) .last() .text(), pressure: this.numberify(this.parentText($, Wildcard.NOW_PRESSURE)), humidity: this.numberify($(Wildcard.NOW_HUMIDITY).text()), summary: $(Wildcard.NOW_SUMMARY).text(), geomagnetic: this.numberify($(Wildcard.NOW_GEOMAGNETIC).text()), water_temp: this.numberify($(this.unitToWildcard(Wildcard.NOW_WATER)).text()), sunrise: moment(moment().format('DD MMM YYYY') + ' ' + $(Wildcard.NOW_SUNRISE).text(), 'DD MMM YYYY H:mm').unix(), sunset: moment(moment().format('DD MMM YYYY') + ' ' + $(Wildcard.NOW_SUNSET).text(), 'DD MMM YYYY H:mm').unix(), } return out }) } public async getTommorow(city: string): Promise { const city_uri = await this.getCityUri(city) return axios.get(`${this._base_url}${city_uri}${Endpoint.TOMMOROW}`, this._axios_config).then(({ data }) => { const $ = load(data) let out: Partial[] = [] const dates = this.parseAttr($, Wildcard.TOMORROW_TIME, 'title') out = this.parseDtFromStringArray>(dates) out = this.mergeArray(out, 'temp', this.parseValue($, Wildcard.TOMORROW_TEMP)) out = this.mergeArray(out, 'pressure', this.parseValue($, Wildcard.TOMORROW_PRESSURE)) out = this.mergeArray(out, 'wind_speed', this.parseValue($, Wildcard.TOMORROW_WINDSPEED)) out = this.mergeArray(out, 'wind_gust', this.parseValue($, Wildcard.TOMORROW_WINDGUST)) out = this.mergeArray(out, 'wind_dir', this.parseValue($, Wildcard.TOMORROW_WINDDIR)) out = this.mergeArray(out, 'precipitation', this.parseValue($, Wildcard.TOMORROW_PRECIPITATION)) out = this.mergeArray(out, 'humidity', this.parseValue($, Wildcard.TOMORROW_HUMIDITY)) out = this.mergeArray(out, 'summary', this.parseAttr($, Wildcard.TOMORROW_SUMMARY, 'data-text')) out = this.mergeArray(out, 'geomagnetic', this.parseValue($, Wildcard.TOMORROW_GEOMAGNETIC)) if ($(Wildcard.TOMORROW_ROADS).length > 0) { out = this.mergeArray(out, 'road_condition', this.parseValue($, Wildcard.TOMORROW_ROADS)) } else { out = this.mergeArray(out, 'road_condition', new Array(out.length).fill('unknown')) } if ($(Wildcard.TOMORROW_POLLEN_BIRCH).length > 0) { out = this.mergeArray(out, 'pollen_birch', this.parseValue($, Wildcard.TOMORROW_POLLEN_BIRCH)) } else { out = this.mergeArray(out, 'pollen_birch', new Array(out.length).fill(0)) } if ($(Wildcard.TOMORROW_POLLEN_GRASS).length > 0) { out = this.mergeArray(out, 'pollen_grass', this.parseValue($, Wildcard.TOMORROW_POLLEN_GRASS)) } else { out = this.mergeArray(out, 'pollen_grass', new Array(out.length).fill(0)) } if ($(Wildcard.TOMORROW_POLLEN_RAGWEED).length > 0) { out = this.mergeArray(out, 'pollen_ragweed', this.parseValue($, Wildcard.TOMORROW_POLLEN_RAGWEED)) } else { out = this.mergeArray(out, 'pollen_ragweed', new Array(out.length).fill(0)) } return out as GismeteoTomorrow[] }) } private async getCityUri(city: string): Promise { return axios.get(`${Endpoint.SEARCH}${encodeURIComponent(city)}/9/`, this._axios_config).then(({ data }) => { if (data.data.length === 0 || data.data[0]?.url === undefined) { throw new GismeteoCityError('Unable to find uri for given city name') } return data.data[0].url }) } private parseDates($: CheerioAPI, wildcard: Wildcard): T[] { const search = $(wildcard) const start_date = moment(search.first().text() + moment().format('YYYY'), 'DD MMMYYYY', 'ru') const out: T[] = [] for (let i = 0; i < search.length; i++) { out.push(({ dt: start_date.add(i, 'days').unix() } as unknown) as T) } return out } private parseDtFromStringArray(input: string[]): T[] { const out: T[] = [] for (let i = 0; i < input.length; i++) { const strip_date = input[i].split(', UTC: ')[1] out.push(({ dt: moment(strip_date, 'YYYY-MM-DD HH:mm:ss').unix() } as unknown) as T) } return out } private parseValue($: CheerioAPI, wildcard: Wildcard): T[] { const out: T[] = [] const search = $(this.unitToWildcard(wildcard)) search.each((i, el) => { out[i] = ((is_number( load(el) .text() .replace(',', '.'), ) ? this.numberify(load(el).text()) : load(el).text()) as unknown) as T }) return out } private parseAttr($: CheerioAPI, wildcard: Wildcard, attr: string): T[] { const out: T[] = [] const search = $(this.unitToWildcard(wildcard)) as Cheerio search.each((i, el) => { out[i] = ((is_number(el.attribs[attr].replace(',', '.')) ? Number(el.attribs[attr].replace(',', '.')) : el.attribs[attr]) as unknown) as T }) return out } private unitToWildcard(wildcard: Wildcard): string { return String(wildcard) .replace('UNIT_TEMP', this._unit.temp) .replace('UNIT_PRESSURE', this._unit.pressure) .replace('UNIT_WIND', this._unit.wind) } private mergeArray(input: T[], key: K, values: V[]): T[] { return input.map((item, index) => { item[key] = values[index] return item }) } private numberify(value: string | number): number { return Number(String(value).replace(',', '.')) } private parentText($: CheerioAPI, wildcard: Wildcard): string { return $(this.unitToWildcard(wildcard)) .contents() .filter(function() { return this.nodeType === 3 }) .text() } } ```
My CJS main file ```js 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var axios = _interopDefault(require('axios')); var moment = _interopDefault(require('moment')); var cheerio = require('cheerio'); var UserAgent = _interopDefault(require('user-agents')); var is_number = _interopDefault(require('is-number')); var Endpoint; (function (Endpoint) { Endpoint["BASE_RU"] = "https://www.gismeteo.ru"; Endpoint["BASE_EN"] = "https://www.gismeteo.com"; Endpoint["SEARCH"] = "https://www.gismeteo.ru/mq/search/"; Endpoint["TWOWEEKS"] = "2-weeks/"; Endpoint["MONTH"] = "month/"; Endpoint["NOW"] = "now/"; Endpoint["TOMMOROW"] = "tomorrow/"; })(Endpoint || (Endpoint = {})); var Unit; (function (Unit) { Unit["TEMP_C"] = "unit_temperature_c"; Unit["TEMP_F"] = "unit_temperature_f"; Unit["PRESSURE_MMHG"] = "unit_pressure_mm_hg_atm"; Unit["PRESSURE_HPA"] = "unit_pressure_h_pa"; Unit["WIND_MS"] = "unit_wind_m_s"; Unit["WIND_KMH"] = "unit_wind_km_h"; })(Unit || (Unit = {})); var Wildcard; (function (Wildcard) { Wildcard["TWOWEEKS_DATE"] = "div[data-stat-value*=\"weather\"] div.widget-row-days-date div.date"; Wildcard["TWOWEEKS_TMAX"] = "div[data-stat-value*=\"weather\"] div.widget-row-chart-temperature div.value div.maxt span.UNIT_TEMP"; Wildcard["TWOWEEKS_TMIN"] = "div[data-stat-value*=\"weather\"] div.widget-row-chart-temperature div.value div.mint span.UNIT_TEMP"; Wildcard["TWOWEEKS_TAVG"] = "div[data-stat-value*=\"temperature-avg\"] div.value span.UNIT_TEMP"; Wildcard["TWOWEEKS_SUMMARY"] = "div[data-stat-value*=\"weather\"] div.widget-row-icon div.row-item div.tooltip"; Wildcard["TWOWEEKS_PRESSURE"] = "div[data-stat-value*=\"pressure\"] div.widget-row-chart-pressure div.value div.maxt span.UNIT_PRESSURE"; Wildcard["TWOWEEKS_WINDSPEED"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-speed div.row-item span.UNIT_WIND"; Wildcard["TWOWEEKS_WINDGUST"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-gust div.row-item span.UNIT_WIND"; Wildcard["TWOWEEKS_WINDDIR"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-direction div.row-item div.direction"; Wildcard["TWOWEEKS_PRECIPITATION"] = "div[data-stat-value*=\"weather\"] div.widget-row-precipitation-bars div.row-item div.item-unit"; Wildcard["TWOWEEKS_HUMIDITY"] = "div[data-stat-value*=\"humidity\"] div.widget-items div.row-item"; Wildcard["TWOWEEKS_ROADS"] = "div[data-stat-value*=\"roadcondition\"] div.row-item div.item-description"; Wildcard["TWOWEEKS_GEOMAGNETIC"] = "div[data-stat-value*=\"geomagnetic\"] div.row-item div.item"; Wildcard["TWOWEEKS_POLLEN_BIRCH"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-birch-point div.row-item div.item"; Wildcard["TWOWEEKS_POLLEN_GRASS"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-grass-point div.row-item div.item"; Wildcard["TWOWEEKS_POLLEN_RAGWEED"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-ragweed div.row-item div.item"; Wildcard["MONTH_DATE"] = "div.widget-month div.date"; Wildcard["MONTH_TMAX"] = "div.widget-month div.maxt span.UNIT_TEMP"; Wildcard["MONTH_TMIN"] = "div.widget-month div.mint span.UNIT_TEMP"; Wildcard["NOW_TEMP"] = "div.now div.now-weather span.UNIT_TEMP"; Wildcard["NOW_TEMPFEELS"] = "div.now div.now-feel span.UNIT_TEMP"; Wildcard["NOW_WINDSPEED"] = "div.now div.wind div.UNIT_WIND"; Wildcard["NOW_WINDDIR"] = "div.now div.wind div.UNIT_WIND div.item-measure div"; Wildcard["NOW_PRESSURE"] = "div.now div.pressure div.UNIT_PRESSURE"; Wildcard["NOW_HUMIDITY"] = "div.now div.humidity div.item-value"; Wildcard["NOW_SUMMARY"] = "div.now div.now-desc"; Wildcard["NOW_GEOMAGNETIC"] = "div.now div.gm div.item-value"; Wildcard["NOW_WATER"] = "div.now div.water div.item-value div.UNIT_TEMP"; Wildcard["NOW_SUNRISE"] = "div.now div.now-astro div.now-astro-sunrise div.time"; Wildcard["NOW_SUNSET"] = "div.now div.now-astro div.now-astro-sunset div.time"; Wildcard["TOMORROW_TIME"] = "div[data-stat-value*=\"weather\"] div.widget-row-time div.row-item"; Wildcard["TOMORROW_TEMP"] = "div[data-stat-value*=\"weather\"] div.widget-row-chart-temperature div.value span.UNIT_TEMP"; Wildcard["TOMORROW_PRECIPITATION"] = "div[data-stat-value*=\"weather\"] div.widget-row-precipitation-bars div.row-item div.item-unit"; Wildcard["TOMORROW_SUMMARY"] = "div[data-stat-value*=\"weather\"] div.widget-row-icon div.row-item div.tooltip"; Wildcard["TOMORROW_WINDSPEED"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-speed div.row-item span.UNIT_WIND"; Wildcard["TOMORROW_WINDGUST"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-gust div.row-item span.UNIT_WIND"; Wildcard["TOMORROW_WINDDIR"] = "div[data-stat-value*=\"wind\"] div.widget-row-wind-direction div.row-item div.direction"; Wildcard["TOMORROW_POLLEN_BIRCH"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-birch-point div.row-item div.item"; Wildcard["TOMORROW_POLLEN_GRASS"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-grass-point div.row-item div.item"; Wildcard["TOMORROW_POLLEN_RAGWEED"] = "div[data-stat-value*=\"pollen\"] div.widget-row-pollen-ragweed div.row-item div.item"; Wildcard["TOMORROW_ROADS"] = "div[data-stat-value*=\"roadcondition\"] div.row-item div.item-description"; Wildcard["TOMORROW_PRESSURE"] = "div[data-stat-value*=\"pressure\"] div.widget-row-chart-pressure div.value span.UNIT_PRESSURE"; Wildcard["TOMORROW_HUMIDITY"] = "div[data-stat-value*=\"humidity\"] div.widget-items div.row-item"; Wildcard["TOMORROW_GEOMAGNETIC"] = "div[data-stat-value*=\"geomagnetic\"] div.row-item div.item"; })(Wildcard || (Wildcard = {})); class GismeteoCityError extends Error {} class Gismeteo { constructor(options) { this._axios_config = { headers: { 'user-agent': new UserAgent().toString() } }; this._base_url = (options == null ? void 0 : options.lang) === 'en' ? Endpoint.BASE_EN : Endpoint.BASE_RU; this._unit = { temp: (options == null ? void 0 : options.unit_temp) === 'F' ? Unit.TEMP_F : Unit.TEMP_C, pressure: (options == null ? void 0 : options.unit_pressure) === 'hPa' ? Unit.PRESSURE_HPA : Unit.PRESSURE_MMHG, wind: (options == null ? void 0 : options.unit_wind) === 'kmh' ? Unit.WIND_KMH : Unit.WIND_MS }; } async getTwoWeeks(city) { const city_uri = await this.getCityUri(city); return axios.get(`${this._base_url}${city_uri}${Endpoint.TWOWEEKS}`, this._axios_config).then(({ data }) => { const $ = cheerio.load(data); let out = []; out = this.parseDates($, Wildcard.TWOWEEKS_DATE); out = this.mergeArray(out, 'tmax', this.parseValue($, Wildcard.TWOWEEKS_TMAX)); out = this.mergeArray(out, 'tmin', this.parseValue($, Wildcard.TWOWEEKS_TMIN)); out = this.mergeArray(out, 'tavg', this.parseValue($, Wildcard.TWOWEEKS_TAVG)); out = this.mergeArray(out, 'pressure', this.parseValue($, Wildcard.TWOWEEKS_PRESSURE)); out = this.mergeArray(out, 'wind_speed', this.parseValue($, Wildcard.TWOWEEKS_WINDSPEED)); out = this.mergeArray(out, 'wind_gust', this.parseValue($, Wildcard.TWOWEEKS_WINDGUST)); out = this.mergeArray(out, 'wind_dir', this.parseValue($, Wildcard.TWOWEEKS_WINDDIR)); out = this.mergeArray(out, 'precipitation', this.parseValue($, Wildcard.TWOWEEKS_PRECIPITATION)); out = this.mergeArray(out, 'humidity', this.parseValue($, Wildcard.TWOWEEKS_HUMIDITY)); out = this.mergeArray(out, 'summary', this.parseAttr($, Wildcard.TWOWEEKS_SUMMARY, 'data-text')); out = this.mergeArray(out, 'geomagnetic', this.parseValue($, Wildcard.TWOWEEKS_GEOMAGNETIC)); if ($(Wildcard.TWOWEEKS_ROADS).length > 0) { out = this.mergeArray(out, 'road_condition', this.parseValue($, Wildcard.TWOWEEKS_ROADS)); } else { out = this.mergeArray(out, 'road_condition', new Array(out.length).fill('unknown')); } if ($(Wildcard.TWOWEEKS_POLLEN_BIRCH).length > 0) { out = this.mergeArray(out, 'pollen_birch', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_BIRCH)); } else { out = this.mergeArray(out, 'pollen_birch', new Array(out.length).fill(0)); } if ($(Wildcard.TWOWEEKS_POLLEN_GRASS).length > 0) { out = this.mergeArray(out, 'pollen_grass', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_GRASS)); } else { out = this.mergeArray(out, 'pollen_grass', new Array(out.length).fill(0)); } if ($(Wildcard.TWOWEEKS_POLLEN_RAGWEED).length > 0) { out = this.mergeArray(out, 'pollen_ragweed', this.parseValue($, Wildcard.TWOWEEKS_POLLEN_RAGWEED)); } else { out = this.mergeArray(out, 'pollen_ragweed', new Array(out.length).fill(0)); } return out; }); } async getMonth(city) { const city_uri = await this.getCityUri(city); return axios.get(`${this._base_url}${city_uri}${Endpoint.MONTH}`, this._axios_config).then(({ data }) => { const $ = cheerio.load(data); let out = []; out = this.parseDates($, Wildcard.MONTH_DATE); out = this.mergeArray(out, 'tmax', this.parseValue($, Wildcard.MONTH_TMAX)); out = this.mergeArray(out, 'tmin', this.parseValue($, Wildcard.MONTH_TMIN)); return out; }); } async getNow(city) { const city_uri = await this.getCityUri(city); return axios.get(`${this._base_url}${city_uri}${Endpoint.NOW}`, this._axios_config).then(({ data }) => { const $ = cheerio.load(data); const out = { temp: this.numberify($(this.unitToWildcard(Wildcard.NOW_TEMP)).text()), temp_feels: this.numberify($(this.unitToWildcard(Wildcard.NOW_TEMPFEELS)).text()), wind_speed: this.numberify(this.parentText($, Wildcard.NOW_WINDSPEED)), wind_dir: $(this.unitToWildcard(Wildcard.NOW_WINDDIR)).last().text(), pressure: this.numberify(this.parentText($, Wildcard.NOW_PRESSURE)), humidity: this.numberify($(Wildcard.NOW_HUMIDITY).text()), summary: $(Wildcard.NOW_SUMMARY).text(), geomagnetic: this.numberify($(Wildcard.NOW_GEOMAGNETIC).text()), water_temp: this.numberify($(this.unitToWildcard(Wildcard.NOW_WATER)).text()), sunrise: moment(moment().format('DD MMM YYYY') + ' ' + $(Wildcard.NOW_SUNRISE).text(), 'DD MMM YYYY H:mm').unix(), sunset: moment(moment().format('DD MMM YYYY') + ' ' + $(Wildcard.NOW_SUNSET).text(), 'DD MMM YYYY H:mm').unix() }; return out; }); } async getTommorow(city) { const city_uri = await this.getCityUri(city); return axios.get(`${this._base_url}${city_uri}${Endpoint.TOMMOROW}`, this._axios_config).then(({ data }) => { const $ = cheerio.load(data); let out = []; const dates = this.parseAttr($, Wildcard.TOMORROW_TIME, 'title'); out = this.parseDtFromStringArray(dates); out = this.mergeArray(out, 'temp', this.parseValue($, Wildcard.TOMORROW_TEMP)); out = this.mergeArray(out, 'pressure', this.parseValue($, Wildcard.TOMORROW_PRESSURE)); out = this.mergeArray(out, 'wind_speed', this.parseValue($, Wildcard.TOMORROW_WINDSPEED)); out = this.mergeArray(out, 'wind_gust', this.parseValue($, Wildcard.TOMORROW_WINDGUST)); out = this.mergeArray(out, 'wind_dir', this.parseValue($, Wildcard.TOMORROW_WINDDIR)); out = this.mergeArray(out, 'precipitation', this.parseValue($, Wildcard.TOMORROW_PRECIPITATION)); out = this.mergeArray(out, 'humidity', this.parseValue($, Wildcard.TOMORROW_HUMIDITY)); out = this.mergeArray(out, 'summary', this.parseAttr($, Wildcard.TOMORROW_SUMMARY, 'data-text')); out = this.mergeArray(out, 'geomagnetic', this.parseValue($, Wildcard.TOMORROW_GEOMAGNETIC)); if ($(Wildcard.TOMORROW_ROADS).length > 0) { out = this.mergeArray(out, 'road_condition', this.parseValue($, Wildcard.TOMORROW_ROADS)); } else { out = this.mergeArray(out, 'road_condition', new Array(out.length).fill('unknown')); } if ($(Wildcard.TOMORROW_POLLEN_BIRCH).length > 0) { out = this.mergeArray(out, 'pollen_birch', this.parseValue($, Wildcard.TOMORROW_POLLEN_BIRCH)); } else { out = this.mergeArray(out, 'pollen_birch', new Array(out.length).fill(0)); } if ($(Wildcard.TOMORROW_POLLEN_GRASS).length > 0) { out = this.mergeArray(out, 'pollen_grass', this.parseValue($, Wildcard.TOMORROW_POLLEN_GRASS)); } else { out = this.mergeArray(out, 'pollen_grass', new Array(out.length).fill(0)); } if ($(Wildcard.TOMORROW_POLLEN_RAGWEED).length > 0) { out = this.mergeArray(out, 'pollen_ragweed', this.parseValue($, Wildcard.TOMORROW_POLLEN_RAGWEED)); } else { out = this.mergeArray(out, 'pollen_ragweed', new Array(out.length).fill(0)); } return out; }); } async getCityUri(city) { return axios.get(`${Endpoint.SEARCH}${encodeURIComponent(city)}/9/`, this._axios_config).then(({ data }) => { var _data$data$; if (data.data.length === 0 || ((_data$data$ = data.data[0]) == null ? void 0 : _data$data$.url) === undefined) { throw new GismeteoCityError('Unable to find uri for given city name'); } return data.data[0].url; }); } parseDates($, wildcard) { const search = $(wildcard); const start_date = moment(search.first().text() + moment().format('YYYY'), 'DD MMMYYYY', 'ru'); const out = []; for (let i = 0; i < search.length; i++) { out.push({ dt: start_date.add(i, 'days').unix() }); } return out; } parseDtFromStringArray(input) { const out = []; for (let i = 0; i < input.length; i++) { const strip_date = input[i].split(', UTC: ')[1]; out.push({ dt: moment(strip_date, 'YYYY-MM-DD HH:mm:ss').unix() }); } return out; } parseValue($, wildcard) { const out = []; const search = $(this.unitToWildcard(wildcard)); search.each((i, el) => { out[i] = is_number(cheerio.load(el).text().replace(',', '.')) ? this.numberify(cheerio.load(el).text()) : cheerio.load(el).text(); }); return out; } parseAttr($, wildcard, attr) { const out = []; const search = $(this.unitToWildcard(wildcard)); search.each((i, el) => { out[i] = is_number(el.attribs[attr].replace(',', '.')) ? Number(el.attribs[attr].replace(',', '.')) : el.attribs[attr]; }); return out; } unitToWildcard(wildcard) { return String(wildcard).replace('UNIT_TEMP', this._unit.temp).replace('UNIT_PRESSURE', this._unit.pressure).replace('UNIT_WIND', this._unit.wind); } mergeArray(input, key, values) { return input.map((item, index) => { item[key] = values[index]; return item; }); } numberify(value) { return Number(String(value).replace(',', '.')); } parentText($, wildcard) { return $(this.unitToWildcard(wildcard)).contents().filter(function () { return this.nodeType === 3; }).text(); } } exports.default = Gismeteo; //# sourceMappingURL=gismeteo.cjs.development.js.map ```

Trying to do this:

import Gismeteo from 'gismeteo'
console.log(new Gismeteo())

And here is the full error:

file:///E:/programming/ts/gismeteo-class/build/src/check.js:12
console.log(new Gismeteo());
            ^

TypeError: Gismeteo is not a constructor
    at file:///E:/programming/ts/gismeteo-class/build/src/check.js:12:13
    at ModuleJob.run (node:internal/modules/esm/module_job:185:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:281:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:65:12)
error Command failed with exit code 1.

Your environment

  System:
    OS: Windows 10 10.0.22000
    CPU: (12) x64 Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz
    Memory: 5.91 GB / 15.89 GB
  Binaries:
    Node: 16.13.0 - C:\Program Files\nodejs\node.EXE
    Yarn: 1.23.0-20220130.1630 - ~\AppData\Roaming\npm\yarn.CMD
    npm: 8.1.0 - C:\Program Files\nodejs\npm.CMD
  Browsers:
    Chrome: 101.0.4951.67
    Edge: Spartan (44.22000.120.0), Chromium (101.0.1210.53)
    Internet Explorer: 11.0.22000.120
  npmPackages:
    tsdx: ^0.14.1 => 0.14.1
    typescript: ^4.7.2 => 4.7.2