@maschinenlesbar.org/luftqualitaet-cli 0.0.2 → 0.0.4
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/README.md +215 -143
- package/dist/src/cli/commands/data.d.ts.map +1 -1
- package/dist/src/cli/commands/data.js +17 -4
- package/dist/src/cli/commands/data.js.map +1 -1
- package/dist/src/cli/program.d.ts.map +1 -1
- package/dist/src/cli/program.js +1 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +19 -0
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/shared.d.ts +1 -0
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +2 -0
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/client/engine.d.ts.map +1 -1
- package/dist/src/client/engine.js +46 -2
- package/dist/src/client/engine.js.map +1 -1
- package/dist/src/client/http.d.ts.map +1 -1
- package/dist/src/client/http.js +32 -4
- package/dist/src/client/http.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,197 +1,269 @@
|
|
|
1
1
|
# luftqualitaet-cli
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[
|
|
5
|
-
(
|
|
6
|
-
|
|
3
|
+
[](https://github.com/maschinenlesbar-org/luftqualitaet-cli/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/maschinenlesbar-org/luftqualitaet-cli/actions/workflows/release.yml)
|
|
5
|
+
[](https://www.npmjs.com/package/@maschinenlesbar.org/luftqualitaet-cli)
|
|
6
|
+
|
|
7
|
+
Query Germany's official **air-quality data** — measurements, indices, annual
|
|
8
|
+
balances and exceedances — straight from your terminal. `luftqualitaet` is a
|
|
9
|
+
command-line tool over the open
|
|
10
|
+
[Umweltbundesamt Air Data API](https://www.umweltbundesamt.de/api/air_data/v3):
|
|
11
|
+
look up pollutants and stations, fetch hourly or daily measurements, inspect
|
|
12
|
+
exceedances, and get the full picture — as clean JSON you can pipe straight into
|
|
13
|
+
[`jq`](https://jqlang.github.io/jq/).
|
|
14
|
+
|
|
15
|
+
- **Works out of the box** — no account, no API key, no configuration. Install and go.
|
|
16
|
+
- **Clean JSON output** — pretty-printed by default, `--compact` for one-line/scripting.
|
|
17
|
+
- **14 commands** covering reference lists, measurements, annual balances, exceedances, thresholds and metadata.
|
|
18
|
+
- **Validates locally** — bad dates, reversed windows, out-of-range hours and years are caught before any request is sent.
|
|
19
|
+
|
|
20
|
+
> Want to use this as a TypeScript library or understand how it's built?
|
|
21
|
+
> See **[DEVELOPING.md](DEVELOPING.md)**.
|
|
7
22
|
|
|
8
|
-
|
|
9
|
-
> **v2** OpenAPI spec published at [luftqualitaet.api.bund.dev](https://luftqualitaet.api.bund.dev/).
|
|
23
|
+
## Install
|
|
10
24
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
25
|
+
```bash
|
|
26
|
+
npm i -g @maschinenlesbar.org/luftqualitaet-cli
|
|
27
|
+
```
|
|
14
28
|
|
|
15
|
-
|
|
16
|
-
- **One small dependency** for the CLI: [`commander`](https://github.com/tj/commander.js).
|
|
17
|
-
- **Strongly typed** — typed parameter objects and the lang/index/use enums.
|
|
18
|
-
- **Tested** — unit tests on Node's built-in test runner (`node --test`); every HTTP response is mocked (no real network in the suite).
|
|
19
|
-
- **Read-only, no auth** — the UBA Air Data API needs no key; this client only reads.
|
|
29
|
+
This installs the **`luftqualitaet`** command. Requires **Node.js 20+**.
|
|
20
30
|
|
|
21
|
-
|
|
31
|
+
Check it works:
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
```bash
|
|
34
|
+
luftqualitaet --help
|
|
35
|
+
```
|
|
24
36
|
|
|
25
|
-
##
|
|
37
|
+
## Quickstart
|
|
38
|
+
|
|
39
|
+
No setup needed — the API is public and open, no key required. Start with the
|
|
40
|
+
reference lists to find the ids you'll need:
|
|
26
41
|
|
|
27
42
|
```bash
|
|
28
|
-
|
|
29
|
-
npm run build # compiles TypeScript to dist/
|
|
43
|
+
luftqualitaet components --lang en --index code
|
|
30
44
|
```
|
|
31
45
|
|
|
32
|
-
|
|
46
|
+
This returns a map of all measured pollutants keyed by their short code. Pull
|
|
47
|
+
out just the ids with `jq`:
|
|
33
48
|
|
|
34
49
|
```bash
|
|
35
|
-
|
|
36
|
-
# or, after `npm link` / global install:
|
|
37
|
-
luftqualitaet --help
|
|
50
|
+
luftqualitaet components --lang en | jq '.data | to_entries[] | {id: .key, name: .value[1]}'
|
|
38
51
|
```
|
|
39
52
|
|
|
40
|
-
|
|
53
|
+
Then fetch the air-quality index for a station over a day:
|
|
41
54
|
|
|
42
|
-
|
|
55
|
+
```bash
|
|
56
|
+
luftqualitaet airquality \
|
|
57
|
+
--station 143 \
|
|
58
|
+
--date-from 2024-01-01 --time-from 1 \
|
|
59
|
+
--date-to 2024-01-01 --time-to 24
|
|
60
|
+
```
|
|
43
61
|
|
|
44
|
-
|
|
45
|
-
columns and the payload is a compact map keyed by id/code/timestamp. This client
|
|
46
|
-
returns those payloads faithfully (as JSON) and focuses on getting the request
|
|
47
|
-
right. Look up station ids and component ids via `meta`, `components`, etc.
|
|
62
|
+
## Commands
|
|
48
63
|
|
|
49
|
-
###
|
|
64
|
+
### Reference lists — look up ids
|
|
50
65
|
|
|
51
|
-
|
|
66
|
+
These commands need no required arguments (just optional `--lang` and `--index`):
|
|
67
|
+
|
|
68
|
+
| Command | What it returns |
|
|
52
69
|
| --- | --- |
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
Global options may be given either before or after the command, e.g.
|
|
61
|
-
`luftqualitaet --compact components --lang de` or `luftqualitaet components --compact --lang de`.
|
|
62
|
-
|
|
63
|
-
### Commands
|
|
64
|
-
|
|
65
|
-
```text
|
|
66
|
-
# Reference lists
|
|
67
|
-
components | networks | scopes [--lang de|en] [--index id|code]
|
|
68
|
-
station-types | station-settings | transgression-types [--lang de|en]
|
|
69
|
-
|
|
70
|
-
# Data (a time window is date-from/time-from .. date-to/time-to, hour 1..24)
|
|
71
|
-
airquality --date-from --time-from --date-to --time-to --station
|
|
72
|
-
airquality-limits
|
|
73
|
-
measures --date-from --time-from --date-to --time-to --station [--component] [--scope]
|
|
74
|
-
measures-limits
|
|
75
|
-
annual-balances --component --year [--lang] [--index]
|
|
76
|
-
transgressions --component --year [--lang] [--index]
|
|
77
|
-
thresholds --use airquality|measure [--lang] [--component] [--scope]
|
|
78
|
-
meta --use airquality|measure|transgression|annualbalance|map [--lang] [--date-from --date-to]
|
|
79
|
-
```
|
|
70
|
+
| `components` | Measured pollutants (PM₁₀, NO₂, O₃, …) with ids, codes and units |
|
|
71
|
+
| `networks` | Measurement networks (*Messnetze*) |
|
|
72
|
+
| `scopes` | Measurement scopes — averaging/aggregation definitions |
|
|
73
|
+
| `station-types` | Station-type classifications (background, traffic, industrial, …) |
|
|
74
|
+
| `station-settings` | Station-setting classifications (urban, suburban, rural, …) |
|
|
75
|
+
| `transgression-types` | Catalogue of exceedance types |
|
|
80
76
|
|
|
81
|
-
|
|
77
|
+
Flags for reference commands:
|
|
82
78
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
79
|
+
| Flag | Meaning |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `--lang de\|en` | Label language (default varies by endpoint) |
|
|
82
|
+
| `--index id\|code` | Key the response map by numeric id or short code (where supported) |
|
|
86
83
|
|
|
87
|
-
|
|
88
|
-
luftqualitaet airquality --date-from 2024-01-01 --time-from 1 \
|
|
89
|
-
--date-to 2024-01-01 --time-to 24 --station 143
|
|
84
|
+
### Data commands — measurements and aggregations
|
|
90
85
|
|
|
91
|
-
|
|
92
|
-
luftqualitaet annual-balances --component 1 --year 2023 --lang de
|
|
86
|
+
**`airquality`** — air-quality index for a station over a time window.
|
|
93
87
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
88
|
+
| Flag | Required | Meaning |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| `--station <id>` | yes | station id (positive integer) |
|
|
91
|
+
| `--date-from <YYYY-MM-DD>` | yes | window start date |
|
|
92
|
+
| `--time-from <1-24>` | yes | window start hour (hour-ending, 1..24) |
|
|
93
|
+
| `--date-to <YYYY-MM-DD>` | yes | window end date |
|
|
94
|
+
| `--time-to <1-24>` | yes | window end hour |
|
|
97
95
|
|
|
98
|
-
|
|
96
|
+
**`airquality-limits`** — available date range per station for air-quality data.
|
|
97
|
+
Takes no options.
|
|
99
98
|
|
|
100
|
-
|
|
99
|
+
**`measures`** — raw measurement data for a station over a time window.
|
|
101
100
|
|
|
102
|
-
|
|
101
|
+
Same window + station flags as `airquality`, plus:
|
|
103
102
|
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
| Flag | Required | Meaning |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
| `--component <id>` | no | narrow to one pollutant |
|
|
106
|
+
| `--scope <id>` | no | narrow to one averaging scope |
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
**`measures-limits`** — available date range per scope/component/station.
|
|
109
|
+
Takes no options.
|
|
108
110
|
|
|
109
|
-
|
|
110
|
-
const aq = await client.airquality({
|
|
111
|
-
date_from: "2024-01-01", time_from: 1, date_to: "2024-01-01", time_to: 24, station: 143,
|
|
112
|
-
});
|
|
111
|
+
**`annual-balances`** — annual tabulations for a component and year.
|
|
113
112
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
113
|
+
| Flag | Required | Meaning |
|
|
114
|
+
| --- | --- | --- |
|
|
115
|
+
| `--component <id>` | yes | component id |
|
|
116
|
+
| `--year <YYYY>` | yes | year (>= 2016) |
|
|
117
|
+
| `--lang de\|en` | no | label language |
|
|
118
|
+
| `--index id\|code` | no | response key |
|
|
120
119
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
new LuftqualitaetClient({
|
|
125
|
-
baseUrl: "https://www.umweltbundesamt.de",
|
|
126
|
-
timeoutMs: 15_000,
|
|
127
|
-
maxRetries: 3, // 429 / 503 are retried with linear backoff
|
|
128
|
-
maxResponseBytes: 50 << 20, // abort responses larger than 50 MiB (0 = unlimited)
|
|
129
|
-
userAgent: "my-app/1.0",
|
|
130
|
-
transport: customTransport, // inject your own HTTP transport
|
|
131
|
-
});
|
|
132
|
-
```
|
|
120
|
+
**`transgressions`** — exceedance data for a component and year.
|
|
121
|
+
Same flags as `annual-balances`.
|
|
133
122
|
|
|
134
|
-
|
|
123
|
+
**`thresholds`** — limit/threshold values for a given use case.
|
|
135
124
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
125
|
+
| Flag | Required | Meaning |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
| `--use airquality\|measure` | yes | which threshold set |
|
|
128
|
+
| `--lang de\|en` | no | label language |
|
|
129
|
+
| `--component <id>` | no | narrow to one component |
|
|
130
|
+
| `--scope <id>` | no | narrow to one scope |
|
|
140
131
|
|
|
141
|
-
|
|
132
|
+
**`meta`** — combined metadata bundle (components, scopes, stations, networks,
|
|
133
|
+
…) for building other queries.
|
|
142
134
|
|
|
143
|
-
|
|
135
|
+
| Flag | Required | Meaning |
|
|
136
|
+
| --- | --- | --- |
|
|
137
|
+
| `--use measure\|airquality\|transgression\|annualbalance\|map` | yes | which bundle |
|
|
138
|
+
| `--lang de\|en` | no | label language |
|
|
139
|
+
| `--date-from`, `--date-to` | when `--use airquality` | time window (required for that use) |
|
|
140
|
+
| `--time-from`, `--time-to` | no | hour bounds within window |
|
|
144
141
|
|
|
142
|
+
## Common tasks
|
|
143
|
+
|
|
144
|
+
A few recipes to get going — see **[Usage.md](Usage.md)** for the full,
|
|
145
|
+
use-case-driven set.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# What ids do the pollutants have?
|
|
149
|
+
luftqualitaet components --lang en --index code
|
|
150
|
+
|
|
151
|
+
# Which averaging scopes exist? (daily = 1, hourly = 2, 8h-max = 5, …)
|
|
152
|
+
luftqualitaet scopes --lang en
|
|
153
|
+
|
|
154
|
+
# Air-quality index for station 143 over a full day
|
|
155
|
+
luftqualitaet airquality \
|
|
156
|
+
--station 143 \
|
|
157
|
+
--date-from 2024-01-01 --time-from 1 \
|
|
158
|
+
--date-to 2024-01-01 --time-to 24
|
|
159
|
+
|
|
160
|
+
# PM₁₀ (component 1) daily-average measurements, station 143
|
|
161
|
+
luftqualitaet measures \
|
|
162
|
+
--station 143 --component 1 --scope 1 \
|
|
163
|
+
--date-from 2024-06-01 --time-from 1 \
|
|
164
|
+
--date-to 2024-06-01 --time-to 24
|
|
165
|
+
|
|
166
|
+
# Annual PM₁₀ balance for 2023
|
|
167
|
+
luftqualitaet annual-balances --component 1 --year 2023 --lang de
|
|
168
|
+
|
|
169
|
+
# NO₂ exceedances in 2022
|
|
170
|
+
luftqualitaet transgressions --component 5 --year 2022 --lang en
|
|
171
|
+
|
|
172
|
+
# Lookup tables for building a measurement query
|
|
173
|
+
luftqualitaet meta --use measure --lang de | jq 'keys'
|
|
145
174
|
```
|
|
146
|
-
src/
|
|
147
|
-
client/
|
|
148
|
-
enums.ts # Lang / IndexKind / MetaUse / ThresholdUse value sets
|
|
149
|
-
types.ts # parameter objects (responses kept as faithful JsonObject)
|
|
150
|
-
query.ts # dependency-free query-string builder
|
|
151
|
-
http.ts # the Transport interface + default node:http/https transport
|
|
152
|
-
engine.ts # URL building, retry/backoff, redirects (cross-origin headers stripped), JSON decoding, error mapping
|
|
153
|
-
errors.ts # LuftError / LuftApiError / LuftNetworkError / LuftParseError
|
|
154
|
-
client.ts # LuftqualitaetClient — the air-data surface over the engine
|
|
155
|
-
cli/
|
|
156
|
-
io.ts # injectable I/O seam (stdout/stderr)
|
|
157
|
-
shared.ts # option parsers, global-option resolver, JSON renderer
|
|
158
|
-
commands/ # reference lists + data endpoints
|
|
159
|
-
program.ts # assembles the commander program from injectable deps
|
|
160
|
-
run.ts # parses argv -> exit code (no process.exit; testable)
|
|
161
|
-
index.ts # #! bin shim
|
|
162
|
-
```
|
|
163
175
|
|
|
164
|
-
|
|
176
|
+
## Output & scripting
|
|
177
|
+
|
|
178
|
+
Every command prints **pretty JSON to stdout**. Errors and diagnostics go to
|
|
179
|
+
stderr, so piping stdout into `jq` stays clean.
|
|
180
|
+
|
|
181
|
+
UBA responses are **index + data** structures: an `indices` array names the
|
|
182
|
+
columns and the payload is a compact map keyed by id/code/timestamp. Most
|
|
183
|
+
recipes involve indexing into `.data`:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# How many stations have air-quality limits data?
|
|
187
|
+
luftqualitaet airquality-limits | jq '.data | keys | length'
|
|
165
188
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
- The CLI is built around injectable `CliDeps` (client factory + I/O), so the whole program can be
|
|
169
|
-
driven in-process by tests with a mocked client and captured output — no subprocesses.
|
|
170
|
-
- UBA responses are index/data structures whose exact shape varies by endpoint, so they are returned
|
|
171
|
-
as faithful raw `JsonObject`s rather than partially-guessed types.
|
|
189
|
+
# Pull the component name + unit for every pollutant
|
|
190
|
+
luftqualitaet components --lang en | jq '.data | to_entries[] | {id: .key, name: .value[1]}'
|
|
172
191
|
|
|
173
|
-
|
|
192
|
+
# Annual balances as compact JSON for further piping
|
|
193
|
+
luftqualitaet --compact annual-balances --component 1 --year 2023 | jq '.data'
|
|
194
|
+
```
|
|
174
195
|
|
|
175
|
-
|
|
196
|
+
Use `--compact` for single-line JSON in pipelines and logs:
|
|
176
197
|
|
|
177
198
|
```bash
|
|
178
|
-
|
|
199
|
+
luftqualitaet --compact measures-limits | jq '.data[] | select(.[0]=="1")' | head
|
|
179
200
|
```
|
|
180
201
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
202
|
+
`--compact` (and every global option) works **before or after** the command —
|
|
203
|
+
both `luftqualitaet --compact components` and `luftqualitaet components --compact`
|
|
204
|
+
do the same thing.
|
|
205
|
+
|
|
206
|
+
**Exit codes** make the CLI easy to use in scripts:
|
|
207
|
+
|
|
208
|
+
| Code | Meaning |
|
|
209
|
+
| --- | --- |
|
|
210
|
+
| `0` | success (also `--help` / `--version`) |
|
|
211
|
+
| `4` | resource not found (`404` from the API) |
|
|
212
|
+
| `1` | any other error (network failure, bad JSON, validation error) |
|
|
213
|
+
| non-zero | usage / argument error (bad flag, missing required option) |
|
|
214
|
+
|
|
215
|
+
## Troubleshooting
|
|
216
|
+
|
|
217
|
+
- **`command not found: luftqualitaet`** — the global npm bin directory isn't on
|
|
218
|
+
your `PATH`. Run `npm bin -g` to find it and add it, or run via
|
|
219
|
+
`npx @maschinenlesbar.org/luftqualitaet-cli …`.
|
|
220
|
+
- **Exit `4` / "not found"** — the API returned a `404`. The station or component
|
|
221
|
+
id may not exist, or the requested year/window is out of the available range.
|
|
222
|
+
Use `airquality-limits` or `measures-limits` to discover what data is actually
|
|
223
|
+
available.
|
|
224
|
+
- **Exit `1` / network error** — connectivity, DNS, or a timeout. Try again, or
|
|
225
|
+
raise the limit with `--timeout 60000`.
|
|
226
|
+
- **Empty `.data`** — the query matched nothing or the window has no data; use the
|
|
227
|
+
`-limits` commands to find a window that has data for that station/component.
|
|
228
|
+
- **Reversed window error** — `--date-from`/`--time-from` must come before
|
|
229
|
+
`--date-to`/`--time-to`; the CLI checks this locally before sending any request.
|
|
230
|
+
- **Year rejected** — `--year` must be `>= 2016`; the API does not carry annual
|
|
231
|
+
tabulations (`annual-balances`/`transgressions`) before that. The `>= 2016` floor
|
|
232
|
+
applies **only** to `--year`: the windowed endpoints (`airquality`/`measures`)
|
|
233
|
+
accept any valid `--date-from`/`--date-to`, since their available range varies by
|
|
234
|
+
station/scope — use the `-limits` commands to find what exists.
|
|
235
|
+
|
|
236
|
+
## Global options
|
|
237
|
+
|
|
238
|
+
These apply to every command and may be given before *or* after it:
|
|
239
|
+
|
|
240
|
+
| Option | Description |
|
|
241
|
+
| --- | --- |
|
|
242
|
+
| `-V, --version` | Print the version number |
|
|
243
|
+
| `-h, --help` | Show help for the program or a command |
|
|
244
|
+
| `--compact` | Print JSON on a single line instead of pretty-printed |
|
|
245
|
+
| `--base-url <url>` | API base URL (default `https://www.umweltbundesamt.de`) |
|
|
246
|
+
| `--timeout <ms>` | Per-request timeout (default `30000`) |
|
|
247
|
+
| `--user-agent <ua>` | `User-Agent` header value |
|
|
248
|
+
| `--max-retries <n>` | Retries for transient `429`/`503` responses (default `2`) |
|
|
249
|
+
| `--max-redirects <n>` | HTTP redirects to follow (`0` = none; default `5`) |
|
|
250
|
+
| `--max-response-bytes <n>` | Cap response body size in bytes (`0` = unlimited; default 100 MiB) |
|
|
251
|
+
|
|
252
|
+
## Learn more
|
|
253
|
+
|
|
254
|
+
- **[SKILLS.md](SKILLS.md)** — Claude Code Agent Skills that drive this CLI for you.
|
|
255
|
+
- **[Usage.md](Usage.md)** — full use-case-driven cookbook.
|
|
256
|
+
- **[GLOSSARY.md](GLOSSARY.md)** — every command, flag and domain term explained.
|
|
257
|
+
- **[DEVELOPING.md](DEVELOPING.md)** — TypeScript library usage, architecture, testing, CI.
|
|
186
258
|
|
|
187
|
-
##
|
|
259
|
+
## Data license
|
|
188
260
|
|
|
189
|
-
|
|
261
|
+
This CLI is a **client** — it accesses data it does not own or redistribute. The
|
|
262
|
+
upstream data is © its provider and licensed **separately from this tool's code**.
|
|
263
|
+
See **[DATA_LICENSE.md](DATA_LICENSE.md)**.
|
|
190
264
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
- **publish.yml** — manual dispatch: publish to npm via OIDC **Trusted Publishing** (no stored `NPM_TOKEN`) with provenance.
|
|
194
|
-
- **docs.yml** — build TypeDoc API docs and deploy to GitHub Pages on each `v*` tag.
|
|
265
|
+
> **Umweltbundesamt** — Datenlizenz Deutschland Namensnennung 2.0 (`dl-de/by-2-0`).
|
|
266
|
+
> Attribution required; commercial use and modification allowed.
|
|
195
267
|
|
|
196
268
|
## License
|
|
197
269
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAkExC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAkExC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAoL1E"}
|
|
@@ -136,16 +136,29 @@ export function registerDataCommands(program, deps) {
|
|
|
136
136
|
const use = assertEnum(String(opts["use"]), MetaUseValues, "use");
|
|
137
137
|
const dateFrom = opts["dateFrom"];
|
|
138
138
|
const dateTo = opts["dateTo"];
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
const timeFrom = opts["timeFrom"];
|
|
140
|
+
const timeTo = opts["timeTo"];
|
|
141
|
+
if (use === "airquality") {
|
|
142
|
+
if (dateFrom === undefined || dateTo === undefined) {
|
|
143
|
+
throw new LuftError("meta --use airquality requires --date-from and --date-to.");
|
|
144
|
+
}
|
|
145
|
+
// Validate the window locally, consistent with the `airquality`/`measures`
|
|
146
|
+
// commands and the "reversed windows are caught before any request" promise.
|
|
147
|
+
// Omitted hours default to the full-day bounds (1..24).
|
|
148
|
+
assertWindowOrdered(dateFrom, timeFrom ?? 1, dateTo, timeTo ?? 24);
|
|
149
|
+
}
|
|
150
|
+
else if (timeFrom !== undefined || timeTo !== undefined) {
|
|
151
|
+
// Hour bounds only mean anything for the airquality window; reject them
|
|
152
|
+
// elsewhere rather than silently sending an ignored parameter.
|
|
153
|
+
throw new LuftError(`meta --time-from/--time-to apply only to --use airquality (got --use ${use}).`);
|
|
141
154
|
}
|
|
142
155
|
renderJson(deps, global, await client.meta({
|
|
143
156
|
use,
|
|
144
157
|
lang: lang(opts),
|
|
145
158
|
date_from: dateFrom,
|
|
146
159
|
date_to: dateTo,
|
|
147
|
-
time_from:
|
|
148
|
-
time_to:
|
|
160
|
+
time_from: timeFrom,
|
|
161
|
+
time_to: timeTo,
|
|
149
162
|
}));
|
|
150
163
|
}));
|
|
151
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/cli/commands/data.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/cli/commands/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAuBvC,eAAO,MAAM,OAAO,QAAgB,CAAC;AAErC,yEAAyE;AACzE,eAAO,MAAM,WAAW,EAAE,OAGzB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,GAAE,OAAqB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAuBvC,eAAO,MAAM,OAAO,QAAgB,CAAC;AAErC,yEAAyE;AACzE,eAAO,MAAM,WAAW,EAAE,OAGzB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,GAAE,OAAqB,GAAG,OAAO,CA2BjE"}
|
package/dist/src/cli/program.js
CHANGED
|
@@ -42,6 +42,7 @@ export function buildProgram(deps = defaultDeps) {
|
|
|
42
42
|
.option("--timeout <ms>", "per-request timeout in milliseconds", parseIntArg)
|
|
43
43
|
.option("--user-agent <ua>", "User-Agent header value")
|
|
44
44
|
.option("--max-retries <n>", "retries for transient 429/503 responses", parseIntArg)
|
|
45
|
+
.option("--max-redirects <n>", "HTTP redirects to follow (0 = none; default 5)", parseIntArg)
|
|
45
46
|
.option("--max-response-bytes <n>", "cap response body size in bytes (0 = unlimited; default 100 MiB)", parseIntArg)
|
|
46
47
|
.option("--compact", "print JSON on a single line instead of pretty-printed")
|
|
47
48
|
.showHelpAfterError();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,4EAA4E;AAC5E,mBAAmB;AAEnB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;GAKG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC;QAC5F,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAErC,yEAAyE;AACzE,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,EAAE,EAAE,SAAS;IACb,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC;CAC5D,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,OAAgB,WAAW;IACtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,eAAe,CAAC;SACrB,WAAW,CACV,gDAAgD;QAC9C,kDAAkD,CACrD;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,gCAAgC,CAAC;SAC5E,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,EAAE,WAAW,CAAC;SAC5E,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,EAAE,WAAW,CAAC;SACnF,MAAM,CACL,0BAA0B,EAC1B,kEAAkE,EAClE,WAAW,CACZ;SACA,MAAM,CAAC,WAAW,EAAE,uDAAuD,CAAC;SAC5E,kBAAkB,EAAE,CAAC;IAExB,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,4EAA4E;AAC5E,mBAAmB;AAEnB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;GAKG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC;QAC5F,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAErC,yEAAyE;AACzE,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,EAAE,EAAE,SAAS;IACb,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC;CAC5D,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,OAAgB,WAAW;IACtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,eAAe,CAAC;SACrB,WAAW,CACV,gDAAgD;QAC9C,kDAAkD,CACrD;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,gCAAgC,CAAC;SAC5E,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,EAAE,WAAW,CAAC;SAC5E,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,EAAE,WAAW,CAAC;SACnF,MAAM,CAAC,qBAAqB,EAAE,gDAAgD,EAAE,WAAW,CAAC;SAC5F,MAAM,CACL,0BAA0B,EAC1B,kEAAkE,EAClE,WAAW,CACZ;SACA,MAAM,CAAC,WAAW,EAAE,uDAAuD,CAAC;SAC5E,kBAAkB,EAAE,CAAC;IAExB,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAiBvC,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,OAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAiBvC,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,OAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CtF"}
|
package/dist/src/cli/run.js
CHANGED
|
@@ -21,6 +21,25 @@ function configureTree(command, deps) {
|
|
|
21
21
|
export async function run(argv, deps = defaultDeps) {
|
|
22
22
|
const program = buildProgram(deps);
|
|
23
23
|
configureTree(program, deps);
|
|
24
|
+
// A no-subcommand invocation (`luftqualitaet`, `luftqualitaet --compact`) should
|
|
25
|
+
// print help to stdout and exit 0 — matching `--help` — rather than commander's
|
|
26
|
+
// default of help-to-stderr + exit 1, which contradicts the documented
|
|
27
|
+
// "help → exit 0" model and is a spurious failure for scripts building a
|
|
28
|
+
// possibly-empty command. Detect it by parsing only the options (which correctly
|
|
29
|
+
// consumes global-option values) on a throwaway program: empty `operands` with
|
|
30
|
+
// nothing left in `unknown` means no command and no help/version or unknown
|
|
31
|
+
// option. `--help`/`--version`/unknown options land in `unknown` and fall through
|
|
32
|
+
// to commander so it handles (and reports) them exactly as before.
|
|
33
|
+
try {
|
|
34
|
+
const probe = buildProgram(deps).parseOptions([...argv]);
|
|
35
|
+
if (probe.operands.length === 0 && probe.unknown.length === 0) {
|
|
36
|
+
deps.io.out(program.helpInformation().replace(/\n$/, ""));
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Option parsing hiccuped — fall through and let the real parse report it.
|
|
42
|
+
}
|
|
24
43
|
try {
|
|
25
44
|
await program.parseAsync(argv, { from: "user" });
|
|
26
45
|
return 0;
|
package/dist/src/cli/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAgB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAgB,EAAE,IAAa;IACpD,OAAO,CAAC,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,eAAe,CAAC;QACtB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;KACvD,CAAC,CAAC;IACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ;QAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,OAAgB,WAAW;IACnE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,2EAA2E;YAC3E,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,mEAAmE;YACnE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/shared.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/cli/shared.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAmB1D,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,CAAC,CAKH;AAED,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,CAIpE;AAED,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,CAI1E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/cli/shared.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAmB1D,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,CAAC,CAKH;AAED,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,CAIpE;AAED,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,CAI1E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CASpE;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGrF;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC;IACtB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,OAAO,EACb,EAAE,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/D,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAQvC"}
|
package/dist/src/cli/shared.js
CHANGED
|
@@ -113,6 +113,8 @@ export function toEngineOptions(global) {
|
|
|
113
113
|
options.userAgent = global.userAgent;
|
|
114
114
|
if (global.maxRetries !== undefined)
|
|
115
115
|
options.maxRetries = global.maxRetries;
|
|
116
|
+
if (global.maxRedirects !== undefined)
|
|
117
|
+
options.maxRedirects = global.maxRedirects;
|
|
116
118
|
if (global.maxResponseBytes !== undefined)
|
|
117
119
|
options.maxResponseBytes = global.maxResponseBytes;
|
|
118
120
|
return options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/cli/shared.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/cli/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/client/engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGhE,eAAO,MAAM,gBAAgB,mCAAmC,CAAC;AAGjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/client/engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGhE,eAAO,MAAM,gBAAgB,mCAAmC,CAAC;AAGjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AA4BD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAE1C,OAAO,GAAE,aAAkB;IAYvC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM;IAenD,6EAA6E;IACvE,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAmC,GAChF,OAAO,CAAC,WAAW,CAAC;IAmEvB,0DAA0D;IACpD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAU/D,OAAO,CAAC,UAAU;CAenB"}
|
|
@@ -3,10 +3,31 @@
|
|
|
3
3
|
// (429, 503), and decodes responses.
|
|
4
4
|
import { nodeHttpTransport } from "./http.js";
|
|
5
5
|
import { buildQueryString } from "./query.js";
|
|
6
|
-
import { LuftApiError, LuftParseError } from "./errors.js";
|
|
6
|
+
import { LuftApiError, LuftNetworkError, LuftParseError } from "./errors.js";
|
|
7
7
|
export const DEFAULT_BASE_URL = "https://www.umweltbundesamt.de";
|
|
8
8
|
const DEFAULT_USER_AGENT = "luftqualitaet-cli";
|
|
9
9
|
const DEFAULT_MAX_RESPONSE_BYTES = 100 * 1024 * 1024;
|
|
10
|
+
/**
|
|
11
|
+
* Strip control characters (all C0/C1 except tab and newline, plus DEL) out of a
|
|
12
|
+
* string that originates in an attacker-controlled response — the error detail
|
|
13
|
+
* and any echoed Content-Type. `JSON.parse` decodes a JSON string escape for the
|
|
14
|
+
* ESC code point in an error body into a real ESC byte, so without this a hostile
|
|
15
|
+
* or MITM'd endpoint could drive ANSI/OSC escape sequences into the user's
|
|
16
|
+
* terminal when the message is printed raw to stderr. The success path is already
|
|
17
|
+
* safe (`JSON.stringify`
|
|
18
|
+
* escapes these), so this only needs to cover text flowing into an error message.
|
|
19
|
+
*/
|
|
20
|
+
function sanitizeServerText(text) {
|
|
21
|
+
let out = "";
|
|
22
|
+
for (const ch of text) {
|
|
23
|
+
const n = ch.codePointAt(0) ?? 0;
|
|
24
|
+
// Keep tab (0x09) and newline (0x0a); drop the rest of C0, DEL, and C1.
|
|
25
|
+
if (n <= 8 || (n >= 0x0b && n <= 0x1f) || (n >= 0x7f && n <= 0x9f))
|
|
26
|
+
continue;
|
|
27
|
+
out += ch;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
10
31
|
const realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
32
|
export class RequestEngine {
|
|
12
33
|
baseUrl;
|
|
@@ -31,6 +52,16 @@ export class RequestEngine {
|
|
|
31
52
|
}
|
|
32
53
|
/** Build a fully-qualified URL from a path and optional query parameters. */
|
|
33
54
|
buildUrl(path, query) {
|
|
55
|
+
// Validate the base URL up front so a malformed `baseUrl` (e.g. a stray
|
|
56
|
+
// `--base-url notaurl`) yields a clear message naming the offending value,
|
|
57
|
+
// instead of an opaque "Invalid URL" that carries the full request path and
|
|
58
|
+
// reads as if the path were at fault.
|
|
59
|
+
try {
|
|
60
|
+
new URL(this.baseUrl);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
throw new LuftNetworkError(`Invalid base URL: ${JSON.stringify(this.baseUrl)}`);
|
|
64
|
+
}
|
|
34
65
|
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
|
|
35
66
|
const qs = query ? buildQueryString(query) : "";
|
|
36
67
|
return `${this.baseUrl}${normalizedPath}${qs ? `?${qs}` : ""}`;
|
|
@@ -64,7 +95,16 @@ export class RequestEngine {
|
|
|
64
95
|
if (status >= 300 && status < 400 && redirects < this.maxRedirects) {
|
|
65
96
|
const location = response.headers["location"];
|
|
66
97
|
if (typeof location === "string" && location.length > 0) {
|
|
67
|
-
|
|
98
|
+
// A hostile server can send an unparsable Location; wrap the parse so
|
|
99
|
+
// it surfaces as a typed LuftNetworkError (matchable by library
|
|
100
|
+
// consumers) rather than a raw TypeError reported as "Unexpected error".
|
|
101
|
+
let target;
|
|
102
|
+
try {
|
|
103
|
+
target = new URL(location, url);
|
|
104
|
+
}
|
|
105
|
+
catch (cause) {
|
|
106
|
+
throw new LuftNetworkError(`Invalid redirect Location ${JSON.stringify(location)} from ${url}`, { cause });
|
|
107
|
+
}
|
|
68
108
|
// Cross-origin redirect: strip request headers so any sensitive
|
|
69
109
|
// header (e.g. an Authorization/token added later) is never leaked to
|
|
70
110
|
// a different origin. Today only Accept/User-Agent are sent, so we
|
|
@@ -111,6 +151,10 @@ export class RequestEngine {
|
|
|
111
151
|
catch {
|
|
112
152
|
// Non-JSON error body; leave detail undefined.
|
|
113
153
|
}
|
|
154
|
+
// `detail` came from the response body; strip control characters so a hostile
|
|
155
|
+
// endpoint cannot inject terminal escape sequences via the stderr error message.
|
|
156
|
+
if (detail !== undefined)
|
|
157
|
+
detail = sanitizeServerText(detail);
|
|
114
158
|
return new LuftApiError({ status, url, method, body: text, detail });
|
|
115
159
|
}
|
|
116
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/client/engine.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,qCAAqC;AAErC,OAAO,EAAE,iBAAiB,EAAkB,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/client/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/client/http.ts"],"names":[],"mappings":"AAQA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/client/http.ts"],"names":[],"mappings":"AAQA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAoI5B,CAAC"}
|
package/dist/src/client/http.js
CHANGED
|
@@ -32,6 +32,20 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
32
32
|
const isHttps = url.protocol === "https:";
|
|
33
33
|
const driver = isHttps ? https : http;
|
|
34
34
|
const maxBytes = request.maxResponseBytes;
|
|
35
|
+
const timeoutMs = request.timeoutMs;
|
|
36
|
+
// Wall-clock deadline for the whole request. `req.setTimeout()` below is an
|
|
37
|
+
// *idle-socket* timeout that resets on every received byte, so a slow-drip
|
|
38
|
+
// server that sends one byte just under the idle window (and stays under
|
|
39
|
+
// maxResponseBytes) could keep the request alive indefinitely. A single fixed
|
|
40
|
+
// timer bounds the total time from request start to `end`, independent of the
|
|
41
|
+
// byte cadence.
|
|
42
|
+
let deadline;
|
|
43
|
+
const clearDeadline = () => {
|
|
44
|
+
if (deadline !== undefined) {
|
|
45
|
+
clearTimeout(deadline);
|
|
46
|
+
deadline = undefined;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
35
49
|
const req = driver.request(url, {
|
|
36
50
|
method: request.method,
|
|
37
51
|
headers: request.headers,
|
|
@@ -45,6 +59,7 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
45
59
|
received += chunk.length;
|
|
46
60
|
if (maxBytes !== undefined && received > maxBytes) {
|
|
47
61
|
aborted = true;
|
|
62
|
+
clearDeadline();
|
|
48
63
|
res.destroy();
|
|
49
64
|
reject(new LuftNetworkError(`Response exceeded maxResponseBytes (${maxBytes})`));
|
|
50
65
|
return;
|
|
@@ -54,6 +69,7 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
54
69
|
res.on("end", () => {
|
|
55
70
|
if (aborted)
|
|
56
71
|
return;
|
|
72
|
+
clearDeadline();
|
|
57
73
|
resolve({
|
|
58
74
|
status: res.statusCode ?? 0,
|
|
59
75
|
headers: res.headers,
|
|
@@ -63,6 +79,7 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
63
79
|
res.on("error", (err) => {
|
|
64
80
|
if (aborted)
|
|
65
81
|
return; // we already rejected with the size-cap error
|
|
82
|
+
clearDeadline();
|
|
66
83
|
reject(new LuftNetworkError(`Response stream error: ${err.message}`, { cause: err }));
|
|
67
84
|
});
|
|
68
85
|
});
|
|
@@ -84,10 +101,12 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
84
101
|
connected = true;
|
|
85
102
|
});
|
|
86
103
|
});
|
|
87
|
-
if (
|
|
88
|
-
|
|
104
|
+
if (timeoutMs && timeoutMs > 0) {
|
|
105
|
+
// Idle-socket timeout (resets on activity). Reports the true failure phase
|
|
106
|
+
// (connected timeout vs. DNS/connect failure) as before.
|
|
107
|
+
req.setTimeout(timeoutMs, () => {
|
|
89
108
|
if (connected) {
|
|
90
|
-
req.destroy(new LuftNetworkError(`Request timed out after ${
|
|
109
|
+
req.destroy(new LuftNetworkError(`Request timed out after ${timeoutMs}ms`));
|
|
91
110
|
}
|
|
92
111
|
else if (dnsError) {
|
|
93
112
|
// DNS resolution already failed; report that, not a timeout.
|
|
@@ -96,11 +115,20 @@ export const nodeHttpTransport = (request) => new Promise((resolve, reject) => {
|
|
|
96
115
|
else {
|
|
97
116
|
// Still in the connect/DNS phase with no socket yet. Attribute the
|
|
98
117
|
// failure to that phase rather than claiming a generic request timeout.
|
|
99
|
-
req.destroy(new LuftNetworkError(`Could not connect to ${url.host} within ${
|
|
118
|
+
req.destroy(new LuftNetworkError(`Could not connect to ${url.host} within ${timeoutMs}ms (host unresolved or unreachable)`));
|
|
100
119
|
}
|
|
101
120
|
});
|
|
121
|
+
// ...plus a hard wall-clock deadline that does *not* reset on activity, so a
|
|
122
|
+
// slow drip cannot outlast the caller's timeout budget (see LQ-02). This
|
|
123
|
+
// bounds total time; maxResponseBytes bounds total size.
|
|
124
|
+
deadline = setTimeout(() => {
|
|
125
|
+
req.destroy(new LuftNetworkError(`Request exceeded the ${timeoutMs}ms deadline`));
|
|
126
|
+
}, timeoutMs);
|
|
127
|
+
// Don't let the deadline timer keep the event loop alive on its own.
|
|
128
|
+
deadline.unref?.();
|
|
102
129
|
}
|
|
103
130
|
req.on("error", (err) => {
|
|
131
|
+
clearDeadline();
|
|
104
132
|
// A timeout destroy already passes an LuftNetworkError; don't double-wrap.
|
|
105
133
|
reject(err instanceof LuftNetworkError ? err : new LuftNetworkError(err.message, { cause: err }));
|
|
106
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/client/http.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,iDAAiD;AACjD,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,yCAAyC;AAEzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuB/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAc,CAAC,OAAO,EAAE,EAAE,CACtD,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC5C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,2DAA2D;IAC3D,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,gBAAgB,CAAC,yBAAyB,GAAG,CAAC,QAAQ,aAAa,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/client/http.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED