@intelligo-dev/core 1.0.0-beta.1
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 +201 -0
- package/dist/conversations/errors.d.ts +31 -0
- package/dist/conversations/errors.d.ts.map +1 -0
- package/dist/conversations/errors.js +25 -0
- package/dist/conversations/errors.js.map +1 -0
- package/dist/conversations/index.d.ts +13 -0
- package/dist/conversations/index.d.ts.map +1 -0
- package/dist/conversations/index.js +12 -0
- package/dist/conversations/index.js.map +1 -0
- package/dist/conversations/service.d.ts +132 -0
- package/dist/conversations/service.d.ts.map +1 -0
- package/dist/conversations/service.js +347 -0
- package/dist/conversations/service.js.map +1 -0
- package/dist/conversations/types.d.ts +10 -0
- package/dist/conversations/types.d.ts.map +1 -0
- package/dist/conversations/types.js +5 -0
- package/dist/conversations/types.js.map +1 -0
- package/dist/db/client.d.ts +19 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +52 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +8 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema/agents.d.ts +400 -0
- package/dist/db/schema/agents.d.ts.map +1 -0
- package/dist/db/schema/agents.js +39 -0
- package/dist/db/schema/agents.js.map +1 -0
- package/dist/db/schema/ai.d.ts +2222 -0
- package/dist/db/schema/ai.d.ts.map +1 -0
- package/dist/db/schema/ai.js +313 -0
- package/dist/db/schema/ai.js.map +1 -0
- package/dist/db/schema/auth.d.ts +1222 -0
- package/dist/db/schema/auth.d.ts.map +1 -0
- package/dist/db/schema/auth.js +162 -0
- package/dist/db/schema/auth.js.map +1 -0
- package/dist/db/schema/billing.d.ts +1199 -0
- package/dist/db/schema/billing.d.ts.map +1 -0
- package/dist/db/schema/billing.js +150 -0
- package/dist/db/schema/billing.js.map +1 -0
- package/dist/db/schema/feature-flags.d.ts +143 -0
- package/dist/db/schema/feature-flags.d.ts.map +1 -0
- package/dist/db/schema/feature-flags.js +25 -0
- package/dist/db/schema/feature-flags.js.map +1 -0
- package/dist/db/schema/identity.d.ts +1295 -0
- package/dist/db/schema/identity.d.ts.map +1 -0
- package/dist/db/schema/identity.js +258 -0
- package/dist/db/schema/identity.js.map +1 -0
- package/dist/db/schema/index.d.ts +16 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/index.js +43 -0
- package/dist/db/schema/index.js.map +1 -0
- package/dist/db/schema/notifications.d.ts +182 -0
- package/dist/db/schema/notifications.d.ts.map +1 -0
- package/dist/db/schema/notifications.js +38 -0
- package/dist/db/schema/notifications.js.map +1 -0
- package/dist/db/schema/rag.d.ts +171 -0
- package/dist/db/schema/rag.d.ts.map +1 -0
- package/dist/db/schema/rag.js +42 -0
- package/dist/db/schema/rag.js.map +1 -0
- package/dist/db/schema/usage.d.ts +1193 -0
- package/dist/db/schema/usage.d.ts.map +1 -0
- package/dist/db/schema/usage.js +224 -0
- package/dist/db/schema/usage.js.map +1 -0
- package/dist/db/validate.d.ts +19 -0
- package/dist/db/validate.d.ts.map +1 -0
- package/dist/db/validate.js +58 -0
- package/dist/db/validate.js.map +1 -0
- package/dist/db/workspace-queries.d.ts +75 -0
- package/dist/db/workspace-queries.d.ts.map +1 -0
- package/dist/db/workspace-queries.js +78 -0
- package/dist/db/workspace-queries.js.map +1 -0
- package/dist/documents/classifier.d.ts +31 -0
- package/dist/documents/classifier.d.ts.map +1 -0
- package/dist/documents/classifier.js +41 -0
- package/dist/documents/classifier.js.map +1 -0
- package/dist/documents/errors.d.ts +32 -0
- package/dist/documents/errors.d.ts.map +1 -0
- package/dist/documents/errors.js +27 -0
- package/dist/documents/errors.js.map +1 -0
- package/dist/documents/index.d.ts +14 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +13 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/service.d.ts +54 -0
- package/dist/documents/service.d.ts.map +1 -0
- package/dist/documents/service.js +146 -0
- package/dist/documents/service.js.map +1 -0
- package/dist/documents/types.d.ts +27 -0
- package/dist/documents/types.d.ts.map +1 -0
- package/dist/documents/types.js +5 -0
- package/dist/documents/types.js.map +1 -0
- package/dist/email/index.d.ts +5 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +5 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/provider.d.ts +68 -0
- package/dist/email/provider.d.ts.map +1 -0
- package/dist/email/provider.js +199 -0
- package/dist/email/provider.js.map +1 -0
- package/dist/email/send.d.ts +47 -0
- package/dist/email/send.d.ts.map +1 -0
- package/dist/email/send.js +110 -0
- package/dist/email/send.js.map +1 -0
- package/dist/email/senders.d.ts +93 -0
- package/dist/email/senders.d.ts.map +1 -0
- package/dist/email/senders.js +232 -0
- package/dist/email/senders.js.map +1 -0
- package/dist/email/templates/base-layout.d.ts +7 -0
- package/dist/email/templates/base-layout.d.ts.map +1 -0
- package/dist/email/templates/base-layout.js +69 -0
- package/dist/email/templates/base-layout.js.map +1 -0
- package/dist/email/templates/index.d.ts +11 -0
- package/dist/email/templates/index.d.ts.map +1 -0
- package/dist/email/templates/index.js +17 -0
- package/dist/email/templates/index.js.map +1 -0
- package/dist/email/templates/password-reset.d.ts +7 -0
- package/dist/email/templates/password-reset.d.ts.map +1 -0
- package/dist/email/templates/password-reset.js +59 -0
- package/dist/email/templates/password-reset.js.map +1 -0
- package/dist/email/templates/payment-failed.d.ts +8 -0
- package/dist/email/templates/payment-failed.d.ts.map +1 -0
- package/dist/email/templates/payment-failed.js +62 -0
- package/dist/email/templates/payment-failed.js.map +1 -0
- package/dist/email/templates/quota-warning.d.ts +11 -0
- package/dist/email/templates/quota-warning.d.ts.map +1 -0
- package/dist/email/templates/quota-warning.js +82 -0
- package/dist/email/templates/quota-warning.js.map +1 -0
- package/dist/email/templates/subscription-confirmed.d.ts +9 -0
- package/dist/email/templates/subscription-confirmed.d.ts.map +1 -0
- package/dist/email/templates/subscription-confirmed.js +72 -0
- package/dist/email/templates/subscription-confirmed.js.map +1 -0
- package/dist/email/templates/trial-expiry.d.ts +9 -0
- package/dist/email/templates/trial-expiry.d.ts.map +1 -0
- package/dist/email/templates/trial-expiry.js +86 -0
- package/dist/email/templates/trial-expiry.js.map +1 -0
- package/dist/email/templates/trial-warning.d.ts +11 -0
- package/dist/email/templates/trial-warning.d.ts.map +1 -0
- package/dist/email/templates/trial-warning.js +70 -0
- package/dist/email/templates/trial-warning.js.map +1 -0
- package/dist/email/templates/verify-email.d.ts +7 -0
- package/dist/email/templates/verify-email.d.ts.map +1 -0
- package/dist/email/templates/verify-email.js +59 -0
- package/dist/email/templates/verify-email.js.map +1 -0
- package/dist/email/templates/welcome.d.ts +7 -0
- package/dist/email/templates/welcome.d.ts.map +1 -0
- package/dist/email/templates/welcome.js +51 -0
- package/dist/email/templates/welcome.js.map +1 -0
- package/dist/email/templates/workspace-invitation.d.ts +10 -0
- package/dist/email/templates/workspace-invitation.d.ts.map +1 -0
- package/dist/email/templates/workspace-invitation.js +79 -0
- package/dist/email/templates/workspace-invitation.js.map +1 -0
- package/dist/env.d.ts +21 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +129 -0
- package/dist/env.js.map +1 -0
- package/dist/identity/audit.d.ts +39 -0
- package/dist/identity/audit.d.ts.map +1 -0
- package/dist/identity/audit.js +51 -0
- package/dist/identity/audit.js.map +1 -0
- package/dist/identity/errors.d.ts +32 -0
- package/dist/identity/errors.d.ts.map +1 -0
- package/dist/identity/errors.js +25 -0
- package/dist/identity/errors.js.map +1 -0
- package/dist/identity/index.d.ts +16 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +15 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/service.d.ts +70 -0
- package/dist/identity/service.d.ts.map +1 -0
- package/dist/identity/service.js +179 -0
- package/dist/identity/service.js.map +1 -0
- package/dist/identity/types.d.ts +27 -0
- package/dist/identity/types.d.ts.map +1 -0
- package/dist/identity/types.js +5 -0
- package/dist/identity/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +50 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +183 -0
- package/dist/logger.js.map +1 -0
- package/dist/notifications/index.d.ts +86 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +112 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/triggers.d.ts +68 -0
- package/dist/notifications/triggers.d.ts.map +1 -0
- package/dist/notifications/triggers.js +145 -0
- package/dist/notifications/triggers.js.map +1 -0
- package/dist/notifications/types.d.ts +19 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +11 -0
- package/dist/notifications/types.js.map +1 -0
- package/package.json +101 -0
- package/src/db/migrations/0000_sharp_night_nurse.sql +52 -0
- package/src/db/migrations/0001_hesitant_vapor.sql +40 -0
- package/src/db/migrations/0002_numerous_lady_vermin.sql +235 -0
- package/src/db/migrations/0003_mighty_jean_grey.sql +37 -0
- package/src/db/migrations/0004_cynical_grandmaster.sql +2 -0
- package/src/db/migrations/0005_careful_switch.sql +8 -0
- package/src/db/migrations/0006_tense_blue_marvel.sql +16 -0
- package/src/db/migrations/0007_next_squadron_sinister.sql +1 -0
- package/src/db/migrations/0008_powerful_scream.sql +39 -0
- package/src/db/migrations/0009_sad_ink.sql +1 -0
- package/src/db/migrations/0010_shocking_omega_flight.sql +2 -0
- package/src/db/migrations/0011_ambiguous_otto_octavius.sql +151 -0
- package/src/db/migrations/0011_hnsw_vector_index.sql +17 -0
- package/src/db/migrations/0012_user_profiles.sql +30 -0
- package/src/db/migrations/0013_trending_seasonal_columns.sql +9 -0
- package/src/db/migrations/0014_add_product_type_to_agents.sql +6 -0
- package/src/db/migrations/0015_new_v1_tables.sql +149 -0
- package/src/db/migrations/0016_document_types.sql +30 -0
- package/src/db/migrations/0017_document_metadata.sql +2 -0
- package/src/db/migrations/0018_identity_graph.sql +200 -0
- package/src/db/migrations/0019_db_driven_prompts.sql +20 -0
- package/src/db/migrations/0020_pending_extractions.sql +35 -0
- package/src/db/migrations/0021_rag_documents.sql +39 -0
- package/src/db/migrations/0022_user_quotas_usage_jsonb.sql +70 -0
- package/src/db/migrations/0023_user_facts_user_scoped_unique.sql +17 -0
- package/src/db/migrations/0024_user_memories_hnsw.sql +23 -0
- package/src/db/migrations/0025_audit_trigger_errcode.sql +21 -0
- package/src/db/migrations/0026_user_profile_snapshots_composite_pk.sql +17 -0
- package/src/db/migrations/0027_billing_settings_mnt_columns.sql +54 -0
- package/src/db/migrations/0028_trial_credits_normalized_email.sql +37 -0
- package/src/db/migrations/0029_usage_records_conversation_idx.sql +13 -0
- package/src/db/migrations/0030_pending_extractions_composite_idx.sql +11 -0
- package/src/db/migrations/0031_rag_documents_hnsw.sql +16 -0
- package/src/db/migrations/0032_rate_limit_unique_idx.sql +16 -0
- package/src/db/migrations/0033_pending_extractions_partial_idx.sql +18 -0
- package/src/db/migrations/0034_rate_limit_count.sql +9 -0
- package/src/db/migrations/0035_credit_reservations.sql +24 -0
- package/src/db/migrations/0036_executions_audit_jobs.sql +96 -0
- package/src/db/migrations/0037_rate_limit_minute_bucket.sql +46 -0
- package/src/db/migrations/0038_user_quotas_generic_usage.sql +25 -0
- package/src/db/migrations/0039_platform_admin_impersonation.sql +27 -0
- package/src/db/migrations/0040_ee_audit_chain.sql +23 -0
- package/src/db/migrations/README.md +57 -0
- package/src/db/migrations/meta/0000_snapshot.json +348 -0
- package/src/db/migrations/meta/0001_snapshot.json +631 -0
- package/src/db/migrations/meta/0002_snapshot.json +2269 -0
- package/src/db/migrations/meta/0003_snapshot.json +2488 -0
- package/src/db/migrations/meta/0004_snapshot.json +2500 -0
- package/src/db/migrations/meta/0005_snapshot.json +2548 -0
- package/src/db/migrations/meta/0006_snapshot.json +2650 -0
- package/src/db/migrations/meta/0007_snapshot.json +2657 -0
- package/src/db/migrations/meta/0008_snapshot.json +2719 -0
- package/src/db/migrations/meta/0009_snapshot.json +2726 -0
- package/src/db/migrations/meta/0010_snapshot.json +2739 -0
- package/src/db/migrations/meta/0011_snapshot.json +3886 -0
- package/src/db/migrations/meta/_journal.json +300 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { render } from "@react-email/components";
|
|
2
|
+
import { getEmailProvider } from "./provider";
|
|
3
|
+
const MAX_ATTEMPTS = 3;
|
|
4
|
+
const BASE_DELAY_MS = 1000;
|
|
5
|
+
/**
|
|
6
|
+
* Returns true if the error is a client error (4xx) that should NOT be retried.
|
|
7
|
+
*/
|
|
8
|
+
function isClientError(error) {
|
|
9
|
+
if (error && typeof error === "object") {
|
|
10
|
+
const err = error;
|
|
11
|
+
// Check for explicit statusCode (set by ResendProvider / LoopsProvider).
|
|
12
|
+
// 429 is excluded: rate limits are transient and worth retrying.
|
|
13
|
+
if (typeof err.statusCode === "number") {
|
|
14
|
+
return (err.statusCode >= 400 && err.statusCode < 500 && err.statusCode !== 429);
|
|
15
|
+
}
|
|
16
|
+
// Check for status property (some HTTP libraries)
|
|
17
|
+
if (typeof err.status === "number") {
|
|
18
|
+
return err.status >= 400 && err.status < 500 && err.status !== 429;
|
|
19
|
+
}
|
|
20
|
+
// Resend SDK error names that indicate client errors
|
|
21
|
+
const name = err.name;
|
|
22
|
+
if (name === "validation_error" ||
|
|
23
|
+
name === "missing_required_field" ||
|
|
24
|
+
name === "invalid_api_Key") {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function delay(ms) {
|
|
31
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Send an email through the configured provider with retry logic.
|
|
35
|
+
*
|
|
36
|
+
* Accepts either raw HTML via `{ html }` or a React Email component via
|
|
37
|
+
* `{ react }`. When a React element is provided, it is rendered to HTML
|
|
38
|
+
* using `@react-email/components`'s `render()` before sending.
|
|
39
|
+
*
|
|
40
|
+
* This function NEVER throws. All errors are caught and returned as
|
|
41
|
+
* `{ success: false, error: "..." }`. This prevents email failures
|
|
42
|
+
* from crashing the application (TECH-08).
|
|
43
|
+
*/
|
|
44
|
+
export async function sendEmail(params) {
|
|
45
|
+
try {
|
|
46
|
+
const provider = getEmailProvider();
|
|
47
|
+
const from = params.from ??
|
|
48
|
+
process.env.EMAIL_FROM ??
|
|
49
|
+
"Intelligo <noreply@intelligo.dev>";
|
|
50
|
+
const recipient = Array.isArray(params.to)
|
|
51
|
+
? params.to.join(", ")
|
|
52
|
+
: params.to;
|
|
53
|
+
// Resolve HTML content: either use provided html or render React component
|
|
54
|
+
let html;
|
|
55
|
+
if ("react" in params) {
|
|
56
|
+
try {
|
|
57
|
+
html = await render(params.react);
|
|
58
|
+
}
|
|
59
|
+
catch (renderError) {
|
|
60
|
+
const message = renderError instanceof Error
|
|
61
|
+
? renderError.message
|
|
62
|
+
: String(renderError);
|
|
63
|
+
console.error(`[Email] Failed to render React component: ${message}`);
|
|
64
|
+
return { success: false, error: `Template render failed: ${message}` };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
html = params.html;
|
|
69
|
+
}
|
|
70
|
+
let lastError;
|
|
71
|
+
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
72
|
+
try {
|
|
73
|
+
const result = await provider.send({
|
|
74
|
+
to: params.to,
|
|
75
|
+
subject: params.subject,
|
|
76
|
+
html,
|
|
77
|
+
from,
|
|
78
|
+
replyTo: params.replyTo,
|
|
79
|
+
template: params.template,
|
|
80
|
+
});
|
|
81
|
+
return { success: true, id: result.id };
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
lastError = error;
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
// Do NOT retry client errors (4xx) – they will always fail
|
|
87
|
+
if (isClientError(error)) {
|
|
88
|
+
console.error(`[Email] Send failed for ${recipient} (client error, not retrying): ${message}`);
|
|
89
|
+
return { success: false, error: message };
|
|
90
|
+
}
|
|
91
|
+
console.warn(`[Email] Send attempt ${attempt}/${MAX_ATTEMPTS} failed for ${recipient}: ${message}`);
|
|
92
|
+
// Wait before next attempt (exponential backoff: 1s, 2s, 4s)
|
|
93
|
+
if (attempt < MAX_ATTEMPTS) {
|
|
94
|
+
await delay(BASE_DELAY_MS * Math.pow(2, attempt - 1));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// All attempts exhausted
|
|
99
|
+
const finalMessage = lastError instanceof Error ? lastError.message : String(lastError);
|
|
100
|
+
console.error(`[Email] All ${MAX_ATTEMPTS} attempts failed for ${recipient}: ${params.subject}`);
|
|
101
|
+
return { success: false, error: finalMessage };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Catch-all for unexpected errors (e.g., getEmailProvider() failing)
|
|
105
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
106
|
+
console.error(`[Email] Unexpected error: ${message}`);
|
|
107
|
+
return { success: false, error: message };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/email/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Sender Functions
|
|
3
|
+
*
|
|
4
|
+
* High-level convenience wrappers that compose sendEmail() with React Email
|
|
5
|
+
* templates. Each function accepts typed params and returns SendEmailResult.
|
|
6
|
+
*
|
|
7
|
+
* These are the primary API for sending branded emails throughout the app:
|
|
8
|
+
* - Auth emails: welcome, verify, password reset (wired into Better-Auth)
|
|
9
|
+
* - Team emails: workspace invitation (replaces Phase 10 console.log)
|
|
10
|
+
* - Billing emails: quota warning, trial warning, payment failed, subscription confirmed
|
|
11
|
+
*
|
|
12
|
+
* All functions return Promise<SendEmailResult> and NEVER throw (TECH-08).
|
|
13
|
+
*
|
|
14
|
+
* Every sender attaches a stable `template` key + flat variables so
|
|
15
|
+
* template-based providers (Loops) can send the same email from a
|
|
16
|
+
* provider-side template. HTML-capable providers (Resend) ignore it.
|
|
17
|
+
* Loops mapping: LOOPS_TRANSACTIONAL_ID_<KEY> (e.g. "verify-email" →
|
|
18
|
+
* LOOPS_TRANSACTIONAL_ID_VERIFY_EMAIL). Boolean variants use distinct keys
|
|
19
|
+
* (quota-warning / quota-exceeded, trial-warning / trial-depleted) because
|
|
20
|
+
* template providers branch per template, not per variable.
|
|
21
|
+
*/
|
|
22
|
+
import { type SendEmailResult } from "./send";
|
|
23
|
+
/** Send welcome email after signup (EMAIL-03) */
|
|
24
|
+
export declare function sendWelcomeEmail(params: {
|
|
25
|
+
to: string;
|
|
26
|
+
userName: string;
|
|
27
|
+
dashboardUrl: string;
|
|
28
|
+
}): Promise<SendEmailResult>;
|
|
29
|
+
/** Send email verification link (EMAIL-04) */
|
|
30
|
+
export declare function sendVerifyEmail(params: {
|
|
31
|
+
to: string;
|
|
32
|
+
userName: string;
|
|
33
|
+
verificationUrl: string;
|
|
34
|
+
}): Promise<SendEmailResult>;
|
|
35
|
+
/** Send password reset link (EMAIL-05) */
|
|
36
|
+
export declare function sendPasswordResetEmail(params: {
|
|
37
|
+
to: string;
|
|
38
|
+
userName: string;
|
|
39
|
+
resetUrl: string;
|
|
40
|
+
}): Promise<SendEmailResult>;
|
|
41
|
+
/** Send workspace invitation email (EMAIL-06) */
|
|
42
|
+
export declare function sendInvitationEmail(params: {
|
|
43
|
+
to: string;
|
|
44
|
+
inviterName: string;
|
|
45
|
+
workspaceName: string;
|
|
46
|
+
role: string;
|
|
47
|
+
acceptUrl: string;
|
|
48
|
+
declineUrl: string;
|
|
49
|
+
}): Promise<SendEmailResult>;
|
|
50
|
+
/** Send quota warning or exceeded email (EMAIL-09 / EMAIL-10) */
|
|
51
|
+
export declare function sendQuotaWarningEmail(params: {
|
|
52
|
+
to: string;
|
|
53
|
+
workspaceName: string;
|
|
54
|
+
percentageUsed: number;
|
|
55
|
+
tokensUsed: number;
|
|
56
|
+
tokensLimit: number;
|
|
57
|
+
upgradeUrl: string;
|
|
58
|
+
isExceeded: boolean;
|
|
59
|
+
}): Promise<SendEmailResult>;
|
|
60
|
+
/** Send trial warning or depleted email (EMAIL-07 / EMAIL-08) */
|
|
61
|
+
export declare function sendTrialWarningEmail(params: {
|
|
62
|
+
to: string;
|
|
63
|
+
workspaceName: string;
|
|
64
|
+
creditsRemaining: number;
|
|
65
|
+
totalCredits: number;
|
|
66
|
+
percentageRemaining: number;
|
|
67
|
+
upgradeUrl: string;
|
|
68
|
+
isDepleted: boolean;
|
|
69
|
+
}): Promise<SendEmailResult>;
|
|
70
|
+
/** Send payment failed email (EMAIL-11) */
|
|
71
|
+
export declare function sendPaymentFailedEmail(params: {
|
|
72
|
+
to: string;
|
|
73
|
+
workspaceName: string;
|
|
74
|
+
amount: string;
|
|
75
|
+
updatePaymentUrl: string;
|
|
76
|
+
}): Promise<SendEmailResult>;
|
|
77
|
+
/** Send subscription confirmed email (EMAIL-12) */
|
|
78
|
+
export declare function sendSubscriptionConfirmedEmail(params: {
|
|
79
|
+
to: string;
|
|
80
|
+
workspaceName: string;
|
|
81
|
+
planName: string;
|
|
82
|
+
amount: string;
|
|
83
|
+
dashboardUrl: string;
|
|
84
|
+
}): Promise<SendEmailResult>;
|
|
85
|
+
/** Send trial expiry reminder email (EMAIL-13) */
|
|
86
|
+
export declare function sendTrialExpiryEmail(params: {
|
|
87
|
+
to: string;
|
|
88
|
+
workspaceName: string;
|
|
89
|
+
expiryDate: string;
|
|
90
|
+
daysRemaining: number;
|
|
91
|
+
upgradeUrl: string;
|
|
92
|
+
}): Promise<SendEmailResult>;
|
|
93
|
+
//# sourceMappingURL=senders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senders.d.ts","sourceRoot":"","sources":["../../src/email/senders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAiBzD,iDAAiD;AACjD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB3B;AAED,8CAA8C;AAC9C,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB3B;AAED,0CAA0C;AAC1C,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB3B;AAMD,iDAAiD;AACjD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsB3B;AAMD,iEAAiE;AACjE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB3B;AAED,iEAAiE;AACjE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB3B;AAED,2CAA2C;AAC3C,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3B;AAED,mDAAmD;AACnD,wBAAsB,8BAA8B,CAAC,MAAM,EAAE;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB3B;AAED,kDAAkD;AAClD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuB3B"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Sender Functions
|
|
3
|
+
*
|
|
4
|
+
* High-level convenience wrappers that compose sendEmail() with React Email
|
|
5
|
+
* templates. Each function accepts typed params and returns SendEmailResult.
|
|
6
|
+
*
|
|
7
|
+
* These are the primary API for sending branded emails throughout the app:
|
|
8
|
+
* - Auth emails: welcome, verify, password reset (wired into Better-Auth)
|
|
9
|
+
* - Team emails: workspace invitation (replaces Phase 10 console.log)
|
|
10
|
+
* - Billing emails: quota warning, trial warning, payment failed, subscription confirmed
|
|
11
|
+
*
|
|
12
|
+
* All functions return Promise<SendEmailResult> and NEVER throw (TECH-08).
|
|
13
|
+
*
|
|
14
|
+
* Every sender attaches a stable `template` key + flat variables so
|
|
15
|
+
* template-based providers (Loops) can send the same email from a
|
|
16
|
+
* provider-side template. HTML-capable providers (Resend) ignore it.
|
|
17
|
+
* Loops mapping: LOOPS_TRANSACTIONAL_ID_<KEY> (e.g. "verify-email" →
|
|
18
|
+
* LOOPS_TRANSACTIONAL_ID_VERIFY_EMAIL). Boolean variants use distinct keys
|
|
19
|
+
* (quota-warning / quota-exceeded, trial-warning / trial-depleted) because
|
|
20
|
+
* template providers branch per template, not per variable.
|
|
21
|
+
*/
|
|
22
|
+
import * as React from "react";
|
|
23
|
+
import { sendEmail } from "./send";
|
|
24
|
+
import { WelcomeEmail, VerifyEmailEmail, PasswordResetEmail, WorkspaceInvitationEmail, QuotaWarningEmail, TrialWarningEmail, TrialExpiryEmail, PaymentFailedEmail, SubscriptionConfirmedEmail, } from "./templates";
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Auth Emails
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Send welcome email after signup (EMAIL-03) */
|
|
29
|
+
export async function sendWelcomeEmail(params) {
|
|
30
|
+
return sendEmail({
|
|
31
|
+
to: params.to,
|
|
32
|
+
subject: "Welcome to Intelligo!",
|
|
33
|
+
react: React.createElement(WelcomeEmail, {
|
|
34
|
+
userName: params.userName,
|
|
35
|
+
dashboardUrl: params.dashboardUrl,
|
|
36
|
+
}),
|
|
37
|
+
template: {
|
|
38
|
+
key: "welcome",
|
|
39
|
+
variables: {
|
|
40
|
+
userName: params.userName,
|
|
41
|
+
dashboardUrl: params.dashboardUrl,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** Send email verification link (EMAIL-04) */
|
|
47
|
+
export async function sendVerifyEmail(params) {
|
|
48
|
+
return sendEmail({
|
|
49
|
+
to: params.to,
|
|
50
|
+
subject: "Verify your email address",
|
|
51
|
+
react: React.createElement(VerifyEmailEmail, {
|
|
52
|
+
userName: params.userName,
|
|
53
|
+
verificationUrl: params.verificationUrl,
|
|
54
|
+
}),
|
|
55
|
+
template: {
|
|
56
|
+
key: "verify-email",
|
|
57
|
+
variables: {
|
|
58
|
+
userName: params.userName,
|
|
59
|
+
verificationUrl: params.verificationUrl,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Send password reset link (EMAIL-05) */
|
|
65
|
+
export async function sendPasswordResetEmail(params) {
|
|
66
|
+
return sendEmail({
|
|
67
|
+
to: params.to,
|
|
68
|
+
subject: "Reset your password",
|
|
69
|
+
react: React.createElement(PasswordResetEmail, {
|
|
70
|
+
userName: params.userName,
|
|
71
|
+
resetUrl: params.resetUrl,
|
|
72
|
+
}),
|
|
73
|
+
template: {
|
|
74
|
+
key: "password-reset",
|
|
75
|
+
variables: {
|
|
76
|
+
userName: params.userName,
|
|
77
|
+
resetUrl: params.resetUrl,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Team Emails
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/** Send workspace invitation email (EMAIL-06) */
|
|
86
|
+
export async function sendInvitationEmail(params) {
|
|
87
|
+
return sendEmail({
|
|
88
|
+
to: params.to,
|
|
89
|
+
subject: `${params.inviterName} invited you to ${params.workspaceName}`,
|
|
90
|
+
react: React.createElement(WorkspaceInvitationEmail, {
|
|
91
|
+
inviterName: params.inviterName,
|
|
92
|
+
workspaceName: params.workspaceName,
|
|
93
|
+
role: params.role,
|
|
94
|
+
acceptUrl: params.acceptUrl,
|
|
95
|
+
declineUrl: params.declineUrl,
|
|
96
|
+
}),
|
|
97
|
+
template: {
|
|
98
|
+
key: "workspace-invitation",
|
|
99
|
+
variables: {
|
|
100
|
+
inviterName: params.inviterName,
|
|
101
|
+
workspaceName: params.workspaceName,
|
|
102
|
+
role: params.role,
|
|
103
|
+
acceptUrl: params.acceptUrl,
|
|
104
|
+
declineUrl: params.declineUrl,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Billing / Usage Emails
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
/** Send quota warning or exceeded email (EMAIL-09 / EMAIL-10) */
|
|
113
|
+
export async function sendQuotaWarningEmail(params) {
|
|
114
|
+
return sendEmail({
|
|
115
|
+
to: params.to,
|
|
116
|
+
subject: params.isExceeded
|
|
117
|
+
? "Token quota exceeded"
|
|
118
|
+
: `Token quota at ${params.percentageUsed}%`,
|
|
119
|
+
react: React.createElement(QuotaWarningEmail, {
|
|
120
|
+
workspaceName: params.workspaceName,
|
|
121
|
+
percentageUsed: params.percentageUsed,
|
|
122
|
+
tokensUsed: params.tokensUsed,
|
|
123
|
+
tokensLimit: params.tokensLimit,
|
|
124
|
+
upgradeUrl: params.upgradeUrl,
|
|
125
|
+
isExceeded: params.isExceeded,
|
|
126
|
+
}),
|
|
127
|
+
template: {
|
|
128
|
+
key: params.isExceeded ? "quota-exceeded" : "quota-warning",
|
|
129
|
+
variables: {
|
|
130
|
+
workspaceName: params.workspaceName,
|
|
131
|
+
percentageUsed: params.percentageUsed,
|
|
132
|
+
tokensUsed: params.tokensUsed,
|
|
133
|
+
tokensLimit: params.tokensLimit,
|
|
134
|
+
upgradeUrl: params.upgradeUrl,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** Send trial warning or depleted email (EMAIL-07 / EMAIL-08) */
|
|
140
|
+
export async function sendTrialWarningEmail(params) {
|
|
141
|
+
return sendEmail({
|
|
142
|
+
to: params.to,
|
|
143
|
+
subject: params.isDepleted
|
|
144
|
+
? "Trial credits depleted"
|
|
145
|
+
: "Trial credits running low",
|
|
146
|
+
react: React.createElement(TrialWarningEmail, {
|
|
147
|
+
workspaceName: params.workspaceName,
|
|
148
|
+
creditsRemaining: params.creditsRemaining,
|
|
149
|
+
totalCredits: params.totalCredits,
|
|
150
|
+
percentageRemaining: params.percentageRemaining,
|
|
151
|
+
upgradeUrl: params.upgradeUrl,
|
|
152
|
+
isDepleted: params.isDepleted,
|
|
153
|
+
}),
|
|
154
|
+
template: {
|
|
155
|
+
key: params.isDepleted ? "trial-depleted" : "trial-warning",
|
|
156
|
+
variables: {
|
|
157
|
+
workspaceName: params.workspaceName,
|
|
158
|
+
creditsRemaining: params.creditsRemaining,
|
|
159
|
+
totalCredits: params.totalCredits,
|
|
160
|
+
percentageRemaining: params.percentageRemaining,
|
|
161
|
+
upgradeUrl: params.upgradeUrl,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/** Send payment failed email (EMAIL-11) */
|
|
167
|
+
export async function sendPaymentFailedEmail(params) {
|
|
168
|
+
return sendEmail({
|
|
169
|
+
to: params.to,
|
|
170
|
+
subject: `Payment failed for ${params.workspaceName}`,
|
|
171
|
+
react: React.createElement(PaymentFailedEmail, {
|
|
172
|
+
workspaceName: params.workspaceName,
|
|
173
|
+
amount: params.amount,
|
|
174
|
+
updatePaymentUrl: params.updatePaymentUrl,
|
|
175
|
+
}),
|
|
176
|
+
template: {
|
|
177
|
+
key: "payment-failed",
|
|
178
|
+
variables: {
|
|
179
|
+
workspaceName: params.workspaceName,
|
|
180
|
+
amount: params.amount,
|
|
181
|
+
updatePaymentUrl: params.updatePaymentUrl,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/** Send subscription confirmed email (EMAIL-12) */
|
|
187
|
+
export async function sendSubscriptionConfirmedEmail(params) {
|
|
188
|
+
return sendEmail({
|
|
189
|
+
to: params.to,
|
|
190
|
+
subject: `Subscription confirmed - ${params.planName} plan`,
|
|
191
|
+
react: React.createElement(SubscriptionConfirmedEmail, {
|
|
192
|
+
workspaceName: params.workspaceName,
|
|
193
|
+
planName: params.planName,
|
|
194
|
+
amount: params.amount,
|
|
195
|
+
dashboardUrl: params.dashboardUrl,
|
|
196
|
+
}),
|
|
197
|
+
template: {
|
|
198
|
+
key: "subscription-confirmed",
|
|
199
|
+
variables: {
|
|
200
|
+
workspaceName: params.workspaceName,
|
|
201
|
+
planName: params.planName,
|
|
202
|
+
amount: params.amount,
|
|
203
|
+
dashboardUrl: params.dashboardUrl,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
/** Send trial expiry reminder email (EMAIL-13) */
|
|
209
|
+
export async function sendTrialExpiryEmail(params) {
|
|
210
|
+
return sendEmail({
|
|
211
|
+
to: params.to,
|
|
212
|
+
subject: params.daysRemaining <= 0
|
|
213
|
+
? `Your Pro trial for ${params.workspaceName} has expired`
|
|
214
|
+
: `Your Pro trial expires in ${params.daysRemaining} day${params.daysRemaining === 1 ? "" : "s"}`,
|
|
215
|
+
react: React.createElement(TrialExpiryEmail, {
|
|
216
|
+
workspaceName: params.workspaceName,
|
|
217
|
+
expiryDate: params.expiryDate,
|
|
218
|
+
daysRemaining: params.daysRemaining,
|
|
219
|
+
upgradeUrl: params.upgradeUrl,
|
|
220
|
+
}),
|
|
221
|
+
template: {
|
|
222
|
+
key: "trial-expiry",
|
|
223
|
+
variables: {
|
|
224
|
+
workspaceName: params.workspaceName,
|
|
225
|
+
expiryDate: params.expiryDate,
|
|
226
|
+
daysRemaining: params.daysRemaining,
|
|
227
|
+
upgradeUrl: params.upgradeUrl,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=senders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senders.js","sourceRoot":"","sources":["../../src/email/senders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface BaseLayoutProps {
|
|
3
|
+
preview: string;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare function BaseLayout({ preview, children }: BaseLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=base-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-layout.d.ts","sourceRoot":"","sources":["../../../src/email/templates/base-layout.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAYD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAqChE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Body, Container, Head, Hr, Html, Link, Preview, Section, Text, } from "@react-email/components";
|
|
3
|
+
// Color palette
|
|
4
|
+
const colors = {
|
|
5
|
+
background: "#f4f4f5", // zinc-100
|
|
6
|
+
container: "#ffffff",
|
|
7
|
+
text: "#18181b", // zinc-900
|
|
8
|
+
muted: "#71717a", // zinc-500
|
|
9
|
+
brand: "#7c3aed", // violet-600
|
|
10
|
+
border: "#e4e4e7", // zinc-200
|
|
11
|
+
};
|
|
12
|
+
export function BaseLayout({ preview, children }) {
|
|
13
|
+
return (_jsxs(Html, { lang: "en", children: [_jsx(Head, { children: _jsx("meta", { charSet: "utf-8" }) }), _jsx(Preview, { children: preview }), _jsx(Body, { style: bodyStyle, children: _jsxs(Container, { style: containerStyle, children: [_jsx(Section, { style: headerStyle, children: _jsx(Text, { style: logoStyle, children: "Intelligo" }) }), _jsx(Hr, { style: hrStyle }), _jsx(Section, { style: contentStyle, children: children }), _jsx(Hr, { style: hrStyle }), _jsxs(Section, { style: footerStyle, children: [_jsx(Text, { style: footerTextStyle, children: "Intelligo AI Platform" }), _jsxs(Text, { style: footerMutedStyle, children: ["This is a transactional email from Intelligo. If you believe you received this email in error, please contact", " ", _jsx(Link, { href: "mailto:support@intelligo.dev", style: footerLinkStyle, children: "support@intelligo.dev" }), "."] })] })] }) })] }));
|
|
14
|
+
}
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Inline Styles
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const bodyStyle = {
|
|
19
|
+
backgroundColor: colors.background,
|
|
20
|
+
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
21
|
+
margin: 0,
|
|
22
|
+
padding: "40px 0",
|
|
23
|
+
};
|
|
24
|
+
const containerStyle = {
|
|
25
|
+
backgroundColor: colors.container,
|
|
26
|
+
borderRadius: "8px",
|
|
27
|
+
maxWidth: "600px",
|
|
28
|
+
margin: "0 auto",
|
|
29
|
+
border: `1px solid ${colors.border}`,
|
|
30
|
+
};
|
|
31
|
+
const headerStyle = {
|
|
32
|
+
padding: "32px 40px 16px",
|
|
33
|
+
};
|
|
34
|
+
const logoStyle = {
|
|
35
|
+
color: colors.brand,
|
|
36
|
+
fontSize: "24px",
|
|
37
|
+
fontWeight: 700,
|
|
38
|
+
margin: 0,
|
|
39
|
+
lineHeight: "32px",
|
|
40
|
+
};
|
|
41
|
+
const hrStyle = {
|
|
42
|
+
borderColor: colors.border,
|
|
43
|
+
borderTop: "none",
|
|
44
|
+
margin: 0,
|
|
45
|
+
};
|
|
46
|
+
const contentStyle = {
|
|
47
|
+
padding: "24px 40px",
|
|
48
|
+
};
|
|
49
|
+
const footerStyle = {
|
|
50
|
+
padding: "16px 40px 32px",
|
|
51
|
+
};
|
|
52
|
+
const footerTextStyle = {
|
|
53
|
+
color: colors.muted,
|
|
54
|
+
fontSize: "13px",
|
|
55
|
+
lineHeight: "20px",
|
|
56
|
+
margin: "0 0 8px",
|
|
57
|
+
fontWeight: 600,
|
|
58
|
+
};
|
|
59
|
+
const footerMutedStyle = {
|
|
60
|
+
color: colors.muted,
|
|
61
|
+
fontSize: "12px",
|
|
62
|
+
lineHeight: "18px",
|
|
63
|
+
margin: 0,
|
|
64
|
+
};
|
|
65
|
+
const footerLinkStyle = {
|
|
66
|
+
color: colors.brand,
|
|
67
|
+
textDecoration: "underline",
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=base-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-layout.js","sourceRoot":"","sources":["../../../src/email/templates/base-layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { BaseLayout, type BaseLayoutProps } from "./base-layout";
|
|
2
|
+
export { WelcomeEmail, type WelcomeEmailProps } from "./welcome";
|
|
3
|
+
export { VerifyEmailEmail, type VerifyEmailEmailProps } from "./verify-email";
|
|
4
|
+
export { PasswordResetEmail, type PasswordResetEmailProps, } from "./password-reset";
|
|
5
|
+
export { WorkspaceInvitationEmail, type WorkspaceInvitationEmailProps, } from "./workspace-invitation";
|
|
6
|
+
export { QuotaWarningEmail, type QuotaWarningEmailProps, } from "./quota-warning";
|
|
7
|
+
export { TrialWarningEmail, type TrialWarningEmailProps, } from "./trial-warning";
|
|
8
|
+
export { PaymentFailedEmail, type PaymentFailedEmailProps, } from "./payment-failed";
|
|
9
|
+
export { SubscriptionConfirmedEmail, type SubscriptionConfirmedEmailProps, } from "./subscription-confirmed";
|
|
10
|
+
export { TrialExpiryEmail, type TrialExpiryEmailProps } from "./trial-expiry";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/email/templates/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,GACnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,KAAK,+BAA+B,GACrC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Email Templates — Barrel Export
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// All React Email templates with Intelligo branding. Each template wraps
|
|
5
|
+
// content in BaseLayout for consistent styling.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
export { BaseLayout } from "./base-layout";
|
|
8
|
+
export { WelcomeEmail } from "./welcome";
|
|
9
|
+
export { VerifyEmailEmail } from "./verify-email";
|
|
10
|
+
export { PasswordResetEmail, } from "./password-reset";
|
|
11
|
+
export { WorkspaceInvitationEmail, } from "./workspace-invitation";
|
|
12
|
+
export { QuotaWarningEmail, } from "./quota-warning";
|
|
13
|
+
export { TrialWarningEmail, } from "./trial-warning";
|
|
14
|
+
export { PaymentFailedEmail, } from "./payment-failed";
|
|
15
|
+
export { SubscriptionConfirmedEmail, } from "./subscription-confirmed";
|
|
16
|
+
export { TrialExpiryEmail } from "./trial-expiry";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/email/templates/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAC9E,yEAAyE;AACzE,gDAAgD;AAChD,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,YAAY,EAA0B,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAA8B,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EACL,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,GAEzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,GAE3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAA8B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface PasswordResetEmailProps {
|
|
2
|
+
userName: string;
|
|
3
|
+
resetUrl: string;
|
|
4
|
+
locale?: "en" | "mn";
|
|
5
|
+
}
|
|
6
|
+
export declare function PasswordResetEmail({ userName, resetUrl, locale, }: PasswordResetEmailProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=password-reset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-reset.d.ts","sourceRoot":"","sources":["../../../src/email/templates/password-reset.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,MAAa,GACd,EAAE,uBAAuB,2CAiCzB"}
|