@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.
@@ -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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"}