@endora-commerce/mod-newsletter 0.100.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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/admin/api/newsletter-client.d.ts +64 -0
- package/dist/admin/api/newsletter-client.d.ts.map +1 -0
- package/dist/admin/api/newsletter-client.js +71 -0
- package/dist/admin/api/newsletter-client.js.map +1 -0
- package/dist/admin/email-variables.d.ts +21 -0
- package/dist/admin/email-variables.d.ts.map +1 -0
- package/dist/admin/email-variables.js +48 -0
- package/dist/admin/email-variables.js.map +1 -0
- package/dist/admin/index.d.ts +44 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +149 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/AutomationBuilder.d.ts +8 -0
- package/dist/admin/pages/AutomationBuilder.d.ts.map +1 -0
- package/dist/admin/pages/AutomationBuilder.js +131 -0
- package/dist/admin/pages/AutomationBuilder.js.map +1 -0
- package/dist/admin/pages/AutomationsPage.d.ts +8 -0
- package/dist/admin/pages/AutomationsPage.d.ts.map +1 -0
- package/dist/admin/pages/AutomationsPage.js +43 -0
- package/dist/admin/pages/AutomationsPage.js.map +1 -0
- package/dist/admin/pages/BlocksPage.d.ts +8 -0
- package/dist/admin/pages/BlocksPage.d.ts.map +1 -0
- package/dist/admin/pages/BlocksPage.js +110 -0
- package/dist/admin/pages/BlocksPage.js.map +1 -0
- package/dist/admin/pages/CampaignEditor.d.ts +8 -0
- package/dist/admin/pages/CampaignEditor.d.ts.map +1 -0
- package/dist/admin/pages/CampaignEditor.js +144 -0
- package/dist/admin/pages/CampaignEditor.js.map +1 -0
- package/dist/admin/pages/CampaignStats.d.ts +8 -0
- package/dist/admin/pages/CampaignStats.d.ts.map +1 -0
- package/dist/admin/pages/CampaignStats.js +45 -0
- package/dist/admin/pages/CampaignStats.js.map +1 -0
- package/dist/admin/pages/CampaignsPage.d.ts +8 -0
- package/dist/admin/pages/CampaignsPage.d.ts.map +1 -0
- package/dist/admin/pages/CampaignsPage.js +28 -0
- package/dist/admin/pages/CampaignsPage.js.map +1 -0
- package/dist/admin/pages/ProviderSettingsPage.d.ts +8 -0
- package/dist/admin/pages/ProviderSettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/ProviderSettingsPage.js +64 -0
- package/dist/admin/pages/ProviderSettingsPage.js.map +1 -0
- package/dist/admin/pages/SubscribersPage.d.ts +8 -0
- package/dist/admin/pages/SubscribersPage.d.ts.map +1 -0
- package/dist/admin/pages/SubscribersPage.js +55 -0
- package/dist/admin/pages/SubscribersPage.js.map +1 -0
- package/dist/admin/pages/TagsPage.d.ts +8 -0
- package/dist/admin/pages/TagsPage.d.ts.map +1 -0
- package/dist/admin/pages/TagsPage.js +114 -0
- package/dist/admin/pages/TagsPage.js.map +1 -0
- package/dist/backend/entities/newsletter-automation-run.entity.d.ts +19 -0
- package/dist/backend/entities/newsletter-automation-run.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-automation-run.entity.js +72 -0
- package/dist/backend/entities/newsletter-automation-run.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-automation.entity.d.ts +22 -0
- package/dist/backend/entities/newsletter-automation.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-automation.entity.js +86 -0
- package/dist/backend/entities/newsletter-automation.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts +6 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.js +30 -0
- package/dist/backend/entities/newsletter-campaign-subscriber.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-campaign.entity.d.ts +22 -0
- package/dist/backend/entities/newsletter-campaign.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-campaign.entity.js +102 -0
- package/dist/backend/entities/newsletter-campaign.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-custom-field.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-custom-field.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-custom-field.entity.js +53 -0
- package/dist/backend/entities/newsletter-custom-field.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts +7 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js +35 -0
- package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-email-block.entity.d.ts +21 -0
- package/dist/backend/entities/newsletter-email-block.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-email-block.entity.js +78 -0
- package/dist/backend/entities/newsletter-email-block.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.js +54 -0
- package/dist/backend/entities/newsletter-engagement-event.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-send-record.entity.d.ts +23 -0
- package/dist/backend/entities/newsletter-send-record.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-send-record.entity.js +89 -0
- package/dist/backend/entities/newsletter-send-record.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts +6 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.js +31 -0
- package/dist/backend/entities/newsletter-subscriber-tag.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-subscriber.entity.d.ts +63 -0
- package/dist/backend/entities/newsletter-subscriber.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-subscriber.entity.js +147 -0
- package/dist/backend/entities/newsletter-subscriber.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-suppression.entity.d.ts +14 -0
- package/dist/backend/entities/newsletter-suppression.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-suppression.entity.js +51 -0
- package/dist/backend/entities/newsletter-suppression.entity.js.map +1 -0
- package/dist/backend/entities/newsletter-tag.entity.d.ts +12 -0
- package/dist/backend/entities/newsletter-tag.entity.d.ts.map +1 -0
- package/dist/backend/entities/newsletter-tag.entity.js +53 -0
- package/dist/backend/entities/newsletter-tag.entity.js.map +1 -0
- package/dist/backend/index.d.ts +120 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +139 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +114 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +171 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +27 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +118 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.self.d.ts +15 -0
- package/dist/backend/routes.self.d.ts.map +1 -0
- package/dist/backend/routes.self.js +28 -0
- package/dist/backend/routes.self.js.map +1 -0
- package/dist/backend/routes.storefront.d.ts +24 -0
- package/dist/backend/routes.storefront.d.ts.map +1 -0
- package/dist/backend/routes.storefront.js +79 -0
- package/dist/backend/routes.storefront.js.map +1 -0
- package/dist/backend/services/audience-resolver.d.ts +20 -0
- package/dist/backend/services/audience-resolver.d.ts.map +1 -0
- package/dist/backend/services/audience-resolver.js +41 -0
- package/dist/backend/services/audience-resolver.js.map +1 -0
- package/dist/backend/services/automation.service.d.ts +58 -0
- package/dist/backend/services/automation.service.d.ts.map +1 -0
- package/dist/backend/services/automation.service.js +301 -0
- package/dist/backend/services/automation.service.js.map +1 -0
- package/dist/backend/services/campaign-dispatch.service.d.ts +50 -0
- package/dist/backend/services/campaign-dispatch.service.d.ts.map +1 -0
- package/dist/backend/services/campaign-dispatch.service.js +130 -0
- package/dist/backend/services/campaign-dispatch.service.js.map +1 -0
- package/dist/backend/services/campaign.service.d.ts +40 -0
- package/dist/backend/services/campaign.service.d.ts.map +1 -0
- package/dist/backend/services/campaign.service.js +195 -0
- package/dist/backend/services/campaign.service.js.map +1 -0
- package/dist/backend/services/consent-block-seeder.d.ts +30 -0
- package/dist/backend/services/consent-block-seeder.d.ts.map +1 -0
- package/dist/backend/services/consent-block-seeder.js +52 -0
- package/dist/backend/services/consent-block-seeder.js.map +1 -0
- package/dist/backend/services/content.service.d.ts +52 -0
- package/dist/backend/services/content.service.d.ts.map +1 -0
- package/dist/backend/services/content.service.js +48 -0
- package/dist/backend/services/content.service.js.map +1 -0
- package/dist/backend/services/custom-field.service.d.ts +16 -0
- package/dist/backend/services/custom-field.service.d.ts.map +1 -0
- package/dist/backend/services/custom-field.service.js +67 -0
- package/dist/backend/services/custom-field.service.js.map +1 -0
- package/dist/backend/services/email-block.service.d.ts +26 -0
- package/dist/backend/services/email-block.service.d.ts.map +1 -0
- package/dist/backend/services/email-block.service.js +120 -0
- package/dist/backend/services/email-block.service.js.map +1 -0
- package/dist/backend/services/opt-in.service.d.ts +25 -0
- package/dist/backend/services/opt-in.service.d.ts.map +1 -0
- package/dist/backend/services/opt-in.service.js +46 -0
- package/dist/backend/services/opt-in.service.js.map +1 -0
- package/dist/backend/services/provider/console-provider.d.ts +32 -0
- package/dist/backend/services/provider/console-provider.d.ts.map +1 -0
- package/dist/backend/services/provider/console-provider.js +31 -0
- package/dist/backend/services/provider/console-provider.js.map +1 -0
- package/dist/backend/services/provider/provider-registry.d.ts +51 -0
- package/dist/backend/services/provider/provider-registry.d.ts.map +1 -0
- package/dist/backend/services/provider/provider-registry.js +84 -0
- package/dist/backend/services/provider/provider-registry.js.map +1 -0
- package/dist/backend/services/provider/smtp-provider.d.ts +30 -0
- package/dist/backend/services/provider/smtp-provider.d.ts.map +1 -0
- package/dist/backend/services/provider/smtp-provider.js +42 -0
- package/dist/backend/services/provider/smtp-provider.js.map +1 -0
- package/dist/backend/services/provider-admin.service.d.ts +39 -0
- package/dist/backend/services/provider-admin.service.d.ts.map +1 -0
- package/dist/backend/services/provider-admin.service.js +59 -0
- package/dist/backend/services/provider-admin.service.js.map +1 -0
- package/dist/backend/services/provider-admin.types.d.ts +6 -0
- package/dist/backend/services/provider-admin.types.d.ts.map +1 -0
- package/dist/backend/services/provider-admin.types.js +2 -0
- package/dist/backend/services/provider-admin.types.js.map +1 -0
- package/dist/backend/services/queues/newsletter-queues.d.ts +34 -0
- package/dist/backend/services/queues/newsletter-queues.d.ts.map +1 -0
- package/dist/backend/services/queues/newsletter-queues.js +58 -0
- package/dist/backend/services/queues/newsletter-queues.js.map +1 -0
- package/dist/backend/services/self.service.d.ts +17 -0
- package/dist/backend/services/self.service.d.ts.map +1 -0
- package/dist/backend/services/self.service.js +44 -0
- package/dist/backend/services/self.service.js.map +1 -0
- package/dist/backend/services/stats.service.d.ts +10 -0
- package/dist/backend/services/stats.service.d.ts.map +1 -0
- package/dist/backend/services/stats.service.js +45 -0
- package/dist/backend/services/stats.service.js.map +1 -0
- package/dist/backend/services/subscriber-admin.service.d.ts +26 -0
- package/dist/backend/services/subscriber-admin.service.d.ts.map +1 -0
- package/dist/backend/services/subscriber-admin.service.js +163 -0
- package/dist/backend/services/subscriber-admin.service.js.map +1 -0
- package/dist/backend/services/subscriber.service.d.ts +91 -0
- package/dist/backend/services/subscriber.service.d.ts.map +1 -0
- package/dist/backend/services/subscriber.service.js +280 -0
- package/dist/backend/services/subscriber.service.js.map +1 -0
- package/dist/backend/services/tag.service.d.ts +16 -0
- package/dist/backend/services/tag.service.d.ts.map +1 -0
- package/dist/backend/services/tag.service.js +79 -0
- package/dist/backend/services/tag.service.js.map +1 -0
- package/dist/backend/services/token.helper.d.ts +32 -0
- package/dist/backend/services/token.helper.d.ts.map +1 -0
- package/dist/backend/services/token.helper.js +76 -0
- package/dist/backend/services/token.helper.js.map +1 -0
- package/dist/backend/services/tracking.service.d.ts +14 -0
- package/dist/backend/services/tracking.service.d.ts.map +1 -0
- package/dist/backend/services/tracking.service.js +45 -0
- package/dist/backend/services/tracking.service.js.map +1 -0
- package/dist/manifest.d.ts +192 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +211 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260629T200954_newsletter_init.d.ts +6 -0
- package/dist/migrations/20260629T200954_newsletter_init.d.ts.map +1 -0
- package/dist/migrations/20260629T200954_newsletter_init.js +261 -0
- package/dist/migrations/20260629T200954_newsletter_init.js.map +1 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts +116 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts.map +1 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.js +186 -0
- package/dist/migrations/20260830T212736_newsletter_organization_attribution.js.map +1 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts +6 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts.map +1 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js +58 -0
- package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js.map +1 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts +23 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts.map +1 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js +27 -0
- package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js.map +1 -0
- package/dist/migrations/index.d.ts +30 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +35 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/newsletter.md +94 -0
- package/i18n/en.json +27 -0
- package/i18n/pl.json +27 -0
- package/package.json +119 -0
- package/tailwind.css +14 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
|
|
2
|
+
|
|
3
|
+
# @endora-commerce/mod-newsletter
|
|
4
|
+
|
|
5
|
+
Own-infrastructure newsletter: subscribers with tags + custom fields, campaigns, linear automations, email-safe templates and variables, engagement stats, and a configurable bulk-sending provider.
|
|
6
|
+
|
|
7
|
+
## What this is
|
|
8
|
+
|
|
9
|
+
An **Endora Commerce module package**. Its module id is `newsletter` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
|
|
10
|
+
|
|
11
|
+
A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
|
|
12
|
+
|
|
13
|
+
## Entry points
|
|
14
|
+
|
|
15
|
+
| Import | Contents |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `@endora-commerce/mod-newsletter` | the module manifest — its id, version, dependencies, settings and activation |
|
|
18
|
+
| `@endora-commerce/mod-newsletter/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
|
|
19
|
+
| `@endora-commerce/mod-newsletter/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
|
|
20
|
+
| `@endora-commerce/mod-newsletter/migrations` | the module’s own schema migrations, in the order the platform runs them |
|
|
21
|
+
| `@endora-commerce/mod-newsletter/tailwind.css` | the Tailwind source declaration for the admin code above |
|
|
22
|
+
|
|
23
|
+
## Depends on
|
|
24
|
+
|
|
25
|
+
Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
|
|
26
|
+
|
|
27
|
+
**Endora packages**
|
|
28
|
+
|
|
29
|
+
- `@endora-commerce/admin-kit` — *optional*
|
|
30
|
+
- `@endora-commerce/contracts`
|
|
31
|
+
- `@endora-commerce/email-components`
|
|
32
|
+
- `@endora-commerce/page-builder-admin` — *optional*
|
|
33
|
+
- `@endora-commerce/page-builder-core`
|
|
34
|
+
- `@endora-commerce/platform`
|
|
35
|
+
|
|
36
|
+
**Third-party**
|
|
37
|
+
|
|
38
|
+
- `@measured/puck` ^0 — *optional*
|
|
39
|
+
- `@mikro-orm/core` ^6
|
|
40
|
+
- `@mikro-orm/migrations` ^6
|
|
41
|
+
- `@mikro-orm/postgresql` ^6
|
|
42
|
+
- `bullmq` ^5
|
|
43
|
+
- `echarts` ^6 — *optional*
|
|
44
|
+
- `fastify` ^5
|
|
45
|
+
- `ioredis` ^5
|
|
46
|
+
- `nodemailer` ^10
|
|
47
|
+
- `react` ^19 — *optional*
|
|
48
|
+
- `react-router-dom` ^7 — *optional*
|
|
49
|
+
- `zod` ^4
|
|
50
|
+
|
|
51
|
+
## What the tarball carries
|
|
52
|
+
|
|
53
|
+
- `dist/` — the compiled JavaScript and its type declarations
|
|
54
|
+
- `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
|
|
55
|
+
- `docs/` — the package’s own pages in the Endora Commerce documentation site
|
|
56
|
+
- `tailwind.css` — the Tailwind source declaration
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pnpm add @endora-commerce/mod-newsletter
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Licence
|
|
65
|
+
|
|
66
|
+
MIT — the text is in `LICENSE`, beside this file.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type ScopeNoticeCode } from '@endora-commerce/contracts';
|
|
2
|
+
import type { AutomationDetail, AutomationSummary, CampaignDetail, CampaignStats, CampaignSummary, CreateAutomationRequest, CreateCampaignRequest, CreateNewsletterCustomFieldRequest, CreateNewsletterEmailBlockRequest, CreateNewsletterTagRequest, NewsletterCustomField, NewsletterEmailBlockDetail, NewsletterEmailBlockSummary, NewsletterTag, UpdateNewsletterEmailBlockRequest, ProviderConfig, PutProviderRequest, RenderedEmail, SubscriberDetail, SubscriberListQuery, SubscriberListResponse, TestProviderResponse, UpdateAutomationRequest, UpdateCampaignRequest, UpdateNewsletterCustomFieldRequest, UpdateNewsletterTagRequest } from '@endora-commerce/contracts';
|
|
3
|
+
/**
|
|
4
|
+
* A page plus the reason it might be empty (feature 087). `unwrap` throws the
|
|
5
|
+
* envelope away, and the envelope is where the server explains itself, so the
|
|
6
|
+
* subscriber listing keeps it — the notice rides beside the page rather than
|
|
7
|
+
* being fetched separately, because it is a property of *this* answer.
|
|
8
|
+
*/
|
|
9
|
+
export type SubscriberListPage = SubscriberListResponse & {
|
|
10
|
+
scopeNotice: ScopeNoticeCode | null;
|
|
11
|
+
};
|
|
12
|
+
/** Typed admin client for the newsletter module (feature 048). */
|
|
13
|
+
export declare const newsletterClient: {
|
|
14
|
+
listSubscribers: (q: Partial<SubscriberListQuery>) => Promise<SubscriberListPage>;
|
|
15
|
+
getSubscriber: (id: string) => Promise<SubscriberDetail>;
|
|
16
|
+
unsubscribe: (id: string, expectedVersion: number, reason?: string) => Promise<SubscriberDetail>;
|
|
17
|
+
deactivate: (id: string, expectedVersion: number) => Promise<SubscriberDetail>;
|
|
18
|
+
deleteSubscriber: (id: string) => Promise<void>;
|
|
19
|
+
subscribersExportUrl: (q: Partial<SubscriberListQuery>) => string;
|
|
20
|
+
listTags: () => Promise<{
|
|
21
|
+
items: NewsletterTag[];
|
|
22
|
+
}>;
|
|
23
|
+
createTag: (body: CreateNewsletterTagRequest) => Promise<NewsletterTag>;
|
|
24
|
+
updateTag: (id: string, body: UpdateNewsletterTagRequest) => Promise<NewsletterTag>;
|
|
25
|
+
deleteTag: (id: string) => Promise<void>;
|
|
26
|
+
listCustomFields: () => Promise<{
|
|
27
|
+
items: NewsletterCustomField[];
|
|
28
|
+
}>;
|
|
29
|
+
createCustomField: (body: CreateNewsletterCustomFieldRequest) => Promise<NewsletterCustomField>;
|
|
30
|
+
updateCustomField: (id: string, body: UpdateNewsletterCustomFieldRequest) => Promise<NewsletterCustomField>;
|
|
31
|
+
deleteCustomField: (id: string) => Promise<void>;
|
|
32
|
+
listCampaigns: () => Promise<{
|
|
33
|
+
items: CampaignSummary[];
|
|
34
|
+
}>;
|
|
35
|
+
getCampaign: (id: string) => Promise<CampaignDetail>;
|
|
36
|
+
createCampaign: (body: CreateCampaignRequest) => Promise<CampaignDetail>;
|
|
37
|
+
updateCampaign: (id: string, body: UpdateCampaignRequest) => Promise<CampaignDetail>;
|
|
38
|
+
setCampaignGroup: (id: string, subscriberIds: string[]) => Promise<CampaignDetail>;
|
|
39
|
+
previewCampaign: (id: string, subscriberId?: string) => Promise<RenderedEmail>;
|
|
40
|
+
sendCampaign: (id: string, expectedVersion: number, scheduledAt?: string) => Promise<CampaignDetail>;
|
|
41
|
+
cancelCampaign: (id: string, expectedVersion: number) => Promise<CampaignDetail>;
|
|
42
|
+
campaignStats: (id: string) => Promise<CampaignStats>;
|
|
43
|
+
listAutomations: () => Promise<{
|
|
44
|
+
items: AutomationSummary[];
|
|
45
|
+
}>;
|
|
46
|
+
getAutomation: (id: string) => Promise<AutomationDetail>;
|
|
47
|
+
createAutomation: (body: CreateAutomationRequest) => Promise<AutomationDetail>;
|
|
48
|
+
updateAutomation: (id: string, body: UpdateAutomationRequest) => Promise<AutomationDetail>;
|
|
49
|
+
activateAutomation: (id: string, expectedVersion: number) => Promise<AutomationDetail>;
|
|
50
|
+
pauseAutomation: (id: string, expectedVersion: number) => Promise<AutomationDetail>;
|
|
51
|
+
listBlocks: () => Promise<{
|
|
52
|
+
items: NewsletterEmailBlockSummary[];
|
|
53
|
+
}>;
|
|
54
|
+
getBlock: (id: string) => Promise<NewsletterEmailBlockDetail>;
|
|
55
|
+
createBlock: (body: CreateNewsletterEmailBlockRequest) => Promise<NewsletterEmailBlockDetail>;
|
|
56
|
+
updateBlock: (id: string, body: UpdateNewsletterEmailBlockRequest) => Promise<NewsletterEmailBlockDetail>;
|
|
57
|
+
deleteBlock: (id: string) => Promise<void>;
|
|
58
|
+
getProvider: () => Promise<ProviderConfig>;
|
|
59
|
+
putProvider: (body: PutProviderRequest) => Promise<ProviderConfig>;
|
|
60
|
+
testProvider: () => Promise<TestProviderResponse>;
|
|
61
|
+
};
|
|
62
|
+
/** Build a minimal email-safe content tree from a plain-text body (one EmailText block). */
|
|
63
|
+
export declare function textContentTree(text: string): Record<string, unknown>;
|
|
64
|
+
//# sourceMappingURL=newsletter-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newsletter-client.d.ts","sourceRoot":"","sources":["../../../src/admin/api/newsletter-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { apiClient } from '@endora-commerce/admin-kit/lib';
|
|
2
|
+
import { scopeNoticeOf } from '@endora-commerce/contracts';
|
|
3
|
+
const unwrap = (p) => p.then((r) => r.data);
|
|
4
|
+
const BASE = '/api/v1/admin/newsletter';
|
|
5
|
+
function qs(params) {
|
|
6
|
+
const sp = new URLSearchParams();
|
|
7
|
+
for (const [k, v] of Object.entries(params)) {
|
|
8
|
+
if (v !== undefined && v !== '')
|
|
9
|
+
sp.set(k, String(v));
|
|
10
|
+
}
|
|
11
|
+
const s = sp.toString();
|
|
12
|
+
return s ? `?${s}` : '';
|
|
13
|
+
}
|
|
14
|
+
/** Typed admin client for the newsletter module (feature 048). */
|
|
15
|
+
export const newsletterClient = {
|
|
16
|
+
// Subscribers
|
|
17
|
+
listSubscribers: (q) => apiClient
|
|
18
|
+
.get(`${BASE}/subscribers${qs(q)}`)
|
|
19
|
+
.then((r) => ({ ...r.data, scopeNotice: scopeNoticeOf(r) })),
|
|
20
|
+
getSubscriber: (id) => unwrap(apiClient.get(`${BASE}/subscribers/${id}`)),
|
|
21
|
+
unsubscribe: (id, expectedVersion, reason) => unwrap(apiClient.post(`${BASE}/subscribers/${id}/unsubscribe`, { expectedVersion, reason })),
|
|
22
|
+
deactivate: (id, expectedVersion) => unwrap(apiClient.post(`${BASE}/subscribers/${id}/deactivate`, { expectedVersion })),
|
|
23
|
+
deleteSubscriber: (id) => apiClient.delete(`${BASE}/subscribers/${id}`).then(() => undefined),
|
|
24
|
+
subscribersExportUrl: (q) => `${BASE}/subscribers/export${qs(q)}`,
|
|
25
|
+
// Tags
|
|
26
|
+
listTags: () => unwrap(apiClient.get(`${BASE}/tags`)),
|
|
27
|
+
createTag: (body) => unwrap(apiClient.post(`${BASE}/tags`, body)),
|
|
28
|
+
updateTag: (id, body) => unwrap(apiClient.patch(`${BASE}/tags/${id}`, body)),
|
|
29
|
+
deleteTag: (id) => apiClient.delete(`${BASE}/tags/${id}`).then(() => undefined),
|
|
30
|
+
// Custom fields
|
|
31
|
+
listCustomFields: () => unwrap(apiClient.get(`${BASE}/custom-fields`)),
|
|
32
|
+
createCustomField: (body) => unwrap(apiClient.post(`${BASE}/custom-fields`, body)),
|
|
33
|
+
updateCustomField: (id, body) => unwrap(apiClient.patch(`${BASE}/custom-fields/${id}`, body)),
|
|
34
|
+
deleteCustomField: (id) => apiClient.delete(`${BASE}/custom-fields/${id}`).then(() => undefined),
|
|
35
|
+
// Campaigns
|
|
36
|
+
listCampaigns: () => unwrap(apiClient.get(`${BASE}/campaigns`)),
|
|
37
|
+
getCampaign: (id) => unwrap(apiClient.get(`${BASE}/campaigns/${id}`)),
|
|
38
|
+
createCampaign: (body) => unwrap(apiClient.post(`${BASE}/campaigns`, body)),
|
|
39
|
+
updateCampaign: (id, body) => unwrap(apiClient.put(`${BASE}/campaigns/${id}`, body)),
|
|
40
|
+
setCampaignGroup: (id, subscriberIds) => unwrap(apiClient.put(`${BASE}/campaigns/${id}/group`, { subscriberIds })),
|
|
41
|
+
previewCampaign: (id, subscriberId) => unwrap(apiClient.post(`${BASE}/campaigns/${id}/preview`, { subscriberId })),
|
|
42
|
+
sendCampaign: (id, expectedVersion, scheduledAt) => unwrap(apiClient.post(`${BASE}/campaigns/${id}/send`, { expectedVersion, scheduledAt })),
|
|
43
|
+
cancelCampaign: (id, expectedVersion) => unwrap(apiClient.post(`${BASE}/campaigns/${id}/cancel`, { expectedVersion })),
|
|
44
|
+
campaignStats: (id) => unwrap(apiClient.get(`${BASE}/campaigns/${id}/stats`)),
|
|
45
|
+
// Automations
|
|
46
|
+
listAutomations: () => unwrap(apiClient.get(`${BASE}/automations`)),
|
|
47
|
+
getAutomation: (id) => unwrap(apiClient.get(`${BASE}/automations/${id}`)),
|
|
48
|
+
createAutomation: (body) => unwrap(apiClient.post(`${BASE}/automations`, body)),
|
|
49
|
+
updateAutomation: (id, body) => unwrap(apiClient.put(`${BASE}/automations/${id}`, body)),
|
|
50
|
+
activateAutomation: (id, expectedVersion) => unwrap(apiClient.post(`${BASE}/automations/${id}/activate`, { expectedVersion })),
|
|
51
|
+
pauseAutomation: (id, expectedVersion) => unwrap(apiClient.post(`${BASE}/automations/${id}/pause`, { expectedVersion })),
|
|
52
|
+
// Email blocks
|
|
53
|
+
listBlocks: () => unwrap(apiClient.get(`${BASE}/blocks`)),
|
|
54
|
+
getBlock: (id) => unwrap(apiClient.get(`${BASE}/blocks/${id}`)),
|
|
55
|
+
createBlock: (body) => unwrap(apiClient.post(`${BASE}/blocks`, body)),
|
|
56
|
+
updateBlock: (id, body) => unwrap(apiClient.put(`${BASE}/blocks/${id}`, body)),
|
|
57
|
+
deleteBlock: (id) => apiClient.delete(`${BASE}/blocks/${id}`).then(() => undefined),
|
|
58
|
+
// Provider
|
|
59
|
+
getProvider: () => unwrap(apiClient.get(`${BASE}/provider`)),
|
|
60
|
+
putProvider: (body) => unwrap(apiClient.put(`${BASE}/provider`, body)),
|
|
61
|
+
testProvider: () => unwrap(apiClient.post(`${BASE}/provider/test`, {})),
|
|
62
|
+
};
|
|
63
|
+
/** Build a minimal email-safe content tree from a plain-text body (one EmailText block). */
|
|
64
|
+
export function textContentTree(text) {
|
|
65
|
+
return {
|
|
66
|
+
root: { props: {} },
|
|
67
|
+
content: [{ type: 'transactional_emails.EmailText', props: { id: 'body', text } }],
|
|
68
|
+
zones: {},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=newsletter-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newsletter-client.js","sourceRoot":"","sources":["../../../src/admin/api/newsletter-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAwB,MAAM,4BAA4B,CAAC;AA+BjF,MAAM,MAAM,GAAG,CAAI,CAAmB,EAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAW7E,MAAM,IAAI,GAAG,0BAA0B,CAAC;AAExC,SAAS,EAAE,CAAC,MAAmD;IAC7D,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;YAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,cAAc;IACd,eAAe,EAAE,CAAC,CAA+B,EAA+B,EAAE,CAChF,SAAS;SACN,GAAG,CAA+B,GAAG,IAAI,eAAe,EAAE,CAAC,CAAgD,CAAC,EAAE,CAAC;SAC/G,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChE,aAAa,EAAE,CAAC,EAAU,EAA6B,EAAE,CACvD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAyB,GAAG,IAAI,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC5E,WAAW,EAAE,CAAC,EAAU,EAAE,eAAuB,EAAE,MAAe,EAA6B,EAAE,CAC/F,MAAM,CAAC,SAAS,CAAC,IAAI,CAAyB,GAAG,IAAI,gBAAgB,EAAE,cAAc,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;IACtH,UAAU,EAAE,CAAC,EAAU,EAAE,eAAuB,EAA6B,EAAE,CAC7E,MAAM,CAAC,SAAS,CAAC,IAAI,CAAyB,GAAG,IAAI,gBAAgB,EAAE,aAAa,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7G,gBAAgB,EAAE,CAAC,EAAU,EAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IACpH,oBAAoB,EAAE,CAAC,CAA+B,EAAU,EAAE,CAChE,GAAG,IAAI,sBAAsB,EAAE,CAAC,CAAgD,CAAC,EAAE;IAErF,OAAO;IACP,QAAQ,EAAE,GAAwC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAmC,GAAG,IAAI,OAAO,CAAC,CAAC;IAC5H,SAAS,EAAE,CAAC,IAAgC,EAA0B,EAAE,CACtE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAsB,GAAG,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,SAAS,EAAE,CAAC,EAAU,EAAE,IAAgC,EAA0B,EAAE,CAClF,MAAM,CAAC,SAAS,CAAC,KAAK,CAAsB,GAAG,IAAI,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,EAAU,EAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IAEtG,gBAAgB;IAChB,gBAAgB,EAAE,GAAgD,EAAE,CAClE,MAAM,CAAC,SAAS,CAAC,GAAG,CAA2C,GAAG,IAAI,gBAAgB,CAAC,CAAC;IAC1F,iBAAiB,EAAE,CAAC,IAAwC,EAAkC,EAAE,CAC9F,MAAM,CAAC,SAAS,CAAC,IAAI,CAA8B,GAAG,IAAI,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACpF,iBAAiB,EAAE,CAAC,EAAU,EAAE,IAAwC,EAAkC,EAAE,CAC1G,MAAM,CAAC,SAAS,CAAC,KAAK,CAA8B,GAAG,IAAI,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3F,iBAAiB,EAAE,CAAC,EAAU,EAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IAEvH,YAAY;IACZ,aAAa,EAAE,GAA0C,EAAE,CACzD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAqC,GAAG,IAAI,YAAY,CAAC,CAAC;IAChF,WAAW,EAAE,CAAC,EAAU,EAA2B,EAAE,CACnD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuB,GAAG,IAAI,cAAc,EAAE,EAAE,CAAC,CAAC;IACxE,cAAc,EAAE,CAAC,IAA2B,EAA2B,EAAE,CACvE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAuB,GAAG,IAAI,YAAY,EAAE,IAAI,CAAC,CAAC;IACzE,cAAc,EAAE,CAAC,EAAU,EAAE,IAA2B,EAA2B,EAAE,CACnF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuB,GAAG,IAAI,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9E,gBAAgB,EAAE,CAAC,EAAU,EAAE,aAAuB,EAA2B,EAAE,CACjF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuB,GAAG,IAAI,cAAc,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IACjG,eAAe,EAAE,CAAC,EAAU,EAAE,YAAqB,EAA0B,EAAE,CAC7E,MAAM,CAAC,SAAS,CAAC,IAAI,CAAsB,GAAG,IAAI,cAAc,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAClG,YAAY,EAAE,CAAC,EAAU,EAAE,eAAuB,EAAE,WAAoB,EAA2B,EAAE,CACnG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAuB,GAAG,IAAI,cAAc,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC;IAChH,cAAc,EAAE,CAAC,EAAU,EAAE,eAAuB,EAA2B,EAAE,CAC/E,MAAM,CAAC,SAAS,CAAC,IAAI,CAAuB,GAAG,IAAI,cAAc,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IACrG,aAAa,EAAE,CAAC,EAAU,EAA0B,EAAE,CACpD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAsB,GAAG,IAAI,cAAc,EAAE,QAAQ,CAAC,CAAC;IAE7E,cAAc;IACd,eAAe,EAAE,GAA4C,EAAE,CAC7D,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuC,GAAG,IAAI,cAAc,CAAC,CAAC;IACpF,aAAa,EAAE,CAAC,EAAU,EAA6B,EAAE,CACvD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAyB,GAAG,IAAI,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC5E,gBAAgB,EAAE,CAAC,IAA6B,EAA6B,EAAE,CAC7E,MAAM,CAAC,SAAS,CAAC,IAAI,CAAyB,GAAG,IAAI,cAAc,EAAE,IAAI,CAAC,CAAC;IAC7E,gBAAgB,EAAE,CAAC,EAAU,EAAE,IAA6B,EAA6B,EAAE,CACzF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAyB,GAAG,IAAI,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAClF,kBAAkB,EAAE,CAAC,EAAU,EAAE,eAAuB,EAA6B,EAAE,CACrF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAyB,GAAG,IAAI,gBAAgB,EAAE,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC3G,eAAe,EAAE,CAAC,EAAU,EAAE,eAAuB,EAA6B,EAAE,CAClF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAyB,GAAG,IAAI,gBAAgB,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAExG,eAAe;IACf,UAAU,EAAE,GAAsD,EAAE,CAClE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAiD,GAAG,IAAI,SAAS,CAAC,CAAC;IACzF,QAAQ,EAAE,CAAC,EAAU,EAAuC,EAAE,CAC5D,MAAM,CAAC,SAAS,CAAC,GAAG,CAAmC,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC,CAAC;IACjF,WAAW,EAAE,CAAC,IAAuC,EAAuC,EAAE,CAC5F,MAAM,CAAC,SAAS,CAAC,IAAI,CAAmC,GAAG,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC;IAClF,WAAW,EAAE,CAAC,EAAU,EAAE,IAAuC,EAAuC,EAAE,CACxG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAmC,GAAG,IAAI,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACvF,WAAW,EAAE,CAAC,EAAU,EAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IAE1G,WAAW;IACX,WAAW,EAAE,GAA4B,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuB,GAAG,IAAI,WAAW,CAAC,CAAC;IAC3G,WAAW,EAAE,CAAC,IAAwB,EAA2B,EAAE,CACjE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAuB,GAAG,IAAI,WAAW,EAAE,IAAI,CAAC,CAAC;IACvE,YAAY,EAAE,GAAkC,EAAE,CAChD,MAAM,CAAC,SAAS,CAAC,IAAI,CAA6B,GAAG,IAAI,gBAAgB,EAAE,EAAE,CAAC,CAAC;CAClF,CAAC;AAEF,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO;QACL,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAClF,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type EmailVariableItem } from '@endora-commerce/page-builder-admin/email';
|
|
2
|
+
/**
|
|
3
|
+
* `newsletter`'s own e-mail variable vocabulary (feature 091, P5b;
|
|
4
|
+
* `admin-component-contribution.md` Z1.2).
|
|
5
|
+
*
|
|
6
|
+
* It lived in `admin/src/modules/_shared/email-builder/newsletter-variables.ts`
|
|
7
|
+
* until the e-mail builder became `@endora-commerce/page-builder-admin`. A
|
|
8
|
+
* subscriber's e-mail address, an unsubscribe URL, a web-view URL and a
|
|
9
|
+
* newsletter custom field are one module's domain vocabulary, and all three
|
|
10
|
+
* consumers are this module's own screens — so it exits into `newsletter`
|
|
11
|
+
* rather than being published from a package that would then know what a
|
|
12
|
+
* subscriber is. The generic half (the branding pair, the `if`/`for` snippets
|
|
13
|
+
* and `mergeEmailVariables`) stays in the package, where every e-mail builder
|
|
14
|
+
* needs it whichever module opened one.
|
|
15
|
+
*/
|
|
16
|
+
export declare const NEWSLETTER_BASE_VARIABLES: EmailVariableItem[];
|
|
17
|
+
export declare function newsletterVariables(customFieldKeys?: readonly {
|
|
18
|
+
key: string;
|
|
19
|
+
label: string;
|
|
20
|
+
}[]): EmailVariableItem[];
|
|
21
|
+
//# sourceMappingURL=email-variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-variables.d.ts","sourceRoot":"","sources":["../../src/admin/email-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,2CAA2C,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,EAAE,iBAAiB,EAuBxD,CAAC;AAGF,wBAAgB,mBAAmB,CACjC,eAAe,GAAE,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAO,GAC9D,iBAAiB,EAAE,CAOrB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { mergeEmailVariables, } from '@endora-commerce/page-builder-admin/email';
|
|
2
|
+
/**
|
|
3
|
+
* `newsletter`'s own e-mail variable vocabulary (feature 091, P5b;
|
|
4
|
+
* `admin-component-contribution.md` Z1.2).
|
|
5
|
+
*
|
|
6
|
+
* It lived in `admin/src/modules/_shared/email-builder/newsletter-variables.ts`
|
|
7
|
+
* until the e-mail builder became `@endora-commerce/page-builder-admin`. A
|
|
8
|
+
* subscriber's e-mail address, an unsubscribe URL, a web-view URL and a
|
|
9
|
+
* newsletter custom field are one module's domain vocabulary, and all three
|
|
10
|
+
* consumers are this module's own screens — so it exits into `newsletter`
|
|
11
|
+
* rather than being published from a package that would then know what a
|
|
12
|
+
* subscriber is. The generic half (the branding pair, the `if`/`for` snippets
|
|
13
|
+
* and `mergeEmailVariables`) stays in the package, where every e-mail builder
|
|
14
|
+
* needs it whichever module opened one.
|
|
15
|
+
*/
|
|
16
|
+
export const NEWSLETTER_BASE_VARIABLES = [
|
|
17
|
+
{
|
|
18
|
+
key: 'subscriber.email',
|
|
19
|
+
label: 'Subscriber email',
|
|
20
|
+
sampleValue: 'ada@example.com',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: 'unsubscribeUrl',
|
|
24
|
+
label: 'Unsubscribe URL',
|
|
25
|
+
description: 'One-click unsubscribe link for this send',
|
|
26
|
+
sampleValue: 'https://shop.example/newsletter/unsubscribe?token=…',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: 'webviewUrl',
|
|
30
|
+
label: 'Web view URL',
|
|
31
|
+
description: 'Browser view of this email (when available)',
|
|
32
|
+
sampleValue: 'https://shop.example/newsletter/view/…',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: 'channel.id',
|
|
36
|
+
label: 'Sales channel id',
|
|
37
|
+
sampleValue: '00000000-0000-0000-0000-000000000001',
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
export function newsletterVariables(customFieldKeys = []) {
|
|
41
|
+
const custom = customFieldKeys.map((f) => ({
|
|
42
|
+
key: `customFields.${f.key}`,
|
|
43
|
+
label: f.label || f.key,
|
|
44
|
+
description: 'Newsletter custom field',
|
|
45
|
+
}));
|
|
46
|
+
return mergeEmailVariables([], [...NEWSLETTER_BASE_VARIABLES, ...custom]);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=email-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-variables.js","sourceRoot":"","sources":["../../src/admin/email-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,2CAA2C,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAwB;IAC5D;QACE,GAAG,EAAE,kBAAkB;QACvB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,iBAAiB;KAC/B;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE,qDAAqD;KACnE;IACD;QACE,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,wCAAwC;KACtD;IACD;QACE,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,sCAAsC;KACpD;CACF,CAAC;AAGF,MAAM,UAAU,mBAAmB,CACjC,kBAA6D,EAAE;IAE/D,MAAM,MAAM,GAAwB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,GAAG,EAAE,gBAAgB,CAAC,CAAC,GAAG,EAAE;QAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG;QACvB,WAAW,EAAE,yBAAyB;KACvC,CAAC,CAAC,CAAC;IACJ,OAAO,mBAAmB,CAAC,EAAE,EAAE,CAAC,GAAG,yBAAyB,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `newsletter`'s admin surface — eleven routes and six sidebar entries,
|
|
3
|
+
* declared by the module that owns them (feature 091, Phase 4, batch 11;
|
|
4
|
+
* `specs/091-module-owned-admin-surfaces/contracts/admin-contribution.md`).
|
|
5
|
+
*
|
|
6
|
+
* **Its drain is zero, re-derived on this branch before anything moved.** The
|
|
7
|
+
* plan's row for this batch predicted it and the derivation confirms it: no
|
|
8
|
+
* key in `backend/scripts/ledgers/cross-module-imports/` (this module has no
|
|
9
|
+
* shard at all), none in `admin-surface.ts`, none in `foreign-module-ids.ts`.
|
|
10
|
+
* The debt the plan recorded was six reaches into
|
|
11
|
+
* `admin/src/modules/_shared/email-builder/`, and P5b did not repair them — it
|
|
12
|
+
* made them *stop existing*: the e-mail builder is
|
|
13
|
+
* `@endora-commerce/page-builder-admin/email` now, so the six are bare
|
|
14
|
+
* specifiers into a published `exports` map, which is what a package split
|
|
15
|
+
* produces rather than a coupling it breaks.
|
|
16
|
+
*
|
|
17
|
+
* **The e-mail builder is reached as a peer, not as a sibling.** Three screens
|
|
18
|
+
* — the campaign editor, the automation builder and the block editor — mount
|
|
19
|
+
* `EmailEditorPane` and `EmailVariablesProvider` out of that package, and
|
|
20
|
+
* `manifests:generate` derives the peer dependency from those specifiers
|
|
21
|
+
* rather than from anybody remembering to add it. What stays this module's own
|
|
22
|
+
* is `email-variables.ts`: a subscriber's address, an unsubscribe URL, a
|
|
23
|
+
* web-view URL and a newsletter custom field are domain vocabulary, and all
|
|
24
|
+
* three consumers are the screens below.
|
|
25
|
+
*
|
|
26
|
+
* **Two palette actions are declared here for the first time**, replacing the
|
|
27
|
+
* hand-written `PALETTE_ITEMS` rows this batch deletes, with the same
|
|
28
|
+
* destinations, codes and keywords. A hand-written palette row is a copy the
|
|
29
|
+
* server was never asked about — it went on advertising the screen after an
|
|
30
|
+
* operator withdrew the module — and this module is one an operator really can
|
|
31
|
+
* withdraw. `open-newsletter` and `new-newsletter-campaign` were already
|
|
32
|
+
* declared and are untouched.
|
|
33
|
+
*
|
|
34
|
+
* **This module is switchable**, unlike batch 10's `settings` and
|
|
35
|
+
* `dictionaries`: `activation.settingCode` is `newsletter.enabled`, default
|
|
36
|
+
* on. So the off-state proof drives both axes — the operator's and the
|
|
37
|
+
* platform's — rather than the permission axis alone.
|
|
38
|
+
*
|
|
39
|
+
* **This entry exports data and nothing else** (R2); every component is a
|
|
40
|
+
* dynamic-import factory (R6).
|
|
41
|
+
*/
|
|
42
|
+
import type { AdminContributions } from '@endora-commerce/admin-kit/contributions';
|
|
43
|
+
export declare const contributions: AdminContributions;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AA8BnF,eAAO,MAAM,aAAa,EAAE,kBA2H3B,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/** The module's landing route: the subscriber list its palette action opens. */
|
|
2
|
+
const SUBSCRIBERS_ROUTE = '/newsletter/subscribers';
|
|
3
|
+
const CAMPAIGNS_ROUTE = '/newsletter/campaigns';
|
|
4
|
+
const AUTOMATIONS_ROUTE = '/newsletter/automations';
|
|
5
|
+
const TAGS_ROUTE = '/newsletter/tags';
|
|
6
|
+
const BLOCKS_ROUTE = '/newsletter/blocks';
|
|
7
|
+
const PROVIDER_ROUTE = '/newsletter/provider';
|
|
8
|
+
/**
|
|
9
|
+
* The code every list and editor screen needs to open, and the one every `GET`
|
|
10
|
+
* under `/api/v1/admin/newsletter` enforces.
|
|
11
|
+
*/
|
|
12
|
+
const READ_PERMISSION = 'newsletter:read';
|
|
13
|
+
/**
|
|
14
|
+
* The code the screens that exist only to write carry.
|
|
15
|
+
*
|
|
16
|
+
* `/newsletter/campaigns/new` and `/newsletter/automations/new` have no `GET`
|
|
17
|
+
* behind them at all — a blank form whose only outcome is a `POST`, which the
|
|
18
|
+
* API gates on this code — so read is not enough to reach them. It is the code
|
|
19
|
+
* `new-newsletter-campaign` already declares, and the code the hand-written
|
|
20
|
+
* sidebar row for `/newsletter/provider` already carried: that screen is the
|
|
21
|
+
* sending provider's configuration, and advertising it to an operator who
|
|
22
|
+
* cannot change it was never the shell's intent.
|
|
23
|
+
*/
|
|
24
|
+
const WRITE_PERMISSION = 'newsletter:write';
|
|
25
|
+
export const contributions = {
|
|
26
|
+
routes: [
|
|
27
|
+
{
|
|
28
|
+
path: SUBSCRIBERS_ROUTE,
|
|
29
|
+
component: () => import('./pages/SubscribersPage.js'),
|
|
30
|
+
requiredPermission: READ_PERMISSION,
|
|
31
|
+
index: true,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
path: CAMPAIGNS_ROUTE,
|
|
35
|
+
component: () => import('./pages/CampaignsPage.js'),
|
|
36
|
+
requiredPermission: READ_PERMISSION,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
path: `${CAMPAIGNS_ROUTE}/new`,
|
|
40
|
+
component: () => import('./pages/CampaignEditor.js'),
|
|
41
|
+
requiredPermission: WRITE_PERMISSION,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
// The editor on an existing campaign opens on a `GET` and gates its own
|
|
45
|
+
// save on `newsletter:write` through `useAuth().hasPermission`, so read
|
|
46
|
+
// is the honest code for reaching it — the same split the API makes.
|
|
47
|
+
path: `${CAMPAIGNS_ROUTE}/:id`,
|
|
48
|
+
component: () => import('./pages/CampaignEditor.js'),
|
|
49
|
+
requiredPermission: READ_PERMISSION,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
path: `${CAMPAIGNS_ROUTE}/:id/stats`,
|
|
53
|
+
component: () => import('./pages/CampaignStats.js'),
|
|
54
|
+
requiredPermission: READ_PERMISSION,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
path: AUTOMATIONS_ROUTE,
|
|
58
|
+
component: () => import('./pages/AutomationsPage.js'),
|
|
59
|
+
requiredPermission: READ_PERMISSION,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
path: `${AUTOMATIONS_ROUTE}/new`,
|
|
63
|
+
component: () => import('./pages/AutomationBuilder.js'),
|
|
64
|
+
requiredPermission: WRITE_PERMISSION,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
path: `${AUTOMATIONS_ROUTE}/:id`,
|
|
68
|
+
component: () => import('./pages/AutomationBuilder.js'),
|
|
69
|
+
requiredPermission: READ_PERMISSION,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
path: TAGS_ROUTE,
|
|
73
|
+
component: () => import('./pages/TagsPage.js'),
|
|
74
|
+
requiredPermission: READ_PERMISSION,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
path: BLOCKS_ROUTE,
|
|
78
|
+
component: () => import('./pages/BlocksPage.js'),
|
|
79
|
+
requiredPermission: READ_PERMISSION,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
path: PROVIDER_ROUTE,
|
|
83
|
+
component: () => import('./pages/ProviderSettingsPage.js'),
|
|
84
|
+
requiredPermission: WRITE_PERMISSION,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
nav: [
|
|
88
|
+
{
|
|
89
|
+
to: SUBSCRIBERS_ROUTE,
|
|
90
|
+
// Module-relative (R8), resolved in this module's own namespace out of
|
|
91
|
+
// `packages/modules/newsletter/i18n/`. It was
|
|
92
|
+
// `appShell.nav.newsletterSubscribers` in the shared `_i18n` bundle, one
|
|
93
|
+
// of the four shared files a module author had to edit.
|
|
94
|
+
labelKey: 'nav.subscribers.label',
|
|
95
|
+
// The glyph `AppShell.tsx` rendered by hand for all six rows.
|
|
96
|
+
icon: 'Inbox',
|
|
97
|
+
section: 'newsletter',
|
|
98
|
+
// The hand-written position times a hundred, which is batch four's
|
|
99
|
+
// convention. *Newsletter* holds no host row at all once these six
|
|
100
|
+
// leave, so the weights are the whole order rather than a tie-break
|
|
101
|
+
// after one.
|
|
102
|
+
weight: 100,
|
|
103
|
+
requiredPermission: READ_PERMISSION,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
to: CAMPAIGNS_ROUTE,
|
|
107
|
+
labelKey: 'nav.campaigns.label',
|
|
108
|
+
icon: 'Inbox',
|
|
109
|
+
section: 'newsletter',
|
|
110
|
+
weight: 200,
|
|
111
|
+
requiredPermission: READ_PERMISSION,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
to: AUTOMATIONS_ROUTE,
|
|
115
|
+
labelKey: 'nav.automations.label',
|
|
116
|
+
icon: 'Inbox',
|
|
117
|
+
section: 'newsletter',
|
|
118
|
+
weight: 300,
|
|
119
|
+
requiredPermission: READ_PERMISSION,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
to: TAGS_ROUTE,
|
|
123
|
+
labelKey: 'nav.tags.label',
|
|
124
|
+
icon: 'Inbox',
|
|
125
|
+
section: 'newsletter',
|
|
126
|
+
weight: 400,
|
|
127
|
+
requiredPermission: READ_PERMISSION,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
to: BLOCKS_ROUTE,
|
|
131
|
+
labelKey: 'nav.blocks.label',
|
|
132
|
+
icon: 'Inbox',
|
|
133
|
+
section: 'newsletter',
|
|
134
|
+
weight: 500,
|
|
135
|
+
requiredPermission: READ_PERMISSION,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
to: PROVIDER_ROUTE,
|
|
139
|
+
labelKey: 'nav.provider.label',
|
|
140
|
+
icon: 'Inbox',
|
|
141
|
+
section: 'newsletter',
|
|
142
|
+
weight: 600,
|
|
143
|
+
// The code the hand-written row carried, kept: this row advertises the
|
|
144
|
+
// provider configuration, not a read-only screen.
|
|
145
|
+
requiredPermission: WRITE_PERMISSION,
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function AutomationBuilder(): React.ReactElement;
|
|
2
|
+
/**
|
|
3
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
4
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
5
|
+
* the spelling this module's own code and its tests use.
|
|
6
|
+
*/
|
|
7
|
+
export default AutomationBuilder;
|
|
8
|
+
//# sourceMappingURL=AutomationBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomationBuilder.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/AutomationBuilder.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAiQtD;AAED;;;;GAIG;AACH,eAAe,iBAAiB,CAAC"}
|