@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,293 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
3
|
+
import { readFixtureJson } from './fixtures.js';
|
|
4
|
+
/** Source name used in every error this adapter raises. */
|
|
5
|
+
const OPENFDA_SOURCE_NAME = 'openfda-food-recalls';
|
|
6
|
+
/** Base URL for the openFDA food enforcement endpoint. */
|
|
7
|
+
export const OPENFDA_FOOD_ENFORCEMENT_BASE = 'https://api.fda.gov/food/enforcement.json';
|
|
8
|
+
/**
|
|
9
|
+
* Classification FDA gives a recall that can seriously harm or kill.
|
|
10
|
+
*
|
|
11
|
+
* The endpoint carries Class I, Class II, Class III, and a handful of
|
|
12
|
+
* unclassified records; Class I is the one the story separates out.
|
|
13
|
+
*/
|
|
14
|
+
export const OPENFDA_CLASS_ONE = 'Class I';
|
|
15
|
+
/** Initiator terms the agency uses for a firm's own recall and a mandated one. */
|
|
16
|
+
export const OPENFDA_VOLUNTARY_TERM = 'Voluntary: Firm initiated';
|
|
17
|
+
export const OPENFDA_MANDATED_TERM = 'FDA Mandated';
|
|
18
|
+
/** Fields the adapter counts on. The endpoint carries exact-term variants. */
|
|
19
|
+
export const OPENFDA_REPORT_DATE_FIELD = 'report_date';
|
|
20
|
+
export const OPENFDA_CLASSIFICATION_COUNT_FIELD = 'classification.exact';
|
|
21
|
+
export const OPENFDA_VOLUNTARY_COUNT_FIELD = 'voluntary_mandated.exact';
|
|
22
|
+
/** Committed snapshot, so a build works when the openFDA host is unreachable. */
|
|
23
|
+
const OPENFDA_FOOD_RECALL_FIXTURE_FILENAME = 'openfda-food-recalls-2026-09-30.json';
|
|
24
|
+
/** Shape of the agency's date stamp, e.g. "20120620". */
|
|
25
|
+
const OPENFDA_DATE_PATTERN = /^(\d{4})(\d{2})(\d{2})$/;
|
|
26
|
+
// A rejected query answers with HTTP 404 or 400 and a body of
|
|
27
|
+
// {error: {code, message}} instead of the data.
|
|
28
|
+
const OPENFDA_ERROR_SCHEMA = z.object({
|
|
29
|
+
error: z.object({ code: z.string().optional(), message: z.string().optional() }),
|
|
30
|
+
});
|
|
31
|
+
const OPENFDA_COUNT_SCHEMA = z.object({
|
|
32
|
+
meta: z.object({ last_updated: z.string().optional() }).optional(),
|
|
33
|
+
results: z.array(z.object({ term: z.string(), count: z.number() })).min(1),
|
|
34
|
+
});
|
|
35
|
+
// A count of a date field comes back keyed by `time`; every other field is
|
|
36
|
+
// keyed by `term`.
|
|
37
|
+
const OPENFDA_DATE_COUNT_SCHEMA = z.object({
|
|
38
|
+
meta: z.object({ last_updated: z.string().optional() }).optional(),
|
|
39
|
+
results: z.array(z.object({ time: z.string(), count: z.number() })).min(1),
|
|
40
|
+
});
|
|
41
|
+
const OPENFDA_TOTAL_SCHEMA = z.object({
|
|
42
|
+
meta: z.object({ results: z.object({ total: z.number() }), last_updated: z.string().optional() }),
|
|
43
|
+
});
|
|
44
|
+
// The committed snapshot holds the four responses one summary needs, each
|
|
45
|
+
// under the key that names the question it answers.
|
|
46
|
+
const OPENFDA_FIXTURE_SCHEMA = z.object({
|
|
47
|
+
recallCount: z.number(),
|
|
48
|
+
reportDates: z.array(z.object({ time: z.string(), count: z.number() })),
|
|
49
|
+
classOneDates: z.array(z.object({ time: z.string(), count: z.number() })),
|
|
50
|
+
classifications: z.array(z.object({ term: z.string(), count: z.number() })),
|
|
51
|
+
voluntary: z.array(z.object({ term: z.string(), count: z.number() })),
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Refuses an openFDA body that carries an error instead of data.
|
|
55
|
+
*
|
|
56
|
+
* @param payload - the JSON body from any endpoint on the host
|
|
57
|
+
*/
|
|
58
|
+
function throwOnOpenFdaError(payload) {
|
|
59
|
+
const parsed = OPENFDA_ERROR_SCHEMA.safeParse(payload);
|
|
60
|
+
if (parsed.success) {
|
|
61
|
+
const { code, message } = parsed.data.error;
|
|
62
|
+
throw new UsSourceApiError(OPENFDA_SOURCE_NAME, `The API rejected the query: ${code ?? 'error'} ${message ?? ''}`.trim());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds the URL that reports how many records the endpoint holds.
|
|
67
|
+
*
|
|
68
|
+
* @returns the request URL
|
|
69
|
+
*/
|
|
70
|
+
export function buildOpenFdaFoodRecallTotalUrl() {
|
|
71
|
+
return `${OPENFDA_FOOD_ENFORCEMENT_BASE}?limit=1`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Builds the URL for one counted field, optionally inside a search.
|
|
75
|
+
*
|
|
76
|
+
* @param options - the field to count, and an optional openFDA search clause
|
|
77
|
+
* @returns the request URL
|
|
78
|
+
*/
|
|
79
|
+
export function buildOpenFdaFoodRecallCountUrl(options) {
|
|
80
|
+
const params = new URLSearchParams({
|
|
81
|
+
count: options?.field ?? OPENFDA_REPORT_DATE_FIELD,
|
|
82
|
+
});
|
|
83
|
+
if (options?.search !== undefined) {
|
|
84
|
+
params.set('search', options.search);
|
|
85
|
+
}
|
|
86
|
+
return `${OPENFDA_FOOD_ENFORCEMENT_BASE}?${params.toString()}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reads the record count out of the metadata block.
|
|
90
|
+
*
|
|
91
|
+
* @param payload - the JSON body from the limit=1 request
|
|
92
|
+
* @returns how many enforcement reports the endpoint holds
|
|
93
|
+
*/
|
|
94
|
+
export function parseOpenFdaRecallTotal(payload) {
|
|
95
|
+
throwOnOpenFdaError(payload);
|
|
96
|
+
const parsed = OPENFDA_TOTAL_SCHEMA.safeParse(payload);
|
|
97
|
+
if (!parsed.success) {
|
|
98
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, parsed.error.message);
|
|
99
|
+
}
|
|
100
|
+
return parsed.data.meta.results.total;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reads one counted field into value and count pairs.
|
|
104
|
+
*
|
|
105
|
+
* @param payload - the JSON body from a count request
|
|
106
|
+
* @returns the values with their counts, in the order the agency sent them
|
|
107
|
+
*/
|
|
108
|
+
export function parseOpenFdaRecallCounts(payload) {
|
|
109
|
+
throwOnOpenFdaError(payload);
|
|
110
|
+
const parsed = OPENFDA_COUNT_SCHEMA.safeParse(payload);
|
|
111
|
+
if (!parsed.success) {
|
|
112
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, parsed.error.message);
|
|
113
|
+
}
|
|
114
|
+
return parsed.data.results.map((entry) => ({ name: entry.term, count: entry.count }));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Reads a count of the date field into dated counts.
|
|
118
|
+
*
|
|
119
|
+
* @param payload - the JSON body from a count=report_date request
|
|
120
|
+
* @returns one entry per publication date, in the order the agency sent them
|
|
121
|
+
*/
|
|
122
|
+
export function parseOpenFdaRecallDateCounts(payload) {
|
|
123
|
+
throwOnOpenFdaError(payload);
|
|
124
|
+
const parsed = OPENFDA_DATE_COUNT_SCHEMA.safeParse(payload);
|
|
125
|
+
if (!parsed.success) {
|
|
126
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, parsed.error.message);
|
|
127
|
+
}
|
|
128
|
+
return parsed.data.results.map((entry) => {
|
|
129
|
+
if (OPENFDA_DATE_PATTERN.exec(entry.time) === null) {
|
|
130
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, `Unreadable publication date: ${entry.time}`);
|
|
131
|
+
}
|
|
132
|
+
return { date: entry.time, count: entry.count };
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Reads the committed snapshot: four responses under the keys that name them.
|
|
137
|
+
*
|
|
138
|
+
* @param payload - the parsed contents of the snapshot file
|
|
139
|
+
* @returns the snapshot in the shape the summary builder reads
|
|
140
|
+
*/
|
|
141
|
+
export function parseOpenFdaFoodRecallSnapshot(payload) {
|
|
142
|
+
const parsed = OPENFDA_FIXTURE_SCHEMA.safeParse(payload);
|
|
143
|
+
if (!parsed.success) {
|
|
144
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, parsed.error.message);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
recallCount: parsed.data.recallCount,
|
|
148
|
+
reportDates: parsed.data.reportDates.map((entry) => ({
|
|
149
|
+
date: entry.time,
|
|
150
|
+
count: entry.count,
|
|
151
|
+
})),
|
|
152
|
+
classOneDates: parsed.data.classOneDates.map((entry) => ({
|
|
153
|
+
date: entry.time,
|
|
154
|
+
count: entry.count,
|
|
155
|
+
})),
|
|
156
|
+
classifications: parsed.data.classifications.map((entry) => ({
|
|
157
|
+
name: entry.term,
|
|
158
|
+
count: entry.count,
|
|
159
|
+
})),
|
|
160
|
+
voluntary: parsed.data.voluntary.map((entry) => ({ name: entry.term, count: entry.count })),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/** Sums the counts of a dated or named list. */
|
|
164
|
+
function sumCounts(entries) {
|
|
165
|
+
return entries.reduce((total, entry) => total + entry.count, 0);
|
|
166
|
+
}
|
|
167
|
+
/** Counts one dated list by calendar year. */
|
|
168
|
+
function countByYear(entries) {
|
|
169
|
+
const byYear = new Map();
|
|
170
|
+
for (const entry of entries) {
|
|
171
|
+
const year = Number(entry.date.slice(0, 4));
|
|
172
|
+
byYear.set(year, (byYear.get(year) ?? 0) + entry.count);
|
|
173
|
+
}
|
|
174
|
+
return byYear;
|
|
175
|
+
}
|
|
176
|
+
/** Turns the agency's date stamp into the ISO date a reader recognises. */
|
|
177
|
+
export function openFdaReportDateLabel(date) {
|
|
178
|
+
const match = OPENFDA_DATE_PATTERN.exec(date);
|
|
179
|
+
if (match === null) {
|
|
180
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, `Unreadable publication date: ${date}`);
|
|
181
|
+
}
|
|
182
|
+
return `${match[1] ?? ''}-${match[2] ?? ''}-${match[3] ?? ''}`;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Folds the four responses into the per-year counts a story reads.
|
|
186
|
+
*
|
|
187
|
+
* Every recall in the file carries a publication date and a classification,
|
|
188
|
+
* so the two counts have to agree: a snapshot whose dates cover fewer recalls
|
|
189
|
+
* than the metadata reports is refused rather than charted short.
|
|
190
|
+
*
|
|
191
|
+
* @param snapshot - the counted responses, all from the same day
|
|
192
|
+
* @returns the per-year counts and the figures the copy quotes
|
|
193
|
+
*/
|
|
194
|
+
export function buildOpenFdaFoodRecallSummary(snapshot) {
|
|
195
|
+
const { recallCount, reportDates, classOneDates, classifications, voluntary } = snapshot;
|
|
196
|
+
if (reportDates.length === 0) {
|
|
197
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, 'No publication dates to summarise');
|
|
198
|
+
}
|
|
199
|
+
const datedTotal = sumCounts(reportDates);
|
|
200
|
+
if (datedTotal !== recallCount) {
|
|
201
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, `The publication dates cover ${String(datedTotal)} recalls and the endpoint reports ${String(recallCount)}`);
|
|
202
|
+
}
|
|
203
|
+
const classOneTotal = sumCounts(classOneDates);
|
|
204
|
+
const classOneInCounts = classifications.find((entry) => entry.name === OPENFDA_CLASS_ONE)?.count;
|
|
205
|
+
if (classOneInCounts !== undefined && classOneInCounts !== classOneTotal) {
|
|
206
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, `The Class I dates cover ${String(classOneTotal)} recalls and the classification count reports ${String(classOneInCounts)}`);
|
|
207
|
+
}
|
|
208
|
+
const totalByYear = countByYear(reportDates);
|
|
209
|
+
const classOneByYear = countByYear(classOneDates);
|
|
210
|
+
const years = [...totalByYear.entries()]
|
|
211
|
+
.map(([year, total]) => {
|
|
212
|
+
const classOne = classOneByYear.get(year) ?? 0;
|
|
213
|
+
return { year, total, classOne, other: total - classOne };
|
|
214
|
+
})
|
|
215
|
+
.sort((left, right) => left.year - right.year);
|
|
216
|
+
const busiestYear = years.reduce((busiest, year) => year.total > busiest.total ? year : busiest);
|
|
217
|
+
const first = years[0];
|
|
218
|
+
const last = years[years.length - 1];
|
|
219
|
+
if (first === undefined || last === undefined) {
|
|
220
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, 'No years to summarise');
|
|
221
|
+
}
|
|
222
|
+
const firstDate = reportDates[0];
|
|
223
|
+
const lastDate = reportDates[reportDates.length - 1];
|
|
224
|
+
if (firstDate === undefined || lastDate === undefined) {
|
|
225
|
+
throw new UsSourceParseError(OPENFDA_SOURCE_NAME, 'No publication dates to summarise');
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
recallCount,
|
|
229
|
+
reportDateCount: reportDates.length,
|
|
230
|
+
firstReportDate: openFdaReportDateLabel(firstDate.date),
|
|
231
|
+
newestReportDate: openFdaReportDateLabel(lastDate.date),
|
|
232
|
+
firstYear: first.year,
|
|
233
|
+
newestYear: last.year,
|
|
234
|
+
newestYearCount: last.total,
|
|
235
|
+
years,
|
|
236
|
+
busiestYear,
|
|
237
|
+
classOneCount: classOneTotal,
|
|
238
|
+
classOneSharePercent: (classOneTotal / recallCount) * 100,
|
|
239
|
+
classifications,
|
|
240
|
+
voluntaryCount: voluntary.find((entry) => entry.name === OPENFDA_VOLUNTARY_TERM)?.count ?? 0,
|
|
241
|
+
mandatedCount: voluntary.find((entry) => entry.name === OPENFDA_MANDATED_TERM)?.count ?? 0,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/** Reads one URL as JSON, refusing a response the host did not deliver. */
|
|
245
|
+
async function fetchOpenFdaJson(url, fetchImpl) {
|
|
246
|
+
const response = await fetchImpl(url);
|
|
247
|
+
if (!response.ok) {
|
|
248
|
+
throw new UsSourceApiError(OPENFDA_SOURCE_NAME, `HTTP ${response.status} reading ${url}`);
|
|
249
|
+
}
|
|
250
|
+
return response.json();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Reads the food enforcement file as four counted responses.
|
|
254
|
+
*
|
|
255
|
+
* Keyless. The endpoint answers one question per request and cannot group by
|
|
256
|
+
* two fields at once, so the per-year Class I counts come from a second date
|
|
257
|
+
* count under a search clause. Without an API key the endpoint allows 240
|
|
258
|
+
* requests a minute and 1,000 a day, and five requests cover the whole file.
|
|
259
|
+
*
|
|
260
|
+
* @param options - an optional fetch stub
|
|
261
|
+
* @returns the per-year counts and the figures the copy quotes
|
|
262
|
+
*/
|
|
263
|
+
export async function fetchOpenFdaFoodRecalls(options) {
|
|
264
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
265
|
+
const [totalPayload, reportDatePayload, classOneDatePayload, classPayload, voluntaryPayload] = await Promise.all([
|
|
266
|
+
fetchOpenFdaJson(buildOpenFdaFoodRecallTotalUrl(), fetchImpl),
|
|
267
|
+
fetchOpenFdaJson(buildOpenFdaFoodRecallCountUrl({ field: OPENFDA_REPORT_DATE_FIELD }), fetchImpl),
|
|
268
|
+
fetchOpenFdaJson(buildOpenFdaFoodRecallCountUrl({
|
|
269
|
+
field: OPENFDA_REPORT_DATE_FIELD,
|
|
270
|
+
search: `classification:"${OPENFDA_CLASS_ONE}"`,
|
|
271
|
+
}), fetchImpl),
|
|
272
|
+
fetchOpenFdaJson(buildOpenFdaFoodRecallCountUrl({ field: OPENFDA_CLASSIFICATION_COUNT_FIELD }), fetchImpl),
|
|
273
|
+
fetchOpenFdaJson(buildOpenFdaFoodRecallCountUrl({ field: OPENFDA_VOLUNTARY_COUNT_FIELD }), fetchImpl),
|
|
274
|
+
]);
|
|
275
|
+
return buildOpenFdaFoodRecallSummary({
|
|
276
|
+
recallCount: parseOpenFdaRecallTotal(totalPayload),
|
|
277
|
+
reportDates: parseOpenFdaRecallDateCounts(reportDatePayload),
|
|
278
|
+
classOneDates: parseOpenFdaRecallDateCounts(classOneDatePayload),
|
|
279
|
+
classifications: parseOpenFdaRecallCounts(classPayload),
|
|
280
|
+
voluntary: parseOpenFdaRecallCounts(voluntaryPayload),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
/** openFDA food enforcement reports, keyless. */
|
|
284
|
+
export const openFdaFoodRecallsAdapter = {
|
|
285
|
+
id: 'openfda-food-recalls',
|
|
286
|
+
name: 'openFDA food enforcement reports',
|
|
287
|
+
auth: 'none',
|
|
288
|
+
description: 'Every food recall FDA has published as an enforcement report, one record per recall, from June 2012 to the newest publication date.',
|
|
289
|
+
fetchLive: async (options) => fetchOpenFdaFoodRecalls(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
290
|
+
parse: (payload) => buildOpenFdaFoodRecallSummary(parseOpenFdaFoodRecallSnapshot(payload)),
|
|
291
|
+
loadFixture: () => buildOpenFdaFoodRecallSummary(parseOpenFdaFoodRecallSnapshot(readFixtureJson(OPENFDA_FOOD_RECALL_FIXTURE_FILENAME))),
|
|
292
|
+
};
|
|
293
|
+
//# sourceMappingURL=openFdaFoodRecalls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openFdaFoodRecalls.js","sourceRoot":"","sources":["../src/openFdaFoodRecalls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { UsDataAdapter, UsSourceProbe } from './types.js';
|
|
2
|
+
/** Every US data source behind the uniform adapter interface. */
|
|
3
|
+
export declare const US_DATA_SOURCES: UsDataAdapter<unknown>[];
|
|
4
|
+
/** Looks up a source adapter by id. */
|
|
5
|
+
export declare function getUsDataSource<T>(id: string): UsDataAdapter<T> | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Probes one source with a live fetch and reports the outcome.
|
|
8
|
+
*
|
|
9
|
+
* @param adapter - the adapter to exercise
|
|
10
|
+
* @param options - an optional API key and fetch stub
|
|
11
|
+
* @returns whether the source answered, plus what it said
|
|
12
|
+
*/
|
|
13
|
+
export declare function probeUsDataSource<T>(adapter: UsDataAdapter<T>, options?: {
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
16
|
+
}): Promise<UsSourceProbe>;
|
|
17
|
+
/**
|
|
18
|
+
* Probes every registered source in parallel, with optional per-source keys.
|
|
19
|
+
*
|
|
20
|
+
* @param options - a shared key, per-source keys, and a fetch stub
|
|
21
|
+
* @returns one probe result per registered source
|
|
22
|
+
*/
|
|
23
|
+
export declare function probeAllUsDataSources(options?: {
|
|
24
|
+
apiKey?: string;
|
|
25
|
+
apiKeys?: Record<string, string>;
|
|
26
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
27
|
+
}): Promise<UsSourceProbe[]>;
|
|
28
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAkB,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/E,iEAAiE;AACjE,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,EAYnD,CAAC;AAEF,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAE3E;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAAE,GACjE,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAW3B"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { blsUnemploymentAdapter } from './blsSeries.js';
|
|
2
|
+
import { cdcCountyObesityAdapter } from './cdcCountyObesity.js';
|
|
3
|
+
import { cfpbConsumerComplaintsAdapter } from './cfpbConsumerComplaints.js';
|
|
4
|
+
import { cpscProductRecallsAdapter } from './cpscProductRecalls.js';
|
|
5
|
+
import { femaDisasterDeclarationsAdapter } from './femaDisasterDeclarations.js';
|
|
6
|
+
import { nceiAnnualTemperatureAdapter } from './nceiAnnualTemperature.js';
|
|
7
|
+
import { noaaSeaLevelAdapter } from './noaaSeaLevel.js';
|
|
8
|
+
import { openFdaFoodRecallsAdapter } from './openFdaFoodRecalls.js';
|
|
9
|
+
import { treasuryAvgInterestRateAdapter } from './treasuryAvgInterestRate.js';
|
|
10
|
+
import { usgsHawaiiEarthquakesAdapter } from './usgsEarthquakes.js';
|
|
11
|
+
import { usgsPeakStreamflowAdapter } from './usgsPeakStreamflow.js';
|
|
12
|
+
/** Every US data source behind the uniform adapter interface. */
|
|
13
|
+
export const US_DATA_SOURCES = [
|
|
14
|
+
blsUnemploymentAdapter,
|
|
15
|
+
usgsHawaiiEarthquakesAdapter,
|
|
16
|
+
cdcCountyObesityAdapter,
|
|
17
|
+
nceiAnnualTemperatureAdapter,
|
|
18
|
+
noaaSeaLevelAdapter,
|
|
19
|
+
treasuryAvgInterestRateAdapter,
|
|
20
|
+
femaDisasterDeclarationsAdapter,
|
|
21
|
+
openFdaFoodRecallsAdapter,
|
|
22
|
+
usgsPeakStreamflowAdapter,
|
|
23
|
+
cpscProductRecallsAdapter,
|
|
24
|
+
cfpbConsumerComplaintsAdapter,
|
|
25
|
+
];
|
|
26
|
+
/** Looks up a source adapter by id. */
|
|
27
|
+
export function getUsDataSource(id) {
|
|
28
|
+
return US_DATA_SOURCES.find((source) => source.id === id);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Probes one source with a live fetch and reports the outcome.
|
|
32
|
+
*
|
|
33
|
+
* @param adapter - the adapter to exercise
|
|
34
|
+
* @param options - an optional API key and fetch stub
|
|
35
|
+
* @returns whether the source answered, plus what it said
|
|
36
|
+
*/
|
|
37
|
+
export async function probeUsDataSource(adapter, options) {
|
|
38
|
+
try {
|
|
39
|
+
const fetchOptions = {
|
|
40
|
+
...(options?.apiKey === undefined ? {} : { apiKey: options.apiKey }),
|
|
41
|
+
...(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
42
|
+
};
|
|
43
|
+
const data = await adapter.fetchLive(fetchOptions);
|
|
44
|
+
return {
|
|
45
|
+
id: adapter.id,
|
|
46
|
+
name: adapter.name,
|
|
47
|
+
auth: adapter.auth,
|
|
48
|
+
ok: true,
|
|
49
|
+
status: 'ok',
|
|
50
|
+
sample: JSON.stringify(data).slice(0, 120),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return {
|
|
55
|
+
id: adapter.id,
|
|
56
|
+
name: adapter.name,
|
|
57
|
+
auth: adapter.auth,
|
|
58
|
+
ok: false,
|
|
59
|
+
status: error instanceof Error ? error.message : String(error),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Probes every registered source in parallel, with optional per-source keys.
|
|
65
|
+
*
|
|
66
|
+
* @param options - a shared key, per-source keys, and a fetch stub
|
|
67
|
+
* @returns one probe result per registered source
|
|
68
|
+
*/
|
|
69
|
+
export async function probeAllUsDataSources(options) {
|
|
70
|
+
const { apiKey, apiKeys, fetchImpl } = options ?? {};
|
|
71
|
+
return Promise.all(US_DATA_SOURCES.map((source) => {
|
|
72
|
+
const key = apiKeys?.[source.id] ?? apiKey;
|
|
73
|
+
return probeUsDataSource(source, {
|
|
74
|
+
...(key === undefined ? {} : { apiKey: key }),
|
|
75
|
+
...(fetchImpl === undefined ? {} : { fetchImpl }),
|
|
76
|
+
});
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** One month of the average interest rate the Treasury pays on its debt. */
|
|
3
|
+
export interface TreasuryInterestRateMonth {
|
|
4
|
+
/** The agency's own date for the row, e.g. "2026-08-31". */
|
|
5
|
+
recordDate: string;
|
|
6
|
+
/** Calendar year the month belongs to. */
|
|
7
|
+
year: number;
|
|
8
|
+
/** Calendar month, 1 for January. */
|
|
9
|
+
month: number;
|
|
10
|
+
/**
|
|
11
|
+
* Average interest rate on the interest-bearing debt outstanding that
|
|
12
|
+
* month, in percent. The agency averages every security in the portfolio,
|
|
13
|
+
* so it is the rate the whole debt carries rather than the rate on
|
|
14
|
+
* anything issued today.
|
|
15
|
+
*/
|
|
16
|
+
averageInterestRatePercent: number;
|
|
17
|
+
}
|
|
18
|
+
/** One published run of the rate, folded down to the points a story leans on. */
|
|
19
|
+
export interface TreasuryInterestRateSeries {
|
|
20
|
+
/** One entry per month with a value, oldest first. */
|
|
21
|
+
months: TreasuryInterestRateMonth[];
|
|
22
|
+
monthCount: number;
|
|
23
|
+
firstMonth: TreasuryInterestRateMonth;
|
|
24
|
+
lastMonth: TreasuryInterestRateMonth;
|
|
25
|
+
highest: TreasuryInterestRateMonth;
|
|
26
|
+
lowest: TreasuryInterestRateMonth;
|
|
27
|
+
/** Latest month minus the lowest month, in percentage points. */
|
|
28
|
+
changeSinceLowPercentPoints: number;
|
|
29
|
+
/** Latest month minus the first month, in percentage points. */
|
|
30
|
+
changeFirstToLastPercentPoints: number;
|
|
31
|
+
}
|
|
32
|
+
/** Base URL for the Treasury Fiscal Data API. */
|
|
33
|
+
export declare const TREASURY_FISCAL_DATA_API_BASE = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service";
|
|
34
|
+
/** Dataset path for the average interest rates on Treasury securities. */
|
|
35
|
+
export declare const TREASURY_AVG_INTEREST_RATE_PATH = "/v2/accounting/od/avg_interest_rates";
|
|
36
|
+
/**
|
|
37
|
+
* Security type the adapter reads.
|
|
38
|
+
*
|
|
39
|
+
* "Interest-bearing Debt" holds the portfolio totals, the same rows the
|
|
40
|
+
* bureau's monthly statement is built from, rather than the rates on the
|
|
41
|
+
* bills, notes, and bonds issued today.
|
|
42
|
+
*/
|
|
43
|
+
export declare const TREASURY_AVG_INTEREST_RATE_SECURITY_TYPE = "Interest-bearing Debt";
|
|
44
|
+
/** Security description that carries the whole portfolio's average rate. */
|
|
45
|
+
export declare const TREASURY_AVG_INTEREST_RATE_SECURITY_DESCRIPTION = "Total Interest-bearing Debt";
|
|
46
|
+
/** First year the dataset covers. */
|
|
47
|
+
export declare const TREASURY_AVG_INTEREST_RATE_FIRST_YEAR = 2001;
|
|
48
|
+
/**
|
|
49
|
+
* Row cap for one request.
|
|
50
|
+
*
|
|
51
|
+
* The API returns at most 10,000 rows a page and the series is around 300
|
|
52
|
+
* rows, so one request covers the whole run and the adapter never pages.
|
|
53
|
+
*/
|
|
54
|
+
export declare const TREASURY_AVG_INTEREST_RATE_ROW_LIMIT = 10000;
|
|
55
|
+
/**
|
|
56
|
+
* Builds the request URL for the whole published series.
|
|
57
|
+
*
|
|
58
|
+
* The filter pins the response to the portfolio's own total, so the rows for
|
|
59
|
+
* bills, notes, bonds, and the non-marketable debt never reach the parser.
|
|
60
|
+
* The endpoint is keyless.
|
|
61
|
+
*
|
|
62
|
+
* @param options - an optional security type and row cap
|
|
63
|
+
* @returns the full request URL
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildTreasuryAvgInterestRateUrl(options?: {
|
|
66
|
+
securityType?: string;
|
|
67
|
+
rowLimit?: number;
|
|
68
|
+
}): string;
|
|
69
|
+
/**
|
|
70
|
+
* Parses one response into the months that carry a rate.
|
|
71
|
+
*
|
|
72
|
+
* A row for another security type is a changed filter and stops the parse,
|
|
73
|
+
* so a response that ignored the filter cannot quietly widen the series. A
|
|
74
|
+
* row without a rate is dropped, which is how a month the agency could not
|
|
75
|
+
* compute would arrive. A row without a readable date is a changed shape and
|
|
76
|
+
* also stops the parse.
|
|
77
|
+
*
|
|
78
|
+
* @param payload - the JSON body from the Fiscal Data API
|
|
79
|
+
* @returns the months that carry a rate, in the order the agency sent them
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseTreasuryAvgInterestRatePayload(payload: unknown): TreasuryInterestRateMonth[];
|
|
82
|
+
/**
|
|
83
|
+
* Folds the parsed months into one series with the headline months named.
|
|
84
|
+
*
|
|
85
|
+
* The months are sorted oldest first, so a caller reading index 0 gets the
|
|
86
|
+
* start of the run and index -1 gets the newest month.
|
|
87
|
+
*
|
|
88
|
+
* @param months - the parsed months, in any order
|
|
89
|
+
* @returns the sorted months, the highest and lowest in the run, and the change
|
|
90
|
+
*/
|
|
91
|
+
export declare function buildTreasuryAvgInterestRateSeries(months: TreasuryInterestRateMonth[]): TreasuryInterestRateSeries;
|
|
92
|
+
/**
|
|
93
|
+
* Reads the average interest rate on the Treasury's interest-bearing debt.
|
|
94
|
+
*
|
|
95
|
+
* One keyless request covers the whole published run, which starts in
|
|
96
|
+
* January 2001 and answers one row per month.
|
|
97
|
+
*
|
|
98
|
+
* @param options - an optional security type and fetch stub
|
|
99
|
+
* @returns the monthly rates, the highest and lowest months, and the change
|
|
100
|
+
*/
|
|
101
|
+
export declare function fetchTreasuryAvgInterestRates(options?: {
|
|
102
|
+
securityType?: string;
|
|
103
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
104
|
+
}): Promise<TreasuryInterestRateSeries>;
|
|
105
|
+
/** US Treasury average interest rate on the debt outstanding, keyless. */
|
|
106
|
+
export declare const treasuryAvgInterestRateAdapter: UsDataAdapter<TreasuryInterestRateSeries>;
|
|
107
|
+
//# sourceMappingURL=treasuryAvgInterestRate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treasuryAvgInterestRate.d.ts","sourceRoot":"","sources":["../src/treasuryAvgInterestRate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,WAAW,yBAAyB;IACxC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,iFAAiF;AACjF,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,yBAAyB,CAAC;IACtC,SAAS,EAAE,yBAAyB,CAAC;IACrC,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,yBAAyB,CAAC;IAClC,iEAAiE;IACjE,2BAA2B,EAAE,MAAM,CAAC;IACpC,gEAAgE;IAChE,8BAA8B,EAAE,MAAM,CAAC;CACxC;AAED,iDAAiD;AACjD,eAAO,MAAM,6BAA6B,oEACyB,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,+BAA+B,yCAAyC,CAAC;AAEtF;;;;;;GAMG;AACH,eAAO,MAAM,wCAAwC,0BAA0B,CAAC;AAEhF,4EAA4E;AAC5E,eAAO,MAAM,+CAA+C,gCAAgC,CAAC;AAE7F,qCAAqC;AACrC,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,QAAS,CAAC;AA4B3D;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAQT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,EAAE,CAmEjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,yBAAyB,EAAE,GAClC,0BAA0B,CA+B5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CAAC,OAAO,CAAC,EAAE;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAetC;AAED,0EAA0E;AAC1E,eAAO,MAAM,8BAA8B,EAAE,aAAa,CAAC,0BAA0B,CAkBpF,CAAC"}
|