@goodparty_org/sdk 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,36 @@
1
+ import { FetchOptions } from 'ofetch';
1
2
  import { ReadCampaignOutput, ListCampaignsPagination, PaginatedList, UpdateCampaignM2MInput, SetDistrictOutput, CreateEcanvasserInput, Ecanvasser, EcanvasserSummary, PaginationOptions, ListUsersPagination, ReadUserOutput, UpdateUserInput, UpdatePasswordInput, CampaignTier as CampaignTier$1, UserRole as UserRole$1, WhyBrowsing as WhyBrowsing$1 } from '@goodparty_org/contracts';
2
3
  export { AiChatMessage, AiContentData, AiContentGenerationStatus, AiContentInputValues, BALLOT_READY_POSITION_LEVEL_VALUES, BallotReadyPositionLevel, CAMPAIGN_CREATED_BY_VALUES, CAMPAIGN_LAUNCH_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CAMPAIGN_TIER_VALUES, ReadCampaignOutput as Campaign, CampaignAiContent, CampaignCreatedBy, CampaignData, CampaignDetails, CampaignFinance, CampaignLaunchStatus, CampaignPlan, CampaignPlanStatus, CampaignStatus, CreateEcanvasserInput, CustomIssue, CustomVoterFile, ELECTION_LEVEL_VALUES, Ecanvasser, EcanvasserSummary, ElectionLevel, GENERATION_STATUS_VALUES, GenerationStatus, GeoLocation, HubSpotUpdates, ListCampaignsPagination, ListUsersPagination, ONBOARDING_STEP_VALUES, OnboardingStep, Opponent, PaginatedList, PaginationMeta, PaginationOptions, ReadCampaignOutput, ReadUserOutput, SetDistrictOutput, USER_ROLE_VALUES, UpdateCampaignM2MInput as UpdateCampaignInput, UpdatePasswordInput, UpdateUserInput, ReadUserOutput as User, UserMetaData, VoterGoals, WHY_BROWSING_VALUES } from '@goodparty_org/contracts';
3
- import { FetchOptions } from 'ofetch';
4
+
5
+ type ImpersonateUserInput = {
6
+ actorClerkId: string;
7
+ };
8
+ type ImpersonateUserOutput = {
9
+ token: string;
10
+ };
11
+
12
+ type OfetchRequestBody = FetchOptions<'json'>['body'];
13
+ declare class HttpClient {
14
+ private baseUrl;
15
+ private getToken;
16
+ constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
17
+ request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
18
+ }
19
+
20
+ declare abstract class BaseResource {
21
+ protected httpClient: HttpClient;
22
+ protected abstract readonly resourceBasePath: string;
23
+ constructor(httpClient: HttpClient);
24
+ protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
25
+ protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
26
+ protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
27
+ protected deleteRequest: <T>(path: string) => Promise<T>;
28
+ }
29
+
30
+ declare class AdminResource extends BaseResource {
31
+ protected readonly resourceBasePath = "/admin";
32
+ impersonateUser: (targetUserId: number, actorClerkId: string) => Promise<ImpersonateUserOutput>;
33
+ }
4
34
 
5
35
  type DistrictTypeItem = {
6
36
  id: string;
@@ -26,24 +56,6 @@ type UpdateDistrictInput = {
26
56
  L2DistrictName: string;
27
57
  };
28
58
 
29
- type OfetchRequestBody = FetchOptions<'json'>['body'];
30
- declare class HttpClient {
31
- private baseUrl;
32
- private getToken;
33
- constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
34
- request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
35
- }
36
-
37
- declare abstract class BaseResource {
38
- protected httpClient: HttpClient;
39
- protected abstract readonly resourceBasePath: string;
40
- constructor(httpClient: HttpClient);
41
- protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
42
- protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
43
- protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
44
- protected deleteRequest: <T>(path: string) => Promise<T>;
45
- }
46
-
47
59
  declare class CampaignsResource extends BaseResource {
48
60
  protected readonly resourceBasePath = "/campaigns";
49
61
  get: (id: number) => Promise<ReadCampaignOutput>;
@@ -182,6 +194,7 @@ type GoodPartyClientConfig = {
182
194
  gpApiRootUrl: string;
183
195
  };
184
196
  declare class GoodPartyClient {
197
+ readonly admin: AdminResource;
185
198
  readonly users: UsersResource;
186
199
  readonly campaigns: CampaignsResource;
187
200
  readonly ecanvasser: EcanvasserResource;
@@ -210,4 +223,4 @@ declare const WhyBrowsing: EnumObject<readonly ["considering", "learning", "test
210
223
  type CampaignTier = CampaignTier$1;
211
224
  declare const CampaignTier: EnumObject<readonly ["WIN", "LOSE", "TOSSUP"]>;
212
225
 
213
- export { CampaignTier, type DistrictNameItem, type DistrictTypeItem, type ElectedOffice, GoodPartyClient, type GoodPartyClientConfig, type ListDistrictNamesOptions, type ListDistrictTypesOptions, type ListElectedOfficesOptions, type ListPathsToVictoryOptions, P2VSource, P2VStatus, type PathToVictory, type PathToVictoryData, SdkError, type UpdateDistrictInput, type UpdateElectedOfficeInput, type UpdatePathToVictoryInput, UserRole, type ViabilityScore, WhyBrowsing };
226
+ export { CampaignTier, type DistrictNameItem, type DistrictTypeItem, type ElectedOffice, GoodPartyClient, type GoodPartyClientConfig, type ImpersonateUserInput, type ImpersonateUserOutput, type ListDistrictNamesOptions, type ListDistrictTypesOptions, type ListElectedOfficesOptions, type ListPathsToVictoryOptions, P2VSource, P2VStatus, type PathToVictory, type PathToVictoryData, SdkError, type UpdateDistrictInput, type UpdateElectedOfficeInput, type UpdatePathToVictoryInput, UserRole, type ViabilityScore, WhyBrowsing };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,36 @@
1
+ import { FetchOptions } from 'ofetch';
1
2
  import { ReadCampaignOutput, ListCampaignsPagination, PaginatedList, UpdateCampaignM2MInput, SetDistrictOutput, CreateEcanvasserInput, Ecanvasser, EcanvasserSummary, PaginationOptions, ListUsersPagination, ReadUserOutput, UpdateUserInput, UpdatePasswordInput, CampaignTier as CampaignTier$1, UserRole as UserRole$1, WhyBrowsing as WhyBrowsing$1 } from '@goodparty_org/contracts';
2
3
  export { AiChatMessage, AiContentData, AiContentGenerationStatus, AiContentInputValues, BALLOT_READY_POSITION_LEVEL_VALUES, BallotReadyPositionLevel, CAMPAIGN_CREATED_BY_VALUES, CAMPAIGN_LAUNCH_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CAMPAIGN_TIER_VALUES, ReadCampaignOutput as Campaign, CampaignAiContent, CampaignCreatedBy, CampaignData, CampaignDetails, CampaignFinance, CampaignLaunchStatus, CampaignPlan, CampaignPlanStatus, CampaignStatus, CreateEcanvasserInput, CustomIssue, CustomVoterFile, ELECTION_LEVEL_VALUES, Ecanvasser, EcanvasserSummary, ElectionLevel, GENERATION_STATUS_VALUES, GenerationStatus, GeoLocation, HubSpotUpdates, ListCampaignsPagination, ListUsersPagination, ONBOARDING_STEP_VALUES, OnboardingStep, Opponent, PaginatedList, PaginationMeta, PaginationOptions, ReadCampaignOutput, ReadUserOutput, SetDistrictOutput, USER_ROLE_VALUES, UpdateCampaignM2MInput as UpdateCampaignInput, UpdatePasswordInput, UpdateUserInput, ReadUserOutput as User, UserMetaData, VoterGoals, WHY_BROWSING_VALUES } from '@goodparty_org/contracts';
3
- import { FetchOptions } from 'ofetch';
4
+
5
+ type ImpersonateUserInput = {
6
+ actorClerkId: string;
7
+ };
8
+ type ImpersonateUserOutput = {
9
+ token: string;
10
+ };
11
+
12
+ type OfetchRequestBody = FetchOptions<'json'>['body'];
13
+ declare class HttpClient {
14
+ private baseUrl;
15
+ private getToken;
16
+ constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
17
+ request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
18
+ }
19
+
20
+ declare abstract class BaseResource {
21
+ protected httpClient: HttpClient;
22
+ protected abstract readonly resourceBasePath: string;
23
+ constructor(httpClient: HttpClient);
24
+ protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
25
+ protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
26
+ protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
27
+ protected deleteRequest: <T>(path: string) => Promise<T>;
28
+ }
29
+
30
+ declare class AdminResource extends BaseResource {
31
+ protected readonly resourceBasePath = "/admin";
32
+ impersonateUser: (targetUserId: number, actorClerkId: string) => Promise<ImpersonateUserOutput>;
33
+ }
4
34
 
5
35
  type DistrictTypeItem = {
6
36
  id: string;
@@ -26,24 +56,6 @@ type UpdateDistrictInput = {
26
56
  L2DistrictName: string;
27
57
  };
28
58
 
29
- type OfetchRequestBody = FetchOptions<'json'>['body'];
30
- declare class HttpClient {
31
- private baseUrl;
32
- private getToken;
33
- constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
34
- request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
35
- }
36
-
37
- declare abstract class BaseResource {
38
- protected httpClient: HttpClient;
39
- protected abstract readonly resourceBasePath: string;
40
- constructor(httpClient: HttpClient);
41
- protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
42
- protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
43
- protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
44
- protected deleteRequest: <T>(path: string) => Promise<T>;
45
- }
46
-
47
59
  declare class CampaignsResource extends BaseResource {
48
60
  protected readonly resourceBasePath = "/campaigns";
49
61
  get: (id: number) => Promise<ReadCampaignOutput>;
@@ -182,6 +194,7 @@ type GoodPartyClientConfig = {
182
194
  gpApiRootUrl: string;
183
195
  };
184
196
  declare class GoodPartyClient {
197
+ readonly admin: AdminResource;
185
198
  readonly users: UsersResource;
186
199
  readonly campaigns: CampaignsResource;
187
200
  readonly ecanvasser: EcanvasserResource;
@@ -210,4 +223,4 @@ declare const WhyBrowsing: EnumObject<readonly ["considering", "learning", "test
210
223
  type CampaignTier = CampaignTier$1;
211
224
  declare const CampaignTier: EnumObject<readonly ["WIN", "LOSE", "TOSSUP"]>;
212
225
 
213
- export { CampaignTier, type DistrictNameItem, type DistrictTypeItem, type ElectedOffice, GoodPartyClient, type GoodPartyClientConfig, type ListDistrictNamesOptions, type ListDistrictTypesOptions, type ListElectedOfficesOptions, type ListPathsToVictoryOptions, P2VSource, P2VStatus, type PathToVictory, type PathToVictoryData, SdkError, type UpdateDistrictInput, type UpdateElectedOfficeInput, type UpdatePathToVictoryInput, UserRole, type ViabilityScore, WhyBrowsing };
226
+ export { CampaignTier, type DistrictNameItem, type DistrictTypeItem, type ElectedOffice, GoodPartyClient, type GoodPartyClientConfig, type ImpersonateUserInput, type ImpersonateUserOutput, type ListDistrictNamesOptions, type ListDistrictTypesOptions, type ListElectedOfficesOptions, type ListPathsToVictoryOptions, P2VSource, P2VStatus, type PathToVictory, type PathToVictoryData, SdkError, type UpdateDistrictInput, type UpdateElectedOfficeInput, type UpdatePathToVictoryInput, UserRole, type ViabilityScore, WhyBrowsing };
package/dist/index.js CHANGED
@@ -102,6 +102,15 @@ var BaseResource = class {
102
102
  deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
103
103
  };
104
104
 
105
+ // src/resources/AdminResource.ts
106
+ var AdminResource = class extends BaseResource {
107
+ resourceBasePath = "/admin";
108
+ impersonateUser = (targetUserId, actorClerkId) => this.postRequest(
109
+ `${this.resourceBasePath}/users/impersonate/${targetUserId}`,
110
+ { actorClerkId }
111
+ );
112
+ };
113
+
105
114
  // src/resources/CampaignsResource.ts
106
115
  var CampaignsResource = class extends BaseResource {
107
116
  resourceBasePath = "/campaigns";
@@ -263,6 +272,7 @@ var ClerkService = class {
263
272
 
264
273
  // src/GoodPartyClient.ts
265
274
  var GoodPartyClient = class _GoodPartyClient {
275
+ admin;
266
276
  users;
267
277
  campaigns;
268
278
  ecanvasser;
@@ -273,6 +283,7 @@ var GoodPartyClient = class _GoodPartyClient {
273
283
  constructor(clerkService, gpApiRootUrl) {
274
284
  this.clerkService = clerkService;
275
285
  const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
286
+ this.admin = new AdminResource(httpClient);
276
287
  this.users = new UsersResource(httpClient);
277
288
  this.campaigns = new CampaignsResource(httpClient);
278
289
  this.ecanvasser = new EcanvasserResource(httpClient);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/PathsToVictoryResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/enums.ts","../src/types/pathToVictory.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\n\nexport type {\n PaginationMeta,\n PaginatedList,\n PaginationOptions,\n ReadUserOutput,\n ReadUserOutput as User,\n UpdatePasswordInput,\n UpdateUserInput,\n UserMetaData,\n ListUsersPagination,\n ReadCampaignOutput,\n ReadCampaignOutput as Campaign,\n CampaignDetails,\n CampaignData,\n CampaignAiContent,\n VoterGoals,\n CustomVoterFile,\n AiChatMessage,\n AiContentInputValues,\n AiContentGenerationStatus,\n AiContentData,\n GeoLocation,\n CustomIssue,\n Opponent,\n HubSpotUpdates,\n CampaignFinance,\n CampaignPlan,\n CampaignPlanStatus,\n ListCampaignsPagination,\n SetDistrictOutput,\n UpdateCampaignM2MInput as UpdateCampaignInput,\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\n\nexport {\n USER_ROLE_VALUES,\n WHY_BROWSING_VALUES,\n CAMPAIGN_TIER_VALUES,\n BALLOT_READY_POSITION_LEVEL_VALUES,\n ELECTION_LEVEL_VALUES,\n CAMPAIGN_CREATED_BY_VALUES,\n CAMPAIGN_LAUNCH_STATUS_VALUES,\n CAMPAIGN_STATUS_VALUES,\n ONBOARDING_STEP_VALUES,\n GENERATION_STATUS_VALUES,\n BallotReadyPositionLevel,\n ElectionLevel,\n CampaignCreatedBy,\n CampaignLaunchStatus,\n CampaignStatus,\n OnboardingStep,\n GenerationStatus,\n} from '@goodparty_org/contracts'\n\nexport { UserRole, WhyBrowsing, CampaignTier } from './enums'\n\nexport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n PathToVictory,\n PathToVictoryData,\n ViabilityScore,\n ListPathsToVictoryOptions,\n UpdatePathToVictoryInput,\n} from './types/pathToVictory'\n\nexport { P2VStatus, P2VSource } from './types/pathToVictory'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n","import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private getToken: () => Promise<string>\n\n constructor(gpApiRootUrl: string, getToken: () => Promise<string>) {\n this.baseUrl = gpApiRootUrl\n this.getToken = getToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${await this.getToken()}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n protected abstract readonly resourceBasePath: string\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type { UpdateDistrictInput } from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n protected readonly resourceBasePath = '/campaigns'\n\n get = (id: number): Promise<ReadCampaignOutput> =>\n this.getRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<ReadCampaignOutput>> =>\n this.getRequest<PaginatedList<ReadCampaignOutput>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n update = (\n id: number,\n input: UpdateCampaignM2MInput,\n ): Promise<ReadCampaignOutput> =>\n this.putRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`, input)\n\n updateDistrict = (\n id: number,\n input: UpdateDistrictInput,\n ): Promise<SetDistrictOutput> =>\n this.putRequest<SetDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\n}\n","import type {\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class EcanvasserResource extends BaseResource {\n protected readonly resourceBasePath = '/ecanvasser'\n\n create = (input: CreateEcanvasserInput): Promise<Ecanvasser> =>\n this.postRequest<Ecanvasser>(this.resourceBasePath, input)\n\n list = (): Promise<EcanvasserSummary[]> =>\n this.getRequest<EcanvasserSummary[]>(`${this.resourceBasePath}/list`)\n\n syncAll = (): Promise<void> =>\n this.getRequest<void>(`${this.resourceBasePath}/sync-all`)\n\n delete = (campaignId: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${campaignId}`)\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from '../types/electedOffice'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectedOfficesResource extends BaseResource {\n protected readonly resourceBasePath = '/elected-office'\n\n list = (\n options?: ListElectedOfficesOptions,\n ): Promise<PaginatedList<ElectedOffice>> =>\n this.getRequest<PaginatedList<ElectedOffice>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: string): Promise<ElectedOffice> =>\n this.getRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: string,\n input: UpdateElectedOfficeInput,\n ): Promise<ElectedOffice> =>\n this.putRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n} from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectionsResource extends BaseResource {\n protected readonly resourceBasePath = '/elections'\n\n listDistrictTypes = (\n options: ListDistrictTypesOptions,\n ): Promise<DistrictTypeItem[]> =>\n this.getRequest<DistrictTypeItem[]>(\n `${this.resourceBasePath}/districts/types`,\n options,\n )\n\n listDistrictNames = (\n options: ListDistrictNamesOptions,\n ): Promise<DistrictNameItem[]> =>\n this.getRequest<DistrictNameItem[]>(\n `${this.resourceBasePath}/districts/names`,\n options,\n )\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ListPathsToVictoryOptions,\n PathToVictory,\n UpdatePathToVictoryInput,\n} from '../types/pathToVictory'\nimport { BaseResource } from './BaseResource'\n\nexport class PathsToVictoryResource extends BaseResource {\n protected resourceBasePath = '/path-to-victory'\n list = (\n options?: ListPathsToVictoryOptions,\n ): Promise<PaginatedList<PathToVictory>> =>\n this.getRequest<PaginatedList<PathToVictory>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: number): Promise<PathToVictory> =>\n this.getRequest<PathToVictory>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: number,\n input: UpdatePathToVictoryInput,\n ): Promise<PathToVictory> =>\n this.putRequest<PathToVictory>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n ListUsersPagination,\n PaginatedList,\n ReadUserOutput,\n UpdatePasswordInput,\n UpdateUserInput,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n protected readonly resourceBasePath = '/users'\n\n list = (\n options?: ListUsersPagination,\n ): Promise<PaginatedList<ReadUserOutput>> =>\n this.getRequest<PaginatedList<ReadUserOutput>>(\n this.resourceBasePath,\n options,\n )\n\n get = (id: number): Promise<ReadUserOutput> =>\n this.getRequest<ReadUserOutput>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<ReadUserOutput> =>\n this.putRequest<ReadUserOutput>(`${this.resourceBasePath}/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`${this.resourceBasePath}/${id}/password`, input)\n}\n","import { createClerkClient } from '@clerk/backend'\nimport { SdkError } from '../../types/result'\n\nconst TOKEN_RENEWAL_BUFFER_MS = 30_000\n\nexport class ClerkService {\n private readonly m2mSecret: string\n private readonly clerkClient: ReturnType<typeof createClerkClient>\n private cachedToken: string | null = null\n private tokenExpiration: number | null = null\n private renewalTimer: ReturnType<typeof setTimeout> | null = null\n private pendingTokenPromise: Promise<string> | null = null\n private destroyed = false\n\n constructor(m2mSecret: string) {\n this.m2mSecret = m2mSecret\n this.clerkClient = createClerkClient({})\n }\n\n getToken = async (): Promise<string> => {\n if (this.cachedToken && this.isTokenValid()) {\n return this.cachedToken\n }\n\n if (this.pendingTokenPromise) {\n return this.pendingTokenPromise\n }\n\n const promise = this.createAndCacheToken()\n this.pendingTokenPromise = promise\n\n try {\n return await promise\n } finally {\n if (this.pendingTokenPromise === promise) {\n this.pendingTokenPromise = null\n }\n }\n }\n\n destroy = (): void => {\n this.destroyed = true\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n this.cachedToken = null\n this.tokenExpiration = null\n this.pendingTokenPromise = null\n }\n\n private isTokenValid = (): boolean => {\n if (!this.tokenExpiration) return true\n return Date.now() < this.tokenExpiration - TOKEN_RENEWAL_BUFFER_MS\n }\n\n private createAndCacheToken = async (): Promise<string> => {\n try {\n const m2mToken = await this.clerkClient.m2m.createToken({\n machineSecretKey: this.m2mSecret,\n })\n\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n\n if (this.destroyed) return m2mToken.token\n\n this.cachedToken = m2mToken.token\n this.tokenExpiration = m2mToken.expiration\n this.scheduleRenewal()\n\n return this.cachedToken\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n }\n\n private scheduleRenewal = (): void => {\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n\n if (!this.tokenExpiration) return\n\n const timeUntilRenewal =\n this.tokenExpiration - Date.now() - TOKEN_RENEWAL_BUFFER_MS\n\n if (timeUntilRenewal <= 0) return\n\n this.renewalTimer = setTimeout(() => {\n this.cachedToken = null\n this.getToken().catch((error: unknown) => {\n console.error('Proactive M2M token renewal failed:', error)\n })\n }, timeUntilRenewal)\n }\n}\n","import { HttpClient } from './http/HttpClient'\nimport { CampaignsResource } from './resources/CampaignsResource'\nimport { EcanvasserResource } from './resources/EcanvasserResource'\nimport { ElectedOfficesResource } from './resources/ElectedOfficesResource'\nimport { ElectionsResource } from './resources/ElectionsResource'\nimport { PathsToVictoryResource } from './resources/PathsToVictoryResource'\nimport { UsersResource } from './resources/UsersResource'\nimport { ClerkService } from './vendor/clerk/clerk.service'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly pathsToVictory: PathsToVictoryResource\n private clerkService: ClerkService\n\n private constructor(clerkService: ClerkService, gpApiRootUrl: string) {\n this.clerkService = clerkService\n const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken)\n this.users = new UsersResource(httpClient)\n this.campaigns = new CampaignsResource(httpClient)\n this.ecanvasser = new EcanvasserResource(httpClient)\n this.electedOffices = new ElectedOfficesResource(httpClient)\n this.elections = new ElectionsResource(httpClient)\n this.pathsToVictory = new PathsToVictoryResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkService = new ClerkService(m2mSecret)\n await clerkService.getToken()\n return new GoodPartyClient(clerkService, gpApiRootUrl)\n }\n\n destroy = (): void => {\n this.clerkService.destroy()\n }\n}\n","import {\n USER_ROLE_VALUES,\n type UserRole as UserRoleType,\n WHY_BROWSING_VALUES,\n type WhyBrowsing as WhyBrowsingType,\n CAMPAIGN_TIER_VALUES,\n type CampaignTier as CampaignTierType,\n} from '@goodparty_org/contracts'\n\ntype EnumObject<T extends readonly string[]> = { [K in T[number]]: K }\n\nconst toEnumObject = <T extends readonly string[]>(values: T): EnumObject<T> =>\n Object.fromEntries(values.map((v) => [v, v])) as EnumObject<T>\n\nexport type UserRole = UserRoleType\nexport const UserRole = toEnumObject(USER_ROLE_VALUES)\n\nexport type WhyBrowsing = WhyBrowsingType\nexport const WhyBrowsing = toEnumObject(WHY_BROWSING_VALUES)\n\nexport type CampaignTier = CampaignTierType\nexport const CampaignTier = toEnumObject(CAMPAIGN_TIER_VALUES)\n","import type { PaginationOptions } from '@goodparty_org/contracts'\n\nexport enum P2VStatus {\n complete = 'Complete',\n waiting = 'Waiting',\n failed = 'Failed',\n districtMatched = 'DistrictMatched',\n}\n\nexport enum P2VSource {\n GpApi = 'GpApi',\n ElectionApi = 'ElectionApi',\n}\n\nexport type ViabilityScore = {\n level: string\n isPartisan: boolean\n isIncumbent: boolean\n isUncontested: boolean\n candidates: number\n seats: number\n candidatesPerSeat: number\n score: number\n probOfWin: number\n}\n\nexport type PathToVictoryData = {\n p2vStatus?: P2VStatus\n p2vAttempts?: number\n p2vCompleteDate?: string\n completedBy?: number\n electionType?: string\n electionLocation?: string\n voterContactGoal?: number\n winNumber?: number\n p2vNotNeeded?: boolean\n totalRegisteredVoters?: number\n republicans?: number\n democrats?: number\n indies?: number\n women?: number\n men?: number\n white?: number\n asian?: number\n africanAmerican?: number\n hispanic?: number\n averageTurnout?: number\n projectedTurnout?: number\n viability?: ViabilityScore\n source?: P2VSource\n districtId?: string\n districtManuallySet?: boolean\n officeContextFingerprint?: string\n}\n\nexport type PathToVictory = {\n id: number\n createdAt: string\n updatedAt: string\n campaignId: number\n data: PathToVictoryData\n}\n\nexport type ListPathsToVictoryOptions = PaginationOptions & {\n userId?: number\n}\n\nexport type UpdatePathToVictoryInput = {\n data: PathToVictoryData\n}\n"],"mappings":"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","names":["import_contracts","P2VStatus","P2VSource"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/AdminResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/PathsToVictoryResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/enums.ts","../src/types/pathToVictory.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\n\nexport type {\n PaginationMeta,\n PaginatedList,\n PaginationOptions,\n ReadUserOutput,\n ReadUserOutput as User,\n UpdatePasswordInput,\n UpdateUserInput,\n UserMetaData,\n ListUsersPagination,\n ReadCampaignOutput,\n ReadCampaignOutput as Campaign,\n CampaignDetails,\n CampaignData,\n CampaignAiContent,\n VoterGoals,\n CustomVoterFile,\n AiChatMessage,\n AiContentInputValues,\n AiContentGenerationStatus,\n AiContentData,\n GeoLocation,\n CustomIssue,\n Opponent,\n HubSpotUpdates,\n CampaignFinance,\n CampaignPlan,\n CampaignPlanStatus,\n ListCampaignsPagination,\n SetDistrictOutput,\n UpdateCampaignM2MInput as UpdateCampaignInput,\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\n\nexport {\n USER_ROLE_VALUES,\n WHY_BROWSING_VALUES,\n CAMPAIGN_TIER_VALUES,\n BALLOT_READY_POSITION_LEVEL_VALUES,\n ELECTION_LEVEL_VALUES,\n CAMPAIGN_CREATED_BY_VALUES,\n CAMPAIGN_LAUNCH_STATUS_VALUES,\n CAMPAIGN_STATUS_VALUES,\n ONBOARDING_STEP_VALUES,\n GENERATION_STATUS_VALUES,\n BallotReadyPositionLevel,\n ElectionLevel,\n CampaignCreatedBy,\n CampaignLaunchStatus,\n CampaignStatus,\n OnboardingStep,\n GenerationStatus,\n} from '@goodparty_org/contracts'\n\nexport { UserRole, WhyBrowsing, CampaignTier } from './enums'\n\nexport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n PathToVictory,\n PathToVictoryData,\n ViabilityScore,\n ListPathsToVictoryOptions,\n UpdatePathToVictoryInput,\n} from './types/pathToVictory'\n\nexport { P2VStatus, P2VSource } from './types/pathToVictory'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n","import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private getToken: () => Promise<string>\n\n constructor(gpApiRootUrl: string, getToken: () => Promise<string>) {\n this.baseUrl = gpApiRootUrl\n this.getToken = getToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${await this.getToken()}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n protected abstract readonly resourceBasePath: string\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type { ImpersonateUserOutput } from '../types/admin'\nimport { BaseResource } from './BaseResource'\n\nexport class AdminResource extends BaseResource {\n protected readonly resourceBasePath = '/admin'\n\n impersonateUser = (\n targetUserId: number,\n actorClerkId: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorClerkId },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type { UpdateDistrictInput } from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n protected readonly resourceBasePath = '/campaigns'\n\n get = (id: number): Promise<ReadCampaignOutput> =>\n this.getRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<ReadCampaignOutput>> =>\n this.getRequest<PaginatedList<ReadCampaignOutput>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n update = (\n id: number,\n input: UpdateCampaignM2MInput,\n ): Promise<ReadCampaignOutput> =>\n this.putRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`, input)\n\n updateDistrict = (\n id: number,\n input: UpdateDistrictInput,\n ): Promise<SetDistrictOutput> =>\n this.putRequest<SetDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\n}\n","import type {\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class EcanvasserResource extends BaseResource {\n protected readonly resourceBasePath = '/ecanvasser'\n\n create = (input: CreateEcanvasserInput): Promise<Ecanvasser> =>\n this.postRequest<Ecanvasser>(this.resourceBasePath, input)\n\n list = (): Promise<EcanvasserSummary[]> =>\n this.getRequest<EcanvasserSummary[]>(`${this.resourceBasePath}/list`)\n\n syncAll = (): Promise<void> =>\n this.getRequest<void>(`${this.resourceBasePath}/sync-all`)\n\n delete = (campaignId: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${campaignId}`)\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from '../types/electedOffice'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectedOfficesResource extends BaseResource {\n protected readonly resourceBasePath = '/elected-office'\n\n list = (\n options?: ListElectedOfficesOptions,\n ): Promise<PaginatedList<ElectedOffice>> =>\n this.getRequest<PaginatedList<ElectedOffice>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: string): Promise<ElectedOffice> =>\n this.getRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: string,\n input: UpdateElectedOfficeInput,\n ): Promise<ElectedOffice> =>\n this.putRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n} from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectionsResource extends BaseResource {\n protected readonly resourceBasePath = '/elections'\n\n listDistrictTypes = (\n options: ListDistrictTypesOptions,\n ): Promise<DistrictTypeItem[]> =>\n this.getRequest<DistrictTypeItem[]>(\n `${this.resourceBasePath}/districts/types`,\n options,\n )\n\n listDistrictNames = (\n options: ListDistrictNamesOptions,\n ): Promise<DistrictNameItem[]> =>\n this.getRequest<DistrictNameItem[]>(\n `${this.resourceBasePath}/districts/names`,\n options,\n )\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ListPathsToVictoryOptions,\n PathToVictory,\n UpdatePathToVictoryInput,\n} from '../types/pathToVictory'\nimport { BaseResource } from './BaseResource'\n\nexport class PathsToVictoryResource extends BaseResource {\n protected resourceBasePath = '/path-to-victory'\n list = (\n options?: ListPathsToVictoryOptions,\n ): Promise<PaginatedList<PathToVictory>> =>\n this.getRequest<PaginatedList<PathToVictory>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: number): Promise<PathToVictory> =>\n this.getRequest<PathToVictory>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: number,\n input: UpdatePathToVictoryInput,\n ): Promise<PathToVictory> =>\n this.putRequest<PathToVictory>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n ListUsersPagination,\n PaginatedList,\n ReadUserOutput,\n UpdatePasswordInput,\n UpdateUserInput,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n protected readonly resourceBasePath = '/users'\n\n list = (\n options?: ListUsersPagination,\n ): Promise<PaginatedList<ReadUserOutput>> =>\n this.getRequest<PaginatedList<ReadUserOutput>>(\n this.resourceBasePath,\n options,\n )\n\n get = (id: number): Promise<ReadUserOutput> =>\n this.getRequest<ReadUserOutput>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<ReadUserOutput> =>\n this.putRequest<ReadUserOutput>(`${this.resourceBasePath}/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`${this.resourceBasePath}/${id}/password`, input)\n}\n","import { createClerkClient } from '@clerk/backend'\nimport { SdkError } from '../../types/result'\n\nconst TOKEN_RENEWAL_BUFFER_MS = 30_000\n\nexport class ClerkService {\n private readonly m2mSecret: string\n private readonly clerkClient: ReturnType<typeof createClerkClient>\n private cachedToken: string | null = null\n private tokenExpiration: number | null = null\n private renewalTimer: ReturnType<typeof setTimeout> | null = null\n private pendingTokenPromise: Promise<string> | null = null\n private destroyed = false\n\n constructor(m2mSecret: string) {\n this.m2mSecret = m2mSecret\n this.clerkClient = createClerkClient({})\n }\n\n getToken = async (): Promise<string> => {\n if (this.cachedToken && this.isTokenValid()) {\n return this.cachedToken\n }\n\n if (this.pendingTokenPromise) {\n return this.pendingTokenPromise\n }\n\n const promise = this.createAndCacheToken()\n this.pendingTokenPromise = promise\n\n try {\n return await promise\n } finally {\n if (this.pendingTokenPromise === promise) {\n this.pendingTokenPromise = null\n }\n }\n }\n\n destroy = (): void => {\n this.destroyed = true\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n this.cachedToken = null\n this.tokenExpiration = null\n this.pendingTokenPromise = null\n }\n\n private isTokenValid = (): boolean => {\n if (!this.tokenExpiration) return true\n return Date.now() < this.tokenExpiration - TOKEN_RENEWAL_BUFFER_MS\n }\n\n private createAndCacheToken = async (): Promise<string> => {\n try {\n const m2mToken = await this.clerkClient.m2m.createToken({\n machineSecretKey: this.m2mSecret,\n })\n\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n\n if (this.destroyed) return m2mToken.token\n\n this.cachedToken = m2mToken.token\n this.tokenExpiration = m2mToken.expiration\n this.scheduleRenewal()\n\n return this.cachedToken\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n }\n\n private scheduleRenewal = (): void => {\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n\n if (!this.tokenExpiration) return\n\n const timeUntilRenewal =\n this.tokenExpiration - Date.now() - TOKEN_RENEWAL_BUFFER_MS\n\n if (timeUntilRenewal <= 0) return\n\n this.renewalTimer = setTimeout(() => {\n this.cachedToken = null\n this.getToken().catch((error: unknown) => {\n console.error('Proactive M2M token renewal failed:', error)\n })\n }, timeUntilRenewal)\n }\n}\n","import { HttpClient } from './http/HttpClient'\nimport { AdminResource } from './resources/AdminResource'\nimport { CampaignsResource } from './resources/CampaignsResource'\nimport { EcanvasserResource } from './resources/EcanvasserResource'\nimport { ElectedOfficesResource } from './resources/ElectedOfficesResource'\nimport { ElectionsResource } from './resources/ElectionsResource'\nimport { PathsToVictoryResource } from './resources/PathsToVictoryResource'\nimport { UsersResource } from './resources/UsersResource'\nimport { ClerkService } from './vendor/clerk/clerk.service'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly admin: AdminResource\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly pathsToVictory: PathsToVictoryResource\n private clerkService: ClerkService\n\n private constructor(clerkService: ClerkService, gpApiRootUrl: string) {\n this.clerkService = clerkService\n const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken)\n this.admin = new AdminResource(httpClient)\n this.users = new UsersResource(httpClient)\n this.campaigns = new CampaignsResource(httpClient)\n this.ecanvasser = new EcanvasserResource(httpClient)\n this.electedOffices = new ElectedOfficesResource(httpClient)\n this.elections = new ElectionsResource(httpClient)\n this.pathsToVictory = new PathsToVictoryResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkService = new ClerkService(m2mSecret)\n await clerkService.getToken()\n return new GoodPartyClient(clerkService, gpApiRootUrl)\n }\n\n destroy = (): void => {\n this.clerkService.destroy()\n }\n}\n","import {\n USER_ROLE_VALUES,\n type UserRole as UserRoleType,\n WHY_BROWSING_VALUES,\n type WhyBrowsing as WhyBrowsingType,\n CAMPAIGN_TIER_VALUES,\n type CampaignTier as CampaignTierType,\n} from '@goodparty_org/contracts'\n\ntype EnumObject<T extends readonly string[]> = { [K in T[number]]: K }\n\nconst toEnumObject = <T extends readonly string[]>(values: T): EnumObject<T> =>\n Object.fromEntries(values.map((v) => [v, v])) as EnumObject<T>\n\nexport type UserRole = UserRoleType\nexport const UserRole = toEnumObject(USER_ROLE_VALUES)\n\nexport type WhyBrowsing = WhyBrowsingType\nexport const WhyBrowsing = toEnumObject(WHY_BROWSING_VALUES)\n\nexport type CampaignTier = CampaignTierType\nexport const CampaignTier = toEnumObject(CAMPAIGN_TIER_VALUES)\n","import type { PaginationOptions } from '@goodparty_org/contracts'\n\nexport enum P2VStatus {\n complete = 'Complete',\n waiting = 'Waiting',\n failed = 'Failed',\n districtMatched = 'DistrictMatched',\n}\n\nexport enum P2VSource {\n GpApi = 'GpApi',\n ElectionApi = 'ElectionApi',\n}\n\nexport type ViabilityScore = {\n level: string\n isPartisan: boolean\n isIncumbent: boolean\n isUncontested: boolean\n candidates: number\n seats: number\n candidatesPerSeat: number\n score: number\n probOfWin: number\n}\n\nexport type PathToVictoryData = {\n p2vStatus?: P2VStatus\n p2vAttempts?: number\n p2vCompleteDate?: string\n completedBy?: number\n electionType?: string\n electionLocation?: string\n voterContactGoal?: number\n winNumber?: number\n p2vNotNeeded?: boolean\n totalRegisteredVoters?: number\n republicans?: number\n democrats?: number\n indies?: number\n women?: number\n men?: number\n white?: number\n asian?: number\n africanAmerican?: number\n hispanic?: number\n averageTurnout?: number\n projectedTurnout?: number\n viability?: ViabilityScore\n source?: P2VSource\n districtId?: string\n districtManuallySet?: boolean\n officeContextFingerprint?: string\n}\n\nexport type PathToVictory = {\n id: number\n createdAt: string\n updatedAt: string\n campaignId: number\n data: PathToVictoryData\n}\n\nexport type ListPathsToVictoryOptions = PaginationOptions & {\n userId?: number\n}\n\nexport type UpdatePathToVictoryInput = {\n data: PathToVictoryData\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAiD;;;ACA1C,IAAM,WAAN,cAAuB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,SAAiB,UAAqB;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AACF;;;ADLO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,UAAiC;AACjE,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,UAAU,OACR,MACA,SACe;AACf,QAAI;AACF,aAAO,UAAM,sBAAU,MAAM;AAAA,QAC3B,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,UACP,eAAe,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,UAC9C,GAAI,MAAM,WAAW,CAAC;AAAA,QACxB;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,IACH,SAAS,OAAgB;AACvB,UAAI,iBAAiB,0BAAY;AAC/B,cAAM,IAAI,SAAS,MAAM,cAAc,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,MACzE;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM,IAAI,SAAS,GAAG,OAAO;AAAA,IAC/B;AAAA,EACF;AACF;;;AEhCO,IAAe,eAAf,MAA4B;AAAA,EACvB;AAAA,EAGV,YAAY,YAAwB;AAClC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEU,aAAa,CACrB,MACA,UACe,KAAK,WAAW,QAAW,MAAM,EAAE,QAAQ,OAAO,MAAM,CAAC;AAAA,EAEhE,cAAc,CACtB,MACA,SACe,KAAK,WAAW,QAAW,MAAM,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAEhE,aAAa,CACrB,MACA,SACe,KAAK,WAAW,QAAW,MAAM,EAAE,QAAQ,OAAO,KAAK,CAAC;AAAA,EAE/D,gBAAgB,CAAI,SAC5B,KAAK,WAAW,QAAW,MAAM,EAAE,QAAQ,SAAS,CAAC;AACzD;;;ACzBO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC3B,mBAAmB;AAAA,EAEtC,kBAAkB,CAChB,cACA,iBAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB,sBAAsB,YAAY;AAAA,IAC1D,EAAE,aAAa;AAAA,EACjB;AACJ;;;ACJO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAC/B,mBAAmB;AAAA,EAEtC,MAAM,CAAC,OACL,KAAK,WAA+B,GAAG,KAAK,gBAAgB,IAAI,EAAE,EAAE;AAAA,EAEtE,OAAO,CACL,YAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEF,SAAS,CACP,IACA,UAEA,KAAK,WAA+B,GAAG,KAAK,gBAAgB,IAAI,EAAE,IAAI,KAAK;AAAA,EAE7E,iBAAiB,CACf,IACA,UAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB,IAAI,EAAE;AAAA,IAC9B;AAAA,EACF;AACJ;;;AC/BO,IAAM,qBAAN,cAAiC,aAAa;AAAA,EAChC,mBAAmB;AAAA,EAEtC,SAAS,CAAC,UACR,KAAK,YAAwB,KAAK,kBAAkB,KAAK;AAAA,EAE3D,OAAO,MACL,KAAK,WAAgC,GAAG,KAAK,gBAAgB,OAAO;AAAA,EAEtE,UAAU,MACR,KAAK,WAAiB,GAAG,KAAK,gBAAgB,WAAW;AAAA,EAE3D,SAAS,CAAC,eACR,KAAK,cAAoB,GAAG,KAAK,gBAAgB,IAAI,UAAU,EAAE;AACrE;;;ACbO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EACpC,mBAAmB;AAAA,EAEtC,OAAO,CACL,YAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEF,MAAM,CAAC,OACL,KAAK,WAA0B,GAAG,KAAK,gBAAgB,IAAI,EAAE,EAAE;AAAA,EAEjE,SAAS,CACP,IACA,UAEA,KAAK,WAA0B,GAAG,KAAK,gBAAgB,IAAI,EAAE,IAAI,KAAK;AAC1E;;;ACnBO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAC/B,mBAAmB;AAAA,EAEtC,oBAAoB,CAClB,YAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEF,oBAAoB,CAClB,YAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB;AAAA,IACxB;AAAA,EACF;AACJ;;;AClBO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EAC7C,mBAAmB;AAAA,EAC7B,OAAO,CACL,YAEA,KAAK;AAAA,IACH,GAAG,KAAK,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEF,MAAM,CAAC,OACL,KAAK,WAA0B,GAAG,KAAK,gBAAgB,IAAI,EAAE,EAAE;AAAA,EAEjE,SAAS,CACP,IACA,UAEA,KAAK,WAA0B,GAAG,KAAK,gBAAgB,IAAI,EAAE,IAAI,KAAK;AAC1E;;;ACjBO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC3B,mBAAmB;AAAA,EAEtC,OAAO,CACL,YAEA,KAAK;AAAA,IACH,KAAK;AAAA,IACL;AAAA,EACF;AAAA,EAEF,MAAM,CAAC,OACL,KAAK,WAA2B,UAAU,EAAE,EAAE;AAAA,EAEhD,SAAS,CAAC,IAAY,UACpB,KAAK,WAA2B,GAAG,KAAK,gBAAgB,IAAI,EAAE,IAAI,KAAK;AAAA,EAEzE,SAAS,CAAC,OACR,KAAK,cAAoB,GAAG,KAAK,gBAAgB,IAAI,EAAE,EAAE;AAAA,EAE3D,iBAAiB,CAAC,IAAY,UAC5B,KAAK,WAAiB,GAAG,KAAK,gBAAgB,IAAI,EAAE,aAAa,KAAK;AAC1E;;;AC/BA,qBAAkC;AAGlC,IAAM,0BAA0B;AAEzB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACT,cAA6B;AAAA,EAC7B,kBAAiC;AAAA,EACjC,eAAqD;AAAA,EACrD,sBAA8C;AAAA,EAC9C,YAAY;AAAA,EAEpB,YAAY,WAAmB;AAC7B,SAAK,YAAY;AACjB,SAAK,kBAAc,kCAAkB,CAAC,CAAC;AAAA,EACzC;AAAA,EAEA,WAAW,YAA6B;AACtC,QAAI,KAAK,eAAe,KAAK,aAAa,GAAG;AAC3C,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,qBAAqB;AAC5B,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,UAAU,KAAK,oBAAoB;AACzC,SAAK,sBAAsB;AAE3B,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,UAAI,KAAK,wBAAwB,SAAS;AACxC,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAY;AACpB,SAAK,YAAY;AACjB,QAAI,KAAK,cAAc;AACrB,mBAAa,KAAK,YAAY;AAC9B,WAAK,eAAe;AAAA,IACtB;AACA,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,eAAe,MAAe;AACpC,QAAI,CAAC,KAAK,gBAAiB,QAAO;AAClC,WAAO,KAAK,IAAI,IAAI,KAAK,kBAAkB;AAAA,EAC7C;AAAA,EAEQ,sBAAsB,YAA6B;AACzD,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,YAAY,IAAI,YAAY;AAAA,QACtD,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAED,UAAI,CAAC,SAAS,OAAO;AACnB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,KAAK,UAAW,QAAO,SAAS;AAEpC,WAAK,cAAc,SAAS;AAC5B,WAAK,kBAAkB,SAAS;AAChC,WAAK,gBAAgB;AAErB,aAAO,KAAK;AAAA,IACd,SAAS,OAAgB;AACvB,UAAI,iBAAiB,UAAU;AAC7B,cAAM;AAAA,MACR;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM,IAAI,SAAS,GAAG,qCAAqC,OAAO,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,kBAAkB,MAAY;AACpC,QAAI,KAAK,cAAc;AACrB,mBAAa,KAAK,YAAY;AAC9B,WAAK,eAAe;AAAA,IACtB;AAEA,QAAI,CAAC,KAAK,gBAAiB;AAE3B,UAAM,mBACJ,KAAK,kBAAkB,KAAK,IAAI,IAAI;AAEtC,QAAI,oBAAoB,EAAG;AAE3B,SAAK,eAAe,WAAW,MAAM;AACnC,WAAK,cAAc;AACnB,WAAK,SAAS,EAAE,MAAM,CAAC,UAAmB;AACxC,gBAAQ,MAAM,uCAAuC,KAAK;AAAA,MAC5D,CAAC;AAAA,IACH,GAAG,gBAAgB;AAAA,EACrB;AACF;;;AC1FO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACD;AAAA,EAEA,YAAY,cAA4B,cAAsB;AACpE,SAAK,eAAe;AACpB,UAAM,aAAa,IAAI,WAAW,cAAc,aAAa,QAAQ;AACrE,SAAK,QAAQ,IAAI,cAAc,UAAU;AACzC,SAAK,QAAQ,IAAI,cAAc,UAAU;AACzC,SAAK,YAAY,IAAI,kBAAkB,UAAU;AACjD,SAAK,aAAa,IAAI,mBAAmB,UAAU;AACnD,SAAK,iBAAiB,IAAI,uBAAuB,UAAU;AAC3D,SAAK,YAAY,IAAI,kBAAkB,UAAU;AACjD,SAAK,iBAAiB,IAAI,uBAAuB,UAAU;AAAA,EAC7D;AAAA,EAEA,OAAO,SAAS,OACd,WAC6B;AAC7B,UAAM,EAAE,WAAW,aAAa,IAAI;AACpC,UAAM,eAAe,IAAI,aAAa,SAAS;AAC/C,UAAM,aAAa,SAAS;AAC5B,WAAO,IAAI,iBAAgB,cAAc,YAAY;AAAA,EACvD;AAAA,EAEA,UAAU,MAAY;AACpB,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;;;AZRA,IAAAA,oBAkBO;;;Aa3DP,uBAOO;AAIP,IAAM,eAAe,CAA8B,WACjD,OAAO,YAAY,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAGvC,IAAM,WAAW,aAAa,iCAAgB;AAG9C,IAAM,cAAc,aAAa,oCAAmB;AAGpD,IAAM,eAAe,aAAa,qCAAoB;;;ACnBtD,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,aAAU;AACV,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,qBAAkB;AAJR,SAAAA;AAAA,GAAA;AAOL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,iBAAc;AAFJ,SAAAA;AAAA,GAAA;","names":["import_contracts","P2VStatus","P2VSource"]}
package/dist/index.mjs CHANGED
@@ -53,6 +53,15 @@ var BaseResource = class {
53
53
  deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
54
54
  };
55
55
 
56
+ // src/resources/AdminResource.ts
57
+ var AdminResource = class extends BaseResource {
58
+ resourceBasePath = "/admin";
59
+ impersonateUser = (targetUserId, actorClerkId) => this.postRequest(
60
+ `${this.resourceBasePath}/users/impersonate/${targetUserId}`,
61
+ { actorClerkId }
62
+ );
63
+ };
64
+
56
65
  // src/resources/CampaignsResource.ts
57
66
  var CampaignsResource = class extends BaseResource {
58
67
  resourceBasePath = "/campaigns";
@@ -214,6 +223,7 @@ var ClerkService = class {
214
223
 
215
224
  // src/GoodPartyClient.ts
216
225
  var GoodPartyClient = class _GoodPartyClient {
226
+ admin;
217
227
  users;
218
228
  campaigns;
219
229
  ecanvasser;
@@ -224,6 +234,7 @@ var GoodPartyClient = class _GoodPartyClient {
224
234
  constructor(clerkService, gpApiRootUrl) {
225
235
  this.clerkService = clerkService;
226
236
  const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
237
+ this.admin = new AdminResource(httpClient);
227
238
  this.users = new UsersResource(httpClient);
228
239
  this.campaigns = new CampaignsResource(httpClient);
229
240
  this.ecanvasser = new EcanvasserResource(httpClient);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/PathsToVictoryResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/index.ts","../src/enums.ts","../src/types/pathToVictory.ts"],"sourcesContent":["import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private getToken: () => Promise<string>\n\n constructor(gpApiRootUrl: string, getToken: () => Promise<string>) {\n this.baseUrl = gpApiRootUrl\n this.getToken = getToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${await this.getToken()}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n protected abstract readonly resourceBasePath: string\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type { UpdateDistrictInput } from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n protected readonly resourceBasePath = '/campaigns'\n\n get = (id: number): Promise<ReadCampaignOutput> =>\n this.getRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<ReadCampaignOutput>> =>\n this.getRequest<PaginatedList<ReadCampaignOutput>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n update = (\n id: number,\n input: UpdateCampaignM2MInput,\n ): Promise<ReadCampaignOutput> =>\n this.putRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`, input)\n\n updateDistrict = (\n id: number,\n input: UpdateDistrictInput,\n ): Promise<SetDistrictOutput> =>\n this.putRequest<SetDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\n}\n","import type {\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class EcanvasserResource extends BaseResource {\n protected readonly resourceBasePath = '/ecanvasser'\n\n create = (input: CreateEcanvasserInput): Promise<Ecanvasser> =>\n this.postRequest<Ecanvasser>(this.resourceBasePath, input)\n\n list = (): Promise<EcanvasserSummary[]> =>\n this.getRequest<EcanvasserSummary[]>(`${this.resourceBasePath}/list`)\n\n syncAll = (): Promise<void> =>\n this.getRequest<void>(`${this.resourceBasePath}/sync-all`)\n\n delete = (campaignId: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${campaignId}`)\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from '../types/electedOffice'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectedOfficesResource extends BaseResource {\n protected readonly resourceBasePath = '/elected-office'\n\n list = (\n options?: ListElectedOfficesOptions,\n ): Promise<PaginatedList<ElectedOffice>> =>\n this.getRequest<PaginatedList<ElectedOffice>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: string): Promise<ElectedOffice> =>\n this.getRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: string,\n input: UpdateElectedOfficeInput,\n ): Promise<ElectedOffice> =>\n this.putRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n} from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectionsResource extends BaseResource {\n protected readonly resourceBasePath = '/elections'\n\n listDistrictTypes = (\n options: ListDistrictTypesOptions,\n ): Promise<DistrictTypeItem[]> =>\n this.getRequest<DistrictTypeItem[]>(\n `${this.resourceBasePath}/districts/types`,\n options,\n )\n\n listDistrictNames = (\n options: ListDistrictNamesOptions,\n ): Promise<DistrictNameItem[]> =>\n this.getRequest<DistrictNameItem[]>(\n `${this.resourceBasePath}/districts/names`,\n options,\n )\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ListPathsToVictoryOptions,\n PathToVictory,\n UpdatePathToVictoryInput,\n} from '../types/pathToVictory'\nimport { BaseResource } from './BaseResource'\n\nexport class PathsToVictoryResource extends BaseResource {\n protected resourceBasePath = '/path-to-victory'\n list = (\n options?: ListPathsToVictoryOptions,\n ): Promise<PaginatedList<PathToVictory>> =>\n this.getRequest<PaginatedList<PathToVictory>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: number): Promise<PathToVictory> =>\n this.getRequest<PathToVictory>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: number,\n input: UpdatePathToVictoryInput,\n ): Promise<PathToVictory> =>\n this.putRequest<PathToVictory>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n ListUsersPagination,\n PaginatedList,\n ReadUserOutput,\n UpdatePasswordInput,\n UpdateUserInput,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n protected readonly resourceBasePath = '/users'\n\n list = (\n options?: ListUsersPagination,\n ): Promise<PaginatedList<ReadUserOutput>> =>\n this.getRequest<PaginatedList<ReadUserOutput>>(\n this.resourceBasePath,\n options,\n )\n\n get = (id: number): Promise<ReadUserOutput> =>\n this.getRequest<ReadUserOutput>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<ReadUserOutput> =>\n this.putRequest<ReadUserOutput>(`${this.resourceBasePath}/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`${this.resourceBasePath}/${id}/password`, input)\n}\n","import { createClerkClient } from '@clerk/backend'\nimport { SdkError } from '../../types/result'\n\nconst TOKEN_RENEWAL_BUFFER_MS = 30_000\n\nexport class ClerkService {\n private readonly m2mSecret: string\n private readonly clerkClient: ReturnType<typeof createClerkClient>\n private cachedToken: string | null = null\n private tokenExpiration: number | null = null\n private renewalTimer: ReturnType<typeof setTimeout> | null = null\n private pendingTokenPromise: Promise<string> | null = null\n private destroyed = false\n\n constructor(m2mSecret: string) {\n this.m2mSecret = m2mSecret\n this.clerkClient = createClerkClient({})\n }\n\n getToken = async (): Promise<string> => {\n if (this.cachedToken && this.isTokenValid()) {\n return this.cachedToken\n }\n\n if (this.pendingTokenPromise) {\n return this.pendingTokenPromise\n }\n\n const promise = this.createAndCacheToken()\n this.pendingTokenPromise = promise\n\n try {\n return await promise\n } finally {\n if (this.pendingTokenPromise === promise) {\n this.pendingTokenPromise = null\n }\n }\n }\n\n destroy = (): void => {\n this.destroyed = true\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n this.cachedToken = null\n this.tokenExpiration = null\n this.pendingTokenPromise = null\n }\n\n private isTokenValid = (): boolean => {\n if (!this.tokenExpiration) return true\n return Date.now() < this.tokenExpiration - TOKEN_RENEWAL_BUFFER_MS\n }\n\n private createAndCacheToken = async (): Promise<string> => {\n try {\n const m2mToken = await this.clerkClient.m2m.createToken({\n machineSecretKey: this.m2mSecret,\n })\n\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n\n if (this.destroyed) return m2mToken.token\n\n this.cachedToken = m2mToken.token\n this.tokenExpiration = m2mToken.expiration\n this.scheduleRenewal()\n\n return this.cachedToken\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n }\n\n private scheduleRenewal = (): void => {\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n\n if (!this.tokenExpiration) return\n\n const timeUntilRenewal =\n this.tokenExpiration - Date.now() - TOKEN_RENEWAL_BUFFER_MS\n\n if (timeUntilRenewal <= 0) return\n\n this.renewalTimer = setTimeout(() => {\n this.cachedToken = null\n this.getToken().catch((error: unknown) => {\n console.error('Proactive M2M token renewal failed:', error)\n })\n }, timeUntilRenewal)\n }\n}\n","import { HttpClient } from './http/HttpClient'\nimport { CampaignsResource } from './resources/CampaignsResource'\nimport { EcanvasserResource } from './resources/EcanvasserResource'\nimport { ElectedOfficesResource } from './resources/ElectedOfficesResource'\nimport { ElectionsResource } from './resources/ElectionsResource'\nimport { PathsToVictoryResource } from './resources/PathsToVictoryResource'\nimport { UsersResource } from './resources/UsersResource'\nimport { ClerkService } from './vendor/clerk/clerk.service'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly pathsToVictory: PathsToVictoryResource\n private clerkService: ClerkService\n\n private constructor(clerkService: ClerkService, gpApiRootUrl: string) {\n this.clerkService = clerkService\n const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken)\n this.users = new UsersResource(httpClient)\n this.campaigns = new CampaignsResource(httpClient)\n this.ecanvasser = new EcanvasserResource(httpClient)\n this.electedOffices = new ElectedOfficesResource(httpClient)\n this.elections = new ElectionsResource(httpClient)\n this.pathsToVictory = new PathsToVictoryResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkService = new ClerkService(m2mSecret)\n await clerkService.getToken()\n return new GoodPartyClient(clerkService, gpApiRootUrl)\n }\n\n destroy = (): void => {\n this.clerkService.destroy()\n }\n}\n","export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\n\nexport type {\n PaginationMeta,\n PaginatedList,\n PaginationOptions,\n ReadUserOutput,\n ReadUserOutput as User,\n UpdatePasswordInput,\n UpdateUserInput,\n UserMetaData,\n ListUsersPagination,\n ReadCampaignOutput,\n ReadCampaignOutput as Campaign,\n CampaignDetails,\n CampaignData,\n CampaignAiContent,\n VoterGoals,\n CustomVoterFile,\n AiChatMessage,\n AiContentInputValues,\n AiContentGenerationStatus,\n AiContentData,\n GeoLocation,\n CustomIssue,\n Opponent,\n HubSpotUpdates,\n CampaignFinance,\n CampaignPlan,\n CampaignPlanStatus,\n ListCampaignsPagination,\n SetDistrictOutput,\n UpdateCampaignM2MInput as UpdateCampaignInput,\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\n\nexport {\n USER_ROLE_VALUES,\n WHY_BROWSING_VALUES,\n CAMPAIGN_TIER_VALUES,\n BALLOT_READY_POSITION_LEVEL_VALUES,\n ELECTION_LEVEL_VALUES,\n CAMPAIGN_CREATED_BY_VALUES,\n CAMPAIGN_LAUNCH_STATUS_VALUES,\n CAMPAIGN_STATUS_VALUES,\n ONBOARDING_STEP_VALUES,\n GENERATION_STATUS_VALUES,\n BallotReadyPositionLevel,\n ElectionLevel,\n CampaignCreatedBy,\n CampaignLaunchStatus,\n CampaignStatus,\n OnboardingStep,\n GenerationStatus,\n} from '@goodparty_org/contracts'\n\nexport { UserRole, WhyBrowsing, CampaignTier } from './enums'\n\nexport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n PathToVictory,\n PathToVictoryData,\n ViabilityScore,\n ListPathsToVictoryOptions,\n UpdatePathToVictoryInput,\n} from './types/pathToVictory'\n\nexport { P2VStatus, P2VSource } from './types/pathToVictory'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n","import {\n USER_ROLE_VALUES,\n type UserRole as UserRoleType,\n WHY_BROWSING_VALUES,\n type WhyBrowsing as WhyBrowsingType,\n CAMPAIGN_TIER_VALUES,\n type CampaignTier as CampaignTierType,\n} from '@goodparty_org/contracts'\n\ntype EnumObject<T extends readonly string[]> = { [K in T[number]]: K }\n\nconst toEnumObject = <T extends readonly string[]>(values: T): EnumObject<T> =>\n Object.fromEntries(values.map((v) => [v, v])) as EnumObject<T>\n\nexport type UserRole = UserRoleType\nexport const UserRole = toEnumObject(USER_ROLE_VALUES)\n\nexport type WhyBrowsing = WhyBrowsingType\nexport const WhyBrowsing = toEnumObject(WHY_BROWSING_VALUES)\n\nexport type CampaignTier = CampaignTierType\nexport const CampaignTier = toEnumObject(CAMPAIGN_TIER_VALUES)\n","import type { PaginationOptions } from '@goodparty_org/contracts'\n\nexport enum P2VStatus {\n complete = 'Complete',\n waiting = 'Waiting',\n failed = 'Failed',\n districtMatched = 'DistrictMatched',\n}\n\nexport enum P2VSource {\n GpApi = 'GpApi',\n ElectionApi = 'ElectionApi',\n}\n\nexport type ViabilityScore = {\n level: string\n isPartisan: boolean\n isIncumbent: boolean\n isUncontested: boolean\n candidates: number\n seats: number\n candidatesPerSeat: number\n score: number\n probOfWin: number\n}\n\nexport type PathToVictoryData = {\n p2vStatus?: P2VStatus\n p2vAttempts?: number\n p2vCompleteDate?: string\n completedBy?: number\n electionType?: string\n electionLocation?: string\n voterContactGoal?: number\n winNumber?: number\n p2vNotNeeded?: boolean\n totalRegisteredVoters?: number\n republicans?: number\n democrats?: number\n indies?: number\n women?: number\n men?: number\n white?: number\n asian?: number\n africanAmerican?: number\n hispanic?: number\n averageTurnout?: number\n projectedTurnout?: number\n viability?: ViabilityScore\n source?: P2VSource\n districtId?: string\n districtManuallySet?: boolean\n officeContextFingerprint?: string\n}\n\nexport type PathToVictory = {\n id: number\n createdAt: string\n updatedAt: string\n campaignId: number\n data: PathToVictoryData\n}\n\nexport type ListPathsToVictoryOptions = PaginationOptions & {\n userId?: number\n}\n\nexport type UpdatePathToVictoryInput = {\n data: PathToVictoryData\n}\n"],"mappings":"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","names":["USER_ROLE_VALUES","WHY_BROWSING_VALUES","CAMPAIGN_TIER_VALUES","P2VStatus","P2VSource"]}
1
+ {"version":3,"sources":["../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/AdminResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/PathsToVictoryResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/index.ts","../src/enums.ts","../src/types/pathToVictory.ts"],"sourcesContent":["import { ofetch, FetchError, FetchOptions } from 'ofetch'\nimport { SdkError } from '../types/result'\n\nexport type OfetchRequestBody = FetchOptions<'json'>['body']\n\nexport class HttpClient {\n private baseUrl: string\n private getToken: () => Promise<string>\n\n constructor(gpApiRootUrl: string, getToken: () => Promise<string>) {\n this.baseUrl = gpApiRootUrl\n this.getToken = getToken\n }\n\n request = async <T>(\n path: string,\n init?: FetchOptions<'json'>,\n ): Promise<T> => {\n try {\n return await ofetch<T>(path, {\n baseURL: this.baseUrl,\n headers: {\n Authorization: `Bearer ${await this.getToken()}`,\n ...(init?.headers ?? {}),\n },\n ...init,\n })\n } catch (error: unknown) {\n if (error instanceof FetchError) {\n throw new SdkError(error.statusCode ?? 0, error.message, error.response)\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, message)\n }\n }\n}\n","export class SdkError extends Error {\n readonly status: number\n readonly response?: Response\n\n constructor(status: number, message: string, response?: Response) {\n super(message)\n this.name = 'SdkError'\n this.status = status\n this.response = response\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\n protected abstract readonly resourceBasePath: string\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient\n }\n\n protected getRequest = <T>(\n path: string,\n query?: FetchOptions<'json'>['query'],\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'GET', query })\n\n protected postRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'POST', body })\n\n protected putRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PUT', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type { ImpersonateUserOutput } from '../types/admin'\nimport { BaseResource } from './BaseResource'\n\nexport class AdminResource extends BaseResource {\n protected readonly resourceBasePath = '/admin'\n\n impersonateUser = (\n targetUserId: number,\n actorClerkId: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorClerkId },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type { UpdateDistrictInput } from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n protected readonly resourceBasePath = '/campaigns'\n\n get = (id: number): Promise<ReadCampaignOutput> =>\n this.getRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<ReadCampaignOutput>> =>\n this.getRequest<PaginatedList<ReadCampaignOutput>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n update = (\n id: number,\n input: UpdateCampaignM2MInput,\n ): Promise<ReadCampaignOutput> =>\n this.putRequest<ReadCampaignOutput>(`${this.resourceBasePath}/${id}`, input)\n\n updateDistrict = (\n id: number,\n input: UpdateDistrictInput,\n ): Promise<SetDistrictOutput> =>\n this.putRequest<SetDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\n}\n","import type {\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class EcanvasserResource extends BaseResource {\n protected readonly resourceBasePath = '/ecanvasser'\n\n create = (input: CreateEcanvasserInput): Promise<Ecanvasser> =>\n this.postRequest<Ecanvasser>(this.resourceBasePath, input)\n\n list = (): Promise<EcanvasserSummary[]> =>\n this.getRequest<EcanvasserSummary[]>(`${this.resourceBasePath}/list`)\n\n syncAll = (): Promise<void> =>\n this.getRequest<void>(`${this.resourceBasePath}/sync-all`)\n\n delete = (campaignId: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${campaignId}`)\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from '../types/electedOffice'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectedOfficesResource extends BaseResource {\n protected readonly resourceBasePath = '/elected-office'\n\n list = (\n options?: ListElectedOfficesOptions,\n ): Promise<PaginatedList<ElectedOffice>> =>\n this.getRequest<PaginatedList<ElectedOffice>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: string): Promise<ElectedOffice> =>\n this.getRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: string,\n input: UpdateElectedOfficeInput,\n ): Promise<ElectedOffice> =>\n this.putRequest<ElectedOffice>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n} from '../types/district'\nimport { BaseResource } from './BaseResource'\n\nexport class ElectionsResource extends BaseResource {\n protected readonly resourceBasePath = '/elections'\n\n listDistrictTypes = (\n options: ListDistrictTypesOptions,\n ): Promise<DistrictTypeItem[]> =>\n this.getRequest<DistrictTypeItem[]>(\n `${this.resourceBasePath}/districts/types`,\n options,\n )\n\n listDistrictNames = (\n options: ListDistrictNamesOptions,\n ): Promise<DistrictNameItem[]> =>\n this.getRequest<DistrictNameItem[]>(\n `${this.resourceBasePath}/districts/names`,\n options,\n )\n}\n","import type { PaginatedList } from '@goodparty_org/contracts'\nimport type {\n ListPathsToVictoryOptions,\n PathToVictory,\n UpdatePathToVictoryInput,\n} from '../types/pathToVictory'\nimport { BaseResource } from './BaseResource'\n\nexport class PathsToVictoryResource extends BaseResource {\n protected resourceBasePath = '/path-to-victory'\n list = (\n options?: ListPathsToVictoryOptions,\n ): Promise<PaginatedList<PathToVictory>> =>\n this.getRequest<PaginatedList<PathToVictory>>(\n `${this.resourceBasePath}/list`,\n options,\n )\n\n get = (id: number): Promise<PathToVictory> =>\n this.getRequest<PathToVictory>(`${this.resourceBasePath}/${id}`)\n\n update = (\n id: number,\n input: UpdatePathToVictoryInput,\n ): Promise<PathToVictory> =>\n this.putRequest<PathToVictory>(`${this.resourceBasePath}/${id}`, input)\n}\n","import type {\n ListUsersPagination,\n PaginatedList,\n ReadUserOutput,\n UpdatePasswordInput,\n UpdateUserInput,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n protected readonly resourceBasePath = '/users'\n\n list = (\n options?: ListUsersPagination,\n ): Promise<PaginatedList<ReadUserOutput>> =>\n this.getRequest<PaginatedList<ReadUserOutput>>(\n this.resourceBasePath,\n options,\n )\n\n get = (id: number): Promise<ReadUserOutput> =>\n this.getRequest<ReadUserOutput>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<ReadUserOutput> =>\n this.putRequest<ReadUserOutput>(`${this.resourceBasePath}/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`${this.resourceBasePath}/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`${this.resourceBasePath}/${id}/password`, input)\n}\n","import { createClerkClient } from '@clerk/backend'\nimport { SdkError } from '../../types/result'\n\nconst TOKEN_RENEWAL_BUFFER_MS = 30_000\n\nexport class ClerkService {\n private readonly m2mSecret: string\n private readonly clerkClient: ReturnType<typeof createClerkClient>\n private cachedToken: string | null = null\n private tokenExpiration: number | null = null\n private renewalTimer: ReturnType<typeof setTimeout> | null = null\n private pendingTokenPromise: Promise<string> | null = null\n private destroyed = false\n\n constructor(m2mSecret: string) {\n this.m2mSecret = m2mSecret\n this.clerkClient = createClerkClient({})\n }\n\n getToken = async (): Promise<string> => {\n if (this.cachedToken && this.isTokenValid()) {\n return this.cachedToken\n }\n\n if (this.pendingTokenPromise) {\n return this.pendingTokenPromise\n }\n\n const promise = this.createAndCacheToken()\n this.pendingTokenPromise = promise\n\n try {\n return await promise\n } finally {\n if (this.pendingTokenPromise === promise) {\n this.pendingTokenPromise = null\n }\n }\n }\n\n destroy = (): void => {\n this.destroyed = true\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n this.cachedToken = null\n this.tokenExpiration = null\n this.pendingTokenPromise = null\n }\n\n private isTokenValid = (): boolean => {\n if (!this.tokenExpiration) return true\n return Date.now() < this.tokenExpiration - TOKEN_RENEWAL_BUFFER_MS\n }\n\n private createAndCacheToken = async (): Promise<string> => {\n try {\n const m2mToken = await this.clerkClient.m2m.createToken({\n machineSecretKey: this.m2mSecret,\n })\n\n if (!m2mToken.token) {\n throw new SdkError(\n 0,\n 'Clerk M2M token creation succeeded but returned no token string',\n )\n }\n\n if (this.destroyed) return m2mToken.token\n\n this.cachedToken = m2mToken.token\n this.tokenExpiration = m2mToken.expiration\n this.scheduleRenewal()\n\n return this.cachedToken\n } catch (error: unknown) {\n if (error instanceof SdkError) {\n throw error\n }\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new SdkError(0, `Failed to create Clerk M2M token: ${message}`)\n }\n }\n\n private scheduleRenewal = (): void => {\n if (this.renewalTimer) {\n clearTimeout(this.renewalTimer)\n this.renewalTimer = null\n }\n\n if (!this.tokenExpiration) return\n\n const timeUntilRenewal =\n this.tokenExpiration - Date.now() - TOKEN_RENEWAL_BUFFER_MS\n\n if (timeUntilRenewal <= 0) return\n\n this.renewalTimer = setTimeout(() => {\n this.cachedToken = null\n this.getToken().catch((error: unknown) => {\n console.error('Proactive M2M token renewal failed:', error)\n })\n }, timeUntilRenewal)\n }\n}\n","import { HttpClient } from './http/HttpClient'\nimport { AdminResource } from './resources/AdminResource'\nimport { CampaignsResource } from './resources/CampaignsResource'\nimport { EcanvasserResource } from './resources/EcanvasserResource'\nimport { ElectedOfficesResource } from './resources/ElectedOfficesResource'\nimport { ElectionsResource } from './resources/ElectionsResource'\nimport { PathsToVictoryResource } from './resources/PathsToVictoryResource'\nimport { UsersResource } from './resources/UsersResource'\nimport { ClerkService } from './vendor/clerk/clerk.service'\n\nexport type GoodPartyClientConfig = {\n m2mSecret: string\n gpApiRootUrl: string\n}\n\nexport class GoodPartyClient {\n readonly admin: AdminResource\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly pathsToVictory: PathsToVictoryResource\n private clerkService: ClerkService\n\n private constructor(clerkService: ClerkService, gpApiRootUrl: string) {\n this.clerkService = clerkService\n const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken)\n this.admin = new AdminResource(httpClient)\n this.users = new UsersResource(httpClient)\n this.campaigns = new CampaignsResource(httpClient)\n this.ecanvasser = new EcanvasserResource(httpClient)\n this.electedOffices = new ElectedOfficesResource(httpClient)\n this.elections = new ElectionsResource(httpClient)\n this.pathsToVictory = new PathsToVictoryResource(httpClient)\n }\n\n static create = async (\n config: GoodPartyClientConfig,\n ): Promise<GoodPartyClient> => {\n const { m2mSecret, gpApiRootUrl } = config\n const clerkService = new ClerkService(m2mSecret)\n await clerkService.getToken()\n return new GoodPartyClient(clerkService, gpApiRootUrl)\n }\n\n destroy = (): void => {\n this.clerkService.destroy()\n }\n}\n","export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\n\nexport type {\n PaginationMeta,\n PaginatedList,\n PaginationOptions,\n ReadUserOutput,\n ReadUserOutput as User,\n UpdatePasswordInput,\n UpdateUserInput,\n UserMetaData,\n ListUsersPagination,\n ReadCampaignOutput,\n ReadCampaignOutput as Campaign,\n CampaignDetails,\n CampaignData,\n CampaignAiContent,\n VoterGoals,\n CustomVoterFile,\n AiChatMessage,\n AiContentInputValues,\n AiContentGenerationStatus,\n AiContentData,\n GeoLocation,\n CustomIssue,\n Opponent,\n HubSpotUpdates,\n CampaignFinance,\n CampaignPlan,\n CampaignPlanStatus,\n ListCampaignsPagination,\n SetDistrictOutput,\n UpdateCampaignM2MInput as UpdateCampaignInput,\n CreateEcanvasserInput,\n Ecanvasser,\n EcanvasserSummary,\n} from '@goodparty_org/contracts'\n\nexport {\n USER_ROLE_VALUES,\n WHY_BROWSING_VALUES,\n CAMPAIGN_TIER_VALUES,\n BALLOT_READY_POSITION_LEVEL_VALUES,\n ELECTION_LEVEL_VALUES,\n CAMPAIGN_CREATED_BY_VALUES,\n CAMPAIGN_LAUNCH_STATUS_VALUES,\n CAMPAIGN_STATUS_VALUES,\n ONBOARDING_STEP_VALUES,\n GENERATION_STATUS_VALUES,\n BallotReadyPositionLevel,\n ElectionLevel,\n CampaignCreatedBy,\n CampaignLaunchStatus,\n CampaignStatus,\n OnboardingStep,\n GenerationStatus,\n} from '@goodparty_org/contracts'\n\nexport { UserRole, WhyBrowsing, CampaignTier } from './enums'\n\nexport type {\n ElectedOffice,\n ListElectedOfficesOptions,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n PathToVictory,\n PathToVictoryData,\n ViabilityScore,\n ListPathsToVictoryOptions,\n UpdatePathToVictoryInput,\n} from './types/pathToVictory'\n\nexport { P2VStatus, P2VSource } from './types/pathToVictory'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n","import {\n USER_ROLE_VALUES,\n type UserRole as UserRoleType,\n WHY_BROWSING_VALUES,\n type WhyBrowsing as WhyBrowsingType,\n CAMPAIGN_TIER_VALUES,\n type CampaignTier as CampaignTierType,\n} from '@goodparty_org/contracts'\n\ntype EnumObject<T extends readonly string[]> = { [K in T[number]]: K }\n\nconst toEnumObject = <T extends readonly string[]>(values: T): EnumObject<T> =>\n Object.fromEntries(values.map((v) => [v, v])) as EnumObject<T>\n\nexport type UserRole = UserRoleType\nexport const UserRole = toEnumObject(USER_ROLE_VALUES)\n\nexport type WhyBrowsing = WhyBrowsingType\nexport const WhyBrowsing = toEnumObject(WHY_BROWSING_VALUES)\n\nexport type CampaignTier = CampaignTierType\nexport const CampaignTier = toEnumObject(CAMPAIGN_TIER_VALUES)\n","import type { PaginationOptions } from '@goodparty_org/contracts'\n\nexport enum P2VStatus {\n complete = 'Complete',\n waiting = 'Waiting',\n failed = 'Failed',\n districtMatched = 'DistrictMatched',\n}\n\nexport enum P2VSource {\n GpApi = 'GpApi',\n ElectionApi = 'ElectionApi',\n}\n\nexport type ViabilityScore = {\n level: string\n isPartisan: boolean\n isIncumbent: boolean\n isUncontested: boolean\n candidates: number\n seats: number\n candidatesPerSeat: number\n score: number\n probOfWin: number\n}\n\nexport type PathToVictoryData = {\n p2vStatus?: P2VStatus\n p2vAttempts?: number\n p2vCompleteDate?: string\n completedBy?: number\n electionType?: string\n electionLocation?: string\n voterContactGoal?: number\n winNumber?: number\n p2vNotNeeded?: boolean\n totalRegisteredVoters?: number\n republicans?: number\n democrats?: number\n indies?: number\n women?: number\n men?: number\n white?: number\n asian?: number\n africanAmerican?: number\n hispanic?: number\n averageTurnout?: number\n projectedTurnout?: number\n viability?: ViabilityScore\n source?: P2VSource\n districtId?: string\n districtManuallySet?: boolean\n officeContextFingerprint?: string\n}\n\nexport type PathToVictory = {\n id: number\n createdAt: string\n updatedAt: string\n campaignId: number\n data: PathToVictoryData\n}\n\nexport type ListPathsToVictoryOptions = PaginationOptions & {\n userId?: number\n}\n\nexport type UpdatePathToVictoryInput = {\n data: PathToVictoryData\n}\n"],"mappings":"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","names":["USER_ROLE_VALUES","WHY_BROWSING_VALUES","CAMPAIGN_TIER_VALUES","P2VStatus","P2VSource"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodparty_org/sdk",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "TypeScript SDK for interacting with the GoodParty API",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",