@goodparty_org/sdk 1.2.0 → 1.4.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 +15 -0
- package/dist/index.d.mts +217 -18
- package/dist/index.d.ts +217 -18
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +58 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,7 @@ const client = await GoodPartyClient.create({
|
|
|
18
18
|
gpApiRootUrl: 'https://gp-api.goodparty.org/v1',
|
|
19
19
|
})
|
|
20
20
|
|
|
21
|
+
// Users
|
|
21
22
|
const user = await client.users.get(1)
|
|
22
23
|
|
|
23
24
|
const users = await client.users.list({ offset: 0, limit: 20 })
|
|
@@ -31,6 +32,7 @@ const filtered = await client.users.list({
|
|
|
31
32
|
const updatedUser = await client.users.update(1, {
|
|
32
33
|
firstName: 'Jane',
|
|
33
34
|
roles: ['candidate'],
|
|
35
|
+
metaData: { hubspotId: 'abc123', textNotifications: true },
|
|
34
36
|
})
|
|
35
37
|
|
|
36
38
|
await client.users.updatePassword(1, {
|
|
@@ -40,6 +42,19 @@ await client.users.updatePassword(1, {
|
|
|
40
42
|
|
|
41
43
|
await client.users.delete(1)
|
|
42
44
|
|
|
45
|
+
const campaigns = await client.campaigns.list({ offset: 0, limit: 20 })
|
|
46
|
+
|
|
47
|
+
const byUser = await client.campaigns.list({
|
|
48
|
+
userId: 42,
|
|
49
|
+
sortBy: 'createdAt',
|
|
50
|
+
sortOrder: 'desc',
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
const updatedCampaign = await client.campaigns.update(1, {
|
|
54
|
+
isActive: true,
|
|
55
|
+
details: { office: 'Mayor' },
|
|
56
|
+
})
|
|
57
|
+
|
|
43
58
|
client.destroy()
|
|
44
59
|
```
|
|
45
60
|
|
package/dist/index.d.mts
CHANGED
|
@@ -21,6 +21,220 @@ type PaginatedList<T> = {
|
|
|
21
21
|
meta: PaginationMeta;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
declare enum CampaignTier {
|
|
25
|
+
WIN = "WIN",
|
|
26
|
+
LOSE = "LOSE",
|
|
27
|
+
TOSSUP = "TOSSUP"
|
|
28
|
+
}
|
|
29
|
+
declare enum BallotReadyPositionLevel {
|
|
30
|
+
CITY = "CITY",
|
|
31
|
+
COUNTY = "COUNTY",
|
|
32
|
+
FEDERAL = "FEDERAL",
|
|
33
|
+
LOCAL = "LOCAL",
|
|
34
|
+
REGIONAL = "REGIONAL",
|
|
35
|
+
STATE = "STATE",
|
|
36
|
+
TOWNSHIP = "TOWNSHIP"
|
|
37
|
+
}
|
|
38
|
+
declare enum ElectionLevel {
|
|
39
|
+
state = "state",
|
|
40
|
+
county = "county",
|
|
41
|
+
federal = "federal",
|
|
42
|
+
city = "city"
|
|
43
|
+
}
|
|
44
|
+
declare enum CampaignCreatedBy {
|
|
45
|
+
ADMIN = "admin"
|
|
46
|
+
}
|
|
47
|
+
declare enum CampaignLaunchStatus {
|
|
48
|
+
launched = "launched"
|
|
49
|
+
}
|
|
50
|
+
declare enum OnboardingStep {
|
|
51
|
+
complete = "onboarding-complete",
|
|
52
|
+
registration = "registration"
|
|
53
|
+
}
|
|
54
|
+
declare enum GenerationStatus {
|
|
55
|
+
processing = "processing",
|
|
56
|
+
completed = "completed"
|
|
57
|
+
}
|
|
58
|
+
type VoterGoals = {
|
|
59
|
+
doorKnocking?: number;
|
|
60
|
+
calls?: number;
|
|
61
|
+
digital?: number;
|
|
62
|
+
directMail?: number;
|
|
63
|
+
digitalAds?: number;
|
|
64
|
+
text?: number;
|
|
65
|
+
events?: number;
|
|
66
|
+
yardSigns?: number;
|
|
67
|
+
robocall?: number;
|
|
68
|
+
phoneBanking?: number;
|
|
69
|
+
socialMedia?: number;
|
|
70
|
+
};
|
|
71
|
+
type CustomVoterFile = {
|
|
72
|
+
name: string;
|
|
73
|
+
channel?: string;
|
|
74
|
+
purpose?: string;
|
|
75
|
+
filters: string[];
|
|
76
|
+
createdAt: string;
|
|
77
|
+
};
|
|
78
|
+
type AiChatMessage = {
|
|
79
|
+
role: 'user' | 'system' | 'assistant';
|
|
80
|
+
content: string;
|
|
81
|
+
createdAt?: number;
|
|
82
|
+
id?: string;
|
|
83
|
+
usage?: number;
|
|
84
|
+
};
|
|
85
|
+
type AiContentInputValues = Record<string, string | boolean | number | undefined>;
|
|
86
|
+
type AiContentGenerationStatus = {
|
|
87
|
+
status: GenerationStatus;
|
|
88
|
+
createdAt: number;
|
|
89
|
+
prompt?: string;
|
|
90
|
+
existingChat?: AiChatMessage[];
|
|
91
|
+
inputValues?: AiContentInputValues;
|
|
92
|
+
};
|
|
93
|
+
type AiContentData = {
|
|
94
|
+
name: string;
|
|
95
|
+
content: string;
|
|
96
|
+
updatedAt: number;
|
|
97
|
+
inputValues?: AiContentInputValues;
|
|
98
|
+
};
|
|
99
|
+
type CampaignDetails = {
|
|
100
|
+
state?: string;
|
|
101
|
+
ballotLevel?: BallotReadyPositionLevel;
|
|
102
|
+
electionDate?: string;
|
|
103
|
+
primaryElectionDate?: string;
|
|
104
|
+
zip?: string | null;
|
|
105
|
+
knowRun?: 'yes' | null;
|
|
106
|
+
runForOffice?: 'yes' | 'no' | null;
|
|
107
|
+
pledged?: boolean;
|
|
108
|
+
isProUpdatedAt?: number;
|
|
109
|
+
customIssues?: Record<'title' | 'position', string>[];
|
|
110
|
+
runningAgainst?: Record<'name' | 'party' | 'description', string>[];
|
|
111
|
+
geoLocation?: {
|
|
112
|
+
geoHash?: string;
|
|
113
|
+
lng?: number;
|
|
114
|
+
lat?: number;
|
|
115
|
+
};
|
|
116
|
+
geoLocationFailed?: boolean;
|
|
117
|
+
city?: string | null;
|
|
118
|
+
county?: string | null;
|
|
119
|
+
normalizedOffice?: string | null;
|
|
120
|
+
otherOffice?: string;
|
|
121
|
+
office?: string;
|
|
122
|
+
party?: string;
|
|
123
|
+
otherParty?: string;
|
|
124
|
+
district?: string;
|
|
125
|
+
raceId?: string;
|
|
126
|
+
level?: ElectionLevel | null;
|
|
127
|
+
noNormalizedOffice?: boolean;
|
|
128
|
+
website?: string;
|
|
129
|
+
pastExperience?: string | Record<string, string>;
|
|
130
|
+
occupation?: string;
|
|
131
|
+
funFact?: string;
|
|
132
|
+
campaignCommittee?: string;
|
|
133
|
+
statementName?: string;
|
|
134
|
+
subscriptionId?: string | null;
|
|
135
|
+
endOfElectionSubscriptionCanceled?: boolean;
|
|
136
|
+
subscriptionCanceledAt?: number | null;
|
|
137
|
+
subscriptionCancelAt?: number | null;
|
|
138
|
+
filingPeriodsStart?: string | null;
|
|
139
|
+
filingPeriodsEnd?: string | null;
|
|
140
|
+
officeTermLength?: string;
|
|
141
|
+
partisanType?: string;
|
|
142
|
+
priorElectionDates?: string[];
|
|
143
|
+
positionId?: string | null;
|
|
144
|
+
electionId?: string | null;
|
|
145
|
+
tier?: string;
|
|
146
|
+
einNumber?: string | null;
|
|
147
|
+
wonGeneral?: boolean;
|
|
148
|
+
} | null;
|
|
149
|
+
type CampaignData = {
|
|
150
|
+
createdBy?: CampaignCreatedBy;
|
|
151
|
+
slug?: string;
|
|
152
|
+
hubSpotUpdates?: Partial<Record<string, string>>;
|
|
153
|
+
currentStep?: OnboardingStep;
|
|
154
|
+
launchStatus?: CampaignLaunchStatus;
|
|
155
|
+
lastVisited?: number;
|
|
156
|
+
claimProfile?: string;
|
|
157
|
+
customVoterFiles?: CustomVoterFile[];
|
|
158
|
+
reportedVoterGoals?: VoterGoals;
|
|
159
|
+
textCampaignCount?: number;
|
|
160
|
+
lastStepDate?: string;
|
|
161
|
+
adminUserEmail?: string;
|
|
162
|
+
hubspotId?: string;
|
|
163
|
+
name?: string;
|
|
164
|
+
} | null;
|
|
165
|
+
type CampaignAiContent = {
|
|
166
|
+
generationStatus?: Record<string, AiContentGenerationStatus>;
|
|
167
|
+
campaignPlanAttempts?: Record<string, number>;
|
|
168
|
+
} & Record<string, AiContentData>;
|
|
169
|
+
type Campaign = {
|
|
170
|
+
id: number;
|
|
171
|
+
createdAt: string;
|
|
172
|
+
updatedAt: string;
|
|
173
|
+
slug: string;
|
|
174
|
+
isActive: boolean;
|
|
175
|
+
isVerified?: boolean | null;
|
|
176
|
+
isPro?: boolean | null;
|
|
177
|
+
isDemo: boolean;
|
|
178
|
+
didWin?: boolean | null;
|
|
179
|
+
dateVerified?: string | null;
|
|
180
|
+
tier?: CampaignTier | null;
|
|
181
|
+
formattedAddress?: string | null;
|
|
182
|
+
placeId?: string | null;
|
|
183
|
+
data: CampaignData;
|
|
184
|
+
details: CampaignDetails;
|
|
185
|
+
aiContent: CampaignAiContent;
|
|
186
|
+
userId: number;
|
|
187
|
+
canDownloadFederal: boolean;
|
|
188
|
+
completedTaskIds: string[];
|
|
189
|
+
hasFreeTextsOffer: boolean;
|
|
190
|
+
freeTextsOfferRedeemedAt?: string | null;
|
|
191
|
+
};
|
|
192
|
+
type ListCampaignsOptions = PaginationOptions & {
|
|
193
|
+
userId?: number;
|
|
194
|
+
slug?: string;
|
|
195
|
+
};
|
|
196
|
+
type UpdateCampaignInput = {
|
|
197
|
+
slug?: string;
|
|
198
|
+
isActive?: boolean;
|
|
199
|
+
isVerified?: boolean | null;
|
|
200
|
+
isPro?: boolean | null;
|
|
201
|
+
isDemo?: boolean;
|
|
202
|
+
didWin?: boolean | null;
|
|
203
|
+
dateVerified?: string | null;
|
|
204
|
+
tier?: CampaignTier | null;
|
|
205
|
+
formattedAddress?: string | null;
|
|
206
|
+
placeId?: string | null;
|
|
207
|
+
data?: CampaignData;
|
|
208
|
+
details?: CampaignDetails;
|
|
209
|
+
aiContent?: CampaignAiContent;
|
|
210
|
+
canDownloadFederal?: boolean;
|
|
211
|
+
completedTaskIds?: string[];
|
|
212
|
+
hasFreeTextsOffer?: boolean;
|
|
213
|
+
freeTextsOfferRedeemedAt?: string | null;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
217
|
+
declare class HttpClient {
|
|
218
|
+
private baseUrl;
|
|
219
|
+
private getToken;
|
|
220
|
+
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
221
|
+
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
declare abstract class BaseResource {
|
|
225
|
+
protected httpClient: HttpClient;
|
|
226
|
+
constructor(httpClient: HttpClient);
|
|
227
|
+
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
228
|
+
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
229
|
+
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
230
|
+
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
declare class CampaignsResource extends BaseResource {
|
|
234
|
+
list: (options?: ListCampaignsOptions) => Promise<PaginatedList<Campaign>>;
|
|
235
|
+
update: (id: number, input: UpdateCampaignInput) => Promise<Campaign>;
|
|
236
|
+
}
|
|
237
|
+
|
|
24
238
|
declare enum UserRole {
|
|
25
239
|
admin = "admin",
|
|
26
240
|
sales = "sales",
|
|
@@ -79,29 +293,13 @@ type UpdateUserInput = {
|
|
|
79
293
|
roles?: UserRole[];
|
|
80
294
|
signUpMode?: SIGN_UP_MODE;
|
|
81
295
|
allowTexts?: boolean;
|
|
296
|
+
metaData?: UserMetaData;
|
|
82
297
|
};
|
|
83
298
|
type UpdatePasswordInput = {
|
|
84
299
|
oldPassword?: string;
|
|
85
300
|
newPassword: string;
|
|
86
301
|
};
|
|
87
302
|
|
|
88
|
-
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
89
|
-
declare class HttpClient {
|
|
90
|
-
private baseUrl;
|
|
91
|
-
private getToken;
|
|
92
|
-
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
93
|
-
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
declare abstract class BaseResource {
|
|
97
|
-
protected httpClient: HttpClient;
|
|
98
|
-
constructor(httpClient: HttpClient);
|
|
99
|
-
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
100
|
-
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
101
|
-
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
102
|
-
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
303
|
declare class UsersResource extends BaseResource {
|
|
106
304
|
list: (options?: ListUsersOptions) => Promise<PaginatedList<User>>;
|
|
107
305
|
get: (id: number) => Promise<User>;
|
|
@@ -116,10 +314,11 @@ type GoodPartyClientConfig = {
|
|
|
116
314
|
};
|
|
117
315
|
declare class GoodPartyClient {
|
|
118
316
|
readonly users: UsersResource;
|
|
317
|
+
readonly campaigns: CampaignsResource;
|
|
119
318
|
private clerkService;
|
|
120
319
|
private constructor();
|
|
121
320
|
static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
|
|
122
321
|
destroy: () => void;
|
|
123
322
|
}
|
|
124
323
|
|
|
125
|
-
export { GoodPartyClient, type GoodPartyClientConfig, type ListUsersOptions, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
|
|
324
|
+
export { type AiChatMessage, type AiContentData, type AiContentGenerationStatus, type AiContentInputValues, BallotReadyPositionLevel, type Campaign, type CampaignAiContent, CampaignCreatedBy, type CampaignData, type CampaignDetails, CampaignLaunchStatus, CampaignTier, type CustomVoterFile, ElectionLevel, GenerationStatus, GoodPartyClient, type GoodPartyClientConfig, type ListCampaignsOptions, type ListUsersOptions, OnboardingStep, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdateCampaignInput, type UpdatePasswordInput, type UpdateUserInput, type User, type UserMetaData, UserRole, type VoterGoals, WhyBrowsing };
|
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,220 @@ type PaginatedList<T> = {
|
|
|
21
21
|
meta: PaginationMeta;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
declare enum CampaignTier {
|
|
25
|
+
WIN = "WIN",
|
|
26
|
+
LOSE = "LOSE",
|
|
27
|
+
TOSSUP = "TOSSUP"
|
|
28
|
+
}
|
|
29
|
+
declare enum BallotReadyPositionLevel {
|
|
30
|
+
CITY = "CITY",
|
|
31
|
+
COUNTY = "COUNTY",
|
|
32
|
+
FEDERAL = "FEDERAL",
|
|
33
|
+
LOCAL = "LOCAL",
|
|
34
|
+
REGIONAL = "REGIONAL",
|
|
35
|
+
STATE = "STATE",
|
|
36
|
+
TOWNSHIP = "TOWNSHIP"
|
|
37
|
+
}
|
|
38
|
+
declare enum ElectionLevel {
|
|
39
|
+
state = "state",
|
|
40
|
+
county = "county",
|
|
41
|
+
federal = "federal",
|
|
42
|
+
city = "city"
|
|
43
|
+
}
|
|
44
|
+
declare enum CampaignCreatedBy {
|
|
45
|
+
ADMIN = "admin"
|
|
46
|
+
}
|
|
47
|
+
declare enum CampaignLaunchStatus {
|
|
48
|
+
launched = "launched"
|
|
49
|
+
}
|
|
50
|
+
declare enum OnboardingStep {
|
|
51
|
+
complete = "onboarding-complete",
|
|
52
|
+
registration = "registration"
|
|
53
|
+
}
|
|
54
|
+
declare enum GenerationStatus {
|
|
55
|
+
processing = "processing",
|
|
56
|
+
completed = "completed"
|
|
57
|
+
}
|
|
58
|
+
type VoterGoals = {
|
|
59
|
+
doorKnocking?: number;
|
|
60
|
+
calls?: number;
|
|
61
|
+
digital?: number;
|
|
62
|
+
directMail?: number;
|
|
63
|
+
digitalAds?: number;
|
|
64
|
+
text?: number;
|
|
65
|
+
events?: number;
|
|
66
|
+
yardSigns?: number;
|
|
67
|
+
robocall?: number;
|
|
68
|
+
phoneBanking?: number;
|
|
69
|
+
socialMedia?: number;
|
|
70
|
+
};
|
|
71
|
+
type CustomVoterFile = {
|
|
72
|
+
name: string;
|
|
73
|
+
channel?: string;
|
|
74
|
+
purpose?: string;
|
|
75
|
+
filters: string[];
|
|
76
|
+
createdAt: string;
|
|
77
|
+
};
|
|
78
|
+
type AiChatMessage = {
|
|
79
|
+
role: 'user' | 'system' | 'assistant';
|
|
80
|
+
content: string;
|
|
81
|
+
createdAt?: number;
|
|
82
|
+
id?: string;
|
|
83
|
+
usage?: number;
|
|
84
|
+
};
|
|
85
|
+
type AiContentInputValues = Record<string, string | boolean | number | undefined>;
|
|
86
|
+
type AiContentGenerationStatus = {
|
|
87
|
+
status: GenerationStatus;
|
|
88
|
+
createdAt: number;
|
|
89
|
+
prompt?: string;
|
|
90
|
+
existingChat?: AiChatMessage[];
|
|
91
|
+
inputValues?: AiContentInputValues;
|
|
92
|
+
};
|
|
93
|
+
type AiContentData = {
|
|
94
|
+
name: string;
|
|
95
|
+
content: string;
|
|
96
|
+
updatedAt: number;
|
|
97
|
+
inputValues?: AiContentInputValues;
|
|
98
|
+
};
|
|
99
|
+
type CampaignDetails = {
|
|
100
|
+
state?: string;
|
|
101
|
+
ballotLevel?: BallotReadyPositionLevel;
|
|
102
|
+
electionDate?: string;
|
|
103
|
+
primaryElectionDate?: string;
|
|
104
|
+
zip?: string | null;
|
|
105
|
+
knowRun?: 'yes' | null;
|
|
106
|
+
runForOffice?: 'yes' | 'no' | null;
|
|
107
|
+
pledged?: boolean;
|
|
108
|
+
isProUpdatedAt?: number;
|
|
109
|
+
customIssues?: Record<'title' | 'position', string>[];
|
|
110
|
+
runningAgainst?: Record<'name' | 'party' | 'description', string>[];
|
|
111
|
+
geoLocation?: {
|
|
112
|
+
geoHash?: string;
|
|
113
|
+
lng?: number;
|
|
114
|
+
lat?: number;
|
|
115
|
+
};
|
|
116
|
+
geoLocationFailed?: boolean;
|
|
117
|
+
city?: string | null;
|
|
118
|
+
county?: string | null;
|
|
119
|
+
normalizedOffice?: string | null;
|
|
120
|
+
otherOffice?: string;
|
|
121
|
+
office?: string;
|
|
122
|
+
party?: string;
|
|
123
|
+
otherParty?: string;
|
|
124
|
+
district?: string;
|
|
125
|
+
raceId?: string;
|
|
126
|
+
level?: ElectionLevel | null;
|
|
127
|
+
noNormalizedOffice?: boolean;
|
|
128
|
+
website?: string;
|
|
129
|
+
pastExperience?: string | Record<string, string>;
|
|
130
|
+
occupation?: string;
|
|
131
|
+
funFact?: string;
|
|
132
|
+
campaignCommittee?: string;
|
|
133
|
+
statementName?: string;
|
|
134
|
+
subscriptionId?: string | null;
|
|
135
|
+
endOfElectionSubscriptionCanceled?: boolean;
|
|
136
|
+
subscriptionCanceledAt?: number | null;
|
|
137
|
+
subscriptionCancelAt?: number | null;
|
|
138
|
+
filingPeriodsStart?: string | null;
|
|
139
|
+
filingPeriodsEnd?: string | null;
|
|
140
|
+
officeTermLength?: string;
|
|
141
|
+
partisanType?: string;
|
|
142
|
+
priorElectionDates?: string[];
|
|
143
|
+
positionId?: string | null;
|
|
144
|
+
electionId?: string | null;
|
|
145
|
+
tier?: string;
|
|
146
|
+
einNumber?: string | null;
|
|
147
|
+
wonGeneral?: boolean;
|
|
148
|
+
} | null;
|
|
149
|
+
type CampaignData = {
|
|
150
|
+
createdBy?: CampaignCreatedBy;
|
|
151
|
+
slug?: string;
|
|
152
|
+
hubSpotUpdates?: Partial<Record<string, string>>;
|
|
153
|
+
currentStep?: OnboardingStep;
|
|
154
|
+
launchStatus?: CampaignLaunchStatus;
|
|
155
|
+
lastVisited?: number;
|
|
156
|
+
claimProfile?: string;
|
|
157
|
+
customVoterFiles?: CustomVoterFile[];
|
|
158
|
+
reportedVoterGoals?: VoterGoals;
|
|
159
|
+
textCampaignCount?: number;
|
|
160
|
+
lastStepDate?: string;
|
|
161
|
+
adminUserEmail?: string;
|
|
162
|
+
hubspotId?: string;
|
|
163
|
+
name?: string;
|
|
164
|
+
} | null;
|
|
165
|
+
type CampaignAiContent = {
|
|
166
|
+
generationStatus?: Record<string, AiContentGenerationStatus>;
|
|
167
|
+
campaignPlanAttempts?: Record<string, number>;
|
|
168
|
+
} & Record<string, AiContentData>;
|
|
169
|
+
type Campaign = {
|
|
170
|
+
id: number;
|
|
171
|
+
createdAt: string;
|
|
172
|
+
updatedAt: string;
|
|
173
|
+
slug: string;
|
|
174
|
+
isActive: boolean;
|
|
175
|
+
isVerified?: boolean | null;
|
|
176
|
+
isPro?: boolean | null;
|
|
177
|
+
isDemo: boolean;
|
|
178
|
+
didWin?: boolean | null;
|
|
179
|
+
dateVerified?: string | null;
|
|
180
|
+
tier?: CampaignTier | null;
|
|
181
|
+
formattedAddress?: string | null;
|
|
182
|
+
placeId?: string | null;
|
|
183
|
+
data: CampaignData;
|
|
184
|
+
details: CampaignDetails;
|
|
185
|
+
aiContent: CampaignAiContent;
|
|
186
|
+
userId: number;
|
|
187
|
+
canDownloadFederal: boolean;
|
|
188
|
+
completedTaskIds: string[];
|
|
189
|
+
hasFreeTextsOffer: boolean;
|
|
190
|
+
freeTextsOfferRedeemedAt?: string | null;
|
|
191
|
+
};
|
|
192
|
+
type ListCampaignsOptions = PaginationOptions & {
|
|
193
|
+
userId?: number;
|
|
194
|
+
slug?: string;
|
|
195
|
+
};
|
|
196
|
+
type UpdateCampaignInput = {
|
|
197
|
+
slug?: string;
|
|
198
|
+
isActive?: boolean;
|
|
199
|
+
isVerified?: boolean | null;
|
|
200
|
+
isPro?: boolean | null;
|
|
201
|
+
isDemo?: boolean;
|
|
202
|
+
didWin?: boolean | null;
|
|
203
|
+
dateVerified?: string | null;
|
|
204
|
+
tier?: CampaignTier | null;
|
|
205
|
+
formattedAddress?: string | null;
|
|
206
|
+
placeId?: string | null;
|
|
207
|
+
data?: CampaignData;
|
|
208
|
+
details?: CampaignDetails;
|
|
209
|
+
aiContent?: CampaignAiContent;
|
|
210
|
+
canDownloadFederal?: boolean;
|
|
211
|
+
completedTaskIds?: string[];
|
|
212
|
+
hasFreeTextsOffer?: boolean;
|
|
213
|
+
freeTextsOfferRedeemedAt?: string | null;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
217
|
+
declare class HttpClient {
|
|
218
|
+
private baseUrl;
|
|
219
|
+
private getToken;
|
|
220
|
+
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
221
|
+
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
declare abstract class BaseResource {
|
|
225
|
+
protected httpClient: HttpClient;
|
|
226
|
+
constructor(httpClient: HttpClient);
|
|
227
|
+
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
228
|
+
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
229
|
+
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
230
|
+
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
declare class CampaignsResource extends BaseResource {
|
|
234
|
+
list: (options?: ListCampaignsOptions) => Promise<PaginatedList<Campaign>>;
|
|
235
|
+
update: (id: number, input: UpdateCampaignInput) => Promise<Campaign>;
|
|
236
|
+
}
|
|
237
|
+
|
|
24
238
|
declare enum UserRole {
|
|
25
239
|
admin = "admin",
|
|
26
240
|
sales = "sales",
|
|
@@ -79,29 +293,13 @@ type UpdateUserInput = {
|
|
|
79
293
|
roles?: UserRole[];
|
|
80
294
|
signUpMode?: SIGN_UP_MODE;
|
|
81
295
|
allowTexts?: boolean;
|
|
296
|
+
metaData?: UserMetaData;
|
|
82
297
|
};
|
|
83
298
|
type UpdatePasswordInput = {
|
|
84
299
|
oldPassword?: string;
|
|
85
300
|
newPassword: string;
|
|
86
301
|
};
|
|
87
302
|
|
|
88
|
-
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
89
|
-
declare class HttpClient {
|
|
90
|
-
private baseUrl;
|
|
91
|
-
private getToken;
|
|
92
|
-
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
93
|
-
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
declare abstract class BaseResource {
|
|
97
|
-
protected httpClient: HttpClient;
|
|
98
|
-
constructor(httpClient: HttpClient);
|
|
99
|
-
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
100
|
-
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
101
|
-
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
102
|
-
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
303
|
declare class UsersResource extends BaseResource {
|
|
106
304
|
list: (options?: ListUsersOptions) => Promise<PaginatedList<User>>;
|
|
107
305
|
get: (id: number) => Promise<User>;
|
|
@@ -116,10 +314,11 @@ type GoodPartyClientConfig = {
|
|
|
116
314
|
};
|
|
117
315
|
declare class GoodPartyClient {
|
|
118
316
|
readonly users: UsersResource;
|
|
317
|
+
readonly campaigns: CampaignsResource;
|
|
119
318
|
private clerkService;
|
|
120
319
|
private constructor();
|
|
121
320
|
static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
|
|
122
321
|
destroy: () => void;
|
|
123
322
|
}
|
|
124
323
|
|
|
125
|
-
export { GoodPartyClient, type GoodPartyClientConfig, type ListUsersOptions, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
|
|
324
|
+
export { type AiChatMessage, type AiContentData, type AiContentGenerationStatus, type AiContentInputValues, BallotReadyPositionLevel, type Campaign, type CampaignAiContent, CampaignCreatedBy, type CampaignData, type CampaignDetails, CampaignLaunchStatus, CampaignTier, type CustomVoterFile, ElectionLevel, GenerationStatus, GoodPartyClient, type GoodPartyClientConfig, type ListCampaignsOptions, type ListUsersOptions, OnboardingStep, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdateCampaignInput, type UpdatePasswordInput, type UpdateUserInput, type User, type UserMetaData, UserRole, type VoterGoals, WhyBrowsing };
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
BallotReadyPositionLevel: () => BallotReadyPositionLevel,
|
|
24
|
+
CampaignCreatedBy: () => CampaignCreatedBy,
|
|
25
|
+
CampaignLaunchStatus: () => CampaignLaunchStatus,
|
|
26
|
+
CampaignTier: () => CampaignTier,
|
|
27
|
+
ElectionLevel: () => ElectionLevel,
|
|
28
|
+
GenerationStatus: () => GenerationStatus,
|
|
23
29
|
GoodPartyClient: () => GoodPartyClient,
|
|
30
|
+
OnboardingStep: () => OnboardingStep,
|
|
24
31
|
SdkError: () => SdkError,
|
|
25
32
|
UserRole: () => UserRole,
|
|
26
33
|
WhyBrowsing: () => WhyBrowsing
|
|
@@ -82,6 +89,12 @@ var BaseResource = class {
|
|
|
82
89
|
deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
|
|
83
90
|
};
|
|
84
91
|
|
|
92
|
+
// src/resources/CampaignsResource.ts
|
|
93
|
+
var CampaignsResource = class extends BaseResource {
|
|
94
|
+
list = (options) => this.getRequest("/campaigns/list", options);
|
|
95
|
+
update = (id, input) => this.putRequest(`/campaigns/${id}`, input);
|
|
96
|
+
};
|
|
97
|
+
|
|
85
98
|
// src/resources/UsersResource.ts
|
|
86
99
|
var UsersResource = class extends BaseResource {
|
|
87
100
|
list = (options) => this.getRequest("/users", options);
|
|
@@ -181,11 +194,13 @@ var ClerkService = class {
|
|
|
181
194
|
// src/GoodPartyClient.ts
|
|
182
195
|
var GoodPartyClient = class _GoodPartyClient {
|
|
183
196
|
users;
|
|
197
|
+
campaigns;
|
|
184
198
|
clerkService;
|
|
185
199
|
constructor(clerkService, gpApiRootUrl) {
|
|
186
200
|
this.clerkService = clerkService;
|
|
187
201
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
188
202
|
this.users = new UsersResource(httpClient);
|
|
203
|
+
this.campaigns = new CampaignsResource(httpClient);
|
|
189
204
|
}
|
|
190
205
|
static create = async (config) => {
|
|
191
206
|
const { m2mSecret, gpApiRootUrl } = config;
|
|
@@ -214,9 +229,59 @@ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
|
|
|
214
229
|
WhyBrowsing2["else"] = "else";
|
|
215
230
|
return WhyBrowsing2;
|
|
216
231
|
})(WhyBrowsing || {});
|
|
232
|
+
|
|
233
|
+
// src/types/campaign.ts
|
|
234
|
+
var CampaignTier = /* @__PURE__ */ ((CampaignTier2) => {
|
|
235
|
+
CampaignTier2["WIN"] = "WIN";
|
|
236
|
+
CampaignTier2["LOSE"] = "LOSE";
|
|
237
|
+
CampaignTier2["TOSSUP"] = "TOSSUP";
|
|
238
|
+
return CampaignTier2;
|
|
239
|
+
})(CampaignTier || {});
|
|
240
|
+
var BallotReadyPositionLevel = /* @__PURE__ */ ((BallotReadyPositionLevel2) => {
|
|
241
|
+
BallotReadyPositionLevel2["CITY"] = "CITY";
|
|
242
|
+
BallotReadyPositionLevel2["COUNTY"] = "COUNTY";
|
|
243
|
+
BallotReadyPositionLevel2["FEDERAL"] = "FEDERAL";
|
|
244
|
+
BallotReadyPositionLevel2["LOCAL"] = "LOCAL";
|
|
245
|
+
BallotReadyPositionLevel2["REGIONAL"] = "REGIONAL";
|
|
246
|
+
BallotReadyPositionLevel2["STATE"] = "STATE";
|
|
247
|
+
BallotReadyPositionLevel2["TOWNSHIP"] = "TOWNSHIP";
|
|
248
|
+
return BallotReadyPositionLevel2;
|
|
249
|
+
})(BallotReadyPositionLevel || {});
|
|
250
|
+
var ElectionLevel = /* @__PURE__ */ ((ElectionLevel2) => {
|
|
251
|
+
ElectionLevel2["state"] = "state";
|
|
252
|
+
ElectionLevel2["county"] = "county";
|
|
253
|
+
ElectionLevel2["federal"] = "federal";
|
|
254
|
+
ElectionLevel2["city"] = "city";
|
|
255
|
+
return ElectionLevel2;
|
|
256
|
+
})(ElectionLevel || {});
|
|
257
|
+
var CampaignCreatedBy = /* @__PURE__ */ ((CampaignCreatedBy2) => {
|
|
258
|
+
CampaignCreatedBy2["ADMIN"] = "admin";
|
|
259
|
+
return CampaignCreatedBy2;
|
|
260
|
+
})(CampaignCreatedBy || {});
|
|
261
|
+
var CampaignLaunchStatus = /* @__PURE__ */ ((CampaignLaunchStatus2) => {
|
|
262
|
+
CampaignLaunchStatus2["launched"] = "launched";
|
|
263
|
+
return CampaignLaunchStatus2;
|
|
264
|
+
})(CampaignLaunchStatus || {});
|
|
265
|
+
var OnboardingStep = /* @__PURE__ */ ((OnboardingStep2) => {
|
|
266
|
+
OnboardingStep2["complete"] = "onboarding-complete";
|
|
267
|
+
OnboardingStep2["registration"] = "registration";
|
|
268
|
+
return OnboardingStep2;
|
|
269
|
+
})(OnboardingStep || {});
|
|
270
|
+
var GenerationStatus = /* @__PURE__ */ ((GenerationStatus2) => {
|
|
271
|
+
GenerationStatus2["processing"] = "processing";
|
|
272
|
+
GenerationStatus2["completed"] = "completed";
|
|
273
|
+
return GenerationStatus2;
|
|
274
|
+
})(GenerationStatus || {});
|
|
217
275
|
// Annotate the CommonJS export names for ESM import in node:
|
|
218
276
|
0 && (module.exports = {
|
|
277
|
+
BallotReadyPositionLevel,
|
|
278
|
+
CampaignCreatedBy,
|
|
279
|
+
CampaignLaunchStatus,
|
|
280
|
+
CampaignTier,
|
|
281
|
+
ElectionLevel,
|
|
282
|
+
GenerationStatus,
|
|
219
283
|
GoodPartyClient,
|
|
284
|
+
OnboardingStep,
|
|
220
285
|
SdkError,
|
|
221
286
|
UserRole,
|
|
222
287
|
WhyBrowsing
|
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/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/types/user.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\nexport type {\n PaginationOptions,\n PaginationMeta,\n PaginatedList,\n} from './types/result'\n\nexport type {\n User,\n UserMetaData,\n ListUsersOptions,\n UpdatePasswordInput,\n} from './types/user'\n\nexport { UserRole, WhyBrowsing } from './types/user'\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\nexport type PaginationOptions = {\n offset?: number\n limit?: number\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n}\n\nexport type PaginationMeta = {\n total: number\n offset: number\n limit: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n meta: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\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 { PaginatedList } from '../types/result'\nimport type {\n ListUsersOptions,\n UpdatePasswordInput,\n UpdateUserInput,\n User,\n} from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = (options?: ListUsersOptions): Promise<PaginatedList<User>> =>\n this.getRequest<PaginatedList<User>>('/users', options)\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<User> =>\n this.putRequest<User>(`/users/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${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 { 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 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 }\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 type { PaginationOptions } from './result'\n\nexport enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport enum SIGN_UP_MODE {\n CANDIDATE = 'candidate',\n FACILITATED = 'facilitated',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type ListUsersOptions = PaginationOptions & {\n firstName?: string\n lastName?: string\n email?: string\n}\n\nexport type UpdateUserInput = {\n firstName?: string\n lastName?: string\n email?: string\n name?: string\n zip?: string\n phone?: string\n roles?: UserRole[]\n signUpMode?: SIGN_UP_MODE\n allowTexts?: boolean\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;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,EAEV,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;;;AClBO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC9C,OAAO,CAAC,YACN,KAAK,WAAgC,UAAU,OAAO;AAAA,EAExD,MAAM,CAAC,OAA8B,KAAK,WAAiB,UAAU,EAAE,EAAE;AAAA,EAEzE,SAAS,CAAC,IAAY,UACpB,KAAK,WAAiB,UAAU,EAAE,IAAI,KAAK;AAAA,EAE7C,SAAS,CAAC,OACR,KAAK,cAAoB,UAAU,EAAE,EAAE;AAAA,EAEzC,iBAAiB,CAAC,IAAY,UAC5B,KAAK,WAAiB,UAAU,EAAE,aAAa,KAAK;AACxD;;;ACvBA,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;;;AChGO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB;AAAA,EACD;AAAA,EAEA,YAAY,cAA4B,cAAsB;AACpE,SAAK,eAAe;AACpB,UAAM,aAAa,IAAI,WAAW,cAAc,aAAa,QAAQ;AACrE,SAAK,QAAQ,IAAI,cAAc,UAAU;AAAA,EAC3C;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;;;AC7BO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,UAAO;AALG,SAAAA;AAAA,GAAA;AAQL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,iBAAc;AACd,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,UAAO;AAJG,SAAAA;AAAA,GAAA;","names":["UserRole","WhyBrowsing"]}
|
|
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/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/types/user.ts","../src/types/campaign.ts"],"sourcesContent":["export { GoodPartyClient } from './GoodPartyClient'\nexport type { GoodPartyClientConfig } from './GoodPartyClient'\n\nexport { SdkError } from './types/result'\nexport type {\n PaginationOptions,\n PaginationMeta,\n PaginatedList,\n} from './types/result'\n\nexport type {\n User,\n UserMetaData,\n ListUsersOptions,\n UpdateUserInput,\n UpdatePasswordInput,\n} from './types/user'\n\nexport { UserRole, WhyBrowsing } from './types/user'\n\nexport type {\n Campaign,\n CampaignDetails,\n CampaignData,\n CampaignAiContent,\n VoterGoals,\n CustomVoterFile,\n AiChatMessage,\n AiContentInputValues,\n AiContentGenerationStatus,\n AiContentData,\n ListCampaignsOptions,\n UpdateCampaignInput,\n} from './types/campaign'\n\nexport {\n CampaignTier,\n BallotReadyPositionLevel,\n ElectionLevel,\n CampaignCreatedBy,\n CampaignLaunchStatus,\n OnboardingStep,\n GenerationStatus,\n} from './types/campaign'\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\nexport type PaginationOptions = {\n offset?: number\n limit?: number\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n}\n\nexport type PaginationMeta = {\n total: number\n offset: number\n limit: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n meta: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\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 { PaginatedList } from '../types/result'\nimport type {\n Campaign,\n ListCampaignsOptions,\n UpdateCampaignInput,\n} from '../types/campaign'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n list = (options?: ListCampaignsOptions): Promise<PaginatedList<Campaign>> =>\n this.getRequest<PaginatedList<Campaign>>('/campaigns/list', options)\n\n update = (id: number, input: UpdateCampaignInput): Promise<Campaign> =>\n this.putRequest<Campaign>(`/campaigns/${id}`, input)\n}\n","import type { PaginatedList } from '../types/result'\nimport type {\n ListUsersOptions,\n UpdatePasswordInput,\n UpdateUserInput,\n User,\n} from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = (options?: ListUsersOptions): Promise<PaginatedList<User>> =>\n this.getRequest<PaginatedList<User>>('/users', options)\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<User> =>\n this.putRequest<User>(`/users/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${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 { 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 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 }\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 type { PaginationOptions } from './result'\n\nexport enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport enum SIGN_UP_MODE {\n CANDIDATE = 'candidate',\n FACILITATED = 'facilitated',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type ListUsersOptions = PaginationOptions & {\n firstName?: string\n lastName?: string\n email?: string\n}\n\nexport type UpdateUserInput = {\n firstName?: string\n lastName?: string\n email?: string\n name?: string\n zip?: string\n phone?: string\n roles?: UserRole[]\n signUpMode?: SIGN_UP_MODE\n allowTexts?: boolean\n metaData?: UserMetaData\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n","import type { PaginationOptions } from './result'\n\nexport enum CampaignTier {\n WIN = 'WIN',\n LOSE = 'LOSE',\n TOSSUP = 'TOSSUP',\n}\n\nexport enum BallotReadyPositionLevel {\n CITY = 'CITY',\n COUNTY = 'COUNTY',\n FEDERAL = 'FEDERAL',\n LOCAL = 'LOCAL',\n REGIONAL = 'REGIONAL',\n STATE = 'STATE',\n TOWNSHIP = 'TOWNSHIP',\n}\n\nexport enum ElectionLevel {\n state = 'state',\n county = 'county',\n federal = 'federal',\n city = 'city',\n}\n\nexport enum CampaignCreatedBy {\n ADMIN = 'admin',\n}\n\nexport enum CampaignLaunchStatus {\n launched = 'launched',\n}\n\nexport enum OnboardingStep {\n complete = 'onboarding-complete',\n registration = 'registration',\n}\n\nexport enum GenerationStatus {\n processing = 'processing',\n completed = 'completed',\n}\n\nexport type VoterGoals = {\n doorKnocking?: number\n calls?: number\n digital?: number\n directMail?: number\n digitalAds?: number\n text?: number\n events?: number\n yardSigns?: number\n robocall?: number\n phoneBanking?: number\n socialMedia?: number\n}\n\nexport type CustomVoterFile = {\n name: string\n channel?: string\n purpose?: string\n filters: string[]\n createdAt: string\n}\n\nexport type AiChatMessage = {\n role: 'user' | 'system' | 'assistant'\n content: string\n createdAt?: number\n id?: string\n usage?: number\n}\n\nexport type AiContentInputValues = Record<\n string,\n string | boolean | number | undefined\n>\n\nexport type AiContentGenerationStatus = {\n status: GenerationStatus\n createdAt: number\n prompt?: string\n existingChat?: AiChatMessage[]\n inputValues?: AiContentInputValues\n}\n\nexport type AiContentData = {\n name: string\n content: string\n updatedAt: number\n inputValues?: AiContentInputValues\n}\n\nexport type CampaignDetails = {\n state?: string\n ballotLevel?: BallotReadyPositionLevel\n electionDate?: string\n primaryElectionDate?: string\n zip?: string | null\n knowRun?: 'yes' | null\n runForOffice?: 'yes' | 'no' | null\n pledged?: boolean\n isProUpdatedAt?: number\n customIssues?: Record<'title' | 'position', string>[]\n runningAgainst?: Record<'name' | 'party' | 'description', string>[]\n geoLocation?: {\n geoHash?: string\n lng?: number\n lat?: number\n }\n geoLocationFailed?: boolean\n city?: string | null\n county?: string | null\n normalizedOffice?: string | null\n otherOffice?: string\n office?: string\n party?: string\n otherParty?: string\n district?: string\n raceId?: string\n level?: ElectionLevel | null\n noNormalizedOffice?: boolean\n website?: string\n pastExperience?: string | Record<string, string>\n occupation?: string\n funFact?: string\n campaignCommittee?: string\n statementName?: string\n subscriptionId?: string | null\n endOfElectionSubscriptionCanceled?: boolean\n subscriptionCanceledAt?: number | null\n subscriptionCancelAt?: number | null\n filingPeriodsStart?: string | null\n filingPeriodsEnd?: string | null\n officeTermLength?: string\n partisanType?: string\n priorElectionDates?: string[]\n positionId?: string | null\n electionId?: string | null\n tier?: string\n einNumber?: string | null\n wonGeneral?: boolean\n} | null\n\nexport type CampaignData = {\n createdBy?: CampaignCreatedBy\n slug?: string\n hubSpotUpdates?: Partial<Record<string, string>>\n currentStep?: OnboardingStep\n launchStatus?: CampaignLaunchStatus\n lastVisited?: number\n claimProfile?: string\n customVoterFiles?: CustomVoterFile[]\n reportedVoterGoals?: VoterGoals\n textCampaignCount?: number\n lastStepDate?: string\n adminUserEmail?: string\n hubspotId?: string\n name?: string\n} | null\n\nexport type CampaignAiContent = {\n generationStatus?: Record<string, AiContentGenerationStatus>\n campaignPlanAttempts?: Record<string, number>\n} & Record<string, AiContentData>\n\nexport type Campaign = {\n id: number\n createdAt: string\n updatedAt: string\n slug: string\n isActive: boolean\n isVerified?: boolean | null\n isPro?: boolean | null\n isDemo: boolean\n didWin?: boolean | null\n dateVerified?: string | null\n tier?: CampaignTier | null\n formattedAddress?: string | null\n placeId?: string | null\n data: CampaignData\n details: CampaignDetails\n aiContent: CampaignAiContent\n userId: number\n canDownloadFederal: boolean\n completedTaskIds: string[]\n hasFreeTextsOffer: boolean\n freeTextsOfferRedeemedAt?: string | null\n}\n\nexport type ListCampaignsOptions = PaginationOptions & {\n userId?: number\n slug?: string\n}\n\nexport type UpdateCampaignInput = {\n slug?: string\n isActive?: boolean\n isVerified?: boolean | null\n isPro?: boolean | null\n isDemo?: boolean\n didWin?: boolean | null\n dateVerified?: string | null\n tier?: CampaignTier | null\n formattedAddress?: string | null\n placeId?: string | null\n data?: CampaignData\n details?: CampaignDetails\n aiContent?: CampaignAiContent\n canDownloadFederal?: boolean\n completedTaskIds?: string[]\n hasFreeTextsOffer?: boolean\n freeTextsOfferRedeemedAt?: string | null\n}\n"],"mappings":"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","names":["UserRole","WhyBrowsing","CampaignTier","BallotReadyPositionLevel","ElectionLevel","CampaignCreatedBy","CampaignLaunchStatus","OnboardingStep","GenerationStatus"]}
|
package/dist/index.mjs
CHANGED
|
@@ -53,6 +53,12 @@ var BaseResource = class {
|
|
|
53
53
|
deleteRequest = (path) => this.httpClient.request(path, { method: "DELETE" });
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
+
// src/resources/CampaignsResource.ts
|
|
57
|
+
var CampaignsResource = class extends BaseResource {
|
|
58
|
+
list = (options) => this.getRequest("/campaigns/list", options);
|
|
59
|
+
update = (id, input) => this.putRequest(`/campaigns/${id}`, input);
|
|
60
|
+
};
|
|
61
|
+
|
|
56
62
|
// src/resources/UsersResource.ts
|
|
57
63
|
var UsersResource = class extends BaseResource {
|
|
58
64
|
list = (options) => this.getRequest("/users", options);
|
|
@@ -152,11 +158,13 @@ var ClerkService = class {
|
|
|
152
158
|
// src/GoodPartyClient.ts
|
|
153
159
|
var GoodPartyClient = class _GoodPartyClient {
|
|
154
160
|
users;
|
|
161
|
+
campaigns;
|
|
155
162
|
clerkService;
|
|
156
163
|
constructor(clerkService, gpApiRootUrl) {
|
|
157
164
|
this.clerkService = clerkService;
|
|
158
165
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
159
166
|
this.users = new UsersResource(httpClient);
|
|
167
|
+
this.campaigns = new CampaignsResource(httpClient);
|
|
160
168
|
}
|
|
161
169
|
static create = async (config) => {
|
|
162
170
|
const { m2mSecret, gpApiRootUrl } = config;
|
|
@@ -185,8 +193,58 @@ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
|
|
|
185
193
|
WhyBrowsing2["else"] = "else";
|
|
186
194
|
return WhyBrowsing2;
|
|
187
195
|
})(WhyBrowsing || {});
|
|
196
|
+
|
|
197
|
+
// src/types/campaign.ts
|
|
198
|
+
var CampaignTier = /* @__PURE__ */ ((CampaignTier2) => {
|
|
199
|
+
CampaignTier2["WIN"] = "WIN";
|
|
200
|
+
CampaignTier2["LOSE"] = "LOSE";
|
|
201
|
+
CampaignTier2["TOSSUP"] = "TOSSUP";
|
|
202
|
+
return CampaignTier2;
|
|
203
|
+
})(CampaignTier || {});
|
|
204
|
+
var BallotReadyPositionLevel = /* @__PURE__ */ ((BallotReadyPositionLevel2) => {
|
|
205
|
+
BallotReadyPositionLevel2["CITY"] = "CITY";
|
|
206
|
+
BallotReadyPositionLevel2["COUNTY"] = "COUNTY";
|
|
207
|
+
BallotReadyPositionLevel2["FEDERAL"] = "FEDERAL";
|
|
208
|
+
BallotReadyPositionLevel2["LOCAL"] = "LOCAL";
|
|
209
|
+
BallotReadyPositionLevel2["REGIONAL"] = "REGIONAL";
|
|
210
|
+
BallotReadyPositionLevel2["STATE"] = "STATE";
|
|
211
|
+
BallotReadyPositionLevel2["TOWNSHIP"] = "TOWNSHIP";
|
|
212
|
+
return BallotReadyPositionLevel2;
|
|
213
|
+
})(BallotReadyPositionLevel || {});
|
|
214
|
+
var ElectionLevel = /* @__PURE__ */ ((ElectionLevel2) => {
|
|
215
|
+
ElectionLevel2["state"] = "state";
|
|
216
|
+
ElectionLevel2["county"] = "county";
|
|
217
|
+
ElectionLevel2["federal"] = "federal";
|
|
218
|
+
ElectionLevel2["city"] = "city";
|
|
219
|
+
return ElectionLevel2;
|
|
220
|
+
})(ElectionLevel || {});
|
|
221
|
+
var CampaignCreatedBy = /* @__PURE__ */ ((CampaignCreatedBy2) => {
|
|
222
|
+
CampaignCreatedBy2["ADMIN"] = "admin";
|
|
223
|
+
return CampaignCreatedBy2;
|
|
224
|
+
})(CampaignCreatedBy || {});
|
|
225
|
+
var CampaignLaunchStatus = /* @__PURE__ */ ((CampaignLaunchStatus2) => {
|
|
226
|
+
CampaignLaunchStatus2["launched"] = "launched";
|
|
227
|
+
return CampaignLaunchStatus2;
|
|
228
|
+
})(CampaignLaunchStatus || {});
|
|
229
|
+
var OnboardingStep = /* @__PURE__ */ ((OnboardingStep2) => {
|
|
230
|
+
OnboardingStep2["complete"] = "onboarding-complete";
|
|
231
|
+
OnboardingStep2["registration"] = "registration";
|
|
232
|
+
return OnboardingStep2;
|
|
233
|
+
})(OnboardingStep || {});
|
|
234
|
+
var GenerationStatus = /* @__PURE__ */ ((GenerationStatus2) => {
|
|
235
|
+
GenerationStatus2["processing"] = "processing";
|
|
236
|
+
GenerationStatus2["completed"] = "completed";
|
|
237
|
+
return GenerationStatus2;
|
|
238
|
+
})(GenerationStatus || {});
|
|
188
239
|
export {
|
|
240
|
+
BallotReadyPositionLevel,
|
|
241
|
+
CampaignCreatedBy,
|
|
242
|
+
CampaignLaunchStatus,
|
|
243
|
+
CampaignTier,
|
|
244
|
+
ElectionLevel,
|
|
245
|
+
GenerationStatus,
|
|
189
246
|
GoodPartyClient,
|
|
247
|
+
OnboardingStep,
|
|
190
248
|
SdkError,
|
|
191
249
|
UserRole,
|
|
192
250
|
WhyBrowsing
|
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/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/types/user.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\nexport type PaginationOptions = {\n offset?: number\n limit?: number\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n}\n\nexport type PaginationMeta = {\n total: number\n offset: number\n limit: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n meta: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\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 { PaginatedList } from '../types/result'\nimport type {\n ListUsersOptions,\n UpdatePasswordInput,\n UpdateUserInput,\n User,\n} from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = (options?: ListUsersOptions): Promise<PaginatedList<User>> =>\n this.getRequest<PaginatedList<User>>('/users', options)\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<User> =>\n this.putRequest<User>(`/users/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${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 { 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 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 }\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 type { PaginationOptions } from './result'\n\nexport enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport enum SIGN_UP_MODE {\n CANDIDATE = 'candidate',\n FACILITATED = 'facilitated',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type ListUsersOptions = PaginationOptions & {\n firstName?: string\n lastName?: string\n email?: string\n}\n\nexport type UpdateUserInput = {\n firstName?: string\n lastName?: string\n email?: string\n name?: string\n zip?: string\n phone?: string\n roles?: UserRole[]\n signUpMode?: SIGN_UP_MODE\n allowTexts?: boolean\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":";AAAA,SAAS,QAAQ,kBAAgC;;;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,MAAM,OAAU,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,YAAY;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,EAEV,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;;;AClBO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC9C,OAAO,CAAC,YACN,KAAK,WAAgC,UAAU,OAAO;AAAA,EAExD,MAAM,CAAC,OAA8B,KAAK,WAAiB,UAAU,EAAE,EAAE;AAAA,EAEzE,SAAS,CAAC,IAAY,UACpB,KAAK,WAAiB,UAAU,EAAE,IAAI,KAAK;AAAA,EAE7C,SAAS,CAAC,OACR,KAAK,cAAoB,UAAU,EAAE,EAAE;AAAA,EAEzC,iBAAiB,CAAC,IAAY,UAC5B,KAAK,WAAiB,UAAU,EAAE,aAAa,KAAK;AACxD;;;ACvBA,SAAS,yBAAyB;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,cAAc,kBAAkB,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;;;AChGO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB;AAAA,EACD;AAAA,EAEA,YAAY,cAA4B,cAAsB;AACpE,SAAK,eAAe;AACpB,UAAM,aAAa,IAAI,WAAW,cAAc,aAAa,QAAQ;AACrE,SAAK,QAAQ,IAAI,cAAc,UAAU;AAAA,EAC3C;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;;;AC7BO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,UAAO;AALG,SAAAA;AAAA,GAAA;AAQL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,iBAAc;AACd,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,UAAO;AAJG,SAAAA;AAAA,GAAA;","names":["UserRole","WhyBrowsing"]}
|
|
1
|
+
{"version":3,"sources":["../src/http/HttpClient.ts","../src/types/result.ts","../src/resources/BaseResource.ts","../src/resources/CampaignsResource.ts","../src/resources/UsersResource.ts","../src/vendor/clerk/clerk.service.ts","../src/GoodPartyClient.ts","../src/types/user.ts","../src/types/campaign.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\nexport type PaginationOptions = {\n offset?: number\n limit?: number\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n}\n\nexport type PaginationMeta = {\n total: number\n offset: number\n limit: number\n}\n\nexport type PaginatedList<T> = {\n data: T[]\n meta: PaginationMeta\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { HttpClient, OfetchRequestBody } from '../http/HttpClient'\n\nexport abstract class BaseResource {\n protected httpClient: HttpClient\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 { PaginatedList } from '../types/result'\nimport type {\n Campaign,\n ListCampaignsOptions,\n UpdateCampaignInput,\n} from '../types/campaign'\nimport { BaseResource } from './BaseResource'\n\nexport class CampaignsResource extends BaseResource {\n list = (options?: ListCampaignsOptions): Promise<PaginatedList<Campaign>> =>\n this.getRequest<PaginatedList<Campaign>>('/campaigns/list', options)\n\n update = (id: number, input: UpdateCampaignInput): Promise<Campaign> =>\n this.putRequest<Campaign>(`/campaigns/${id}`, input)\n}\n","import type { PaginatedList } from '../types/result'\nimport type {\n ListUsersOptions,\n UpdatePasswordInput,\n UpdateUserInput,\n User,\n} from '../types/user'\nimport { BaseResource } from './BaseResource'\n\nexport class UsersResource extends BaseResource {\n list = (options?: ListUsersOptions): Promise<PaginatedList<User>> =>\n this.getRequest<PaginatedList<User>>('/users', options)\n\n get = (id: number): Promise<User> => this.getRequest<User>(`/users/${id}`)\n\n update = (id: number, input: UpdateUserInput): Promise<User> =>\n this.putRequest<User>(`/users/${id}`, input)\n\n delete = (id: number): Promise<void> =>\n this.deleteRequest<void>(`/users/${id}`)\n\n updatePassword = (id: number, input: UpdatePasswordInput): Promise<void> =>\n this.putRequest<void>(`/users/${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 { 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 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 }\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 type { PaginationOptions } from './result'\n\nexport enum UserRole {\n admin = 'admin',\n sales = 'sales',\n candidate = 'candidate',\n campaignManager = 'campaignManager',\n demo = 'demo',\n}\n\nexport enum WhyBrowsing {\n considering = 'considering',\n learning = 'learning',\n test = 'test',\n else = 'else',\n}\n\nexport enum SIGN_UP_MODE {\n CANDIDATE = 'candidate',\n FACILITATED = 'facilitated',\n}\n\nexport type UserMetaData = {\n customerId?: string\n checkoutSessionId?: string | null\n accountType?: string | null\n lastVisited?: number\n sessionCount?: number\n isDeleted?: boolean\n fsUserId?: string\n whyBrowsing?: WhyBrowsing | null\n hubspotId?: string\n profile_updated_count?: number\n textNotifications?: boolean\n} | null\n\nexport type User = {\n id: number\n firstName: string\n lastName: string\n name?: string | null\n email: string\n phone?: string | null\n zip?: string | null\n avatar?: string | null\n hasPassword: boolean\n roles?: UserRole[]\n metaData?: UserMetaData\n}\n\nexport type ListUsersOptions = PaginationOptions & {\n firstName?: string\n lastName?: string\n email?: string\n}\n\nexport type UpdateUserInput = {\n firstName?: string\n lastName?: string\n email?: string\n name?: string\n zip?: string\n phone?: string\n roles?: UserRole[]\n signUpMode?: SIGN_UP_MODE\n allowTexts?: boolean\n metaData?: UserMetaData\n}\n\nexport type UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n","import type { PaginationOptions } from './result'\n\nexport enum CampaignTier {\n WIN = 'WIN',\n LOSE = 'LOSE',\n TOSSUP = 'TOSSUP',\n}\n\nexport enum BallotReadyPositionLevel {\n CITY = 'CITY',\n COUNTY = 'COUNTY',\n FEDERAL = 'FEDERAL',\n LOCAL = 'LOCAL',\n REGIONAL = 'REGIONAL',\n STATE = 'STATE',\n TOWNSHIP = 'TOWNSHIP',\n}\n\nexport enum ElectionLevel {\n state = 'state',\n county = 'county',\n federal = 'federal',\n city = 'city',\n}\n\nexport enum CampaignCreatedBy {\n ADMIN = 'admin',\n}\n\nexport enum CampaignLaunchStatus {\n launched = 'launched',\n}\n\nexport enum OnboardingStep {\n complete = 'onboarding-complete',\n registration = 'registration',\n}\n\nexport enum GenerationStatus {\n processing = 'processing',\n completed = 'completed',\n}\n\nexport type VoterGoals = {\n doorKnocking?: number\n calls?: number\n digital?: number\n directMail?: number\n digitalAds?: number\n text?: number\n events?: number\n yardSigns?: number\n robocall?: number\n phoneBanking?: number\n socialMedia?: number\n}\n\nexport type CustomVoterFile = {\n name: string\n channel?: string\n purpose?: string\n filters: string[]\n createdAt: string\n}\n\nexport type AiChatMessage = {\n role: 'user' | 'system' | 'assistant'\n content: string\n createdAt?: number\n id?: string\n usage?: number\n}\n\nexport type AiContentInputValues = Record<\n string,\n string | boolean | number | undefined\n>\n\nexport type AiContentGenerationStatus = {\n status: GenerationStatus\n createdAt: number\n prompt?: string\n existingChat?: AiChatMessage[]\n inputValues?: AiContentInputValues\n}\n\nexport type AiContentData = {\n name: string\n content: string\n updatedAt: number\n inputValues?: AiContentInputValues\n}\n\nexport type CampaignDetails = {\n state?: string\n ballotLevel?: BallotReadyPositionLevel\n electionDate?: string\n primaryElectionDate?: string\n zip?: string | null\n knowRun?: 'yes' | null\n runForOffice?: 'yes' | 'no' | null\n pledged?: boolean\n isProUpdatedAt?: number\n customIssues?: Record<'title' | 'position', string>[]\n runningAgainst?: Record<'name' | 'party' | 'description', string>[]\n geoLocation?: {\n geoHash?: string\n lng?: number\n lat?: number\n }\n geoLocationFailed?: boolean\n city?: string | null\n county?: string | null\n normalizedOffice?: string | null\n otherOffice?: string\n office?: string\n party?: string\n otherParty?: string\n district?: string\n raceId?: string\n level?: ElectionLevel | null\n noNormalizedOffice?: boolean\n website?: string\n pastExperience?: string | Record<string, string>\n occupation?: string\n funFact?: string\n campaignCommittee?: string\n statementName?: string\n subscriptionId?: string | null\n endOfElectionSubscriptionCanceled?: boolean\n subscriptionCanceledAt?: number | null\n subscriptionCancelAt?: number | null\n filingPeriodsStart?: string | null\n filingPeriodsEnd?: string | null\n officeTermLength?: string\n partisanType?: string\n priorElectionDates?: string[]\n positionId?: string | null\n electionId?: string | null\n tier?: string\n einNumber?: string | null\n wonGeneral?: boolean\n} | null\n\nexport type CampaignData = {\n createdBy?: CampaignCreatedBy\n slug?: string\n hubSpotUpdates?: Partial<Record<string, string>>\n currentStep?: OnboardingStep\n launchStatus?: CampaignLaunchStatus\n lastVisited?: number\n claimProfile?: string\n customVoterFiles?: CustomVoterFile[]\n reportedVoterGoals?: VoterGoals\n textCampaignCount?: number\n lastStepDate?: string\n adminUserEmail?: string\n hubspotId?: string\n name?: string\n} | null\n\nexport type CampaignAiContent = {\n generationStatus?: Record<string, AiContentGenerationStatus>\n campaignPlanAttempts?: Record<string, number>\n} & Record<string, AiContentData>\n\nexport type Campaign = {\n id: number\n createdAt: string\n updatedAt: string\n slug: string\n isActive: boolean\n isVerified?: boolean | null\n isPro?: boolean | null\n isDemo: boolean\n didWin?: boolean | null\n dateVerified?: string | null\n tier?: CampaignTier | null\n formattedAddress?: string | null\n placeId?: string | null\n data: CampaignData\n details: CampaignDetails\n aiContent: CampaignAiContent\n userId: number\n canDownloadFederal: boolean\n completedTaskIds: string[]\n hasFreeTextsOffer: boolean\n freeTextsOfferRedeemedAt?: string | null\n}\n\nexport type ListCampaignsOptions = PaginationOptions & {\n userId?: number\n slug?: string\n}\n\nexport type UpdateCampaignInput = {\n slug?: string\n isActive?: boolean\n isVerified?: boolean | null\n isPro?: boolean | null\n isDemo?: boolean\n didWin?: boolean | null\n dateVerified?: string | null\n tier?: CampaignTier | null\n formattedAddress?: string | null\n placeId?: string | null\n data?: CampaignData\n details?: CampaignDetails\n aiContent?: CampaignAiContent\n canDownloadFederal?: boolean\n completedTaskIds?: string[]\n hasFreeTextsOffer?: boolean\n freeTextsOfferRedeemedAt?: string | null\n}\n"],"mappings":"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","names":["UserRole","WhyBrowsing","CampaignTier","BallotReadyPositionLevel","ElectionLevel","CampaignCreatedBy","CampaignLaunchStatus","OnboardingStep","GenerationStatus"]}
|