@mailto.foo/sdk 1.5.3 → 1.5.5
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/bin/cli.js +16 -8
- package/dist/bin/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/{commands → knowledge}/mailto-foo.md +2 -10
- package/dist/sdk.min.js +1 -1
- package/package.json +5 -5
package/dist/bin/cli.js
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { appendFileSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
6
|
const command = process.argv[2];
|
|
7
|
+
const MARKER = "<!-- mailto.foo/sdk -->";
|
|
7
8
|
const init = () => {
|
|
8
|
-
const src = join(__dirname, "..", "
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const src = join(__dirname, "..", "knowledge", "mailto-foo.md");
|
|
10
|
+
const dest = join(process.cwd(), "AGENTS.md");
|
|
11
|
+
const content = readFileSync(src, "utf8");
|
|
12
|
+
if (existsSync(dest)) {
|
|
13
|
+
if (readFileSync(dest, "utf8").includes(MARKER)) {
|
|
14
|
+
console.log("AGENTS.md already has mailto.foo/sdk integration notes.");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
appendFileSync(dest, `\n${content}`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
writeFileSync(dest, content);
|
|
21
|
+
}
|
|
22
|
+
console.log("Added @mailto.foo/sdk integration notes to AGENTS.md");
|
|
15
23
|
};
|
|
16
24
|
switch (command) {
|
|
17
25
|
case "init":
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,MAAM,MAAM,GAAG,yBAAyB,CAAC;AAEzC,MAAM,IAAI,GAAG,GAAG,EAAE;IACjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE1C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO;QACR,CAAC;QACD,cAAc,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACP,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,QAAQ,OAAO,EAAE,CAAC;IACjB,KAAK,MAAM;QACV,IAAI,EAAE,CAAC;QACP,MAAM;IACP;QACC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export const API_BASE = "
|
|
1
|
+
export const API_BASE = (typeof process !== "undefined" ? process.env.MAILTO_FOO_API_BASE : undefined) ??
|
|
2
|
+
"https://api.mailto.foo";
|
|
2
3
|
const fetchPublisherConfig = async (publishKey) => {
|
|
3
4
|
const controller = new AbortController();
|
|
4
5
|
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
@@ -87,7 +88,7 @@ const showTurnstileFallback = (siteKey) => {
|
|
|
87
88
|
const getTurnstileToken = async (siteKey) => {
|
|
88
89
|
await loadTurnstileScript();
|
|
89
90
|
const container = document.createElement("div");
|
|
90
|
-
container.style.cssText = "position:fixed;
|
|
91
|
+
container.style.cssText = "position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2147483647;";
|
|
91
92
|
document.body.appendChild(container);
|
|
92
93
|
let widgetId;
|
|
93
94
|
const cleanup = () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,wBAAwB,CAAC;AAE3B,MAAM,oBAAoB,GAAG,KAAK,EAAE,UAAkB,EAA4B,EAAE;IAClF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,UAAU,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACtD,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAA,CAAC,KAAK,IAAI,wBAAwB,GAAG,CAAC,MAAM,EAAE;gBACxF,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA8B,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,sBAAsB,GAAyB,IAAI,CAAC;AAExD,MAAM,mBAAmB,GAAG,GAAkB,EAAE;IAC9C,IAAK,MAAc,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACxD,IAAI,sBAAsB;QAAE,OAAO,sBAAsB,CAAC;IAE1D,sBAAsB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,GAAG,uEAAuE,CAAC;QACrF,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;YACvB,sBAAsB,GAAG,IAAI,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,OAAO,sBAAsB,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAmB,EAAE;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;YACtB,gBAAgB;YAChB,SAAS;YACT,oBAAoB;YACpB,cAAc;YACd,oBAAoB;YACpB,wBAAwB;YACxB,4BAA4B;SAC7B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,QAAgB,CAAC;QACrB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC;gBAAE,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAI,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAC7E,CAAC,CAAC;QAEF,QAAQ,GAAI,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE;YAClD,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,gBAAgB,EAAE,GAAG,EAAE;gBACrB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,kBAAkB,EAAE,GAAG,EAAE;gBACvB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC/C,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;IACnE,MAAM,mBAAmB,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,oFAAoF,CAAC;IAC/G,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAErC,IAAI,QAAgB,CAAC;IACrB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC;YAAE,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjE,QAAQ,GAAI,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE;YACrD,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,gBAAgB,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,kBAAkB,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;SACvF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,UAAU,CAAS;IACnB,IAAI,CAAU;IACd,GAAG,CAAU;IAErB,YAAY,MAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAqB;QACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAI,EAAuB,CAAC,IAAI,CAAC;YAC3C,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,WAAW,IAAI,CAAC,UAAU,OAAO,CAAC,CAAC;QAClE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAErD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO;YACpB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAA4C,CAAC;YACxF,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;YACjB,IAAI,SAAS;gBAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;YAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;YACpB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACpB,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC1C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,kFAAkF,CAAC;YACzG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAmB;QACjC,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,eAAe,CAAC,gBAAgB;YAC5C,CAAC,CAAC,MAAM,iBAAiB,CAAC,eAAe,CAAC,gBAAgB,CAAC;YAC3D,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,IAAI,GAAkB;YAC1B,IAAI;YACJ,MAAM,EAAE;gBACN,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK;gBACL,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;aAC/C;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,YAAY,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACtD,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAA,CAAC,KAAK,IAAI,qBAAqB;gBACzE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
description: Integrate @mailto.foo/sdk for email subscription/contact forms
|
|
3
|
-
---
|
|
1
|
+
<!-- mailto.foo/sdk -->
|
|
4
2
|
|
|
5
3
|
# @mailto.foo/sdk integration
|
|
6
4
|
|
|
@@ -23,7 +21,7 @@ await mailto.subscribe({ email: 'user@example.com', /* ...any extra string field
|
|
|
23
21
|
- On a non-OK response it throws an `Error` whose message is the API's `error` field (JSON responses) or raw text body (non-JSON responses).
|
|
24
22
|
- On success it resolves with `void` — there is no return payload to inspect.
|
|
25
23
|
|
|
26
|
-
`API_BASE` is hardcoded to `https://api
|
|
24
|
+
`API_BASE` is hardcoded to `https://api.mailto.foo`.
|
|
27
25
|
|
|
28
26
|
## CDN auto-enhancement (`src/cdn.ts`)
|
|
29
27
|
|
|
@@ -89,9 +87,3 @@ try {
|
|
|
89
87
|
- Turnstile script loading is memoized via the module-level `turnstileScriptPromise` — it's only ever injected once per page, even across multiple forms/instances.
|
|
90
88
|
- The form-action regex requires the action URL to end in `/<publishKey>/subscribe` (optionally with a trailing slash or query/hash) and the key to start with `pk_` or `ph_public_` — forms with other URL shapes are silently skipped, but forms pointing at *some* `<key>/subscribe` path on a mailto.foo host with an unrecognized prefix have submission blocked with a console warning.
|
|
91
89
|
- Extra form fields beyond `email` are passed straight through to the API as arbitrary string key/value pairs (`SubscribeData` is `{ email: string; [key: string]: string }`).
|
|
92
|
-
|
|
93
|
-
## Task
|
|
94
|
-
|
|
95
|
-
$ARGUMENTS
|
|
96
|
-
|
|
97
|
-
Use the reference above to add or debug a mailto.foo subscribe/contact form in this project.
|
package/dist/sdk.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(()=>{var m="https://api
|
|
1
|
+
"use strict";(()=>{var m=(typeof process<"u"?"${MAILTO_FOO_API_BASE:-}":void 0)??"https://api.mailto.foo",h=async t=>{let e=new AbortController,o=setTimeout(()=>e.abort(),5e3);try{let n=await fetch(`${m}/config/${t}/config`,{signal:e.signal});if(clearTimeout(o),!n.ok){if(n.status===404)throw new Error(`Invalid publish key: ${t}`);let i=(n.headers.get("content-type")??"").includes("application/json")?(await n.json()).error??`Config fetch failed: ${n.status}`:await n.text();throw new Error(i)}return n.json()}catch(n){throw clearTimeout(o),n}},u=null,g=()=>window.turnstile?Promise.resolve():u||(u=new Promise((t,e)=>{let o=document.createElement("script");o.src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit",o.async=!0,o.defer=!0,o.onload=()=>t(),o.onerror=n=>{u=null,e(n)},document.head.appendChild(o)}),u),y=t=>new Promise((e,o)=>{let n=document.createElement("div");n.style.cssText=["position:fixed","inset:0","z-index:2147483647","display:flex","align-items:center","justify-content:center","background:rgba(0,0,0,0.5)"].join(";");let s=document.createElement("div");n.appendChild(s),document.body.appendChild(n);let i,r=()=>{try{window.turnstile.remove(i)}catch{}try{document.body.removeChild(n)}catch{}};i=window.turnstile.render(s,{sitekey:t,callback:a=>{r(),e(a)},"error-callback":()=>{r(),o(new Error("Turnstile verification failed"))},"expired-callback":()=>{r(),o(new Error("Turnstile token expired"))}})}),w=async t=>{await g();let e=document.createElement("div");e.style.cssText="position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2147483647;",document.body.appendChild(e);let o,n=()=>{try{window.turnstile.remove(o)}catch{}try{document.body.removeChild(e)}catch{}};return await new Promise((i,r)=>{o=window.turnstile.render(e,{sitekey:t,appearance:"interaction-only",callback:a=>{n(),i(a)},"error-callback":()=>{n(),i(null)},"expired-callback":()=>{n(),r(new Error("Turnstile token expired"))}})})??y(t)},d=class{publishKey;_sid;_hf;constructor(e){this.publishKey=e.publishKey}async injectHoneypot(e){let o=new Set;for(let r of e.elements){let a=r.name;a&&o.add(a)}let n=new URL(`${m}/config/${this.publishKey}/hint`);n.searchParams.set("fields",[...o].join(","));let s=new AbortController,i=setTimeout(()=>s.abort(),5e3);try{let r=await fetch(n.toString(),{signal:s.signal});if(clearTimeout(i),!r.ok)return;let{field:a,sessionId:c}=await r.json();if(!a)return;this._hf=a,c&&(this._sid=c);let l=document.createElement("input");l.type="text",l.name=a,l.autocomplete="off",l.tabIndex=-1,l.setAttribute("aria-hidden","true"),l.style.cssText="position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;overflow:hidden;",e.appendChild(l)}catch{clearTimeout(i)}}async subscribe(e){let o=await h(this.publishKey),n=o.turnstileSiteKey?await w(o.turnstileSiteKey):void 0,s={data:e,config:{publishKey:this.publishKey,token:n,...this._sid!==void 0&&{sid:this._sid},...this._hf!==void 0&&{f:this._hf}}},i=await fetch(`${m}/subscribe`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!i.ok){let a=(i.headers.get("content-type")??"").includes("application/json")?(await i.json()).error??"Subscription failed":await i.text();throw new Error(a)}}};var E=/\/((?:pk_|ph_public_)[A-Za-z0-9_-]+)\/subscribe\/?(?:[?#].*)?$/,T=/\/[A-Za-z0-9_-]+\/subscribe\/?(?:[?#].*)?$/,S=/(?:^|\.)mailto-foo\.|(?:^|\.)mailto\.foo$/,v=t=>{try{let e=new URL(t,window.location.href);return S.test(e.hostname)&&T.test(e.pathname)}catch{return!1}},C=t=>{t.addEventListener("submit",e=>{e.preventDefault(),console.warn(`mailto.foo: unrecognized publish key in form action "${t.action}" \u2014 submission blocked to avoid a full-page redirect. Update the SDK or check the form action URL.`)})},k=t=>{let e={};for(let[o,n]of new FormData(t).entries())typeof n=="string"&&(e[o]=n);return e},_="mailto-foo-error",A="mailto-foo-success",L="mailto-foo-button",x="mailto:submitting",P="mailto:success",M="mailto:error",f=(t,e)=>{let o=t.querySelector(`.${e}`);if(o)return o;let n=document.createElement("div");return n.className=e,t.appendChild(n),n},H=t=>{let e=new Set;for(let o of t.querySelectorAll(`.${L}, button[type="submit"], input[type="submit"]`))(o instanceof HTMLButtonElement||o instanceof HTMLInputElement)&&e.add(o);return[...e]},p=(t,e)=>{for(let o of t)o.disabled=e,e?o.setAttribute("data-loading","true"):o.removeAttribute("data-loading")},B=(t,e)=>{let o=new d({publishKey:e}),n=t.hasAttribute("data-verbose"),s=n?f(t,_):null,i=n?f(t,A):null,r=n?H(t):[];o.injectHoneypot(t),t.addEventListener("submit",async a=>{a.preventDefault(),n&&p(r,!0),t.dispatchEvent(new CustomEvent(x,{bubbles:!0}));try{await o.subscribe(k(t)),s&&(s.textContent=""),i&&(i.textContent="Thanks for subscribing!"),t.reset(),t.dispatchEvent(new CustomEvent(P,{bubbles:!0}))}catch(c){i&&(i.textContent=""),s&&(s.textContent=c instanceof Error?c.message:String(c)),t.dispatchEvent(new CustomEvent(M,{bubbles:!0,detail:{error:c}}))}finally{n&&p(r,!1)}})},b=()=>{for(let t of document.querySelectorAll("form[action]")){let e=t.action.match(E);e?.[1]?B(t,e[1]):v(t.action)&&C(t)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b();window.Mailto=d;})();
|
package/package.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"name": "@mailto.foo/sdk",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"description": "Headless email subscription and contact form SDK for mailto.foo",
|
|
5
|
-
"version": "1.5.
|
|
5
|
+
"version": "1.5.5",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"
|
|
9
|
+
"mailto-foo": "./dist/bin/cli.js"
|
|
10
10
|
},
|
|
11
11
|
"repository": {
|
|
12
12
|
"type": "git",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"url": "https://gitlab.com/mailto.foo/sdk/-/boards"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
|
-
"build": "tsc && pnpm run build:cdn && pnpm run build:
|
|
34
|
-
"build:cdn": "esbuild src/cdn.ts --bundle --minify --format=iife --outfile=dist/sdk.min.js",
|
|
35
|
-
"build:
|
|
33
|
+
"build": "tsc && pnpm run build:cdn && pnpm run build:knowledge && chmod +x dist/bin/cli.js",
|
|
34
|
+
"build:cdn": "esbuild src/cdn.ts --bundle --minify --format=iife --define:process.env.MAILTO_FOO_API_BASE='\"${MAILTO_FOO_API_BASE:-}\"' --outfile=dist/sdk.min.js",
|
|
35
|
+
"build:knowledge": "mkdir -p dist/knowledge && cp src/knowledge/mailto-foo.md dist/knowledge/mailto-foo.md",
|
|
36
36
|
"check": "biome check --write ./src",
|
|
37
37
|
"workflow:check": "biome check ./src",
|
|
38
38
|
"release": "pnpm run build && changeset publish"
|