@acorex-platform/extension-weather-core-client 0.0.21
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/fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs +161 -0
- package/fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs +803 -0
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-extension-weather-core-client-contracts.d.ts +114 -0
- package/types/acorex-platform-extension-weather-core-client.d.ts +17 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
//#region ---- Weather extension root config ----
|
|
2
|
+
const config = {
|
|
3
|
+
i18n: 'extensions-weather',
|
|
4
|
+
};
|
|
5
|
+
const MODULE_NAME = 'WeatherExtension';
|
|
6
|
+
/** Keep dashboard widget type ids for backward compatibility with existing dashboards. */
|
|
7
|
+
const dashboardWidgetId = (segment) => `DashboardManagement:Widget:Dashboard:${segment}`;
|
|
8
|
+
const RootConfig = {
|
|
9
|
+
config,
|
|
10
|
+
module: {
|
|
11
|
+
name: MODULE_NAME,
|
|
12
|
+
title: `@${config.i18n}:module.title`,
|
|
13
|
+
icon: 'fa-light fa-cloud-sun-rain',
|
|
14
|
+
},
|
|
15
|
+
widgets: {
|
|
16
|
+
weather: dashboardWidgetId('Weather'),
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
|
|
21
|
+
//#region ---- Weather query keys ----
|
|
22
|
+
const AXEWeatherQueryKeys = {
|
|
23
|
+
GetForecast: 'WeatherExtension:Weather:GetForecast',
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
|
|
27
|
+
//#region ---- Weather extension settings ----
|
|
28
|
+
var AXEWeatherSettingKeys;
|
|
29
|
+
(function (AXEWeatherSettingKeys) {
|
|
30
|
+
AXEWeatherSettingKeys["ActiveProvider"] = "WeatherExtension:Setting:ActiveProvider";
|
|
31
|
+
})(AXEWeatherSettingKeys || (AXEWeatherSettingKeys = {}));
|
|
32
|
+
const WEATHER_PROVIDER_IDS = {
|
|
33
|
+
WeatherApi: 'weatherapi',
|
|
34
|
+
OpenWeatherMap: 'openweathermap',
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
|
|
38
|
+
//#region ---- Weather integration domain ----
|
|
39
|
+
const AXE_WEATHER_DOMAIN_ID = 'weather';
|
|
40
|
+
//#endregion
|
|
41
|
+
|
|
42
|
+
//#region ---- Weather data types ----
|
|
43
|
+
//#endregion
|
|
44
|
+
|
|
45
|
+
//#region ---- Server weather provider port ----
|
|
46
|
+
const WEATHER_PROVIDER = Symbol('WEATHER_PROVIDER');
|
|
47
|
+
//#endregion
|
|
48
|
+
|
|
49
|
+
//#region ---- Weather condition catalog ----
|
|
50
|
+
const WEATHER_CONDITIONS = {
|
|
51
|
+
sunny: { id: 'sunny', name: 'Sunny', icon: 'fa-solid fa-sun', svgIcon: 'day.svg', color: '#ff9d00' },
|
|
52
|
+
clearNight: { id: 'clearNight', name: 'Clear Night', icon: 'fa-solid fa-moon', svgIcon: 'night.svg', color: '#5d639e' },
|
|
53
|
+
partlyCloudy: { id: 'partlyCloudy', name: 'Partly Cloudy', icon: 'fa-solid fa-cloud-sun', svgIcon: 'cloudy-day-3.svg', color: '#6ba4e8' },
|
|
54
|
+
partlyCloudyNight: { id: 'partlyCloudyNight', name: 'Partly Cloudy Night', icon: 'fa-solid fa-cloud-moon', svgIcon: 'cloudy-night-3.svg', color: '#5d639e' },
|
|
55
|
+
cloudy: { id: 'cloudy', name: 'Cloudy', icon: 'fa-solid fa-cloud', svgIcon: 'cloudy.svg', color: '#72869d' },
|
|
56
|
+
rain: { id: 'rain', name: 'Rain', icon: 'fa-solid fa-cloud-rain', svgIcon: 'rainy-6.svg', color: '#3a74ad' },
|
|
57
|
+
showers: { id: 'showers', name: 'Showers', icon: 'fa-solid fa-cloud-showers-heavy', svgIcon: 'rainy-7.svg', color: '#2c5d8c' },
|
|
58
|
+
thunderstorm: { id: 'thunderstorm', name: 'Thunderstorm', icon: 'fa-solid fa-bolt-lightning', svgIcon: 'thunder.svg', color: '#8834af' },
|
|
59
|
+
snow: { id: 'snow', name: 'Snow', icon: 'fa-solid fa-snowflake', svgIcon: 'snowy-6.svg', color: '#68a9cd' },
|
|
60
|
+
mist: { id: 'mist', name: 'Mist', icon: 'fa-solid fa-smog', svgIcon: 'cloudy.svg', color: '#94a3b8' },
|
|
61
|
+
};
|
|
62
|
+
function getWeatherCondition(id) {
|
|
63
|
+
const normalizedId = String(id).toLowerCase().replace(/\s+/g, '');
|
|
64
|
+
if (WEATHER_CONDITIONS[normalizedId]) {
|
|
65
|
+
return WEATHER_CONDITIONS[normalizedId];
|
|
66
|
+
}
|
|
67
|
+
if (normalizedId.includes('partly') && normalizedId.includes('cloud')) {
|
|
68
|
+
return WEATHER_CONDITIONS['partlyCloudy'];
|
|
69
|
+
}
|
|
70
|
+
if (normalizedId.includes('cloud')) {
|
|
71
|
+
return WEATHER_CONDITIONS['cloudy'];
|
|
72
|
+
}
|
|
73
|
+
if (normalizedId.includes('sun')) {
|
|
74
|
+
return WEATHER_CONDITIONS['sunny'];
|
|
75
|
+
}
|
|
76
|
+
if (normalizedId.includes('rain')) {
|
|
77
|
+
return WEATHER_CONDITIONS['rain'];
|
|
78
|
+
}
|
|
79
|
+
if (normalizedId.includes('snow')) {
|
|
80
|
+
return WEATHER_CONDITIONS['snow'];
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
id: 'unknown',
|
|
84
|
+
name: 'Unknown',
|
|
85
|
+
icon: 'fa-solid fa-question',
|
|
86
|
+
svgIcon: 'weather.svg',
|
|
87
|
+
color: '#999999',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function resolveWeatherConditionIcon(conditionId) {
|
|
91
|
+
return `assets/images/weather/${getWeatherCondition(conditionId).svgIcon}`;
|
|
92
|
+
}
|
|
93
|
+
function applyDayNightToCondition(conditionId, isDay) {
|
|
94
|
+
if (isDay) {
|
|
95
|
+
return conditionId;
|
|
96
|
+
}
|
|
97
|
+
if (conditionId === 'sunny') {
|
|
98
|
+
return 'clearNight';
|
|
99
|
+
}
|
|
100
|
+
if (conditionId === 'partlyCloudy') {
|
|
101
|
+
return 'partlyCloudyNight';
|
|
102
|
+
}
|
|
103
|
+
return conditionId;
|
|
104
|
+
}
|
|
105
|
+
function mapApiConditionToId(conditionText, isDay = true) {
|
|
106
|
+
const text = conditionText.toLowerCase();
|
|
107
|
+
let conditionId;
|
|
108
|
+
if (text.includes('sunny') || text.includes('clear')) {
|
|
109
|
+
conditionId = 'sunny';
|
|
110
|
+
}
|
|
111
|
+
else if (text === 'partly cloudy') {
|
|
112
|
+
conditionId = 'partlyCloudy';
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
conditionId = resolveBaseConditionId(text);
|
|
116
|
+
return applyDayNightToCondition(conditionId, isDay);
|
|
117
|
+
}
|
|
118
|
+
return applyDayNightToCondition(conditionId, isDay);
|
|
119
|
+
}
|
|
120
|
+
function resolveBaseConditionId(text) {
|
|
121
|
+
if (text.includes('sunny') || text.includes('clear')) {
|
|
122
|
+
return 'sunny';
|
|
123
|
+
}
|
|
124
|
+
if (text === 'partly cloudy') {
|
|
125
|
+
return 'partlyCloudy';
|
|
126
|
+
}
|
|
127
|
+
if (text.includes('cloudy') || text.includes('overcast')) {
|
|
128
|
+
return 'cloudy';
|
|
129
|
+
}
|
|
130
|
+
if (text.includes('rain') || text.includes('drizzle') || text.includes('shower')) {
|
|
131
|
+
return 'rain';
|
|
132
|
+
}
|
|
133
|
+
if (text.includes('thunder') || text.includes('lightning')) {
|
|
134
|
+
return 'thunderstorm';
|
|
135
|
+
}
|
|
136
|
+
if (text.includes('snow') || text.includes('sleet') || text.includes('blizzard')) {
|
|
137
|
+
return 'snow';
|
|
138
|
+
}
|
|
139
|
+
if (text.includes('mist') || text.includes('fog')) {
|
|
140
|
+
return 'mist';
|
|
141
|
+
}
|
|
142
|
+
return 'partlyCloudy';
|
|
143
|
+
}
|
|
144
|
+
function parseWeatherLocation(location) {
|
|
145
|
+
if (!location || location.trim() === '') {
|
|
146
|
+
return { city: 'New York', country: 'USA', display: 'New York' };
|
|
147
|
+
}
|
|
148
|
+
const city = location.trim();
|
|
149
|
+
return { city, country: '', display: city };
|
|
150
|
+
}
|
|
151
|
+
function formatWeatherLocationName(locationParts) {
|
|
152
|
+
return locationParts.city || 'Unknown Location';
|
|
153
|
+
}
|
|
154
|
+
//#endregion
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Generated bundle index. Do not edit.
|
|
158
|
+
*/
|
|
159
|
+
|
|
160
|
+
export { AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
161
|
+
//# sourceMappingURL=acorex-platform-extension-weather-core-client-contracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-weather-core-client-contracts.mjs","sources":["../../../../libs/extensions/weather/core/contracts/src/root-config.ts","../../../../libs/extensions/weather/core/contracts/src/query.keys.ts","../../../../libs/extensions/weather/core/contracts/src/settings.keys.ts","../../../../libs/extensions/weather/core/contracts/src/integration-domain.constants.ts","../../../../libs/extensions/weather/core/contracts/src/weather.types.ts","../../../../libs/extensions/weather/core/contracts/src/weather-provider.port.ts","../../../../libs/extensions/weather/core/contracts/src/weather-condition.util.ts","../../../../libs/extensions/weather/core/contracts/src/acorex-platform-extension-weather-core-client-contracts.ts"],"sourcesContent":["//#region ---- Weather extension root config ----\n\nconst config = {\n i18n: 'extensions-weather',\n};\n\nconst MODULE_NAME = 'WeatherExtension';\n\n/** Keep dashboard widget type ids for backward compatibility with existing dashboards. */\nconst dashboardWidgetId = (segment: string): string => `DashboardManagement:Widget:Dashboard:${segment}`;\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cloud-sun-rain',\n },\n widgets: {\n weather: dashboardWidgetId('Weather'),\n },\n};\n\n//#endregion\n","//#region ---- Weather query keys ----\n\nexport const AXEWeatherQueryKeys = {\n GetForecast: 'WeatherExtension:Weather:GetForecast',\n} as const;\n\n//#endregion\n","//#region ---- Weather extension settings ----\n\nexport enum AXEWeatherSettingKeys {\n ActiveProvider = 'WeatherExtension:Setting:ActiveProvider',\n}\n\nexport const WEATHER_PROVIDER_IDS = {\n WeatherApi: 'weatherapi',\n OpenWeatherMap: 'openweathermap',\n} as const;\n\nexport type WeatherProviderId = (typeof WEATHER_PROVIDER_IDS)[keyof typeof WEATHER_PROVIDER_IDS];\n\n//#endregion\n","//#region ---- Weather integration domain ----\n\nexport const AXE_WEATHER_DOMAIN_ID = 'weather';\n\n//#endregion\n","//#region ---- Weather data types ----\n\nexport interface AXPWeatherLocation {\n city: string;\n country: string;\n displayName: string;\n}\n\nexport interface AXPWeatherCondition {\n condition: string;\n conditionCode: number;\n iconUrl: string;\n tempC: number;\n tempF: number;\n feelsLikeC: number;\n feelsLikeF: number;\n humidity: number;\n windKph: number;\n windMph: number;\n windDirection: string;\n uv: number;\n /** Whether it is daytime at the weather location (from provider). */\n isDay: boolean;\n lastUpdated: string;\n}\n\nexport interface AXPWeatherHour {\n time: string;\n condition: string;\n iconUrl: string;\n tempC: number;\n tempF: number;\n isDay?: boolean;\n}\n\nexport interface AXPWeatherForecastDay {\n date: string;\n day: string;\n condition: string;\n iconUrl: string;\n maxTempC: number;\n maxTempF: number;\n minTempC: number;\n minTempF: number;\n hour: AXPWeatherHour[];\n}\n\nexport interface AXPWeatherData {\n location: AXPWeatherLocation;\n current: AXPWeatherCondition;\n forecast: AXPWeatherForecastDay[];\n}\n\nexport interface AXPWeatherRequestOptions {\n tempUnit?: string;\n location?: string;\n}\n\nexport interface AXPWeatherForecastRequest extends AXPWeatherRequestOptions {\n days?: number;\n}\n\nexport interface AXPWeatherConditionDisplay {\n id: string;\n name: string;\n icon: string;\n svgIcon: string;\n color: string;\n}\n\n//#endregion\n","import type { AXPWeatherData, AXPWeatherForecastRequest } from './weather.types';\n\n//#region ---- Server weather provider port ----\n\nexport const WEATHER_PROVIDER = Symbol('WEATHER_PROVIDER');\n\nexport interface WeatherProviderPort {\n readonly id: string;\n getWeather(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n getForecast(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n}\n\n//#endregion\n","import type { AXPWeatherConditionDisplay } from './weather.types';\n\n//#region ---- Weather condition catalog ----\n\nconst WEATHER_CONDITIONS: Record<string, AXPWeatherConditionDisplay> = {\n sunny: { id: 'sunny', name: 'Sunny', icon: 'fa-solid fa-sun', svgIcon: 'day.svg', color: '#ff9d00' },\n clearNight: { id: 'clearNight', name: 'Clear Night', icon: 'fa-solid fa-moon', svgIcon: 'night.svg', color: '#5d639e' },\n partlyCloudy: { id: 'partlyCloudy', name: 'Partly Cloudy', icon: 'fa-solid fa-cloud-sun', svgIcon: 'cloudy-day-3.svg', color: '#6ba4e8' },\n partlyCloudyNight: { id: 'partlyCloudyNight', name: 'Partly Cloudy Night', icon: 'fa-solid fa-cloud-moon', svgIcon: 'cloudy-night-3.svg', color: '#5d639e' },\n cloudy: { id: 'cloudy', name: 'Cloudy', icon: 'fa-solid fa-cloud', svgIcon: 'cloudy.svg', color: '#72869d' },\n rain: { id: 'rain', name: 'Rain', icon: 'fa-solid fa-cloud-rain', svgIcon: 'rainy-6.svg', color: '#3a74ad' },\n showers: { id: 'showers', name: 'Showers', icon: 'fa-solid fa-cloud-showers-heavy', svgIcon: 'rainy-7.svg', color: '#2c5d8c' },\n thunderstorm: { id: 'thunderstorm', name: 'Thunderstorm', icon: 'fa-solid fa-bolt-lightning', svgIcon: 'thunder.svg', color: '#8834af' },\n snow: { id: 'snow', name: 'Snow', icon: 'fa-solid fa-snowflake', svgIcon: 'snowy-6.svg', color: '#68a9cd' },\n mist: { id: 'mist', name: 'Mist', icon: 'fa-solid fa-smog', svgIcon: 'cloudy.svg', color: '#94a3b8' },\n};\n\nexport function getWeatherCondition(id: string): AXPWeatherConditionDisplay {\n const normalizedId = String(id).toLowerCase().replace(/\\s+/g, '');\n\n if (WEATHER_CONDITIONS[normalizedId]) {\n return WEATHER_CONDITIONS[normalizedId];\n }\n\n if (normalizedId.includes('partly') && normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['partlyCloudy'];\n }\n if (normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['cloudy'];\n }\n if (normalizedId.includes('sun')) {\n return WEATHER_CONDITIONS['sunny'];\n }\n if (normalizedId.includes('rain')) {\n return WEATHER_CONDITIONS['rain'];\n }\n if (normalizedId.includes('snow')) {\n return WEATHER_CONDITIONS['snow'];\n }\n\n return {\n id: 'unknown',\n name: 'Unknown',\n icon: 'fa-solid fa-question',\n svgIcon: 'weather.svg',\n color: '#999999',\n };\n}\n\nexport function resolveWeatherConditionIcon(conditionId: string): string {\n return `assets/images/weather/${getWeatherCondition(conditionId).svgIcon}`;\n}\n\nexport function applyDayNightToCondition(conditionId: string, isDay: boolean): string {\n if (isDay) {\n return conditionId;\n }\n\n if (conditionId === 'sunny') {\n return 'clearNight';\n }\n\n if (conditionId === 'partlyCloudy') {\n return 'partlyCloudyNight';\n }\n\n return conditionId;\n}\n\nexport function mapApiConditionToId(conditionText: string, isDay = true): string {\n const text = conditionText.toLowerCase();\n let conditionId: string;\n\n if (text.includes('sunny') || text.includes('clear')) {\n conditionId = 'sunny';\n } else if (text === 'partly cloudy') {\n conditionId = 'partlyCloudy';\n } else {\n conditionId = resolveBaseConditionId(text);\n return applyDayNightToCondition(conditionId, isDay);\n }\n\n return applyDayNightToCondition(conditionId, isDay);\n}\n\nfunction resolveBaseConditionId(text: string): string {\n if (text.includes('sunny') || text.includes('clear')) {\n return 'sunny';\n }\n if (text === 'partly cloudy') {\n return 'partlyCloudy';\n }\n if (text.includes('cloudy') || text.includes('overcast')) {\n return 'cloudy';\n }\n if (text.includes('rain') || text.includes('drizzle') || text.includes('shower')) {\n return 'rain';\n }\n if (text.includes('thunder') || text.includes('lightning')) {\n return 'thunderstorm';\n }\n if (text.includes('snow') || text.includes('sleet') || text.includes('blizzard')) {\n return 'snow';\n }\n if (text.includes('mist') || text.includes('fog')) {\n return 'mist';\n }\n\n return 'partlyCloudy';\n}\n\nexport function parseWeatherLocation(location: string): { city: string; country: string; display: string } {\n if (!location || location.trim() === '') {\n return { city: 'New York', country: 'USA', display: 'New York' };\n }\n\n const city = location.trim();\n return { city, country: '', display: city };\n}\n\nexport function formatWeatherLocationName(locationParts: { city: string; country: string; display: string }): string {\n return locationParts.city || 'Unknown Location';\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|