@notionx/core 0.1.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/dist/admin/index.d.ts +137 -0
- package/dist/admin/index.js +206 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/index.d.ts +324 -0
- package/dist/admin/pages/index.js +827 -0
- package/dist/admin/pages/index.js.map +1 -0
- package/dist/auth/auth-pages/forgot-password.d.ts +20 -0
- package/dist/auth/auth-pages/forgot-password.js +70 -0
- package/dist/auth/auth-pages/forgot-password.js.map +1 -0
- package/dist/auth/auth-pages/index.d.ts +6 -0
- package/dist/auth/auth-pages/index.js +342 -0
- package/dist/auth/auth-pages/index.js.map +1 -0
- package/dist/auth/auth-pages/login.d.ts +30 -0
- package/dist/auth/auth-pages/login.js +125 -0
- package/dist/auth/auth-pages/login.js.map +1 -0
- package/dist/auth/auth-pages/register.d.ts +17 -0
- package/dist/auth/auth-pages/register.js +81 -0
- package/dist/auth/auth-pages/register.js.map +1 -0
- package/dist/auth/auth-pages/reset-password.d.ts +18 -0
- package/dist/auth/auth-pages/reset-password.js +72 -0
- package/dist/auth/auth-pages/reset-password.js.map +1 -0
- package/dist/auth/index.d.ts +72 -0
- package/dist/auth/index.js +1011 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/passwords.d.ts +6 -0
- package/dist/auth/passwords.js +79 -0
- package/dist/auth/passwords.js.map +1 -0
- package/dist/auth/rate-limit.d.ts +28 -0
- package/dist/auth/rate-limit.js +245 -0
- package/dist/auth/rate-limit.js.map +1 -0
- package/dist/auth/routes/google-callback.d.ts +6 -0
- package/dist/auth/routes/google-callback.js +404 -0
- package/dist/auth/routes/google-callback.js.map +1 -0
- package/dist/auth/routes/google.d.ts +6 -0
- package/dist/auth/routes/google.js +250 -0
- package/dist/auth/routes/google.js.map +1 -0
- package/dist/auth/routes/index.d.ts +22 -0
- package/dist/auth/routes/index.js +619 -0
- package/dist/auth/routes/index.js.map +1 -0
- package/dist/auth/routes/verify-email.d.ts +6 -0
- package/dist/auth/routes/verify-email.js +317 -0
- package/dist/auth/routes/verify-email.js.map +1 -0
- package/dist/auth/routes/viewer.d.ts +6 -0
- package/dist/auth/routes/viewer.js +372 -0
- package/dist/auth/routes/viewer.js.map +1 -0
- package/dist/auth/session.d.ts +9 -0
- package/dist/auth/session.js +1 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/turnstile.d.ts +20 -0
- package/dist/auth/turnstile.js +301 -0
- package/dist/auth/turnstile.js.map +1 -0
- package/dist/auth/user-session.d.ts +42 -0
- package/dist/auth/user-session.js +419 -0
- package/dist/auth/user-session.js.map +1 -0
- package/dist/auth/users.d.ts +112 -0
- package/dist/auth/users.js +558 -0
- package/dist/auth/users.js.map +1 -0
- package/dist/bootstrap-CN2g76M6.d.ts +67 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.js +47 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/content/admin-summary.d.ts +24 -0
- package/dist/content/admin-summary.js +36 -0
- package/dist/content/admin-summary.js.map +1 -0
- package/dist/content/index.d.ts +9 -0
- package/dist/content/index.js +473 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/models.d.ts +69 -0
- package/dist/content/models.js +24 -0
- package/dist/content/models.js.map +1 -0
- package/dist/content/prewarm.d.ts +28 -0
- package/dist/content/prewarm.js +56 -0
- package/dist/content/prewarm.js.map +1 -0
- package/dist/content/revalidate.d.ts +37 -0
- package/dist/content/revalidate.js +170 -0
- package/dist/content/revalidate.js.map +1 -0
- package/dist/content/search-index.d.ts +54 -0
- package/dist/content/search-index.js +172 -0
- package/dist/content/search-index.js.map +1 -0
- package/dist/content/search.d.ts +8 -0
- package/dist/content/search.js +57 -0
- package/dist/content/search.js.map +1 -0
- package/dist/doctor/cli.d.ts +1 -0
- package/dist/doctor/cli.js +360 -0
- package/dist/doctor/cli.js.map +1 -0
- package/dist/doctor/index.d.ts +139 -0
- package/dist/doctor/index.js +289 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/email/index.d.ts +38 -0
- package/dist/email/index.js +126 -0
- package/dist/email/index.js.map +1 -0
- package/dist/env-C5qu-0R-.d.ts +35 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/i18n/index.d.ts +26 -0
- package/dist/i18n/index.js +73 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +1281 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/admin/index.d.ts +75 -0
- package/dist/internal/admin/index.js +365 -0
- package/dist/internal/admin/index.js.map +1 -0
- package/dist/media/index.d.ts +24 -0
- package/dist/media/index.js +86 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/routes/index.d.ts +1 -0
- package/dist/media/routes/index.js +585 -0
- package/dist/media/routes/index.js.map +1 -0
- package/dist/media/routes/notion-media.d.ts +19 -0
- package/dist/media/routes/notion-media.js +588 -0
- package/dist/media/routes/notion-media.js.map +1 -0
- package/dist/middleware.d.ts +95 -0
- package/dist/middleware.js +79 -0
- package/dist/middleware.js.map +1 -0
- package/dist/notion/block-text.d.ts +5 -0
- package/dist/notion/block-text.js +37 -0
- package/dist/notion/block-text.js.map +1 -0
- package/dist/notion/blocks.d.ts +24 -0
- package/dist/notion/blocks.js +46 -0
- package/dist/notion/blocks.js.map +1 -0
- package/dist/notion/client.d.ts +7 -0
- package/dist/notion/client.js +13 -0
- package/dist/notion/client.js.map +1 -0
- package/dist/notion/config.d.ts +25 -0
- package/dist/notion/config.js +147 -0
- package/dist/notion/config.js.map +1 -0
- package/dist/notion/content-cache.d.ts +45 -0
- package/dist/notion/content-cache.js +166 -0
- package/dist/notion/content-cache.js.map +1 -0
- package/dist/notion/generic-source.d.ts +61 -0
- package/dist/notion/generic-source.js +408 -0
- package/dist/notion/generic-source.js.map +1 -0
- package/dist/notion/index.d.ts +13 -0
- package/dist/notion/index.js +1278 -0
- package/dist/notion/index.js.map +1 -0
- package/dist/notion/mappers.d.ts +1 -0
- package/dist/notion/mappers.js +152 -0
- package/dist/notion/mappers.js.map +1 -0
- package/dist/notion/media.d.ts +22 -0
- package/dist/notion/media.js +209 -0
- package/dist/notion/media.js.map +1 -0
- package/dist/notion/property-mappers.d.ts +24 -0
- package/dist/notion/property-mappers.js +152 -0
- package/dist/notion/property-mappers.js.map +1 -0
- package/dist/notion/routes/index.d.ts +8 -0
- package/dist/notion/routes/index.js +428 -0
- package/dist/notion/routes/index.js.map +1 -0
- package/dist/notion/routes/webhook.d.ts +98 -0
- package/dist/notion/routes/webhook.js +428 -0
- package/dist/notion/routes/webhook.js.map +1 -0
- package/dist/notion/types.d.ts +152 -0
- package/dist/notion/types.js +1 -0
- package/dist/notion/types.js.map +1 -0
- package/dist/notion/webhook.d.ts +83 -0
- package/dist/notion/webhook.js +490 -0
- package/dist/notion/webhook.js.map +1 -0
- package/dist/platform/capabilities.d.ts +34 -0
- package/dist/platform/capabilities.js +42 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/current.d.ts +13 -0
- package/dist/platform/current.js +181 -0
- package/dist/platform/current.js.map +1 -0
- package/dist/platform/index.d.ts +5 -0
- package/dist/platform/index.js +269 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/runtime.d.ts +118 -0
- package/dist/platform/runtime.js +160 -0
- package/dist/platform/runtime.js.map +1 -0
- package/dist/platform/selection.d.ts +10 -0
- package/dist/platform/selection.js +22 -0
- package/dist/platform/selection.js.map +1 -0
- package/dist/storage/index.d.ts +17 -0
- package/dist/storage/index.js +218 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/routes/cdn.d.ts +19 -0
- package/dist/storage/routes/cdn.js +289 -0
- package/dist/storage/routes/cdn.js.map +1 -0
- package/dist/storage/routes/files.d.ts +27 -0
- package/dist/storage/routes/files.js +216 -0
- package/dist/storage/routes/files.js.map +1 -0
- package/dist/storage/routes/index.d.ts +2 -0
- package/dist/storage/routes/index.js +352 -0
- package/dist/storage/routes/index.js.map +1 -0
- package/dist/types-BsAcZSNX.d.ts +94 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/util/index.d.ts +18 -0
- package/dist/util/index.js +48 -0
- package/dist/util/index.js.map +1 -0
- package/dist/worker/index.d.ts +6 -0
- package/dist/worker/index.js +1026 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/routes/content-prewarm.d.ts +34 -0
- package/dist/worker/routes/content-prewarm.js +38 -0
- package/dist/worker/routes/content-prewarm.js.map +1 -0
- package/dist/worker/routes/content-revalidate.d.ts +81 -0
- package/dist/worker/routes/content-revalidate.js +64 -0
- package/dist/worker/routes/content-revalidate.js.map +1 -0
- package/dist/worker/routes/health.d.ts +14 -0
- package/dist/worker/routes/health.js +278 -0
- package/dist/worker/routes/health.js.map +1 -0
- package/dist/worker/routes/index.d.ts +6 -0
- package/dist/worker/routes/index.js +373 -0
- package/dist/worker/routes/index.js.map +1 -0
- package/package.json +124 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/email/resend.ts
|
|
2
|
+
import { Resend } from "resend";
|
|
3
|
+
|
|
4
|
+
// src/util/env.ts
|
|
5
|
+
import { env } from "cloudflare:workers";
|
|
6
|
+
var workerEnv = env;
|
|
7
|
+
|
|
8
|
+
// src/email/resend.ts
|
|
9
|
+
var resendClient = null;
|
|
10
|
+
function getResend() {
|
|
11
|
+
if (resendClient) return resendClient;
|
|
12
|
+
const env2 = workerEnv;
|
|
13
|
+
if (!env2.RESEND_API_KEY) return null;
|
|
14
|
+
resendClient = new Resend(env2.RESEND_API_KEY);
|
|
15
|
+
return resendClient;
|
|
16
|
+
}
|
|
17
|
+
async function sendEmail(args) {
|
|
18
|
+
const env2 = workerEnv;
|
|
19
|
+
const resend = getResend();
|
|
20
|
+
if (!resend) {
|
|
21
|
+
console.log("[email:noop] to=%s subject=%s", args.to, args.subject);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const from = env2.RESEND_FROM || "Blog <noreply@resend.dev>";
|
|
25
|
+
const { data, error } = await resend.emails.send({
|
|
26
|
+
from,
|
|
27
|
+
to: args.to,
|
|
28
|
+
subject: args.subject,
|
|
29
|
+
html: args.html,
|
|
30
|
+
text: args.text,
|
|
31
|
+
replyTo: args.replyTo
|
|
32
|
+
});
|
|
33
|
+
if (error) {
|
|
34
|
+
throw new Error(`Resend error: ${error.message}`);
|
|
35
|
+
}
|
|
36
|
+
return data?.id ?? null;
|
|
37
|
+
}
|
|
38
|
+
function esc(s) {
|
|
39
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
40
|
+
}
|
|
41
|
+
function welcomeEmailHtml(opts) {
|
|
42
|
+
return `<!DOCTYPE html>
|
|
43
|
+
<html>
|
|
44
|
+
<head><meta charset="utf-8"><title>Welcome</title></head>
|
|
45
|
+
<body style="margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#171717;">
|
|
46
|
+
<div style="max-width:560px;margin:0 auto;padding:40px 20px;">
|
|
47
|
+
<h1 style="font-size:24px;font-weight:600;margin:0 0 16px;">Welcome aboard!</h1>
|
|
48
|
+
<p style="font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;">
|
|
49
|
+
Hi <strong>${esc(opts.email)}</strong>\uFF0C\u611F\u8C22\u8BA2\u9605 <a href="${esc(opts.siteUrl)}">vinext Blog</a>\u3002
|
|
50
|
+
\u65B0\u6587\u7AE0\u53D1\u5E03\u65F6\u4F1A\u7B2C\u4E00\u65F6\u95F4\u901A\u77E5\u4F60\u3002
|
|
51
|
+
</p>
|
|
52
|
+
<hr style="border:0;border-top:1px solid #e5e5e5;margin:32px 0;" />
|
|
53
|
+
<p style="font-size:12px;color:#737373;margin:0;">
|
|
54
|
+
\u4E0D\u60F3\u518D\u6536\uFF1F<a href="${esc(opts.unsubscribeUrl)}" style="color:#737373;">\u9000\u8BA2</a>
|
|
55
|
+
</p>
|
|
56
|
+
</div>
|
|
57
|
+
</body>
|
|
58
|
+
</html>`;
|
|
59
|
+
}
|
|
60
|
+
function resetPasswordHtml(opts) {
|
|
61
|
+
return `<!DOCTYPE html>
|
|
62
|
+
<html>
|
|
63
|
+
<body style="margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;">
|
|
64
|
+
<div style="max-width:560px;margin:0 auto;padding:40px 20px;">
|
|
65
|
+
<p style="font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;">Reset password</p>
|
|
66
|
+
<h1 style="font-size:24px;font-weight:600;margin:0 0 12px;">Reset your password</h1>
|
|
67
|
+
<p style="font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;">
|
|
68
|
+
Hi <strong>${esc(opts.email)}</strong>\uFF0C\u6211\u4EEC\u6536\u5230\u4E86\u91CD\u7F6E <a href="${esc(opts.siteUrl)}">vinext Blog</a> \u8D26\u6237\u5BC6\u7801\u7684\u8BF7\u6C42\u3002
|
|
69
|
+
\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u8BBE\u7F6E\u65B0\u5BC6\u7801\u3002\u94FE\u63A5 1 \u5C0F\u65F6\u5185\u6709\u6548\u3002
|
|
70
|
+
</p>
|
|
71
|
+
<a href="${esc(opts.resetUrl)}" style="display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;">Reset password</a>
|
|
72
|
+
<p style="font-size:12px;color:#737373;margin:24px 0 0;">
|
|
73
|
+
\u5982\u679C\u8FD9\u4E0D\u662F\u4F60\u7684\u64CD\u4F5C\uFF0C\u8BF7\u5FFD\u7565\u6B64\u90AE\u4EF6\u3002\u5982\u679C\u6309\u94AE\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u590D\u5236\u94FE\u63A5\u5230\u6D4F\u89C8\u5668\uFF1A<br />
|
|
74
|
+
<a href="${esc(opts.resetUrl)}" style="color:#737373;word-break:break-all;">${esc(opts.resetUrl)}</a>
|
|
75
|
+
</p>
|
|
76
|
+
</div>
|
|
77
|
+
</body>
|
|
78
|
+
</html>`;
|
|
79
|
+
}
|
|
80
|
+
function verifyEmailHtml(opts) {
|
|
81
|
+
return `<!DOCTYPE html>
|
|
82
|
+
<html>
|
|
83
|
+
<body style="margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;">
|
|
84
|
+
<div style="max-width:560px;margin:0 auto;padding:40px 20px;">
|
|
85
|
+
<p style="font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;">Verify email</p>
|
|
86
|
+
<h1 style="font-size:24px;font-weight:600;margin:0 0 12px;">Confirm your email</h1>
|
|
87
|
+
<p style="font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;">
|
|
88
|
+
Hi <strong>${esc(opts.email)}</strong>\uFF0C\u6B22\u8FCE\u6CE8\u518C <a href="${esc(opts.siteUrl)}">vinext Blog</a>\u3002
|
|
89
|
+
\u8BF7\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\u5B8C\u6210\u90AE\u7BB1\u9A8C\u8BC1\uFF0C\u9A8C\u8BC1\u540E\u5373\u53EF\u767B\u5F55\u540E\u53F0\u3002
|
|
90
|
+
</p>
|
|
91
|
+
<a href="${esc(opts.verifyUrl)}" style="display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;">Verify email</a>
|
|
92
|
+
<p style="font-size:12px;color:#737373;margin:24px 0 0;">
|
|
93
|
+
\u5982\u679C\u6309\u94AE\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u590D\u5236\u8FD9\u4E2A\u94FE\u63A5\u5230\u6D4F\u89C8\u5668\uFF1A<br />
|
|
94
|
+
<a href="${esc(opts.verifyUrl)}" style="color:#737373;word-break:break-all;">${esc(opts.verifyUrl)}</a>
|
|
95
|
+
</p>
|
|
96
|
+
</div>
|
|
97
|
+
</body>
|
|
98
|
+
</html>`;
|
|
99
|
+
}
|
|
100
|
+
function newPostEmailHtml(opts) {
|
|
101
|
+
return `<!DOCTYPE html>
|
|
102
|
+
<html>
|
|
103
|
+
<body style="margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;">
|
|
104
|
+
<div style="max-width:560px;margin:0 auto;padding:40px 20px;">
|
|
105
|
+
<p style="font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;">New post</p>
|
|
106
|
+
<h1 style="font-size:24px;font-weight:600;margin:0 0 16px;">
|
|
107
|
+
<a href="${esc(opts.url)}" style="color:#171717;text-decoration:none;">${esc(opts.title)}</a>
|
|
108
|
+
</h1>
|
|
109
|
+
<p style="font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;">${esc(opts.description)}</p>
|
|
110
|
+
<a href="${esc(opts.url)}" style="display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;">Read the post \u2192</a>
|
|
111
|
+
<hr style="border:0;border-top:1px solid #e5e5e5;margin:40px 0 16px;" />
|
|
112
|
+
<p style="font-size:12px;color:#737373;margin:0;">
|
|
113
|
+
\u4E0D\u60F3\u518D\u6536\u65B0\u6587\u7AE0\u901A\u77E5\uFF1F<a href="${esc(opts.unsubscribeUrl)}" style="color:#737373;">\u9000\u8BA2</a>
|
|
114
|
+
</p>
|
|
115
|
+
</div>
|
|
116
|
+
</body>
|
|
117
|
+
</html>`;
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
newPostEmailHtml,
|
|
121
|
+
resetPasswordHtml,
|
|
122
|
+
sendEmail,
|
|
123
|
+
verifyEmailHtml,
|
|
124
|
+
welcomeEmailHtml
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/email/resend.ts","../../src/util/env.ts"],"sourcesContent":["// Email delivery via the Resend HTTP API.\n//\n// Cloudflare Workers cannot use SMTP (no long-lived connections), so\n// email is sent through the Resend HTTP API. The free Resend tier\n// covers 3 000 messages per month.\n\nimport { Resend } from \"resend\";\nimport { workerEnv } from \"../util/env\";\n\nlet resendClient: Resend | null = null;\n\nfunction getResend(): Resend | null {\n if (resendClient) return resendClient;\n const env = workerEnv;\n if (!env.RESEND_API_KEY) return null;\n resendClient = new Resend(env.RESEND_API_KEY);\n return resendClient;\n}\n\ntype SendArgs = {\n to: string | string[];\n subject: string;\n html: string;\n text?: string;\n replyTo?: string;\n};\n\n/**\n * Send an email. When RESEND_API_KEY is not set (the dev default), the\n * call is silently skipped with a log line instead of failing. Returns\n * the Resend message id, or null when no-op. Throws on a Resend error.\n */\nexport async function sendEmail(args: SendArgs): Promise<string | null> {\n const env = workerEnv;\n const resend = getResend();\n\n // Dev mode without a key: skip silently.\n if (!resend) {\n console.log(\"[email:noop] to=%s subject=%s\", args.to, args.subject);\n return null;\n }\n\n const from = env.RESEND_FROM || \"Blog <noreply@resend.dev>\";\n\n const { data, error } = await resend.emails.send({\n from,\n to: args.to,\n subject: args.subject,\n html: args.html,\n text: args.text,\n replyTo: args.replyTo,\n });\n\n if (error) {\n throw new Error(`Resend error: ${error.message}`);\n }\n return data?.id ?? null;\n}\n\n/** Minimal HTML escape (avoids depending on a runtime sanitizer). */\nfunction esc(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/** Welcome email for new newsletter subscribers. */\nexport function welcomeEmailHtml(opts: {\n email: string;\n unsubscribeUrl: string;\n siteUrl: string;\n}): string {\n return `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><title>Welcome</title></head>\n<body style=\"margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#171717;\">\n <div style=\"max-width:560px;margin:0 auto;padding:40px 20px;\">\n <h1 style=\"font-size:24px;font-weight:600;margin:0 0 16px;\">Welcome aboard!</h1>\n <p style=\"font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;\">\n Hi <strong>${esc(opts.email)}</strong>,感谢订阅 <a href=\"${esc(opts.siteUrl)}\">vinext Blog</a>。\n 新文章发布时会第一时间通知你。\n </p>\n <hr style=\"border:0;border-top:1px solid #e5e5e5;margin:32px 0;\" />\n <p style=\"font-size:12px;color:#737373;margin:0;\">\n 不想再收?<a href=\"${esc(opts.unsubscribeUrl)}\" style=\"color:#737373;\">退订</a>\n </p>\n </div>\n</body>\n</html>`;\n}\n\nexport function resetPasswordHtml(opts: {\n resetUrl: string;\n siteUrl: string;\n email: string;\n}): string {\n return `<!DOCTYPE html>\n<html>\n<body style=\"margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;\">\n <div style=\"max-width:560px;margin:0 auto;padding:40px 20px;\">\n <p style=\"font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;\">Reset password</p>\n <h1 style=\"font-size:24px;font-weight:600;margin:0 0 12px;\">Reset your password</h1>\n <p style=\"font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;\">\n Hi <strong>${esc(opts.email)}</strong>,我们收到了重置 <a href=\"${esc(opts.siteUrl)}\">vinext Blog</a> 账户密码的请求。\n 点击下方按钮设置新密码。链接 1 小时内有效。\n </p>\n <a href=\"${esc(opts.resetUrl)}\" style=\"display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;\">Reset password</a>\n <p style=\"font-size:12px;color:#737373;margin:24px 0 0;\">\n 如果这不是你的操作,请忽略此邮件。如果按钮无法打开,请复制链接到浏览器:<br />\n <a href=\"${esc(opts.resetUrl)}\" style=\"color:#737373;word-break:break-all;\">${esc(opts.resetUrl)}</a>\n </p>\n </div>\n</body>\n</html>`;\n}\n\nexport function verifyEmailHtml(opts: {\n verifyUrl: string;\n siteUrl: string;\n email: string;\n}): string {\n return `<!DOCTYPE html>\n<html>\n<body style=\"margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;\">\n <div style=\"max-width:560px;margin:0 auto;padding:40px 20px;\">\n <p style=\"font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;\">Verify email</p>\n <h1 style=\"font-size:24px;font-weight:600;margin:0 0 12px;\">Confirm your email</h1>\n <p style=\"font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;\">\n Hi <strong>${esc(opts.email)}</strong>,欢迎注册 <a href=\"${esc(opts.siteUrl)}\">vinext Blog</a>。\n 请点击下面的按钮完成邮箱验证,验证后即可登录后台。\n </p>\n <a href=\"${esc(opts.verifyUrl)}\" style=\"display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;\">Verify email</a>\n <p style=\"font-size:12px;color:#737373;margin:24px 0 0;\">\n 如果按钮无法打开,请复制这个链接到浏览器:<br />\n <a href=\"${esc(opts.verifyUrl)}\" style=\"color:#737373;word-break:break-all;\">${esc(opts.verifyUrl)}</a>\n </p>\n </div>\n</body>\n</html>`;\n}\n\n/** New post notification email. */\nexport function newPostEmailHtml(opts: {\n title: string;\n description: string;\n url: string;\n unsubscribeUrl: string;\n}): string {\n return `<!DOCTYPE html>\n<html>\n<body style=\"margin:0;padding:0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,sans-serif;color:#171717;\">\n <div style=\"max-width:560px;margin:0 auto;padding:40px 20px;\">\n <p style=\"font-size:13px;color:#737373;margin:0 0 8px;text-transform:uppercase;letter-spacing:0.05em;\">New post</p>\n <h1 style=\"font-size:24px;font-weight:600;margin:0 0 16px;\">\n <a href=\"${esc(opts.url)}\" style=\"color:#171717;text-decoration:none;\">${esc(opts.title)}</a>\n </h1>\n <p style=\"font-size:16px;line-height:24px;color:#404040;margin:0 0 24px;\">${esc(opts.description)}</p>\n <a href=\"${esc(opts.url)}\" style=\"display:inline-block;background:#171717;color:#fafafa;padding:10px 20px;border-radius:6px;text-decoration:none;font-size:14px;\">Read the post →</a>\n <hr style=\"border:0;border-top:1px solid #e5e5e5;margin:40px 0 16px;\" />\n <p style=\"font-size:12px;color:#737373;margin:0;\">\n 不想再收新文章通知?<a href=\"${esc(opts.unsubscribeUrl)}\" style=\"color:#737373;\">退订</a>\n </p>\n </div>\n</body>\n</html>`;\n}\n","// lib/env.ts - 集中获取 Cloudflare bindings\n// 用 cloudflare:workers 模块(workerd 内置),作为平台 adapter 的绑定入口\n\n/// <reference types=\"@cloudflare/workers-types\" />\nimport { env } from \"cloudflare:workers\";\n\nexport type AppEnv = {\n DB: D1Database;\n ASSETS: Fetcher;\n IMAGES: ImagesBinding;\n ASSETS_BUCKET?: R2Bucket;\n CONTENT_CACHE?: KVNamespace;\n ADMIN_PASSWORD: string;\n ADMIN_EMAIL?: string;\n SITE_URL?: string;\n RESEND_API_KEY?: string;\n RESEND_FROM?: string;\n // Google OAuth 仍然兼容 Cloudflare Secret 作为兜底。\n // 实际生效值以 app_settings.google_client_id / google_client_secret 为准。\n GOOGLE_CLIENT_ID?: string;\n GOOGLE_CLIENT_SECRET?: string;\n /** Turnstile site key fallback when not stored in app_settings */\n TURNSTILE_SITE_KEY?: string;\n /** Turnstile secret — set via `wrangler secret put TURNSTILE_SECRET_KEY` */\n TURNSTILE_SECRET_KEY?: string;\n /** Notion integration token for the blog data source */\n NOTION_TOKEN?: string;\n /** Notion data source ID used by dataSources.query */\n NOTION_DATA_SOURCE_ID?: string;\n /** Notion data source ID for the public movie catalog */\n NOTION_MOVIES_DATA_SOURCE_ID?: string;\n /** Notion data source ID for localized movie copy */\n NOTION_MOVIE_TRANSLATIONS_DATA_SOURCE_ID?: string;\n /** Optional Notion API base URL for tests or proxies */\n NOTION_API_BASE_URL?: string;\n /** Optional Notion edit URL for admin handoff screens */\n NOTION_EDIT_BASE_URL?: string;\n /** Optional webhook verification token for Notion invalidation */\n NOTION_WEBHOOK_VERIFICATION_TOKEN?: string;\n};\n\n// 强制类型:vinext 把 env 类型放在 env.d.ts(interface VinextEnv extends Env),\n// 但 TS server 经常解析不到。运行时一定有 DB,类型断言保证编译通过。\nexport const workerEnv = env as unknown as AppEnv;\n"],"mappings":";AAMA,SAAS,cAAc;;;ACFvB,SAAS,WAAW;AAuCb,IAAM,YAAY;;;ADlCzB,IAAI,eAA8B;AAElC,SAAS,YAA2B;AAClC,MAAI,aAAc,QAAO;AACzB,QAAMA,OAAM;AACZ,MAAI,CAACA,KAAI,eAAgB,QAAO;AAChC,iBAAe,IAAI,OAAOA,KAAI,cAAc;AAC5C,SAAO;AACT;AAeA,eAAsB,UAAU,MAAwC;AACtE,QAAMA,OAAM;AACZ,QAAM,SAAS,UAAU;AAGzB,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,iCAAiC,KAAK,IAAI,KAAK,OAAO;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,OAAOA,KAAI,eAAe;AAEhC,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,OAAO,KAAK;AAAA,IAC/C;AAAA,IACA,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,EAChB,CAAC;AAED,MAAI,OAAO;AACT,UAAM,IAAI,MAAM,iBAAiB,MAAM,OAAO,EAAE;AAAA,EAClD;AACA,SAAO,MAAM,MAAM;AACrB;AAGA,SAAS,IAAI,GAAmB;AAC9B,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAGO,SAAS,iBAAiB,MAItB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOU,IAAI,KAAK,KAAK,CAAC,oDAA2B,IAAI,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,+CAKxD,IAAI,KAAK,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAK9C;AAEO,SAAS,kBAAkB,MAIvB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOU,IAAI,KAAK,KAAK,CAAC,sEAA8B,IAAI,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,eAGlE,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,iBAGhB,IAAI,KAAK,QAAQ,CAAC,iDAAiD,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAKtG;AAEO,SAAS,gBAAgB,MAIrB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOU,IAAI,KAAK,KAAK,CAAC,oDAA2B,IAAI,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,eAG/D,IAAI,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA,iBAGjB,IAAI,KAAK,SAAS,CAAC,iDAAiD,IAAI,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAKxG;AAGO,SAAS,iBAAiB,MAKtB;AACT,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMQ,IAAI,KAAK,GAAG,CAAC,iDAAiD,IAAI,KAAK,KAAK,CAAC;AAAA;AAAA,gFAEd,IAAI,KAAK,WAAW,CAAC;AAAA,eACtF,IAAI,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA,6EAGD,IAAI,KAAK,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAKnD;","names":["env"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
type AppEnv = {
|
|
2
|
+
DB: D1Database;
|
|
3
|
+
ASSETS: Fetcher;
|
|
4
|
+
IMAGES: ImagesBinding;
|
|
5
|
+
ASSETS_BUCKET?: R2Bucket;
|
|
6
|
+
CONTENT_CACHE?: KVNamespace;
|
|
7
|
+
ADMIN_PASSWORD: string;
|
|
8
|
+
ADMIN_EMAIL?: string;
|
|
9
|
+
SITE_URL?: string;
|
|
10
|
+
RESEND_API_KEY?: string;
|
|
11
|
+
RESEND_FROM?: string;
|
|
12
|
+
GOOGLE_CLIENT_ID?: string;
|
|
13
|
+
GOOGLE_CLIENT_SECRET?: string;
|
|
14
|
+
/** Turnstile site key fallback when not stored in app_settings */
|
|
15
|
+
TURNSTILE_SITE_KEY?: string;
|
|
16
|
+
/** Turnstile secret — set via `wrangler secret put TURNSTILE_SECRET_KEY` */
|
|
17
|
+
TURNSTILE_SECRET_KEY?: string;
|
|
18
|
+
/** Notion integration token for the blog data source */
|
|
19
|
+
NOTION_TOKEN?: string;
|
|
20
|
+
/** Notion data source ID used by dataSources.query */
|
|
21
|
+
NOTION_DATA_SOURCE_ID?: string;
|
|
22
|
+
/** Notion data source ID for the public movie catalog */
|
|
23
|
+
NOTION_MOVIES_DATA_SOURCE_ID?: string;
|
|
24
|
+
/** Notion data source ID for localized movie copy */
|
|
25
|
+
NOTION_MOVIE_TRANSLATIONS_DATA_SOURCE_ID?: string;
|
|
26
|
+
/** Optional Notion API base URL for tests or proxies */
|
|
27
|
+
NOTION_API_BASE_URL?: string;
|
|
28
|
+
/** Optional Notion edit URL for admin handoff screens */
|
|
29
|
+
NOTION_EDIT_BASE_URL?: string;
|
|
30
|
+
/** Optional webhook verification token for Notion invalidation */
|
|
31
|
+
NOTION_WEBHOOK_VERIFICATION_TOKEN?: string;
|
|
32
|
+
};
|
|
33
|
+
declare const workerEnv: AppEnv;
|
|
34
|
+
|
|
35
|
+
export { type AppEnv as A, workerEnv as w };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare const supportedLocales: readonly ["zh-CN", "en-US"];
|
|
2
|
+
type AppLocale = (typeof supportedLocales)[number];
|
|
3
|
+
declare const defaultLocale: AppLocale;
|
|
4
|
+
declare function isAppLocale(value: string): value is AppLocale;
|
|
5
|
+
declare function localizedMovieListPath(locale: AppLocale): string;
|
|
6
|
+
declare function localizedMovieDetailPath(locale: AppLocale, slug: string): string;
|
|
7
|
+
declare function expandLocalizedMoviePaths(paths: readonly string[], locale?: string): string[];
|
|
8
|
+
|
|
9
|
+
type MovieUiMessages = {
|
|
10
|
+
backToList: string;
|
|
11
|
+
releaseDate: string;
|
|
12
|
+
director: string;
|
|
13
|
+
actors: string;
|
|
14
|
+
noSummary: string;
|
|
15
|
+
unknownYear: string;
|
|
16
|
+
unknownReleaseDate: string;
|
|
17
|
+
searchPlaceholder: string;
|
|
18
|
+
noSearchResults: string;
|
|
19
|
+
itemLabel: string;
|
|
20
|
+
notionLink: string;
|
|
21
|
+
admin: string;
|
|
22
|
+
languageLabel: string;
|
|
23
|
+
};
|
|
24
|
+
declare function getMovieUiMessages(locale: AppLocale): MovieUiMessages;
|
|
25
|
+
|
|
26
|
+
export { type AppLocale, type MovieUiMessages, defaultLocale, expandLocalizedMoviePaths, getMovieUiMessages, isAppLocale, localizedMovieDetailPath, localizedMovieListPath, supportedLocales };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// src/i18n/config.ts
|
|
2
|
+
var supportedLocales = ["zh-CN", "en-US"];
|
|
3
|
+
var defaultLocale = "zh-CN";
|
|
4
|
+
function isAppLocale(value) {
|
|
5
|
+
return supportedLocales.includes(value);
|
|
6
|
+
}
|
|
7
|
+
function localizedMovieListPath(locale) {
|
|
8
|
+
return `/${locale}/movies`;
|
|
9
|
+
}
|
|
10
|
+
function localizedMovieDetailPath(locale, slug) {
|
|
11
|
+
return `/${locale}/movies/${slug}`;
|
|
12
|
+
}
|
|
13
|
+
function expandLocalizedMoviePaths(paths, locale) {
|
|
14
|
+
const locales = locale && isAppLocale(locale) ? [locale] : [...supportedLocales];
|
|
15
|
+
const expanded = [];
|
|
16
|
+
for (const path of paths) {
|
|
17
|
+
if (path === "/movies" || path.startsWith("/movies/")) {
|
|
18
|
+
for (const currentLocale of locales) {
|
|
19
|
+
expanded.push(`/${currentLocale}${path}`);
|
|
20
|
+
}
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
expanded.push(path);
|
|
24
|
+
}
|
|
25
|
+
return Array.from(new Set(expanded));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/i18n/messages.ts
|
|
29
|
+
var movieUiMessages = {
|
|
30
|
+
"zh-CN": {
|
|
31
|
+
backToList: "\u8FD4\u56DE\u7535\u5F71\u5217\u8868",
|
|
32
|
+
releaseDate: "\u4E0A\u6620\u65F6\u95F4",
|
|
33
|
+
director: "\u5BFC\u6F14",
|
|
34
|
+
actors: "\u6F14\u5458",
|
|
35
|
+
noSummary: "\u6682\u65E0\u5267\u60C5\u7B80\u4ECB\u3002",
|
|
36
|
+
unknownYear: "\u672A\u77E5\u5E74\u4EFD",
|
|
37
|
+
unknownReleaseDate: "\u672A\u77E5\u4E0A\u6620\u65F6\u95F4",
|
|
38
|
+
searchPlaceholder: "\u641C\u7D22\u7247\u540D\u3001\u6B63\u6587\u3001\u5BFC\u6F14\u3001\u6F14\u5458\u3001\u7C7B\u578B",
|
|
39
|
+
noSearchResults: "\u6CA1\u6709\u5339\u914D\u7684\u7535\u5F71\u3002",
|
|
40
|
+
itemLabel: "\u90E8\u5F71\u7247",
|
|
41
|
+
notionLink: "Notion",
|
|
42
|
+
admin: "Admin",
|
|
43
|
+
languageLabel: "\u8BED\u8A00"
|
|
44
|
+
},
|
|
45
|
+
"en-US": {
|
|
46
|
+
backToList: "Back to movies",
|
|
47
|
+
releaseDate: "Release date",
|
|
48
|
+
director: "Director",
|
|
49
|
+
actors: "Cast",
|
|
50
|
+
noSummary: "No synopsis yet.",
|
|
51
|
+
unknownYear: "Unknown year",
|
|
52
|
+
unknownReleaseDate: "Unknown release date",
|
|
53
|
+
searchPlaceholder: "Search titles, body, director, cast, or genre",
|
|
54
|
+
noSearchResults: "No movies matched your search.",
|
|
55
|
+
itemLabel: "movies",
|
|
56
|
+
notionLink: "Notion",
|
|
57
|
+
admin: "Admin",
|
|
58
|
+
languageLabel: "Language"
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function getMovieUiMessages(locale) {
|
|
62
|
+
return movieUiMessages[locale];
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
defaultLocale,
|
|
66
|
+
expandLocalizedMoviePaths,
|
|
67
|
+
getMovieUiMessages,
|
|
68
|
+
isAppLocale,
|
|
69
|
+
localizedMovieDetailPath,
|
|
70
|
+
localizedMovieListPath,
|
|
71
|
+
supportedLocales
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/i18n/config.ts","../../src/i18n/messages.ts"],"sourcesContent":["export const supportedLocales = [\"zh-CN\", \"en-US\"] as const;\n\nexport type AppLocale = (typeof supportedLocales)[number];\n\nexport const defaultLocale: AppLocale = \"zh-CN\";\n\nexport function isAppLocale(value: string): value is AppLocale {\n return (supportedLocales as readonly string[]).includes(value);\n}\n\nexport function localizedMovieListPath(locale: AppLocale) {\n return `/${locale}/movies`;\n}\n\nexport function localizedMovieDetailPath(locale: AppLocale, slug: string) {\n return `/${locale}/movies/${slug}`;\n}\n\nexport function expandLocalizedMoviePaths(\n paths: readonly string[],\n locale?: string\n) {\n const locales =\n locale && isAppLocale(locale) ? [locale] : [...supportedLocales];\n const expanded: string[] = [];\n\n for (const path of paths) {\n if (path === \"/movies\" || path.startsWith(\"/movies/\")) {\n for (const currentLocale of locales) {\n expanded.push(`/${currentLocale}${path}`);\n }\n continue;\n }\n expanded.push(path);\n }\n\n return Array.from(new Set(expanded));\n}\n","import type { AppLocale } from \"./config\";\n\nexport type MovieUiMessages = {\n backToList: string;\n releaseDate: string;\n director: string;\n actors: string;\n noSummary: string;\n unknownYear: string;\n unknownReleaseDate: string;\n searchPlaceholder: string;\n noSearchResults: string;\n itemLabel: string;\n notionLink: string;\n admin: string;\n languageLabel: string;\n};\n\nconst movieUiMessages: Record<AppLocale, MovieUiMessages> = {\n \"zh-CN\": {\n backToList: \"返回电影列表\",\n releaseDate: \"上映时间\",\n director: \"导演\",\n actors: \"演员\",\n noSummary: \"暂无剧情简介。\",\n unknownYear: \"未知年份\",\n unknownReleaseDate: \"未知上映时间\",\n searchPlaceholder: \"搜索片名、正文、导演、演员、类型\",\n noSearchResults: \"没有匹配的电影。\",\n itemLabel: \"部影片\",\n notionLink: \"Notion\",\n admin: \"Admin\",\n languageLabel: \"语言\",\n },\n \"en-US\": {\n backToList: \"Back to movies\",\n releaseDate: \"Release date\",\n director: \"Director\",\n actors: \"Cast\",\n noSummary: \"No synopsis yet.\",\n unknownYear: \"Unknown year\",\n unknownReleaseDate: \"Unknown release date\",\n searchPlaceholder: \"Search titles, body, director, cast, or genre\",\n noSearchResults: \"No movies matched your search.\",\n itemLabel: \"movies\",\n notionLink: \"Notion\",\n admin: \"Admin\",\n languageLabel: \"Language\",\n },\n};\n\nexport function getMovieUiMessages(locale: AppLocale): MovieUiMessages {\n return movieUiMessages[locale];\n}\n"],"mappings":";AAAO,IAAM,mBAAmB,CAAC,SAAS,OAAO;AAI1C,IAAM,gBAA2B;AAEjC,SAAS,YAAY,OAAmC;AAC7D,SAAQ,iBAAuC,SAAS,KAAK;AAC/D;AAEO,SAAS,uBAAuB,QAAmB;AACxD,SAAO,IAAI,MAAM;AACnB;AAEO,SAAS,yBAAyB,QAAmB,MAAc;AACxE,SAAO,IAAI,MAAM,WAAW,IAAI;AAClC;AAEO,SAAS,0BACd,OACA,QACA;AACA,QAAM,UACJ,UAAU,YAAY,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,gBAAgB;AACjE,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,aAAa,KAAK,WAAW,UAAU,GAAG;AACrD,iBAAW,iBAAiB,SAAS;AACnC,iBAAS,KAAK,IAAI,aAAa,GAAG,IAAI,EAAE;AAAA,MAC1C;AACA;AAAA,IACF;AACA,aAAS,KAAK,IAAI;AAAA,EACpB;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrC;;;ACnBA,IAAM,kBAAsD;AAAA,EAC1D,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB,QAAoC;AACrE,SAAO,gBAAgB,MAAM;AAC/B;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { AdminExtension, AdminNavItem, AuthConfig, FoundationConfig, WorkerOptions } from './types.js';
|
|
2
|
+
export { ContentSource, defineContentSource } from './content/models.js';
|
|
3
|
+
export { c as createNextionWorker } from './bootstrap-CN2g76M6.js';
|
|
4
|
+
export { DoctorFinding, NextionDoctorFindingsReport, RunNextionDoctorOptions, RuntimeLike, runNextionDoctor } from './doctor/index.js';
|
|
5
|
+
import './notion/types.js';
|
|
6
|
+
import './middleware.js';
|
|
7
|
+
import './platform/capabilities.js';
|
|
8
|
+
import './platform/selection.js';
|