@goodparty_org/sdk 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -5
- package/dist/index.d.mts +17 -9
- package/dist/index.d.ts +17 -9
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -101,6 +101,18 @@ await client.ecanvasser.syncAll()
|
|
|
101
101
|
|
|
102
102
|
await client.ecanvasser.delete(campaignId)
|
|
103
103
|
|
|
104
|
+
// Admin agent runs (admin / M2M)
|
|
105
|
+
const runs = await client.adminAgentRuns.list({
|
|
106
|
+
experimentType: 'compliance_setup',
|
|
107
|
+
status: 'COMPLETED',
|
|
108
|
+
offset: 0,
|
|
109
|
+
limit: 20,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
const runDetail = await client.adminAgentRuns.get('run-uuid')
|
|
113
|
+
|
|
114
|
+
const retriedRun = await client.adminAgentRuns.retry('run-uuid')
|
|
115
|
+
|
|
104
116
|
client.destroy()
|
|
105
117
|
```
|
|
106
118
|
|
|
@@ -122,7 +134,7 @@ try {
|
|
|
122
134
|
|
|
123
135
|
### Prerequisites
|
|
124
136
|
|
|
125
|
-
- Node.js
|
|
137
|
+
- Node.js 24.13.0 (use `.nvmrc` with nvm: `nvm install && nvm use`)
|
|
126
138
|
|
|
127
139
|
### Setup
|
|
128
140
|
|
|
@@ -144,11 +156,13 @@ npm install
|
|
|
144
156
|
|
|
145
157
|
### Publishing
|
|
146
158
|
|
|
147
|
-
|
|
159
|
+
This package uses [changesets](https://github.com/changesets/changesets) for versioning. **Don't bump `package.json` manually.**
|
|
160
|
+
|
|
161
|
+
1. Run `npx changeset add` and describe the change (`patch` / `minor` / `major`). Commit the generated `.changeset/*.md` file with the rest of your PR.
|
|
162
|
+
2. Open a PR to `master`. CI runs `typecheck → lint → format:check → build`.
|
|
163
|
+
3. After merge, the publish workflow opens (and auto-merges) a release PR that bumps versions and updates `CHANGELOG.md`. The next workflow run publishes to npm and creates a `v<version>` GitHub Release with auto-generated notes.
|
|
148
164
|
|
|
149
|
-
|
|
150
|
-
2. Create a pull request
|
|
151
|
-
3. After merge, CI will create a GitHub Release and publish to npm
|
|
165
|
+
See [`docs/getting-started.md`](https://github.com/thegoodparty/gp-sdk/blob/master/docs/getting-started.md) for the full release flow + local-development tips (link / file: protocol).
|
|
152
166
|
|
|
153
167
|
## License
|
|
154
168
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
+
import { AgentRunsListQuery, PaginatedList, AgentRunListItem, AgentRunDetail, ReadCampaignOutput, ListCampaignsPagination, 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
|
+
export { AgentRun, AgentRunCandidateSummary, AgentRunDetail, AgentRunListItem, AgentRunsListQuery, 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, ExperimentRunStatus, 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';
|
|
1
3
|
import { FetchOptions } from 'ofetch';
|
|
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';
|
|
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';
|
|
4
|
-
|
|
5
|
-
type ImpersonateUserInput = {
|
|
6
|
-
actorEmail: string;
|
|
7
|
-
};
|
|
8
|
-
type ImpersonateUserOutput = {
|
|
9
|
-
token: string;
|
|
10
|
-
};
|
|
11
4
|
|
|
12
5
|
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
13
6
|
declare class HttpClient {
|
|
@@ -28,6 +21,20 @@ declare abstract class BaseResource {
|
|
|
28
21
|
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
29
22
|
}
|
|
30
23
|
|
|
24
|
+
declare class AdminAgentRunsResource extends BaseResource {
|
|
25
|
+
protected readonly resourceBasePath = "/admin/agent-runs";
|
|
26
|
+
list: (options?: AgentRunsListQuery) => Promise<PaginatedList<AgentRunListItem>>;
|
|
27
|
+
get: (runId: string) => Promise<AgentRunDetail>;
|
|
28
|
+
retry: (runId: string) => Promise<AgentRunListItem>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ImpersonateUserInput = {
|
|
32
|
+
actorEmail: string;
|
|
33
|
+
};
|
|
34
|
+
type ImpersonateUserOutput = {
|
|
35
|
+
token: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
31
38
|
declare class AdminResource extends BaseResource {
|
|
32
39
|
protected readonly resourceBasePath = "/admin";
|
|
33
40
|
impersonateUser: (targetUserId: number, actorEmail: string) => Promise<ImpersonateUserOutput>;
|
|
@@ -216,6 +223,7 @@ type GoodPartyClientConfig = {
|
|
|
216
223
|
};
|
|
217
224
|
declare class GoodPartyClient {
|
|
218
225
|
readonly admin: AdminResource;
|
|
226
|
+
readonly adminAgentRuns: AdminAgentRunsResource;
|
|
219
227
|
readonly users: UsersResource;
|
|
220
228
|
readonly campaigns: CampaignsResource;
|
|
221
229
|
readonly ecanvasser: EcanvasserResource;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
+
import { AgentRunsListQuery, PaginatedList, AgentRunListItem, AgentRunDetail, ReadCampaignOutput, ListCampaignsPagination, 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
|
+
export { AgentRun, AgentRunCandidateSummary, AgentRunDetail, AgentRunListItem, AgentRunsListQuery, 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, ExperimentRunStatus, 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';
|
|
1
3
|
import { FetchOptions } from 'ofetch';
|
|
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';
|
|
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';
|
|
4
|
-
|
|
5
|
-
type ImpersonateUserInput = {
|
|
6
|
-
actorEmail: string;
|
|
7
|
-
};
|
|
8
|
-
type ImpersonateUserOutput = {
|
|
9
|
-
token: string;
|
|
10
|
-
};
|
|
11
4
|
|
|
12
5
|
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
13
6
|
declare class HttpClient {
|
|
@@ -28,6 +21,20 @@ declare abstract class BaseResource {
|
|
|
28
21
|
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
29
22
|
}
|
|
30
23
|
|
|
24
|
+
declare class AdminAgentRunsResource extends BaseResource {
|
|
25
|
+
protected readonly resourceBasePath = "/admin/agent-runs";
|
|
26
|
+
list: (options?: AgentRunsListQuery) => Promise<PaginatedList<AgentRunListItem>>;
|
|
27
|
+
get: (runId: string) => Promise<AgentRunDetail>;
|
|
28
|
+
retry: (runId: string) => Promise<AgentRunListItem>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ImpersonateUserInput = {
|
|
32
|
+
actorEmail: string;
|
|
33
|
+
};
|
|
34
|
+
type ImpersonateUserOutput = {
|
|
35
|
+
token: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
31
38
|
declare class AdminResource extends BaseResource {
|
|
32
39
|
protected readonly resourceBasePath = "/admin";
|
|
33
40
|
impersonateUser: (targetUserId: number, actorEmail: string) => Promise<ImpersonateUserOutput>;
|
|
@@ -216,6 +223,7 @@ type GoodPartyClientConfig = {
|
|
|
216
223
|
};
|
|
217
224
|
declare class GoodPartyClient {
|
|
218
225
|
readonly admin: AdminResource;
|
|
226
|
+
readonly adminAgentRuns: AdminAgentRunsResource;
|
|
219
227
|
readonly users: UsersResource;
|
|
220
228
|
readonly campaigns: CampaignsResource;
|
|
221
229
|
readonly ecanvasser: EcanvasserResource;
|
package/dist/index.js
CHANGED
|
@@ -101,6 +101,20 @@ var BaseResource = class {
|
|
|
101
101
|
deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
|
|
102
102
|
};
|
|
103
103
|
|
|
104
|
+
// src/resources/AdminAgentRunsResource.ts
|
|
105
|
+
var AdminAgentRunsResource = class extends BaseResource {
|
|
106
|
+
resourceBasePath = "/admin/agent-runs";
|
|
107
|
+
list = (options) => this.getRequest(
|
|
108
|
+
this.resourceBasePath,
|
|
109
|
+
options
|
|
110
|
+
);
|
|
111
|
+
get = (runId) => this.getRequest(`${this.resourceBasePath}/${runId}`);
|
|
112
|
+
retry = (runId) => this.postRequest(
|
|
113
|
+
`${this.resourceBasePath}/${runId}/retry`,
|
|
114
|
+
{}
|
|
115
|
+
);
|
|
116
|
+
};
|
|
117
|
+
|
|
104
118
|
// src/resources/AdminResource.ts
|
|
105
119
|
var AdminResource = class extends BaseResource {
|
|
106
120
|
resourceBasePath = "/admin";
|
|
@@ -279,6 +293,7 @@ var ClerkService = class {
|
|
|
279
293
|
// src/GoodPartyClient.ts
|
|
280
294
|
var GoodPartyClient = class _GoodPartyClient {
|
|
281
295
|
admin;
|
|
296
|
+
adminAgentRuns;
|
|
282
297
|
users;
|
|
283
298
|
campaigns;
|
|
284
299
|
ecanvasser;
|
|
@@ -290,6 +305,7 @@ var GoodPartyClient = class _GoodPartyClient {
|
|
|
290
305
|
this.clerkService = clerkService;
|
|
291
306
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
292
307
|
this.admin = new AdminResource(httpClient);
|
|
308
|
+
this.adminAgentRuns = new AdminAgentRunsResource(httpClient);
|
|
293
309
|
this.users = new UsersResource(httpClient);
|
|
294
310
|
this.campaigns = new CampaignsResource(httpClient);
|
|
295
311
|
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/AdminResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/OrganizationsResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/enums.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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n RaceTargetMetrics,\n} from './types/campaign'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n\nexport type {\n Organization,\n OrgDistrict,\n OrgPosition,\n OrganizationListItem,\n OrganizationOwnerSummary,\n ListOrganizationsOptions,\n PatchOrganizationInput,\n} from './types/organization'\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 patchRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PATCH', 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 actorEmail: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorEmail },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n} from '../types/campaign'\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<CampaignWithLiveContext> =>\n this.getRequest<CampaignWithLiveContext>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<CampaignWithPositionName>> =>\n this.getRequest<PaginatedList<CampaignWithPositionName>>(\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\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 updateDistrict = (\n id: string,\n input: UpdateElectedOfficeDistrictInput,\n ): Promise<SetElectedOfficeDistrictOutput> =>\n this.putRequest<SetElectedOfficeDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\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 {\n ListOrganizationsOptions,\n Organization,\n OrganizationListItem,\n PatchOrganizationInput,\n} from '../types/organization'\nimport { BaseResource } from './BaseResource'\n\nexport class OrganizationsResource extends BaseResource {\n protected readonly resourceBasePath = '/organizations'\n\n get = (slug: string): Promise<Organization> =>\n this.getRequest<Organization>(`${this.resourceBasePath}/admin/${slug}`)\n\n list = (\n options?: ListOrganizationsOptions,\n ): Promise<{ organizations: OrganizationListItem[] }> =>\n this.getRequest<{ organizations: OrganizationListItem[] }>(\n `${this.resourceBasePath}/admin/list`,\n options,\n )\n\n patch = (\n slug: string,\n input: PatchOrganizationInput,\n ): Promise<Organization> =>\n this.patchRequest<Organization>(\n `${this.resourceBasePath}/admin/${slug}`,\n input,\n )\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 { OrganizationsResource } from './resources/OrganizationsResource'\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 organizations: OrganizationsResource\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.organizations = new OrganizationsResource(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"],"mappings":"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","names":["import_contracts"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/AdminAgentRunsResource.ts","../src/resources/AdminResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/OrganizationsResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/enums.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 AgentRun,\n AgentRunCandidateSummary,\n AgentRunListItem,\n AgentRunDetail,\n AgentRunsListQuery,\n ExperimentRunStatus,\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n RaceTargetMetrics,\n} from './types/campaign'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n\nexport type {\n Organization,\n OrgDistrict,\n OrgPosition,\n OrganizationListItem,\n OrganizationOwnerSummary,\n ListOrganizationsOptions,\n PatchOrganizationInput,\n} from './types/organization'\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 patchRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PATCH', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type {\n AgentRunDetail,\n AgentRunListItem,\n AgentRunsListQuery,\n PaginatedList,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class AdminAgentRunsResource extends BaseResource {\n protected readonly resourceBasePath = '/admin/agent-runs'\n\n list = (\n options?: AgentRunsListQuery,\n ): Promise<PaginatedList<AgentRunListItem>> =>\n this.getRequest<PaginatedList<AgentRunListItem>>(\n this.resourceBasePath,\n options,\n )\n\n get = (runId: string): Promise<AgentRunDetail> =>\n this.getRequest<AgentRunDetail>(`${this.resourceBasePath}/${runId}`)\n\n retry = (runId: string): Promise<AgentRunListItem> =>\n this.postRequest<AgentRunListItem>(\n `${this.resourceBasePath}/${runId}/retry`,\n {},\n )\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 actorEmail: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorEmail },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n} from '../types/campaign'\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<CampaignWithLiveContext> =>\n this.getRequest<CampaignWithLiveContext>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<CampaignWithPositionName>> =>\n this.getRequest<PaginatedList<CampaignWithPositionName>>(\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\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 updateDistrict = (\n id: string,\n input: UpdateElectedOfficeDistrictInput,\n ): Promise<SetElectedOfficeDistrictOutput> =>\n this.putRequest<SetElectedOfficeDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\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 {\n ListOrganizationsOptions,\n Organization,\n OrganizationListItem,\n PatchOrganizationInput,\n} from '../types/organization'\nimport { BaseResource } from './BaseResource'\n\nexport class OrganizationsResource extends BaseResource {\n protected readonly resourceBasePath = '/organizations'\n\n get = (slug: string): Promise<Organization> =>\n this.getRequest<Organization>(`${this.resourceBasePath}/admin/${slug}`)\n\n list = (\n options?: ListOrganizationsOptions,\n ): Promise<{ organizations: OrganizationListItem[] }> =>\n this.getRequest<{ organizations: OrganizationListItem[] }>(\n `${this.resourceBasePath}/admin/list`,\n options,\n )\n\n patch = (\n slug: string,\n input: PatchOrganizationInput,\n ): Promise<Organization> =>\n this.patchRequest<Organization>(\n `${this.resourceBasePath}/admin/${slug}`,\n input,\n )\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 { AdminAgentRunsResource } from './resources/AdminAgentRunsResource'\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 { OrganizationsResource } from './resources/OrganizationsResource'\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 adminAgentRuns: AdminAgentRunsResource\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly organizations: OrganizationsResource\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.adminAgentRuns = new AdminAgentRunsResource(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.organizations = new OrganizationsResource(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"],"mappings":"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","names":["import_contracts"]}
|
package/dist/index.mjs
CHANGED
|
@@ -54,6 +54,20 @@ var BaseResource = class {
|
|
|
54
54
|
deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
+
// src/resources/AdminAgentRunsResource.ts
|
|
58
|
+
var AdminAgentRunsResource = class extends BaseResource {
|
|
59
|
+
resourceBasePath = "/admin/agent-runs";
|
|
60
|
+
list = (options) => this.getRequest(
|
|
61
|
+
this.resourceBasePath,
|
|
62
|
+
options
|
|
63
|
+
);
|
|
64
|
+
get = (runId) => this.getRequest(`${this.resourceBasePath}/${runId}`);
|
|
65
|
+
retry = (runId) => this.postRequest(
|
|
66
|
+
`${this.resourceBasePath}/${runId}/retry`,
|
|
67
|
+
{}
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
|
|
57
71
|
// src/resources/AdminResource.ts
|
|
58
72
|
var AdminResource = class extends BaseResource {
|
|
59
73
|
resourceBasePath = "/admin";
|
|
@@ -232,6 +246,7 @@ var ClerkService = class {
|
|
|
232
246
|
// src/GoodPartyClient.ts
|
|
233
247
|
var GoodPartyClient = class _GoodPartyClient {
|
|
234
248
|
admin;
|
|
249
|
+
adminAgentRuns;
|
|
235
250
|
users;
|
|
236
251
|
campaigns;
|
|
237
252
|
ecanvasser;
|
|
@@ -243,6 +258,7 @@ var GoodPartyClient = class _GoodPartyClient {
|
|
|
243
258
|
this.clerkService = clerkService;
|
|
244
259
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
245
260
|
this.admin = new AdminResource(httpClient);
|
|
261
|
+
this.adminAgentRuns = new AdminAgentRunsResource(httpClient);
|
|
246
262
|
this.users = new UsersResource(httpClient);
|
|
247
263
|
this.campaigns = new CampaignsResource(httpClient);
|
|
248
264
|
this.ecanvasser = new EcanvasserResource(httpClient);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/OrganizationsResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/index.ts","../src/enums.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 patchRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PATCH', 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 actorEmail: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorEmail },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n} from '../types/campaign'\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<CampaignWithLiveContext> =>\n this.getRequest<CampaignWithLiveContext>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<CampaignWithPositionName>> =>\n this.getRequest<PaginatedList<CampaignWithPositionName>>(\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\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 updateDistrict = (\n id: string,\n input: UpdateElectedOfficeDistrictInput,\n ): Promise<SetElectedOfficeDistrictOutput> =>\n this.putRequest<SetElectedOfficeDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\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 {\n ListOrganizationsOptions,\n Organization,\n OrganizationListItem,\n PatchOrganizationInput,\n} from '../types/organization'\nimport { BaseResource } from './BaseResource'\n\nexport class OrganizationsResource extends BaseResource {\n protected readonly resourceBasePath = '/organizations'\n\n get = (slug: string): Promise<Organization> =>\n this.getRequest<Organization>(`${this.resourceBasePath}/admin/${slug}`)\n\n list = (\n options?: ListOrganizationsOptions,\n ): Promise<{ organizations: OrganizationListItem[] }> =>\n this.getRequest<{ organizations: OrganizationListItem[] }>(\n `${this.resourceBasePath}/admin/list`,\n options,\n )\n\n patch = (\n slug: string,\n input: PatchOrganizationInput,\n ): Promise<Organization> =>\n this.patchRequest<Organization>(\n `${this.resourceBasePath}/admin/${slug}`,\n input,\n )\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 { OrganizationsResource } from './resources/OrganizationsResource'\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 organizations: OrganizationsResource\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.organizations = new OrganizationsResource(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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n RaceTargetMetrics,\n} from './types/campaign'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n\nexport type {\n Organization,\n OrgDistrict,\n OrgPosition,\n OrganizationListItem,\n OrganizationOwnerSummary,\n ListOrganizationsOptions,\n PatchOrganizationInput,\n} from './types/organization'\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"],"mappings":"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","names":["USER_ROLE_VALUES","WHY_BROWSING_VALUES","CAMPAIGN_TIER_VALUES"]}
|
|
1
|
+
{"version":3,"sources":["../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/AdminAgentRunsResource.ts","../src/resources/AdminResource.ts","../src/resources/CampaignsResource.ts","../src/resources/EcanvasserResource.ts","../src/resources/ElectedOfficesResource.ts","../src/resources/ElectionsResource.ts","../src/resources/OrganizationsResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/index.ts","../src/enums.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 patchRequest = <T>(\n path: string,\n body: OfetchRequestBody,\n ): Promise<T> => this.httpClient.request<T>(path, { method: 'PATCH', body })\n\n protected deleteRequest = <T>(path: string): Promise<T> =>\n this.httpClient.request<T>(path, { method: 'DELETE' })\n}\n","import type {\n AgentRunDetail,\n AgentRunListItem,\n AgentRunsListQuery,\n PaginatedList,\n} from '@goodparty_org/contracts'\nimport { BaseResource } from './BaseResource'\n\nexport class AdminAgentRunsResource extends BaseResource {\n protected readonly resourceBasePath = '/admin/agent-runs'\n\n list = (\n options?: AgentRunsListQuery,\n ): Promise<PaginatedList<AgentRunListItem>> =>\n this.getRequest<PaginatedList<AgentRunListItem>>(\n this.resourceBasePath,\n options,\n )\n\n get = (runId: string): Promise<AgentRunDetail> =>\n this.getRequest<AgentRunDetail>(`${this.resourceBasePath}/${runId}`)\n\n retry = (runId: string): Promise<AgentRunListItem> =>\n this.postRequest<AgentRunListItem>(\n `${this.resourceBasePath}/${runId}/retry`,\n {},\n )\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 actorEmail: string,\n ): Promise<ImpersonateUserOutput> =>\n this.postRequest<ImpersonateUserOutput>(\n `${this.resourceBasePath}/users/impersonate/${targetUserId}`,\n { actorEmail },\n )\n}\n","import type {\n ListCampaignsPagination,\n PaginatedList,\n ReadCampaignOutput,\n SetDistrictOutput,\n UpdateCampaignM2MInput,\n} from '@goodparty_org/contracts'\nimport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n} from '../types/campaign'\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<CampaignWithLiveContext> =>\n this.getRequest<CampaignWithLiveContext>(`${this.resourceBasePath}/${id}`)\n\n list = (\n options?: ListCampaignsPagination,\n ): Promise<PaginatedList<CampaignWithPositionName>> =>\n this.getRequest<PaginatedList<CampaignWithPositionName>>(\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\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 updateDistrict = (\n id: string,\n input: UpdateElectedOfficeDistrictInput,\n ): Promise<SetElectedOfficeDistrictOutput> =>\n this.putRequest<SetElectedOfficeDistrictOutput>(\n `${this.resourceBasePath}/${id}/district`,\n input,\n )\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 {\n ListOrganizationsOptions,\n Organization,\n OrganizationListItem,\n PatchOrganizationInput,\n} from '../types/organization'\nimport { BaseResource } from './BaseResource'\n\nexport class OrganizationsResource extends BaseResource {\n protected readonly resourceBasePath = '/organizations'\n\n get = (slug: string): Promise<Organization> =>\n this.getRequest<Organization>(`${this.resourceBasePath}/admin/${slug}`)\n\n list = (\n options?: ListOrganizationsOptions,\n ): Promise<{ organizations: OrganizationListItem[] }> =>\n this.getRequest<{ organizations: OrganizationListItem[] }>(\n `${this.resourceBasePath}/admin/list`,\n options,\n )\n\n patch = (\n slug: string,\n input: PatchOrganizationInput,\n ): Promise<Organization> =>\n this.patchRequest<Organization>(\n `${this.resourceBasePath}/admin/${slug}`,\n input,\n )\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 { AdminAgentRunsResource } from './resources/AdminAgentRunsResource'\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 { OrganizationsResource } from './resources/OrganizationsResource'\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 adminAgentRuns: AdminAgentRunsResource\n readonly users: UsersResource\n readonly campaigns: CampaignsResource\n readonly ecanvasser: EcanvasserResource\n readonly electedOffices: ElectedOfficesResource\n readonly elections: ElectionsResource\n readonly organizations: OrganizationsResource\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.adminAgentRuns = new AdminAgentRunsResource(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.organizations = new OrganizationsResource(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 AgentRun,\n AgentRunCandidateSummary,\n AgentRunListItem,\n AgentRunDetail,\n AgentRunsListQuery,\n ExperimentRunStatus,\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 SetElectedOfficeDistrictOutput,\n UpdateElectedOfficeDistrictInput,\n UpdateElectedOfficeInput,\n} from './types/electedOffice'\n\nexport type {\n DistrictTypeItem,\n DistrictNameItem,\n ListDistrictTypesOptions,\n ListDistrictNamesOptions,\n UpdateDistrictInput,\n} from './types/district'\n\nexport type {\n CampaignWithLiveContext,\n CampaignWithPositionName,\n RaceTargetMetrics,\n} from './types/campaign'\n\nexport type { ImpersonateUserInput, ImpersonateUserOutput } from './types/admin'\n\nexport type {\n Organization,\n OrgDistrict,\n OrgPosition,\n OrganizationListItem,\n OrganizationOwnerSummary,\n ListOrganizationsOptions,\n PatchOrganizationInput,\n} from './types/organization'\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"],"mappings":"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","names":["USER_ROLE_VALUES","WHY_BROWSING_VALUES","CAMPAIGN_TIER_VALUES"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodparty_org/sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "TypeScript SDK for interacting with the GoodParty API",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
+
"postinstall": "node -e \"try { var p = require('path').join(__dirname, '.gitmodules'); if (require('fs').existsSync(p)) { require('child_process').execSync('git submodule update --init --recursive', { stdio: 'inherit', cwd: __dirname }); } } catch (e) { console.error('postinstall submodule init failed:', e.message); }\"",
|
|
19
20
|
"dev": "tsup --watch",
|
|
20
21
|
"build": "tsup",
|
|
21
22
|
"lint": "eslint \"src/**/*.ts\" --quiet",
|
|
@@ -49,7 +50,7 @@
|
|
|
49
50
|
},
|
|
50
51
|
"dependencies": {
|
|
51
52
|
"@clerk/backend": "^2.30.1",
|
|
52
|
-
"@goodparty_org/contracts": "0.0.0-rc-develop.
|
|
53
|
+
"@goodparty_org/contracts": "0.0.0-rc-develop.c6a82050de21f73d78148ad84c9e6d8eba59ed1c",
|
|
53
54
|
"ofetch": "^1.5.1"
|
|
54
55
|
}
|
|
55
56
|
}
|