@contractspec/module.notifications 0.0.0-canary-20260113162409
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 +121 -0
- package/dist/channels/index.d.ts +107 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +127 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/contracts/index.d.ts +638 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +433 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/entities/index.d.ts +183 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +254 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/notifications.capability.d.ts +7 -0
- package/dist/notifications.capability.d.ts.map +1 -0
- package/dist/notifications.capability.js +20 -0
- package/dist/notifications.capability.js.map +1 -0
- package/dist/notifications.feature.d.ts +12 -0
- package/dist/notifications.feature.d.ts.map +1 -0
- package/dist/notifications.feature.js +77 -0
- package/dist/notifications.feature.js.map +1 -0
- package/dist/templates/index.d.ts +92 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +202 -0
- package/dist/templates/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
//#region src/templates/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* Define a notification template.
|
|
4
|
+
*/
|
|
5
|
+
function defineTemplate(def) {
|
|
6
|
+
return def;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Render a template with variables.
|
|
10
|
+
*/
|
|
11
|
+
function renderTemplate(content, variables) {
|
|
12
|
+
return content.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
13
|
+
const value = variables[key];
|
|
14
|
+
if (value === void 0 || value === null) return match;
|
|
15
|
+
return String(value);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Render a notification template for a specific channel.
|
|
20
|
+
*/
|
|
21
|
+
function renderNotificationTemplate(template, channel, variables) {
|
|
22
|
+
const channelContent = template.channels[channel];
|
|
23
|
+
if (!channelContent) return null;
|
|
24
|
+
const title = channelContent.title ? renderTemplate(channelContent.title, variables) : template.name;
|
|
25
|
+
const body = renderTemplate(channelContent.body, variables);
|
|
26
|
+
const result = {
|
|
27
|
+
title,
|
|
28
|
+
body,
|
|
29
|
+
actionUrl: channelContent.actionUrl ? renderTemplate(channelContent.actionUrl, variables) : void 0
|
|
30
|
+
};
|
|
31
|
+
if (channel === "email" && channelContent.subject) result.email = {
|
|
32
|
+
subject: renderTemplate(channelContent.subject, variables),
|
|
33
|
+
html: body,
|
|
34
|
+
text: stripHtml(body)
|
|
35
|
+
};
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Strip HTML tags from content (for plain text).
|
|
40
|
+
*/
|
|
41
|
+
function stripHtml(html) {
|
|
42
|
+
return html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Template registry for managing templates.
|
|
46
|
+
*/
|
|
47
|
+
var TemplateRegistry = class {
|
|
48
|
+
templates = /* @__PURE__ */ new Map();
|
|
49
|
+
register(template) {
|
|
50
|
+
this.templates.set(template.id, template);
|
|
51
|
+
}
|
|
52
|
+
get(templateId) {
|
|
53
|
+
return this.templates.get(templateId);
|
|
54
|
+
}
|
|
55
|
+
getAll() {
|
|
56
|
+
return Array.from(this.templates.values());
|
|
57
|
+
}
|
|
58
|
+
getByCategory(category) {
|
|
59
|
+
return this.getAll().filter((t) => t.category === category);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Create a template registry.
|
|
64
|
+
*/
|
|
65
|
+
function createTemplateRegistry() {
|
|
66
|
+
return new TemplateRegistry();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Welcome email template.
|
|
70
|
+
*/
|
|
71
|
+
const WelcomeTemplate = defineTemplate({
|
|
72
|
+
id: "welcome",
|
|
73
|
+
name: "Welcome",
|
|
74
|
+
description: "Sent when a user signs up.",
|
|
75
|
+
category: "onboarding",
|
|
76
|
+
variables: [
|
|
77
|
+
{
|
|
78
|
+
name: "name",
|
|
79
|
+
type: "string",
|
|
80
|
+
required: true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "appName",
|
|
84
|
+
type: "string",
|
|
85
|
+
default: "ContractSpec"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "actionUrl",
|
|
89
|
+
type: "url"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
defaultChannels: ["EMAIL", "IN_APP"],
|
|
93
|
+
channels: {
|
|
94
|
+
email: {
|
|
95
|
+
subject: "Welcome to {{appName}}, {{name}}!",
|
|
96
|
+
body: `
|
|
97
|
+
<h1>Welcome, {{name}}!</h1>
|
|
98
|
+
<p>Thanks for joining {{appName}}. We're excited to have you on board.</p>
|
|
99
|
+
<p><a href="{{actionUrl}}">Get started now</a></p>
|
|
100
|
+
`
|
|
101
|
+
},
|
|
102
|
+
inApp: {
|
|
103
|
+
title: "Welcome to {{appName}}!",
|
|
104
|
+
body: "Thanks for joining. Click to complete your profile.",
|
|
105
|
+
actionUrl: "{{actionUrl}}"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Organization invite template.
|
|
111
|
+
*/
|
|
112
|
+
const OrgInviteTemplate = defineTemplate({
|
|
113
|
+
id: "org-invite",
|
|
114
|
+
name: "Organization Invitation",
|
|
115
|
+
description: "Sent when a user is invited to an organization.",
|
|
116
|
+
category: "organization",
|
|
117
|
+
variables: [
|
|
118
|
+
{
|
|
119
|
+
name: "inviterName",
|
|
120
|
+
type: "string",
|
|
121
|
+
required: true
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "orgName",
|
|
125
|
+
type: "string",
|
|
126
|
+
required: true
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "role",
|
|
130
|
+
type: "string",
|
|
131
|
+
default: "member"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "actionUrl",
|
|
135
|
+
type: "url",
|
|
136
|
+
required: true
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
defaultChannels: ["EMAIL"],
|
|
140
|
+
channels: {
|
|
141
|
+
email: {
|
|
142
|
+
subject: "{{inviterName}} invited you to join {{orgName}}",
|
|
143
|
+
body: `
|
|
144
|
+
<h1>You've been invited!</h1>
|
|
145
|
+
<p>{{inviterName}} has invited you to join <strong>{{orgName}}</strong> as a {{role}}.</p>
|
|
146
|
+
<p><a href="{{actionUrl}}">Accept invitation</a></p>
|
|
147
|
+
`
|
|
148
|
+
},
|
|
149
|
+
inApp: {
|
|
150
|
+
title: "Invitation to {{orgName}}",
|
|
151
|
+
body: "{{inviterName}} invited you to join as {{role}}.",
|
|
152
|
+
actionUrl: "{{actionUrl}}",
|
|
153
|
+
actionText: "Accept"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
/**
|
|
158
|
+
* Mention template.
|
|
159
|
+
*/
|
|
160
|
+
const MentionTemplate = defineTemplate({
|
|
161
|
+
id: "mention",
|
|
162
|
+
name: "Mention",
|
|
163
|
+
description: "Sent when a user is mentioned.",
|
|
164
|
+
category: "social",
|
|
165
|
+
variables: [
|
|
166
|
+
{
|
|
167
|
+
name: "mentionerName",
|
|
168
|
+
type: "string",
|
|
169
|
+
required: true
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "context",
|
|
173
|
+
type: "string",
|
|
174
|
+
required: true
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: "preview",
|
|
178
|
+
type: "string"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: "actionUrl",
|
|
182
|
+
type: "url",
|
|
183
|
+
required: true
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
defaultChannels: ["IN_APP", "PUSH"],
|
|
187
|
+
channels: {
|
|
188
|
+
inApp: {
|
|
189
|
+
title: "{{mentionerName}} mentioned you",
|
|
190
|
+
body: "In {{context}}: \"{{preview}}\"",
|
|
191
|
+
actionUrl: "{{actionUrl}}"
|
|
192
|
+
},
|
|
193
|
+
push: {
|
|
194
|
+
title: "{{mentionerName}} mentioned you",
|
|
195
|
+
body: "{{preview}}"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
export { MentionTemplate, OrgInviteTemplate, TemplateRegistry, WelcomeTemplate, createTemplateRegistry, defineTemplate, renderNotificationTemplate, renderTemplate };
|
|
202
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/templates/index.ts"],"sourcesContent":["/**\n * Template variable definition.\n */\nexport interface TemplateVariable {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'url';\n required?: boolean;\n default?: string | number | boolean;\n description?: string;\n}\n\n/**\n * Channel-specific template content.\n */\nexport interface ChannelTemplateContent {\n title?: string;\n subject?: string;\n body: string;\n actionUrl?: string;\n actionText?: string;\n}\n\n/**\n * Notification template definition.\n */\nexport interface NotificationTemplateDefinition {\n id: string;\n name: string;\n description?: string;\n category?: string;\n variables?: TemplateVariable[];\n defaultChannels?: string[];\n channels: {\n email?: ChannelTemplateContent;\n inApp?: ChannelTemplateContent;\n push?: ChannelTemplateContent;\n webhook?: ChannelTemplateContent;\n };\n}\n\n/**\n * Rendered notification content.\n */\nexport interface RenderedNotification {\n title: string;\n body: string;\n actionUrl?: string;\n email?: {\n subject: string;\n html: string;\n text: string;\n };\n}\n\n/**\n * Define a notification template.\n */\nexport function defineTemplate(\n def: NotificationTemplateDefinition\n): NotificationTemplateDefinition {\n return def;\n}\n\n/**\n * Render a template with variables.\n */\nexport function renderTemplate(\n content: string,\n variables: Record<string, unknown>\n): string {\n return content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n const value = variables[key];\n if (value === undefined || value === null) {\n return match; // Keep placeholder if no value\n }\n return String(value);\n });\n}\n\n/**\n * Render a notification template for a specific channel.\n */\nexport function renderNotificationTemplate(\n template: NotificationTemplateDefinition,\n channel: keyof NotificationTemplateDefinition['channels'],\n variables: Record<string, unknown>\n): RenderedNotification | null {\n const channelContent = template.channels[channel];\n if (!channelContent) {\n return null;\n }\n\n const title = channelContent.title\n ? renderTemplate(channelContent.title, variables)\n : template.name;\n\n const body = renderTemplate(channelContent.body, variables);\n\n const actionUrl = channelContent.actionUrl\n ? renderTemplate(channelContent.actionUrl, variables)\n : undefined;\n\n const result: RenderedNotification = {\n title,\n body,\n actionUrl,\n };\n\n // Add email-specific rendering\n if (channel === 'email' && channelContent.subject) {\n result.email = {\n subject: renderTemplate(channelContent.subject, variables),\n html: body,\n text: stripHtml(body),\n };\n }\n\n return result;\n}\n\n/**\n * Strip HTML tags from content (for plain text).\n */\nfunction stripHtml(html: string): string {\n return html\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Template registry for managing templates.\n */\nexport class TemplateRegistry {\n private templates = new Map<string, NotificationTemplateDefinition>();\n\n register(template: NotificationTemplateDefinition): void {\n this.templates.set(template.id, template);\n }\n\n get(templateId: string): NotificationTemplateDefinition | undefined {\n return this.templates.get(templateId);\n }\n\n getAll(): NotificationTemplateDefinition[] {\n return Array.from(this.templates.values());\n }\n\n getByCategory(category: string): NotificationTemplateDefinition[] {\n return this.getAll().filter((t) => t.category === category);\n }\n}\n\n/**\n * Create a template registry.\n */\nexport function createTemplateRegistry(): TemplateRegistry {\n return new TemplateRegistry();\n}\n\n// ============ Standard Templates ============\n\n/**\n * Welcome email template.\n */\nexport const WelcomeTemplate = defineTemplate({\n id: 'welcome',\n name: 'Welcome',\n description: 'Sent when a user signs up.',\n category: 'onboarding',\n variables: [\n { name: 'name', type: 'string', required: true },\n { name: 'appName', type: 'string', default: 'ContractSpec' },\n { name: 'actionUrl', type: 'url' },\n ],\n defaultChannels: ['EMAIL', 'IN_APP'],\n channels: {\n email: {\n subject: 'Welcome to {{appName}}, {{name}}!',\n body: `\n <h1>Welcome, {{name}}!</h1>\n <p>Thanks for joining {{appName}}. We're excited to have you on board.</p>\n <p><a href=\"{{actionUrl}}\">Get started now</a></p>\n `,\n },\n inApp: {\n title: 'Welcome to {{appName}}!',\n body: 'Thanks for joining. Click to complete your profile.',\n actionUrl: '{{actionUrl}}',\n },\n },\n});\n\n/**\n * Organization invite template.\n */\nexport const OrgInviteTemplate = defineTemplate({\n id: 'org-invite',\n name: 'Organization Invitation',\n description: 'Sent when a user is invited to an organization.',\n category: 'organization',\n variables: [\n { name: 'inviterName', type: 'string', required: true },\n { name: 'orgName', type: 'string', required: true },\n { name: 'role', type: 'string', default: 'member' },\n { name: 'actionUrl', type: 'url', required: true },\n ],\n defaultChannels: ['EMAIL'],\n channels: {\n email: {\n subject: '{{inviterName}} invited you to join {{orgName}}',\n body: `\n <h1>You've been invited!</h1>\n <p>{{inviterName}} has invited you to join <strong>{{orgName}}</strong> as a {{role}}.</p>\n <p><a href=\"{{actionUrl}}\">Accept invitation</a></p>\n `,\n },\n inApp: {\n title: 'Invitation to {{orgName}}',\n body: '{{inviterName}} invited you to join as {{role}}.',\n actionUrl: '{{actionUrl}}',\n actionText: 'Accept',\n },\n },\n});\n\n/**\n * Mention template.\n */\nexport const MentionTemplate = defineTemplate({\n id: 'mention',\n name: 'Mention',\n description: 'Sent when a user is mentioned.',\n category: 'social',\n variables: [\n { name: 'mentionerName', type: 'string', required: true },\n { name: 'context', type: 'string', required: true },\n { name: 'preview', type: 'string' },\n { name: 'actionUrl', type: 'url', required: true },\n ],\n defaultChannels: ['IN_APP', 'PUSH'],\n channels: {\n inApp: {\n title: '{{mentionerName}} mentioned you',\n body: 'In {{context}}: \"{{preview}}\"',\n actionUrl: '{{actionUrl}}',\n },\n push: {\n title: '{{mentionerName}} mentioned you',\n body: '{{preview}}',\n },\n },\n});\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@contractspec/module.notifications",
|
|
3
|
+
"version": "0.0.0-canary-20260113162409",
|
|
4
|
+
"description": "Notification center module for ContractSpec applications",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"contractspec",
|
|
7
|
+
"notifications",
|
|
8
|
+
"messaging",
|
|
9
|
+
"channels",
|
|
10
|
+
"email",
|
|
11
|
+
"typescript"
|
|
12
|
+
],
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"scripts": {
|
|
16
|
+
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
17
|
+
"publish:pkg:canary": "bun publish:pkg --tag canary",
|
|
18
|
+
"build": "bun build:types && bun build:bundle",
|
|
19
|
+
"build:bundle": "tsdown",
|
|
20
|
+
"build:types": "tsc --noEmit",
|
|
21
|
+
"dev": "bun build:bundle --watch",
|
|
22
|
+
"clean": "rimraf dist .turbo",
|
|
23
|
+
"lint": "bun lint:fix",
|
|
24
|
+
"lint:fix": "eslint src --fix",
|
|
25
|
+
"lint:check": "eslint src"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@contractspec/lib.schema": "0.0.0-canary-20260113162409",
|
|
29
|
+
"@contractspec/lib.contracts": "0.0.0-canary-20260113162409",
|
|
30
|
+
"@contractspec/lib.bus": "0.0.0-canary-20260113162409",
|
|
31
|
+
"zod": "^4.3.5"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@contractspec/tool.typescript": "0.0.0-canary-20260113162409",
|
|
35
|
+
"@contractspec/tool.tsdown": "0.0.0-canary-20260113162409",
|
|
36
|
+
"typescript": "^5.9.3"
|
|
37
|
+
},
|
|
38
|
+
"exports": {
|
|
39
|
+
".": "./dist/index.js",
|
|
40
|
+
"./channels": "./dist/channels/index.js",
|
|
41
|
+
"./contracts": "./dist/contracts/index.js",
|
|
42
|
+
"./entities": "./dist/entities/index.js",
|
|
43
|
+
"./notifications.capability": "./dist/notifications.capability.js",
|
|
44
|
+
"./notifications.feature": "./dist/notifications.feature.js",
|
|
45
|
+
"./templates": "./dist/templates/index.js",
|
|
46
|
+
"./*": "./*"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"exports": {
|
|
55
|
+
".": "./dist/index.js",
|
|
56
|
+
"./channels": "./dist/channels/index.js",
|
|
57
|
+
"./contracts": "./dist/contracts/index.js",
|
|
58
|
+
"./entities": "./dist/entities/index.js",
|
|
59
|
+
"./notifications.feature": "./dist/notifications.feature.js",
|
|
60
|
+
"./templates": "./dist/templates/index.js",
|
|
61
|
+
"./*": "./*"
|
|
62
|
+
},
|
|
63
|
+
"registry": "https://registry.npmjs.org/"
|
|
64
|
+
},
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"repository": {
|
|
67
|
+
"type": "git",
|
|
68
|
+
"url": "https://github.com/lssm-tech/contractspec.git",
|
|
69
|
+
"directory": "packages/modules/notifications"
|
|
70
|
+
},
|
|
71
|
+
"homepage": "https://contractspec.io"
|
|
72
|
+
}
|