@dangahagan/weather-mcp 0.2.0 → 1.0.0

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.
Files changed (88) hide show
  1. package/README.md +372 -53
  2. package/dist/config/cache.d.ts +2 -0
  3. package/dist/config/cache.d.ts.map +1 -1
  4. package/dist/config/cache.js +48 -2
  5. package/dist/config/cache.js.map +1 -1
  6. package/dist/config/displayThresholds.d.ts +83 -0
  7. package/dist/config/displayThresholds.d.ts.map +1 -0
  8. package/dist/config/displayThresholds.js +83 -0
  9. package/dist/config/displayThresholds.js.map +1 -0
  10. package/dist/errors/ApiError.d.ts +62 -0
  11. package/dist/errors/ApiError.d.ts.map +1 -0
  12. package/dist/errors/ApiError.js +147 -0
  13. package/dist/errors/ApiError.js.map +1 -0
  14. package/dist/handlers/airQualityHandler.d.ts +11 -0
  15. package/dist/handlers/airQualityHandler.d.ts.map +1 -0
  16. package/dist/handlers/airQualityHandler.js +154 -0
  17. package/dist/handlers/airQualityHandler.js.map +1 -0
  18. package/dist/handlers/alertsHandler.d.ts +11 -0
  19. package/dist/handlers/alertsHandler.d.ts.map +1 -0
  20. package/dist/handlers/alertsHandler.js +82 -0
  21. package/dist/handlers/alertsHandler.js.map +1 -0
  22. package/dist/handlers/currentConditionsHandler.d.ts +11 -0
  23. package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
  24. package/dist/handlers/currentConditionsHandler.js +231 -0
  25. package/dist/handlers/currentConditionsHandler.js.map +1 -0
  26. package/dist/handlers/forecastHandler.d.ts +13 -0
  27. package/dist/handlers/forecastHandler.d.ts.map +1 -0
  28. package/dist/handlers/forecastHandler.js +337 -0
  29. package/dist/handlers/forecastHandler.js.map +1 -0
  30. package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
  31. package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
  32. package/dist/handlers/historicalWeatherHandler.js +188 -0
  33. package/dist/handlers/historicalWeatherHandler.js.map +1 -0
  34. package/dist/handlers/locationHandler.d.ts +11 -0
  35. package/dist/handlers/locationHandler.d.ts.map +1 -0
  36. package/dist/handlers/locationHandler.js +113 -0
  37. package/dist/handlers/locationHandler.js.map +1 -0
  38. package/dist/handlers/marineConditionsHandler.d.ts +11 -0
  39. package/dist/handlers/marineConditionsHandler.d.ts.map +1 -0
  40. package/dist/handlers/marineConditionsHandler.js +154 -0
  41. package/dist/handlers/marineConditionsHandler.js.map +1 -0
  42. package/dist/handlers/statusHandler.d.ts +12 -0
  43. package/dist/handlers/statusHandler.d.ts.map +1 -0
  44. package/dist/handlers/statusHandler.js +106 -0
  45. package/dist/handlers/statusHandler.js.map +1 -0
  46. package/dist/index.js +219 -377
  47. package/dist/index.js.map +1 -1
  48. package/dist/services/noaa.d.ts +24 -1
  49. package/dist/services/noaa.d.ts.map +1 -1
  50. package/dist/services/noaa.js +116 -43
  51. package/dist/services/noaa.js.map +1 -1
  52. package/dist/services/openmeteo.d.ts +110 -3
  53. package/dist/services/openmeteo.d.ts.map +1 -1
  54. package/dist/services/openmeteo.js +568 -112
  55. package/dist/services/openmeteo.js.map +1 -1
  56. package/dist/types/noaa.d.ts +158 -12
  57. package/dist/types/noaa.d.ts.map +1 -1
  58. package/dist/types/openmeteo.d.ts +448 -0
  59. package/dist/types/openmeteo.d.ts.map +1 -1
  60. package/dist/utils/airQuality.d.ts +54 -0
  61. package/dist/utils/airQuality.d.ts.map +1 -0
  62. package/dist/utils/airQuality.js +251 -0
  63. package/dist/utils/airQuality.js.map +1 -0
  64. package/dist/utils/cache.d.ts +11 -4
  65. package/dist/utils/cache.d.ts.map +1 -1
  66. package/dist/utils/cache.js +33 -4
  67. package/dist/utils/cache.js.map +1 -1
  68. package/dist/utils/fireWeather.d.ts +62 -0
  69. package/dist/utils/fireWeather.d.ts.map +1 -0
  70. package/dist/utils/fireWeather.js +168 -0
  71. package/dist/utils/fireWeather.js.map +1 -0
  72. package/dist/utils/logger.d.ts +59 -0
  73. package/dist/utils/logger.d.ts.map +1 -0
  74. package/dist/utils/logger.js +128 -0
  75. package/dist/utils/logger.js.map +1 -0
  76. package/dist/utils/marine.d.ts +38 -0
  77. package/dist/utils/marine.d.ts.map +1 -0
  78. package/dist/utils/marine.js +162 -0
  79. package/dist/utils/marine.js.map +1 -0
  80. package/dist/utils/temperatureConversion.d.ts +12 -0
  81. package/dist/utils/temperatureConversion.d.ts.map +1 -0
  82. package/dist/utils/temperatureConversion.js +17 -0
  83. package/dist/utils/temperatureConversion.js.map +1 -0
  84. package/dist/utils/validation.d.ts +89 -0
  85. package/dist/utils/validation.d.ts.map +1 -0
  86. package/dist/utils/validation.js +177 -0
  87. package/dist/utils/validation.js.map +1 -0
  88. package/package.json +10 -3
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Handler for get_alerts tool
3
+ */
4
+ import { validateCoordinates, validateOptionalBoolean } from '../utils/validation.js';
5
+ export async function handleGetAlerts(args, noaaService) {
6
+ // Validate input parameters with runtime checks
7
+ const { latitude, longitude } = validateCoordinates(args);
8
+ const active_only = validateOptionalBoolean(args?.active_only, 'active_only', true);
9
+ // Get alerts data
10
+ const alertsData = await noaaService.getAlerts(latitude, longitude, active_only);
11
+ const alerts = alertsData.features;
12
+ // Format the alerts for display
13
+ let output = `# Weather Alerts\n\n`;
14
+ output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
15
+ output += `**Status:** ${active_only ? 'Active alerts only' : 'All alerts'}\n`;
16
+ if (alertsData.updated) {
17
+ output += `**Updated:** ${new Date(alertsData.updated).toLocaleString()}\n`;
18
+ }
19
+ output += `\n`;
20
+ if (alerts.length === 0) {
21
+ output += `✅ **No active weather alerts for this location.**\n\n`;
22
+ output += `The area is currently clear of weather warnings, watches, and advisories.\n`;
23
+ }
24
+ else {
25
+ output += `⚠️ **${alerts.length} active alert${alerts.length > 1 ? 's' : ''} found**\n\n`;
26
+ const severityOrder = {
27
+ 'Extreme': 0,
28
+ 'Severe': 1,
29
+ 'Moderate': 2,
30
+ 'Minor': 3,
31
+ 'Unknown': 4
32
+ };
33
+ // Cache severity values to avoid repeated lookups during sort
34
+ const alertsWithSeverity = alerts.map(alert => ({
35
+ alert,
36
+ severityValue: severityOrder[alert.properties.severity] ?? 4
37
+ }));
38
+ const sortedAlerts = alertsWithSeverity
39
+ .sort((a, b) => a.severityValue - b.severityValue)
40
+ .map(item => item.alert);
41
+ for (const alert of sortedAlerts) {
42
+ const props = alert.properties;
43
+ // Severity emoji
44
+ const severityEmoji = props.severity === 'Extreme' ? '🔴' :
45
+ props.severity === 'Severe' ? '🟠' :
46
+ props.severity === 'Moderate' ? '🟡' :
47
+ props.severity === 'Minor' ? '🔵' : '⚪';
48
+ output += `${severityEmoji} **${props.event}**\n`;
49
+ output += `---\n`;
50
+ if (props.headline) {
51
+ output += `**${props.headline}**\n\n`;
52
+ }
53
+ output += `**Severity:** ${props.severity} | **Urgency:** ${props.urgency} | **Certainty:** ${props.certainty}\n`;
54
+ output += `**Area:** ${props.areaDesc}\n`;
55
+ output += `**Effective:** ${new Date(props.effective).toLocaleString()}\n`;
56
+ output += `**Expires:** ${new Date(props.expires).toLocaleString()}\n`;
57
+ if (props.onset && props.onset !== props.effective) {
58
+ output += `**Onset:** ${new Date(props.onset).toLocaleString()}\n`;
59
+ }
60
+ if (props.ends) {
61
+ output += `**Ends:** ${new Date(props.ends).toLocaleString()}\n`;
62
+ }
63
+ output += `\n**Description:**\n${props.description}\n`;
64
+ if (props.instruction) {
65
+ output += `\n**Instructions:**\n${props.instruction}\n`;
66
+ }
67
+ output += `\n**Recommended Response:** ${props.response}\n`;
68
+ output += `**Sender:** ${props.senderName}\n\n`;
69
+ }
70
+ }
71
+ output += `---\n`;
72
+ output += `*Data source: NOAA National Weather Service*\n`;
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: output
78
+ }
79
+ ]
80
+ };
81
+ }
82
+ //# sourceMappingURL=alertsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alertsHandler.js","sourceRoot":"","sources":["../../src/handlers/alertsHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Handler for get_current_conditions tool
3
+ */
4
+ import { NOAAService } from '../services/noaa.js';
5
+ export declare function handleGetCurrentConditions(args: unknown, noaaService: NOAAService): Promise<{
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ }>;
11
+ //# sourceMappingURL=currentConditionsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currentConditionsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/currentConditionsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmBlD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA6P7D"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Handler for get_current_conditions tool
3
+ */
4
+ import { validateCoordinates, validateOptionalBoolean } from '../utils/validation.js';
5
+ import { convertToFahrenheit } from '../utils/temperatureConversion.js';
6
+ import { DisplayThresholds } from '../config/displayThresholds.js';
7
+ import { getHainesCategory, getGrasslandFireDangerCategory, getRedFlagCategory, getCurrentFireWeatherValue, formatMixingHeight, interpretTransportWind } from '../utils/fireWeather.js';
8
+ export async function handleGetCurrentConditions(args, noaaService) {
9
+ // Validate input parameters with runtime checks
10
+ const { latitude, longitude } = validateCoordinates(args);
11
+ const includeFireWeather = validateOptionalBoolean(args?.include_fire_weather, 'include_fire_weather', false);
12
+ // Get current observation
13
+ const observation = await noaaService.getCurrentConditions(latitude, longitude);
14
+ const props = observation.properties;
15
+ // Format current conditions
16
+ let output = `# Current Weather Conditions\n\n`;
17
+ output += `**Station:** ${props.station}\n`;
18
+ output += `**Time:** ${new Date(props.timestamp).toLocaleString()}\n\n`;
19
+ // Main conditions
20
+ if (props.textDescription) {
21
+ output += `**Conditions:** ${props.textDescription}\n`;
22
+ }
23
+ // Temperature section
24
+ const tempF = convertToFahrenheit(props.temperature.value, props.temperature.unitCode);
25
+ if (tempF !== null) {
26
+ output += `**Temperature:** ${Math.round(tempF)}°F\n`;
27
+ // Show heat index when temperature is high and heat index is available
28
+ if (props.heatIndex) {
29
+ const heatIndexF = convertToFahrenheit(props.heatIndex.value, props.heatIndex.unitCode);
30
+ if (heatIndexF !== null && tempF > DisplayThresholds.temperature.showHeatIndex && heatIndexF > tempF) {
31
+ output += `**Feels Like (Heat Index):** ${Math.round(heatIndexF)}°F\n`;
32
+ }
33
+ }
34
+ // Show wind chill when temperature is low and wind chill is available
35
+ if (props.windChill) {
36
+ const windChillF = convertToFahrenheit(props.windChill.value, props.windChill.unitCode);
37
+ if (windChillF !== null && tempF < DisplayThresholds.temperature.showWindChill && windChillF < tempF) {
38
+ output += `**Feels Like (Wind Chill):** ${Math.round(windChillF)}°F\n`;
39
+ }
40
+ }
41
+ }
42
+ // 24-hour temperature range
43
+ const max24F = props.maxTemperatureLast24Hours ? convertToFahrenheit(props.maxTemperatureLast24Hours.value, props.maxTemperatureLast24Hours.unitCode) : null;
44
+ const min24F = props.minTemperatureLast24Hours ? convertToFahrenheit(props.minTemperatureLast24Hours.value, props.minTemperatureLast24Hours.unitCode) : null;
45
+ if (max24F !== null || min24F !== null) {
46
+ let range = `**24-Hour Range:**`;
47
+ if (max24F !== null)
48
+ range += ` High ${Math.round(max24F)}°F`;
49
+ if (max24F !== null && min24F !== null)
50
+ range += ` /`;
51
+ if (min24F !== null)
52
+ range += ` Low ${Math.round(min24F)}°F`;
53
+ output += `${range}\n`;
54
+ }
55
+ if (props.dewpoint.value !== null) {
56
+ const dewF = convertToFahrenheit(props.dewpoint.value, props.dewpoint.unitCode);
57
+ if (dewF !== null) {
58
+ output += `**Dewpoint:** ${Math.round(dewF)}°F\n`;
59
+ }
60
+ }
61
+ if (props.relativeHumidity.value !== null) {
62
+ output += `**Humidity:** ${Math.round(props.relativeHumidity.value)}%\n`;
63
+ }
64
+ // Wind section
65
+ if (props.windSpeed && props.windSpeed.value !== null) {
66
+ const windMph = props.windSpeed.unitCode.includes('km_h')
67
+ ? props.windSpeed.value * 0.621371
68
+ : props.windSpeed.value * 2.23694; // m/s to mph
69
+ const windDir = props.windDirection?.value ?? null;
70
+ output += `**Wind:** ${Math.round(windMph)} mph`;
71
+ if (windDir !== null) {
72
+ output += ` from ${Math.round(windDir)}°`;
73
+ }
74
+ // Add wind gust if available and significant
75
+ if (props.windGust && props.windGust.value !== null) {
76
+ const gustMph = props.windGust.unitCode.includes('km_h')
77
+ ? props.windGust.value * 0.621371
78
+ : props.windGust.value * 2.23694;
79
+ if (gustMph > windMph * DisplayThresholds.wind.gustSignificanceRatio) {
80
+ output += `, gusting to ${Math.round(gustMph)} mph`;
81
+ }
82
+ }
83
+ output += `\n`;
84
+ }
85
+ if (props.barometricPressure && props.barometricPressure.value !== null) {
86
+ const pressureInHg = props.barometricPressure.value * 0.0002953;
87
+ output += `**Pressure:** ${pressureInHg.toFixed(2)} inHg\n`;
88
+ }
89
+ // Enhanced visibility and cloud cover
90
+ if (props.visibility && props.visibility.value !== null) {
91
+ const visibilityMiles = props.visibility.value * 0.000621371;
92
+ output += `**Visibility:** ${visibilityMiles.toFixed(1)} miles`;
93
+ // Add descriptive text for visibility
94
+ if (visibilityMiles < DisplayThresholds.visibility.denseFog) {
95
+ output += ` (dense fog)`;
96
+ }
97
+ else if (visibilityMiles < DisplayThresholds.visibility.fog) {
98
+ output += ` (fog)`;
99
+ }
100
+ else if (visibilityMiles < DisplayThresholds.visibility.hazeMist) {
101
+ output += ` (haze/mist)`;
102
+ }
103
+ else if (visibilityMiles >= DisplayThresholds.visibility.clear) {
104
+ output += ` (clear)`;
105
+ }
106
+ output += `\n`;
107
+ }
108
+ // Cloud cover details
109
+ if (props.cloudLayers && props.cloudLayers.length > 0) {
110
+ const cloudDescriptions = {
111
+ 'FEW': 'Few clouds',
112
+ 'SCT': 'Scattered clouds',
113
+ 'BKN': 'Broken clouds',
114
+ 'OVC': 'Overcast',
115
+ 'CLR': 'Clear',
116
+ 'SKC': 'Sky clear'
117
+ };
118
+ const clouds = props.cloudLayers
119
+ .filter(layer => layer.amount)
120
+ .map(layer => {
121
+ const desc = cloudDescriptions[layer.amount] || layer.amount;
122
+ if (layer.base?.value !== null && layer.base?.value !== undefined) {
123
+ const heightFt = layer.base.unitCode.includes('m')
124
+ ? layer.base.value * 3.28084
125
+ : layer.base.value;
126
+ return `${desc} at ${Math.round(heightFt).toLocaleString()} ft`;
127
+ }
128
+ return desc;
129
+ });
130
+ if (clouds.length > 0) {
131
+ output += `**Cloud Cover:** ${clouds.join(', ')}\n`;
132
+ }
133
+ }
134
+ // Precipitation section
135
+ const precip1h = props.precipitationLastHour?.value ?? null;
136
+ const precip3h = props.precipitationLast3Hours?.value ?? null;
137
+ const precip6h = props.precipitationLast6Hours?.value ?? null;
138
+ if (precip1h !== null || precip3h !== null || precip6h !== null) {
139
+ output += `\n## Recent Precipitation\n`;
140
+ if (precip1h !== null && props.precipitationLastHour) {
141
+ const precipIn = props.precipitationLastHour.unitCode.includes('mm')
142
+ ? precip1h * 0.0393701
143
+ : precip1h;
144
+ output += `**Last Hour:** ${precipIn.toFixed(2)} inches\n`;
145
+ }
146
+ if (precip3h !== null && props.precipitationLast3Hours) {
147
+ const precipIn = props.precipitationLast3Hours.unitCode.includes('mm')
148
+ ? precip3h * 0.0393701
149
+ : precip3h;
150
+ output += `**Last 3 Hours:** ${precipIn.toFixed(2)} inches\n`;
151
+ }
152
+ if (precip6h !== null && props.precipitationLast6Hours) {
153
+ const precipIn = props.precipitationLast6Hours.unitCode.includes('mm')
154
+ ? precip6h * 0.0393701
155
+ : precip6h;
156
+ output += `**Last 6 Hours:** ${precipIn.toFixed(2)} inches\n`;
157
+ }
158
+ }
159
+ // Fire Weather section (optional)
160
+ if (includeFireWeather) {
161
+ try {
162
+ const gridpointData = await noaaService.getGridpointDataByCoordinates(latitude, longitude);
163
+ const fireProps = gridpointData.properties;
164
+ // Check if any fire weather data is available
165
+ const hainesValue = getCurrentFireWeatherValue(fireProps.hainesIndex);
166
+ const grasslandValue = getCurrentFireWeatherValue(fireProps.grasslandFireDangerIndex);
167
+ const redFlagValue = getCurrentFireWeatherValue(fireProps.redFlagThreatIndex);
168
+ const mixingHeightValue = getCurrentFireWeatherValue(fireProps.mixingHeight);
169
+ const transportWindValue = getCurrentFireWeatherValue(fireProps.transportWindSpeed);
170
+ if (hainesValue !== null || grasslandValue !== null || redFlagValue !== null || mixingHeightValue !== null) {
171
+ output += `\n## Fire Weather\n\n`;
172
+ // Haines Index
173
+ if (hainesValue !== null) {
174
+ const hainesCategory = getHainesCategory(hainesValue);
175
+ const emoji = hainesCategory.level === 'Low' ? '🟢' :
176
+ hainesCategory.level === 'Moderate' ? '🟡' :
177
+ hainesCategory.level === 'High' ? '🟠' : '🔴';
178
+ output += `**${emoji} Haines Index:** ${hainesValue} (${hainesCategory.level})\n`;
179
+ output += `${hainesCategory.fireGrowthPotential}\n\n`;
180
+ }
181
+ // Grassland Fire Danger Index
182
+ if (grasslandValue !== null) {
183
+ const grasslandCategory = getGrasslandFireDangerCategory(grasslandValue);
184
+ const emoji = grasslandCategory.level === 'Low' ? '🟢' :
185
+ grasslandCategory.level === 'Moderate' ? '🟡' :
186
+ grasslandCategory.level === 'High' ? '🟠' : '🔴';
187
+ output += `**${emoji} Grassland Fire Danger:** ${grasslandValue} (${grasslandCategory.level})\n`;
188
+ output += `${grasslandCategory.description}\n\n`;
189
+ }
190
+ // Red Flag Threat Index
191
+ if (redFlagValue !== null) {
192
+ const redFlagCategory = getRedFlagCategory(redFlagValue);
193
+ const emoji = redFlagCategory.level === 'Low' ? '🟢' :
194
+ redFlagCategory.level === 'Moderate' ? '🟡' :
195
+ redFlagCategory.level === 'High' ? '🟠' : '🔴';
196
+ output += `**${emoji} Red Flag Threat:** ${Math.round(redFlagValue)} (${redFlagCategory.level})\n`;
197
+ output += `${redFlagCategory.description}\n\n`;
198
+ }
199
+ // Mixing Height (important for smoke dispersion)
200
+ if (mixingHeightValue !== null) {
201
+ const mixingHeightFt = mixingHeightValue; // Already in feet from API
202
+ output += `**Mixing Height:** ${formatMixingHeight(mixingHeightFt)}\n`;
203
+ }
204
+ // Transport Wind Speed (smoke transport)
205
+ if (transportWindValue !== null) {
206
+ output += `**Transport Wind:** ${interpretTransportWind(transportWindValue)}\n`;
207
+ }
208
+ }
209
+ else {
210
+ output += `\n## Fire Weather\n\n`;
211
+ output += `No fire weather data available for this location.\n`;
212
+ }
213
+ }
214
+ catch (error) {
215
+ // If fire weather data fetch fails, just skip it (don't error the whole request)
216
+ output += `\n## Fire Weather\n\n`;
217
+ output += `⚠️ Fire weather data not available for this location.\n`;
218
+ }
219
+ }
220
+ output += `\n---\n`;
221
+ output += `*Data source: NOAA National Weather Service*\n`;
222
+ return {
223
+ content: [
224
+ {
225
+ type: 'text',
226
+ text: output
227
+ }
228
+ ]
229
+ };
230
+ }
231
+ //# sourceMappingURL=currentConditionsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currentConditionsHandler.js","sourceRoot":"","sources":["../../src/handlers/currentConditionsHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Handler for get_forecast tool
3
+ * Supports both NOAA (US) and Open-Meteo (global) forecast sources
4
+ */
5
+ import { NOAAService } from '../services/noaa.js';
6
+ import { OpenMeteoService } from '../services/openmeteo.js';
7
+ export declare function handleGetForecast(args: unknown, noaaService: NOAAService, openMeteoService: OpenMeteoService): Promise<{
8
+ content: Array<{
9
+ type: string;
10
+ text: string;
11
+ }>;
12
+ }>;
13
+ //# sourceMappingURL=forecastHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecastHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/forecastHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA8I5D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiD7D"}