@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,116 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** One county's model-based obesity estimate from the CDC PLACES release. */
|
|
3
|
+
export interface CdcCountyObesityEstimate {
|
|
4
|
+
/** County name on its own, such as "Boulder". */
|
|
5
|
+
countyName: string;
|
|
6
|
+
/** Two-letter state postal code, such as "CO". */
|
|
7
|
+
stateAbbr: string;
|
|
8
|
+
/** Share of adults with obesity, as a percentage. */
|
|
9
|
+
percent: number;
|
|
10
|
+
/** Population the estimate covers. */
|
|
11
|
+
population: number;
|
|
12
|
+
}
|
|
13
|
+
/** The release's own national row, kept apart from the counties. */
|
|
14
|
+
export interface CdcNationalObesityEstimate {
|
|
15
|
+
percent: number;
|
|
16
|
+
population: number;
|
|
17
|
+
}
|
|
18
|
+
/** One response, split into county rows and the national row. */
|
|
19
|
+
export interface CdcCountyObesityPayload {
|
|
20
|
+
/** Counties with an estimate, lowest share of obesity first. */
|
|
21
|
+
counties: CdcCountyObesityEstimate[];
|
|
22
|
+
/** The national row, or null when the response carried none. */
|
|
23
|
+
national: CdcNationalObesityEstimate | null;
|
|
24
|
+
/** The survey year the estimates describe, or null when no row carried one. */
|
|
25
|
+
dataYear: number | null;
|
|
26
|
+
}
|
|
27
|
+
/** One release's estimates, folded down to the points a story leans on. */
|
|
28
|
+
export interface CdcCountyObesitySet {
|
|
29
|
+
/** Counties with an estimate, lowest share of obesity first. */
|
|
30
|
+
counties: CdcCountyObesityEstimate[];
|
|
31
|
+
countyCount: number;
|
|
32
|
+
lowest: CdcCountyObesityEstimate;
|
|
33
|
+
highest: CdcCountyObesityEstimate;
|
|
34
|
+
national: CdcNationalObesityEstimate;
|
|
35
|
+
dataYear: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Socrata resource for the CDC PLACES county release this adapter reads.
|
|
39
|
+
*
|
|
40
|
+
* The id is per release: the 2025 release, whose estimates come from the 2023
|
|
41
|
+
* Behavioral Risk Factor Surveillance System (BRFSS) and the Census Bureau's
|
|
42
|
+
* 2023 county population estimates. A new release gets a new id, so a story
|
|
43
|
+
* pinned to this one keeps reading the numbers it was written against.
|
|
44
|
+
*/
|
|
45
|
+
export declare const CDC_PLACES_COUNTY_API_BASE = "https://data.cdc.gov/resource/swc5-untb.json";
|
|
46
|
+
/** PLACES measure id for obesity among adults. */
|
|
47
|
+
export declare const CDC_PLACES_OBESITY_MEASURE_ID = "OBESITY";
|
|
48
|
+
/**
|
|
49
|
+
* PLACES value type id for crude prevalence.
|
|
50
|
+
*
|
|
51
|
+
* The same measure is also published age-adjusted, which would put two rows
|
|
52
|
+
* per county. The crude row is the one a story about places can compare.
|
|
53
|
+
*/
|
|
54
|
+
export declare const CDC_PLACES_CRUDE_PREVALENCE_ID = "CrdPrv";
|
|
55
|
+
/** State code the release uses for its own national row. */
|
|
56
|
+
export declare const CDC_PLACES_NATIONAL_STATE_CODE = "US";
|
|
57
|
+
/** Row cap for one query. The release holds just under three thousand rows. */
|
|
58
|
+
export declare const CDC_PLACES_COUNTY_ROW_LIMIT = 5000;
|
|
59
|
+
/**
|
|
60
|
+
* Builds the query URL for the county obesity estimates.
|
|
61
|
+
*
|
|
62
|
+
* One request covers the whole release. The endpoint is keyless, and the
|
|
63
|
+
* filter holds the response to a single measure at crude prevalence, which
|
|
64
|
+
* is what keeps it near three thousand rows rather than thirty thousand.
|
|
65
|
+
*
|
|
66
|
+
* @param options - an optional row cap, for tests
|
|
67
|
+
* @returns the full query URL
|
|
68
|
+
*/
|
|
69
|
+
export declare function buildCdcCountyObesityUrl(options?: {
|
|
70
|
+
rowLimit?: number;
|
|
71
|
+
}): string;
|
|
72
|
+
/**
|
|
73
|
+
* Sorts counties by their obesity estimate, lowest first.
|
|
74
|
+
*
|
|
75
|
+
* The state and county name break a tie, so the order is stable across runs
|
|
76
|
+
* and a reader comparing two builds sees the same list.
|
|
77
|
+
*
|
|
78
|
+
* @param counties - county estimates in any order
|
|
79
|
+
* @returns the same estimates, lowest share of obesity first
|
|
80
|
+
*/
|
|
81
|
+
export declare function sortCdcCountiesByPercent(counties: CdcCountyObesityEstimate[]): CdcCountyObesityEstimate[];
|
|
82
|
+
/**
|
|
83
|
+
* Parses one PLACES response into county rows and the national row.
|
|
84
|
+
*
|
|
85
|
+
* Two shapes in the release need handling before the rows are usable. A
|
|
86
|
+
* county the model could not estimate arrives with no value at all, which is
|
|
87
|
+
* how the smallest counties come back. The national row arrives with no
|
|
88
|
+
* county name, and the only thing marking it is the "US" state code, so it is
|
|
89
|
+
* pulled out separately rather than counted as a county.
|
|
90
|
+
*
|
|
91
|
+
* @param payload - the JSON body from the PLACES resource endpoint
|
|
92
|
+
* @returns the county estimates, the national row, and the survey year
|
|
93
|
+
*/
|
|
94
|
+
export declare function parseCdcCountyObesityPayload(payload: unknown): CdcCountyObesityPayload;
|
|
95
|
+
/**
|
|
96
|
+
* Folds a parsed response into one set with its headline counties.
|
|
97
|
+
*
|
|
98
|
+
* @param payload - the parsed PLACES response
|
|
99
|
+
* @returns the counties, the lowest and highest, and the national row
|
|
100
|
+
*/
|
|
101
|
+
export declare function buildCdcCountyObesitySet(payload: CdcCountyObesityPayload): CdcCountyObesitySet;
|
|
102
|
+
/**
|
|
103
|
+
* Reads the county obesity estimates from CDC PLACES.
|
|
104
|
+
*
|
|
105
|
+
* Keyless, one request. There is no window to choose: the resource always
|
|
106
|
+
* answers the release it belongs to.
|
|
107
|
+
*
|
|
108
|
+
* @param options - an optional fetch stub
|
|
109
|
+
* @returns the county estimates, the national row, and the survey year
|
|
110
|
+
*/
|
|
111
|
+
export declare function fetchCdcCountyObesity(options?: {
|
|
112
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
113
|
+
}): Promise<CdcCountyObesityPayload>;
|
|
114
|
+
/** CDC PLACES county obesity estimates, keyless. */
|
|
115
|
+
export declare const cdcCountyObesityAdapter: UsDataAdapter<CdcCountyObesitySet>;
|
|
116
|
+
//# sourceMappingURL=cdcCountyObesity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdcCountyObesity.d.ts","sourceRoot":"","sources":["../src/cdcCountyObesity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iEAAiE;AACjE,MAAM,WAAW,uBAAuB;IACtC,gEAAgE;IAChE,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,gEAAgE;IAChE,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC5C,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,iDAAiD,CAAC;AAEzF,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,YAAY,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,WAAW,CAAC;AAEvD,4DAA4D;AAC5D,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,OAAO,CAAC;AA0BhD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAOhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,wBAAwB,EAAE,GACnC,wBAAwB,EAAE,CAU5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,uBAAuB,CAoCtF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,CAc9F;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOnC;AAED,oDAAoD;AACpD,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,mBAAmB,CAiBtE,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
3
|
+
import { readFixtureJson } from './fixtures.js';
|
|
4
|
+
/**
|
|
5
|
+
* Socrata resource for the CDC PLACES county release this adapter reads.
|
|
6
|
+
*
|
|
7
|
+
* The id is per release: the 2025 release, whose estimates come from the 2023
|
|
8
|
+
* Behavioral Risk Factor Surveillance System (BRFSS) and the Census Bureau's
|
|
9
|
+
* 2023 county population estimates. A new release gets a new id, so a story
|
|
10
|
+
* pinned to this one keeps reading the numbers it was written against.
|
|
11
|
+
*/
|
|
12
|
+
export const CDC_PLACES_COUNTY_API_BASE = 'https://data.cdc.gov/resource/swc5-untb.json';
|
|
13
|
+
/** PLACES measure id for obesity among adults. */
|
|
14
|
+
export const CDC_PLACES_OBESITY_MEASURE_ID = 'OBESITY';
|
|
15
|
+
/**
|
|
16
|
+
* PLACES value type id for crude prevalence.
|
|
17
|
+
*
|
|
18
|
+
* The same measure is also published age-adjusted, which would put two rows
|
|
19
|
+
* per county. The crude row is the one a story about places can compare.
|
|
20
|
+
*/
|
|
21
|
+
export const CDC_PLACES_CRUDE_PREVALENCE_ID = 'CrdPrv';
|
|
22
|
+
/** State code the release uses for its own national row. */
|
|
23
|
+
export const CDC_PLACES_NATIONAL_STATE_CODE = 'US';
|
|
24
|
+
/** Row cap for one query. The release holds just under three thousand rows. */
|
|
25
|
+
export const CDC_PLACES_COUNTY_ROW_LIMIT = 5000;
|
|
26
|
+
/** Columns the adapter asks for. The release carries many more. */
|
|
27
|
+
const CDC_PLACES_COLUMNS = 'locationname,stateabbr,data_value,totalpopulation,year';
|
|
28
|
+
// Socrata sends every column as a string and leaves a key out when the value
|
|
29
|
+
// is missing, so each field is optional and the numbers are read defensively.
|
|
30
|
+
const CDC_PLACES_ROW_SCHEMA = z.object({
|
|
31
|
+
locationname: z.string().optional(),
|
|
32
|
+
stateabbr: z.string().optional(),
|
|
33
|
+
data_value: z.string().optional(),
|
|
34
|
+
totalpopulation: z.string().optional(),
|
|
35
|
+
year: z.string().optional(),
|
|
36
|
+
});
|
|
37
|
+
const CDC_PLACES_RESPONSE_SCHEMA = z.array(CDC_PLACES_ROW_SCHEMA);
|
|
38
|
+
/** Reads a numeric field the release sends as a string, or undefined. */
|
|
39
|
+
function readCdcNumber(value) {
|
|
40
|
+
if (value === undefined || value.trim() === '') {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const parsed = Number(value);
|
|
44
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the query URL for the county obesity estimates.
|
|
48
|
+
*
|
|
49
|
+
* One request covers the whole release. The endpoint is keyless, and the
|
|
50
|
+
* filter holds the response to a single measure at crude prevalence, which
|
|
51
|
+
* is what keeps it near three thousand rows rather than thirty thousand.
|
|
52
|
+
*
|
|
53
|
+
* @param options - an optional row cap, for tests
|
|
54
|
+
* @returns the full query URL
|
|
55
|
+
*/
|
|
56
|
+
export function buildCdcCountyObesityUrl(options) {
|
|
57
|
+
const params = new URLSearchParams({
|
|
58
|
+
$select: CDC_PLACES_COLUMNS,
|
|
59
|
+
$where: `measureid='${CDC_PLACES_OBESITY_MEASURE_ID}' AND datavaluetypeid='${CDC_PLACES_CRUDE_PREVALENCE_ID}'`,
|
|
60
|
+
$limit: String(options?.rowLimit ?? CDC_PLACES_COUNTY_ROW_LIMIT),
|
|
61
|
+
});
|
|
62
|
+
return `${CDC_PLACES_COUNTY_API_BASE}?${params.toString()}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Sorts counties by their obesity estimate, lowest first.
|
|
66
|
+
*
|
|
67
|
+
* The state and county name break a tie, so the order is stable across runs
|
|
68
|
+
* and a reader comparing two builds sees the same list.
|
|
69
|
+
*
|
|
70
|
+
* @param counties - county estimates in any order
|
|
71
|
+
* @returns the same estimates, lowest share of obesity first
|
|
72
|
+
*/
|
|
73
|
+
export function sortCdcCountiesByPercent(counties) {
|
|
74
|
+
return [...counties].sort((left, right) => {
|
|
75
|
+
if (left.percent !== right.percent) {
|
|
76
|
+
return left.percent - right.percent;
|
|
77
|
+
}
|
|
78
|
+
if (left.stateAbbr !== right.stateAbbr) {
|
|
79
|
+
return left.stateAbbr.localeCompare(right.stateAbbr);
|
|
80
|
+
}
|
|
81
|
+
return left.countyName.localeCompare(right.countyName);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Parses one PLACES response into county rows and the national row.
|
|
86
|
+
*
|
|
87
|
+
* Two shapes in the release need handling before the rows are usable. A
|
|
88
|
+
* county the model could not estimate arrives with no value at all, which is
|
|
89
|
+
* how the smallest counties come back. The national row arrives with no
|
|
90
|
+
* county name, and the only thing marking it is the "US" state code, so it is
|
|
91
|
+
* pulled out separately rather than counted as a county.
|
|
92
|
+
*
|
|
93
|
+
* @param payload - the JSON body from the PLACES resource endpoint
|
|
94
|
+
* @returns the county estimates, the national row, and the survey year
|
|
95
|
+
*/
|
|
96
|
+
export function parseCdcCountyObesityPayload(payload) {
|
|
97
|
+
const parsed = CDC_PLACES_RESPONSE_SCHEMA.safeParse(payload);
|
|
98
|
+
if (!parsed.success) {
|
|
99
|
+
throw new UsSourceParseError('cdc', parsed.error.message);
|
|
100
|
+
}
|
|
101
|
+
const counties = [];
|
|
102
|
+
let national = null;
|
|
103
|
+
let dataYear = null;
|
|
104
|
+
for (const row of parsed.data) {
|
|
105
|
+
const percent = readCdcNumber(row.data_value);
|
|
106
|
+
const population = readCdcNumber(row.totalpopulation);
|
|
107
|
+
const year = readCdcNumber(row.year);
|
|
108
|
+
if (year !== undefined && Number.isInteger(year)) {
|
|
109
|
+
dataYear = dataYear === null ? year : Math.max(dataYear, year);
|
|
110
|
+
}
|
|
111
|
+
if (percent === undefined || population === undefined) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (row.stateabbr === CDC_PLACES_NATIONAL_STATE_CODE) {
|
|
115
|
+
national = { percent, population };
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (row.locationname === undefined || row.stateabbr === undefined) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
counties.push({
|
|
122
|
+
countyName: row.locationname,
|
|
123
|
+
stateAbbr: row.stateabbr,
|
|
124
|
+
percent,
|
|
125
|
+
population,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return { counties: sortCdcCountiesByPercent(counties), national, dataYear };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Folds a parsed response into one set with its headline counties.
|
|
132
|
+
*
|
|
133
|
+
* @param payload - the parsed PLACES response
|
|
134
|
+
* @returns the counties, the lowest and highest, and the national row
|
|
135
|
+
*/
|
|
136
|
+
export function buildCdcCountyObesitySet(payload) {
|
|
137
|
+
const { counties, national, dataYear } = payload;
|
|
138
|
+
const lowest = counties[0];
|
|
139
|
+
const highest = counties[counties.length - 1];
|
|
140
|
+
if (lowest === undefined || highest === undefined) {
|
|
141
|
+
throw new UsSourceParseError('cdc', 'No county estimates in the response');
|
|
142
|
+
}
|
|
143
|
+
if (national === null) {
|
|
144
|
+
throw new UsSourceParseError('cdc', 'The response carried no national row');
|
|
145
|
+
}
|
|
146
|
+
if (dataYear === null) {
|
|
147
|
+
throw new UsSourceParseError('cdc', 'The response carried no survey year');
|
|
148
|
+
}
|
|
149
|
+
return { counties, countyCount: counties.length, lowest, highest, national, dataYear };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Reads the county obesity estimates from CDC PLACES.
|
|
153
|
+
*
|
|
154
|
+
* Keyless, one request. There is no window to choose: the resource always
|
|
155
|
+
* answers the release it belongs to.
|
|
156
|
+
*
|
|
157
|
+
* @param options - an optional fetch stub
|
|
158
|
+
* @returns the county estimates, the national row, and the survey year
|
|
159
|
+
*/
|
|
160
|
+
export async function fetchCdcCountyObesity(options) {
|
|
161
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
162
|
+
const response = await fetchImpl(buildCdcCountyObesityUrl());
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
throw new UsSourceApiError('cdc', `HTTP ${response.status} reading the county estimates`);
|
|
165
|
+
}
|
|
166
|
+
return parseCdcCountyObesityPayload(await response.json());
|
|
167
|
+
}
|
|
168
|
+
/** CDC PLACES county obesity estimates, keyless. */
|
|
169
|
+
export const cdcCountyObesityAdapter = {
|
|
170
|
+
id: 'cdc-county-obesity',
|
|
171
|
+
name: 'CDC county adult obesity',
|
|
172
|
+
auth: 'none',
|
|
173
|
+
description: 'Model-based share of adults with obesity in each US county, from the CDC PLACES release.',
|
|
174
|
+
fetchLive: async (options) => buildCdcCountyObesitySet(await fetchCdcCountyObesity({
|
|
175
|
+
...(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
176
|
+
})),
|
|
177
|
+
parse: (payload) => buildCdcCountyObesitySet(parseCdcCountyObesityPayload(payload)),
|
|
178
|
+
loadFixture: () => buildCdcCountyObesitySet(parseCdcCountyObesityPayload(readFixtureJson('cdc-county-obesity-2026-09-25.json'))),
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=cdcCountyObesity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdcCountyObesity.js","sourceRoot":"","sources":["../src/cdcCountyObesity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** One calendar year of complaints. */
|
|
3
|
+
export interface CfpComplaintYearCount {
|
|
4
|
+
year: number;
|
|
5
|
+
complaintCount: number;
|
|
6
|
+
}
|
|
7
|
+
/** One company and how many complaints name it. */
|
|
8
|
+
export interface CfpComplaintCompanyCount {
|
|
9
|
+
company: string;
|
|
10
|
+
complaintCount: number;
|
|
11
|
+
}
|
|
12
|
+
/** One product and how many complaints sit under it. */
|
|
13
|
+
export interface CfpComplaintProductCount {
|
|
14
|
+
product: string;
|
|
15
|
+
complaintCount: number;
|
|
16
|
+
}
|
|
17
|
+
/** The complaint file folded into the shape a story reads. */
|
|
18
|
+
export interface CfpConsumerComplaintSeries {
|
|
19
|
+
firstYear: number;
|
|
20
|
+
/** Newest year in the window. The bureau is still filling it. */
|
|
21
|
+
newestYear: number;
|
|
22
|
+
/** Date of the newest complaint in the file, e.g. "2026-10-02". */
|
|
23
|
+
newestReceivedDate: string;
|
|
24
|
+
/** Complaints counted across the window. */
|
|
25
|
+
totalComplaints: number;
|
|
26
|
+
/** One entry per year in the window, oldest first. */
|
|
27
|
+
years: CfpComplaintYearCount[];
|
|
28
|
+
/** Years in the window before the newest one. */
|
|
29
|
+
completeYearCount: number;
|
|
30
|
+
/** Busiest of the years before the newest one. */
|
|
31
|
+
busiestCompleteYear: CfpComplaintYearCount;
|
|
32
|
+
/** Quietest of the years before the newest one. */
|
|
33
|
+
quietestCompleteYear: CfpComplaintYearCount;
|
|
34
|
+
/** Products, most complaints first. */
|
|
35
|
+
topProducts: CfpComplaintProductCount[];
|
|
36
|
+
/** Companies, most complaints first. */
|
|
37
|
+
topCompanies: CfpComplaintCompanyCount[];
|
|
38
|
+
}
|
|
39
|
+
/** Base URL for the Consumer Complaint Database search API. */
|
|
40
|
+
export declare const CFPB_COMPLAINT_SEARCH_API_BASE = "https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/";
|
|
41
|
+
/**
|
|
42
|
+
* First calendar year the adapter reads.
|
|
43
|
+
*
|
|
44
|
+
* The bureau published its first complaints on 1 December 2011, so that year
|
|
45
|
+
* holds one month. The window keeps it rather than dropping it, and the data
|
|
46
|
+
* note on the page says the first bar covers December only.
|
|
47
|
+
*/
|
|
48
|
+
export declare const CFPB_COMPLAINT_FIRST_YEAR = 2011;
|
|
49
|
+
/**
|
|
50
|
+
* How many days back the newest-complaint probe walks.
|
|
51
|
+
*
|
|
52
|
+
* The bureau adds complaints every day, but the newest one is normally filed
|
|
53
|
+
* within the last day or two. The probe walks back from today and stops at
|
|
54
|
+
* the first day with a complaint, so a quiet weekend costs a few requests.
|
|
55
|
+
*/
|
|
56
|
+
export declare const CFPB_NEWEST_DATE_PROBE_DAYS = 14;
|
|
57
|
+
/** How many products and companies one fetch keeps. */
|
|
58
|
+
export declare const CFPB_TOP_LIST_LIMIT = 10;
|
|
59
|
+
/**
|
|
60
|
+
* Builds the request URL for one calendar year of complaint totals.
|
|
61
|
+
*
|
|
62
|
+
* `no_aggs=true` drops the term aggregations the search API computes by
|
|
63
|
+
* default, which takes the response from several hundred kilobytes to about
|
|
64
|
+
* fifteen, and `size=0` drops the rows.
|
|
65
|
+
*
|
|
66
|
+
* @param year - the calendar year to read
|
|
67
|
+
* @returns the full request URL
|
|
68
|
+
*/
|
|
69
|
+
export declare function buildCfpComplaintCountUrl(year: number): string;
|
|
70
|
+
/**
|
|
71
|
+
* Builds the request URL for one day of complaint totals.
|
|
72
|
+
*
|
|
73
|
+
* @param isoDate - the day to read, e.g. "2026-10-02"
|
|
74
|
+
* @returns the full request URL
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildCfpComplaintDayUrl(isoDate: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Builds the request URL for the product and company tallies.
|
|
79
|
+
*
|
|
80
|
+
* @returns the full request URL
|
|
81
|
+
*/
|
|
82
|
+
export declare function buildCfpComplaintAggregationUrl(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Reads the total complaint count out of a totals-only response.
|
|
85
|
+
*
|
|
86
|
+
* @param payload - the JSON body from the search API
|
|
87
|
+
* @returns the number of complaints the query matched
|
|
88
|
+
*/
|
|
89
|
+
export declare function parseCfpComplaintTotal(payload: unknown): number;
|
|
90
|
+
/**
|
|
91
|
+
* Reads the product and company tallies out of an aggregation response.
|
|
92
|
+
*
|
|
93
|
+
* @param payload - the JSON body from the search API with aggregations
|
|
94
|
+
* @returns products and companies, most complaints first
|
|
95
|
+
*/
|
|
96
|
+
export declare function parseCfpComplaintAggregations(payload: unknown): {
|
|
97
|
+
topProducts: CfpComplaintProductCount[];
|
|
98
|
+
topCompanies: CfpComplaintCompanyCount[];
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Folds one window of year counts into the series a story reads.
|
|
102
|
+
*
|
|
103
|
+
* The newest year in the window is the year the bureau is still filling, so
|
|
104
|
+
* the busiest and quietest years are picked from the years before it.
|
|
105
|
+
*
|
|
106
|
+
* @param input - the year rows and the tallies read alongside them
|
|
107
|
+
* @returns the counts and the named years
|
|
108
|
+
*/
|
|
109
|
+
export declare function buildCfpConsumerComplaintSeries(input: {
|
|
110
|
+
firstYear: number;
|
|
111
|
+
newestYear: number;
|
|
112
|
+
newestReceivedDate: string;
|
|
113
|
+
years: CfpComplaintYearCount[];
|
|
114
|
+
topProducts: CfpComplaintProductCount[];
|
|
115
|
+
topCompanies: CfpComplaintCompanyCount[];
|
|
116
|
+
}): CfpConsumerComplaintSeries;
|
|
117
|
+
/**
|
|
118
|
+
* Parses the folded counts a committed snapshot holds into the story shape.
|
|
119
|
+
*
|
|
120
|
+
* @param payload - the JSON body of a committed snapshot
|
|
121
|
+
* @returns the counts and the named years
|
|
122
|
+
*/
|
|
123
|
+
export declare function parseCfpComplaintSnapshot(payload: unknown): CfpConsumerComplaintSeries;
|
|
124
|
+
/**
|
|
125
|
+
* Walks back from today to the newest day with a published complaint.
|
|
126
|
+
*
|
|
127
|
+
* The search API has no date sort, so the adapter asks a day at a time and
|
|
128
|
+
* stops at the first non-empty one. That is normally one or two requests.
|
|
129
|
+
*
|
|
130
|
+
* @param fetchImpl - the fetch implementation to use
|
|
131
|
+
* @param today - the day to start from, defaulting to now
|
|
132
|
+
* @returns the newest day with a complaint, e.g. "2026-10-02"
|
|
133
|
+
*/
|
|
134
|
+
export declare function findNewestCfpComplaintDate(fetchImpl: typeof globalThis.fetch, today?: Date): Promise<string>;
|
|
135
|
+
/**
|
|
136
|
+
* Reads the complaint database at build time.
|
|
137
|
+
*
|
|
138
|
+
* The search API answers one question per request, so the window costs one
|
|
139
|
+
* request per year plus one for the product and company tallies and one or
|
|
140
|
+
* two to find the newest day. The endpoint is keyless.
|
|
141
|
+
*
|
|
142
|
+
* @param options - an optional window and fetch stub
|
|
143
|
+
* @returns the counts and the named years
|
|
144
|
+
*/
|
|
145
|
+
export declare function fetchCfpConsumerComplaints(options?: {
|
|
146
|
+
firstYear?: number;
|
|
147
|
+
newestYear?: number;
|
|
148
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
149
|
+
}): Promise<CfpConsumerComplaintSeries>;
|
|
150
|
+
/** US Consumer Financial Protection Bureau Consumer Complaint Database, keyless. */
|
|
151
|
+
export declare const cfpbConsumerComplaintsAdapter: UsDataAdapter<CfpConsumerComplaintSeries>;
|
|
152
|
+
//# sourceMappingURL=cfpbConsumerComplaints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cfpbConsumerComplaints.d.ts","sourceRoot":"","sources":["../src/cfpbConsumerComplaints.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wDAAwD;AACxD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,8DAA8D;AAC9D,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,mBAAmB,EAAE,qBAAqB,CAAC;IAC3C,mDAAmD;IACnD,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,uCAAuC;IACvC,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,wCAAwC;IACxC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAED,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,qFACyC,CAAC;AAErF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAkCtC;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG;IAC/D,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C,CAcA;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C,GAAG,0BAA0B,CAuC7B;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,0BAA0B,CAatF;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,EAClC,KAAK,GAAE,IAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,CAAC,EAAE;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAqCtC;AAED,oFAAoF;AACpF,eAAO,MAAM,6BAA6B,EAAE,aAAa,CAAC,0BAA0B,CAYnF,CAAC"}
|