@stackframe/js 2.8.56 → 2.8.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +74 -19
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +31 -23
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js +4 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js +13 -12
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/index.d.mts +249 -16
- package/dist/index.d.ts +249 -16
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +73 -18
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +29 -21
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/email/index.js.map +1 -1
- package/dist/lib/stack-app/index.js.map +1 -1
- package/dist/lib/stack-app/project-configs/index.js.map +1 -1
- package/dist/lib/stack-app/projects/index.js +4 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/teams/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js +15 -14
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/package.json +3 -2
- package/CHANGELOG.md +0 -2072
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,15 @@ type RedirectMethod = "window" | "none" | {
|
|
|
37
37
|
};
|
|
38
38
|
type GetCurrentUserOptions<HasTokenStore> = {
|
|
39
39
|
or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | /** @deprecated */ 'anonymous-if-exists[deprecated]';
|
|
40
|
+
/**
|
|
41
|
+
* Whether to include restricted users (users who haven't completed onboarding requirements like email verification).
|
|
42
|
+
* By default, restricted users are filtered out (treated similar to anonymous users).
|
|
43
|
+
*
|
|
44
|
+
* Note: This option cannot be set to false when `or: 'anonymous'` is used, as all anonymous users are also restricted.
|
|
45
|
+
*
|
|
46
|
+
* @default false
|
|
47
|
+
*/
|
|
48
|
+
includeRestricted?: boolean;
|
|
40
49
|
tokenStore?: TokenStoreInit;
|
|
41
50
|
} & (HasTokenStore extends false ? {
|
|
42
51
|
tokenStore: TokenStoreInit;
|
|
@@ -84,6 +93,7 @@ type HandlerUrls = {
|
|
|
84
93
|
teamInvitation: string;
|
|
85
94
|
mfa: string;
|
|
86
95
|
error: string;
|
|
96
|
+
onboarding: string;
|
|
87
97
|
};
|
|
88
98
|
type OAuthScopesOnSignIn = {
|
|
89
99
|
[key in ProviderType]: string[];
|
|
@@ -99,6 +109,20 @@ type AuthLike<ExtraOptions = {}> = {
|
|
|
99
109
|
signOut(options?: {
|
|
100
110
|
redirectUrl?: URL | string;
|
|
101
111
|
}): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Returns the current access token, or null if the user is not signed in.
|
|
114
|
+
*
|
|
115
|
+
* The access token is a short-lived JWT that can be used to authenticate requests to external servers.
|
|
116
|
+
* It will be automatically refreshed when it expires.
|
|
117
|
+
*/
|
|
118
|
+
getAccessToken(options?: {} & ExtraOptions): Promise<string | null>;
|
|
119
|
+
/**
|
|
120
|
+
* Returns the current refresh token, or null if the user is not signed in.
|
|
121
|
+
*
|
|
122
|
+
* The refresh token is a long-lived token that can be used to obtain new access tokens.
|
|
123
|
+
* It should be kept secret and never exposed to the client.
|
|
124
|
+
*/
|
|
125
|
+
getRefreshToken(options?: {} & ExtraOptions): Promise<string | null>;
|
|
102
126
|
/**
|
|
103
127
|
* Returns headers for sending authenticated HTTP requests to external servers. Most commonly used in cross-origin
|
|
104
128
|
* requests. Similar to `getAuthJson`, but specifically for HTTP requests.
|
|
@@ -115,8 +139,8 @@ type AuthLike<ExtraOptions = {}> = {
|
|
|
115
139
|
* must include `x-stack-auth` in the [`Access-Control-Allow-Headers` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
|
|
116
140
|
* of the CORS preflight response.
|
|
117
141
|
*
|
|
118
|
-
* If you are not using HTTP (and hence cannot set headers), you will need to use the `
|
|
119
|
-
* instead.
|
|
142
|
+
* If you are not using HTTP (and hence cannot set headers), you will need to use the `getAccessToken()` and
|
|
143
|
+
* `getRefreshToken()` functions instead.
|
|
120
144
|
*
|
|
121
145
|
* Example:
|
|
122
146
|
*
|
|
@@ -140,6 +164,8 @@ type AuthLike<ExtraOptions = {}> = {
|
|
|
140
164
|
"x-stack-auth": string;
|
|
141
165
|
}>;
|
|
142
166
|
/**
|
|
167
|
+
* @deprecated Use `getAccessToken()` and `getRefreshToken()` instead.
|
|
168
|
+
*
|
|
143
169
|
* Creates a JSON-serializable object containing the information to authenticate a user on an external server.
|
|
144
170
|
* Similar to `getAuthHeaders`, but returns an object that can be sent over any protocol instead of just
|
|
145
171
|
* HTTP headers.
|
|
@@ -254,6 +280,137 @@ type AdminSentEmail = {
|
|
|
254
280
|
sentAt: Date;
|
|
255
281
|
error?: unknown;
|
|
256
282
|
};
|
|
283
|
+
type AdminEmailOutboxRecipient = {
|
|
284
|
+
type: "user-primary-email";
|
|
285
|
+
userId: string;
|
|
286
|
+
} | {
|
|
287
|
+
type: "user-custom-emails";
|
|
288
|
+
userId: string;
|
|
289
|
+
emails: string[];
|
|
290
|
+
} | {
|
|
291
|
+
type: "custom-emails";
|
|
292
|
+
emails: string[];
|
|
293
|
+
};
|
|
294
|
+
type AdminEmailOutboxStatus = "paused" | "preparing" | "rendering" | "render-error" | "scheduled" | "queued" | "sending" | "server-error" | "skipped" | "bounced" | "delivery-delayed" | "sent" | "opened" | "clicked" | "marked-as-spam";
|
|
295
|
+
type AdminEmailOutboxSimpleStatus = "in-progress" | "ok" | "error";
|
|
296
|
+
type AdminEmailOutboxBase = {
|
|
297
|
+
id: string;
|
|
298
|
+
createdAt: Date;
|
|
299
|
+
updatedAt: Date;
|
|
300
|
+
to: AdminEmailOutboxRecipient;
|
|
301
|
+
scheduledAt: Date;
|
|
302
|
+
isPaused: false;
|
|
303
|
+
hasRendered: false;
|
|
304
|
+
hasDelivered: false;
|
|
305
|
+
};
|
|
306
|
+
type AdminEmailOutboxRenderedFields = Omit<AdminEmailOutboxBase, "hasRendered"> & {
|
|
307
|
+
hasRendered: true;
|
|
308
|
+
startedRenderingAt: Date;
|
|
309
|
+
renderedAt: Date;
|
|
310
|
+
subject: string;
|
|
311
|
+
html: string | null;
|
|
312
|
+
text: string | null;
|
|
313
|
+
isTransactional: boolean;
|
|
314
|
+
isHighPriority: boolean;
|
|
315
|
+
notificationCategoryId: string | null;
|
|
316
|
+
};
|
|
317
|
+
type AdminEmailOutboxStartedSendingFields = AdminEmailOutboxRenderedFields & {
|
|
318
|
+
startedSendingAt: Date;
|
|
319
|
+
};
|
|
320
|
+
type AdminEmailOutboxFinishedDeliveringFields = Omit<AdminEmailOutboxStartedSendingFields, "hasDelivered"> & {
|
|
321
|
+
hasDelivered: true;
|
|
322
|
+
deliveredAt: Date;
|
|
323
|
+
};
|
|
324
|
+
type AdminEmailOutboxPaused = Omit<AdminEmailOutboxBase, "isPaused"> & {
|
|
325
|
+
status: "paused";
|
|
326
|
+
simpleStatus: "in-progress";
|
|
327
|
+
isPaused: true;
|
|
328
|
+
};
|
|
329
|
+
type AdminEmailOutboxPreparing = AdminEmailOutboxBase & {
|
|
330
|
+
status: "preparing";
|
|
331
|
+
simpleStatus: "in-progress";
|
|
332
|
+
};
|
|
333
|
+
type AdminEmailOutboxRendering = AdminEmailOutboxBase & {
|
|
334
|
+
status: "rendering";
|
|
335
|
+
simpleStatus: "in-progress";
|
|
336
|
+
startedRenderingAt: Date;
|
|
337
|
+
};
|
|
338
|
+
type AdminEmailOutboxRenderError = AdminEmailOutboxBase & {
|
|
339
|
+
status: "render-error";
|
|
340
|
+
simpleStatus: "error";
|
|
341
|
+
startedRenderingAt: Date;
|
|
342
|
+
renderedAt: Date;
|
|
343
|
+
renderError: string;
|
|
344
|
+
};
|
|
345
|
+
type AdminEmailOutboxScheduled = AdminEmailOutboxRenderedFields & {
|
|
346
|
+
status: "scheduled";
|
|
347
|
+
simpleStatus: "in-progress";
|
|
348
|
+
};
|
|
349
|
+
type AdminEmailOutboxQueued = AdminEmailOutboxRenderedFields & {
|
|
350
|
+
status: "queued";
|
|
351
|
+
simpleStatus: "in-progress";
|
|
352
|
+
};
|
|
353
|
+
type AdminEmailOutboxSending = AdminEmailOutboxStartedSendingFields & {
|
|
354
|
+
status: "sending";
|
|
355
|
+
simpleStatus: "in-progress";
|
|
356
|
+
};
|
|
357
|
+
type AdminEmailOutboxServerError = AdminEmailOutboxStartedSendingFields & {
|
|
358
|
+
status: "server-error";
|
|
359
|
+
simpleStatus: "error";
|
|
360
|
+
errorAt: Date;
|
|
361
|
+
serverError: string;
|
|
362
|
+
};
|
|
363
|
+
type AdminEmailOutboxSkipped = Omit<AdminEmailOutboxBase, "hasRendered"> & {
|
|
364
|
+
status: "skipped";
|
|
365
|
+
simpleStatus: "ok";
|
|
366
|
+
hasRendered: boolean;
|
|
367
|
+
skippedAt: Date;
|
|
368
|
+
skippedReason: string;
|
|
369
|
+
skippedDetails: Record<string, unknown>;
|
|
370
|
+
startedRenderingAt?: Date;
|
|
371
|
+
renderedAt?: Date;
|
|
372
|
+
subject?: string;
|
|
373
|
+
html?: string | null;
|
|
374
|
+
text?: string | null;
|
|
375
|
+
isTransactional?: boolean;
|
|
376
|
+
isHighPriority?: boolean;
|
|
377
|
+
notificationCategoryId?: string | null;
|
|
378
|
+
startedSendingAt?: Date;
|
|
379
|
+
};
|
|
380
|
+
type AdminEmailOutboxBounced = AdminEmailOutboxStartedSendingFields & {
|
|
381
|
+
status: "bounced";
|
|
382
|
+
simpleStatus: "error";
|
|
383
|
+
bouncedAt: Date;
|
|
384
|
+
};
|
|
385
|
+
type AdminEmailOutboxDeliveryDelayed = AdminEmailOutboxStartedSendingFields & {
|
|
386
|
+
status: "delivery-delayed";
|
|
387
|
+
simpleStatus: "ok";
|
|
388
|
+
deliveryDelayedAt: Date;
|
|
389
|
+
};
|
|
390
|
+
type AdminEmailOutboxSent = AdminEmailOutboxFinishedDeliveringFields & {
|
|
391
|
+
status: "sent";
|
|
392
|
+
simpleStatus: "ok";
|
|
393
|
+
canHaveDeliveryInfo: boolean;
|
|
394
|
+
};
|
|
395
|
+
type AdminEmailOutboxOpened = AdminEmailOutboxFinishedDeliveringFields & {
|
|
396
|
+
status: "opened";
|
|
397
|
+
simpleStatus: "ok";
|
|
398
|
+
openedAt: Date;
|
|
399
|
+
canHaveDeliveryInfo: true;
|
|
400
|
+
};
|
|
401
|
+
type AdminEmailOutboxClicked = AdminEmailOutboxFinishedDeliveringFields & {
|
|
402
|
+
status: "clicked";
|
|
403
|
+
simpleStatus: "ok";
|
|
404
|
+
clickedAt: Date;
|
|
405
|
+
canHaveDeliveryInfo: true;
|
|
406
|
+
};
|
|
407
|
+
type AdminEmailOutboxMarkedAsSpam = AdminEmailOutboxFinishedDeliveringFields & {
|
|
408
|
+
status: "marked-as-spam";
|
|
409
|
+
simpleStatus: "ok";
|
|
410
|
+
markedAsSpamAt: Date;
|
|
411
|
+
canHaveDeliveryInfo: true;
|
|
412
|
+
};
|
|
413
|
+
type AdminEmailOutbox = AdminEmailOutboxPaused | AdminEmailOutboxPreparing | AdminEmailOutboxRendering | AdminEmailOutboxRenderError | AdminEmailOutboxScheduled | AdminEmailOutboxQueued | AdminEmailOutboxSending | AdminEmailOutboxServerError | AdminEmailOutboxSkipped | AdminEmailOutboxBounced | AdminEmailOutboxDeliveryDelayed | AdminEmailOutboxSent | AdminEmailOutboxOpened | AdminEmailOutboxClicked | AdminEmailOutboxMarkedAsSpam;
|
|
257
414
|
type SendEmailOptionsBase = {
|
|
258
415
|
themeId?: string | null | false;
|
|
259
416
|
subject?: string;
|
|
@@ -278,6 +435,25 @@ type SendEmailOptions = SendEmailOptionsBase & XOR<[
|
|
|
278
435
|
draftId: string;
|
|
279
436
|
}
|
|
280
437
|
]>;
|
|
438
|
+
type EmailDeliveryWindowStats = {
|
|
439
|
+
sent: number;
|
|
440
|
+
bounced: number;
|
|
441
|
+
marked_as_spam: number;
|
|
442
|
+
};
|
|
443
|
+
type EmailDeliveryStats = {
|
|
444
|
+
hour: EmailDeliveryWindowStats;
|
|
445
|
+
day: EmailDeliveryWindowStats;
|
|
446
|
+
week: EmailDeliveryWindowStats;
|
|
447
|
+
month: EmailDeliveryWindowStats;
|
|
448
|
+
};
|
|
449
|
+
type EmailDeliveryCapacity = {
|
|
450
|
+
rate_per_second: number;
|
|
451
|
+
penalty_factor: number;
|
|
452
|
+
};
|
|
453
|
+
type EmailDeliveryInfo = {
|
|
454
|
+
stats: EmailDeliveryStats;
|
|
455
|
+
capacity: EmailDeliveryCapacity;
|
|
456
|
+
};
|
|
281
457
|
|
|
282
458
|
type InternalApiKeyBase = {
|
|
283
459
|
id: string;
|
|
@@ -477,18 +653,17 @@ type ServerOAuthProvider = {
|
|
|
477
653
|
}): Promise<Result<void, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
|
|
478
654
|
delete(): Promise<void>;
|
|
479
655
|
};
|
|
480
|
-
type Session = {
|
|
481
|
-
getTokens(): Promise<{
|
|
482
|
-
accessToken: string | null;
|
|
483
|
-
refreshToken: string | null;
|
|
484
|
-
}>;
|
|
485
|
-
};
|
|
486
656
|
/**
|
|
487
657
|
* Contains everything related to the current user session.
|
|
488
658
|
*/
|
|
489
659
|
type Auth = AuthLike<{}> & {
|
|
490
660
|
readonly _internalSession: InternalSession;
|
|
491
|
-
readonly currentSession:
|
|
661
|
+
readonly currentSession: {
|
|
662
|
+
getTokens(): Promise<{
|
|
663
|
+
accessToken: string | null;
|
|
664
|
+
refreshToken: string | null;
|
|
665
|
+
}>;
|
|
666
|
+
};
|
|
492
667
|
};
|
|
493
668
|
/**
|
|
494
669
|
* ```
|
|
@@ -534,6 +709,18 @@ type BaseUser = {
|
|
|
534
709
|
readonly passkeyAuthEnabled: boolean;
|
|
535
710
|
readonly isMultiFactorRequired: boolean;
|
|
536
711
|
readonly isAnonymous: boolean;
|
|
712
|
+
/**
|
|
713
|
+
* Whether the user is in restricted state (signed up but hasn't completed onboarding requirements).
|
|
714
|
+
* For example, if email verification is required but the user hasn't verified their email yet.
|
|
715
|
+
*/
|
|
716
|
+
readonly isRestricted: boolean;
|
|
717
|
+
/**
|
|
718
|
+
* The reason why the user is restricted, e.g., { type: "email_not_verified" } or { type: "anonymous" }.
|
|
719
|
+
* Null if the user is not restricted.
|
|
720
|
+
*/
|
|
721
|
+
readonly restrictedReason: {
|
|
722
|
+
type: "anonymous" | "email_not_verified";
|
|
723
|
+
} | null;
|
|
537
724
|
toClientJson(): CurrentUserCrud["Client"]["Read"];
|
|
538
725
|
/**
|
|
539
726
|
* @deprecated, use contact channel's usedForAuth instead
|
|
@@ -547,7 +734,7 @@ type BaseUser = {
|
|
|
547
734
|
}[];
|
|
548
735
|
};
|
|
549
736
|
type UserExtra = {
|
|
550
|
-
setDisplayName(displayName: string): Promise<void>;
|
|
737
|
+
setDisplayName(displayName: string | null): Promise<void>;
|
|
551
738
|
/** @deprecated Use contact channel's sendVerificationEmail instead */
|
|
552
739
|
sendVerificationEmail(): Promise<KnownErrors["EmailAlreadyVerified"] | void>;
|
|
553
740
|
setClientMetadata(metadata: any): Promise<void>;
|
|
@@ -585,7 +772,7 @@ type UserExtra = {
|
|
|
585
772
|
recursive?: boolean;
|
|
586
773
|
}): Promise<TeamPermission[]>;
|
|
587
774
|
readonly selectedTeam: Team | null;
|
|
588
|
-
setSelectedTeam(
|
|
775
|
+
setSelectedTeam(teamOrId: string | Team | null): Promise<void>;
|
|
589
776
|
createTeam(data: TeamCreateOptions): Promise<Team>;
|
|
590
777
|
leaveTeam(team: Team): Promise<void>;
|
|
591
778
|
getActiveSessions(): Promise<ActiveSession[]>;
|
|
@@ -610,8 +797,8 @@ type User = BaseUser;
|
|
|
610
797
|
type CurrentUser = BaseUser & Auth & UserExtra & Customer;
|
|
611
798
|
type CurrentInternalUser = CurrentUser & InternalUserExtra;
|
|
612
799
|
type ProjectCurrentUser<ProjectId> = ProjectId extends "internal" ? CurrentInternalUser : CurrentUser;
|
|
613
|
-
type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous">;
|
|
614
|
-
type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword">;
|
|
800
|
+
type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous" | "isRestricted" | "restrictedReason">;
|
|
801
|
+
type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword" | "isRestricted" | "restrictedReason">;
|
|
615
802
|
type ActiveSession = {
|
|
616
803
|
id: string;
|
|
617
804
|
userId: string;
|
|
@@ -622,13 +809,14 @@ type ActiveSession = {
|
|
|
622
809
|
geoInfo?: GeoInfo;
|
|
623
810
|
};
|
|
624
811
|
type UserUpdateOptions = {
|
|
625
|
-
displayName?: string;
|
|
812
|
+
displayName?: string | null;
|
|
626
813
|
clientMetadata?: ReadonlyJson;
|
|
627
814
|
selectedTeamId?: string | null;
|
|
628
815
|
totpMultiFactorSecret?: Uint8Array | null;
|
|
629
816
|
profileImageUrl?: string | null;
|
|
630
817
|
otpAuthEnabled?: boolean;
|
|
631
818
|
passkeyAuthEnabled?: boolean;
|
|
819
|
+
primaryEmail?: string | null;
|
|
632
820
|
};
|
|
633
821
|
type ServerBaseUser = {
|
|
634
822
|
setPrimaryEmail(email: string | null, options?: {
|
|
@@ -664,7 +852,12 @@ type ServerBaseUser = {
|
|
|
664
852
|
createSession(options?: {
|
|
665
853
|
expiresInMillis?: number;
|
|
666
854
|
isImpersonation?: boolean;
|
|
667
|
-
}): Promise<
|
|
855
|
+
}): Promise<{
|
|
856
|
+
getTokens(): Promise<{
|
|
857
|
+
accessToken: string | null;
|
|
858
|
+
refreshToken: string | null;
|
|
859
|
+
}>;
|
|
860
|
+
}>;
|
|
668
861
|
} & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
|
|
669
862
|
direct?: boolean;
|
|
670
863
|
}], AdminTeamPermission | null, false> & AsyncStoreProperty<"permissions", [scope: Team, options?: {
|
|
@@ -768,6 +961,15 @@ type ServerListUsersOptions = {
|
|
|
768
961
|
orderBy?: 'signedUpAt';
|
|
769
962
|
desc?: boolean;
|
|
770
963
|
query?: string;
|
|
964
|
+
/**
|
|
965
|
+
* Whether to include restricted users (users who haven't completed onboarding requirements).
|
|
966
|
+
* Defaults to false.
|
|
967
|
+
*/
|
|
968
|
+
includeRestricted?: boolean;
|
|
969
|
+
/**
|
|
970
|
+
* Whether to include anonymous users (and restricted users).
|
|
971
|
+
* Defaults to false.
|
|
972
|
+
*/
|
|
771
973
|
includeAnonymous?: boolean;
|
|
772
974
|
};
|
|
773
975
|
type ServerTeamCreateOptions = TeamCreateOptions & {
|
|
@@ -848,6 +1050,7 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
848
1050
|
allowConnectedAccounts: boolean;
|
|
849
1051
|
}): Promise<Result<ServerOAuthProvider, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
|
|
850
1052
|
sendEmail(options: SendEmailOptions): Promise<void>;
|
|
1053
|
+
getEmailDeliveryStats(): Promise<EmailDeliveryInfo>;
|
|
851
1054
|
} & AsyncStoreProperty<"user", [id: string], ServerUser | null, false> & Omit<AsyncStoreProperty<"users", [], ServerUser[], true>, "listUsers" | "useUsers"> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"dataVaultStore", [id: string], DataVaultStore, false> & AsyncStoreProperty<"item", [
|
|
852
1055
|
{
|
|
853
1056
|
itemId: string;
|
|
@@ -864,6 +1067,21 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
864
1067
|
], CustomerProductsList, true> & StackClientApp<HasTokenStore, ProjectId>);
|
|
865
1068
|
declare const StackServerApp: StackServerAppConstructor;
|
|
866
1069
|
|
|
1070
|
+
type EmailOutboxListOptions = {
|
|
1071
|
+
status?: string;
|
|
1072
|
+
simpleStatus?: string;
|
|
1073
|
+
limit?: number;
|
|
1074
|
+
cursor?: string;
|
|
1075
|
+
};
|
|
1076
|
+
type EmailOutboxListResult = {
|
|
1077
|
+
items: AdminEmailOutbox[];
|
|
1078
|
+
nextCursor: string | null;
|
|
1079
|
+
};
|
|
1080
|
+
type EmailOutboxUpdateOptions = {
|
|
1081
|
+
isPaused?: boolean;
|
|
1082
|
+
scheduledAtMillis?: number;
|
|
1083
|
+
cancel?: boolean;
|
|
1084
|
+
};
|
|
867
1085
|
type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (StackServerAppConstructorOptions<HasTokenStore, ProjectId> & {
|
|
868
1086
|
superSecretAdminKey?: string;
|
|
869
1087
|
projectOwnerSession?: InternalSession;
|
|
@@ -988,6 +1206,12 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
|
|
|
988
1206
|
type: "subscription" | "one-time-purchase";
|
|
989
1207
|
id: string;
|
|
990
1208
|
}): Promise<void>;
|
|
1209
|
+
listOutboxEmails(options?: EmailOutboxListOptions): Promise<EmailOutboxListResult>;
|
|
1210
|
+
getOutboxEmail(id: string): Promise<AdminEmailOutbox>;
|
|
1211
|
+
updateOutboxEmail(id: string, options: EmailOutboxUpdateOptions): Promise<AdminEmailOutbox>;
|
|
1212
|
+
pauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
|
|
1213
|
+
unpauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
|
|
1214
|
+
cancelOutboxEmail(id: string): Promise<AdminEmailOutbox>;
|
|
991
1215
|
} & StackServerApp<HasTokenStore, ProjectId>);
|
|
992
1216
|
declare const StackAdminApp: StackAdminAppConstructor;
|
|
993
1217
|
|
|
@@ -1005,6 +1229,9 @@ type ProjectConfig = {
|
|
|
1005
1229
|
type OAuthProviderConfig = {
|
|
1006
1230
|
readonly id: string;
|
|
1007
1231
|
};
|
|
1232
|
+
/**
|
|
1233
|
+
* @deprecated This type is deprecated. Use the new config override setup instead.
|
|
1234
|
+
*/
|
|
1008
1235
|
type AdminProjectConfig = {
|
|
1009
1236
|
readonly signUpEnabled: boolean;
|
|
1010
1237
|
readonly credentialEnabled: boolean;
|
|
@@ -1238,6 +1465,12 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
1238
1465
|
or: 'anonymous';
|
|
1239
1466
|
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
1240
1467
|
getUser(options?: GetCurrentUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
|
|
1468
|
+
cancelSubscription(options: {
|
|
1469
|
+
productId: string;
|
|
1470
|
+
} | {
|
|
1471
|
+
productId: string;
|
|
1472
|
+
teamId: string;
|
|
1473
|
+
}): Promise<void>;
|
|
1241
1474
|
getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & {
|
|
1242
1475
|
from: 'token';
|
|
1243
1476
|
}): Promise<TokenPartialUser | null>;
|
|
@@ -1274,4 +1507,4 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
1274
1507
|
}>);
|
|
1275
1508
|
declare const StackClientApp: StackClientAppConstructor;
|
|
1276
1509
|
|
|
1277
|
-
export { type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser,
|
|
1510
|
+
export { type AdminDomainConfig, type AdminEmailConfig, type AdminEmailOutbox, type AdminEmailOutboxRecipient, type AdminEmailOutboxSimpleStatus, type AdminEmailOutboxStatus, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type EmailOutboxListOptions, type EmailOutboxListResult, type EmailOutboxUpdateOptions, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, type Team, type TeamCreateOptions, type TeamInvitation, type TeamMemberProfile, type TeamUpdateOptions, type TeamUser, type User, stackAppInternalsSymbol };
|
|
@@ -449,9 +449,244 @@ var _StackAdminAppImplIncomplete = class extends import_server_app_impl._StackSe
|
|
|
449
449
|
const crud = import_results.Result.orThrow(await this._transactionsCache.getOrWait([params.cursor, params.limit, params.type, params.customerType], "write-only"));
|
|
450
450
|
return crud;
|
|
451
451
|
}
|
|
452
|
+
// Email Outbox methods
|
|
453
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Complex discriminated union conversion from API response
|
|
454
|
+
_emailOutboxCrudToAdmin(crud) {
|
|
455
|
+
const recipient = crud.to;
|
|
456
|
+
let to;
|
|
457
|
+
if (recipient.type === "user-primary-email") {
|
|
458
|
+
to = { type: "user-primary-email", userId: recipient.user_id };
|
|
459
|
+
} else if (recipient.type === "user-custom-emails") {
|
|
460
|
+
to = { type: "user-custom-emails", userId: recipient.user_id, emails: recipient.emails };
|
|
461
|
+
} else {
|
|
462
|
+
to = { type: "custom-emails", emails: recipient.emails };
|
|
463
|
+
}
|
|
464
|
+
const base = {
|
|
465
|
+
id: crud.id,
|
|
466
|
+
createdAt: new Date(crud.created_at_millis),
|
|
467
|
+
updatedAt: new Date(crud.updated_at_millis),
|
|
468
|
+
to,
|
|
469
|
+
scheduledAt: new Date(crud.scheduled_at_millis),
|
|
470
|
+
isPaused: false,
|
|
471
|
+
hasRendered: false,
|
|
472
|
+
hasDelivered: false
|
|
473
|
+
};
|
|
474
|
+
const rendered = crud.has_rendered ? {
|
|
475
|
+
...base,
|
|
476
|
+
startedRenderingAt: new Date(crud.started_rendering_at_millis),
|
|
477
|
+
renderedAt: new Date(crud.rendered_at_millis),
|
|
478
|
+
subject: crud.subject,
|
|
479
|
+
html: crud.html,
|
|
480
|
+
text: crud.text,
|
|
481
|
+
isTransactional: crud.is_transactional,
|
|
482
|
+
isHighPriority: crud.is_high_priority,
|
|
483
|
+
notificationCategoryId: crud.notification_category_id,
|
|
484
|
+
hasRendered: true
|
|
485
|
+
} : null;
|
|
486
|
+
const startedSending = rendered && crud.started_sending_at_millis ? {
|
|
487
|
+
...rendered,
|
|
488
|
+
startedSendingAt: new Date(crud.started_sending_at_millis)
|
|
489
|
+
} : null;
|
|
490
|
+
const finishedDelivering = startedSending && crud.has_delivered ? {
|
|
491
|
+
...startedSending,
|
|
492
|
+
deliveredAt: new Date(crud.delivered_at_millis),
|
|
493
|
+
hasDelivered: true
|
|
494
|
+
} : null;
|
|
495
|
+
const result = (() => {
|
|
496
|
+
switch (crud.status) {
|
|
497
|
+
case "paused": {
|
|
498
|
+
return {
|
|
499
|
+
...base,
|
|
500
|
+
status: "paused",
|
|
501
|
+
simpleStatus: "in-progress",
|
|
502
|
+
isPaused: true
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
case "preparing": {
|
|
506
|
+
return {
|
|
507
|
+
...base,
|
|
508
|
+
status: "preparing",
|
|
509
|
+
simpleStatus: "in-progress"
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
case "rendering": {
|
|
513
|
+
return {
|
|
514
|
+
...base,
|
|
515
|
+
status: "rendering",
|
|
516
|
+
simpleStatus: "in-progress",
|
|
517
|
+
startedRenderingAt: new Date(crud.started_rendering_at_millis)
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
case "render-error": {
|
|
521
|
+
return {
|
|
522
|
+
...base,
|
|
523
|
+
status: "render-error",
|
|
524
|
+
simpleStatus: "error",
|
|
525
|
+
startedRenderingAt: new Date(crud.started_rendering_at_millis),
|
|
526
|
+
renderedAt: new Date(crud.rendered_at_millis),
|
|
527
|
+
renderError: crud.render_error
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
case "scheduled": {
|
|
531
|
+
return {
|
|
532
|
+
...rendered,
|
|
533
|
+
status: "scheduled",
|
|
534
|
+
simpleStatus: "in-progress"
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
case "queued": {
|
|
538
|
+
return {
|
|
539
|
+
...rendered,
|
|
540
|
+
status: "queued",
|
|
541
|
+
simpleStatus: "in-progress"
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
case "sending": {
|
|
545
|
+
return {
|
|
546
|
+
...startedSending,
|
|
547
|
+
status: "sending",
|
|
548
|
+
simpleStatus: "in-progress"
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
case "server-error": {
|
|
552
|
+
return {
|
|
553
|
+
...startedSending,
|
|
554
|
+
status: "server-error",
|
|
555
|
+
simpleStatus: "error",
|
|
556
|
+
errorAt: new Date(crud.error_at_millis),
|
|
557
|
+
serverError: crud.server_error
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
case "skipped": {
|
|
561
|
+
return {
|
|
562
|
+
...base,
|
|
563
|
+
status: "skipped",
|
|
564
|
+
simpleStatus: "ok",
|
|
565
|
+
skippedAt: new Date(crud.skipped_at_millis),
|
|
566
|
+
skippedReason: crud.skipped_reason,
|
|
567
|
+
skippedDetails: crud.skipped_details ?? {},
|
|
568
|
+
hasRendered: crud.has_rendered,
|
|
569
|
+
// Optional fields
|
|
570
|
+
startedRenderingAt: crud.started_rendering_at_millis ? new Date(crud.started_rendering_at_millis) : void 0,
|
|
571
|
+
renderedAt: crud.rendered_at_millis ? new Date(crud.rendered_at_millis) : void 0,
|
|
572
|
+
subject: crud.subject,
|
|
573
|
+
html: crud.html,
|
|
574
|
+
text: crud.text,
|
|
575
|
+
isTransactional: crud.is_transactional,
|
|
576
|
+
isHighPriority: crud.is_high_priority,
|
|
577
|
+
notificationCategoryId: crud.notification_category_id,
|
|
578
|
+
startedSendingAt: crud.started_sending_at_millis ? new Date(crud.started_sending_at_millis) : void 0
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
case "bounced": {
|
|
582
|
+
return {
|
|
583
|
+
...startedSending,
|
|
584
|
+
status: "bounced",
|
|
585
|
+
simpleStatus: "error",
|
|
586
|
+
bouncedAt: new Date(crud.bounced_at_millis)
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
case "delivery-delayed": {
|
|
590
|
+
return {
|
|
591
|
+
...startedSending,
|
|
592
|
+
status: "delivery-delayed",
|
|
593
|
+
simpleStatus: "ok",
|
|
594
|
+
deliveryDelayedAt: new Date(crud.delivery_delayed_at_millis)
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
case "sent": {
|
|
598
|
+
return {
|
|
599
|
+
...finishedDelivering,
|
|
600
|
+
status: "sent",
|
|
601
|
+
simpleStatus: "ok",
|
|
602
|
+
canHaveDeliveryInfo: crud.can_have_delivery_info
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
case "opened": {
|
|
606
|
+
return {
|
|
607
|
+
...finishedDelivering,
|
|
608
|
+
status: "opened",
|
|
609
|
+
simpleStatus: "ok",
|
|
610
|
+
openedAt: new Date(crud.opened_at_millis),
|
|
611
|
+
canHaveDeliveryInfo: true
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
case "clicked": {
|
|
615
|
+
return {
|
|
616
|
+
...finishedDelivering,
|
|
617
|
+
status: "clicked",
|
|
618
|
+
simpleStatus: "ok",
|
|
619
|
+
clickedAt: new Date(crud.clicked_at_millis),
|
|
620
|
+
canHaveDeliveryInfo: true
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
case "marked-as-spam": {
|
|
624
|
+
return {
|
|
625
|
+
...finishedDelivering,
|
|
626
|
+
status: "marked-as-spam",
|
|
627
|
+
simpleStatus: "ok",
|
|
628
|
+
markedAsSpamAt: new Date(crud.marked_as_spam_at_millis),
|
|
629
|
+
canHaveDeliveryInfo: true
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
default: {
|
|
633
|
+
throw new import_errors.StackAssertionError(`Unknown email outbox status: ${crud.status}`, { status: crud.status });
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
})();
|
|
637
|
+
return result;
|
|
638
|
+
}
|
|
639
|
+
async listOutboxEmails(options) {
|
|
640
|
+
const response = await this._interface.listOutboxEmails({
|
|
641
|
+
status: options?.status,
|
|
642
|
+
simple_status: options?.simpleStatus,
|
|
643
|
+
limit: options?.limit,
|
|
644
|
+
cursor: options?.cursor
|
|
645
|
+
});
|
|
646
|
+
return {
|
|
647
|
+
items: response.items.map((item) => this._emailOutboxCrudToAdmin(item)),
|
|
648
|
+
nextCursor: response.pagination?.next_cursor ?? null
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
async getOutboxEmail(id) {
|
|
652
|
+
const response = await this._interface.getOutboxEmail(id);
|
|
653
|
+
return this._emailOutboxCrudToAdmin(response);
|
|
654
|
+
}
|
|
655
|
+
async updateOutboxEmail(id, options) {
|
|
656
|
+
const response = await this._interface.updateOutboxEmail(id, {
|
|
657
|
+
is_paused: options.isPaused,
|
|
658
|
+
scheduled_at_millis: options.scheduledAtMillis,
|
|
659
|
+
cancel: options.cancel
|
|
660
|
+
});
|
|
661
|
+
return this._emailOutboxCrudToAdmin(response);
|
|
662
|
+
}
|
|
663
|
+
async pauseOutboxEmail(id) {
|
|
664
|
+
return await this.updateOutboxEmail(id, { isPaused: true });
|
|
665
|
+
}
|
|
666
|
+
async unpauseOutboxEmail(id) {
|
|
667
|
+
return await this.updateOutboxEmail(id, { isPaused: false });
|
|
668
|
+
}
|
|
669
|
+
async cancelOutboxEmail(id) {
|
|
670
|
+
return await this.updateOutboxEmail(id, { cancel: true });
|
|
671
|
+
}
|
|
452
672
|
async getStripeAccountInfo() {
|
|
453
673
|
return await this._interface.getStripeAccountInfo();
|
|
454
674
|
}
|
|
675
|
+
async previewAffectedUsersByOnboardingChange(onboarding, limit) {
|
|
676
|
+
const result = await this._interface.previewAffectedUsersByOnboardingChange(
|
|
677
|
+
{ require_email_verification: onboarding.requireEmailVerification },
|
|
678
|
+
limit
|
|
679
|
+
);
|
|
680
|
+
return {
|
|
681
|
+
affectedUsers: result.affected_users.map((u) => ({
|
|
682
|
+
id: u.id,
|
|
683
|
+
displayName: u.display_name,
|
|
684
|
+
primaryEmail: u.primary_email,
|
|
685
|
+
restrictedReason: u.restricted_reason
|
|
686
|
+
})),
|
|
687
|
+
totalAffectedCount: result.total_affected_count
|
|
688
|
+
};
|
|
689
|
+
}
|
|
455
690
|
};
|
|
456
691
|
// Annotate the CommonJS export names for ESM import in node:
|
|
457
692
|
0 && (module.exports = {
|