@vm0/cli 9.247.0 → 9.248.1
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/{agent-YLCZG4ST.js → agent-2NW7BBLH.js} +5 -5
- package/{banking-A4VPNAGY.js → banking-WMZ5X4TD.js} +3 -3
- package/{chat-C6P67WYO.js → chat-Z32JJCZG.js} +4 -4
- package/{chunk-KBKTQLGX.js → chunk-2IFOM533.js} +2 -2
- package/{chunk-JREZPGL7.js → chunk-D42LBTMI.js} +20 -12
- package/chunk-D42LBTMI.js.map +1 -0
- package/{chunk-TM2JASGG.js → chunk-DXYKZPHD.js} +6 -2
- package/{chunk-TM2JASGG.js.map → chunk-DXYKZPHD.js.map} +1 -1
- package/{chunk-VTVYDURY.js → chunk-HJMAS7QI.js} +4 -4
- package/{chunk-FYZS5VEA.js → chunk-KU5PTS4H.js} +279 -54
- package/chunk-KU5PTS4H.js.map +1 -0
- package/{chunk-HFXL5AVL.js → chunk-N677KKA5.js} +2 -2
- package/{chunk-HYRTW4LY.js → chunk-XMCVK5OU.js} +2 -2
- package/{chunk-LA4I64KW.js → chunk-Y7PXYM7M.js} +2 -2
- package/{computer-use-HZLNEZ2I.js → computer-use-Z5YA5PCS.js} +3 -3
- package/{connector-6LDMVILB.js → connector-GILJG3H2.js} +6 -6
- package/{credit-E4DPMKBT.js → credit-SHY372FA.js} +4 -4
- package/{developer-support-E3FEFRY2.js → developer-support-OPEG7JPP.js} +3 -3
- package/{doctor-ILWD6C2K.js → doctor-QVVF5PHS.js} +3 -3
- package/feishu-FKRRGMT2.js +118 -0
- package/feishu-FKRRGMT2.js.map +1 -0
- package/finance-LDOX64UG.js +127 -0
- package/finance-LDOX64UG.js.map +1 -0
- package/{generate-N6R5TZZ2.js → generate-CIXTADDH.js} +4 -4
- package/{github-VDCFYJIH.js → github-27EGMZM4.js} +3 -3
- package/{goal-DQCWM4I3.js → goal-MTTP4FTD.js} +3 -3
- package/{host-7CN3NZRQ.js → host-5ACQBWFC.js} +3 -3
- package/{logs-52MLVLCY.js → logs-WME2HGIQ.js} +4 -4
- package/{mail-MEI2ARFN.js → mail-BYRRYI5S.js} +5 -5
- package/{maps-HOSDZCTR.js → maps-P7V44O5J.js} +3 -3
- package/{model-YPG2ESDH.js → model-THRT7DHX.js} +4 -4
- package/{model-provider-CRSYVHTZ.js → model-provider-HQ2SXXG7.js} +4 -4
- package/{org-QAEZNHHR.js → org-H742KQAG.js} +3 -3
- package/package.json +1 -1
- package/{phone-KBACVWG7.js → phone-ZLDFGYV5.js} +3 -3
- package/{preference-CZ5T4ZH6.js → preference-MGBOHLDQ.js} +3 -3
- package/{resource-6O5NRYUA.js → resource-FGZYT5IL.js} +3 -3
- package/{scrape-XTWF7NE4.js → scrape-NCPUXX2W.js} +3 -3
- package/{search-OI5PNIX3.js → search-TOPTC26C.js} +4 -4
- package/{secret-S6Z5NHSK.js → secret-P3BJRVBS.js} +3 -3
- package/{slack-RTT7D47V.js → slack-FKK6PVKS.js} +3 -3
- package/{teams-WS6I3ZMV.js → teams-IIXV5XX6.js} +3 -3
- package/{telegram-Q2GNTJFX.js → telegram-RMSYD7AV.js} +3 -3
- package/{variable-4WVPWYYU.js → variable-S6I4UDAO.js} +3 -3
- package/{video-B3UGIF3E.js → video-HADRKBLP.js} +2 -2
- package/weather-L7QYR5VW.js +590 -0
- package/weather-L7QYR5VW.js.map +1 -0
- package/{web-3RIJORTL.js → web-FODYCSCR.js} +3 -3
- package/{web-search-CVZYQ7HH.js → web-search-55SSMXC7.js} +3 -3
- package/{whoami-U2VXOZNF.js → whoami-DT3WNKYG.js} +5 -5
- package/{workflow-OTBS5W7K.js → workflow-H2IAFAGI.js} +3 -3
- package/zero.js +55 -37
- package/zero.js.map +1 -1
- package/chunk-FYZS5VEA.js.map +0 -1
- package/chunk-JREZPGL7.js.map +0 -1
- package/weather-JLYOYLJR.js +0 -216
- package/weather-JLYOYLJR.js.map +0 -1
- /package/{agent-YLCZG4ST.js.map → agent-2NW7BBLH.js.map} +0 -0
- /package/{banking-A4VPNAGY.js.map → banking-WMZ5X4TD.js.map} +0 -0
- /package/{chat-C6P67WYO.js.map → chat-Z32JJCZG.js.map} +0 -0
- /package/{chunk-KBKTQLGX.js.map → chunk-2IFOM533.js.map} +0 -0
- /package/{chunk-VTVYDURY.js.map → chunk-HJMAS7QI.js.map} +0 -0
- /package/{chunk-HFXL5AVL.js.map → chunk-N677KKA5.js.map} +0 -0
- /package/{chunk-HYRTW4LY.js.map → chunk-XMCVK5OU.js.map} +0 -0
- /package/{chunk-LA4I64KW.js.map → chunk-Y7PXYM7M.js.map} +0 -0
- /package/{computer-use-HZLNEZ2I.js.map → computer-use-Z5YA5PCS.js.map} +0 -0
- /package/{connector-6LDMVILB.js.map → connector-GILJG3H2.js.map} +0 -0
- /package/{credit-E4DPMKBT.js.map → credit-SHY372FA.js.map} +0 -0
- /package/{developer-support-E3FEFRY2.js.map → developer-support-OPEG7JPP.js.map} +0 -0
- /package/{doctor-ILWD6C2K.js.map → doctor-QVVF5PHS.js.map} +0 -0
- /package/{generate-N6R5TZZ2.js.map → generate-CIXTADDH.js.map} +0 -0
- /package/{github-VDCFYJIH.js.map → github-27EGMZM4.js.map} +0 -0
- /package/{goal-DQCWM4I3.js.map → goal-MTTP4FTD.js.map} +0 -0
- /package/{host-7CN3NZRQ.js.map → host-5ACQBWFC.js.map} +0 -0
- /package/{logs-52MLVLCY.js.map → logs-WME2HGIQ.js.map} +0 -0
- /package/{mail-MEI2ARFN.js.map → mail-BYRRYI5S.js.map} +0 -0
- /package/{maps-HOSDZCTR.js.map → maps-P7V44O5J.js.map} +0 -0
- /package/{model-YPG2ESDH.js.map → model-THRT7DHX.js.map} +0 -0
- /package/{model-provider-CRSYVHTZ.js.map → model-provider-HQ2SXXG7.js.map} +0 -0
- /package/{org-QAEZNHHR.js.map → org-H742KQAG.js.map} +0 -0
- /package/{phone-KBACVWG7.js.map → phone-ZLDFGYV5.js.map} +0 -0
- /package/{preference-CZ5T4ZH6.js.map → preference-MGBOHLDQ.js.map} +0 -0
- /package/{resource-6O5NRYUA.js.map → resource-FGZYT5IL.js.map} +0 -0
- /package/{scrape-XTWF7NE4.js.map → scrape-NCPUXX2W.js.map} +0 -0
- /package/{search-OI5PNIX3.js.map → search-TOPTC26C.js.map} +0 -0
- /package/{secret-S6Z5NHSK.js.map → secret-P3BJRVBS.js.map} +0 -0
- /package/{slack-RTT7D47V.js.map → slack-FKK6PVKS.js.map} +0 -0
- /package/{teams-WS6I3ZMV.js.map → teams-IIXV5XX6.js.map} +0 -0
- /package/{telegram-Q2GNTJFX.js.map → telegram-RMSYD7AV.js.map} +0 -0
- /package/{variable-4WVPWYYU.js.map → variable-S6I4UDAO.js.map} +0 -0
- /package/{video-B3UGIF3E.js.map → video-HADRKBLP.js.map} +0 -0
- /package/{web-3RIJORTL.js.map → web-FODYCSCR.js.map} +0 -0
- /package/{web-search-CVZYQ7HH.js.map → web-search-55SSMXC7.js.map} +0 -0
- /package/{whoami-U2VXOZNF.js.map → whoami-DT3WNKYG.js.map} +0 -0
- /package/{workflow-OTBS5W7K.js.map → workflow-H2IAFAGI.js.map} +0 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __createRequire } from "node:module";
|
|
3
|
+
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
callZeroWeather
|
|
6
|
+
} from "./chunk-KU5PTS4H.js";
|
|
7
|
+
import "./chunk-LTDQISD7.js";
|
|
8
|
+
import {
|
|
9
|
+
source_default,
|
|
10
|
+
withErrorHandler
|
|
11
|
+
} from "./chunk-XMCVK5OU.js";
|
|
12
|
+
import "./chunk-LRHXR7JT.js";
|
|
13
|
+
import {
|
|
14
|
+
Command,
|
|
15
|
+
InvalidArgumentError
|
|
16
|
+
} from "./chunk-B3W2RUBP.js";
|
|
17
|
+
import {
|
|
18
|
+
init_esm_shims
|
|
19
|
+
} from "./chunk-DIRAZ3YX.js";
|
|
20
|
+
|
|
21
|
+
// src/commands/zero/weather/index.ts
|
|
22
|
+
init_esm_shims();
|
|
23
|
+
var WEATHER_UNITS = ["metric", "imperial"];
|
|
24
|
+
var WEATHER_LANGUAGE_CODE = "en";
|
|
25
|
+
function parseLatitude(value) {
|
|
26
|
+
const latitude = Number(value);
|
|
27
|
+
if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {
|
|
28
|
+
throw new InvalidArgumentError("latitude must be a number from -90 to 90");
|
|
29
|
+
}
|
|
30
|
+
return latitude;
|
|
31
|
+
}
|
|
32
|
+
function parseLongitude(value) {
|
|
33
|
+
const longitude = Number(value);
|
|
34
|
+
if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {
|
|
35
|
+
throw new InvalidArgumentError(
|
|
36
|
+
"longitude must be a number from -180 to 180"
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return longitude;
|
|
40
|
+
}
|
|
41
|
+
function parseIntegerInRange(value, min, max) {
|
|
42
|
+
const parsed = Number(value);
|
|
43
|
+
if (!Number.isInteger(parsed) || parsed < min || parsed > max) {
|
|
44
|
+
throw new InvalidArgumentError(
|
|
45
|
+
`value must be an integer from ${min} to ${max}`
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return parsed;
|
|
49
|
+
}
|
|
50
|
+
function parseWeatherUnits(value) {
|
|
51
|
+
if (WEATHER_UNITS.includes(value)) {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
throw new InvalidArgumentError(
|
|
55
|
+
`units must be one of: ${WEATHER_UNITS.join(", ")}`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
function coordinatePayload(options) {
|
|
59
|
+
return {
|
|
60
|
+
lat: options.lat,
|
|
61
|
+
lng: options.lng,
|
|
62
|
+
languageCode: WEATHER_LANGUAGE_CODE
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function locationPayload(options) {
|
|
66
|
+
return {
|
|
67
|
+
...coordinatePayload(options),
|
|
68
|
+
units: options.units
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function pagedPayload(options) {
|
|
72
|
+
return {
|
|
73
|
+
...locationPayload(options),
|
|
74
|
+
pageSize: options.pageSize,
|
|
75
|
+
pageToken: options.pageToken
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function isRecord(value) {
|
|
79
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
80
|
+
}
|
|
81
|
+
function recordField(value, key) {
|
|
82
|
+
if (!isRecord(value)) {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
const field = value[key];
|
|
86
|
+
return isRecord(field) ? field : void 0;
|
|
87
|
+
}
|
|
88
|
+
function arrayField(value, key) {
|
|
89
|
+
if (!isRecord(value)) {
|
|
90
|
+
return void 0;
|
|
91
|
+
}
|
|
92
|
+
const field = value[key];
|
|
93
|
+
return Array.isArray(field) ? field : void 0;
|
|
94
|
+
}
|
|
95
|
+
function stringField(value, key) {
|
|
96
|
+
if (!isRecord(value)) {
|
|
97
|
+
return void 0;
|
|
98
|
+
}
|
|
99
|
+
const field = value[key];
|
|
100
|
+
return typeof field === "string" ? field : void 0;
|
|
101
|
+
}
|
|
102
|
+
function numberField(value, key) {
|
|
103
|
+
if (!isRecord(value)) {
|
|
104
|
+
return void 0;
|
|
105
|
+
}
|
|
106
|
+
const field = value[key];
|
|
107
|
+
return typeof field === "number" && Number.isFinite(field) ? field : void 0;
|
|
108
|
+
}
|
|
109
|
+
function formatNumber(value) {
|
|
110
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(1).replace(/\.0$/, "");
|
|
111
|
+
}
|
|
112
|
+
function formatTemperature(value) {
|
|
113
|
+
const degrees = numberField(value, "degrees");
|
|
114
|
+
if (degrees === void 0) {
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
const unit = stringField(value, "unit");
|
|
118
|
+
const suffix = unit === "FAHRENHEIT" ? "\xB0F" : "\xB0C";
|
|
119
|
+
return `${formatNumber(degrees)}${suffix}`;
|
|
120
|
+
}
|
|
121
|
+
function temperatureSuffix(value) {
|
|
122
|
+
return stringField(value, "unit") === "FAHRENHEIT" ? "\xB0F" : "\xB0C";
|
|
123
|
+
}
|
|
124
|
+
function formatTemperatureRange(minimum, maximum) {
|
|
125
|
+
const minimumText = formatTemperature(minimum);
|
|
126
|
+
const maximumText = formatTemperature(maximum);
|
|
127
|
+
const minimumDegrees = numberField(minimum, "degrees");
|
|
128
|
+
const maximumDegrees = numberField(maximum, "degrees");
|
|
129
|
+
if (minimumDegrees !== void 0 && maximumDegrees !== void 0 && temperatureSuffix(minimum) === temperatureSuffix(maximum)) {
|
|
130
|
+
return `${formatNumber(minimumDegrees)}\u2013${formatNumber(maximumDegrees)}${temperatureSuffix(minimum)}`;
|
|
131
|
+
}
|
|
132
|
+
if (minimumText && maximumText) {
|
|
133
|
+
return `${minimumText}\u2013${maximumText}`;
|
|
134
|
+
}
|
|
135
|
+
return minimumText ?? maximumText;
|
|
136
|
+
}
|
|
137
|
+
function formatCardinalDirection(value) {
|
|
138
|
+
if (!value) {
|
|
139
|
+
return void 0;
|
|
140
|
+
}
|
|
141
|
+
const abbreviations = {
|
|
142
|
+
NORTH: "N",
|
|
143
|
+
NORTHEAST: "NE",
|
|
144
|
+
EAST: "E",
|
|
145
|
+
SOUTHEAST: "SE",
|
|
146
|
+
SOUTH: "S",
|
|
147
|
+
SOUTHWEST: "SW",
|
|
148
|
+
WEST: "W",
|
|
149
|
+
NORTHWEST: "NW"
|
|
150
|
+
};
|
|
151
|
+
return value.split("_").map((part) => {
|
|
152
|
+
return abbreviations[part] ?? part;
|
|
153
|
+
}).join("");
|
|
154
|
+
}
|
|
155
|
+
function formatSpeed(value) {
|
|
156
|
+
const speed = numberField(value, "value");
|
|
157
|
+
if (speed === void 0) {
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
const unit = stringField(value, "unit");
|
|
161
|
+
const suffix = unit === "MILES_PER_HOUR" ? "mph" : unit === "METERS_PER_SECOND" ? "m/s" : "km/h";
|
|
162
|
+
return `${formatNumber(speed)} ${suffix}`;
|
|
163
|
+
}
|
|
164
|
+
function formatWind(value) {
|
|
165
|
+
const direction = formatCardinalDirection(
|
|
166
|
+
stringField(recordField(value, "direction"), "cardinal")
|
|
167
|
+
);
|
|
168
|
+
const speed = formatSpeed(recordField(value, "speed"));
|
|
169
|
+
const gust = formatSpeed(recordField(value, "gust"));
|
|
170
|
+
const primary = [direction, speed].filter(Boolean).join(" ");
|
|
171
|
+
if (!primary && !gust) {
|
|
172
|
+
return void 0;
|
|
173
|
+
}
|
|
174
|
+
if (!gust) {
|
|
175
|
+
return primary || void 0;
|
|
176
|
+
}
|
|
177
|
+
return `${primary || "Wind"}, gusts ${gust}`;
|
|
178
|
+
}
|
|
179
|
+
function formatCondition(value) {
|
|
180
|
+
const description = recordField(value, "description");
|
|
181
|
+
return stringField(description, "text") ?? stringField(value, "text");
|
|
182
|
+
}
|
|
183
|
+
function formatProbability(value) {
|
|
184
|
+
const percent = numberField(recordField(value, "probability"), "percent");
|
|
185
|
+
return percent === void 0 ? void 0 : `${formatNumber(percent)}%`;
|
|
186
|
+
}
|
|
187
|
+
function formatQuantity(value) {
|
|
188
|
+
const quantity = numberField(value, "quantity");
|
|
189
|
+
if (quantity === void 0 || quantity === 0) {
|
|
190
|
+
return void 0;
|
|
191
|
+
}
|
|
192
|
+
const unit = stringField(value, "unit");
|
|
193
|
+
return `${formatNumber(quantity)} ${unit === "MILLIMETERS" ? "mm" : unit ?? "units"}`;
|
|
194
|
+
}
|
|
195
|
+
function formatTimeZone(value) {
|
|
196
|
+
return typeof value === "string" ? value : stringField(value, "id");
|
|
197
|
+
}
|
|
198
|
+
function formatDisplayDate(value) {
|
|
199
|
+
const year = numberField(value, "year");
|
|
200
|
+
const month = numberField(value, "month");
|
|
201
|
+
const day = numberField(value, "day");
|
|
202
|
+
if (year === void 0 || month === void 0 || day === void 0) {
|
|
203
|
+
return void 0;
|
|
204
|
+
}
|
|
205
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
206
|
+
timeZone: "UTC",
|
|
207
|
+
weekday: "short",
|
|
208
|
+
month: "short",
|
|
209
|
+
day: "numeric"
|
|
210
|
+
}).format(new Date(Date.UTC(year, month - 1, day, 12)));
|
|
211
|
+
}
|
|
212
|
+
function formatDateTime(value, timeZone) {
|
|
213
|
+
if (typeof value === "string") {
|
|
214
|
+
const date2 = new Date(value);
|
|
215
|
+
if (Number.isNaN(date2.getTime())) {
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
219
|
+
timeZone,
|
|
220
|
+
month: "short",
|
|
221
|
+
day: "numeric",
|
|
222
|
+
hour: "numeric",
|
|
223
|
+
minute: "2-digit"
|
|
224
|
+
}).format(date2);
|
|
225
|
+
}
|
|
226
|
+
const year = numberField(value, "year");
|
|
227
|
+
const month = numberField(value, "month");
|
|
228
|
+
const day = numberField(value, "day");
|
|
229
|
+
if (year === void 0 || month === void 0 || day === void 0) {
|
|
230
|
+
return void 0;
|
|
231
|
+
}
|
|
232
|
+
const hour = numberField(value, "hours") ?? numberField(value, "hour") ?? 0;
|
|
233
|
+
const minute = numberField(value, "minutes") ?? numberField(value, "minute") ?? 0;
|
|
234
|
+
const date = new Date(Date.UTC(year, month - 1, day, hour, minute));
|
|
235
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
236
|
+
timeZone: "UTC",
|
|
237
|
+
month: "short",
|
|
238
|
+
day: "numeric",
|
|
239
|
+
hour: "numeric",
|
|
240
|
+
minute: "2-digit"
|
|
241
|
+
}).format(date);
|
|
242
|
+
}
|
|
243
|
+
function formatLocalTime(value, timeZone) {
|
|
244
|
+
if (typeof value !== "string") {
|
|
245
|
+
return void 0;
|
|
246
|
+
}
|
|
247
|
+
const date = new Date(value);
|
|
248
|
+
if (Number.isNaN(date.getTime())) {
|
|
249
|
+
return value;
|
|
250
|
+
}
|
|
251
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
252
|
+
timeZone,
|
|
253
|
+
hour: "numeric",
|
|
254
|
+
minute: "2-digit"
|
|
255
|
+
}).format(date);
|
|
256
|
+
}
|
|
257
|
+
function renderSource(response) {
|
|
258
|
+
if (response.attribution) {
|
|
259
|
+
console.log(source_default.dim(response.attribution));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function renderCurrentConditions(result) {
|
|
263
|
+
const timeZone = formatTimeZone(result.timeZone);
|
|
264
|
+
console.log(`Current conditions${timeZone ? ` \xB7 ${timeZone}` : ""}`);
|
|
265
|
+
const condition = formatCondition(result.weatherCondition);
|
|
266
|
+
const temperature = formatTemperature(result.temperature);
|
|
267
|
+
const feelsLike = formatTemperature(result.feelsLikeTemperature);
|
|
268
|
+
const currentTime = formatDateTime(result.currentTime, timeZone);
|
|
269
|
+
if (condition || temperature || feelsLike) {
|
|
270
|
+
console.log(
|
|
271
|
+
` ${[
|
|
272
|
+
condition,
|
|
273
|
+
temperature,
|
|
274
|
+
feelsLike ? `feels like ${feelsLike}` : void 0
|
|
275
|
+
].filter(Boolean).join(" \xB7 ")}`
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
const details = [
|
|
279
|
+
formatWind(result.wind),
|
|
280
|
+
numberField(result, "relativeHumidity") !== void 0 ? `humidity ${formatNumber(numberField(result, "relativeHumidity") ?? 0)}%` : void 0,
|
|
281
|
+
numberField(result, "uvIndex") !== void 0 ? `UV ${formatNumber(numberField(result, "uvIndex") ?? 0)}` : void 0,
|
|
282
|
+
formatProbability(result.precipitation) ? `rain ${formatProbability(result.precipitation)}` : void 0
|
|
283
|
+
].filter(Boolean);
|
|
284
|
+
if (details.length > 0) {
|
|
285
|
+
console.log(` ${details.join(" \xB7 ")}`);
|
|
286
|
+
}
|
|
287
|
+
if (currentTime) {
|
|
288
|
+
console.log(source_default.dim(` Updated ${currentTime}`));
|
|
289
|
+
}
|
|
290
|
+
return Boolean(condition || temperature || feelsLike || details.length > 0);
|
|
291
|
+
}
|
|
292
|
+
function compactStrings(values) {
|
|
293
|
+
return values.filter((value) => {
|
|
294
|
+
return value !== void 0;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
function formatLabeledTemperatureRange(label, minimum, maximum) {
|
|
298
|
+
const range = formatTemperatureRange(minimum, maximum);
|
|
299
|
+
return range ? `${label}${range}` : void 0;
|
|
300
|
+
}
|
|
301
|
+
function formatDailyRainProbability(daytime, nighttime) {
|
|
302
|
+
const daytimeProbability = formatProbability(daytime?.precipitation);
|
|
303
|
+
if (!daytimeProbability) {
|
|
304
|
+
return void 0;
|
|
305
|
+
}
|
|
306
|
+
const nighttimeProbability = formatProbability(nighttime?.precipitation);
|
|
307
|
+
return `rain ${daytimeProbability}${nighttimeProbability ? ` (night ${nighttimeProbability})` : ""}`;
|
|
308
|
+
}
|
|
309
|
+
function formatLabeledNumber(label, value, key, onlyWhenPositive = false) {
|
|
310
|
+
const number = numberField(value, key);
|
|
311
|
+
if (number === void 0 || onlyWhenPositive && number <= 0) {
|
|
312
|
+
return void 0;
|
|
313
|
+
}
|
|
314
|
+
return `${label} ${formatNumber(number)}${label === "UV" ? "" : "%"}`;
|
|
315
|
+
}
|
|
316
|
+
function formatLabeledQuantity(label, value) {
|
|
317
|
+
const quantity = formatQuantity(value);
|
|
318
|
+
return quantity ? `${label} ${quantity}` : void 0;
|
|
319
|
+
}
|
|
320
|
+
function renderDailyForecastDay(forecastDay, timeZone) {
|
|
321
|
+
const day = isRecord(forecastDay) ? forecastDay : {};
|
|
322
|
+
const daytime = recordField(day, "daytimeForecast");
|
|
323
|
+
const nighttime = recordField(day, "nighttimeForecast");
|
|
324
|
+
const date = formatDisplayDate(day.displayDate) ?? "Forecast day";
|
|
325
|
+
console.log(source_default.bold(` ${date}`));
|
|
326
|
+
const nighttimeCondition = formatCondition(
|
|
327
|
+
recordField(nighttime, "weatherCondition")
|
|
328
|
+
);
|
|
329
|
+
const conditions = compactStrings([
|
|
330
|
+
formatCondition(recordField(daytime, "weatherCondition")),
|
|
331
|
+
nighttimeCondition ? `${nighttimeCondition} overnight` : void 0
|
|
332
|
+
]);
|
|
333
|
+
if (conditions.length > 0) {
|
|
334
|
+
console.log(` ${conditions.join(" \xB7 ")}`);
|
|
335
|
+
}
|
|
336
|
+
const details = compactStrings([
|
|
337
|
+
formatTemperatureRange(day.minTemperature, day.maxTemperature),
|
|
338
|
+
formatLabeledTemperatureRange(
|
|
339
|
+
"feels like ",
|
|
340
|
+
day.feelsLikeMinTemperature,
|
|
341
|
+
day.feelsLikeMaxTemperature
|
|
342
|
+
),
|
|
343
|
+
formatDailyRainProbability(daytime, nighttime),
|
|
344
|
+
formatWind(daytime?.wind) ?? formatWind(nighttime?.wind),
|
|
345
|
+
formatLabeledNumber("UV", daytime, "uvIndex"),
|
|
346
|
+
formatLabeledNumber(
|
|
347
|
+
"thunderstorms",
|
|
348
|
+
daytime,
|
|
349
|
+
"thunderstormProbability",
|
|
350
|
+
true
|
|
351
|
+
),
|
|
352
|
+
formatLabeledQuantity(
|
|
353
|
+
"snow",
|
|
354
|
+
recordField(daytime?.precipitation, "snowQpf")
|
|
355
|
+
),
|
|
356
|
+
formatLabeledQuantity("ice", recordField(daytime, "iceThickness"))
|
|
357
|
+
]);
|
|
358
|
+
if (details.length > 0) {
|
|
359
|
+
console.log(` ${details.join(" \xB7 ")}`);
|
|
360
|
+
}
|
|
361
|
+
const sunEvents = recordField(day, "sunEvents");
|
|
362
|
+
const sunrise = formatLocalTime(
|
|
363
|
+
stringField(sunEvents, "sunriseTime"),
|
|
364
|
+
timeZone
|
|
365
|
+
);
|
|
366
|
+
const sunset = formatLocalTime(
|
|
367
|
+
stringField(sunEvents, "sunsetTime"),
|
|
368
|
+
timeZone
|
|
369
|
+
);
|
|
370
|
+
const sunDetails = compactStrings([
|
|
371
|
+
sunrise ? `Sunrise ${sunrise}` : void 0,
|
|
372
|
+
sunset ? `Sunset ${sunset}` : void 0
|
|
373
|
+
]);
|
|
374
|
+
if (sunDetails.length > 0) {
|
|
375
|
+
console.log(source_default.dim(` ${sunDetails.join(" \xB7 ")}`));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function renderDailyForecast(result) {
|
|
379
|
+
const forecastDays = arrayField(result, "forecastDays");
|
|
380
|
+
if (!forecastDays) {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
const timeZone = formatTimeZone(result.timeZone);
|
|
384
|
+
console.log(`Daily forecast${timeZone ? ` \xB7 ${timeZone}` : ""}`);
|
|
385
|
+
if (forecastDays.length === 0) {
|
|
386
|
+
console.log(source_default.dim(" No daily forecast data returned."));
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
for (const forecastDay of forecastDays) {
|
|
390
|
+
renderDailyForecastDay(forecastDay, timeZone);
|
|
391
|
+
}
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
function renderHourlyForecast(result, key, title) {
|
|
395
|
+
const hours = arrayField(result, key);
|
|
396
|
+
if (!hours) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
const timeZone = formatTimeZone(result.timeZone);
|
|
400
|
+
console.log(`${title}${timeZone ? ` \xB7 ${timeZone}` : ""}`);
|
|
401
|
+
if (hours.length === 0) {
|
|
402
|
+
console.log(
|
|
403
|
+
source_default.dim(
|
|
404
|
+
` No ${key === "forecastHours" ? "forecast" : "history"} data returned.`
|
|
405
|
+
)
|
|
406
|
+
);
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
for (const hour of hours) {
|
|
410
|
+
const interval = recordField(hour, "interval");
|
|
411
|
+
const timestamp = (isRecord(hour) ? hour.displayDateTime : void 0) ?? stringField(interval, "startTime");
|
|
412
|
+
const dateTime = formatDateTime(timestamp, timeZone) ?? "Unknown time";
|
|
413
|
+
const details = [
|
|
414
|
+
dateTime,
|
|
415
|
+
formatCondition(recordField(hour, "weatherCondition")),
|
|
416
|
+
formatTemperature(recordField(hour, "temperature")),
|
|
417
|
+
formatProbability(recordField(hour, "precipitation")) ? `rain ${formatProbability(recordField(hour, "precipitation"))}` : void 0,
|
|
418
|
+
formatWind(recordField(hour, "wind"))
|
|
419
|
+
].filter(Boolean);
|
|
420
|
+
console.log(` ${details.join(" \xB7 ")}`);
|
|
421
|
+
}
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
function formatConcentration(value) {
|
|
425
|
+
const concentration = numberField(value, "value");
|
|
426
|
+
if (concentration === void 0) {
|
|
427
|
+
return void 0;
|
|
428
|
+
}
|
|
429
|
+
const unit = stringField(value, "units");
|
|
430
|
+
const suffix = unit === "MICROGRAMS_PER_CUBIC_METER" ? "\xB5g/m\xB3" : unit === "MILLIGRAMS_PER_CUBIC_METER" ? "mg/m\xB3" : unit === "PARTS_PER_BILLION" ? "ppb" : unit === "PARTS_PER_MILLION" ? "ppm" : unit ?? "units";
|
|
431
|
+
return `${formatNumber(concentration)} ${suffix}`;
|
|
432
|
+
}
|
|
433
|
+
function renderAirQuality(result) {
|
|
434
|
+
const indexes = arrayField(result, "indexes");
|
|
435
|
+
const pollutants = arrayField(result, "pollutants");
|
|
436
|
+
if (!indexes && !pollutants) {
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
console.log("Current air quality");
|
|
440
|
+
for (const index of indexes ?? []) {
|
|
441
|
+
const label = stringField(index, "displayName") ?? stringField(index, "code") ?? "AQI";
|
|
442
|
+
const aqi = numberField(index, "aqi");
|
|
443
|
+
const category = stringField(index, "category");
|
|
444
|
+
const value = aqi === void 0 ? label : `${label}: ${formatNumber(aqi)}`;
|
|
445
|
+
console.log(` ${value}${category ? ` \xB7 ${category}` : ""}`);
|
|
446
|
+
}
|
|
447
|
+
for (const pollutant of pollutants ?? []) {
|
|
448
|
+
const label = stringField(pollutant, "fullName") ?? stringField(pollutant, "displayName") ?? stringField(pollutant, "code");
|
|
449
|
+
const concentration = formatConcentration(
|
|
450
|
+
recordField(pollutant, "concentration")
|
|
451
|
+
);
|
|
452
|
+
if (label || concentration) {
|
|
453
|
+
console.log(` ${[label, concentration].filter(Boolean).join(": ")}`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return true;
|
|
457
|
+
}
|
|
458
|
+
function renderReadableWeatherResult(operation, result) {
|
|
459
|
+
if (!isRecord(result)) {
|
|
460
|
+
console.log(source_default.dim("No structured weather data returned."));
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const rendered = operation === "current" ? renderCurrentConditions(result) : operation === "forecast.daily" ? renderDailyForecast(result) : operation === "forecast.hourly" ? renderHourlyForecast(result, "forecastHours", "Hourly forecast") : operation === "history.hourly" ? renderHourlyForecast(result, "historyHours", "Hourly history") : operation === "air-quality.current" ? renderAirQuality(result) : false;
|
|
464
|
+
if (!rendered) {
|
|
465
|
+
console.log(source_default.dim("No readable weather fields were returned."));
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
function renderWeatherResponse(label, response) {
|
|
469
|
+
console.log(source_default.green(`\u2713 ${label}`));
|
|
470
|
+
renderReadableWeatherResult(response.operation, response.result);
|
|
471
|
+
renderSource(response);
|
|
472
|
+
}
|
|
473
|
+
async function runWeatherRequest(label, endpoint, payload, options) {
|
|
474
|
+
const response = await callZeroWeather(endpoint, payload);
|
|
475
|
+
if (options.json) {
|
|
476
|
+
console.log(JSON.stringify(response));
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
renderWeatherResponse(label, response);
|
|
480
|
+
}
|
|
481
|
+
function addCoordinateOptions(command) {
|
|
482
|
+
return command.requiredOption("--lat <number>", "Latitude", parseLatitude).requiredOption("--lng <number>", "Longitude", parseLongitude).option("--json", "Print the raw response as JSON");
|
|
483
|
+
}
|
|
484
|
+
function addLocationOptions(command) {
|
|
485
|
+
return addCoordinateOptions(command).option(
|
|
486
|
+
"--units <system>",
|
|
487
|
+
"Units system: metric or imperial",
|
|
488
|
+
parseWeatherUnits,
|
|
489
|
+
"metric"
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
function addHourlyPaginationOptions(command) {
|
|
493
|
+
return command.option("--page-size <n>", "Records per page, from 1 to 24", (value) => {
|
|
494
|
+
return parseIntegerInRange(value, 1, 24);
|
|
495
|
+
}).option("--page-token <token>", "Token for the next page");
|
|
496
|
+
}
|
|
497
|
+
var currentCommand = addLocationOptions(
|
|
498
|
+
new Command().name("current").description("Get current weather conditions")
|
|
499
|
+
).action(
|
|
500
|
+
withErrorHandler(async (options) => {
|
|
501
|
+
await runWeatherRequest(
|
|
502
|
+
"Current weather retrieved",
|
|
503
|
+
"current",
|
|
504
|
+
locationPayload(options),
|
|
505
|
+
options
|
|
506
|
+
);
|
|
507
|
+
})
|
|
508
|
+
);
|
|
509
|
+
var hourlyForecastCommand = addHourlyPaginationOptions(
|
|
510
|
+
addLocationOptions(
|
|
511
|
+
new Command().name("hourly").description("Get up to 240 hours of hourly forecasts")
|
|
512
|
+
)
|
|
513
|
+
).option("--hours <n>", "Total forecast hours, from 1 to 240", (value) => {
|
|
514
|
+
return parseIntegerInRange(value, 1, 240);
|
|
515
|
+
}).action(
|
|
516
|
+
withErrorHandler(async (options) => {
|
|
517
|
+
await runWeatherRequest(
|
|
518
|
+
"Hourly forecast retrieved",
|
|
519
|
+
"forecast/hourly",
|
|
520
|
+
{ ...pagedPayload(options), hours: options.hours },
|
|
521
|
+
options
|
|
522
|
+
);
|
|
523
|
+
})
|
|
524
|
+
);
|
|
525
|
+
var dailyForecastCommand = addLocationOptions(
|
|
526
|
+
new Command().name("daily").description("Get up to 10 days of daily forecasts")
|
|
527
|
+
).option("--days <n>", "Total forecast days, from 1 to 10", (value) => {
|
|
528
|
+
return parseIntegerInRange(value, 1, 10);
|
|
529
|
+
}).option("--page-size <n>", "Records per page, from 1 to 10", (value) => {
|
|
530
|
+
return parseIntegerInRange(value, 1, 10);
|
|
531
|
+
}).option("--page-token <token>", "Token for the next page").action(
|
|
532
|
+
withErrorHandler(async (options) => {
|
|
533
|
+
await runWeatherRequest(
|
|
534
|
+
"Daily forecast retrieved",
|
|
535
|
+
"forecast/daily",
|
|
536
|
+
{ ...pagedPayload(options), days: options.days },
|
|
537
|
+
options
|
|
538
|
+
);
|
|
539
|
+
})
|
|
540
|
+
);
|
|
541
|
+
var hourlyHistoryCommand = addHourlyPaginationOptions(
|
|
542
|
+
addLocationOptions(
|
|
543
|
+
new Command().name("hourly").description("Get up to 24 hours of recent hourly history")
|
|
544
|
+
)
|
|
545
|
+
).option("--hours <n>", "Total history hours, from 1 to 24", (value) => {
|
|
546
|
+
return parseIntegerInRange(value, 1, 24);
|
|
547
|
+
}).action(
|
|
548
|
+
withErrorHandler(async (options) => {
|
|
549
|
+
await runWeatherRequest(
|
|
550
|
+
"Hourly weather history retrieved",
|
|
551
|
+
"history/hourly",
|
|
552
|
+
{ ...pagedPayload(options), hours: options.hours },
|
|
553
|
+
options
|
|
554
|
+
);
|
|
555
|
+
})
|
|
556
|
+
);
|
|
557
|
+
var airQualityCurrentCommand = addCoordinateOptions(
|
|
558
|
+
new Command().name("current").description("Get current air quality")
|
|
559
|
+
).action(
|
|
560
|
+
withErrorHandler(async (options) => {
|
|
561
|
+
await runWeatherRequest(
|
|
562
|
+
"Current air quality retrieved",
|
|
563
|
+
"air-quality/current",
|
|
564
|
+
coordinatePayload(options),
|
|
565
|
+
options
|
|
566
|
+
);
|
|
567
|
+
})
|
|
568
|
+
);
|
|
569
|
+
var forecastCommand = new Command().name("forecast").description("Get hourly or daily weather forecasts").addCommand(hourlyForecastCommand).addCommand(dailyForecastCommand);
|
|
570
|
+
var historyCommand = new Command().name("history").description("Get recent weather history").addCommand(hourlyHistoryCommand);
|
|
571
|
+
var airQualityCommand = new Command().name("air-quality").description("Get current air quality").addCommand(airQualityCurrentCommand);
|
|
572
|
+
var zeroWeatherCommand = new Command().name("weather").description("Use managed Zero weather and air quality services").addCommand(currentCommand).addCommand(forecastCommand).addCommand(historyCommand).addCommand(airQualityCommand).addHelpText(
|
|
573
|
+
"after",
|
|
574
|
+
`
|
|
575
|
+
Examples:
|
|
576
|
+
Current conditions: zero weather current --lat 39.9042 --lng 116.4074 --json
|
|
577
|
+
Hourly forecast: zero weather forecast hourly --lat 39.9042 --lng 116.4074 --hours 48 --page-size 24 --json
|
|
578
|
+
Daily forecast: zero weather forecast daily --lat 39.9042 --lng 116.4074 --days 10 --page-size 10 --json
|
|
579
|
+
Hourly history: zero weather history hourly --lat 39.9042 --lng 116.4074 --hours 24 --json
|
|
580
|
+
Current air quality: zero weather air-quality current --lat 39.9042 --lng 116.4074 --json
|
|
581
|
+
|
|
582
|
+
Notes:
|
|
583
|
+
- Authenticates via ZERO_TOKEN (requires weather:read capability) or a CLI token
|
|
584
|
+
- Each command makes one Google Weather or Air Quality API request; use page tokens for additional weather pages
|
|
585
|
+
- Calls are recorded for usage analytics and currently charge 0 credits`
|
|
586
|
+
);
|
|
587
|
+
export {
|
|
588
|
+
zeroWeatherCommand
|
|
589
|
+
};
|
|
590
|
+
//# sourceMappingURL=weather-L7QYR5VW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/weather/index.ts"],"sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\n\nimport { callZeroWeather, type ZeroWeatherResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst WEATHER_UNITS = [\"metric\", \"imperial\"] as const;\nconst WEATHER_LANGUAGE_CODE = \"en\";\n\ntype WeatherUnits = (typeof WEATHER_UNITS)[number];\n\ninterface JsonOption {\n readonly json?: boolean;\n}\n\ninterface CoordinateOptions extends JsonOption {\n readonly lat: number;\n readonly lng: number;\n}\n\ninterface LocationOptions extends CoordinateOptions {\n readonly units: WeatherUnits;\n}\n\ninterface PagedOptions extends LocationOptions {\n readonly pageSize?: number;\n readonly pageToken?: string;\n}\n\ninterface HourlyForecastOptions extends PagedOptions {\n readonly hours?: number;\n}\n\ninterface DailyForecastOptions extends PagedOptions {\n readonly days?: number;\n}\n\ninterface HourlyHistoryOptions extends PagedOptions {\n readonly hours?: number;\n}\n\nfunction parseLatitude(value: string): number {\n const latitude = Number(value);\n if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new InvalidArgumentError(\"latitude must be a number from -90 to 90\");\n }\n return latitude;\n}\n\nfunction parseLongitude(value: string): number {\n const longitude = Number(value);\n if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new InvalidArgumentError(\n \"longitude must be a number from -180 to 180\",\n );\n }\n return longitude;\n}\n\nfunction parseIntegerInRange(value: string, min: number, max: number): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(\n `value must be an integer from ${min} to ${max}`,\n );\n }\n return parsed;\n}\n\nfunction parseWeatherUnits(value: string): WeatherUnits {\n if (WEATHER_UNITS.includes(value as WeatherUnits)) {\n return value as WeatherUnits;\n }\n throw new InvalidArgumentError(\n `units must be one of: ${WEATHER_UNITS.join(\", \")}`,\n );\n}\n\nfunction coordinatePayload(\n options: CoordinateOptions,\n): Record<string, unknown> {\n return {\n lat: options.lat,\n lng: options.lng,\n languageCode: WEATHER_LANGUAGE_CODE,\n };\n}\n\nfunction locationPayload(options: LocationOptions): Record<string, unknown> {\n return {\n ...coordinatePayload(options),\n units: options.units,\n };\n}\n\nfunction pagedPayload(options: PagedOptions): Record<string, unknown> {\n return {\n ...locationPayload(options),\n pageSize: options.pageSize,\n pageToken: options.pageToken,\n };\n}\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction recordField(value: unknown, key: string): JsonRecord | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const field = value[key];\n return isRecord(field) ? field : undefined;\n}\n\nfunction arrayField(\n value: unknown,\n key: string,\n): readonly unknown[] | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const field = value[key];\n return Array.isArray(field) ? field : undefined;\n}\n\nfunction stringField(value: unknown, key: string): string | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction numberField(value: unknown, key: string): number | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const field = value[key];\n return typeof field === \"number\" && Number.isFinite(field)\n ? field\n : undefined;\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value)\n ? String(value)\n : value.toFixed(1).replace(/\\.0$/, \"\");\n}\n\nfunction formatTemperature(value: unknown): string | undefined {\n const degrees = numberField(value, \"degrees\");\n if (degrees === undefined) {\n return undefined;\n }\n const unit = stringField(value, \"unit\");\n const suffix = unit === \"FAHRENHEIT\" ? \"°F\" : \"°C\";\n return `${formatNumber(degrees)}${suffix}`;\n}\n\nfunction temperatureSuffix(value: unknown): string {\n return stringField(value, \"unit\") === \"FAHRENHEIT\" ? \"°F\" : \"°C\";\n}\n\nfunction formatTemperatureRange(\n minimum: unknown,\n maximum: unknown,\n): string | undefined {\n const minimumText = formatTemperature(minimum);\n const maximumText = formatTemperature(maximum);\n const minimumDegrees = numberField(minimum, \"degrees\");\n const maximumDegrees = numberField(maximum, \"degrees\");\n if (\n minimumDegrees !== undefined &&\n maximumDegrees !== undefined &&\n temperatureSuffix(minimum) === temperatureSuffix(maximum)\n ) {\n return `${formatNumber(minimumDegrees)}–${formatNumber(maximumDegrees)}${temperatureSuffix(minimum)}`;\n }\n if (minimumText && maximumText) {\n return `${minimumText}–${maximumText}`;\n }\n return minimumText ?? maximumText;\n}\n\nfunction formatCardinalDirection(\n value: string | undefined,\n): string | undefined {\n if (!value) {\n return undefined;\n }\n const abbreviations: Record<string, string> = {\n NORTH: \"N\",\n NORTHEAST: \"NE\",\n EAST: \"E\",\n SOUTHEAST: \"SE\",\n SOUTH: \"S\",\n SOUTHWEST: \"SW\",\n WEST: \"W\",\n NORTHWEST: \"NW\",\n };\n return value\n .split(\"_\")\n .map((part) => {\n return abbreviations[part] ?? part;\n })\n .join(\"\");\n}\n\nfunction formatSpeed(value: unknown): string | undefined {\n const speed = numberField(value, \"value\");\n if (speed === undefined) {\n return undefined;\n }\n const unit = stringField(value, \"unit\");\n const suffix =\n unit === \"MILES_PER_HOUR\"\n ? \"mph\"\n : unit === \"METERS_PER_SECOND\"\n ? \"m/s\"\n : \"km/h\";\n return `${formatNumber(speed)} ${suffix}`;\n}\n\nfunction formatWind(value: unknown): string | undefined {\n const direction = formatCardinalDirection(\n stringField(recordField(value, \"direction\"), \"cardinal\"),\n );\n const speed = formatSpeed(recordField(value, \"speed\"));\n const gust = formatSpeed(recordField(value, \"gust\"));\n const primary = [direction, speed].filter(Boolean).join(\" \");\n if (!primary && !gust) {\n return undefined;\n }\n if (!gust) {\n return primary || undefined;\n }\n return `${primary || \"Wind\"}, gusts ${gust}`;\n}\n\nfunction formatCondition(value: unknown): string | undefined {\n const description = recordField(value, \"description\");\n return stringField(description, \"text\") ?? stringField(value, \"text\");\n}\n\nfunction formatProbability(value: unknown): string | undefined {\n const percent = numberField(recordField(value, \"probability\"), \"percent\");\n return percent === undefined ? undefined : `${formatNumber(percent)}%`;\n}\n\nfunction formatQuantity(value: unknown): string | undefined {\n const quantity = numberField(value, \"quantity\");\n if (quantity === undefined || quantity === 0) {\n return undefined;\n }\n const unit = stringField(value, \"unit\");\n return `${formatNumber(quantity)} ${unit === \"MILLIMETERS\" ? \"mm\" : (unit ?? \"units\")}`;\n}\n\nfunction formatTimeZone(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : stringField(value, \"id\");\n}\n\nfunction formatDisplayDate(value: unknown): string | undefined {\n const year = numberField(value, \"year\");\n const month = numberField(value, \"month\");\n const day = numberField(value, \"day\");\n if (year === undefined || month === undefined || day === undefined) {\n return undefined;\n }\n return new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"UTC\",\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n }).format(new Date(Date.UTC(year, month - 1, day, 12)));\n}\n\nfunction formatDateTime(\n value: unknown,\n timeZone: string | undefined,\n): string | undefined {\n if (typeof value === \"string\") {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n return new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n }\n\n const year = numberField(value, \"year\");\n const month = numberField(value, \"month\");\n const day = numberField(value, \"day\");\n if (year === undefined || month === undefined || day === undefined) {\n return undefined;\n }\n const hour = numberField(value, \"hours\") ?? numberField(value, \"hour\") ?? 0;\n const minute =\n numberField(value, \"minutes\") ?? numberField(value, \"minute\") ?? 0;\n const date = new Date(Date.UTC(year, month - 1, day, hour, minute));\n return new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction formatLocalTime(\n value: unknown,\n timeZone: string | undefined,\n): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n return new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction renderSource(response: ZeroWeatherResponse): void {\n if (response.attribution) {\n console.log(chalk.dim(response.attribution));\n }\n}\n\nfunction renderCurrentConditions(result: JsonRecord): boolean {\n const timeZone = formatTimeZone(result.timeZone);\n console.log(`Current conditions${timeZone ? ` · ${timeZone}` : \"\"}`);\n\n const condition = formatCondition(result.weatherCondition);\n const temperature = formatTemperature(result.temperature);\n const feelsLike = formatTemperature(result.feelsLikeTemperature);\n const currentTime = formatDateTime(result.currentTime, timeZone);\n if (condition || temperature || feelsLike) {\n console.log(\n ` ${[\n condition,\n temperature,\n feelsLike ? `feels like ${feelsLike}` : undefined,\n ]\n .filter(Boolean)\n .join(\" · \")}`,\n );\n }\n\n const details = [\n formatWind(result.wind),\n numberField(result, \"relativeHumidity\") !== undefined\n ? `humidity ${formatNumber(numberField(result, \"relativeHumidity\") ?? 0)}%`\n : undefined,\n numberField(result, \"uvIndex\") !== undefined\n ? `UV ${formatNumber(numberField(result, \"uvIndex\") ?? 0)}`\n : undefined,\n formatProbability(result.precipitation)\n ? `rain ${formatProbability(result.precipitation)}`\n : undefined,\n ].filter(Boolean);\n if (details.length > 0) {\n console.log(` ${details.join(\" · \")}`);\n }\n if (currentTime) {\n console.log(chalk.dim(` Updated ${currentTime}`));\n }\n return Boolean(condition || temperature || feelsLike || details.length > 0);\n}\n\nfunction compactStrings(\n values: readonly (string | undefined)[],\n): readonly string[] {\n return values.filter((value): value is string => {\n return value !== undefined;\n });\n}\n\nfunction formatLabeledTemperatureRange(\n label: string,\n minimum: unknown,\n maximum: unknown,\n): string | undefined {\n const range = formatTemperatureRange(minimum, maximum);\n return range ? `${label}${range}` : undefined;\n}\n\nfunction formatDailyRainProbability(\n daytime: JsonRecord | undefined,\n nighttime: JsonRecord | undefined,\n): string | undefined {\n const daytimeProbability = formatProbability(daytime?.precipitation);\n if (!daytimeProbability) {\n return undefined;\n }\n const nighttimeProbability = formatProbability(nighttime?.precipitation);\n return `rain ${daytimeProbability}${\n nighttimeProbability ? ` (night ${nighttimeProbability})` : \"\"\n }`;\n}\n\nfunction formatLabeledNumber(\n label: string,\n value: unknown,\n key: string,\n onlyWhenPositive = false,\n): string | undefined {\n const number = numberField(value, key);\n if (number === undefined || (onlyWhenPositive && number <= 0)) {\n return undefined;\n }\n return `${label} ${formatNumber(number)}${label === \"UV\" ? \"\" : \"%\"}`;\n}\n\nfunction formatLabeledQuantity(\n label: string,\n value: unknown,\n): string | undefined {\n const quantity = formatQuantity(value);\n return quantity ? `${label} ${quantity}` : undefined;\n}\n\nfunction renderDailyForecastDay(\n forecastDay: unknown,\n timeZone: string | undefined,\n): void {\n const day = isRecord(forecastDay) ? forecastDay : {};\n const daytime = recordField(day, \"daytimeForecast\");\n const nighttime = recordField(day, \"nighttimeForecast\");\n const date = formatDisplayDate(day.displayDate) ?? \"Forecast day\";\n console.log(chalk.bold(` ${date}`));\n\n const nighttimeCondition = formatCondition(\n recordField(nighttime, \"weatherCondition\"),\n );\n const conditions = compactStrings([\n formatCondition(recordField(daytime, \"weatherCondition\")),\n nighttimeCondition ? `${nighttimeCondition} overnight` : undefined,\n ]);\n if (conditions.length > 0) {\n console.log(` ${conditions.join(\" · \")}`);\n }\n\n const details = compactStrings([\n formatTemperatureRange(day.minTemperature, day.maxTemperature),\n formatLabeledTemperatureRange(\n \"feels like \",\n day.feelsLikeMinTemperature,\n day.feelsLikeMaxTemperature,\n ),\n formatDailyRainProbability(daytime, nighttime),\n formatWind(daytime?.wind) ?? formatWind(nighttime?.wind),\n formatLabeledNumber(\"UV\", daytime, \"uvIndex\"),\n formatLabeledNumber(\n \"thunderstorms\",\n daytime,\n \"thunderstormProbability\",\n true,\n ),\n formatLabeledQuantity(\n \"snow\",\n recordField(daytime?.precipitation, \"snowQpf\"),\n ),\n formatLabeledQuantity(\"ice\", recordField(daytime, \"iceThickness\")),\n ]);\n if (details.length > 0) {\n console.log(` ${details.join(\" · \")}`);\n }\n\n const sunEvents = recordField(day, \"sunEvents\");\n const sunrise = formatLocalTime(\n stringField(sunEvents, \"sunriseTime\"),\n timeZone,\n );\n const sunset = formatLocalTime(\n stringField(sunEvents, \"sunsetTime\"),\n timeZone,\n );\n const sunDetails = compactStrings([\n sunrise ? `Sunrise ${sunrise}` : undefined,\n sunset ? `Sunset ${sunset}` : undefined,\n ]);\n if (sunDetails.length > 0) {\n console.log(chalk.dim(` ${sunDetails.join(\" · \")}`));\n }\n}\n\nfunction renderDailyForecast(result: JsonRecord): boolean {\n const forecastDays = arrayField(result, \"forecastDays\");\n if (!forecastDays) {\n return false;\n }\n const timeZone = formatTimeZone(result.timeZone);\n console.log(`Daily forecast${timeZone ? ` · ${timeZone}` : \"\"}`);\n if (forecastDays.length === 0) {\n console.log(chalk.dim(\" No daily forecast data returned.\"));\n return true;\n }\n\n for (const forecastDay of forecastDays) {\n renderDailyForecastDay(forecastDay, timeZone);\n }\n return true;\n}\n\nfunction renderHourlyForecast(\n result: JsonRecord,\n key: \"forecastHours\" | \"historyHours\",\n title: string,\n): boolean {\n const hours = arrayField(result, key);\n if (!hours) {\n return false;\n }\n const timeZone = formatTimeZone(result.timeZone);\n console.log(`${title}${timeZone ? ` · ${timeZone}` : \"\"}`);\n if (hours.length === 0) {\n console.log(\n chalk.dim(\n ` No ${key === \"forecastHours\" ? \"forecast\" : \"history\"} data returned.`,\n ),\n );\n return true;\n }\n\n for (const hour of hours) {\n const interval = recordField(hour, \"interval\");\n const timestamp =\n (isRecord(hour) ? hour.displayDateTime : undefined) ??\n stringField(interval, \"startTime\");\n const dateTime = formatDateTime(timestamp, timeZone) ?? \"Unknown time\";\n const details = [\n dateTime,\n formatCondition(recordField(hour, \"weatherCondition\")),\n formatTemperature(recordField(hour, \"temperature\")),\n formatProbability(recordField(hour, \"precipitation\"))\n ? `rain ${formatProbability(recordField(hour, \"precipitation\"))}`\n : undefined,\n formatWind(recordField(hour, \"wind\")),\n ].filter(Boolean);\n console.log(` ${details.join(\" · \")}`);\n }\n return true;\n}\n\nfunction formatConcentration(value: unknown): string | undefined {\n const concentration = numberField(value, \"value\");\n if (concentration === undefined) {\n return undefined;\n }\n const unit = stringField(value, \"units\");\n const suffix =\n unit === \"MICROGRAMS_PER_CUBIC_METER\"\n ? \"µg/m³\"\n : unit === \"MILLIGRAMS_PER_CUBIC_METER\"\n ? \"mg/m³\"\n : unit === \"PARTS_PER_BILLION\"\n ? \"ppb\"\n : unit === \"PARTS_PER_MILLION\"\n ? \"ppm\"\n : (unit ?? \"units\");\n return `${formatNumber(concentration)} ${suffix}`;\n}\n\nfunction renderAirQuality(result: JsonRecord): boolean {\n const indexes = arrayField(result, \"indexes\");\n const pollutants = arrayField(result, \"pollutants\");\n if (!indexes && !pollutants) {\n return false;\n }\n console.log(\"Current air quality\");\n for (const index of indexes ?? []) {\n const label =\n stringField(index, \"displayName\") ?? stringField(index, \"code\") ?? \"AQI\";\n const aqi = numberField(index, \"aqi\");\n const category = stringField(index, \"category\");\n const value = aqi === undefined ? label : `${label}: ${formatNumber(aqi)}`;\n console.log(` ${value}${category ? ` · ${category}` : \"\"}`);\n }\n for (const pollutant of pollutants ?? []) {\n const label =\n stringField(pollutant, \"fullName\") ??\n stringField(pollutant, \"displayName\") ??\n stringField(pollutant, \"code\");\n const concentration = formatConcentration(\n recordField(pollutant, \"concentration\"),\n );\n if (label || concentration) {\n console.log(` ${[label, concentration].filter(Boolean).join(\": \")}`);\n }\n }\n return true;\n}\n\nfunction renderReadableWeatherResult(\n operation: string | undefined,\n result: unknown,\n): void {\n if (!isRecord(result)) {\n console.log(chalk.dim(\"No structured weather data returned.\"));\n return;\n }\n\n const rendered =\n operation === \"current\"\n ? renderCurrentConditions(result)\n : operation === \"forecast.daily\"\n ? renderDailyForecast(result)\n : operation === \"forecast.hourly\"\n ? renderHourlyForecast(result, \"forecastHours\", \"Hourly forecast\")\n : operation === \"history.hourly\"\n ? renderHourlyForecast(result, \"historyHours\", \"Hourly history\")\n : operation === \"air-quality.current\"\n ? renderAirQuality(result)\n : false;\n\n if (!rendered) {\n console.log(chalk.dim(\"No readable weather fields were returned.\"));\n }\n}\n\nfunction renderWeatherResponse(\n label: string,\n response: ZeroWeatherResponse,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n renderReadableWeatherResult(response.operation, response.result);\n renderSource(response);\n}\n\nasync function runWeatherRequest(\n label: string,\n endpoint:\n | \"current\"\n | \"forecast/hourly\"\n | \"forecast/daily\"\n | \"history/hourly\"\n | \"air-quality/current\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroWeather(endpoint, payload);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderWeatherResponse(label, response);\n}\n\nfunction addCoordinateOptions(command: Command): Command {\n return command\n .requiredOption(\"--lat <number>\", \"Latitude\", parseLatitude)\n .requiredOption(\"--lng <number>\", \"Longitude\", parseLongitude)\n .option(\"--json\", \"Print the raw response as JSON\");\n}\n\nfunction addLocationOptions(command: Command): Command {\n return addCoordinateOptions(command).option(\n \"--units <system>\",\n \"Units system: metric or imperial\",\n parseWeatherUnits,\n \"metric\",\n );\n}\n\nfunction addHourlyPaginationOptions(command: Command): Command {\n return command\n .option(\"--page-size <n>\", \"Records per page, from 1 to 24\", (value) => {\n return parseIntegerInRange(value, 1, 24);\n })\n .option(\"--page-token <token>\", \"Token for the next page\");\n}\n\nconst currentCommand = addLocationOptions(\n new Command().name(\"current\").description(\"Get current weather conditions\"),\n).action(\n withErrorHandler(async (options: LocationOptions) => {\n await runWeatherRequest(\n \"Current weather retrieved\",\n \"current\",\n locationPayload(options),\n options,\n );\n }),\n);\n\nconst hourlyForecastCommand = addHourlyPaginationOptions(\n addLocationOptions(\n new Command()\n .name(\"hourly\")\n .description(\"Get up to 240 hours of hourly forecasts\"),\n ),\n)\n .option(\"--hours <n>\", \"Total forecast hours, from 1 to 240\", (value) => {\n return parseIntegerInRange(value, 1, 240);\n })\n .action(\n withErrorHandler(async (options: HourlyForecastOptions) => {\n await runWeatherRequest(\n \"Hourly forecast retrieved\",\n \"forecast/hourly\",\n { ...pagedPayload(options), hours: options.hours },\n options,\n );\n }),\n );\n\nconst dailyForecastCommand = addLocationOptions(\n new Command()\n .name(\"daily\")\n .description(\"Get up to 10 days of daily forecasts\"),\n)\n .option(\"--days <n>\", \"Total forecast days, from 1 to 10\", (value) => {\n return parseIntegerInRange(value, 1, 10);\n })\n .option(\"--page-size <n>\", \"Records per page, from 1 to 10\", (value) => {\n return parseIntegerInRange(value, 1, 10);\n })\n .option(\"--page-token <token>\", \"Token for the next page\")\n .action(\n withErrorHandler(async (options: DailyForecastOptions) => {\n await runWeatherRequest(\n \"Daily forecast retrieved\",\n \"forecast/daily\",\n { ...pagedPayload(options), days: options.days },\n options,\n );\n }),\n );\n\nconst hourlyHistoryCommand = addHourlyPaginationOptions(\n addLocationOptions(\n new Command()\n .name(\"hourly\")\n .description(\"Get up to 24 hours of recent hourly history\"),\n ),\n)\n .option(\"--hours <n>\", \"Total history hours, from 1 to 24\", (value) => {\n return parseIntegerInRange(value, 1, 24);\n })\n .action(\n withErrorHandler(async (options: HourlyHistoryOptions) => {\n await runWeatherRequest(\n \"Hourly weather history retrieved\",\n \"history/hourly\",\n { ...pagedPayload(options), hours: options.hours },\n options,\n );\n }),\n );\n\nconst airQualityCurrentCommand = addCoordinateOptions(\n new Command().name(\"current\").description(\"Get current air quality\"),\n).action(\n withErrorHandler(async (options: CoordinateOptions) => {\n await runWeatherRequest(\n \"Current air quality retrieved\",\n \"air-quality/current\",\n coordinatePayload(options),\n options,\n );\n }),\n);\n\nconst forecastCommand = new Command()\n .name(\"forecast\")\n .description(\"Get hourly or daily weather forecasts\")\n .addCommand(hourlyForecastCommand)\n .addCommand(dailyForecastCommand);\n\nconst historyCommand = new Command()\n .name(\"history\")\n .description(\"Get recent weather history\")\n .addCommand(hourlyHistoryCommand);\n\nconst airQualityCommand = new Command()\n .name(\"air-quality\")\n .description(\"Get current air quality\")\n .addCommand(airQualityCurrentCommand);\n\nexport const zeroWeatherCommand = new Command()\n .name(\"weather\")\n .description(\"Use managed Zero weather and air quality services\")\n .addCommand(currentCommand)\n .addCommand(forecastCommand)\n .addCommand(historyCommand)\n .addCommand(airQualityCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Current conditions: zero weather current --lat 39.9042 --lng 116.4074 --json\n Hourly forecast: zero weather forecast hourly --lat 39.9042 --lng 116.4074 --hours 48 --page-size 24 --json\n Daily forecast: zero weather forecast daily --lat 39.9042 --lng 116.4074 --days 10 --page-size 10 --json\n Hourly history: zero weather history hourly --lat 39.9042 --lng 116.4074 --hours 24 --json\n Current air quality: zero weather air-quality current --lat 39.9042 --lng 116.4074 --json\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires weather:read capability) or a CLI token\n - Each command makes one Google Weather or Air Quality API request; use page tokens for additional weather pages\n - Calls are recorded for usage analytics and currently charge 0 credits`,\n );\n"],"mappings":"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","names":["date"]}
|