@usa-open-data-connectors/usa-sources 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +339 -0
- package/dist/blsSeries.d.ts +73 -0
- package/dist/blsSeries.d.ts.map +1 -0
- package/dist/blsSeries.js +173 -0
- package/dist/blsSeries.js.map +1 -0
- package/dist/cdcCountyObesity.d.ts +116 -0
- package/dist/cdcCountyObesity.d.ts.map +1 -0
- package/dist/cdcCountyObesity.js +180 -0
- package/dist/cdcCountyObesity.js.map +1 -0
- package/dist/cfpbConsumerComplaints.d.ts +152 -0
- package/dist/cfpbConsumerComplaints.d.ts.map +1 -0
- package/dist/cfpbConsumerComplaints.js +273 -0
- package/dist/cfpbConsumerComplaints.js.map +1 -0
- package/dist/cpscProductRecalls.d.ts +146 -0
- package/dist/cpscProductRecalls.d.ts.map +1 -0
- package/dist/cpscProductRecalls.js +298 -0
- package/dist/cpscProductRecalls.js.map +1 -0
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/femaDisasterDeclarations.d.ts +123 -0
- package/dist/femaDisasterDeclarations.d.ts.map +1 -0
- package/dist/femaDisasterDeclarations.js +214 -0
- package/dist/femaDisasterDeclarations.js.map +1 -0
- package/dist/fixtures.d.ts +5 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +11 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/nceiAnnualTemperature.d.ts +92 -0
- package/dist/nceiAnnualTemperature.d.ts.map +1 -0
- package/dist/nceiAnnualTemperature.js +158 -0
- package/dist/nceiAnnualTemperature.js.map +1 -0
- package/dist/noaaSeaLevel.d.ts +144 -0
- package/dist/noaaSeaLevel.d.ts.map +1 -0
- package/dist/noaaSeaLevel.js +252 -0
- package/dist/noaaSeaLevel.js.map +1 -0
- package/dist/openFdaFoodRecalls.d.ts +154 -0
- package/dist/openFdaFoodRecalls.d.ts.map +1 -0
- package/dist/openFdaFoodRecalls.js +293 -0
- package/dist/openFdaFoodRecalls.js.map +1 -0
- package/dist/registry.d.ts +28 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +79 -0
- package/dist/registry.js.map +1 -0
- package/dist/treasuryAvgInterestRate.d.ts +107 -0
- package/dist/treasuryAvgInterestRate.d.ts.map +1 -0
- package/dist/treasuryAvgInterestRate.js +191 -0
- package/dist/treasuryAvgInterestRate.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usgsEarthquakes.d.ts +108 -0
- package/dist/usgsEarthquakes.d.ts.map +1 -0
- package/dist/usgsEarthquakes.js +199 -0
- package/dist/usgsEarthquakes.js.map +1 -0
- package/dist/usgsPeakStreamflow.d.ts +116 -0
- package/dist/usgsPeakStreamflow.d.ts.map +1 -0
- package/dist/usgsPeakStreamflow.js +211 -0
- package/dist/usgsPeakStreamflow.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
3
|
+
import { readFixtureJson } from './fixtures.js';
|
|
4
|
+
/** Base URL for the OpenFEMA API. */
|
|
5
|
+
export const FEMA_OPEN_DATA_API_BASE = 'https://www.fema.gov/api/open/v1';
|
|
6
|
+
/** Dataset path for the web disaster declarations file. */
|
|
7
|
+
export const FEMA_DECLARATION_PATH = '/FemaWebDisasterDeclarations';
|
|
8
|
+
/**
|
|
9
|
+
* Row cap for one request.
|
|
10
|
+
*
|
|
11
|
+
* The file carries a little over five thousand declarations from 1953 on,
|
|
12
|
+
* so one request covers it and the adapter never pages. A file that outgrows
|
|
13
|
+
* the cap is caught by the parser rather than silently truncated.
|
|
14
|
+
*/
|
|
15
|
+
export const FEMA_DECLARATION_ROW_LIMIT = 10_000;
|
|
16
|
+
/**
|
|
17
|
+
* Incident type the file uses for wildfire declarations.
|
|
18
|
+
*
|
|
19
|
+
* Fires arrive under several declaration programs (Fire Management, Fire
|
|
20
|
+
* Suppression, and occasionally Major Disaster), so the incident type is what
|
|
21
|
+
* the adapter counts rather than the program.
|
|
22
|
+
*/
|
|
23
|
+
export const FEMA_FIRE_INCIDENT_TYPE = 'Fire';
|
|
24
|
+
/** Columns the adapter asks for. The dataset carries about twenty more. */
|
|
25
|
+
const FEMA_DECLARATION_COLUMNS = 'disasterNumber,declarationDate,declarationType,incidentType,stateCode,stateName';
|
|
26
|
+
/** Committed snapshot, so a build works when the FEMA host is unreachable. */
|
|
27
|
+
const FEMA_DECLARATION_FIXTURE_FILENAME = 'fema-disaster-declarations-2026-09-29.json';
|
|
28
|
+
/** Shape of the agency's declaration date, e.g. "2026-09-15T00:00:00.000Z". */
|
|
29
|
+
const ISO_DATE_PATTERN = /^(\d{4})-\d{2}-\d{2}/;
|
|
30
|
+
// Every field arrives as a string, and a row the agency could not complete
|
|
31
|
+
// arrives with the field missing. A rejected request answers with HTTP 400
|
|
32
|
+
// and a body of {error: [{code, type, message}]} instead of the data.
|
|
33
|
+
const FEMA_ROW_SCHEMA = z.object({
|
|
34
|
+
disasterNumber: z.number().optional(),
|
|
35
|
+
declarationDate: z.string().optional(),
|
|
36
|
+
declarationType: z.string().optional(),
|
|
37
|
+
incidentType: z.string().optional(),
|
|
38
|
+
stateCode: z.string().optional(),
|
|
39
|
+
stateName: z.string().optional(),
|
|
40
|
+
});
|
|
41
|
+
const FEMA_ERROR_SCHEMA = z.object({
|
|
42
|
+
name: z.string().optional(),
|
|
43
|
+
code: z.string().optional(),
|
|
44
|
+
type: z.string().optional(),
|
|
45
|
+
message: z.string().optional(),
|
|
46
|
+
});
|
|
47
|
+
const FEMA_PAYLOAD_SCHEMA = z.object({
|
|
48
|
+
metadata: z.object({ count: z.number().optional() }).optional(),
|
|
49
|
+
FemaWebDisasterDeclarations: z.array(FEMA_ROW_SCHEMA).optional(),
|
|
50
|
+
error: z.array(FEMA_ERROR_SCHEMA).optional(),
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Builds the request URL for the whole declaration file.
|
|
54
|
+
*
|
|
55
|
+
* The endpoint is keyless. The row cap is high enough that one request
|
|
56
|
+
* covers the file, and the inline count lets the parser tell a complete
|
|
57
|
+
* response from a truncated one.
|
|
58
|
+
*
|
|
59
|
+
* @param options - an optional row cap
|
|
60
|
+
* @returns the full request URL
|
|
61
|
+
*/
|
|
62
|
+
export function buildFemaDeclarationUrl(options) {
|
|
63
|
+
const params = new URLSearchParams({
|
|
64
|
+
$select: FEMA_DECLARATION_COLUMNS,
|
|
65
|
+
$orderby: 'disasterNumber',
|
|
66
|
+
$inlinecount: 'allpages',
|
|
67
|
+
$top: String(options?.rowLimit ?? FEMA_DECLARATION_ROW_LIMIT),
|
|
68
|
+
});
|
|
69
|
+
return `${FEMA_OPEN_DATA_API_BASE}${FEMA_DECLARATION_PATH}?${params.toString()}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parses one response into the declarations it carries.
|
|
73
|
+
*
|
|
74
|
+
* A row without the fields the story reads stops the parse, so a changed
|
|
75
|
+
* response shape cannot quietly produce a half-empty file. A response whose
|
|
76
|
+
* row count falls short of the agency's own count means the file has outgrown
|
|
77
|
+
* the request and is also refused, rather than truncated.
|
|
78
|
+
*
|
|
79
|
+
* @param payload - the JSON body from the OpenFEMA API
|
|
80
|
+
* @returns the declarations, in the order the agency sent them
|
|
81
|
+
*/
|
|
82
|
+
export function parseFemaDeclarationPayload(payload) {
|
|
83
|
+
const parsed = FEMA_PAYLOAD_SCHEMA.safeParse(payload);
|
|
84
|
+
if (!parsed.success) {
|
|
85
|
+
throw new UsSourceParseError('fema', parsed.error.message);
|
|
86
|
+
}
|
|
87
|
+
const firstError = parsed.data.error?.[0];
|
|
88
|
+
if (firstError !== undefined) {
|
|
89
|
+
throw new UsSourceApiError('fema', `${firstError.type ?? 'error'}: ${firstError.message ?? firstError.code ?? 'rejected'}`);
|
|
90
|
+
}
|
|
91
|
+
const rows = parsed.data.FemaWebDisasterDeclarations ?? [];
|
|
92
|
+
if (rows.length === 0) {
|
|
93
|
+
throw new UsSourceParseError('fema', 'The response carried no declarations');
|
|
94
|
+
}
|
|
95
|
+
const reportedCount = parsed.data.metadata?.count;
|
|
96
|
+
if (reportedCount !== undefined && reportedCount > rows.length) {
|
|
97
|
+
throw new UsSourceParseError('fema', `The file holds ${String(reportedCount)} declarations and the request returned ${String(rows.length)}`);
|
|
98
|
+
}
|
|
99
|
+
const declarations = [];
|
|
100
|
+
for (const row of rows) {
|
|
101
|
+
const { disasterNumber, declarationDate, declarationType, incidentType } = row;
|
|
102
|
+
if (disasterNumber === undefined ||
|
|
103
|
+
declarationDate === undefined ||
|
|
104
|
+
declarationType === undefined ||
|
|
105
|
+
incidentType === undefined ||
|
|
106
|
+
row.stateCode === undefined ||
|
|
107
|
+
row.stateName === undefined) {
|
|
108
|
+
throw new UsSourceParseError('fema', `A declaration row is missing a field: ${JSON.stringify(row)}`);
|
|
109
|
+
}
|
|
110
|
+
const match = ISO_DATE_PATTERN.exec(declarationDate);
|
|
111
|
+
if (match === null) {
|
|
112
|
+
throw new UsSourceParseError('fema', `Unreadable declaration date: ${declarationDate}`);
|
|
113
|
+
}
|
|
114
|
+
declarations.push({
|
|
115
|
+
disasterNumber,
|
|
116
|
+
declarationDate,
|
|
117
|
+
year: Number(match[1]),
|
|
118
|
+
declarationType,
|
|
119
|
+
incidentType,
|
|
120
|
+
stateCode: row.stateCode,
|
|
121
|
+
stateName: row.stateName,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return declarations;
|
|
125
|
+
}
|
|
126
|
+
/** Counts how often each value of a field appears, most first then by name. */
|
|
127
|
+
function countBy(declarations, pick) {
|
|
128
|
+
const counts = new Map();
|
|
129
|
+
for (const declaration of declarations) {
|
|
130
|
+
const key = pick(declaration);
|
|
131
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
132
|
+
}
|
|
133
|
+
return [...counts.entries()]
|
|
134
|
+
.map(([name, count]) => ({ name, count }))
|
|
135
|
+
.sort((left, right) => right.count - left.count || left.name.localeCompare(right.name));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Folds the parsed file into the per-year and per-value counts a story reads.
|
|
139
|
+
*
|
|
140
|
+
* The years run from the oldest declaration in the file to the newest, and
|
|
141
|
+
* the newest one is a partial year whenever the current year is still open.
|
|
142
|
+
*
|
|
143
|
+
* @param declarations - the parsed declarations, in any order
|
|
144
|
+
* @returns the per-year counts, the busiest year, and the value counts
|
|
145
|
+
*/
|
|
146
|
+
export function buildFemaDeclarationCatalogue(declarations) {
|
|
147
|
+
if (declarations.length === 0) {
|
|
148
|
+
throw new UsSourceParseError('fema', 'No declarations to summarise');
|
|
149
|
+
}
|
|
150
|
+
const sorted = [...declarations].sort((left, right) => left.year - right.year);
|
|
151
|
+
const first = sorted[0];
|
|
152
|
+
const last = sorted[sorted.length - 1];
|
|
153
|
+
if (first === undefined || last === undefined) {
|
|
154
|
+
throw new UsSourceParseError('fema', 'No declarations to summarise');
|
|
155
|
+
}
|
|
156
|
+
const yearTotals = new Map();
|
|
157
|
+
for (const declaration of sorted) {
|
|
158
|
+
const entry = yearTotals.get(declaration.year) ?? {
|
|
159
|
+
year: declaration.year,
|
|
160
|
+
total: 0,
|
|
161
|
+
fire: 0,
|
|
162
|
+
};
|
|
163
|
+
entry.total += 1;
|
|
164
|
+
if (declaration.incidentType === FEMA_FIRE_INCIDENT_TYPE) {
|
|
165
|
+
entry.fire += 1;
|
|
166
|
+
}
|
|
167
|
+
yearTotals.set(declaration.year, entry);
|
|
168
|
+
}
|
|
169
|
+
const years = [...yearTotals.values()].sort((left, right) => left.year - right.year);
|
|
170
|
+
const busiestYear = years.reduce((busiest, year) => year.total > busiest.total ? year : busiest);
|
|
171
|
+
const fireDeclarations = sorted.filter((declaration) => declaration.incidentType === FEMA_FIRE_INCIDENT_TYPE);
|
|
172
|
+
return {
|
|
173
|
+
declarations: sorted,
|
|
174
|
+
declarationCount: sorted.length,
|
|
175
|
+
firstYear: first.year,
|
|
176
|
+
newestYear: last.year,
|
|
177
|
+
years,
|
|
178
|
+
busiestYear,
|
|
179
|
+
fireCount: fireDeclarations.length,
|
|
180
|
+
firstFireYear: fireDeclarations[0]?.year ?? first.year,
|
|
181
|
+
incidentTypes: countBy(sorted, (declaration) => declaration.incidentType),
|
|
182
|
+
declarationTypes: countBy(sorted, (declaration) => declaration.declarationType),
|
|
183
|
+
topStates: countBy(sorted, (declaration) => declaration.stateCode),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Reads the OpenFEMA disaster declaration file.
|
|
188
|
+
*
|
|
189
|
+
* One keyless request covers the whole file, from the 1953 declarations to
|
|
190
|
+
* the newest one the agency has published.
|
|
191
|
+
*
|
|
192
|
+
* @param options - an optional row cap and fetch stub
|
|
193
|
+
* @returns the declarations and the counts the story reads
|
|
194
|
+
*/
|
|
195
|
+
export async function fetchFemaDeclarations(options) {
|
|
196
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
197
|
+
const url = buildFemaDeclarationUrl(options?.rowLimit === undefined ? {} : { rowLimit: options.rowLimit });
|
|
198
|
+
const response = await fetchImpl(url);
|
|
199
|
+
if (!response.ok) {
|
|
200
|
+
throw new UsSourceApiError('fema', `HTTP ${response.status} reading the declaration file`);
|
|
201
|
+
}
|
|
202
|
+
return buildFemaDeclarationCatalogue(parseFemaDeclarationPayload(await response.json()));
|
|
203
|
+
}
|
|
204
|
+
/** FEMA disaster declarations, keyless. */
|
|
205
|
+
export const femaDisasterDeclarationsAdapter = {
|
|
206
|
+
id: 'fema-disaster-declarations',
|
|
207
|
+
name: 'FEMA disaster declarations',
|
|
208
|
+
auth: 'none',
|
|
209
|
+
description: 'Every disaster declaration FEMA has published, one row per declaration, from 1953 to the newest declaration.',
|
|
210
|
+
fetchLive: async (options) => fetchFemaDeclarations(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
211
|
+
parse: (payload) => buildFemaDeclarationCatalogue(parseFemaDeclarationPayload(payload)),
|
|
212
|
+
loadFixture: () => buildFemaDeclarationCatalogue(parseFemaDeclarationPayload(readFixtureJson(FEMA_DECLARATION_FIXTURE_FILENAME))),
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=femaDisasterDeclarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"femaDisasterDeclarations.js","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Reads a committed fixture from src/fixtures as parsed JSON. */
|
|
2
|
+
export declare function readFixtureJson(filename: string): unknown;
|
|
3
|
+
/** Reads a committed fixture from src/fixtures as raw text. */
|
|
4
|
+
export declare function readFixtureText(filename: string): string;
|
|
5
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAGA,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
package/dist/fixtures.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/** Reads a committed fixture from src/fixtures as parsed JSON. */
|
|
4
|
+
export function readFixtureJson(filename) {
|
|
5
|
+
return JSON.parse(readFileSync(path.join(process.cwd(), 'src/fixtures', filename), 'utf8'));
|
|
6
|
+
}
|
|
7
|
+
/** Reads a committed fixture from src/fixtures as raw text. */
|
|
8
|
+
export function readFixtureText(filename) {
|
|
9
|
+
return readFileSync(path.join(process.cwd(), 'src/fixtures', filename), 'utf8');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Errors shared by every US source adapter. */
|
|
2
|
+
export { UsSourceApiError, UsSourceError, UsSourceParseError } from './errors.js';
|
|
3
|
+
/** Bureau of Labor Statistics time series (keyless). */
|
|
4
|
+
export { BLS_API_BASE, BLS_MAX_YEARS_PER_REQUEST, blsUnemploymentAdapter, buildBlsSeries, fetchBlsSeries, parseBlsObservations, US_UNEMPLOYMENT_SERIES_ID, US_UNEMPLOYMENT_SERIES_LABEL, } from './blsSeries.js';
|
|
5
|
+
/** BLS series types. */
|
|
6
|
+
export type { BlsObservation, BlsSeries } from './blsSeries.js';
|
|
7
|
+
/** USGS earthquake catalogue (keyless). */
|
|
8
|
+
export { buildUsgsEarthquakeCatalogue, buildUsgsEarthquakeUrl, fetchUsgsEarthquakes, parseUsgsEarthquakes, sortEarthquakesOldestFirst, USGS_EARTHQUAKE_API_BASE, USGS_HAWAII_BOUNDS, USGS_HAWAII_MIN_MAGNITUDE, USGS_ROLLING_WINDOW_DAYS, usgsHawaiiEarthquakesAdapter, usgsHawaiiRollingWindow, } from './usgsEarthquakes.js';
|
|
9
|
+
/** USGS earthquake types. */
|
|
10
|
+
export type { UsgsEarthquake, UsgsEarthquakeBounds, UsgsEarthquakeCatalogue, UsgsEarthquakeQuery, } from './usgsEarthquakes.js';
|
|
11
|
+
/** CDC PLACES county obesity estimates (keyless). */
|
|
12
|
+
export { buildCdcCountyObesitySet, buildCdcCountyObesityUrl, cdcCountyObesityAdapter, CDC_PLACES_COUNTY_API_BASE, CDC_PLACES_COUNTY_ROW_LIMIT, CDC_PLACES_CRUDE_PREVALENCE_ID, CDC_PLACES_NATIONAL_STATE_CODE, CDC_PLACES_OBESITY_MEASURE_ID, fetchCdcCountyObesity, parseCdcCountyObesityPayload, sortCdcCountiesByPercent, } from './cdcCountyObesity.js';
|
|
13
|
+
/** CDC PLACES county obesity types. */
|
|
14
|
+
export type { CdcCountyObesityEstimate, CdcCountyObesityPayload, CdcCountyObesitySet, CdcNationalObesityEstimate, } from './cdcCountyObesity.js';
|
|
15
|
+
/** NOAA NCEI contiguous US annual average temperature (keyless). */
|
|
16
|
+
export { buildNceiAnnualTemperatureSeries, buildNceiAnnualTemperatureUrl, fetchNceiAnnualTemperature, NCEI_ANNUAL_WINDOW_MONTHS, NCEI_AVERAGE_TEMPERATURE_PARAMETER_ID, NCEI_CLIMATE_AT_A_GLANCE_BASE, NCEI_CONTIGUOUS_US_REGION_ID, NCEI_FIRST_RECORD_YEAR, nceiAnnualTemperatureAdapter, parseNceiAnnualTemperatureCsv, } from './nceiAnnualTemperature';
|
|
17
|
+
/** NOAA NCEI temperature types. */
|
|
18
|
+
export type { NceiTemperatureQuery, NceiTemperatureSeries, NceiTemperatureYear, } from './nceiAnnualTemperature';
|
|
19
|
+
/** NOAA CO-OPS monthly mean sea level at a tide gauge (keyless). */
|
|
20
|
+
export { buildNoaaSeaLevelSeries, buildNoaaSeaLevelUrl, fetchNoaaSeaLevel, noaaSeaLevelAdapter, noaaSeaLevelTrendMillimetresPerYear, NOAA_BATTERY_STATION_ID, NOAA_BATTERY_STATION_NAME, NOAA_COOPS_API_BASE, NOAA_SEA_LEVEL_APPLICATION_ID, NOAA_SEA_LEVEL_DATUM, NOAA_SEA_LEVEL_FIRST_YEAR, NOAA_SEA_LEVEL_PRODUCT, NOAA_SEA_LEVEL_UNITS, parseNoaaSeaLevelPayload, } from './noaaSeaLevel';
|
|
21
|
+
/** NOAA CO-OPS sea level types. */
|
|
22
|
+
export type { NoaaSeaLevelMonth, NoaaSeaLevelPayload, NoaaSeaLevelQuery, NoaaSeaLevelSeries, NoaaSeaLevelStation, NoaaSeaLevelYear, } from './noaaSeaLevel';
|
|
23
|
+
/** The uniform adapter registry and probe helpers. */
|
|
24
|
+
export { US_DATA_SOURCES, getUsDataSource, probeAllUsDataSources, probeUsDataSource, } from './registry.js';
|
|
25
|
+
/** US Treasury average interest rate on the debt outstanding (keyless). */
|
|
26
|
+
export { buildTreasuryAvgInterestRateSeries, buildTreasuryAvgInterestRateUrl, fetchTreasuryAvgInterestRates, parseTreasuryAvgInterestRatePayload, treasuryAvgInterestRateAdapter, TREASURY_AVG_INTEREST_RATE_FIRST_YEAR, TREASURY_AVG_INTEREST_RATE_PATH, TREASURY_AVG_INTEREST_RATE_ROW_LIMIT, TREASURY_AVG_INTEREST_RATE_SECURITY_DESCRIPTION, TREASURY_AVG_INTEREST_RATE_SECURITY_TYPE, TREASURY_FISCAL_DATA_API_BASE, } from './treasuryAvgInterestRate.js';
|
|
27
|
+
/** Treasury interest rate types. */
|
|
28
|
+
export type { TreasuryInterestRateMonth, TreasuryInterestRateSeries, } from './treasuryAvgInterestRate.js';
|
|
29
|
+
/** FEMA disaster declarations (keyless). */
|
|
30
|
+
export { buildFemaDeclarationCatalogue, buildFemaDeclarationUrl, femaDisasterDeclarationsAdapter, fetchFemaDeclarations, FEMA_DECLARATION_PATH, FEMA_DECLARATION_ROW_LIMIT, FEMA_FIRE_INCIDENT_TYPE, FEMA_OPEN_DATA_API_BASE, parseFemaDeclarationPayload, } from './femaDisasterDeclarations.js';
|
|
31
|
+
/** FEMA declaration types. */
|
|
32
|
+
export type { FemaDeclaration, FemaDeclarationCatalogue, FemaDeclarationCount, FemaDeclarationYear, } from './femaDisasterDeclarations.js';
|
|
33
|
+
/** openFDA food enforcement reports (keyless). */
|
|
34
|
+
export { buildOpenFdaFoodRecallCountUrl, buildOpenFdaFoodRecallSummary, buildOpenFdaFoodRecallTotalUrl, fetchOpenFdaFoodRecalls, openFdaFoodRecallsAdapter, openFdaReportDateLabel, OPENFDA_CLASSIFICATION_COUNT_FIELD, OPENFDA_CLASS_ONE, OPENFDA_FOOD_ENFORCEMENT_BASE, OPENFDA_MANDATED_TERM, OPENFDA_REPORT_DATE_FIELD, OPENFDA_VOLUNTARY_COUNT_FIELD, OPENFDA_VOLUNTARY_TERM, parseOpenFdaFoodRecallSnapshot, parseOpenFdaRecallCounts, parseOpenFdaRecallDateCounts, parseOpenFdaRecallTotal, } from './openFdaFoodRecalls.js';
|
|
35
|
+
/** openFDA food recall types. */
|
|
36
|
+
export type { OpenFdaFoodRecallSnapshot, OpenFdaFoodRecallSummary, OpenFdaFoodRecallYear, OpenFdaRecallCount, OpenFdaRecallDateCount, } from './openFdaFoodRecalls.js';
|
|
37
|
+
/** USGS annual peak streamflow at a gauge (keyless). */
|
|
38
|
+
export { buildUsgsPeakStreamflowSeries, buildUsgsPeakStreamflowUrl, fetchUsgsPeakStreamflow, parseUsgsPeakStreamflowPayload, USGS_DISCHARGE_PARAMETER_CODE, USGS_MISSISSIPPI_ST_LOUIS_LOCATION_ID, USGS_MISSISSIPPI_ST_LOUIS_LOCATION_NAME, USGS_PEAK_STREAMFLOW_COLLECTION, USGS_PEAK_STREAMFLOW_FIRST_WATER_YEAR, USGS_PEAK_STREAMFLOW_ROW_LIMIT, USGS_WATER_DATA_API_BASE, usgsPeakStreamflowAdapter, } from './usgsPeakStreamflow.js';
|
|
39
|
+
/** USGS peak-streamflow types. */
|
|
40
|
+
export type { UsgsPeakStreamflowSeries, UsgsPeakStreamflowYear } from './usgsPeakStreamflow.js';
|
|
41
|
+
/** CPSC consumer product recalls (keyless). */
|
|
42
|
+
export { buildCpscProductRecallSeries, buildCpscRecallUrl, CPSC_ERROR_RECALL_ID, CPSC_RECALL_API_BASE, CPSC_RECALL_FIRST_YEAR, cpscProductRecallsAdapter, fetchCpscProductRecalls, parseCpscRecallPayload, parseCpscRecallSnapshot, } from './cpscProductRecalls.js';
|
|
43
|
+
/** CPSC product recall types. */
|
|
44
|
+
export type { CpscManufacturerCountryCount, CpscProductRecall, CpscProductRecallSeries, CpscRemedyOptionCount, CpscRecallWindow, CpscRecallYearCount, } from './cpscProductRecalls.js';
|
|
45
|
+
/** CFPB Consumer Complaint Database (keyless). */
|
|
46
|
+
export { buildCfpComplaintAggregationUrl, buildCfpComplaintCountUrl, buildCfpComplaintDayUrl, buildCfpConsumerComplaintSeries, CFPB_COMPLAINT_FIRST_YEAR, CFPB_COMPLAINT_SEARCH_API_BASE, CFPB_NEWEST_DATE_PROBE_DAYS, CFPB_TOP_LIST_LIMIT, cfpbConsumerComplaintsAdapter, fetchCfpConsumerComplaints, findNewestCfpComplaintDate, parseCfpComplaintAggregations, parseCfpComplaintSnapshot, parseCfpComplaintTotal, } from './cfpbConsumerComplaints.js';
|
|
47
|
+
/** CFPB complaint types. */
|
|
48
|
+
export type { CfpComplaintCompanyCount, CfpComplaintProductCount, CfpComplaintYearCount, CfpConsumerComplaintSeries, } from './cfpbConsumerComplaints.js';
|
|
49
|
+
/** Shared adapter contract types. */
|
|
50
|
+
export type { UsDataAdapter, UsFetchOptions, UsSourceAuth, UsSourceProbe } from './types.js';
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Errors shared by every US source adapter. */
|
|
2
|
+
export { UsSourceApiError, UsSourceError, UsSourceParseError } from './errors.js';
|
|
3
|
+
/** Bureau of Labor Statistics time series (keyless). */
|
|
4
|
+
export { BLS_API_BASE, BLS_MAX_YEARS_PER_REQUEST, blsUnemploymentAdapter, buildBlsSeries, fetchBlsSeries, parseBlsObservations, US_UNEMPLOYMENT_SERIES_ID, US_UNEMPLOYMENT_SERIES_LABEL, } from './blsSeries.js';
|
|
5
|
+
/** USGS earthquake catalogue (keyless). */
|
|
6
|
+
export { buildUsgsEarthquakeCatalogue, buildUsgsEarthquakeUrl, fetchUsgsEarthquakes, parseUsgsEarthquakes, sortEarthquakesOldestFirst, USGS_EARTHQUAKE_API_BASE, USGS_HAWAII_BOUNDS, USGS_HAWAII_MIN_MAGNITUDE, USGS_ROLLING_WINDOW_DAYS, usgsHawaiiEarthquakesAdapter, usgsHawaiiRollingWindow, } from './usgsEarthquakes.js';
|
|
7
|
+
/** CDC PLACES county obesity estimates (keyless). */
|
|
8
|
+
export { buildCdcCountyObesitySet, buildCdcCountyObesityUrl, cdcCountyObesityAdapter, CDC_PLACES_COUNTY_API_BASE, CDC_PLACES_COUNTY_ROW_LIMIT, CDC_PLACES_CRUDE_PREVALENCE_ID, CDC_PLACES_NATIONAL_STATE_CODE, CDC_PLACES_OBESITY_MEASURE_ID, fetchCdcCountyObesity, parseCdcCountyObesityPayload, sortCdcCountiesByPercent, } from './cdcCountyObesity.js';
|
|
9
|
+
/** NOAA NCEI contiguous US annual average temperature (keyless). */
|
|
10
|
+
export { buildNceiAnnualTemperatureSeries, buildNceiAnnualTemperatureUrl, fetchNceiAnnualTemperature, NCEI_ANNUAL_WINDOW_MONTHS, NCEI_AVERAGE_TEMPERATURE_PARAMETER_ID, NCEI_CLIMATE_AT_A_GLANCE_BASE, NCEI_CONTIGUOUS_US_REGION_ID, NCEI_FIRST_RECORD_YEAR, nceiAnnualTemperatureAdapter, parseNceiAnnualTemperatureCsv, } from './nceiAnnualTemperature';
|
|
11
|
+
/** NOAA CO-OPS monthly mean sea level at a tide gauge (keyless). */
|
|
12
|
+
export { buildNoaaSeaLevelSeries, buildNoaaSeaLevelUrl, fetchNoaaSeaLevel, noaaSeaLevelAdapter, noaaSeaLevelTrendMillimetresPerYear, NOAA_BATTERY_STATION_ID, NOAA_BATTERY_STATION_NAME, NOAA_COOPS_API_BASE, NOAA_SEA_LEVEL_APPLICATION_ID, NOAA_SEA_LEVEL_DATUM, NOAA_SEA_LEVEL_FIRST_YEAR, NOAA_SEA_LEVEL_PRODUCT, NOAA_SEA_LEVEL_UNITS, parseNoaaSeaLevelPayload, } from './noaaSeaLevel';
|
|
13
|
+
/** The uniform adapter registry and probe helpers. */
|
|
14
|
+
export { US_DATA_SOURCES, getUsDataSource, probeAllUsDataSources, probeUsDataSource, } from './registry.js';
|
|
15
|
+
/** US Treasury average interest rate on the debt outstanding (keyless). */
|
|
16
|
+
export { buildTreasuryAvgInterestRateSeries, buildTreasuryAvgInterestRateUrl, fetchTreasuryAvgInterestRates, parseTreasuryAvgInterestRatePayload, treasuryAvgInterestRateAdapter, TREASURY_AVG_INTEREST_RATE_FIRST_YEAR, TREASURY_AVG_INTEREST_RATE_PATH, TREASURY_AVG_INTEREST_RATE_ROW_LIMIT, TREASURY_AVG_INTEREST_RATE_SECURITY_DESCRIPTION, TREASURY_AVG_INTEREST_RATE_SECURITY_TYPE, TREASURY_FISCAL_DATA_API_BASE, } from './treasuryAvgInterestRate.js';
|
|
17
|
+
/** FEMA disaster declarations (keyless). */
|
|
18
|
+
export { buildFemaDeclarationCatalogue, buildFemaDeclarationUrl, femaDisasterDeclarationsAdapter, fetchFemaDeclarations, FEMA_DECLARATION_PATH, FEMA_DECLARATION_ROW_LIMIT, FEMA_FIRE_INCIDENT_TYPE, FEMA_OPEN_DATA_API_BASE, parseFemaDeclarationPayload, } from './femaDisasterDeclarations.js';
|
|
19
|
+
/** openFDA food enforcement reports (keyless). */
|
|
20
|
+
export { buildOpenFdaFoodRecallCountUrl, buildOpenFdaFoodRecallSummary, buildOpenFdaFoodRecallTotalUrl, fetchOpenFdaFoodRecalls, openFdaFoodRecallsAdapter, openFdaReportDateLabel, OPENFDA_CLASSIFICATION_COUNT_FIELD, OPENFDA_CLASS_ONE, OPENFDA_FOOD_ENFORCEMENT_BASE, OPENFDA_MANDATED_TERM, OPENFDA_REPORT_DATE_FIELD, OPENFDA_VOLUNTARY_COUNT_FIELD, OPENFDA_VOLUNTARY_TERM, parseOpenFdaFoodRecallSnapshot, parseOpenFdaRecallCounts, parseOpenFdaRecallDateCounts, parseOpenFdaRecallTotal, } from './openFdaFoodRecalls.js';
|
|
21
|
+
/** USGS annual peak streamflow at a gauge (keyless). */
|
|
22
|
+
export { buildUsgsPeakStreamflowSeries, buildUsgsPeakStreamflowUrl, fetchUsgsPeakStreamflow, parseUsgsPeakStreamflowPayload, USGS_DISCHARGE_PARAMETER_CODE, USGS_MISSISSIPPI_ST_LOUIS_LOCATION_ID, USGS_MISSISSIPPI_ST_LOUIS_LOCATION_NAME, USGS_PEAK_STREAMFLOW_COLLECTION, USGS_PEAK_STREAMFLOW_FIRST_WATER_YEAR, USGS_PEAK_STREAMFLOW_ROW_LIMIT, USGS_WATER_DATA_API_BASE, usgsPeakStreamflowAdapter, } from './usgsPeakStreamflow.js';
|
|
23
|
+
/** CPSC consumer product recalls (keyless). */
|
|
24
|
+
export { buildCpscProductRecallSeries, buildCpscRecallUrl, CPSC_ERROR_RECALL_ID, CPSC_RECALL_API_BASE, CPSC_RECALL_FIRST_YEAR, cpscProductRecallsAdapter, fetchCpscProductRecalls, parseCpscRecallPayload, parseCpscRecallSnapshot, } from './cpscProductRecalls.js';
|
|
25
|
+
/** CFPB Consumer Complaint Database (keyless). */
|
|
26
|
+
export { buildCfpComplaintAggregationUrl, buildCfpComplaintCountUrl, buildCfpComplaintDayUrl, buildCfpConsumerComplaintSeries, CFPB_COMPLAINT_FIRST_YEAR, CFPB_COMPLAINT_SEARCH_API_BASE, CFPB_NEWEST_DATE_PROBE_DAYS, CFPB_TOP_LIST_LIMIT, cfpbConsumerComplaintsAdapter, fetchCfpConsumerComplaints, findNewestCfpComplaintDate, parseCfpComplaintAggregations, parseCfpComplaintSnapshot, parseCfpComplaintTotal, } from './cfpbConsumerComplaints.js';
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** One calendar year of the contiguous United States temperature record. */
|
|
3
|
+
export interface NceiTemperatureYear {
|
|
4
|
+
/** The calendar year the average covers. */
|
|
5
|
+
year: number;
|
|
6
|
+
/** Mean temperature over the year, in degrees Fahrenheit. */
|
|
7
|
+
valueFahrenheit: number;
|
|
8
|
+
}
|
|
9
|
+
/** The annual record, with the points a story leans on. */
|
|
10
|
+
export interface NceiTemperatureSeries {
|
|
11
|
+
/** Every year in the record, oldest first. */
|
|
12
|
+
years: NceiTemperatureYear[];
|
|
13
|
+
yearCount: number;
|
|
14
|
+
firstYear: number;
|
|
15
|
+
lastYear: number;
|
|
16
|
+
/** The warmest year in the record. */
|
|
17
|
+
warmest: NceiTemperatureYear;
|
|
18
|
+
/** The coldest year in the record. */
|
|
19
|
+
coldest: NceiTemperatureYear;
|
|
20
|
+
/** Mean of every year in the record, in degrees Fahrenheit. */
|
|
21
|
+
meanFahrenheit: number;
|
|
22
|
+
}
|
|
23
|
+
/** The window, in years, that one request reads. */
|
|
24
|
+
export interface NceiTemperatureQuery {
|
|
25
|
+
/** First year in the window. */
|
|
26
|
+
startYear: number;
|
|
27
|
+
/** Last year in the window. A calendar year needs a full December first. */
|
|
28
|
+
endYear: number;
|
|
29
|
+
}
|
|
30
|
+
/** Climate at a Glance region id for the contiguous United States. */
|
|
31
|
+
export declare const NCEI_CONTIGUOUS_US_REGION_ID = "110";
|
|
32
|
+
/** Climate at a Glance parameter id for average temperature. */
|
|
33
|
+
export declare const NCEI_AVERAGE_TEMPERATURE_PARAMETER_ID = "tavg";
|
|
34
|
+
/**
|
|
35
|
+
* Months in the averaging window.
|
|
36
|
+
*
|
|
37
|
+
* Climate at a Glance labels a window by its length and by the month it ends
|
|
38
|
+
* on. Twelve months ending in December is the calendar year, which is the
|
|
39
|
+
* number a story about a year can compare.
|
|
40
|
+
*/
|
|
41
|
+
export declare const NCEI_ANNUAL_WINDOW_MONTHS = 12;
|
|
42
|
+
/** Base URL for the Climate at a Glance time series download. */
|
|
43
|
+
export declare const NCEI_CLIMATE_AT_A_GLANCE_BASE = "https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance";
|
|
44
|
+
/** First year in the contiguous United States record the agency publishes. */
|
|
45
|
+
export declare const NCEI_FIRST_RECORD_YEAR = 1895;
|
|
46
|
+
/**
|
|
47
|
+
* Builds the URL for the annual temperature series.
|
|
48
|
+
*
|
|
49
|
+
* The download is keyless and public domain. One request covers the whole
|
|
50
|
+
* window: the file is one row per year, so two centuries cost about 20 KB.
|
|
51
|
+
*
|
|
52
|
+
* @param query - the first and last year to read
|
|
53
|
+
* @returns the full CSV URL
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildNceiAnnualTemperatureUrl(query: NceiTemperatureQuery): string;
|
|
56
|
+
/**
|
|
57
|
+
* Parses the Climate at a Glance CSV into one entry per calendar year.
|
|
58
|
+
*
|
|
59
|
+
* The file opens with two comment lines and a header, then carries one row
|
|
60
|
+
* per year as `YYYYMM,value`, where the month is always December because the
|
|
61
|
+
* window is the calendar year. Anything else is treated as a changed shape
|
|
62
|
+
* and stops the parse rather than being dropped in silence.
|
|
63
|
+
*
|
|
64
|
+
* @param csv - the response body from the Climate at a Glance download
|
|
65
|
+
* @returns the years in the file, oldest first
|
|
66
|
+
*/
|
|
67
|
+
export declare function parseNceiAnnualTemperatureCsv(csv: string): NceiTemperatureYear[];
|
|
68
|
+
/**
|
|
69
|
+
* Folds the parsed years into one series with its headline years.
|
|
70
|
+
*
|
|
71
|
+
* @param years - the years in the file
|
|
72
|
+
* @returns the same years, oldest first, plus the warmest, the coldest, and the mean
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildNceiAnnualTemperatureSeries(years: NceiTemperatureYear[]): NceiTemperatureSeries;
|
|
75
|
+
/**
|
|
76
|
+
* Reads the annual temperature series from NOAA NCEI.
|
|
77
|
+
*
|
|
78
|
+
* The window defaults to the whole record. The current year joins the file
|
|
79
|
+
* once December has closed it, so the newest row is the last complete
|
|
80
|
+
* calendar year rather than a partial one.
|
|
81
|
+
*
|
|
82
|
+
* @param options - an optional window and fetch stub
|
|
83
|
+
* @returns the years in the window, oldest first, with the headline years
|
|
84
|
+
*/
|
|
85
|
+
export declare function fetchNceiAnnualTemperature(options?: {
|
|
86
|
+
startYear?: number;
|
|
87
|
+
endYear?: number;
|
|
88
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
89
|
+
}): Promise<NceiTemperatureSeries>;
|
|
90
|
+
/** NOAA NCEI contiguous United States annual average temperature, keyless. */
|
|
91
|
+
export declare const nceiAnnualTemperatureAdapter: UsDataAdapter<NceiTemperatureSeries>;
|
|
92
|
+
//# sourceMappingURL=nceiAnnualTemperature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nceiAnnualTemperature.d.ts","sourceRoot":"","sources":["../src/nceiAnnualTemperature.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,sCAAsC;IACtC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sEAAsE;AACtE,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD,gEAAgE;AAChE,eAAO,MAAM,qCAAqC,SAAS,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,iEAAiE;AACjE,eAAO,MAAM,6BAA6B,oEACyB,CAAC;AAEpE,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAW3C;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAOjF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAuChF;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,mBAAmB,EAAE,GAC3B,qBAAqB,CA8BvB;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,CAAC,EAAE;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAWjC;AAED,8EAA8E;AAC9E,eAAO,MAAM,4BAA4B,EAAE,aAAa,CAAC,qBAAqB,CAoB7E,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
2
|
+
import { readFixtureText } from './fixtures.js';
|
|
3
|
+
/** Climate at a Glance region id for the contiguous United States. */
|
|
4
|
+
export const NCEI_CONTIGUOUS_US_REGION_ID = '110';
|
|
5
|
+
/** Climate at a Glance parameter id for average temperature. */
|
|
6
|
+
export const NCEI_AVERAGE_TEMPERATURE_PARAMETER_ID = 'tavg';
|
|
7
|
+
/**
|
|
8
|
+
* Months in the averaging window.
|
|
9
|
+
*
|
|
10
|
+
* Climate at a Glance labels a window by its length and by the month it ends
|
|
11
|
+
* on. Twelve months ending in December is the calendar year, which is the
|
|
12
|
+
* number a story about a year can compare.
|
|
13
|
+
*/
|
|
14
|
+
export const NCEI_ANNUAL_WINDOW_MONTHS = 12;
|
|
15
|
+
/** Base URL for the Climate at a Glance time series download. */
|
|
16
|
+
export const NCEI_CLIMATE_AT_A_GLANCE_BASE = 'https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance';
|
|
17
|
+
/** First year in the contiguous United States record the agency publishes. */
|
|
18
|
+
export const NCEI_FIRST_RECORD_YEAR = 1895;
|
|
19
|
+
/** The month an annual row is stamped with: December closes the year. */
|
|
20
|
+
const NCEI_ANNUAL_ROW_MONTH = '12';
|
|
21
|
+
/** One data row of the CSV: a four digit year, a two digit month, a value. */
|
|
22
|
+
const NCEI_DATA_ROW_PATTERN = /^(\d{4})(\d{2}),(.+)$/;
|
|
23
|
+
/** Committed snapshot, so a build works when the agency host is unreachable. */
|
|
24
|
+
const NCEI_FIXTURE_FILENAME = 'ncei-annual-temperature-2026-09-26.csv';
|
|
25
|
+
/**
|
|
26
|
+
* Builds the URL for the annual temperature series.
|
|
27
|
+
*
|
|
28
|
+
* The download is keyless and public domain. One request covers the whole
|
|
29
|
+
* window: the file is one row per year, so two centuries cost about 20 KB.
|
|
30
|
+
*
|
|
31
|
+
* @param query - the first and last year to read
|
|
32
|
+
* @returns the full CSV URL
|
|
33
|
+
*/
|
|
34
|
+
export function buildNceiAnnualTemperatureUrl(query) {
|
|
35
|
+
const { startYear, endYear } = query;
|
|
36
|
+
return (`${NCEI_CLIMATE_AT_A_GLANCE_BASE}/national/time-series/${NCEI_CONTIGUOUS_US_REGION_ID}` +
|
|
37
|
+
`/${NCEI_AVERAGE_TEMPERATURE_PARAMETER_ID}/${NCEI_ANNUAL_WINDOW_MONTHS}` +
|
|
38
|
+
`/${NCEI_ANNUAL_WINDOW_MONTHS}/${startYear}-${endYear}.csv`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parses the Climate at a Glance CSV into one entry per calendar year.
|
|
42
|
+
*
|
|
43
|
+
* The file opens with two comment lines and a header, then carries one row
|
|
44
|
+
* per year as `YYYYMM,value`, where the month is always December because the
|
|
45
|
+
* window is the calendar year. Anything else is treated as a changed shape
|
|
46
|
+
* and stops the parse rather than being dropped in silence.
|
|
47
|
+
*
|
|
48
|
+
* @param csv - the response body from the Climate at a Glance download
|
|
49
|
+
* @returns the years in the file, oldest first
|
|
50
|
+
*/
|
|
51
|
+
export function parseNceiAnnualTemperatureCsv(csv) {
|
|
52
|
+
const years = [];
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
for (const line of csv.split('\n')) {
|
|
55
|
+
const row = line.trim();
|
|
56
|
+
if (row === '' || row.startsWith('#') || row === 'Date,Value') {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const match = NCEI_DATA_ROW_PATTERN.exec(row);
|
|
60
|
+
if (match === null) {
|
|
61
|
+
throw new UsSourceParseError('ncei', `Unreadable row in the temperature file: ${row}`);
|
|
62
|
+
}
|
|
63
|
+
const [, yearPart, monthPart, valuePart] = match;
|
|
64
|
+
if (yearPart === undefined ||
|
|
65
|
+
monthPart === undefined ||
|
|
66
|
+
valuePart === undefined ||
|
|
67
|
+
monthPart !== NCEI_ANNUAL_ROW_MONTH) {
|
|
68
|
+
throw new UsSourceParseError('ncei', `Expected one calendar year per row, got ${row}`);
|
|
69
|
+
}
|
|
70
|
+
const year = Number(yearPart);
|
|
71
|
+
if (seen.has(year)) {
|
|
72
|
+
throw new UsSourceParseError('ncei', `Two rows for ${year}`);
|
|
73
|
+
}
|
|
74
|
+
const valueFahrenheit = Number(valuePart);
|
|
75
|
+
if (!Number.isFinite(valueFahrenheit)) {
|
|
76
|
+
throw new UsSourceParseError('ncei', `Unreadable value in the temperature file: ${row}`);
|
|
77
|
+
}
|
|
78
|
+
seen.add(year);
|
|
79
|
+
years.push({ year, valueFahrenheit });
|
|
80
|
+
}
|
|
81
|
+
if (years.length === 0) {
|
|
82
|
+
throw new UsSourceParseError('ncei', 'No annual rows in the response');
|
|
83
|
+
}
|
|
84
|
+
return years.sort((left, right) => left.year - right.year);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Folds the parsed years into one series with its headline years.
|
|
88
|
+
*
|
|
89
|
+
* @param years - the years in the file
|
|
90
|
+
* @returns the same years, oldest first, plus the warmest, the coldest, and the mean
|
|
91
|
+
*/
|
|
92
|
+
export function buildNceiAnnualTemperatureSeries(years) {
|
|
93
|
+
const sorted = [...years].sort((left, right) => left.year - right.year);
|
|
94
|
+
const first = sorted[0];
|
|
95
|
+
const last = sorted[sorted.length - 1];
|
|
96
|
+
if (first === undefined || last === undefined) {
|
|
97
|
+
throw new UsSourceParseError('ncei', 'No years to summarise');
|
|
98
|
+
}
|
|
99
|
+
let warmest = first;
|
|
100
|
+
let coldest = first;
|
|
101
|
+
let total = 0;
|
|
102
|
+
for (const row of sorted) {
|
|
103
|
+
total += row.valueFahrenheit;
|
|
104
|
+
if (row.valueFahrenheit > warmest.valueFahrenheit) {
|
|
105
|
+
warmest = row;
|
|
106
|
+
}
|
|
107
|
+
if (row.valueFahrenheit < coldest.valueFahrenheit) {
|
|
108
|
+
coldest = row;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
years: sorted,
|
|
113
|
+
yearCount: sorted.length,
|
|
114
|
+
firstYear: first.year,
|
|
115
|
+
lastYear: last.year,
|
|
116
|
+
warmest,
|
|
117
|
+
coldest,
|
|
118
|
+
meanFahrenheit: total / sorted.length,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Reads the annual temperature series from NOAA NCEI.
|
|
123
|
+
*
|
|
124
|
+
* The window defaults to the whole record. The current year joins the file
|
|
125
|
+
* once December has closed it, so the newest row is the last complete
|
|
126
|
+
* calendar year rather than a partial one.
|
|
127
|
+
*
|
|
128
|
+
* @param options - an optional window and fetch stub
|
|
129
|
+
* @returns the years in the window, oldest first, with the headline years
|
|
130
|
+
*/
|
|
131
|
+
export async function fetchNceiAnnualTemperature(options) {
|
|
132
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
133
|
+
const url = buildNceiAnnualTemperatureUrl({
|
|
134
|
+
startYear: options?.startYear ?? NCEI_FIRST_RECORD_YEAR,
|
|
135
|
+
endYear: options?.endYear ?? new Date().getFullYear(),
|
|
136
|
+
});
|
|
137
|
+
const response = await fetchImpl(url);
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new UsSourceApiError('ncei', `HTTP ${response.status} reading the temperature series`);
|
|
140
|
+
}
|
|
141
|
+
return buildNceiAnnualTemperatureSeries(parseNceiAnnualTemperatureCsv(await response.text()));
|
|
142
|
+
}
|
|
143
|
+
/** NOAA NCEI contiguous United States annual average temperature, keyless. */
|
|
144
|
+
export const nceiAnnualTemperatureAdapter = {
|
|
145
|
+
id: 'ncei-annual-temperature',
|
|
146
|
+
name: 'NOAA NCEI contiguous US annual temperature',
|
|
147
|
+
auth: 'none',
|
|
148
|
+
description: 'Calendar-year average temperature for the contiguous United States since 1895, from the NOAA National Centers for Environmental Information.',
|
|
149
|
+
fetchLive: async (options) => fetchNceiAnnualTemperature(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
150
|
+
parse: (payload) => {
|
|
151
|
+
if (typeof payload !== 'string') {
|
|
152
|
+
throw new UsSourceParseError('ncei', 'The temperature download is CSV text, not JSON');
|
|
153
|
+
}
|
|
154
|
+
return buildNceiAnnualTemperatureSeries(parseNceiAnnualTemperatureCsv(payload));
|
|
155
|
+
},
|
|
156
|
+
loadFixture: () => buildNceiAnnualTemperatureSeries(parseNceiAnnualTemperatureCsv(readFixtureText(NCEI_FIXTURE_FILENAME))),
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=nceiAnnualTemperature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nceiAnnualTemperature.js","sourceRoot":"","sources":["../src/nceiAnnualTemperature.ts"],"names":[],"mappings":"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"}
|