emdash-smtp-core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mason James
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.
@@ -0,0 +1,397 @@
1
+ //#region src/types.d.ts
2
+ type PluginVariant = "trusted" | "marketplace";
3
+ type LogLevel = "all" | "errors" | "off";
4
+ type DeliveryStatus = "sent" | "failed";
5
+ interface DeliveryMessage {
6
+ to: string[];
7
+ subject: string;
8
+ text: string;
9
+ html?: string;
10
+ fromEmail?: string;
11
+ fromName?: string;
12
+ replyTo?: string[];
13
+ }
14
+ interface DeliveryResult {
15
+ providerId: string;
16
+ remoteMessageId?: string;
17
+ durationMs: number;
18
+ }
19
+ interface SmtpRuntimeTransportConfig {
20
+ host: string;
21
+ port: number;
22
+ secure: boolean;
23
+ username?: string;
24
+ password?: string;
25
+ }
26
+ interface LocalRuntimeTransportConfig {
27
+ sendmailPath?: string;
28
+ fromEmail: string;
29
+ fromName?: string;
30
+ }
31
+ interface DeliveryRuntime {
32
+ variant: PluginVariant;
33
+ fetch?: (url: string, init?: RequestInit) => Promise<Response>;
34
+ smtpSend?: (config: SmtpRuntimeTransportConfig, message: DeliveryMessage) => Promise<{
35
+ remoteMessageId?: string;
36
+ }>;
37
+ sendmailSend?: (config: LocalRuntimeTransportConfig, message: DeliveryMessage) => Promise<{
38
+ remoteMessageId?: string;
39
+ }>;
40
+ }
41
+ interface QueryOptionsLike {
42
+ where?: Record<string, unknown>;
43
+ orderBy?: Record<string, "asc" | "desc">;
44
+ limit?: number;
45
+ cursor?: string;
46
+ }
47
+ interface PaginatedResultLike<T> {
48
+ items: T[];
49
+ cursor?: string;
50
+ hasMore?: boolean;
51
+ }
52
+ interface StorageCollectionLike<T = unknown> {
53
+ get?(id: string): Promise<T | null>;
54
+ put(id: string, data: T): Promise<void>;
55
+ delete?(id: string): Promise<boolean>;
56
+ query?(options?: QueryOptionsLike): Promise<PaginatedResultLike<{
57
+ id: string;
58
+ data: T;
59
+ }>>;
60
+ count?(where?: Record<string, unknown>): Promise<number>;
61
+ }
62
+ interface KVLike {
63
+ get<T>(key: string): Promise<T | null>;
64
+ set(key: string, value: unknown): Promise<void>;
65
+ delete?(key: string): Promise<boolean>;
66
+ list?(prefix?: string): Promise<Array<{
67
+ key: string;
68
+ value: unknown;
69
+ }>>;
70
+ }
71
+ interface LoggerLike {
72
+ debug(message: string, data?: unknown): void;
73
+ info(message: string, data?: unknown): void;
74
+ warn(message: string, data?: unknown): void;
75
+ error(message: string, data?: unknown): void;
76
+ }
77
+ interface DeliveryLogRecord {
78
+ id?: string;
79
+ createdAt: string;
80
+ providerId: string;
81
+ status: DeliveryStatus;
82
+ source: string;
83
+ durationMs: number;
84
+ message: {
85
+ to: string;
86
+ subject: string;
87
+ };
88
+ remoteMessageId?: string;
89
+ errorMessage?: string;
90
+ }
91
+ interface SmtpPluginContextLike {
92
+ plugin: {
93
+ id: string;
94
+ version: string;
95
+ };
96
+ kv: KVLike;
97
+ storage?: {
98
+ deliveryLogs?: StorageCollectionLike<DeliveryLogRecord>;
99
+ [key: string]: StorageCollectionLike<unknown> | undefined;
100
+ };
101
+ log?: LoggerLike;
102
+ }
103
+ interface GlobalSettings {
104
+ primaryProviderId?: string;
105
+ fallbackProviderId?: string;
106
+ fromEmail?: string;
107
+ fromName?: string;
108
+ replyTo?: string;
109
+ logLevel?: LogLevel;
110
+ }
111
+ interface ProviderFieldOption {
112
+ label: string;
113
+ value: string;
114
+ }
115
+ type ProviderFieldType = "text" | "textarea" | "secret" | "number" | "select" | "toggle";
116
+ interface ProviderFieldDefinition {
117
+ key: string;
118
+ label: string;
119
+ type: ProviderFieldType;
120
+ required?: boolean;
121
+ placeholder?: string;
122
+ description?: string;
123
+ multiline?: boolean;
124
+ defaultValue?: string | number | boolean;
125
+ options?: ProviderFieldOption[];
126
+ }
127
+ interface ProviderSendArgs {
128
+ ctx: SmtpPluginContextLike;
129
+ providerId: string;
130
+ settings: Record<string, unknown>;
131
+ message: DeliveryMessage;
132
+ runtime: DeliveryRuntime;
133
+ }
134
+ interface ProviderDefinition {
135
+ id: string;
136
+ label: string;
137
+ description: string;
138
+ availability: Record<PluginVariant, boolean>;
139
+ allowedHosts: string[];
140
+ fields: ProviderFieldDefinition[];
141
+ isConfigured?: (settings: Record<string, unknown>) => boolean;
142
+ send: (args: ProviderSendArgs) => Promise<{
143
+ remoteMessageId?: string;
144
+ }>;
145
+ }
146
+ interface CountSummary {
147
+ activeProviderLabel: string;
148
+ sentCount: number;
149
+ failedCount: number;
150
+ }
151
+ interface BlockButtonConfirm {
152
+ title: string;
153
+ text: string;
154
+ confirm: string;
155
+ deny: string;
156
+ style?: "danger";
157
+ }
158
+ interface BlockButtonElement {
159
+ type: "button";
160
+ action_id: string;
161
+ label: string;
162
+ style?: "primary" | "danger" | "secondary";
163
+ value?: unknown;
164
+ confirm?: BlockButtonConfirm;
165
+ }
166
+ interface BlockTextInputElement {
167
+ type: "text_input";
168
+ action_id: string;
169
+ label: string;
170
+ placeholder?: string;
171
+ initial_value?: string;
172
+ multiline?: boolean;
173
+ }
174
+ interface BlockNumberInputElement {
175
+ type: "number_input";
176
+ action_id: string;
177
+ label: string;
178
+ initial_value?: number;
179
+ min?: number;
180
+ max?: number;
181
+ }
182
+ interface BlockSelectElement {
183
+ type: "select";
184
+ action_id: string;
185
+ label: string;
186
+ options: ProviderFieldOption[];
187
+ initial_value?: string;
188
+ }
189
+ interface BlockToggleElement {
190
+ type: "toggle";
191
+ action_id: string;
192
+ label: string;
193
+ description?: string;
194
+ initial_value?: boolean;
195
+ }
196
+ interface BlockSecretInputElement {
197
+ type: "secret_input";
198
+ action_id: string;
199
+ label: string;
200
+ placeholder?: string;
201
+ has_value?: boolean;
202
+ }
203
+ type BlockElement = BlockButtonElement | BlockTextInputElement | BlockNumberInputElement | BlockSelectElement | BlockToggleElement | BlockSecretInputElement;
204
+ interface HeaderBlock {
205
+ type: "header";
206
+ text: string;
207
+ block_id?: string;
208
+ }
209
+ interface ContextBlock {
210
+ type: "context";
211
+ text: string;
212
+ block_id?: string;
213
+ }
214
+ interface DividerBlock {
215
+ type: "divider";
216
+ block_id?: string;
217
+ }
218
+ interface BannerBlock {
219
+ type: "banner";
220
+ title?: string;
221
+ description?: string;
222
+ variant?: "default" | "alert" | "error";
223
+ block_id?: string;
224
+ }
225
+ interface FieldsBlock {
226
+ type: "fields";
227
+ fields: Array<{
228
+ label: string;
229
+ value: string;
230
+ }>;
231
+ block_id?: string;
232
+ }
233
+ interface SectionBlock {
234
+ type: "section";
235
+ text: string;
236
+ accessory?: BlockElement;
237
+ block_id?: string;
238
+ }
239
+ interface ActionsBlock {
240
+ type: "actions";
241
+ elements: BlockElement[];
242
+ block_id?: string;
243
+ }
244
+ interface StatsBlock {
245
+ type: "stats";
246
+ items: Array<{
247
+ label: string;
248
+ value: string | number;
249
+ description?: string;
250
+ trend?: "up" | "down" | "neutral";
251
+ }>;
252
+ block_id?: string;
253
+ }
254
+ interface FormBlock {
255
+ type: "form";
256
+ fields: Array<(BlockTextInputElement | BlockNumberInputElement | BlockSelectElement | BlockToggleElement | BlockSecretInputElement) & {
257
+ condition?: {
258
+ field: string;
259
+ eq?: unknown;
260
+ neq?: unknown;
261
+ };
262
+ }>;
263
+ submit: {
264
+ label: string;
265
+ action_id: string;
266
+ };
267
+ block_id?: string;
268
+ }
269
+ interface TableBlock {
270
+ type: "table";
271
+ columns: Array<{
272
+ key: string;
273
+ label: string;
274
+ format?: "text" | "badge" | "relative_time" | "number" | "code";
275
+ sortable?: boolean;
276
+ }>;
277
+ rows: Array<Record<string, unknown>>;
278
+ next_cursor?: string;
279
+ page_action_id: string;
280
+ empty_text?: string;
281
+ block_id?: string;
282
+ }
283
+ type Block = HeaderBlock | ContextBlock | DividerBlock | BannerBlock | FieldsBlock | SectionBlock | ActionsBlock | StatsBlock | FormBlock | TableBlock;
284
+ interface BlockResponse {
285
+ blocks: Block[];
286
+ toast?: {
287
+ message: string;
288
+ type: "success" | "error" | "info";
289
+ };
290
+ }
291
+ interface PageLoadInteraction {
292
+ type: "page_load";
293
+ page: string;
294
+ }
295
+ interface FormSubmitInteraction {
296
+ type: "form_submit";
297
+ action_id: string;
298
+ block_id?: string;
299
+ values: Record<string, unknown>;
300
+ }
301
+ interface BlockActionInteraction {
302
+ type: "block_action" | "action";
303
+ action_id: string;
304
+ block_id?: string;
305
+ value?: unknown;
306
+ }
307
+ type AdminInteraction = PageLoadInteraction | FormSubmitInteraction | BlockActionInteraction;
308
+ interface LastTestResult {
309
+ status: DeliveryStatus;
310
+ providerId?: string;
311
+ message: string;
312
+ createdAt: string;
313
+ }
314
+ //#endregion
315
+ //#region src/providers.d.ts
316
+ declare const SMTP_PROVIDER_DEFINITIONS: ProviderDefinition[];
317
+ declare function getProviderById(providerId: string): ProviderDefinition | undefined;
318
+ declare function isProviderAvailable(provider: ProviderDefinition, variant: PluginVariant): boolean;
319
+ declare function isProviderConfigured(provider: ProviderDefinition, settings: Record<string, unknown>): boolean;
320
+ declare function getProviderLabel(providerId: string | undefined): string;
321
+ declare function getAvailableProviderSelectOptions(variant: PluginVariant): Array<{
322
+ label: string;
323
+ value: string;
324
+ }>;
325
+ declare function getProviderPickerOptions(variant: PluginVariant): Array<{
326
+ label: string;
327
+ value: string;
328
+ }>;
329
+ declare function collectAllowedHosts(variant: PluginVariant): string[];
330
+ //#endregion
331
+ //#region src/storage.d.ts
332
+ declare const GLOBAL_SETTINGS_KEY = "settings:global";
333
+ declare const SELECTED_PROVIDER_KEY = "state:selectedProviderId";
334
+ declare const LAST_TEST_RESULT_KEY = "state:lastTestResult";
335
+ declare function getGlobalSettings(ctx: SmtpPluginContextLike): Promise<GlobalSettings>;
336
+ declare function saveGlobalSettingsFromValues(ctx: SmtpPluginContextLike, values: Record<string, unknown>): Promise<GlobalSettings>;
337
+ declare function getProviderSettings(ctx: SmtpPluginContextLike, providerId: string): Promise<Record<string, unknown>>;
338
+ declare function patchProviderSettings(ctx: SmtpPluginContextLike, providerId: string, patch: Record<string, unknown>): Promise<Record<string, unknown>>;
339
+ declare function saveProviderSettingsFromValues(ctx: SmtpPluginContextLike, provider: ProviderDefinition, values: Record<string, unknown>): Promise<Record<string, unknown>>;
340
+ declare function clearProviderSecret(ctx: SmtpPluginContextLike, providerId: string, fieldKey: string): Promise<void>;
341
+ declare function getSelectedProviderId(ctx: SmtpPluginContextLike): Promise<string | undefined>;
342
+ declare function setSelectedProviderId(ctx: SmtpPluginContextLike, providerId: string): Promise<void>;
343
+ declare function getLastTestResult(ctx: SmtpPluginContextLike): Promise<LastTestResult | null>;
344
+ declare function setLastTestResult(ctx: SmtpPluginContextLike, result: LastTestResult): Promise<void>;
345
+ declare function createDeliveryLogRecord(input: Omit<DeliveryLogRecord, "createdAt"> & {
346
+ createdAt?: string;
347
+ }): DeliveryLogRecord;
348
+ declare function writeDeliveryLog(ctx: SmtpPluginContextLike, record: DeliveryLogRecord): Promise<void>;
349
+ declare function queryRecentDeliveryLogs(ctx: SmtpPluginContextLike, limit?: number): Promise<Array<{
350
+ id: string;
351
+ data: DeliveryLogRecord;
352
+ }>>;
353
+ declare function countDeliveryLogs(ctx: SmtpPluginContextLike, status: "sent" | "failed"): Promise<number>;
354
+ //#endregion
355
+ //#region src/delivery.d.ts
356
+ declare function deliverWithConfiguredProvider(args: {
357
+ ctx: SmtpPluginContextLike;
358
+ runtime: DeliveryRuntime;
359
+ message: {
360
+ to: string | string[];
361
+ subject: string;
362
+ text: string;
363
+ html?: string;
364
+ };
365
+ source: string;
366
+ }): Promise<DeliveryResult>;
367
+ declare function isDeliveryReady(args: {
368
+ ctx: SmtpPluginContextLike;
369
+ runtime: DeliveryRuntime;
370
+ }): Promise<boolean>;
371
+ //#endregion
372
+ //#region src/admin.d.ts
373
+ declare const SMTP_PLUGIN_ID = "emdash-smtp";
374
+ declare const SMTP_PLUGIN_VERSION = "0.2.0";
375
+ declare const SMTP_ADMIN_PAGES: readonly [{
376
+ readonly path: "/providers";
377
+ readonly label: "SMTP Providers";
378
+ readonly icon: "mail";
379
+ }, {
380
+ readonly path: "/logs";
381
+ readonly label: "SMTP Logs";
382
+ readonly icon: "activity";
383
+ }];
384
+ declare const SMTP_ADMIN_WIDGETS: readonly [{
385
+ readonly id: "smtp-overview";
386
+ readonly title: "SMTP";
387
+ readonly size: "third";
388
+ }];
389
+ declare function handleAdminInteraction(args: {
390
+ ctx: SmtpPluginContextLike;
391
+ variant: PluginVariant;
392
+ runtime: DeliveryRuntime;
393
+ interaction: AdminInteraction;
394
+ }): Promise<BlockResponse>;
395
+ //#endregion
396
+ export { type AdminInteraction, type Block, type BlockActionInteraction, type BlockButtonConfirm, type BlockButtonElement, type BlockElement, type BlockResponse, type BlockSecretInputElement, type BlockSelectElement, type BlockTextInputElement, type BlockToggleElement, type CountSummary, type DeliveryLogRecord, type DeliveryMessage, type DeliveryResult, type DeliveryRuntime, type DeliveryStatus, GLOBAL_SETTINGS_KEY, type GlobalSettings, type KVLike, LAST_TEST_RESULT_KEY, type LastTestResult, type LocalRuntimeTransportConfig, type LogLevel, type LoggerLike, type PaginatedResultLike, type PluginVariant, type ProviderDefinition, type ProviderFieldDefinition, type ProviderFieldOption, type ProviderFieldType, type ProviderSendArgs, type QueryOptionsLike, SELECTED_PROVIDER_KEY, SMTP_ADMIN_PAGES, SMTP_ADMIN_WIDGETS, SMTP_PLUGIN_ID, SMTP_PLUGIN_VERSION, SMTP_PROVIDER_DEFINITIONS, type SmtpPluginContextLike, type SmtpRuntimeTransportConfig, type StorageCollectionLike, clearProviderSecret, collectAllowedHosts, countDeliveryLogs, createDeliveryLogRecord, deliverWithConfiguredProvider, getAvailableProviderSelectOptions, getGlobalSettings, getLastTestResult, getProviderById, getProviderLabel, getProviderPickerOptions, getProviderSettings, getSelectedProviderId, handleAdminInteraction, isDeliveryReady, isProviderAvailable, isProviderConfigured, patchProviderSettings, queryRecentDeliveryLogs, saveGlobalSettingsFromValues, saveProviderSettingsFromValues, setLastTestResult, setSelectedProviderId, writeDeliveryLog };
397
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/providers.ts","../src/storage.ts","../src/delivery.ts","../src/admin.ts"],"mappings":"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"}