@usa-open-data-connectors/usa-sources 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +442 -214
- package/dist/apiKey.d.ts +12 -0
- package/dist/apiKey.d.ts.map +1 -0
- package/dist/apiKey.js +18 -0
- package/dist/apiKey.js.map +1 -0
- package/dist/blsSeries.d.ts.map +1 -1
- package/dist/blsSeries.js +2 -4
- package/dist/blsSeries.js.map +1 -1
- package/dist/btsTransportationStats.d.ts +87 -0
- package/dist/btsTransportationStats.d.ts.map +1 -0
- package/dist/btsTransportationStats.js +130 -0
- package/dist/btsTransportationStats.js.map +1 -0
- package/dist/cdcCountyObesity.d.ts.map +1 -1
- package/dist/cdcCountyObesity.js +3 -5
- package/dist/cdcCountyObesity.js.map +1 -1
- package/dist/cdcSocrataCatalogue.d.ts +87 -0
- package/dist/cdcSocrataCatalogue.d.ts.map +1 -0
- package/dist/cdcSocrataCatalogue.js +130 -0
- package/dist/cdcSocrataCatalogue.js.map +1 -0
- package/dist/cfpbConsumerComplaints.d.ts +2 -0
- package/dist/cfpbConsumerComplaints.d.ts.map +1 -1
- package/dist/cfpbConsumerComplaints.js +12 -12
- package/dist/cfpbConsumerComplaints.js.map +1 -1
- package/dist/clinicalTrialsStudies.d.ts +92 -0
- package/dist/clinicalTrialsStudies.d.ts.map +1 -0
- package/dist/clinicalTrialsStudies.js +147 -0
- package/dist/clinicalTrialsStudies.js.map +1 -0
- package/dist/cpscProductRecalls.d.ts.map +1 -1
- package/dist/cpscProductRecalls.js +2 -4
- package/dist/cpscProductRecalls.js.map +1 -1
- package/dist/epaEnvirofactsFacilities.d.ts +94 -0
- package/dist/epaEnvirofactsFacilities.d.ts.map +1 -0
- package/dist/epaEnvirofactsFacilities.js +140 -0
- package/dist/epaEnvirofactsFacilities.js.map +1 -0
- package/dist/errors.d.ts +12 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -4
- package/dist/errors.js.map +1 -1
- package/dist/estimatetaxIncomeTax.d.ts +140 -0
- package/dist/estimatetaxIncomeTax.d.ts.map +1 -0
- package/dist/estimatetaxIncomeTax.js +225 -0
- package/dist/estimatetaxIncomeTax.js.map +1 -0
- package/dist/fdicBankDirectory.d.ts +78 -0
- package/dist/fdicBankDirectory.d.ts.map +1 -0
- package/dist/fdicBankDirectory.js +122 -0
- package/dist/fdicBankDirectory.js.map +1 -0
- package/dist/femaDisasterDeclarations.d.ts.map +1 -1
- package/dist/femaDisasterDeclarations.js +2 -4
- package/dist/femaDisasterDeclarations.js.map +1 -1
- package/dist/healthdataSocrataCatalogue.d.ts +87 -0
- package/dist/healthdataSocrataCatalogue.d.ts.map +1 -0
- package/dist/healthdataSocrataCatalogue.js +130 -0
- package/dist/healthdataSocrataCatalogue.js.map +1 -0
- package/dist/http.d.ts +36 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +85 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +61 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/ncbiPubmedSearch.d.ts +71 -0
- package/dist/ncbiPubmedSearch.d.ts.map +1 -0
- package/dist/ncbiPubmedSearch.js +126 -0
- package/dist/ncbiPubmedSearch.js.map +1 -0
- package/dist/nceiAnnualTemperature.d.ts.map +1 -1
- package/dist/nceiAnnualTemperature.js +3 -5
- package/dist/nceiAnnualTemperature.js.map +1 -1
- package/dist/noaaSeaLevel.d.ts.map +1 -1
- package/dist/noaaSeaLevel.js +2 -4
- package/dist/noaaSeaLevel.js.map +1 -1
- package/dist/nwsPointForecast.d.ts +99 -0
- package/dist/nwsPointForecast.d.ts.map +1 -0
- package/dist/nwsPointForecast.js +147 -0
- package/dist/nwsPointForecast.js.map +1 -0
- package/dist/nycOpenDataCatalogue.d.ts +97 -0
- package/dist/nycOpenDataCatalogue.d.ts.map +1 -0
- package/dist/nycOpenDataCatalogue.js +151 -0
- package/dist/nycOpenDataCatalogue.js.map +1 -0
- package/dist/openFdaFoodRecalls.d.ts.map +1 -1
- package/dist/openFdaFoodRecalls.js +2 -4
- package/dist/openFdaFoodRecalls.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +30 -2
- package/dist/registry.js.map +1 -1
- package/dist/secEdgarFilings.d.ts +103 -0
- package/dist/secEdgarFilings.d.ts.map +1 -0
- package/dist/secEdgarFilings.js +215 -0
- package/dist/secEdgarFilings.js.map +1 -0
- package/dist/treasuryAvgInterestRate.d.ts.map +1 -1
- package/dist/treasuryAvgInterestRate.js +2 -4
- package/dist/treasuryAvgInterestRate.js.map +1 -1
- package/dist/treasuryDebtToPenny.d.ts +90 -0
- package/dist/treasuryDebtToPenny.d.ts.map +1 -0
- package/dist/treasuryDebtToPenny.js +168 -0
- package/dist/treasuryDebtToPenny.js.map +1 -0
- package/dist/usaspendingAgencies.d.ts +78 -0
- package/dist/usaspendingAgencies.d.ts.map +1 -0
- package/dist/usaspendingAgencies.js +119 -0
- package/dist/usaspendingAgencies.js.map +1 -0
- package/dist/usgsEarthquakes.d.ts.map +1 -1
- package/dist/usgsEarthquakes.js +2 -4
- package/dist/usgsEarthquakes.js.map +1 -1
- package/dist/usgsPeakStreamflow.d.ts.map +1 -1
- package/dist/usgsPeakStreamflow.js +3 -5
- package/dist/usgsPeakStreamflow.js.map +1 -1
- package/package.json +13 -4
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** Adapter id for the FDIC bank directory source. */
|
|
3
|
+
export declare const FDIC_BANK_DIRECTORY_SOURCE_ID = "fdic-bank-directory";
|
|
4
|
+
/** One bank in the FDIC's institution directory. */
|
|
5
|
+
export interface FdicBank {
|
|
6
|
+
/** The FDIC's own certificate number for the bank. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** The bank's legal name. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** City of the bank's main office. */
|
|
11
|
+
city: string;
|
|
12
|
+
/** Two-letter state code of the main office. */
|
|
13
|
+
stateAbbr: string;
|
|
14
|
+
}
|
|
15
|
+
/** One state and how many banks in the page sit there. */
|
|
16
|
+
export interface FdicBankStateCount {
|
|
17
|
+
stateAbbr: string;
|
|
18
|
+
bankCount: number;
|
|
19
|
+
}
|
|
20
|
+
/** One page of the bank directory, folded for a story. */
|
|
21
|
+
export interface FdicBankDirectory {
|
|
22
|
+
/** One entry per bank in the page. */
|
|
23
|
+
banks: FdicBank[];
|
|
24
|
+
bankCount: number;
|
|
25
|
+
/** How many banks the FDIC holds in total, not just in this page. */
|
|
26
|
+
totalBanks: number;
|
|
27
|
+
/** States the banks in the page sit in, most banks first. */
|
|
28
|
+
states: FdicBankStateCount[];
|
|
29
|
+
}
|
|
30
|
+
/** Base URL for the FDIC institutions API. */
|
|
31
|
+
export declare const FDIC_BANK_API_BASE = "https://banks.data.fdic.gov/api/institutions";
|
|
32
|
+
/** Row cap for one request. */
|
|
33
|
+
export declare const FDIC_BANK_ROW_LIMIT = 10;
|
|
34
|
+
/** Columns the adapter asks for. The directory carries many more. */
|
|
35
|
+
export declare const FDIC_BANK_FIELDS = "NAME,CITY,STALP";
|
|
36
|
+
/**
|
|
37
|
+
* Builds the request URL for one page of the bank directory.
|
|
38
|
+
*
|
|
39
|
+
* The endpoint is keyless. The `fields` parameter trims the response to the
|
|
40
|
+
* columns a story reads, which keeps each row small. The service answers the
|
|
41
|
+
* banks.data.fdic.gov host with a redirect to api.fdic.gov, which fetch
|
|
42
|
+
* follows.
|
|
43
|
+
*
|
|
44
|
+
* @param options - an optional row cap and column list
|
|
45
|
+
* @returns the full request URL
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildFdicBankDirectoryUrl(options?: {
|
|
48
|
+
rowLimit?: number;
|
|
49
|
+
fields?: string;
|
|
50
|
+
}): string;
|
|
51
|
+
/**
|
|
52
|
+
* Parses one response into the banks in the page and the state counts.
|
|
53
|
+
*
|
|
54
|
+
* A row without an id, name, city, or state is a changed shape and stops the
|
|
55
|
+
* parse. The API's own total is used for `totalBanks`, falling back to the
|
|
56
|
+
* page size when the envelope omits it.
|
|
57
|
+
*
|
|
58
|
+
* @param payload - the JSON body from the FDIC institutions API
|
|
59
|
+
* @returns the banks in the page, the total the FDIC reports, and state counts
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseFdicBankDirectoryPayload(payload: unknown): FdicBankDirectory;
|
|
62
|
+
/**
|
|
63
|
+
* Reads one page of the FDIC's bank directory.
|
|
64
|
+
*
|
|
65
|
+
* One keyless request covers the page. The service trims each row to the
|
|
66
|
+
* columns asked for, so a story gets names, cities, and states without the
|
|
67
|
+
* full institution record.
|
|
68
|
+
*
|
|
69
|
+
* @param options - an optional row cap and fetch stub
|
|
70
|
+
* @returns the banks in the page, the FDIC total, and the state counts
|
|
71
|
+
*/
|
|
72
|
+
export declare function fetchFdicBankDirectory(options?: {
|
|
73
|
+
rowLimit?: number;
|
|
74
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
75
|
+
}): Promise<FdicBankDirectory>;
|
|
76
|
+
/** FDIC bank directory, one row per insured institution, keyless. */
|
|
77
|
+
export declare const fdicBankDirectoryAdapter: UsDataAdapter<FdicBankDirectory>;
|
|
78
|
+
//# sourceMappingURL=fdicBankDirectory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fdicBankDirectory.d.ts","sourceRoot":"","sources":["../src/fdicBankDirectory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qDAAqD;AACrD,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAEnE,oDAAoD;AACpD,MAAM,WAAW,QAAQ;IACvB,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB,iDAAiD,CAAC;AAEjF,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAuBlD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAMT;AAeD;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAiCjF;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAO7B;AAED,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC,iBAAiB,CAYrE,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
3
|
+
import { httpGet } from './http.js';
|
|
4
|
+
import { readFixtureJson } from './fixtures.js';
|
|
5
|
+
/** Adapter id for the FDIC bank directory source. */
|
|
6
|
+
export const FDIC_BANK_DIRECTORY_SOURCE_ID = 'fdic-bank-directory';
|
|
7
|
+
/** Base URL for the FDIC institutions API. */
|
|
8
|
+
export const FDIC_BANK_API_BASE = 'https://banks.data.fdic.gov/api/institutions';
|
|
9
|
+
/** Row cap for one request. */
|
|
10
|
+
export const FDIC_BANK_ROW_LIMIT = 10;
|
|
11
|
+
/** Columns the adapter asks for. The directory carries many more. */
|
|
12
|
+
export const FDIC_BANK_FIELDS = 'NAME,CITY,STALP';
|
|
13
|
+
/** Committed snapshot, so a build works when the FDIC host is unreachable. */
|
|
14
|
+
const FDIC_BANK_FIXTURE_FILENAME = 'fdic-bank-directory-2026-10-05.json';
|
|
15
|
+
// The API wraps each institution in a result object with its own score, and
|
|
16
|
+
// answers a rejected request with an HTTP error and a body of {errors}.
|
|
17
|
+
const FDIC_BANK_ROW_SCHEMA = z.object({
|
|
18
|
+
data: z.object({
|
|
19
|
+
ID: z.string().optional(),
|
|
20
|
+
NAME: z.string().optional(),
|
|
21
|
+
CITY: z.string().optional(),
|
|
22
|
+
STALP: z.string().optional(),
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
const FDIC_BANK_PAYLOAD_SCHEMA = z.object({
|
|
26
|
+
meta: z.object({ total: z.number().optional() }).optional(),
|
|
27
|
+
totals: z.object({ count: z.number().optional() }).optional(),
|
|
28
|
+
data: z.array(FDIC_BANK_ROW_SCHEMA).optional(),
|
|
29
|
+
errors: z.array(z.unknown()).optional(),
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Builds the request URL for one page of the bank directory.
|
|
33
|
+
*
|
|
34
|
+
* The endpoint is keyless. The `fields` parameter trims the response to the
|
|
35
|
+
* columns a story reads, which keeps each row small. The service answers the
|
|
36
|
+
* banks.data.fdic.gov host with a redirect to api.fdic.gov, which fetch
|
|
37
|
+
* follows.
|
|
38
|
+
*
|
|
39
|
+
* @param options - an optional row cap and column list
|
|
40
|
+
* @returns the full request URL
|
|
41
|
+
*/
|
|
42
|
+
export function buildFdicBankDirectoryUrl(options) {
|
|
43
|
+
const params = new URLSearchParams({
|
|
44
|
+
limit: String(options?.rowLimit ?? FDIC_BANK_ROW_LIMIT),
|
|
45
|
+
fields: options?.fields ?? FDIC_BANK_FIELDS,
|
|
46
|
+
});
|
|
47
|
+
return `${FDIC_BANK_API_BASE}?${params.toString()}`;
|
|
48
|
+
}
|
|
49
|
+
/** Counts banks per state in the order they were seen. */
|
|
50
|
+
function countFdicBankStates(banks) {
|
|
51
|
+
const counts = new Map();
|
|
52
|
+
for (const bank of banks) {
|
|
53
|
+
counts.set(bank.stateAbbr, (counts.get(bank.stateAbbr) ?? 0) + 1);
|
|
54
|
+
}
|
|
55
|
+
return [...counts.entries()]
|
|
56
|
+
.sort(([leftState, leftCount], [rightState, rightCount]) => leftCount === rightCount ? leftState.localeCompare(rightState) : rightCount - leftCount)
|
|
57
|
+
.map(([stateAbbr, bankCount]) => ({ stateAbbr, bankCount }));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parses one response into the banks in the page and the state counts.
|
|
61
|
+
*
|
|
62
|
+
* A row without an id, name, city, or state is a changed shape and stops the
|
|
63
|
+
* parse. The API's own total is used for `totalBanks`, falling back to the
|
|
64
|
+
* page size when the envelope omits it.
|
|
65
|
+
*
|
|
66
|
+
* @param payload - the JSON body from the FDIC institutions API
|
|
67
|
+
* @returns the banks in the page, the total the FDIC reports, and state counts
|
|
68
|
+
*/
|
|
69
|
+
export function parseFdicBankDirectoryPayload(payload) {
|
|
70
|
+
const parsed = FDIC_BANK_PAYLOAD_SCHEMA.safeParse(payload);
|
|
71
|
+
if (!parsed.success) {
|
|
72
|
+
throw new UsSourceParseError(FDIC_BANK_DIRECTORY_SOURCE_ID, parsed.error.message);
|
|
73
|
+
}
|
|
74
|
+
if (parsed.data.errors !== undefined && parsed.data.errors.length > 0) {
|
|
75
|
+
throw new UsSourceApiError(FDIC_BANK_DIRECTORY_SOURCE_ID, 'The API rejected the request');
|
|
76
|
+
}
|
|
77
|
+
const rows = parsed.data.data ?? [];
|
|
78
|
+
if (rows.length === 0) {
|
|
79
|
+
throw new UsSourceParseError(FDIC_BANK_DIRECTORY_SOURCE_ID, 'The response carried no rows');
|
|
80
|
+
}
|
|
81
|
+
const banks = rows.map((row) => {
|
|
82
|
+
const { ID, NAME, CITY, STALP } = row.data;
|
|
83
|
+
if (ID === undefined || NAME === undefined || CITY === undefined || STALP === undefined) {
|
|
84
|
+
throw new UsSourceParseError(FDIC_BANK_DIRECTORY_SOURCE_ID, 'A bank row arrived without its id, name, city, or state');
|
|
85
|
+
}
|
|
86
|
+
return { id: ID, name: NAME, city: CITY, stateAbbr: STALP };
|
|
87
|
+
});
|
|
88
|
+
const totalBanks = parsed.data.totals?.count ?? parsed.data.meta?.total ?? banks.length;
|
|
89
|
+
return {
|
|
90
|
+
banks,
|
|
91
|
+
bankCount: banks.length,
|
|
92
|
+
totalBanks,
|
|
93
|
+
states: countFdicBankStates(banks),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reads one page of the FDIC's bank directory.
|
|
98
|
+
*
|
|
99
|
+
* One keyless request covers the page. The service trims each row to the
|
|
100
|
+
* columns asked for, so a story gets names, cities, and states without the
|
|
101
|
+
* full institution record.
|
|
102
|
+
*
|
|
103
|
+
* @param options - an optional row cap and fetch stub
|
|
104
|
+
* @returns the banks in the page, the FDIC total, and the state counts
|
|
105
|
+
*/
|
|
106
|
+
export async function fetchFdicBankDirectory(options) {
|
|
107
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
108
|
+
const url = buildFdicBankDirectoryUrl(options?.rowLimit === undefined ? {} : { rowLimit: options.rowLimit });
|
|
109
|
+
const response = await httpGet(FDIC_BANK_DIRECTORY_SOURCE_ID, url, { fetchImpl });
|
|
110
|
+
return parseFdicBankDirectoryPayload(await response.json());
|
|
111
|
+
}
|
|
112
|
+
/** FDIC bank directory, one row per insured institution, keyless. */
|
|
113
|
+
export const fdicBankDirectoryAdapter = {
|
|
114
|
+
id: FDIC_BANK_DIRECTORY_SOURCE_ID,
|
|
115
|
+
name: 'FDIC bank directory',
|
|
116
|
+
auth: 'none',
|
|
117
|
+
description: 'Insured banks in the FDIC institution directory, one row per bank, with the city and state of its main office.',
|
|
118
|
+
fetchLive: async (options) => fetchFdicBankDirectory(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
119
|
+
parse: (payload) => parseFdicBankDirectoryPayload(payload),
|
|
120
|
+
loadFixture: () => parseFdicBankDirectoryPayload(readFixtureJson(FDIC_BANK_FIXTURE_FILENAME)),
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=fdicBankDirectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fdicBankDirectory.js","sourceRoot":"","sources":["../src/fdicBankDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,qDAAqD;AACrD,MAAM,CAAC,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AA+BnE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,8CAA8C,CAAC;AAEjF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAElD,8EAA8E;AAC9E,MAAM,0BAA0B,GAAG,qCAAqC,CAAC;AAEzE,4EAA4E;AAC5E,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC7D,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE;IAC9C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,mBAAmB,CAAC;QACvD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,gBAAgB;KAC5C,CAAC,CAAC;IACH,OAAO,GAAG,kBAAkB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,0DAA0D;AAC1D,SAAS,mBAAmB,CAAC,KAAiB;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,CACzD,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CACxF;SACA,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAAC,OAAgB;IAC5D,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAAC,6BAA6B,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,gBAAgB,CAAC,6BAA6B,EAAE,8BAA8B,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAAC,6BAA6B,EAAE,8BAA8B,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,KAAK,GAAe,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3C,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxF,MAAM,IAAI,kBAAkB,CAC1B,6BAA6B,EAC7B,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IAExF,OAAO;QACL,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,UAAU;QACV,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAG5C;IACC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACzD,MAAM,GAAG,GAAG,yBAAyB,CACnC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CACtE,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,6BAA6B,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClF,OAAO,6BAA6B,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,EAAE,EAAE,6BAA6B;IACjC,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,gHAAgH;IAClH,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAC3B,sBAAsB,CACpB,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CACzE;IACH,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,6BAA6B,CAAC,OAAO,CAAC;IAC1D,WAAW,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;CAC9F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"femaDisasterDeclarations.d.ts","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"femaDisasterDeclarations.d.ts","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uEAAuE;AACvE,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,qDAAqD;IACrD,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,uDAAuD;IACvD,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,qCAAqC;AACrC,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAE1E,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAqC9C;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CA2D/E;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,eAAe,EAAE,GAC9B,wBAAwB,CA+C1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAOpC;AAED,2CAA2C;AAC3C,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC,wBAAwB,CAanF,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { UsSourceApiError, UsSourceParseError } from './errors.js';
|
|
3
|
+
import { httpGet } from './http.js';
|
|
3
4
|
import { readFixtureJson } from './fixtures.js';
|
|
4
5
|
/** Base URL for the OpenFEMA API. */
|
|
5
6
|
export const FEMA_OPEN_DATA_API_BASE = 'https://www.fema.gov/api/open/v1';
|
|
@@ -195,10 +196,7 @@ export function buildFemaDeclarationCatalogue(declarations) {
|
|
|
195
196
|
export async function fetchFemaDeclarations(options) {
|
|
196
197
|
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
197
198
|
const url = buildFemaDeclarationUrl(options?.rowLimit === undefined ? {} : { rowLimit: options.rowLimit });
|
|
198
|
-
const response = await
|
|
199
|
-
if (!response.ok) {
|
|
200
|
-
throw new UsSourceApiError('fema', `HTTP ${response.status} reading the declaration file`);
|
|
201
|
-
}
|
|
199
|
+
const response = await httpGet('fema', url, { fetchImpl });
|
|
202
200
|
return buildFemaDeclarationCatalogue(parseFemaDeclarationPayload(await response.json()));
|
|
203
201
|
}
|
|
204
202
|
/** FEMA disaster declarations, keyless. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"femaDisasterDeclarations.js","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"femaDisasterDeclarations.js","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { UsDataAdapter } from './types.js';
|
|
2
|
+
/** Adapter id for the healthdata-socrata-catalogue source. */
|
|
3
|
+
export declare const HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID = "healthdata-socrata-catalogue";
|
|
4
|
+
/** One catalogue entry from the Socrata discovery API. */
|
|
5
|
+
export interface HealthdataSocrataCatalogueEntry {
|
|
6
|
+
/** Four-by-four Socrata dataset id, e.g. "ahfs-x44r". */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Human-readable title of the dataset, chart, story, or file. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** What the entry is: "dataset", "chart", "story", "file", or "href". */
|
|
11
|
+
assetType: string;
|
|
12
|
+
/** Publishing office the entry belongs to, or null when the catalogue lists none. */
|
|
13
|
+
category: string | null;
|
|
14
|
+
/** How the entry is rendered, e.g. "tabular", "href", or "story". */
|
|
15
|
+
viewType: string;
|
|
16
|
+
/** When the entry was created, in seconds since the Unix epoch. */
|
|
17
|
+
createdAtEpochSeconds: number;
|
|
18
|
+
/** When the entry was last modified, in seconds since the Unix epoch. */
|
|
19
|
+
viewLastModifiedEpochSeconds: number;
|
|
20
|
+
/** How many times the entry has been viewed. */
|
|
21
|
+
viewCount: number;
|
|
22
|
+
/** How many times the entry has been downloaded. */
|
|
23
|
+
downloadCount: number;
|
|
24
|
+
}
|
|
25
|
+
/** One category and how many catalogue entries carry it. */
|
|
26
|
+
export interface HealthdataSocrataCategoryCount {
|
|
27
|
+
category: string;
|
|
28
|
+
entryCount: number;
|
|
29
|
+
}
|
|
30
|
+
/** One page of the catalogue, folded for a story. */
|
|
31
|
+
export interface HealthdataSocrataCatalogue {
|
|
32
|
+
/** One entry per catalogue item in the page. */
|
|
33
|
+
entries: HealthdataSocrataCatalogueEntry[];
|
|
34
|
+
entryCount: number;
|
|
35
|
+
/** Entries whose asset type is "dataset". */
|
|
36
|
+
datasetCount: number;
|
|
37
|
+
/** Entry with the latest creation time. Ties go to the earlier list entry. */
|
|
38
|
+
newestEntry: HealthdataSocrataCatalogueEntry;
|
|
39
|
+
/**
|
|
40
|
+
* Categories in the page, most entries first, ties broken by name. An entry
|
|
41
|
+
* the catalogue lists without a category is counted under "Uncategorised".
|
|
42
|
+
*/
|
|
43
|
+
categories: HealthdataSocrataCategoryCount[];
|
|
44
|
+
}
|
|
45
|
+
/** Base URL for the HealthData.gov Socrata catalogue. */
|
|
46
|
+
export declare const HEALTHDATA_SOCRATA_CATALOGUE_API_BASE = "https://healthdata.gov/api/views.json";
|
|
47
|
+
/** How many catalogue entries one request reads. */
|
|
48
|
+
export declare const HEALTHDATA_SOCRATA_CATALOGUE_LIMIT = 10;
|
|
49
|
+
/**
|
|
50
|
+
* Builds the request URL for one page of the catalogue.
|
|
51
|
+
*
|
|
52
|
+
* The endpoint is keyless. The service answers the whole catalogue by default,
|
|
53
|
+
* so the adapter asks for a short page.
|
|
54
|
+
*
|
|
55
|
+
* @param options - an optional entry cap
|
|
56
|
+
* @returns the full request URL
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildHealthdataSocrataCatalogueUrl(options?: {
|
|
59
|
+
limit?: number;
|
|
60
|
+
}): string;
|
|
61
|
+
/**
|
|
62
|
+
* Parses one page of the catalogue into the entries and the category counts.
|
|
63
|
+
*
|
|
64
|
+
* An entry without an id, a name, or a creation time is a changed shape and
|
|
65
|
+
* stops the parse. An empty page also stops the parse, because a catalogue
|
|
66
|
+
* with no entries is not a usable answer.
|
|
67
|
+
*
|
|
68
|
+
* @param payload - the JSON body from the Socrata discovery API
|
|
69
|
+
* @returns the entries in the page, the counts, and the newest entry
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseHealthdataSocrataCataloguePayload(payload: unknown): HealthdataSocrataCatalogue;
|
|
72
|
+
/**
|
|
73
|
+
* Reads one page of the HealthData.gov catalogue.
|
|
74
|
+
*
|
|
75
|
+
* One keyless request covers the page and reports what the catalogue holds,
|
|
76
|
+
* without reading any dataset's rows.
|
|
77
|
+
*
|
|
78
|
+
* @param options - an optional entry cap and fetch stub
|
|
79
|
+
* @returns the entries in the page, the counts, and the newest entry
|
|
80
|
+
*/
|
|
81
|
+
export declare function fetchHealthdataSocrataCatalogue(options?: {
|
|
82
|
+
limit?: number;
|
|
83
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
84
|
+
}): Promise<HealthdataSocrataCatalogue>;
|
|
85
|
+
/** HealthData.gov Socrata catalogue of datasets, charts, and stories, keyless. */
|
|
86
|
+
export declare const healthdataSocrataCatalogueAdapter: UsDataAdapter<HealthdataSocrataCatalogue>;
|
|
87
|
+
//# sourceMappingURL=healthdataSocrataCatalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthdataSocrataCatalogue.d.ts","sourceRoot":"","sources":["../src/healthdataSocrataCatalogue.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,8DAA8D;AAC9D,eAAO,MAAM,sCAAsC,iCAAiC,CAAC;AAErF,0DAA0D;AAC1D,MAAM,WAAW,+BAA+B;IAC9C,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,4BAA4B,EAAE,MAAM,CAAC;IACrC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,4DAA4D;AAC5D,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qDAAqD;AACrD,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,OAAO,EAAE,+BAA+B,EAAE,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,WAAW,EAAE,+BAA+B,CAAC;IAC7C;;;OAGG;IACH,UAAU,EAAE,8BAA8B,EAAE,CAAC;CAC9C;AAED,yDAAyD;AACzD,eAAO,MAAM,qCAAqC,0CAA0C,CAAC;AAE7F,oDAAoD;AACpD,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAyDrD;;;;;;;;GAQG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,OAAO,GACf,0BAA0B,CAuC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAOtC;AAED,kFAAkF;AAClF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC,0BAA0B,CAevF,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { UsSourceParseError } from './errors.js';
|
|
3
|
+
import { httpGet } from './http.js';
|
|
4
|
+
import { readFixtureJson } from './fixtures.js';
|
|
5
|
+
/** Adapter id for the healthdata-socrata-catalogue source. */
|
|
6
|
+
export const HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID = 'healthdata-socrata-catalogue';
|
|
7
|
+
/** Base URL for the HealthData.gov Socrata catalogue. */
|
|
8
|
+
export const HEALTHDATA_SOCRATA_CATALOGUE_API_BASE = 'https://healthdata.gov/api/views.json';
|
|
9
|
+
/** How many catalogue entries one request reads. */
|
|
10
|
+
export const HEALTHDATA_SOCRATA_CATALOGUE_LIMIT = 10;
|
|
11
|
+
/** Committed snapshot, so a build works when the HealthData.gov host is unreachable. */
|
|
12
|
+
const HEALTHDATA_SOCRATA_CATALOGUE_FIXTURE_FILENAME = 'healthdata-socrata-catalogue-2026-10-05.json';
|
|
13
|
+
/** Category bucket the adapter uses for an entry the catalogue lists without one. */
|
|
14
|
+
const HEALTHDATA_SOCRATA_UNCATEGORISED = 'Uncategorised';
|
|
15
|
+
// The discovery API sends a bare JSON array. A value the catalogue does not
|
|
16
|
+
// carry arrives as null, and every count arrives as a number.
|
|
17
|
+
const HEALTHDATA_SOCRATA_CATALOGUE_ENTRY_SCHEMA = z.object({
|
|
18
|
+
id: z.string().optional(),
|
|
19
|
+
name: z.string().optional(),
|
|
20
|
+
assetType: z.string().optional(),
|
|
21
|
+
category: z.string().nullable().optional(),
|
|
22
|
+
viewType: z.string().optional(),
|
|
23
|
+
createdAt: z.number().optional(),
|
|
24
|
+
viewLastModified: z.number().optional(),
|
|
25
|
+
viewCount: z.number().optional(),
|
|
26
|
+
downloadCount: z.number().optional(),
|
|
27
|
+
});
|
|
28
|
+
const HEALTHDATA_SOCRATA_CATALOGUE_PAYLOAD_SCHEMA = z.array(HEALTHDATA_SOCRATA_CATALOGUE_ENTRY_SCHEMA);
|
|
29
|
+
/** Counts entries per category, most entries first, ties by name. */
|
|
30
|
+
function countHealthdataSocrataCategories(entries) {
|
|
31
|
+
const counts = new Map();
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
const category = entry.category ?? HEALTHDATA_SOCRATA_UNCATEGORISED;
|
|
34
|
+
counts.set(category, (counts.get(category) ?? 0) + 1);
|
|
35
|
+
}
|
|
36
|
+
return [...counts.entries()]
|
|
37
|
+
.sort(([leftCategory, leftCount], [rightCategory, rightCount]) => leftCount === rightCount ? leftCategory.localeCompare(rightCategory) : rightCount - leftCount)
|
|
38
|
+
.map(([category, entryCount]) => ({ category, entryCount }));
|
|
39
|
+
}
|
|
40
|
+
/** Picks the entry with the latest creation time, ties to the earlier entry. */
|
|
41
|
+
function newestHealthdataSocrataEntry(entries) {
|
|
42
|
+
const first = entries[0];
|
|
43
|
+
if (first === undefined) {
|
|
44
|
+
throw new UsSourceParseError(HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID, 'No entries to summarise');
|
|
45
|
+
}
|
|
46
|
+
return entries.reduce((best, entry) => (entry.createdAtEpochSeconds > best.createdAtEpochSeconds ? entry : best), first);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Builds the request URL for one page of the catalogue.
|
|
50
|
+
*
|
|
51
|
+
* The endpoint is keyless. The service answers the whole catalogue by default,
|
|
52
|
+
* so the adapter asks for a short page.
|
|
53
|
+
*
|
|
54
|
+
* @param options - an optional entry cap
|
|
55
|
+
* @returns the full request URL
|
|
56
|
+
*/
|
|
57
|
+
export function buildHealthdataSocrataCatalogueUrl(options) {
|
|
58
|
+
const params = new URLSearchParams({
|
|
59
|
+
limit: String(options?.limit ?? HEALTHDATA_SOCRATA_CATALOGUE_LIMIT),
|
|
60
|
+
});
|
|
61
|
+
return `https://healthdata.gov/api/views.json?${params.toString()}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parses one page of the catalogue into the entries and the category counts.
|
|
65
|
+
*
|
|
66
|
+
* An entry without an id, a name, or a creation time is a changed shape and
|
|
67
|
+
* stops the parse. An empty page also stops the parse, because a catalogue
|
|
68
|
+
* with no entries is not a usable answer.
|
|
69
|
+
*
|
|
70
|
+
* @param payload - the JSON body from the Socrata discovery API
|
|
71
|
+
* @returns the entries in the page, the counts, and the newest entry
|
|
72
|
+
*/
|
|
73
|
+
export function parseHealthdataSocrataCataloguePayload(payload) {
|
|
74
|
+
const parsed = HEALTHDATA_SOCRATA_CATALOGUE_PAYLOAD_SCHEMA.safeParse(payload);
|
|
75
|
+
if (!parsed.success) {
|
|
76
|
+
throw new UsSourceParseError(HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID, parsed.error.message);
|
|
77
|
+
}
|
|
78
|
+
if (parsed.data.length === 0) {
|
|
79
|
+
throw new UsSourceParseError(HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID, 'The response carried no entries');
|
|
80
|
+
}
|
|
81
|
+
const entries = parsed.data.map((row) => {
|
|
82
|
+
if (row.id === undefined || row.name === undefined || row.createdAt === undefined) {
|
|
83
|
+
throw new UsSourceParseError(HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID, 'A catalogue entry arrived without its id, name, or creation time');
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
id: row.id,
|
|
87
|
+
name: row.name,
|
|
88
|
+
assetType: row.assetType ?? '',
|
|
89
|
+
category: row.category ?? null,
|
|
90
|
+
viewType: row.viewType ?? '',
|
|
91
|
+
createdAtEpochSeconds: row.createdAt,
|
|
92
|
+
viewLastModifiedEpochSeconds: row.viewLastModified ?? row.createdAt,
|
|
93
|
+
viewCount: row.viewCount ?? 0,
|
|
94
|
+
downloadCount: row.downloadCount ?? 0,
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
entries,
|
|
99
|
+
entryCount: entries.length,
|
|
100
|
+
datasetCount: entries.filter((entry) => entry.assetType === 'dataset').length,
|
|
101
|
+
newestEntry: newestHealthdataSocrataEntry(entries),
|
|
102
|
+
categories: countHealthdataSocrataCategories(entries),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reads one page of the HealthData.gov catalogue.
|
|
107
|
+
*
|
|
108
|
+
* One keyless request covers the page and reports what the catalogue holds,
|
|
109
|
+
* without reading any dataset's rows.
|
|
110
|
+
*
|
|
111
|
+
* @param options - an optional entry cap and fetch stub
|
|
112
|
+
* @returns the entries in the page, the counts, and the newest entry
|
|
113
|
+
*/
|
|
114
|
+
export async function fetchHealthdataSocrataCatalogue(options) {
|
|
115
|
+
const fetchImpl = options?.fetchImpl ?? globalThis.fetch;
|
|
116
|
+
const url = buildHealthdataSocrataCatalogueUrl(options?.limit === undefined ? {} : { limit: options.limit });
|
|
117
|
+
const response = await httpGet(HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID, url, { fetchImpl });
|
|
118
|
+
return parseHealthdataSocrataCataloguePayload(await response.json());
|
|
119
|
+
}
|
|
120
|
+
/** HealthData.gov Socrata catalogue of datasets, charts, and stories, keyless. */
|
|
121
|
+
export const healthdataSocrataCatalogueAdapter = {
|
|
122
|
+
id: HEALTHDATA_SOCRATA_CATALOGUE_SOURCE_ID,
|
|
123
|
+
name: 'HealthData.gov catalogue',
|
|
124
|
+
auth: 'none',
|
|
125
|
+
description: 'The HealthData.gov Socrata catalogue, one row per published dataset, chart, or story, with its category, view count, and download count.',
|
|
126
|
+
fetchLive: async (options) => fetchHealthdataSocrataCatalogue(options?.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
127
|
+
parse: (payload) => parseHealthdataSocrataCataloguePayload(payload),
|
|
128
|
+
loadFixture: () => parseHealthdataSocrataCataloguePayload(readFixtureJson(HEALTHDATA_SOCRATA_CATALOGUE_FIXTURE_FILENAME)),
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=healthdataSocrataCatalogue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthdataSocrataCatalogue.js","sourceRoot":"","sources":["../src/healthdataSocrataCatalogue.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifies this client to the public APIs it calls.
|
|
3
|
+
*
|
|
4
|
+
* Several US government endpoints ask callers to identify themselves, and the
|
|
5
|
+
* National Weather Service and SEC reject anonymous callers outright, so every
|
|
6
|
+
* adapter sends this. The string carries no version, so it cannot go stale
|
|
7
|
+
* between releases. Where a source asks for more detail (the SEC wants a
|
|
8
|
+
* contact address, for example) the adapter adds its own header on top.
|
|
9
|
+
*/
|
|
10
|
+
export declare const USER_AGENT = "usa-open-data-connectors (Language=TypeScript)";
|
|
11
|
+
/** Per-request timeout in milliseconds, applied to every adapter. */
|
|
12
|
+
export declare const DEFAULT_TIMEOUT_MS = 30000;
|
|
13
|
+
/** Options shared by the shared HTTP helpers. */
|
|
14
|
+
export interface HttpGetOptions {
|
|
15
|
+
/** Fetch implementation override, used by tests. */
|
|
16
|
+
fetchImpl?: typeof globalThis.fetch | undefined;
|
|
17
|
+
/** Extra request headers, merged over the defaults. */
|
|
18
|
+
headers?: Record<string, string> | undefined;
|
|
19
|
+
/** Overrides {@link DEFAULT_TIMEOUT_MS}. */
|
|
20
|
+
timeoutMs?: number | undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Issues a GET through the shared HTTP layer.
|
|
24
|
+
*
|
|
25
|
+
* Every adapter goes through here so that three things happen the same way
|
|
26
|
+
* for all 22 sources: a `user-agent` identifies the client, a timeout aborts
|
|
27
|
+
* a request that hangs, and a failure carries whether retrying is worthwhile.
|
|
28
|
+
*
|
|
29
|
+
* @param source - Source name used in the error message, e.g. "bls".
|
|
30
|
+
* @param url - Absolute URL or URL object to fetch.
|
|
31
|
+
* @param options - Fetch override, extra headers, and timeout.
|
|
32
|
+
* @returns The response, already checked for a successful status.
|
|
33
|
+
* @throws {UsSourceApiError} On a non-2xx status, an abort, or a network error.
|
|
34
|
+
*/
|
|
35
|
+
export declare function httpGet(source: string, url: string | URL, options?: HttpGetOptions): Promise<Response>;
|
|
36
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,mDAAmD,CAAC;AAE3E,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAQzC,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;IAChD,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAyBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { UsSourceApiError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Identifies this client to the public APIs it calls.
|
|
4
|
+
*
|
|
5
|
+
* Several US government endpoints ask callers to identify themselves, and the
|
|
6
|
+
* National Weather Service and SEC reject anonymous callers outright, so every
|
|
7
|
+
* adapter sends this. The string carries no version, so it cannot go stale
|
|
8
|
+
* between releases. Where a source asks for more detail (the SEC wants a
|
|
9
|
+
* contact address, for example) the adapter adds its own header on top.
|
|
10
|
+
*/
|
|
11
|
+
export const USER_AGENT = 'usa-open-data-connectors (Language=TypeScript)';
|
|
12
|
+
/** Per-request timeout in milliseconds, applied to every adapter. */
|
|
13
|
+
export const DEFAULT_TIMEOUT_MS = 30_000;
|
|
14
|
+
/** The one status code worth retrying: the server is asking us to slow down. */
|
|
15
|
+
const HTTP_TOO_MANY_REQUESTS = 429;
|
|
16
|
+
/** The lowest status code that means the server failed rather than the request. */
|
|
17
|
+
const HTTP_INTERNAL_SERVER_ERROR = 500;
|
|
18
|
+
/**
|
|
19
|
+
* Builds the request headers, letting a caller replace the User-Agent.
|
|
20
|
+
*
|
|
21
|
+
* Most adapters send only the default identity. A few sources (the SEC and
|
|
22
|
+
* the National Weather Service, for example) ask for a more descriptive
|
|
23
|
+
* User-Agent of their own, and that one wins. Other headers merge over the
|
|
24
|
+
* defaults.
|
|
25
|
+
*
|
|
26
|
+
* @param extra - Headers supplied by the adapter.
|
|
27
|
+
* @returns The headers for one request.
|
|
28
|
+
*/
|
|
29
|
+
function buildRequestHeaders(extra) {
|
|
30
|
+
const headers = { 'user-agent': USER_AGENT };
|
|
31
|
+
for (const [name, value] of Object.entries(extra ?? {})) {
|
|
32
|
+
if (name.toLowerCase() === 'user-agent') {
|
|
33
|
+
headers['user-agent'] = value;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
headers[name] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return headers;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Issues a GET through the shared HTTP layer.
|
|
43
|
+
*
|
|
44
|
+
* Every adapter goes through here so that three things happen the same way
|
|
45
|
+
* for all 22 sources: a `user-agent` identifies the client, a timeout aborts
|
|
46
|
+
* a request that hangs, and a failure carries whether retrying is worthwhile.
|
|
47
|
+
*
|
|
48
|
+
* @param source - Source name used in the error message, e.g. "bls".
|
|
49
|
+
* @param url - Absolute URL or URL object to fetch.
|
|
50
|
+
* @param options - Fetch override, extra headers, and timeout.
|
|
51
|
+
* @returns The response, already checked for a successful status.
|
|
52
|
+
* @throws {UsSourceApiError} On a non-2xx status, an abort, or a network error.
|
|
53
|
+
*/
|
|
54
|
+
export async function httpGet(source, url, options = {}) {
|
|
55
|
+
const doFetch = options.fetchImpl ?? globalThis.fetch;
|
|
56
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
59
|
+
let response;
|
|
60
|
+
try {
|
|
61
|
+
response = await doFetch(url, {
|
|
62
|
+
headers: buildRequestHeaders(options.headers),
|
|
63
|
+
signal: controller.signal,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (controller.signal.aborted) {
|
|
68
|
+
throw new UsSourceApiError(source, `request timed out after ${timeoutMs}ms`, {
|
|
69
|
+
retryable: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
throw new UsSourceApiError(source, `request failed: ${String(error)}`, { retryable: true });
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
clearTimeout(timer);
|
|
76
|
+
}
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new UsSourceApiError(source, `HTTP ${response.status}`, {
|
|
79
|
+
status: response.status,
|
|
80
|
+
retryable: response.status === HTTP_TOO_MANY_REQUESTS || response.status >= HTTP_INTERNAL_SERVER_ERROR,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return response;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=http.js.map
|