@bernierllc/email-sender 2.0.2 → 3.0.3

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.
Files changed (45) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +7 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/providers/sendgrid/client.d.ts +26 -0
  6. package/dist/providers/sendgrid/client.d.ts.map +1 -0
  7. package/dist/providers/sendgrid/client.js +71 -0
  8. package/dist/providers/sendgrid/client.js.map +1 -0
  9. package/dist/providers/sendgrid/converters.d.ts +19 -0
  10. package/dist/providers/sendgrid/converters.d.ts.map +1 -0
  11. package/dist/providers/sendgrid/converters.js +54 -0
  12. package/dist/providers/sendgrid/converters.js.map +1 -0
  13. package/dist/providers/sendgrid/errors.d.ts +23 -0
  14. package/dist/providers/sendgrid/errors.d.ts.map +1 -0
  15. package/dist/providers/sendgrid/errors.js +53 -0
  16. package/dist/providers/sendgrid/errors.js.map +1 -0
  17. package/dist/providers/sendgrid/index.d.ts +13 -0
  18. package/dist/providers/sendgrid/index.d.ts.map +1 -0
  19. package/dist/providers/sendgrid/index.js +39 -0
  20. package/dist/providers/sendgrid/index.js.map +1 -0
  21. package/dist/providers/sendgrid/rate-limiter.d.ts +18 -0
  22. package/dist/providers/sendgrid/rate-limiter.d.ts.map +1 -0
  23. package/dist/providers/sendgrid/rate-limiter.js +69 -0
  24. package/dist/providers/sendgrid/rate-limiter.js.map +1 -0
  25. package/dist/providers/sendgrid/safety.d.ts +32 -0
  26. package/dist/providers/sendgrid/safety.d.ts.map +1 -0
  27. package/dist/providers/sendgrid/safety.js +82 -0
  28. package/dist/providers/sendgrid/safety.js.map +1 -0
  29. package/dist/providers/sendgrid/sender-manager.d.ts +25 -0
  30. package/dist/providers/sendgrid/sender-manager.d.ts.map +1 -0
  31. package/dist/providers/sendgrid/sender-manager.js +126 -0
  32. package/dist/providers/sendgrid/sender-manager.js.map +1 -0
  33. package/dist/providers/sendgrid/template-manager.d.ts +29 -0
  34. package/dist/providers/sendgrid/template-manager.d.ts.map +1 -0
  35. package/dist/providers/sendgrid/template-manager.js +153 -0
  36. package/dist/providers/sendgrid/template-manager.js.map +1 -0
  37. package/dist/providers/sendgrid/types.d.ts +136 -0
  38. package/dist/providers/sendgrid/types.d.ts.map +1 -0
  39. package/dist/providers/sendgrid/types.js +10 -0
  40. package/dist/providers/sendgrid/types.js.map +1 -0
  41. package/dist/providers/sendgrid.d.ts +63 -2
  42. package/dist/providers/sendgrid.d.ts.map +1 -1
  43. package/dist/providers/sendgrid.js +145 -1
  44. package/dist/providers/sendgrid.js.map +1 -1
  45. package/package.json +8 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-manager.d.ts","sourceRoot":"","sources":["../../../src/providers/sendgrid/sender-manager.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAEjB,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAGhB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,eAAe,EAC1B,MAAM,CAAC,EAAE;QACxB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,YAAA;IAGG,kBAAkB,CAAC,QAAQ,UAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoC9D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA8C9D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA0BzE,UAAU,IAAI,IAAI;IAMlB,OAAO,CAAC,oBAAoB;CAsB7B"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (c) 2025 Bernier LLC
4
+
5
+ This file is licensed to the client under a limited-use license.
6
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
7
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SenderManager = void 0;
11
+ const errors_1 = require("./errors");
12
+ class SenderManager {
13
+ constructor(client, converter, logger) {
14
+ this.client = client;
15
+ this.converter = converter;
16
+ this.logger = logger;
17
+ this.cacheTTL = 300000; // 5 minutes
18
+ }
19
+ async getVerifiedSenders(useCache = true) {
20
+ // Return cached data if valid
21
+ if (useCache &&
22
+ this.sendersCache &&
23
+ this.cacheTimestamp &&
24
+ Date.now() - this.cacheTimestamp < this.cacheTTL) {
25
+ this.logger?.debug('Returning cached verified senders');
26
+ return this.sendersCache;
27
+ }
28
+ const response = await this.client.request('/verified_senders', {
29
+ method: 'GET'
30
+ });
31
+ if (!this.client.isSuccessResponse(response)) {
32
+ throw new errors_1.SendGridApiError('Failed to fetch verified senders', response.statusCode, response.body);
33
+ }
34
+ const data = this.client.parseResponseBody(response);
35
+ const senders = data.results.map(sender => this.converter.convertToVerifiedSender(sender));
36
+ // Update cache
37
+ this.sendersCache = senders;
38
+ this.cacheTimestamp = Date.now();
39
+ this.logger?.info(`Fetched ${senders.length} verified senders from SendGrid`);
40
+ return senders;
41
+ }
42
+ async validateSender(email) {
43
+ const verifiedSenders = await this.getVerifiedSenders();
44
+ const emailDomain = this.converter.extractDomain(email);
45
+ // Check for exact match
46
+ const exactMatch = verifiedSenders.find(sender => sender.email.toLowerCase() === email.toLowerCase() && sender.isVerified);
47
+ if (exactMatch) {
48
+ return {
49
+ isValid: true,
50
+ verifiedSender: exactMatch,
51
+ domain: emailDomain,
52
+ domainMatches: [exactMatch],
53
+ errors: [],
54
+ suggestions: []
55
+ };
56
+ }
57
+ // Check for domain matches
58
+ const domainMatches = verifiedSenders.filter(sender => {
59
+ const senderDomain = this.converter.extractDomain(sender.email);
60
+ return this.converter.isDomainMatch(emailDomain, senderDomain) && sender.isVerified;
61
+ });
62
+ if (domainMatches.length > 0) {
63
+ return {
64
+ isValid: true,
65
+ domain: emailDomain,
66
+ domainMatches,
67
+ errors: [],
68
+ suggestions: domainMatches.map(sender => sender.email)
69
+ };
70
+ }
71
+ // No matches found
72
+ return {
73
+ isValid: false,
74
+ domain: emailDomain,
75
+ domainMatches: [],
76
+ errors: [`No verified sender found for email ${email} or domain ${emailDomain}`],
77
+ suggestions: this.getSenderSuggestions(email, verifiedSenders)
78
+ };
79
+ }
80
+ async selectBestSender(fromEmail) {
81
+ const validation = await this.validateSender(fromEmail);
82
+ if (!validation.isValid || validation.domainMatches.length === 0) {
83
+ return null;
84
+ }
85
+ // Prefer exact match
86
+ if (validation.verifiedSender) {
87
+ return validation.verifiedSender;
88
+ }
89
+ // Fall back to best domain match
90
+ // Priority: most recently verified, then alphabetical
91
+ const bestMatch = validation.domainMatches.sort((a, b) => {
92
+ if (a.lastVerifiedAt && b.lastVerifiedAt) {
93
+ return b.lastVerifiedAt.getTime() - a.lastVerifiedAt.getTime();
94
+ }
95
+ if (a.lastVerifiedAt && !b.lastVerifiedAt)
96
+ return -1;
97
+ if (!a.lastVerifiedAt && b.lastVerifiedAt)
98
+ return 1;
99
+ return a.email.localeCompare(b.email);
100
+ })[0];
101
+ return bestMatch || null;
102
+ }
103
+ clearCache() {
104
+ this.sendersCache = [];
105
+ this.cacheTimestamp = 0;
106
+ this.logger?.debug('Cleared verified senders cache');
107
+ }
108
+ getSenderSuggestions(email, senders) {
109
+ const emailDomain = this.converter.extractDomain(email);
110
+ // Find senders with similar domains
111
+ const suggestions = [];
112
+ for (const sender of senders) {
113
+ if (!sender.isVerified)
114
+ continue;
115
+ const senderDomain = this.converter.extractDomain(sender.email);
116
+ // Check for partial domain matches
117
+ if (emailDomain.includes(senderDomain) ||
118
+ senderDomain.includes(emailDomain)) {
119
+ suggestions.push(sender.email);
120
+ }
121
+ }
122
+ return suggestions.slice(0, 5); // Limit to 5 suggestions
123
+ }
124
+ }
125
+ exports.SenderManager = SenderManager;
126
+ //# sourceMappingURL=sender-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-manager.js","sourceRoot":"","sources":["../../../src/providers/sendgrid/sender-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Template management for SendGrid
3
+ * Merged from @bernierllc/email-sendgrid-plugin v1.0.1
4
+ */
5
+ import { SendGridClient } from './client';
6
+ import { OwnershipValidator, PrefixEnforcer } from './safety';
7
+ import { TemplateConverter } from './converters';
8
+ import { Template, ProviderTemplate, TemplateVersion } from './types';
9
+ export declare class TemplateManager {
10
+ private readonly client;
11
+ private readonly ownershipValidator;
12
+ private readonly prefixEnforcer;
13
+ private readonly converter;
14
+ private readonly logger?;
15
+ constructor(client: SendGridClient, ownershipValidator: OwnershipValidator, prefixEnforcer: PrefixEnforcer, converter: TemplateConverter, logger?: {
16
+ info: (message: string) => void;
17
+ error: (message: string) => void;
18
+ } | undefined);
19
+ createTemplate(template: Template): Promise<string>;
20
+ updateTemplate(providerTemplateId: string, template: Template): Promise<void>;
21
+ deleteTemplate(providerTemplateId: string): Promise<void>;
22
+ getTemplate(providerTemplateId: string): Promise<ProviderTemplate>;
23
+ listTemplates(): Promise<ProviderTemplate[]>;
24
+ createTemplateVersion(templateId: string, version: TemplateVersion): Promise<string>;
25
+ activateTemplateVersion(templateId: string, versionId: string): Promise<void>;
26
+ private hasConflicts;
27
+ private detectConflicts;
28
+ }
29
+ //# sourceMappingURL=template-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../../src/providers/sendgrid/template-manager.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,eAAe,EAGhB,MAAM,SAAS,CAAC;AAEjB,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAJP,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,CAAC,EAAE;QACxB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,YAAA;IAGG,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CnD,cAAc,CAAC,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B7E,cAAc,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD,WAAW,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuBlE,aAAa,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA8B5C,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC;IA2BZ,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,eAAe;CAaxB"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (c) 2025 Bernier LLC
4
+
5
+ This file is licensed to the client under a limited-use license.
6
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
7
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TemplateManager = void 0;
11
+ const errors_1 = require("./errors");
12
+ class TemplateManager {
13
+ constructor(client, ownershipValidator, prefixEnforcer, converter, logger) {
14
+ this.client = client;
15
+ this.ownershipValidator = ownershipValidator;
16
+ this.prefixEnforcer = prefixEnforcer;
17
+ this.converter = converter;
18
+ this.logger = logger;
19
+ }
20
+ async createTemplate(template) {
21
+ // Apply template naming convention
22
+ const templateName = this.prefixEnforcer.applyPrefix(template.name);
23
+ // Create base template in SendGrid
24
+ const createRequest = {
25
+ name: templateName,
26
+ generation: 'dynamic'
27
+ };
28
+ const response = await this.client.request('/templates', {
29
+ method: 'POST',
30
+ body: JSON.stringify(createRequest)
31
+ });
32
+ if (!this.client.isSuccessResponse(response)) {
33
+ throw new errors_1.SendGridApiError(`Failed to create template: ${response.statusCode}`, response.statusCode, response.body);
34
+ }
35
+ const templateData = this.client.parseResponseBody(response);
36
+ const templateId = templateData.id;
37
+ // Register as app-managed
38
+ this.ownershipValidator.registerTemplate(templateId);
39
+ // Create initial version with content
40
+ await this.createTemplateVersion(templateId, {
41
+ name: 'v1.0.0',
42
+ subject: template.subject,
43
+ htmlContent: template.htmlContent,
44
+ textContent: template.textContent,
45
+ active: true
46
+ });
47
+ // Log operation
48
+ this.logger?.info(`Created SendGrid template: ${templateName} (ID: ${templateId})`);
49
+ return templateId;
50
+ }
51
+ async updateTemplate(providerTemplateId, template) {
52
+ // Validate template ownership
53
+ this.ownershipValidator.validateOwnership(providerTemplateId);
54
+ // Get current template state
55
+ const currentTemplate = await this.getTemplate(providerTemplateId);
56
+ // Check for conflicts
57
+ if (this.hasConflicts(currentTemplate, template)) {
58
+ throw new errors_1.TemplateConflictError(providerTemplateId, this.detectConflicts(currentTemplate, template));
59
+ }
60
+ // Create new version with updated content
61
+ await this.createTemplateVersion(providerTemplateId, {
62
+ name: `v${template.version}`,
63
+ subject: template.subject,
64
+ htmlContent: template.htmlContent,
65
+ textContent: template.textContent,
66
+ active: template.isActive
67
+ });
68
+ this.logger?.info(`Updated SendGrid template: ${providerTemplateId}`);
69
+ }
70
+ async deleteTemplate(providerTemplateId) {
71
+ this.ownershipValidator.validateOwnership(providerTemplateId);
72
+ const response = await this.client.request(`/templates/${providerTemplateId}`, {
73
+ method: 'DELETE'
74
+ });
75
+ if (!this.client.isSuccessResponse(response)) {
76
+ throw new errors_1.SendGridApiError(`Failed to delete template: ${response.statusCode}`, response.statusCode, response.body);
77
+ }
78
+ this.ownershipValidator.unregisterTemplate(providerTemplateId);
79
+ this.logger?.info(`Deleted SendGrid template: ${providerTemplateId}`);
80
+ }
81
+ async getTemplate(providerTemplateId) {
82
+ this.ownershipValidator.validateOwnership(providerTemplateId);
83
+ const response = await this.client.request(`/templates/${providerTemplateId}`, {
84
+ method: 'GET'
85
+ });
86
+ if (response.statusCode === 404) {
87
+ throw new errors_1.TemplateNotFoundError(providerTemplateId);
88
+ }
89
+ if (!this.client.isSuccessResponse(response)) {
90
+ throw new errors_1.SendGridApiError(`Failed to get template: ${response.statusCode}`, response.statusCode, response.body);
91
+ }
92
+ const templateData = this.client.parseResponseBody(response);
93
+ return this.converter.convertToProviderTemplate(templateData);
94
+ }
95
+ async listTemplates() {
96
+ const response = await this.client.request('/templates?generations=dynamic', {
97
+ method: 'GET'
98
+ });
99
+ if (!this.client.isSuccessResponse(response)) {
100
+ throw new errors_1.SendGridApiError(`Failed to list templates: ${response.statusCode}`, response.statusCode, response.body);
101
+ }
102
+ const data = this.client.parseResponseBody(response);
103
+ // Filter to only app-managed templates
104
+ const appTemplates = data.result.filter(template => this.prefixEnforcer.hasPrefix(template.name));
105
+ // Register all app templates
106
+ appTemplates.forEach(template => {
107
+ this.ownershipValidator.registerTemplate(template.id);
108
+ });
109
+ return appTemplates.map(template => this.converter.convertToProviderTemplate(template));
110
+ }
111
+ async createTemplateVersion(templateId, version) {
112
+ const versionRequest = {
113
+ template_id: templateId,
114
+ name: version.name,
115
+ subject: version.subject,
116
+ html_content: version.htmlContent,
117
+ plain_content: version.textContent || '',
118
+ active: version.active ? 1 : 0
119
+ };
120
+ const response = await this.client.request(`/templates/${templateId}/versions`, {
121
+ method: 'POST',
122
+ body: JSON.stringify(versionRequest)
123
+ });
124
+ if (!this.client.isSuccessResponse(response)) {
125
+ throw new errors_1.SendGridApiError(`Failed to create template version: ${response.statusCode}`, response.statusCode, response.body);
126
+ }
127
+ const versionData = this.client.parseResponseBody(response);
128
+ return versionData.id;
129
+ }
130
+ async activateTemplateVersion(templateId, versionId) {
131
+ const response = await this.client.request(`/templates/${templateId}/versions/${versionId}/activate`, { method: 'POST' });
132
+ if (!this.client.isSuccessResponse(response)) {
133
+ throw new errors_1.SendGridApiError(`Failed to activate template version: ${response.statusCode}`, response.statusCode, response.body);
134
+ }
135
+ this.logger?.info(`Activated template version: ${templateId}/${versionId}`);
136
+ }
137
+ hasConflicts(current, updated) {
138
+ // Simple conflict detection - can be enhanced
139
+ return current.updatedAt > updated.updatedAt;
140
+ }
141
+ detectConflicts(current, updated) {
142
+ const conflicts = [];
143
+ if (current.subject !== updated.subject) {
144
+ conflicts.push('subject modified');
145
+ }
146
+ if (current.htmlContent !== updated.htmlContent) {
147
+ conflicts.push('HTML content modified');
148
+ }
149
+ return conflicts;
150
+ }
151
+ }
152
+ exports.TemplateManager = TemplateManager;
153
+ //# sourceMappingURL=template-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../../src/providers/sendgrid/template-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * SendGrid-specific type definitions for advanced features
3
+ * Merged from @bernierllc/email-sendgrid-plugin v1.0.1
4
+ */
5
+ export interface VerifiedSender {
6
+ id: string;
7
+ email: string;
8
+ name: string;
9
+ isVerified: boolean;
10
+ domain: string;
11
+ verificationStatus: 'pending' | 'verified' | 'failed';
12
+ createdAt: Date;
13
+ lastVerifiedAt?: Date;
14
+ }
15
+ export interface SenderValidationResult {
16
+ isValid: boolean;
17
+ verifiedSender?: VerifiedSender;
18
+ domain: string;
19
+ domainMatches: VerifiedSender[];
20
+ errors: string[];
21
+ suggestions: string[];
22
+ }
23
+ export interface SendGridTemplateData {
24
+ id: string;
25
+ name: string;
26
+ generation: 'legacy' | 'dynamic';
27
+ updated_at: string;
28
+ versions?: SendGridTemplateVersion[];
29
+ }
30
+ export interface SendGridTemplateVersion {
31
+ id: string;
32
+ template_id: string;
33
+ active: number;
34
+ name: string;
35
+ html_content: string;
36
+ plain_content?: string;
37
+ subject: string;
38
+ updated_at: string;
39
+ editor: string;
40
+ }
41
+ export interface SendGridVerifiedSenderData {
42
+ id: number;
43
+ nickname: string;
44
+ from_email: string;
45
+ from_name: string;
46
+ reply_to: string;
47
+ reply_to_name: string;
48
+ address: string;
49
+ address2: string;
50
+ city: string;
51
+ state: string;
52
+ zip: string;
53
+ country: string;
54
+ verified: boolean;
55
+ locked: boolean;
56
+ }
57
+ export interface Template {
58
+ id: string;
59
+ name: string;
60
+ description?: string;
61
+ subject: string;
62
+ htmlContent: string;
63
+ textContent?: string;
64
+ category?: string;
65
+ tags?: string[];
66
+ version: string;
67
+ isActive: boolean;
68
+ variables?: Record<string, unknown>;
69
+ requiredVariables?: string[];
70
+ providerTemplateIds?: Record<string, string>;
71
+ lastSyncedAt?: Record<string, Date>;
72
+ syncStatus?: Record<string, string>;
73
+ createdAt: Date;
74
+ updatedAt: Date;
75
+ createdBy?: string;
76
+ lastModifiedBy?: string;
77
+ }
78
+ export interface ProviderTemplate {
79
+ id: string;
80
+ name: string;
81
+ description?: string;
82
+ subject: string;
83
+ htmlContent: string;
84
+ textContent?: string;
85
+ version: string;
86
+ active: boolean;
87
+ createdAt: Date;
88
+ updatedAt: Date;
89
+ }
90
+ export interface TemplateVersion {
91
+ name: string;
92
+ subject: string;
93
+ htmlContent: string;
94
+ textContent?: string | undefined;
95
+ active: boolean;
96
+ }
97
+ export interface SyncResult {
98
+ success: boolean;
99
+ action: 'created' | 'updated' | 'deleted' | 'failed';
100
+ providerTemplateId?: string;
101
+ localTemplateId?: string;
102
+ error?: string;
103
+ metadata: Record<string, unknown>;
104
+ }
105
+ export interface TemplateAnalytics {
106
+ templateId: string;
107
+ opens: number;
108
+ clicks: number;
109
+ bounces: number;
110
+ deliveries: number;
111
+ dateRange: {
112
+ start: Date;
113
+ end: Date;
114
+ };
115
+ }
116
+ export interface ApiRequestOptions {
117
+ method: string;
118
+ headers?: Record<string, string>;
119
+ body?: string;
120
+ }
121
+ export interface ApiResponse {
122
+ statusCode: number;
123
+ headers: Record<string, string>;
124
+ body: string;
125
+ }
126
+ export interface SendGridAdvancedConfig {
127
+ apiKey: string;
128
+ templatePrefix?: string;
129
+ safetyMode?: 'strict' | 'relaxed';
130
+ rateLimits?: {
131
+ apiCallsPerSecond: number;
132
+ templatesPerMinute: number;
133
+ };
134
+ enableLogger?: boolean;
135
+ }
136
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/sendgrid/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (c) 2025 Bernier LLC
4
+
5
+ This file is licensed to the client under a limited-use license.
6
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
7
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/sendgrid/types.ts"],"names":[],"mappings":";AAAA;;;;;;EAME"}
@@ -1,12 +1,27 @@
1
1
  /**
2
- * SendGrid Email Provider implementation
2
+ * SendGrid Email Provider implementation (v3.0.0)
3
+ * Now includes advanced features from @bernierllc/email-sendgrid-plugin
3
4
  */
4
5
  import { EmailProvider } from './base';
5
6
  import { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderConfig } from '../types';
7
+ import type { VerifiedSender, SenderValidationResult, Template, ProviderTemplate, TemplateVersion, SendGridAdvancedConfig } from './sendgrid/types';
6
8
  export declare class SendGridProvider extends EmailProvider {
7
9
  private apiKey;
8
10
  private baseUrl;
9
- constructor(config: EmailProviderConfig);
11
+ private advancedClient?;
12
+ private templateManager?;
13
+ private senderManager?;
14
+ private rateLimiter?;
15
+ private ownershipValidator?;
16
+ private prefixEnforcer?;
17
+ private advancedFeaturesEnabled;
18
+ constructor(config: EmailProviderConfig & {
19
+ advanced?: SendGridAdvancedConfig;
20
+ });
21
+ /**
22
+ * Initialize advanced SendGrid features (template management, verified senders, etc.)
23
+ */
24
+ private initializeAdvancedFeatures;
10
25
  /**
11
26
  * Send a single email
12
27
  */
@@ -60,6 +75,52 @@ export declare class SendGridProvider extends EmailProvider {
60
75
  errors: string[];
61
76
  warnings: string[];
62
77
  };
78
+ /**
79
+ * Get verified senders from SendGrid
80
+ * Requires advanced features to be enabled
81
+ */
82
+ getVerifiedSenders(useCache?: boolean): Promise<VerifiedSender[]>;
83
+ /**
84
+ * Validate if an email address has a verified sender
85
+ */
86
+ validateSender(email: string): Promise<SenderValidationResult>;
87
+ /**
88
+ * Select the best verified sender for an email address
89
+ */
90
+ selectBestSender(fromEmail: string): Promise<VerifiedSender | null>;
91
+ /**
92
+ * Create a new template in SendGrid
93
+ * Requires advanced features to be enabled
94
+ */
95
+ createAdvancedTemplate(template: Template): Promise<string>;
96
+ /**
97
+ * Update an existing template in SendGrid
98
+ */
99
+ updateAdvancedTemplate(templateId: string, template: Template): Promise<void>;
100
+ /**
101
+ * Delete a template from SendGrid
102
+ */
103
+ deleteAdvancedTemplate(templateId: string): Promise<void>;
104
+ /**
105
+ * Get a template from SendGrid
106
+ */
107
+ getAdvancedTemplate(templateId: string): Promise<ProviderTemplate>;
108
+ /**
109
+ * List all app-managed templates from SendGrid
110
+ */
111
+ listAdvancedTemplates(): Promise<ProviderTemplate[]>;
112
+ /**
113
+ * Create a new version of a template
114
+ */
115
+ createTemplateVersion(templateId: string, version: TemplateVersion): Promise<string>;
116
+ /**
117
+ * Activate a specific template version
118
+ */
119
+ activateTemplateVersion(templateId: string, versionId: string): Promise<void>;
120
+ /**
121
+ * Check if advanced features are enabled
122
+ */
123
+ hasAdvancedFeatures(): boolean;
63
124
  /**
64
125
  * Make API request to SendGrid
65
126
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sendgrid.d.ts","sourceRoot":"","sources":["../../src/providers/sendgrid.ts"],"names":[],"mappings":"AAQA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA0BvG,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,MAAM,EAAE,mBAAmB;IAUvC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAqHzD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAW9D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuC1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiC9E;;OAEG;IACM,eAAe;;;;;;;;;IAYxB;;OAEG;IACY,cAAc,CAAC,YAAY,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCnB;;OAEG;IACY,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAoDtB;;OAEG;IACY,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWjD;;OAEG;IACM,qBAAqB;;;;;IAmB9B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
1
+ {"version":3,"file":"sendgrid.d.ts","sourceRoot":"","sources":["../../src/providers/sendgrid.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOvG,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AA0B1B,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiC;IAGhD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,WAAW,CAAC,CAAoB;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAChD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,uBAAuB,CAAS;gBAE5B,MAAM,EAAE,mBAAmB,GAAG;QAAE,QAAQ,CAAC,EAAE,sBAAsB,CAAA;KAAE;IAe/E;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA4ClC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAqHzD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAW9D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuC1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiC9E;;OAEG;IACM,eAAe;;;;;;;;;IAYxB;;OAEG;IACY,cAAc,CAAC,YAAY,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCnB;;OAEG;IACY,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAoDtB;;OAEG;IACY,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWjD;;OAEG;IACM,qBAAqB;;;;;IAwB9B;;;OAGG;IACG,kBAAkB,CAAC,QAAQ,UAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAOpE;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAOpE;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAOzE;;;OAGG;IACG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjE;;OAEG;IACG,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF;;OAEG;IACG,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D;;OAEG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAOxE;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO1D;;OAEG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1F;;OAEG;IACG,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}