@aglyn/shared-util-email 1.0.0-beta.264 → 1.0.0-beta.266

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.
@@ -64,6 +64,21 @@
64
64
  description: 'The main action’s link',
65
65
  sample: 'https://app.example.com/test-org/settings/holds'
66
66
  },
67
+ {
68
+ name: 'notice.otherActions',
69
+ description: 'The actions besides the main one, one per line, as label and link',
70
+ sample: 'View holds and reviews: https://app.example.com/test-org/settings/holds'
71
+ },
72
+ {
73
+ name: 'notice.eyebrow',
74
+ description: 'Whose notice it is, above the title',
75
+ sample: 'Test Org · Account safety'
76
+ },
77
+ {
78
+ name: 'notice.details',
79
+ description: 'The workspace, the case reference and any message from our team',
80
+ sample: 'Workspace: Test Org\nReference: HS-0A1B2C3D4E'
81
+ },
67
82
  {
68
83
  name: 'workspace.name',
69
84
  description: 'The workspace the notice is about',
@@ -91,6 +106,11 @@
91
106
  }
92
107
  ];
93
108
  /** The content every risk notice email starts from. */ export const RISK_NOTICE_DEFAULT_BODY = [
109
+ {
110
+ block: 'text',
111
+ text: '{{notice.eyebrow}}',
112
+ variant: 'eyebrow'
113
+ },
94
114
  {
95
115
  block: 'text',
96
116
  text: '{{notice.title}}',
@@ -106,6 +126,11 @@
106
126
  text: '{{notice.meaning}}',
107
127
  variant: 'body'
108
128
  },
129
+ {
130
+ block: 'text',
131
+ text: '{{notice.details}}',
132
+ variant: 'details'
133
+ },
109
134
  {
110
135
  block: 'text',
111
136
  text: 'What to do next',
@@ -123,12 +148,12 @@
123
148
  },
124
149
  {
125
150
  block: 'text',
126
- text: '{{notice.actions}}',
127
- variant: 'caption'
151
+ text: '{{notice.otherActions}}',
152
+ variant: 'links'
128
153
  },
129
154
  {
130
155
  block: 'text',
131
- text: 'Reference {{reference}}. Why was something held or flagged? {{help.url}}',
156
+ text: 'Why was something held or flagged? The help page explains each kind of notice: {{help.url}}',
132
157
  variant: 'caption'
133
158
  }
134
159
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/shared/util/email/src/lib/risk-notice-emails.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * THE RISK NOTICES, AS SYSTEM EMAILS (AGL-3368).\n *\n * Every kind in the risk notice catalog sends its owner email under its own\n * key (`risk-<kind>`), so staff can redesign what, say, a lock notice looks\n * like on the System emails page without touching a held-email notice. Two\n * more keys carry the burst digest and the acknowledgment an owner gets when\n * they request a review.\n *\n * Generated from the catalog rather than written out 40-odd times: the\n * content is the same shape for every kind — the title, what happened, what\n * it means, the numbered steps and the actions — and the catalog is where\n * the words live. The merge tokens below are what `notifyRiskEvent` fills.\n *=========================================*/\n\nimport {\n RISK_EVENT_KINDS,\n RISK_NOTICE_CATALOG,\n RISK_NOTICE_DIGEST_EMAIL_KEY,\n riskNoticeEmailKey,\n} from './risk-notice-catalog'\nimport type {\n SystemEmailDefaultBlock,\n SystemEmailMergeToken,\n SystemEmailTemplateDefinition,\n} from './system-email-catalog'\n\n/** The key an owner's review-request acknowledgment is designed under. */\nexport const RISK_REVIEW_REQUESTED_EMAIL_KEY = 'risk-review-requested'\n\n/** The tokens every risk notice email is rendered with. */\nexport const RISK_NOTICE_EMAIL_TOKENS: readonly SystemEmailMergeToken[] = [\n {\n name: 'notice.title',\n description: 'The notice, in one line (also the subject)',\n sample: 'An email is on hold for review',\n },\n {\n name: 'notice.summary',\n description: 'What happened, on what, and when',\n sample:\n 'Our automated safety review held the campaign \"Spring sale\" from Test Org on Sep 28, 2026, 16:31 UTC before it was sent.',\n },\n {\n name: 'notice.meaning',\n description: 'What it means for the reader',\n sample: 'This email was not sent. Nobody on your list received it.',\n },\n {\n name: 'notice.steps',\n description: 'What to do next, as a numbered list',\n sample: '1. Open the email and check it.\\n2. If you think this is a mistake, choose Request a review.',\n },\n {\n name: 'notice.actions',\n description: 'Every action, one per line, as label and link',\n sample: 'Request a review: https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'notice.primaryActionLabel',\n description: 'The main action’s label',\n sample: 'Request a review',\n },\n {\n name: 'notice.primaryActionUrl',\n description: 'The main action’s link',\n sample: 'https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'workspace.name',\n description: 'The workspace the notice is about',\n sample: 'Test Org',\n },\n {\n name: 'lock.message',\n description: 'The message staff wrote with a lock, when there is one',\n sample: 'Access is temporarily disabled while we investigate a security concern.',\n },\n {\n name: 'reference',\n description: 'The case reference support knows it by',\n sample: 'HS-0A1B2C3D4E',\n },\n {\n name: 'holds.url',\n description: 'The workspace’s Holds & reviews page',\n sample: 'https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'help.url',\n description: 'The help page explaining holds and reviews',\n sample: 'https://docs.example.com/help/holds-and-reviews',\n },\n]\n\n/** The content every risk notice email starts from. */\nexport const RISK_NOTICE_DEFAULT_BODY: readonly SystemEmailDefaultBlock[] = [\n { block: 'text', text: '{{notice.title}}', variant: 'heading' },\n { block: 'text', text: '{{notice.summary}}', variant: 'body' },\n { block: 'text', text: '{{notice.meaning}}', variant: 'body' },\n { block: 'text', text: 'What to do next', variant: 'subheading' },\n { block: 'text', text: '{{notice.steps}}', variant: 'body' },\n { block: 'button', label: '{{notice.primaryActionLabel}}', href: '{{notice.primaryActionUrl}}' },\n { block: 'text', text: '{{notice.actions}}', variant: 'caption' },\n {\n block: 'text',\n text: 'Reference {{reference}}. Why was something held or flagged? {{help.url}}',\n variant: 'caption',\n },\n]\n\nconst FOOTER_REASON =\n 'You’re receiving this because it concerns your {{brand.productName}} account or ' +\n 'a workspace you own or manage. It is sent even if notification email is off.'\n\nconst SOURCE = 'libs/tenant/data/admin/src/lib/server/risk-notice.ts'\n\n/** One System emails entry per risk kind, plus the digest and the review acknowledgment. */\nexport const RISK_NOTICE_SYSTEM_EMAIL_TEMPLATES: readonly SystemEmailTemplateDefinition[] = [\n ...RISK_EVENT_KINDS.map((kind): SystemEmailTemplateDefinition => {\n const definition = RISK_NOTICE_CATALOG[kind]\n return {\n key: riskNoticeEmailKey(kind),\n name: `Risk notice: ${definition.owner.title.replace(/\\{\\{[^}]*\\}\\}/g, '…')}`,\n description:\n `Sent to the owners and admins when this happens (${kind}). ` +\n 'Transactional: it ignores notification settings and reaches a locked workspace.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n }\n }),\n {\n key: RISK_NOTICE_DIGEST_EMAIL_KEY,\n name: 'Risk notice: summary of held or flagged items',\n description:\n 'Sent instead of one email per item when many items on a workspace are held or ' +\n 'flagged within an hour.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n },\n {\n key: RISK_REVIEW_REQUESTED_EMAIL_KEY,\n name: 'Risk notice: review request received',\n description:\n 'Sent to an owner or admin who asked for a review of a held or flagged item, ' +\n 'confirming the request reached the review team.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n },\n]\n"],"names":["RISK_EVENT_KINDS","RISK_NOTICE_CATALOG","RISK_NOTICE_DIGEST_EMAIL_KEY","riskNoticeEmailKey","RISK_REVIEW_REQUESTED_EMAIL_KEY","RISK_NOTICE_EMAIL_TOKENS","name","description","sample","RISK_NOTICE_DEFAULT_BODY","block","text","variant","label","href","FOOTER_REASON","SOURCE","RISK_NOTICE_SYSTEM_EMAIL_TEMPLATES","map","kind","definition","key","owner","title","replace","deliveredBy","defaultSubject","mergeTokens","defaultBody","footerReason","source"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;2CAa2C,GAE3C,SACEA,gBAAgB,EAChBC,mBAAmB,EACnBC,4BAA4B,EAC5BC,kBAAkB,QACb,2BAAuB;AAO9B,wEAAwE,GACxE,OAAO,MAAMC,kCAAkC,wBAAuB;AAEtE,yDAAyD,GACzD,OAAO,MAAMC,2BAA6D;IACxE;QACEC,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QACE;IACJ;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,aAAa;QACbC,QAAQ;IACV;CACD,CAAA;AAED,qDAAqD,GACrD,OAAO,MAAMC,2BAA+D;IAC1E;QAAEC,OAAO;QAAQC,MAAM;QAAoBC,SAAS;IAAU;IAC9D;QAAEF,OAAO;QAAQC,MAAM;QAAsBC,SAAS;IAAO;IAC7D;QAAEF,OAAO;QAAQC,MAAM;QAAsBC,SAAS;IAAO;IAC7D;QAAEF,OAAO;QAAQC,MAAM;QAAmBC,SAAS;IAAa;IAChE;QAAEF,OAAO;QAAQC,MAAM;QAAoBC,SAAS;IAAO;IAC3D;QAAEF,OAAO;QAAUG,OAAO;QAAiCC,MAAM;IAA8B;IAC/F;QAAEJ,OAAO;QAAQC,MAAM;QAAsBC,SAAS;IAAU;IAChE;QACEF,OAAO;QACPC,MAAM;QACNC,SAAS;IACX;CACD,CAAA;AAED,MAAMG,gBACJ,qFACA;AAEF,MAAMC,SAAS;AAEf,0FAA0F,GAC1F,OAAO,MAAMC,qCAA+E;OACvFjB,iBAAiBkB,GAAG,CAAC,CAACC;QACvB,MAAMC,aAAanB,mBAAmB,CAACkB,KAAK;QAC5C,OAAO;YACLE,KAAKlB,mBAAmBgB;YACxBb,MAAM,CAAC,aAAa,EAAEc,WAAWE,KAAK,CAACC,KAAK,CAACC,OAAO,CAAC,kBAAkB,MAAM;YAC7EjB,aACE,CAAC,iDAAiD,EAAEY,KAAK,GAAG,CAAC,GAC7D;YACFM,aAAa;YACbC,gBAAgB;YAChBC,aAAa;mBAAItB;aAAyB;YAC1CuB,aAAanB;YACboB,cAAcd;YACde,QAAQd;QACV;IACF;IACA;QACEK,KAAKnB;QACLI,MAAM;QACNC,aACE,mFACA;QACFkB,aAAa;QACbC,gBAAgB;QAChBC,aAAa;eAAItB;SAAyB;QAC1CuB,aAAanB;QACboB,cAAcd;QACde,QAAQd;IACV;IACA;QACEK,KAAKjB;QACLE,MAAM;QACNC,aACE,iFACA;QACFkB,aAAa;QACbC,gBAAgB;QAChBC,aAAa;eAAItB;SAAyB;QAC1CuB,aAAanB;QACboB,cAAcd;QACde,QAAQd;IACV;CACD,CAAA"}
1
+ {"version":3,"sources":["../../../../../../../libs/shared/util/email/src/lib/risk-notice-emails.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * THE RISK NOTICES, AS SYSTEM EMAILS (AGL-3368).\n *\n * Every kind in the risk notice catalog sends its owner email under its own\n * key (`risk-<kind>`), so staff can redesign what, say, a lock notice looks\n * like on the System emails page without touching a held-email notice. Two\n * more keys carry the burst digest and the acknowledgment an owner gets when\n * they request a review.\n *\n * Generated from the catalog rather than written out 40-odd times: the\n * content is the same shape for every kind — the title, what happened, what\n * it means, the numbered steps and the actions — and the catalog is where\n * the words live. The merge tokens below are what `notifyRiskEvent` fills.\n *=========================================*/\n\nimport {\n RISK_EVENT_KINDS,\n RISK_NOTICE_CATALOG,\n RISK_NOTICE_DIGEST_EMAIL_KEY,\n riskNoticeEmailKey,\n} from './risk-notice-catalog'\nimport type {\n SystemEmailDefaultBlock,\n SystemEmailMergeToken,\n SystemEmailTemplateDefinition,\n} from './system-email-catalog'\n\n/** The key an owner's review-request acknowledgment is designed under. */\nexport const RISK_REVIEW_REQUESTED_EMAIL_KEY = 'risk-review-requested'\n\n/** The tokens every risk notice email is rendered with. */\nexport const RISK_NOTICE_EMAIL_TOKENS: readonly SystemEmailMergeToken[] = [\n {\n name: 'notice.title',\n description: 'The notice, in one line (also the subject)',\n sample: 'An email is on hold for review',\n },\n {\n name: 'notice.summary',\n description: 'What happened, on what, and when',\n sample:\n 'Our automated safety review held the campaign \"Spring sale\" from Test Org on Sep 28, 2026, 16:31 UTC before it was sent.',\n },\n {\n name: 'notice.meaning',\n description: 'What it means for the reader',\n sample: 'This email was not sent. Nobody on your list received it.',\n },\n {\n name: 'notice.steps',\n description: 'What to do next, as a numbered list',\n sample: '1. Open the email and check it.\\n2. If you think this is a mistake, choose Request a review.',\n },\n {\n name: 'notice.actions',\n description: 'Every action, one per line, as label and link',\n sample: 'Request a review: https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'notice.primaryActionLabel',\n description: 'The main action’s label',\n sample: 'Request a review',\n },\n {\n name: 'notice.primaryActionUrl',\n description: 'The main action’s link',\n sample: 'https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'notice.otherActions',\n description: 'The actions besides the main one, one per line, as label and link',\n sample: 'View holds and reviews: https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'notice.eyebrow',\n description: 'Whose notice it is, above the title',\n sample: 'Test Org · Account safety',\n },\n {\n name: 'notice.details',\n description: 'The workspace, the case reference and any message from our team',\n sample: 'Workspace: Test Org\\nReference: HS-0A1B2C3D4E',\n },\n {\n name: 'workspace.name',\n description: 'The workspace the notice is about',\n sample: 'Test Org',\n },\n {\n name: 'lock.message',\n description: 'The message staff wrote with a lock, when there is one',\n sample: 'Access is temporarily disabled while we investigate a security concern.',\n },\n {\n name: 'reference',\n description: 'The case reference support knows it by',\n sample: 'HS-0A1B2C3D4E',\n },\n {\n name: 'holds.url',\n description: 'The workspace’s Holds & reviews page',\n sample: 'https://app.example.com/test-org/settings/holds',\n },\n {\n name: 'help.url',\n description: 'The help page explaining holds and reviews',\n sample: 'https://docs.example.com/help/holds-and-reviews',\n },\n]\n\n/** The content every risk notice email starts from. */\nexport const RISK_NOTICE_DEFAULT_BODY: readonly SystemEmailDefaultBlock[] = [\n { block: 'text', text: '{{notice.eyebrow}}', variant: 'eyebrow' },\n { block: 'text', text: '{{notice.title}}', variant: 'heading' },\n { block: 'text', text: '{{notice.summary}}', variant: 'body' },\n { block: 'text', text: '{{notice.meaning}}', variant: 'body' },\n { block: 'text', text: '{{notice.details}}', variant: 'details' },\n { block: 'text', text: 'What to do next', variant: 'subheading' },\n { block: 'text', text: '{{notice.steps}}', variant: 'body' },\n { block: 'button', label: '{{notice.primaryActionLabel}}', href: '{{notice.primaryActionUrl}}' },\n { block: 'text', text: '{{notice.otherActions}}', variant: 'links' },\n {\n block: 'text',\n text: 'Why was something held or flagged? The help page explains each kind of notice: {{help.url}}',\n variant: 'caption',\n },\n]\n\nconst FOOTER_REASON =\n 'You’re receiving this because it concerns your {{brand.productName}} account or ' +\n 'a workspace you own or manage. It is sent even if notification email is off.'\n\nconst SOURCE = 'libs/tenant/data/admin/src/lib/server/risk-notice.ts'\n\n/** One System emails entry per risk kind, plus the digest and the review acknowledgment. */\nexport const RISK_NOTICE_SYSTEM_EMAIL_TEMPLATES: readonly SystemEmailTemplateDefinition[] = [\n ...RISK_EVENT_KINDS.map((kind): SystemEmailTemplateDefinition => {\n const definition = RISK_NOTICE_CATALOG[kind]\n return {\n key: riskNoticeEmailKey(kind),\n name: `Risk notice: ${definition.owner.title.replace(/\\{\\{[^}]*\\}\\}/g, '…')}`,\n description:\n `Sent to the owners and admins when this happens (${kind}). ` +\n 'Transactional: it ignores notification settings and reaches a locked workspace.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n }\n }),\n {\n key: RISK_NOTICE_DIGEST_EMAIL_KEY,\n name: 'Risk notice: summary of held or flagged items',\n description:\n 'Sent instead of one email per item when many items on a workspace are held or ' +\n 'flagged within an hour.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n },\n {\n key: RISK_REVIEW_REQUESTED_EMAIL_KEY,\n name: 'Risk notice: review request received',\n description:\n 'Sent to an owner or admin who asked for a review of a held or flagged item, ' +\n 'confirming the request reached the review team.',\n deliveredBy: 'resend',\n defaultSubject: '{{notice.title}}',\n mergeTokens: [...RISK_NOTICE_EMAIL_TOKENS],\n defaultBody: RISK_NOTICE_DEFAULT_BODY,\n footerReason: FOOTER_REASON,\n source: SOURCE,\n },\n]\n"],"names":["RISK_EVENT_KINDS","RISK_NOTICE_CATALOG","RISK_NOTICE_DIGEST_EMAIL_KEY","riskNoticeEmailKey","RISK_REVIEW_REQUESTED_EMAIL_KEY","RISK_NOTICE_EMAIL_TOKENS","name","description","sample","RISK_NOTICE_DEFAULT_BODY","block","text","variant","label","href","FOOTER_REASON","SOURCE","RISK_NOTICE_SYSTEM_EMAIL_TEMPLATES","map","kind","definition","key","owner","title","replace","deliveredBy","defaultSubject","mergeTokens","defaultBody","footerReason","source"],"mappings":"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"}
@@ -63,7 +63,11 @@ export interface SystemEmailMergeToken {
63
63
  export type SystemEmailDefaultBlock = {
64
64
  block: 'text';
65
65
  text: string;
66
- variant?: 'heading' | 'subheading' | 'body' | 'caption';
66
+ /**
67
+ * `eyebrow` is a small muted line above a heading; `details` draws each
68
+ * "Label: value" line as a row of a panel (AGL-3897).
69
+ */
70
+ variant?: 'heading' | 'subheading' | 'body' | 'caption' | 'eyebrow' | 'details' | 'links';
67
71
  } | {
68
72
  block: 'button';
69
73
  label: string;