@marlinjai/mail-sdk 0.13.0 → 0.15.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 +27 -0
- package/dist/index.d.mts +42 -4
- package/dist/index.d.ts +42 -4
- package/dist/index.js +18 -1
- package/dist/index.mjs +18 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -350,11 +350,38 @@ const client = dashboardMail.forUser({ subject: session.subject }); // no worksp
|
|
|
350
350
|
const workspace = await client.workspaces.create({
|
|
351
351
|
slug: 'opuntia',
|
|
352
352
|
name: 'ŌPUNTIA',
|
|
353
|
+
// Required since 0.14.0: every workspace belongs to a company of the shared login.
|
|
354
|
+
company_id: session.companyId,
|
|
353
355
|
owner: { email: session.email, name: session.name },
|
|
354
356
|
});
|
|
355
357
|
// From here on, calls for this workspace pass its id: forUser({ subject, workspaceId: workspace.id }).
|
|
356
358
|
```
|
|
357
359
|
|
|
360
|
+
### Company roles: who is in without an invitation (0.14.0)
|
|
361
|
+
|
|
362
|
+
An owner or admin of a workspace's company is in the workspace without being
|
|
363
|
+
invited. The service never talks to the shared login, so the dashboard tells
|
|
364
|
+
it: before acting for a person, it states that person's owner and admin roles
|
|
365
|
+
in companies, complete, exactly as the verified session reports them.
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
const result = await dashboardMail.forUser({ subject: session.subject }).members.syncCompanyRole({
|
|
369
|
+
email: session.email,
|
|
370
|
+
name: session.name,
|
|
371
|
+
// Every company where the session says owner or admin, and nothing else.
|
|
372
|
+
companies: [{ company_id: 'tenant_opuntia', role: 'owner' }],
|
|
373
|
+
});
|
|
374
|
+
// { granted: [...workspace ids], revoked: [...], unchanged: [...] }
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
The service gives the person a member row in every workspace of those
|
|
378
|
+
companies and takes away every company role the statement does not name, so an
|
|
379
|
+
empty list is how a lost role is reported. Only the dashboard's service token
|
|
380
|
+
may make this call (an API key and every trusted application are refused), it
|
|
381
|
+
takes no `Idempotency-Key`, and the roles must never come from anywhere but
|
|
382
|
+
the verified session: this call is believed because of who sends it. A role
|
|
383
|
+
not confirmed again within `COMPANY_ROLE_MAX_AGE_HOURS` (24) counts as absent.
|
|
384
|
+
|
|
358
385
|
Adding a person to an existing workspace binds them by their auth-brain
|
|
359
386
|
subject, not an email invite (the service never sees a login, so the caller
|
|
360
387
|
resolves the person first):
|
package/dist/index.d.mts
CHANGED
|
@@ -209,6 +209,11 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
209
209
|
subject: string;
|
|
210
210
|
created_at: string;
|
|
211
211
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
212
|
+
source?: "invited" | "company" | undefined;
|
|
213
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
214
|
+
company_checked_at?: string | null | undefined;
|
|
215
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
216
|
+
inherited?: boolean | undefined;
|
|
212
217
|
}[];
|
|
213
218
|
next_cursor: string | null;
|
|
214
219
|
}>;
|
|
@@ -224,6 +229,11 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
224
229
|
subject: string;
|
|
225
230
|
created_at: string;
|
|
226
231
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
232
|
+
source?: "invited" | "company" | undefined;
|
|
233
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
234
|
+
company_checked_at?: string | null | undefined;
|
|
235
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
236
|
+
inherited?: boolean | undefined;
|
|
227
237
|
}>;
|
|
228
238
|
update: (id: string, body: RouteBody<"members.update">, opts?: RequestOpts) => Promise<{
|
|
229
239
|
id: string;
|
|
@@ -232,10 +242,28 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
232
242
|
subject: string;
|
|
233
243
|
created_at: string;
|
|
234
244
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
245
|
+
source?: "invited" | "company" | undefined;
|
|
246
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
247
|
+
company_checked_at?: string | null | undefined;
|
|
248
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
249
|
+
inherited?: boolean | undefined;
|
|
235
250
|
}>;
|
|
236
251
|
remove: (id: string, opts?: RequestOpts) => Promise<{
|
|
237
252
|
ok: true;
|
|
238
253
|
}>;
|
|
254
|
+
/**
|
|
255
|
+
* The dashboard only: states the signed-in person's owner and admin
|
|
256
|
+
* roles in companies, complete, as the shared login's verified session
|
|
257
|
+
* reports them. The service gives the person a member row in every
|
|
258
|
+
* workspace of those companies and takes away every company role not
|
|
259
|
+
* stated. Never send a role that came from anywhere but the verified
|
|
260
|
+
* session.
|
|
261
|
+
*/
|
|
262
|
+
syncCompanyRole: (body: RouteBody<"members.syncCompanyRole">, opts?: RequestOpts) => Promise<{
|
|
263
|
+
unchanged: string[];
|
|
264
|
+
granted: string[];
|
|
265
|
+
revoked: string[];
|
|
266
|
+
}>;
|
|
239
267
|
};
|
|
240
268
|
/**
|
|
241
269
|
* Invitations: an admin invites an address with a role (the token is in
|
|
@@ -245,7 +273,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
245
273
|
invites: {
|
|
246
274
|
create: (body: RouteBody<"invites.create">, opts?: RequestOpts) => Promise<{
|
|
247
275
|
invite: {
|
|
248
|
-
status: "pending" | "
|
|
276
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
249
277
|
id: string;
|
|
250
278
|
email: string;
|
|
251
279
|
created_at: string;
|
|
@@ -262,7 +290,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
262
290
|
}>;
|
|
263
291
|
list: (query?: RouteQuery<"invites.list">, opts?: RequestOpts) => Promise<{
|
|
264
292
|
data: {
|
|
265
|
-
status: "pending" | "
|
|
293
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
266
294
|
id: string;
|
|
267
295
|
email: string;
|
|
268
296
|
created_at: string;
|
|
@@ -278,7 +306,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
278
306
|
next_cursor: string | null;
|
|
279
307
|
}>;
|
|
280
308
|
revoke: (id: string, opts?: RequestOpts) => Promise<{
|
|
281
|
-
status: "pending" | "
|
|
309
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
282
310
|
id: string;
|
|
283
311
|
email: string;
|
|
284
312
|
created_at: string;
|
|
@@ -354,7 +382,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
354
382
|
id: string;
|
|
355
383
|
details: Record<string, unknown>;
|
|
356
384
|
created_at: string;
|
|
357
|
-
action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
|
|
385
|
+
action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.deleted" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
|
|
358
386
|
actor: {
|
|
359
387
|
type: "member";
|
|
360
388
|
subject: string;
|
|
@@ -2343,6 +2371,16 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
2343
2371
|
finished_at: string | null;
|
|
2344
2372
|
pause_reason: string | null;
|
|
2345
2373
|
}>;
|
|
2374
|
+
/**
|
|
2375
|
+
* Deletes a mailing that never started: a draft, or one cancelled before
|
|
2376
|
+
* any send began (`canDeleteMailing` answers for a mailing in hand).
|
|
2377
|
+
* Anything else is `mailing_invalid_state` (409) and nothing is deleted:
|
|
2378
|
+
* unschedule a scheduled mailing first; a mailing that started stays.
|
|
2379
|
+
* Test sends made from it stay in the archive, with `mailing_id` null.
|
|
2380
|
+
*/
|
|
2381
|
+
delete: (id: string, opts?: RequestOpts) => Promise<{
|
|
2382
|
+
ok: true;
|
|
2383
|
+
}>;
|
|
2346
2384
|
retryFailed: (id: string, body?: RouteBody<"mailings.retryFailed">, opts?: RequestOpts) => Promise<{
|
|
2347
2385
|
status: "draft" | "scheduled" | "sending" | "paused" | "sent" | "partially_failed" | "cancelled";
|
|
2348
2386
|
id: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -209,6 +209,11 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
209
209
|
subject: string;
|
|
210
210
|
created_at: string;
|
|
211
211
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
212
|
+
source?: "invited" | "company" | undefined;
|
|
213
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
214
|
+
company_checked_at?: string | null | undefined;
|
|
215
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
216
|
+
inherited?: boolean | undefined;
|
|
212
217
|
}[];
|
|
213
218
|
next_cursor: string | null;
|
|
214
219
|
}>;
|
|
@@ -224,6 +229,11 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
224
229
|
subject: string;
|
|
225
230
|
created_at: string;
|
|
226
231
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
232
|
+
source?: "invited" | "company" | undefined;
|
|
233
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
234
|
+
company_checked_at?: string | null | undefined;
|
|
235
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
236
|
+
inherited?: boolean | undefined;
|
|
227
237
|
}>;
|
|
228
238
|
update: (id: string, body: RouteBody<"members.update">, opts?: RequestOpts) => Promise<{
|
|
229
239
|
id: string;
|
|
@@ -232,10 +242,28 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
232
242
|
subject: string;
|
|
233
243
|
created_at: string;
|
|
234
244
|
role: "owner" | "admin" | "editor" | "viewer";
|
|
245
|
+
source?: "invited" | "company" | undefined;
|
|
246
|
+
company_role?: "owner" | "admin" | null | undefined;
|
|
247
|
+
company_checked_at?: string | null | undefined;
|
|
248
|
+
direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
|
|
249
|
+
inherited?: boolean | undefined;
|
|
235
250
|
}>;
|
|
236
251
|
remove: (id: string, opts?: RequestOpts) => Promise<{
|
|
237
252
|
ok: true;
|
|
238
253
|
}>;
|
|
254
|
+
/**
|
|
255
|
+
* The dashboard only: states the signed-in person's owner and admin
|
|
256
|
+
* roles in companies, complete, as the shared login's verified session
|
|
257
|
+
* reports them. The service gives the person a member row in every
|
|
258
|
+
* workspace of those companies and takes away every company role not
|
|
259
|
+
* stated. Never send a role that came from anywhere but the verified
|
|
260
|
+
* session.
|
|
261
|
+
*/
|
|
262
|
+
syncCompanyRole: (body: RouteBody<"members.syncCompanyRole">, opts?: RequestOpts) => Promise<{
|
|
263
|
+
unchanged: string[];
|
|
264
|
+
granted: string[];
|
|
265
|
+
revoked: string[];
|
|
266
|
+
}>;
|
|
239
267
|
};
|
|
240
268
|
/**
|
|
241
269
|
* Invitations: an admin invites an address with a role (the token is in
|
|
@@ -245,7 +273,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
245
273
|
invites: {
|
|
246
274
|
create: (body: RouteBody<"invites.create">, opts?: RequestOpts) => Promise<{
|
|
247
275
|
invite: {
|
|
248
|
-
status: "pending" | "
|
|
276
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
249
277
|
id: string;
|
|
250
278
|
email: string;
|
|
251
279
|
created_at: string;
|
|
@@ -262,7 +290,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
262
290
|
}>;
|
|
263
291
|
list: (query?: RouteQuery<"invites.list">, opts?: RequestOpts) => Promise<{
|
|
264
292
|
data: {
|
|
265
|
-
status: "pending" | "
|
|
293
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
266
294
|
id: string;
|
|
267
295
|
email: string;
|
|
268
296
|
created_at: string;
|
|
@@ -278,7 +306,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
278
306
|
next_cursor: string | null;
|
|
279
307
|
}>;
|
|
280
308
|
revoke: (id: string, opts?: RequestOpts) => Promise<{
|
|
281
|
-
status: "pending" | "
|
|
309
|
+
status: "pending" | "revoked" | "accepted" | "expired";
|
|
282
310
|
id: string;
|
|
283
311
|
email: string;
|
|
284
312
|
created_at: string;
|
|
@@ -354,7 +382,7 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
354
382
|
id: string;
|
|
355
383
|
details: Record<string, unknown>;
|
|
356
384
|
created_at: string;
|
|
357
|
-
action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
|
|
385
|
+
action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.deleted" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
|
|
358
386
|
actor: {
|
|
359
387
|
type: "member";
|
|
360
388
|
subject: string;
|
|
@@ -2343,6 +2371,16 @@ declare function createNamespaces(config: CoreConfig): {
|
|
|
2343
2371
|
finished_at: string | null;
|
|
2344
2372
|
pause_reason: string | null;
|
|
2345
2373
|
}>;
|
|
2374
|
+
/**
|
|
2375
|
+
* Deletes a mailing that never started: a draft, or one cancelled before
|
|
2376
|
+
* any send began (`canDeleteMailing` answers for a mailing in hand).
|
|
2377
|
+
* Anything else is `mailing_invalid_state` (409) and nothing is deleted:
|
|
2378
|
+
* unschedule a scheduled mailing first; a mailing that started stays.
|
|
2379
|
+
* Test sends made from it stay in the archive, with `mailing_id` null.
|
|
2380
|
+
*/
|
|
2381
|
+
delete: (id: string, opts?: RequestOpts) => Promise<{
|
|
2382
|
+
ok: true;
|
|
2383
|
+
}>;
|
|
2346
2384
|
retryFailed: (id: string, body?: RouteBody<"mailings.retryFailed">, opts?: RequestOpts) => Promise<{
|
|
2347
2385
|
status: "draft" | "scheduled" | "sending" | "paused" | "sent" | "partially_failed" | "cancelled";
|
|
2348
2386
|
id: string;
|
package/dist/index.js
CHANGED
|
@@ -414,7 +414,16 @@ function createNamespaces(config) {
|
|
|
414
414
|
*/
|
|
415
415
|
add: (body, opts) => execute(config, "members.add", { body }, opts),
|
|
416
416
|
update: (id, body, opts) => execute(config, "members.update", { params: { id }, body }, opts),
|
|
417
|
-
remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts)
|
|
417
|
+
remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts),
|
|
418
|
+
/**
|
|
419
|
+
* The dashboard only: states the signed-in person's owner and admin
|
|
420
|
+
* roles in companies, complete, as the shared login's verified session
|
|
421
|
+
* reports them. The service gives the person a member row in every
|
|
422
|
+
* workspace of those companies and takes away every company role not
|
|
423
|
+
* stated. Never send a role that came from anywhere but the verified
|
|
424
|
+
* session.
|
|
425
|
+
*/
|
|
426
|
+
syncCompanyRole: (body, opts) => execute(config, "members.syncCompanyRole", { body }, opts)
|
|
418
427
|
},
|
|
419
428
|
/**
|
|
420
429
|
* Invitations: an admin invites an address with a role (the token is in
|
|
@@ -570,6 +579,14 @@ function createNamespaces(config) {
|
|
|
570
579
|
pause: (id, opts) => execute(config, "mailings.pause", { params: { id }, body: {} }, opts),
|
|
571
580
|
resume: (id, opts) => execute(config, "mailings.resume", { params: { id }, body: {} }, opts),
|
|
572
581
|
cancel: (id, opts) => execute(config, "mailings.cancel", { params: { id }, body: {} }, opts),
|
|
582
|
+
/**
|
|
583
|
+
* Deletes a mailing that never started: a draft, or one cancelled before
|
|
584
|
+
* any send began (`canDeleteMailing` answers for a mailing in hand).
|
|
585
|
+
* Anything else is `mailing_invalid_state` (409) and nothing is deleted:
|
|
586
|
+
* unschedule a scheduled mailing first; a mailing that started stays.
|
|
587
|
+
* Test sends made from it stay in the archive, with `mailing_id` null.
|
|
588
|
+
*/
|
|
589
|
+
delete: (id, opts) => execute(config, "mailings.delete", { params: { id } }, opts),
|
|
573
590
|
retryFailed: (id, body = {}, opts) => execute(config, "mailings.retryFailed", { params: { id }, body }, opts),
|
|
574
591
|
duplicate: (id, opts) => execute(config, "mailings.duplicate", { params: { id }, body: {} }, opts),
|
|
575
592
|
// S4: scheduling, segments and A/B testing
|
package/dist/index.mjs
CHANGED
|
@@ -398,7 +398,16 @@ function createNamespaces(config) {
|
|
|
398
398
|
*/
|
|
399
399
|
add: (body, opts) => execute(config, "members.add", { body }, opts),
|
|
400
400
|
update: (id, body, opts) => execute(config, "members.update", { params: { id }, body }, opts),
|
|
401
|
-
remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts)
|
|
401
|
+
remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts),
|
|
402
|
+
/**
|
|
403
|
+
* The dashboard only: states the signed-in person's owner and admin
|
|
404
|
+
* roles in companies, complete, as the shared login's verified session
|
|
405
|
+
* reports them. The service gives the person a member row in every
|
|
406
|
+
* workspace of those companies and takes away every company role not
|
|
407
|
+
* stated. Never send a role that came from anywhere but the verified
|
|
408
|
+
* session.
|
|
409
|
+
*/
|
|
410
|
+
syncCompanyRole: (body, opts) => execute(config, "members.syncCompanyRole", { body }, opts)
|
|
402
411
|
},
|
|
403
412
|
/**
|
|
404
413
|
* Invitations: an admin invites an address with a role (the token is in
|
|
@@ -554,6 +563,14 @@ function createNamespaces(config) {
|
|
|
554
563
|
pause: (id, opts) => execute(config, "mailings.pause", { params: { id }, body: {} }, opts),
|
|
555
564
|
resume: (id, opts) => execute(config, "mailings.resume", { params: { id }, body: {} }, opts),
|
|
556
565
|
cancel: (id, opts) => execute(config, "mailings.cancel", { params: { id }, body: {} }, opts),
|
|
566
|
+
/**
|
|
567
|
+
* Deletes a mailing that never started: a draft, or one cancelled before
|
|
568
|
+
* any send began (`canDeleteMailing` answers for a mailing in hand).
|
|
569
|
+
* Anything else is `mailing_invalid_state` (409) and nothing is deleted:
|
|
570
|
+
* unschedule a scheduled mailing first; a mailing that started stays.
|
|
571
|
+
* Test sends made from it stay in the archive, with `mailing_id` null.
|
|
572
|
+
*/
|
|
573
|
+
delete: (id, opts) => execute(config, "mailings.delete", { params: { id } }, opts),
|
|
557
574
|
retryFailed: (id, body = {}, opts) => execute(config, "mailings.retryFailed", { params: { id }, body }, opts),
|
|
558
575
|
duplicate: (id, opts) => execute(config, "mailings.duplicate", { params: { id }, body: {} }, opts),
|
|
559
576
|
// S4: scheduling, segments and A/B testing
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.15.0",
|
|
7
7
|
"description": "Typed client for the Lumitra Mail v1 API: Node and edge runtimes, retries with idempotency, cursor pagination, webhook verification",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"LICENSE"
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@marlinjai/mail-contract": "^0.
|
|
35
|
+
"@marlinjai/mail-contract": "^0.15.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"zod": "^3.25.0"
|