@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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +442 -214
  3. package/dist/apiKey.d.ts +12 -0
  4. package/dist/apiKey.d.ts.map +1 -0
  5. package/dist/apiKey.js +18 -0
  6. package/dist/apiKey.js.map +1 -0
  7. package/dist/blsSeries.d.ts.map +1 -1
  8. package/dist/blsSeries.js +2 -4
  9. package/dist/blsSeries.js.map +1 -1
  10. package/dist/btsTransportationStats.d.ts +87 -0
  11. package/dist/btsTransportationStats.d.ts.map +1 -0
  12. package/dist/btsTransportationStats.js +130 -0
  13. package/dist/btsTransportationStats.js.map +1 -0
  14. package/dist/cdcCountyObesity.d.ts.map +1 -1
  15. package/dist/cdcCountyObesity.js +3 -5
  16. package/dist/cdcCountyObesity.js.map +1 -1
  17. package/dist/cdcSocrataCatalogue.d.ts +87 -0
  18. package/dist/cdcSocrataCatalogue.d.ts.map +1 -0
  19. package/dist/cdcSocrataCatalogue.js +130 -0
  20. package/dist/cdcSocrataCatalogue.js.map +1 -0
  21. package/dist/cfpbConsumerComplaints.d.ts +2 -0
  22. package/dist/cfpbConsumerComplaints.d.ts.map +1 -1
  23. package/dist/cfpbConsumerComplaints.js +12 -12
  24. package/dist/cfpbConsumerComplaints.js.map +1 -1
  25. package/dist/clinicalTrialsStudies.d.ts +92 -0
  26. package/dist/clinicalTrialsStudies.d.ts.map +1 -0
  27. package/dist/clinicalTrialsStudies.js +147 -0
  28. package/dist/clinicalTrialsStudies.js.map +1 -0
  29. package/dist/cpscProductRecalls.d.ts.map +1 -1
  30. package/dist/cpscProductRecalls.js +2 -4
  31. package/dist/cpscProductRecalls.js.map +1 -1
  32. package/dist/epaEnvirofactsFacilities.d.ts +94 -0
  33. package/dist/epaEnvirofactsFacilities.d.ts.map +1 -0
  34. package/dist/epaEnvirofactsFacilities.js +140 -0
  35. package/dist/epaEnvirofactsFacilities.js.map +1 -0
  36. package/dist/errors.d.ts +12 -2
  37. package/dist/errors.d.ts.map +1 -1
  38. package/dist/errors.js +8 -4
  39. package/dist/errors.js.map +1 -1
  40. package/dist/estimatetaxIncomeTax.d.ts +140 -0
  41. package/dist/estimatetaxIncomeTax.d.ts.map +1 -0
  42. package/dist/estimatetaxIncomeTax.js +225 -0
  43. package/dist/estimatetaxIncomeTax.js.map +1 -0
  44. package/dist/fdicBankDirectory.d.ts +78 -0
  45. package/dist/fdicBankDirectory.d.ts.map +1 -0
  46. package/dist/fdicBankDirectory.js +122 -0
  47. package/dist/fdicBankDirectory.js.map +1 -0
  48. package/dist/femaDisasterDeclarations.d.ts.map +1 -1
  49. package/dist/femaDisasterDeclarations.js +2 -4
  50. package/dist/femaDisasterDeclarations.js.map +1 -1
  51. package/dist/healthdataSocrataCatalogue.d.ts +87 -0
  52. package/dist/healthdataSocrataCatalogue.d.ts.map +1 -0
  53. package/dist/healthdataSocrataCatalogue.js +130 -0
  54. package/dist/healthdataSocrataCatalogue.js.map +1 -0
  55. package/dist/http.d.ts +36 -0
  56. package/dist/http.d.ts.map +1 -0
  57. package/dist/http.js +85 -0
  58. package/dist/http.js.map +1 -0
  59. package/dist/index.d.ts +61 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +31 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/ncbiPubmedSearch.d.ts +71 -0
  64. package/dist/ncbiPubmedSearch.d.ts.map +1 -0
  65. package/dist/ncbiPubmedSearch.js +126 -0
  66. package/dist/ncbiPubmedSearch.js.map +1 -0
  67. package/dist/nceiAnnualTemperature.d.ts.map +1 -1
  68. package/dist/nceiAnnualTemperature.js +3 -5
  69. package/dist/nceiAnnualTemperature.js.map +1 -1
  70. package/dist/noaaSeaLevel.d.ts.map +1 -1
  71. package/dist/noaaSeaLevel.js +2 -4
  72. package/dist/noaaSeaLevel.js.map +1 -1
  73. package/dist/nwsPointForecast.d.ts +99 -0
  74. package/dist/nwsPointForecast.d.ts.map +1 -0
  75. package/dist/nwsPointForecast.js +147 -0
  76. package/dist/nwsPointForecast.js.map +1 -0
  77. package/dist/nycOpenDataCatalogue.d.ts +97 -0
  78. package/dist/nycOpenDataCatalogue.d.ts.map +1 -0
  79. package/dist/nycOpenDataCatalogue.js +151 -0
  80. package/dist/nycOpenDataCatalogue.js.map +1 -0
  81. package/dist/openFdaFoodRecalls.d.ts.map +1 -1
  82. package/dist/openFdaFoodRecalls.js +2 -4
  83. package/dist/openFdaFoodRecalls.js.map +1 -1
  84. package/dist/registry.d.ts.map +1 -1
  85. package/dist/registry.js +30 -2
  86. package/dist/registry.js.map +1 -1
  87. package/dist/secEdgarFilings.d.ts +103 -0
  88. package/dist/secEdgarFilings.d.ts.map +1 -0
  89. package/dist/secEdgarFilings.js +215 -0
  90. package/dist/secEdgarFilings.js.map +1 -0
  91. package/dist/treasuryAvgInterestRate.d.ts.map +1 -1
  92. package/dist/treasuryAvgInterestRate.js +2 -4
  93. package/dist/treasuryAvgInterestRate.js.map +1 -1
  94. package/dist/treasuryDebtToPenny.d.ts +90 -0
  95. package/dist/treasuryDebtToPenny.d.ts.map +1 -0
  96. package/dist/treasuryDebtToPenny.js +168 -0
  97. package/dist/treasuryDebtToPenny.js.map +1 -0
  98. package/dist/usaspendingAgencies.d.ts +78 -0
  99. package/dist/usaspendingAgencies.d.ts.map +1 -0
  100. package/dist/usaspendingAgencies.js +119 -0
  101. package/dist/usaspendingAgencies.js.map +1 -0
  102. package/dist/usgsEarthquakes.d.ts.map +1 -1
  103. package/dist/usgsEarthquakes.js +2 -4
  104. package/dist/usgsEarthquakes.js.map +1 -1
  105. package/dist/usgsPeakStreamflow.d.ts.map +1 -1
  106. package/dist/usgsPeakStreamflow.js +3 -5
  107. package/dist/usgsPeakStreamflow.js.map +1 -1
  108. 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"femaDisasterDeclarations.d.ts","sourceRoot":"","sources":["../src/femaDisasterDeclarations.ts"],"names":[],"mappings":"AAIA,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,CAUpC;AAED,2CAA2C;AAC3C,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC,wBAAwB,CAanF,CAAC"}
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 fetchImpl(url);
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