diff --git a/.gitignore b/.gitignore index 58eb473..a33bd2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules -/dist yarn-error.log diff --git a/dist/api.d.ts b/dist/api.d.ts new file mode 100644 index 0000000..8505177 --- /dev/null +++ b/dist/api.d.ts @@ -0,0 +1,22 @@ +export declare class CongressAPI { + private _congressNumber; + private apiVersion; + private client; + private apiKey; + constructor(options: APIOptions); + private getApi; + request(requestParams: RequestParams): Promise; + readonly congressNumber: number; + withDefaults(params: any): any; +} +interface APIOptions { + apiVersion?: string; + congressNumber?: number; + apiKey: string; +} +interface RequestParams { + format?: 'xml' | 'json'; + offset?: number; + url: string; +} +export {}; diff --git a/dist/api.js b/dist/api.js new file mode 100644 index 0000000..bc8822d --- /dev/null +++ b/dist/api.js @@ -0,0 +1,53 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var axios_1 = __importDefault(require("axios")); +var CongressAPI = /** @class */ (function () { + function CongressAPI(options) { + this._congressNumber = 116; + this.apiVersion = 'v1'; + this.apiKey = options.apiKey; + if (options.congressNumber) { + this._congressNumber = options.congressNumber; + } + this.client = this.getApi(); + } + CongressAPI.prototype.getApi = function () { + return axios_1.default.create({ + baseURL: "https://api.propublica.org/congress/" + this.apiVersion, + headers: { 'X-API-Key': this.apiKey }, + }); + }; + CongressAPI.prototype.request = function (requestParams) { + var url = requestParams.url; + if (requestParams.offset) { + url += "?offset=" + requestParams.offset; + } + return this.client.get(url + "." + requestParams.format); + }; + Object.defineProperty(CongressAPI.prototype, "congressNumber", { + get: function () { + return this._congressNumber; + }, + enumerable: true, + configurable: true + }); + CongressAPI.prototype.withDefaults = function (params) { + return __assign({ format: 'json', congressNumber: this.congressNumber }, params); + }; + return CongressAPI; +}()); +exports.CongressAPI = CongressAPI; diff --git a/dist/committees/index.d.ts b/dist/committees/index.d.ts new file mode 100644 index 0000000..7c3e858 --- /dev/null +++ b/dist/committees/index.d.ts @@ -0,0 +1,21 @@ +import { CommitteeListResult, SingleCommitteeResult, CommitteeHearingListResult, SingleSubcommitteeResult } from './types'; +import { ChamberRequestParams } from '../types'; +interface CongressNumberParams extends ChamberRequestParams { + congressNumber?: number; +} +interface CommitteeParams extends CongressNumberParams { + committeeId: string; +} +interface SubcommitteeParams extends CommitteeParams { + subcommitteeId: string; +} +declare module '../api' { + interface CongressAPI { + getAllCommittees(params: CongressNumberParams): Promise; + getCommittee(params: CommitteeParams): Promise; + getRecentHearings(params: CongressNumberParams): Promise; + getCommitteeHearings(params: CommitteeParams): Promise; + getSubcommittee(params: SubcommitteeParams): Promise; + } +} +export {}; diff --git a/dist/committees/index.js b/dist/committees/index.js new file mode 100644 index 0000000..aad69b9 --- /dev/null +++ b/dist/committees/index.js @@ -0,0 +1,128 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("../api"); +api_1.CongressAPI.prototype.getAllCommittees = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/committees", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getCommittee = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/committees/" + params.committeeId, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getRecentHearings = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/committees/hearings", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getCommitteeHearings = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/committees/" + params.committeeId + "/hearings", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getSubcommittee = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/committees/" + params.committeeId + "/subcommittees/" + params.subcommitteeId, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; diff --git a/dist/committees/types.d.ts b/dist/committees/types.d.ts new file mode 100644 index 0000000..1bc2652 --- /dev/null +++ b/dist/committees/types.d.ts @@ -0,0 +1,89 @@ +import { BaseApiResult, BasePagedResult, CapitalizedChamber, URLString } from '../types'; +import { MemberId } from '../members/types'; +declare type CommitteeId = string; +interface BaseCommittee { + id: CommitteeId; + name: string; + url: URLString; + chair: string; + chair_id: MemberId; + chair_party: 'R' | 'D' | 'I'; + chair_state: string; + ranking_member_id: MemberId; +} +export interface Committee extends BaseCommittee { + api_uri: URLString; + chair_uri: URLString; + subcommittees: BaseSubcommittee[]; +} +interface BaseSubcommittee { + id: CommitteeId; + name: string; + api_uri: URLString; +} +interface Subcommittee { + congress: string; + chamber: CapitalizedChamber; + num_results: number; + id: CommitteeId; + name: string; + committee_id: CommitteeId; + committee_name: string; + committee_url: URLString; + chair: string; + chair_id: MemberId; + chair_party: 'R' | 'D' | 'I'; + chair_state: string; + ranking_member_id: MemberId; + current_members: CommitteeMember[]; +} +interface CommitteeMember { + id: MemberId; + name: string; + api_uri: URLString; + party: 'R' | 'D' | 'I'; + side: string; + rank_in_party: number; + state: string; + note: string; + begin_date: string; +} +interface CommitteeHearing { + chamber: CapitalizedChamber; + committee: string; + committee_code: string; + api_uri: URLString; + date: string; + time: string; + location: string; + description: string; + bill_ids: string[]; + url: URLString; + meeting_type: string; +} +export interface SingleCommittee extends BaseCommittee { + congress: string; + chamber: CapitalizedChamber; + num_results: number; + current_members: CommitteeMember[]; +} +export interface CommitteeListResult extends BaseApiResult { + results: { + congress: string; + chamber: string; + num_results: number; + committees: Committee[]; + }[]; +} +export interface SingleCommitteeResult extends BaseApiResult { + results: SingleCommittee[]; +} +export interface CommitteeHearingListResult extends BaseApiResult { + results: (BasePagedResult & { + hearings: CommitteeHearing[]; + })[]; +} +export interface SingleSubcommitteeResult extends BaseApiResult { + results: Subcommittee[]; +} +export {}; diff --git a/dist/committees/types.js b/dist/committees/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/committees/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/floorActions/index.d.ts b/dist/floorActions/index.d.ts new file mode 100644 index 0000000..4e6cb27 --- /dev/null +++ b/dist/floorActions/index.d.ts @@ -0,0 +1,12 @@ +import { ChamberRequestParams } from '../types'; +import { FloorActionListResult } from './types'; +interface FloorActionsDateParams extends ChamberRequestParams { + date: Date; +} +declare module '../api' { + interface CongressAPI { + getRecentFloorActions(params: ChamberRequestParams): Promise; + getFloorActionsForDate(params: FloorActionsDateParams): Promise; + } +} +export {}; diff --git a/dist/floorActions/index.js b/dist/floorActions/index.js new file mode 100644 index 0000000..899d9b9 --- /dev/null +++ b/dist/floorActions/index.js @@ -0,0 +1,77 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("../api"); +function getDatePath(date) { + return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate(); +} +api_1.CongressAPI.prototype.getRecentFloorActions = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.chamber + "/floor_updates", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getFloorActionsForDate = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.chamber + "/floor_updates/" + getDatePath(params.date), + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; diff --git a/dist/floorActions/types.d.ts b/dist/floorActions/types.d.ts new file mode 100644 index 0000000..0152ddc --- /dev/null +++ b/dist/floorActions/types.d.ts @@ -0,0 +1,18 @@ +import { BaseApiResult, BasePagedResult, CapitalizedChamber } from '../types'; +interface FloorAction { + congress: string; + chamber: CapitalizedChamber; + timestamp: string; + date: string; + action_id: string; + description: string; + bill_ids: string[]; +} +export interface FloorActionListResult extends BaseApiResult { + results: (BasePagedResult & { + congress: string; + date: string; + floor_actions: FloorAction[]; + })[]; +} +export {}; diff --git a/dist/floorActions/types.js b/dist/floorActions/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/floorActions/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..4b0cb41 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,5 @@ +export { CongressAPI } from './api'; +import './committees'; +import './floorActions'; +import './members'; +import './votes'; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..f6ba2d3 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("./api"); +exports.CongressAPI = api_1.CongressAPI; +require("./committees"); +require("./floorActions"); +require("./members"); +require("./votes"); diff --git a/dist/members/index.d.ts b/dist/members/index.d.ts new file mode 100644 index 0000000..88ec697 --- /dev/null +++ b/dist/members/index.d.ts @@ -0,0 +1,37 @@ +import { BaseRequestParams, ChamberRequestParams } from '../types'; +import { MemberListResult, SingleMemberResult, NewMemberListResult, CurrentMemberListResult, LeavingMemberListResult, MemberVotesResult, MemberVoteComparisonResult, MemberBillComparisonResult, MemberCosponsorsResult } from './types'; +interface AllMembersParams extends ChamberRequestParams { + congressNumber?: number; +} +interface MemberIdParams extends BaseRequestParams { + memberId: string; +} +interface MembersForStateParams extends ChamberRequestParams { + state: string; + district?: string; +} +interface LeavingMembersParams extends ChamberRequestParams { + congressNumber?: number; +} +interface TwoMemberParams extends ChamberRequestParams { + congressNumber?: string; + firstMemberId: string; + secondMemberId: string; +} +interface CosponsoredBillsParams extends MemberIdParams { + type: 'cosponsored' | 'withdrawn'; +} +declare module '../api' { + interface CongressAPI { + getAllMembers(params: AllMembersParams): Promise; + getMember(params: MemberIdParams): Promise; + getNewMembers(params: BaseRequestParams): Promise; + getMembersForState(params: MembersForStateParams): Promise; + getLeavingMembers(params: LeavingMembersParams): Promise; + getMemberVotePositions(params: MemberIdParams): Promise; + getMemberVoteComparison(params: TwoMemberParams): Promise; + getMemberSponsorshipsComparison(params: TwoMemberParams): Promise; + getCosponsoredBillsForMember(params: CosponsoredBillsParams): Promise; + } +} +export {}; diff --git a/dist/members/index.js b/dist/members/index.js new file mode 100644 index 0000000..c954993 --- /dev/null +++ b/dist/members/index.js @@ -0,0 +1,201 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("../api"); +api_1.CongressAPI.prototype.getAllMembers = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + this.congressNumber + "/" + params.chamber + "/members", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getMember = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/" + params.memberId, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getNewMembers = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/new", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getMembersForState = function (params) { + return __awaiter(this, void 0, void 0, function () { + var url, response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + url = "/members/" + params.chamber + "/" + params.state + "/current"; + if (params.district) { + url = "/members/" + params.chamber + "/" + params.state + "/" + params.district + "/current"; + } + return [4 /*yield*/, this.request({ url: url, format: params.format })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getLeavingMembers = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: params.congressNumber + "/" + params.chamber + "/members/leaving", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getMemberVotePositions = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/" + params.memberId + "/votes", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getMemberVoteComparison = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/" + params.firstMemberId + "/votes/" + params.secondMemberId + "/" + params.congressNumber + "/" + params.chamber, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getMemberSponsorshipsComparison = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/" + params.firstMemberId + "/bills/" + params.secondMemberId + "/" + params.congressNumber + "/" + params.chamber, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getCosponsoredBillsForMember = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/members/" + params.memberId + "/bills/" + params.type, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; diff --git a/dist/members/types.d.ts b/dist/members/types.d.ts new file mode 100644 index 0000000..4e9feae --- /dev/null +++ b/dist/members/types.d.ts @@ -0,0 +1,288 @@ +import { BaseApiResult, CapitalizedChamber, URLString } from '../types'; +export declare type MemberId = string; +interface SharedMember { + title: string; + short_title: string; + state: string; + party: 'R' | 'D' | 'ID'; + leadership_role: string; + fec_candidate_id: string; + lis_id: string; + ocd_id: string; + seniority: string; + senate_class: number | string; + state_rank: string; + office: string; + phone: string; + fax: string; + contact_form: URLString; + missed_votes_pct: number; + votes_with_party_pct: number; +} +interface MemberName { + first_name: string; + middle_name: string; + last_name: string; + suffix: string; +} +export interface Member extends SharedMember, MemberName { + id: MemberId; + api_uri: URLString; + date_of_birth: string; + gender: 'M' | 'F'; + twitter_account: string; + facebook_account: string; + youtube_account: string; + govtrack_id: string; + cspan_id: string; + votesmart_id: string; + icpsr_id: string; + crp_id: string; + google_entity_id: string; + url: URLString; + rss_url: URLString; + in_office: boolean; + dw_nominate: number; + ideal_point: any; + next_election: string; + total_votes: number; + missed_votes: number; + total_present: number; + last_updated: string; + senate_class: string; +} +interface MemberRole extends SharedMember { + congress: string; + chamber: CapitalizedChamber; + senate_class: number; + start_date: string; + end_date: string; + bills_sponsored: number; + bills_cosponsored: number; + committees: Committee[]; + subcommittees: SubCommittee[]; +} +interface Committee { + name: string; + code: string; + api_uri: URLString; + side: string; + title: string; + rank_in_party: number; + begin_date: string; + end_date: string; +} +interface SubCommittee extends Committee { + parent_committee_id: string; +} +export interface SingleMember extends MemberName { + member_id: MemberId; + date_of_birth: string; + gender: 'M' | 'F'; + url: URLString; + times_topics_url: URLString; + times_tag: string; + govtract_id: string; + cspan_id: string; + votesmart_id: string; + icpsr_id: string; + twitter_account: string; + facebook_account: string; + youtube_account: string; + crp_id: string; + google_entity_id: string; + rss_url: URLString; + in_office: boolean; + current_party: 'D' | 'R' | 'I'; + most_recent_vote: string; + last_updated: string; + roles: MemberRole[]; +} +export interface NewMember extends MemberName { + id: MemberId; + api_uri: URLString; + party: 'R' | 'D' | 'I'; + chamber: CapitalizedChamber; + state: string; + district: string; + start_date: string; +} +export interface CurrentMember extends MemberName { + id: MemberId; + name: string; + role: string; + gender: 'M' | 'F'; + party: 'R' | 'D' | 'I'; + times_topics_url: URLString; + twitter_id: string; + facebook_account: string; + youtube_id: string; + seniority: string; + next_election: string; + api_uri: URLString; +} +export interface LeavingMember extends MemberName { + id: MemberId; + api_uri: string; + party: 'D' | 'R' | 'I'; + state: string; + district: string; + begin_date: string; + end_date: string; + status: string; + note: string; +} +export interface MemberVotes { + member_id: MemberId; + total_votes: string; + offset: string; + votes: MemberVote[]; +} +interface MemberVote { + member_id: MemberId; + chamber: CapitalizedChamber; + congress: string; + session: string; + roll_call: string; + vote_uri: URLString; + bill: { + bill_id: string; + number: string; + bill_uri: URLString; + title: string; + latest_action: string; + }; + description: string; + question: string; + result: string; + date: string; + time: string; + total: { + yes: number; + no: number; + present: number; + not_voting: number; + }; + position: string; +} +interface MemberVoteComparison { + first_member_id: MemberId; + first_member_api_uri: URLString; + second_member_id: MemberId; + second_member_api_uri: URLString; + congress: string; + chamber: CapitalizedChamber; + common_votes: string; + disagree_votes: string; + agree_percent: string; + disagree_percent: string; +} +interface MemberBill { + number: string; + api_uri: URLString; + title: string; + sponsor_uri: URLString; + introduced_date: string; + cosponsors: string; + committees: string; + latest_major_action_date: string; + latest_major_action: string; + first_member_date: string; + second_member_date: string; +} +interface MemberBillComparison { + first_member_api_uri: URLString; + second_member_api_uri: URLString; + chamber: CapitalizedChamber; + congress: string; + common_bills: string; + bills: MemberBill[]; +} +interface CosponsoredBill { + congress: string; + bill_id: string; + bill_type: string; + number: string; + bill_uri: URLString; + title: string; + short_title: string; + cosponsored_date: string; + sponsor_title: string; + sponsor_id: string; + sponsor_name: string; + sponsor_state: string; + sponsor_party: string; + sponsor_uri: URLString; + gpo_pdf_uri: URLString; + congressdotgov_url: URLString; + govtrack_url: URLString; + introduced_date: string; + active: boolean; + last_vote: string; + house_passage: boolean; + senate_passage: boolean; + enacted: boolean; + vetoed: boolean; + cosponsors: number; + cosponsors_by_party: { + R: number; + D: number; + I: number; + }; + committees: string; + primary_subject: string; + summary: string; + summary_short: string; + latest_major_action_date: string; + latest_major_action: string; +} +interface MemberCosponsors { + id: string; + member_uri: URLString; + name: string; + num_results: number; + offset: number; + bills: CosponsoredBill[]; +} +export interface MemberListResult extends BaseApiResult { + results: { + congress: string; + chamber: CapitalizedChamber; + num_results: number; + offset: number; + members: Member[]; + }; +} +export interface SingleMemberResult extends BaseApiResult { + results: SingleMember[]; +} +export interface NewMemberListResult extends BaseApiResult { + results: { + num_results: string; + offset: string; + members: NewMember[]; + }; +} +export interface CurrentMemberListResult extends BaseApiResult { + results: CurrentMember[]; +} +export interface LeavingMemberListResult extends BaseApiResult { + congress: string; + chamber: CapitalizedChamber; + num_results: number; + offset: number; + members: LeavingMember[]; +} +export interface MemberVotesResult extends BaseApiResult { + results: MemberVotes[]; +} +export interface MemberVoteComparisonResult extends BaseApiResult { + results: MemberVoteComparison; +} +export interface MemberBillComparisonResult extends BaseApiResult { + results: MemberBillComparison[]; +} +export interface MemberCosponsorsResult extends BaseApiResult { + results: MemberCosponsors[]; +} +export {}; diff --git a/dist/members/types.js b/dist/members/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/members/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..7e0b56d --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,22 @@ +export declare type CapitalizedChamber = 'House' | 'Senate'; +export declare type Chamber = 'house' | 'senate'; +export declare type URLString = string; +export interface BaseApiResult { + status: string; + copyright: string; + results: any; +} +export interface BasePagedResult { + chamber: CapitalizedChamber; + num_results: number; + offset: number; +} +export interface BaseRequestParams { + format?: 'json' | 'xml'; +} +export interface ChamberRequestParams extends BaseRequestParams { + chamber: Chamber; +} +export interface PagedRequestParams extends BaseRequestParams { + offset?: number; +} diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/votes/index.d.ts b/dist/votes/index.d.ts new file mode 100644 index 0000000..0e38cbf --- /dev/null +++ b/dist/votes/index.d.ts @@ -0,0 +1,32 @@ +import { VoteListResult, SingleVoteResult, NominationVotesResult } from './types'; +import { ChamberRequestParams, PagedRequestParams, BaseRequestParams } from '../types'; +interface RollCallVoteParams extends ChamberRequestParams, PagedRequestParams { + congressNumber?: number; + number: number; + sessionNumber?: 1 | 2; +} +interface DateRangeParams extends ChamberRequestParams { + startDate: Date; + endDate: Date; +} +interface DateParams extends ChamberRequestParams { + date: Date; +} +interface VoteTypeParams extends ChamberRequestParams { + congressNumber?: number; + type: 'missed' | 'party' | 'loneno' | 'perfect'; +} +interface NominationParams extends BaseRequestParams { + congressNumber?: number; +} +declare module '../api' { + interface CongressAPI { + getNominationVotes(params: NominationParams): Promise; + getRecentVotes(params: ChamberRequestParams): Promise; + getRollCallVote(params: RollCallVoteParams): Promise; + getVotesForDateRange(params: DateRangeParams): Promise; + getVotesForDate(params: DateParams): Promise; + getVotesForType(params: VoteTypeParams): Promise; + } +} +export {}; diff --git a/dist/votes/index.js b/dist/votes/index.js new file mode 100644 index 0000000..bfdf09f --- /dev/null +++ b/dist/votes/index.js @@ -0,0 +1,153 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("../api"); +function getDateString(date) { + return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); +} +api_1.CongressAPI.prototype.getNominationVotes = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/nominations", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getRecentVotes = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.chamber + "/votes/recent", + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getRollCallVote = function (params) { + return __awaiter(this, void 0, void 0, function () { + var sessionNumber, response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + sessionNumber = params.sessionNumber || new Date().getUTCFullYear() % 2 ? 2 : 1; + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/sessions/" + sessionNumber + "/votes/" + params.number, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getVotesForDateRange = function (params) { + return __awaiter(this, void 0, void 0, function () { + var startString, endString, response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + startString = getDateString(params.startDate); + endString = getDateString(params.endDate); + return [4 /*yield*/, this.request({ + url: "/" + params.chamber + "/votes/" + startString + "/" + endString, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getVotesForDate = function (params) { + return __awaiter(this, void 0, void 0, function () { + var dateString, response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + dateString = getDateString(params.date); + return [4 /*yield*/, this.request({ + url: "/" + params.chamber + "/votes/" + dateString + "/" + dateString, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; +api_1.CongressAPI.prototype.getVotesForType = function (params) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + params = this.withDefaults(params); + return [4 /*yield*/, this.request({ + url: "/" + params.congressNumber + "/" + params.chamber + "/votes/" + params.type, + format: params.format, + })]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.data]; + } + }); + }); +}; diff --git a/dist/votes/types.d.ts b/dist/votes/types.d.ts new file mode 100644 index 0000000..c5aad01 --- /dev/null +++ b/dist/votes/types.d.ts @@ -0,0 +1,152 @@ +import { BaseApiResult, BasePagedResult, CapitalizedChamber, URLString } from '../types'; +export interface Bill { + number: string; + bill_id: string; + api_uri: URLString; + title: string; + latest_action: string; +} +export interface Nomination { + nomination_id: string; + number: string; + name: string; + agency: string; +} +interface VotePosition { + member_id: string; + name: string; + party: 'R' | 'D' | 'I'; + state: string; + vote_position: 'Yes' | 'No' | 'Not Voting'; + dw_nominate: number; +} +interface VoteTotal { + yes: number; + no: number; + present: number; + not_voting: number; + majority_position?: 'Yes' | 'No'; +} +interface Member { + id: string; + api_uri: URLString; + name: string; + party: 'R' | 'D' | 'I'; + state: string; +} +interface MemberMissedVotes extends Member { + total_votes: number; + missed_votes: number; + missed_votes_pct: number; + rank: number; + notes: string; +} +interface MemberPartyVotes extends Member { + total_votes: number; + votes_with_party: number; + party_votes_pct: number; + rank: number; + notes: string; +} +interface MemberLoneNoVotes extends Member { + total_votes: number; + loneno: number; + rank: number; + notes: string; +} +interface MemberPerfectVotes extends Member { + total_votes: number; + notes: string; +} +/** + * Of the format: + * + * "Ryan (WI)": 239, + * "Pelosi": 189, + * "Ryan (OH)": 2, + * "Cooper": 1, + * "Webster": 1, + * "Not Voting": 2, + * "Lewis (GA)": 1 + */ +interface SpeakerVoteTotal { + [key: string]: number; +} +interface Vote { + congress: number; + chamber: CapitalizedChamber; + session: number; + roll_call: number; + source: URLString; + url: URLString; + vote_uri: URLString; + bill?: Bill; + amendment: {}; + nomination?: Nomination; + question: string; + question_text: string; + description: string; + vote_type: '1/2' | '2/3 YEA-AND-NAY' | '3/5' | 'YEA_AND_NAY' | 'RECORDED VOTE'; + date: string; + time: string; + result: string; + tie_breaker?: string; + tie_breaker_vote?: 'Yea' | 'Nay'; + document_number: string; + document_title: string; + democratic: VoteTotal; + republican: VoteTotal | SpeakerVoteTotal; + independent: VoteTotal | SpeakerVoteTotal; + total: VoteTotal | SpeakerVoteTotal; +} +interface VoteWithPositions extends Vote { + positions: VotePosition[]; + vacant_seats: []; +} +export interface VoteListResult extends BaseApiResult { + results: { + chamber: CapitalizedChamber; + offset: number; + num_results: number; + votes: Vote[]; + }; +} +export interface NominationVotesResult extends BaseApiResult { + results: { + offset: number; + total_votes: number; + votes: Vote[]; + }; +} +export interface SingleVoteResult extends BaseApiResult { + results: { + votes: { + vote: VoteWithPositions; + }; + }; +} +export interface MemberMissedVotesResult extends BaseApiResult { + results: BasePagedResult & { + congress: number; + members: MemberMissedVotes[]; + }; +} +export interface MemberPartyVotesResult extends BaseApiResult { + results: BasePagedResult & { + congress: number; + members: MemberPartyVotes[]; + }; +} +export interface MemberLoneNoVotesResult extends BaseApiResult { + results: BasePagedResult & { + congress: number; + members: MemberLoneNoVotes[]; + }; +} +export interface MemberPerfectVotesResult extends BaseApiResult { + results: BasePagedResult & { + congress: number; + members: MemberPerfectVotes[]; + }; +} +export {}; diff --git a/dist/votes/types.js b/dist/votes/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/votes/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true });