@whooshbang/sdk 7.0.0 → 7.2.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/dist/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { validateWhoAmI, validateOperatorCollection, validateOperatorResolution, validateCreateOperatorMessageRequest, validateOperatorMessageResult, validateOperatorBroadcast, validateOperatorPreferences, validateOperatorConnectRequest, } from "@whooshbang/contracts";
2
2
  import { validateAssertEmailConsentRequest, validateBindingSummary, } from "@whooshbang/contracts";
3
- import { contractValidationErrors, validateOrganizationCredential, validateOrganizationCredentialCollection, validateOrganizationCredentialRotation, validateOrganizationCredentialSecretReveal, validateBillingProjectSlots, validateBillingPromotions, validateBillingPromotion, validateRedeemBillingPromotionRequest, validateAssignBillingProjectSlotsRequest, validateSubscriptionChange, validateConfirmSubscriptionChangeRequest, validateBillingEntitlements, validateSubscriptionSelection, validateProjectAttribution, validateUpdateProjectAttributionRequest, validateAutoTopUpSettings, validateUpdateAutoTopUpSettingsRequest, validateBillingAccount, validateCardSetup, validateCreateCreditPurchaseRequest, validateCreditPurchase, validateBillingInvoiceCollection, validateUpdateBillingReceiptEmailRequest, validateOrganizationProjection, validateApiCredential, validateApiCredentialCollection, validateApiCredentialRotation, validateApiCredentialSecretReveal, validateAttachNotifierConnectionRequest, validateChannelConnection, validateChannelConnectionCollection, validateConnectionProviderCollection, validateUsageReport, validateMessageListPage, validateMessageDeliveryHistory, validateMessageNotificationImage, validateInteractionTimeline, validateUpdateEmailSenderRequest, validateCustomerEventDeliveryHistory, validateCustomerEventDeliveryAttempt, validateDeliveryHolds, validateMachineClientOperationsList, validateRecipientCopyCatalogue, validateNotifierConnectionCollection, validateProjectRecipientExperience, validateRecipientBrandLogoUpload, validateNotificationImageAsset, validateUpdateProjectRecipientExperienceRequest, validateEnvironmentRecipientExperience, validateUpdateEnvironmentRecipientExperienceRequest, validateSubscriberChannelSettings, validateAcknowledgeEmailRemediationRequest, validateCreateRecipientSessionRequest, validateCreateRecipientSessionResponse, validateRecipientSession, validateCreateProviderHandoffRequest, validateProviderHandoff, validateSetPreferredBindingRequest, validatePreferredBinding, validateCreateSubscriberRequest, validateSubscriber, validateSubscriberDataExport, validateUpdateSubscriberRequest, validateSubscriberCollection, validateCloseOrganizationRequest, validateInviteTeammateRequest, validateTeammate, validateTeammateAccessRequest, validateTeammateCollection, validateOrganizationClosureResult, validateCreateSubscriberGroupRequest, validateUpdateSubscriberGroupRequest, validateSubscriberGroup, validateSubscriberGroupCollection, validateSubscriberGroupMembership, validateSubscriberGroupMembershipCollection, validateCreateGroupBroadcastRequest, validateGroupBroadcast, validateCreateOrganizationCredentialRequest, validateCreateApiCredentialRequest, validateCreateChannelConnectionRequest, validateCreateCustomerEndpointRequest, validateCreateMachineClientRequest, validateCreateMessageRequest, validateCancelEscalationByKeyRequest, validateEscalationPathPreview, validateEscalationOrder, validateEscalationOrderCollection, validateSaveEscalationOrderRequest, validateQuietHours, validateSaveQuietHoursRequest, validateSetDigestPreferenceRequest, validateSetSubscriberDigestSettingRequest, validateSubscriberDigestSettings, validateEscalationPolicy, validateEscalationPolicyCollection, validateEscalationLimits, validateUpdateEscalationLimitsRequest, validateEscalationPagingLimitReport, validateUpdateEscalationPolicyRequest, validateCancelEscalationRequest, validateEscalation, validateMessageCategory, validateMessageCategoryCollection, validateCreateMessageCategoryRequest, validateUpdateMessageCategoryRequest, validateSubscriberCategoryPreference, validateSubscriberCategoryPreferenceCollection, validateSetSubscriberCategoryPreferenceRequest, validateCreateProjectRequest, validateUpdateProjectRequest, validateCreateSubscriptionLinkRequest, validateCustomerEndpoint, validateCustomerEndpointAttemptCollection, validateCustomerEndpointCollection, validateCustomerEndpointMutationResult, validateInteractionSummary, validateMachineClient, validateMachineCredential, validateMachineEventAckRequest, validateMachineEventAckResponse, validateMachineEventPollResponse, validateMessage, validateProblem, validateProject, validateProjectCollection, validateRecipientCopyOverride, validateRecipientCopyOverrideCollection, validateProviderCapabilitiesCollection, validateProviderInstallationCollection, validateEmailDomainCollection, validateCreateEmailDomainRequest, validateRegisterMachineCredentialRequest, validateRotateOrganizationCredentialRequest, validateRotateApiCredentialRequest, validateConnectionTest, validateConnectionTestCollection, validateCreateConnectionTestRequest, validateCustomerApplicationManifest, validateRotateChannelConnectionCredentialRequest, validateRotateCustomerEndpointRequest, validateSubscriptionLink, validateUpdateChannelConnectionRequest, validateUpdateRecipientCopyOverrideRequest, } from "@whooshbang/contracts";
3
+ import { contractValidationErrors, validateOrganizationCredential, validateOrganizationCredentialCollection, validateOrganizationCredentialRotation, validateOrganizationCredentialSecretReveal, validateBillingProjectSlots, validateBillingPromotions, validateBillingPromotion, validateRedeemBillingPromotionRequest, validateAssignBillingProjectSlotsRequest, validateSubscriptionChange, validateConfirmSubscriptionChangeRequest, validateBillingEntitlements, validateSubscriptionSelection, validateProjectAttribution, validateUpdateProjectAttributionRequest, validateAutoTopUpSettings, validateUpdateAutoTopUpSettingsRequest, validateBillingAccount, validateCardSetup, validateCreateCreditPurchaseRequest, validateCreditPurchase, validateBillingInvoiceCollection, validateUpdateBillingReceiptEmailRequest, validateOrganizationProjection, validateApiCredential, validateApiCredentialCollection, validateApiCredentialRotation, validateApiCredentialSecretReveal, validateAttachNotifierConnectionRequest, validateChannelConnection, validateChannelConnectionCollection, validateConnectionProviderCollection, validateUsageReport, validateMessageListPage, validateMessageDeliveryHistory, validateMessageNotificationImage, validateInteractionTimeline, validateUpdateEmailSenderRequest, validateCustomerEventDeliveryHistory, validateCustomerEventDeliveryAttempt, validateDeliveryHolds, validateMachineClientOperationsList, validateRecipientCopyCatalogue, validateNotifierConnectionCollection, validateProjectRecipientExperience, validateRecipientBrandLogoUpload, validateNotificationImageAsset, validateUpdateProjectRecipientExperienceRequest, validateEnvironmentRecipientExperience, validateUpdateEnvironmentRecipientExperienceRequest, validateSubscriberChannelSettings, validateAcknowledgeEmailRemediationRequest, validateCreateRecipientSessionRequest, validateCreateRecipientSessionResponse, validateRecipientSession, validateCreateProviderHandoffRequest, validateProviderHandoff, validateSetPreferredBindingRequest, validatePreferredBinding, validateCreateSubscriberRequest, validateIdentifySubscriberRequest, validateBatchIdentifySubscriberRequest, validateSubscriberLifecycleRequest, validateSubscriberSyncResult, validateBatchIdentifySubscriberResult, validateSubscriber, validateSubscriberDataExport, validateUpdateSubscriberRequest, validateSubscriberCollection, validateCloseOrganizationRequest, validateInviteTeammateRequest, validateTeammate, validateTeammateAccessRequest, validateTeammateCollection, validateOrganizationClosureResult, validateCreateSubscriberGroupRequest, validateUpdateSubscriberGroupRequest, validateSubscriberGroup, validateSubscriberGroupCollection, validateSubscriberGroupMembership, validateSubscriberGroupMembershipCollection, validateCreateGroupBroadcastRequest, validateGroupBroadcast, validateCreateOrganizationCredentialRequest, validateCreateApiCredentialRequest, validateCreateChannelConnectionRequest, validateCreateCustomerEndpointRequest, validateCreateMachineClientRequest, validateCreateMessageRequest, validateCancelEscalationByKeyRequest, validateEscalationPathPreview, validateEscalationOrder, validateEscalationOrderCollection, validateSaveEscalationOrderRequest, validateQuietHours, validateSaveQuietHoursRequest, validateSetDigestPreferenceRequest, validateSetSubscriberDigestSettingRequest, validateSubscriberDigestSettings, validateEscalationPolicy, validateEscalationPolicyCollection, validateEscalationLimits, validateUpdateEscalationLimitsRequest, validateEscalationPagingLimitReport, validateUpdateEscalationPolicyRequest, validateCancelEscalationRequest, validateEscalation, validateMessageCategory, validateMessageCategoryCollection, validateCreateMessageCategoryRequest, validateUpdateMessageCategoryRequest, validateSubscriberCategoryPreference, validateSubscriberCategoryPreferenceCollection, validateSetSubscriberCategoryPreferenceRequest, validateCreateProjectRequest, validateUpdateProjectRequest, validateCreateSubscriptionLinkRequest, validateCustomerEndpoint, validateCustomerEndpointAttemptCollection, validateCustomerEndpointCollection, validateCustomerEndpointMutationResult, validateInteractionSummary, validateMachineClient, validateMachineCredential, validateMachineEventAckRequest, validateMachineEventAckResponse, validateMachineEventPollResponse, validateMessage, validateProblem, validateProject, validateProjectCollection, validateRecipientCopyOverride, validateRecipientCopyOverrideCollection, validateProviderCapabilitiesCollection, validateProviderInstallationCollection, validateEmailDomainCollection, validateCreateEmailDomainRequest, validateRegisterMachineCredentialRequest, validateRotateOrganizationCredentialRequest, validateRotateApiCredentialRequest, validateConnectionTest, validateConnectionTestCollection, validateCreateConnectionTestRequest, validateCustomerApplicationManifest, validateRotateChannelConnectionCredentialRequest, validateRotateCustomerEndpointRequest, validateSubscriptionLink, validateUpdateChannelConnectionRequest, validateUpdateRecipientCopyOverrideRequest, } from "@whooshbang/contracts";
4
4
  import { validateAdditiveCompatible } from "./additive-compatibility.js";
5
5
  import { WhooshBangContractError, WhooshBangOutcomeUnknownError, WhooshBangProblemError, WhooshBangProtocolError, WhooshBangTransportError, WhooshBangValidationError, validationError, } from "./errors.js";
6
6
  import { interactionAnswer } from "./interactions.js";
@@ -80,6 +80,45 @@ function usageQuery(operation, options) {
80
80
  return search.size === 0 ? "" : `?${search.toString()}`;
81
81
  }
82
82
  const templateRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
83
+ function validateAuthoredTemplate(value) {
84
+ return (validateTemplateCatalogEntry(value) &&
85
+ Number.isSafeInteger(value.draftVersion));
86
+ }
87
+ function validatePublishedRevision(value) {
88
+ return (templateRecord(value) &&
89
+ Number.isSafeInteger(value.revision) &&
90
+ templateRecord(value.definition) &&
91
+ typeof value.publishedAt === "string");
92
+ }
93
+ function validateRevisionCollection(value) {
94
+ return (templateRecord(value) &&
95
+ Array.isArray(value.items) &&
96
+ value.items.every((item) => validatePublishedRevision(item)));
97
+ }
98
+ function validateTemplatePreview(value) {
99
+ return (templateRecord(value) &&
100
+ typeof value.channel === "string" &&
101
+ templateRecord(value.normalizedInput) &&
102
+ typeof value.templateLocale === "string");
103
+ }
104
+ function validateEmailLayout(value) {
105
+ return (templateRecord(value) &&
106
+ typeof value.id === "string" &&
107
+ typeof value.name === "string" &&
108
+ typeof value.isDefault === "boolean" &&
109
+ typeof value.disabled === "boolean" &&
110
+ templateRecord(value.draft) &&
111
+ Number.isSafeInteger(value.draftVersion) &&
112
+ Number.isSafeInteger(value.latestPublishedRevision));
113
+ }
114
+ function validateEmailLayoutCollection(value) {
115
+ return (templateRecord(value) &&
116
+ Array.isArray(value.items) &&
117
+ value.items.every((item) => validateEmailLayout(item)));
118
+ }
119
+ function validateDefaultLayout(value) {
120
+ return templateRecord(value) && typeof value.default_layout_id === "string";
121
+ }
83
122
  function validateTemplateCatalog(value) {
84
123
  return (templateRecord(value) &&
85
124
  Array.isArray(value.items) &&
@@ -1477,6 +1516,202 @@ export class WhooshBangClient {
1477
1516
  strictResponse: true,
1478
1517
  });
1479
1518
  }
1519
+ /** The template as its author sees it, including the editable draft. */
1520
+ async getMessageTemplateForAuthoring(projectId, reference, options = {}) {
1521
+ const operation = "getMessageTemplate";
1522
+ return this.#request({
1523
+ method: "GET",
1524
+ operation,
1525
+ options,
1526
+ sideEffect: false,
1527
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, reference, "reference")}`,
1528
+ validator: validateAuthoredTemplate,
1529
+ });
1530
+ }
1531
+ /** Every template, drafts and disabled ones included, for authoring. */
1532
+ async listMessageTemplatesForAuthoring(projectId, query = {}, options = {}) {
1533
+ const operation = "listMessageTemplates";
1534
+ const params = new URLSearchParams();
1535
+ if (query.search !== undefined)
1536
+ params.set("search", query.search);
1537
+ if (query.category !== undefined)
1538
+ params.set("category", query.category);
1539
+ if (query.after !== undefined)
1540
+ params.set("after", query.after);
1541
+ if (query.limit !== undefined)
1542
+ params.set("limit", String(query.limit));
1543
+ if (query.page !== undefined)
1544
+ params.set("page", String(query.page));
1545
+ const suffix = params.size === 0 ? "" : `?${params}`;
1546
+ return this.#request({
1547
+ method: "GET",
1548
+ operation,
1549
+ options,
1550
+ sideEffect: false,
1551
+ path: `${templateRoot(operation, projectId)}${suffix}`,
1552
+ validator: (value) => validateTemplateCatalog(value) &&
1553
+ value.items.every((item) => validateAuthoredTemplate(item)),
1554
+ });
1555
+ }
1556
+ async createMessageTemplate(projectId, request, options = {}) {
1557
+ const operation = "createMessageTemplate";
1558
+ return this.#request({
1559
+ body: request,
1560
+ method: "POST",
1561
+ operation,
1562
+ options,
1563
+ sideEffect: true,
1564
+ path: templateRoot(operation, projectId),
1565
+ validator: validateAuthoredTemplate,
1566
+ });
1567
+ }
1568
+ /** Renames, recategorises, disables or re-enables a template. */
1569
+ async updateMessageTemplate(projectId, templateId, request, options = {}) {
1570
+ const operation = "updateMessageTemplateMetadata";
1571
+ return this.#request({
1572
+ body: request,
1573
+ method: "PATCH",
1574
+ operation,
1575
+ options,
1576
+ sideEffect: true,
1577
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, templateId, "templateId")}`,
1578
+ validator: validateAuthoredTemplate,
1579
+ });
1580
+ }
1581
+ /** Replaces the draft. `draftVersion` is the version last read; a newer save refuses this one. */
1582
+ async saveMessageTemplateDraft(projectId, templateId, draftVersion, definition, options = {}) {
1583
+ const operation = "saveMessageTemplateDraft";
1584
+ return this.#request({
1585
+ body: { draft_version: draftVersion, definition },
1586
+ method: "PUT",
1587
+ operation,
1588
+ options,
1589
+ sideEffect: true,
1590
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, templateId, "templateId")}/draft`,
1591
+ validator: validateAuthoredTemplate,
1592
+ });
1593
+ }
1594
+ /** Validates the draft completely and publishes it as the next revision. */
1595
+ async publishMessageTemplate(projectId, templateId, draftVersion, options = {}) {
1596
+ const operation = "publishMessageTemplate";
1597
+ return this.#request({
1598
+ body: { draft_version: draftVersion },
1599
+ method: "POST",
1600
+ operation,
1601
+ options,
1602
+ sideEffect: true,
1603
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, templateId, "templateId")}/publish`,
1604
+ validator: validatePublishedRevision,
1605
+ });
1606
+ }
1607
+ async listMessageTemplateRevisions(projectId, templateId, options = {}) {
1608
+ const operation = "listMessageTemplateRevisions";
1609
+ return this.#request({
1610
+ method: "GET",
1611
+ operation,
1612
+ options,
1613
+ sideEffect: false,
1614
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, templateId, "templateId")}/revisions`,
1615
+ validator: validateRevisionCollection,
1616
+ });
1617
+ }
1618
+ /** Renders the draft, a revision or an unsaved definition. Nothing is sent. */
1619
+ async previewMessageTemplate(projectId, templateId, request, options = {}) {
1620
+ const operation = "previewMessageTemplate";
1621
+ return this.#request({
1622
+ body: request,
1623
+ method: "POST",
1624
+ operation,
1625
+ options,
1626
+ sideEffect: false,
1627
+ path: `${templateRoot(operation, projectId)}/${pathSegment(operation, templateId, "templateId")}/preview`,
1628
+ validator: validateTemplatePreview,
1629
+ });
1630
+ }
1631
+ /** Sends the exact draft to one subscriber as a test. It never publishes. */
1632
+ async testSendMessageTemplateDraft(projectId, environmentId, templateId, request, options = {}) {
1633
+ const operation = "testSendMessageTemplateDraft";
1634
+ return this.#request({
1635
+ body: request,
1636
+ method: "POST",
1637
+ operation,
1638
+ options,
1639
+ idempotencyKey: options.idempotencyKey,
1640
+ sideEffect: true,
1641
+ path: `${environmentRoot(operation, projectId, environmentId)}/message-templates/${pathSegment(operation, templateId, "templateId")}/test-send`,
1642
+ validator: validateTemplateMessageSendResult,
1643
+ });
1644
+ }
1645
+ async listEmailLayouts(projectId, options = {}) {
1646
+ const operation = "listEmailLayouts";
1647
+ return this.#request({
1648
+ method: "GET",
1649
+ operation,
1650
+ options,
1651
+ sideEffect: false,
1652
+ path: layoutRoot(operation, projectId),
1653
+ validator: validateEmailLayoutCollection,
1654
+ });
1655
+ }
1656
+ async getEmailLayout(projectId, layoutId, options = {}) {
1657
+ const operation = "getEmailLayout";
1658
+ return this.#request({
1659
+ method: "GET",
1660
+ operation,
1661
+ options,
1662
+ sideEffect: false,
1663
+ path: `${layoutRoot(operation, projectId)}/${pathSegment(operation, layoutId, "layoutId")}`,
1664
+ validator: validateEmailLayout,
1665
+ });
1666
+ }
1667
+ async createEmailLayout(projectId, request, options = {}) {
1668
+ const operation = "createEmailLayout";
1669
+ return this.#request({
1670
+ body: request,
1671
+ method: "POST",
1672
+ operation,
1673
+ options,
1674
+ sideEffect: true,
1675
+ path: layoutRoot(operation, projectId),
1676
+ validator: validateEmailLayout,
1677
+ });
1678
+ }
1679
+ async saveEmailLayoutDraft(projectId, layoutId, draftVersion, definition, options = {}) {
1680
+ const operation = "saveEmailLayoutDraft";
1681
+ return this.#request({
1682
+ body: { draft_version: draftVersion, definition },
1683
+ method: "PUT",
1684
+ operation,
1685
+ options,
1686
+ sideEffect: true,
1687
+ path: `${layoutRoot(operation, projectId)}/${pathSegment(operation, layoutId, "layoutId")}/draft`,
1688
+ validator: validateEmailLayout,
1689
+ });
1690
+ }
1691
+ async publishEmailLayout(projectId, layoutId, draftVersion, options = {}) {
1692
+ const operation = "publishEmailLayout";
1693
+ return this.#request({
1694
+ body: { draft_version: draftVersion },
1695
+ method: "POST",
1696
+ operation,
1697
+ options,
1698
+ sideEffect: true,
1699
+ path: `${layoutRoot(operation, projectId)}/${pathSegment(operation, layoutId, "layoutId")}/publish`,
1700
+ validator: validatePublishedRevision,
1701
+ });
1702
+ }
1703
+ /** Makes a published layout the project's default for email templates. */
1704
+ async setDefaultEmailLayout(projectId, layoutId, options = {}) {
1705
+ const operation = "setDefaultEmailLayout";
1706
+ return this.#request({
1707
+ method: "POST",
1708
+ operation,
1709
+ options,
1710
+ sideEffect: true,
1711
+ path: `${layoutRoot(operation, projectId)}/${pathSegment(operation, layoutId, "layoutId")}/default`,
1712
+ validator: validateDefaultLayout,
1713
+ });
1714
+ }
1480
1715
  async createMessageCategory(projectId, request, options = {}) {
1481
1716
  const operation = "createMessageCategory";
1482
1717
  assertInput(operation, request, validateCreateMessageCategoryRequest);
@@ -1830,6 +2065,73 @@ export class WhooshBangClient {
1830
2065
  validator: validateBindingSummary,
1831
2066
  });
1832
2067
  }
2068
+ async identifySubscriber(externalId, request, options = {}) {
2069
+ return this.#identifySubscriber("identifySubscriber", "v1", externalId, request, options);
2070
+ }
2071
+ async identifySubscriberInEnvironment(projectId, environmentId, externalId, request, options = {}) {
2072
+ const operation = "identifySubscriberInEnvironment";
2073
+ return this.#identifySubscriber(operation, environmentRoot(operation, projectId, environmentId), externalId, request, options);
2074
+ }
2075
+ async #identifySubscriber(operation, root, externalId, request, options) {
2076
+ assertInput(operation, request, validateIdentifySubscriberRequest);
2077
+ return this.#request({
2078
+ body: request,
2079
+ idempotencyKey: options.idempotencyKey,
2080
+ method: "PUT",
2081
+ operation,
2082
+ options,
2083
+ path: `${root}/subscribers/${pathSegment(operation, externalId, "externalId")}`,
2084
+ sideEffect: true,
2085
+ validator: validateSubscriberSyncResult,
2086
+ });
2087
+ }
2088
+ async identifySubscribers(request, options = {}) {
2089
+ return this.#identifySubscribers("identifySubscribers", "v1", request, options);
2090
+ }
2091
+ async identifySubscribersInEnvironment(projectId, environmentId, request, options = {}) {
2092
+ const operation = "identifySubscribersInEnvironment";
2093
+ return this.#identifySubscribers(operation, environmentRoot(operation, projectId, environmentId), request, options);
2094
+ }
2095
+ async #identifySubscribers(operation, root, request, options) {
2096
+ assertInput(operation, request, validateBatchIdentifySubscriberRequest);
2097
+ return this.#request({
2098
+ body: request,
2099
+ idempotencyKey: options.idempotencyKey,
2100
+ method: "PUT",
2101
+ operation,
2102
+ options,
2103
+ path: `${root}/subscribers/batch-identify`,
2104
+ sideEffect: true,
2105
+ validator: validateBatchIdentifySubscriberResult,
2106
+ });
2107
+ }
2108
+ async deactivateSubscriber(externalId, request, options = {}) {
2109
+ return this.#subscriberLifecycle("deactivateSubscriber", "v1", externalId, request, "POST", "/deactivate", options);
2110
+ }
2111
+ async deactivateSubscriberInEnvironment(projectId, environmentId, externalId, request, options = {}) {
2112
+ const operation = "deactivateSubscriberInEnvironment";
2113
+ return this.#subscriberLifecycle(operation, environmentRoot(operation, projectId, environmentId), externalId, request, "POST", "/deactivate", options);
2114
+ }
2115
+ async deleteSubscriber(externalId, request, options = {}) {
2116
+ return this.#subscriberLifecycle("deleteSubscriber", "v1", externalId, request, "DELETE", "", options);
2117
+ }
2118
+ async deleteSubscriberInEnvironment(projectId, environmentId, externalId, request, options = {}) {
2119
+ const operation = "deleteSubscriberInEnvironment";
2120
+ return this.#subscriberLifecycle(operation, environmentRoot(operation, projectId, environmentId), externalId, request, "DELETE", "", options);
2121
+ }
2122
+ async #subscriberLifecycle(operation, root, externalId, request, method, suffix, options) {
2123
+ assertInput(operation, request, validateSubscriberLifecycleRequest);
2124
+ return this.#request({
2125
+ body: request,
2126
+ idempotencyKey: options.idempotencyKey,
2127
+ method,
2128
+ operation,
2129
+ options,
2130
+ path: `${root}/subscribers/${pathSegment(operation, externalId, "externalId")}${suffix}`,
2131
+ sideEffect: true,
2132
+ validator: validateSubscriberSyncResult,
2133
+ });
2134
+ }
1833
2135
  async createSubscriber(request, options = {}) {
1834
2136
  return this.#createSubscriber("createSubscriber", "v1", request, options);
1835
2137
  }
@@ -4257,6 +4559,12 @@ function environmentRoot(operation, projectId, environmentId) {
4257
4559
  const environment = pathSegment(operation, environmentId, "environmentId");
4258
4560
  return `v1/projects/${project}/environments/${environment}`;
4259
4561
  }
4562
+ function templateRoot(operation, projectId) {
4563
+ return `v1/projects/${pathSegment(operation, projectId, "projectId")}/message-templates`;
4564
+ }
4565
+ function layoutRoot(operation, projectId) {
4566
+ return `v1/projects/${pathSegment(operation, projectId, "projectId")}/email-layouts`;
4567
+ }
4260
4568
  function subscriberGroupPath(operation, root, groupKey) {
4261
4569
  return `${root}/subscriber-groups/${pathSegment(operation, groupKey, "groupKey")}`;
4262
4570
  }