@goodparty_org/sdk 1.1.0 → 1.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 +28 -9
- package/dist/index.d.mts +232 -18
- package/dist/index.d.ts +232 -18
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -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 })
|
|
@@ -28,6 +29,11 @@ const filtered = await client.users.list({
|
|
|
28
29
|
sortOrder: 'desc',
|
|
29
30
|
})
|
|
30
31
|
|
|
32
|
+
const updatedUser = await client.users.update(1, {
|
|
33
|
+
firstName: 'Jane',
|
|
34
|
+
roles: ['candidate'],
|
|
35
|
+
})
|
|
36
|
+
|
|
31
37
|
await client.users.updatePassword(1, {
|
|
32
38
|
oldPassword: 'old',
|
|
33
39
|
newPassword: 'new',
|
|
@@ -35,6 +41,19 @@ await client.users.updatePassword(1, {
|
|
|
35
41
|
|
|
36
42
|
await client.users.delete(1)
|
|
37
43
|
|
|
44
|
+
const campaigns = await client.campaigns.list({ offset: 0, limit: 20 })
|
|
45
|
+
|
|
46
|
+
const byUser = await client.campaigns.list({
|
|
47
|
+
userId: 42,
|
|
48
|
+
sortBy: 'createdAt',
|
|
49
|
+
sortOrder: 'desc',
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const updatedCampaign = await client.campaigns.update(1, {
|
|
53
|
+
isActive: true,
|
|
54
|
+
details: { office: 'Mayor' },
|
|
55
|
+
})
|
|
56
|
+
|
|
38
57
|
client.destroy()
|
|
39
58
|
```
|
|
40
59
|
|
|
@@ -66,15 +85,15 @@ npm install
|
|
|
66
85
|
|
|
67
86
|
### Scripts
|
|
68
87
|
|
|
69
|
-
| Command
|
|
70
|
-
|
|
|
71
|
-
| `npm run dev`
|
|
72
|
-
| `npm run build`
|
|
73
|
-
| `npm run typecheck`
|
|
74
|
-
| `npm run lint`
|
|
75
|
-
| `npm run lint:fix`
|
|
76
|
-
| `npm run format`
|
|
77
|
-
| `npm run format:check` | Check code formatting
|
|
88
|
+
| Command | Description |
|
|
89
|
+
| ---------------------- | --------------------------------- |
|
|
90
|
+
| `npm run dev` | Build in watch mode for local dev |
|
|
91
|
+
| `npm run build` | Build the SDK with tsup |
|
|
92
|
+
| `npm run typecheck` | Run TypeScript type checking |
|
|
93
|
+
| `npm run lint` | Run ESLint |
|
|
94
|
+
| `npm run lint:fix` | Run ESLint with auto-fix |
|
|
95
|
+
| `npm run format` | Format code with Prettier |
|
|
96
|
+
| `npm run format:check` | Check code formatting |
|
|
78
97
|
|
|
79
98
|
### Publishing
|
|
80
99
|
|
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",
|
|
@@ -34,6 +248,10 @@ declare enum WhyBrowsing {
|
|
|
34
248
|
test = "test",
|
|
35
249
|
else = "else"
|
|
36
250
|
}
|
|
251
|
+
declare enum SIGN_UP_MODE {
|
|
252
|
+
CANDIDATE = "candidate",
|
|
253
|
+
FACILITATED = "facilitated"
|
|
254
|
+
}
|
|
37
255
|
type UserMetaData = {
|
|
38
256
|
customerId?: string;
|
|
39
257
|
checkoutSessionId?: string | null;
|
|
@@ -65,31 +283,26 @@ type ListUsersOptions = PaginationOptions & {
|
|
|
65
283
|
lastName?: string;
|
|
66
284
|
email?: string;
|
|
67
285
|
};
|
|
286
|
+
type UpdateUserInput = {
|
|
287
|
+
firstName?: string;
|
|
288
|
+
lastName?: string;
|
|
289
|
+
email?: string;
|
|
290
|
+
name?: string;
|
|
291
|
+
zip?: string;
|
|
292
|
+
phone?: string;
|
|
293
|
+
roles?: UserRole[];
|
|
294
|
+
signUpMode?: SIGN_UP_MODE;
|
|
295
|
+
allowTexts?: boolean;
|
|
296
|
+
};
|
|
68
297
|
type UpdatePasswordInput = {
|
|
69
298
|
oldPassword?: string;
|
|
70
299
|
newPassword: string;
|
|
71
300
|
};
|
|
72
301
|
|
|
73
|
-
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
74
|
-
declare class HttpClient {
|
|
75
|
-
private baseUrl;
|
|
76
|
-
private getToken;
|
|
77
|
-
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
78
|
-
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
declare abstract class BaseResource {
|
|
82
|
-
protected httpClient: HttpClient;
|
|
83
|
-
constructor(httpClient: HttpClient);
|
|
84
|
-
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
85
|
-
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
86
|
-
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
87
|
-
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
302
|
declare class UsersResource extends BaseResource {
|
|
91
303
|
list: (options?: ListUsersOptions) => Promise<PaginatedList<User>>;
|
|
92
304
|
get: (id: number) => Promise<User>;
|
|
305
|
+
update: (id: number, input: UpdateUserInput) => Promise<User>;
|
|
93
306
|
delete: (id: number) => Promise<void>;
|
|
94
307
|
updatePassword: (id: number, input: UpdatePasswordInput) => Promise<void>;
|
|
95
308
|
}
|
|
@@ -100,10 +313,11 @@ type GoodPartyClientConfig = {
|
|
|
100
313
|
};
|
|
101
314
|
declare class GoodPartyClient {
|
|
102
315
|
readonly users: UsersResource;
|
|
316
|
+
readonly campaigns: CampaignsResource;
|
|
103
317
|
private clerkService;
|
|
104
318
|
private constructor();
|
|
105
319
|
static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
|
|
106
320
|
destroy: () => void;
|
|
107
321
|
}
|
|
108
322
|
|
|
109
|
-
export { GoodPartyClient, type GoodPartyClientConfig, type ListUsersOptions, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
|
|
323
|
+
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",
|
|
@@ -34,6 +248,10 @@ declare enum WhyBrowsing {
|
|
|
34
248
|
test = "test",
|
|
35
249
|
else = "else"
|
|
36
250
|
}
|
|
251
|
+
declare enum SIGN_UP_MODE {
|
|
252
|
+
CANDIDATE = "candidate",
|
|
253
|
+
FACILITATED = "facilitated"
|
|
254
|
+
}
|
|
37
255
|
type UserMetaData = {
|
|
38
256
|
customerId?: string;
|
|
39
257
|
checkoutSessionId?: string | null;
|
|
@@ -65,31 +283,26 @@ type ListUsersOptions = PaginationOptions & {
|
|
|
65
283
|
lastName?: string;
|
|
66
284
|
email?: string;
|
|
67
285
|
};
|
|
286
|
+
type UpdateUserInput = {
|
|
287
|
+
firstName?: string;
|
|
288
|
+
lastName?: string;
|
|
289
|
+
email?: string;
|
|
290
|
+
name?: string;
|
|
291
|
+
zip?: string;
|
|
292
|
+
phone?: string;
|
|
293
|
+
roles?: UserRole[];
|
|
294
|
+
signUpMode?: SIGN_UP_MODE;
|
|
295
|
+
allowTexts?: boolean;
|
|
296
|
+
};
|
|
68
297
|
type UpdatePasswordInput = {
|
|
69
298
|
oldPassword?: string;
|
|
70
299
|
newPassword: string;
|
|
71
300
|
};
|
|
72
301
|
|
|
73
|
-
type OfetchRequestBody = FetchOptions<'json'>['body'];
|
|
74
|
-
declare class HttpClient {
|
|
75
|
-
private baseUrl;
|
|
76
|
-
private getToken;
|
|
77
|
-
constructor(gpApiRootUrl: string, getToken: () => Promise<string>);
|
|
78
|
-
request: <T>(path: string, init?: FetchOptions<"json">) => Promise<T>;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
declare abstract class BaseResource {
|
|
82
|
-
protected httpClient: HttpClient;
|
|
83
|
-
constructor(httpClient: HttpClient);
|
|
84
|
-
protected getRequest: <T>(path: string, query?: FetchOptions<"json">["query"]) => Promise<T>;
|
|
85
|
-
protected postRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
86
|
-
protected putRequest: <T>(path: string, body: OfetchRequestBody) => Promise<T>;
|
|
87
|
-
protected deleteRequest: <T>(path: string) => Promise<T>;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
302
|
declare class UsersResource extends BaseResource {
|
|
91
303
|
list: (options?: ListUsersOptions) => Promise<PaginatedList<User>>;
|
|
92
304
|
get: (id: number) => Promise<User>;
|
|
305
|
+
update: (id: number, input: UpdateUserInput) => Promise<User>;
|
|
93
306
|
delete: (id: number) => Promise<void>;
|
|
94
307
|
updatePassword: (id: number, input: UpdatePasswordInput) => Promise<void>;
|
|
95
308
|
}
|
|
@@ -100,10 +313,11 @@ type GoodPartyClientConfig = {
|
|
|
100
313
|
};
|
|
101
314
|
declare class GoodPartyClient {
|
|
102
315
|
readonly users: UsersResource;
|
|
316
|
+
readonly campaigns: CampaignsResource;
|
|
103
317
|
private clerkService;
|
|
104
318
|
private constructor();
|
|
105
319
|
static create: (config: GoodPartyClientConfig) => Promise<GoodPartyClient>;
|
|
106
320
|
destroy: () => void;
|
|
107
321
|
}
|
|
108
322
|
|
|
109
|
-
export { GoodPartyClient, type GoodPartyClientConfig, type ListUsersOptions, type PaginatedList, type PaginationMeta, type PaginationOptions, SdkError, type UpdatePasswordInput, type User, type UserMetaData, UserRole, WhyBrowsing };
|
|
323
|
+
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,10 +89,17 @@ 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);
|
|
88
101
|
get = (id) => this.getRequest(`/users/${id}`);
|
|
102
|
+
update = (id, input) => this.putRequest(`/users/${id}`, input);
|
|
89
103
|
delete = (id) => this.deleteRequest(`/users/${id}`);
|
|
90
104
|
updatePassword = (id, input) => this.putRequest(`/users/${id}/password`, input);
|
|
91
105
|
};
|
|
@@ -180,11 +194,13 @@ var ClerkService = class {
|
|
|
180
194
|
// src/GoodPartyClient.ts
|
|
181
195
|
var GoodPartyClient = class _GoodPartyClient {
|
|
182
196
|
users;
|
|
197
|
+
campaigns;
|
|
183
198
|
clerkService;
|
|
184
199
|
constructor(clerkService, gpApiRootUrl) {
|
|
185
200
|
this.clerkService = clerkService;
|
|
186
201
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
187
202
|
this.users = new UsersResource(httpClient);
|
|
203
|
+
this.campaigns = new CampaignsResource(httpClient);
|
|
188
204
|
}
|
|
189
205
|
static create = async (config) => {
|
|
190
206
|
const { m2mSecret, gpApiRootUrl } = config;
|
|
@@ -213,9 +229,59 @@ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
|
|
|
213
229
|
WhyBrowsing2["else"] = "else";
|
|
214
230
|
return WhyBrowsing2;
|
|
215
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 || {});
|
|
216
275
|
// Annotate the CommonJS export names for ESM import in node:
|
|
217
276
|
0 && (module.exports = {
|
|
277
|
+
BallotReadyPositionLevel,
|
|
278
|
+
CampaignCreatedBy,
|
|
279
|
+
CampaignLaunchStatus,
|
|
280
|
+
CampaignTier,
|
|
281
|
+
ElectionLevel,
|
|
282
|
+
GenerationStatus,
|
|
218
283
|
GoodPartyClient,
|
|
284
|
+
OnboardingStep,
|
|
219
285
|
SdkError,
|
|
220
286
|
UserRole,
|
|
221
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 { ListUsersOptions, UpdatePasswordInput, User } 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 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 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 UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":"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","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}\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,10 +53,17 @@ 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);
|
|
59
65
|
get = (id) => this.getRequest(`/users/${id}`);
|
|
66
|
+
update = (id, input) => this.putRequest(`/users/${id}`, input);
|
|
60
67
|
delete = (id) => this.deleteRequest(`/users/${id}`);
|
|
61
68
|
updatePassword = (id, input) => this.putRequest(`/users/${id}/password`, input);
|
|
62
69
|
};
|
|
@@ -151,11 +158,13 @@ var ClerkService = class {
|
|
|
151
158
|
// src/GoodPartyClient.ts
|
|
152
159
|
var GoodPartyClient = class _GoodPartyClient {
|
|
153
160
|
users;
|
|
161
|
+
campaigns;
|
|
154
162
|
clerkService;
|
|
155
163
|
constructor(clerkService, gpApiRootUrl) {
|
|
156
164
|
this.clerkService = clerkService;
|
|
157
165
|
const httpClient = new HttpClient(gpApiRootUrl, clerkService.getToken);
|
|
158
166
|
this.users = new UsersResource(httpClient);
|
|
167
|
+
this.campaigns = new CampaignsResource(httpClient);
|
|
159
168
|
}
|
|
160
169
|
static create = async (config) => {
|
|
161
170
|
const { m2mSecret, gpApiRootUrl } = config;
|
|
@@ -184,8 +193,58 @@ var WhyBrowsing = /* @__PURE__ */ ((WhyBrowsing2) => {
|
|
|
184
193
|
WhyBrowsing2["else"] = "else";
|
|
185
194
|
return WhyBrowsing2;
|
|
186
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 || {});
|
|
187
239
|
export {
|
|
240
|
+
BallotReadyPositionLevel,
|
|
241
|
+
CampaignCreatedBy,
|
|
242
|
+
CampaignLaunchStatus,
|
|
243
|
+
CampaignTier,
|
|
244
|
+
ElectionLevel,
|
|
245
|
+
GenerationStatus,
|
|
188
246
|
GoodPartyClient,
|
|
247
|
+
OnboardingStep,
|
|
189
248
|
SdkError,
|
|
190
249
|
UserRole,
|
|
191
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 { ListUsersOptions, UpdatePasswordInput, User } 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 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 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 UpdatePasswordInput = {\n oldPassword?: string\n newPassword: string\n}\n"],"mappings":"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","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}\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"]}
|