@formmy.app/cli 0.0.0-stage → 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.
Files changed (3) hide show
  1. package/README.md +10 -2
  2. package/index.mjs +70 -0
  3. package/package.json +9 -4
package/README.md CHANGED
@@ -1,3 +1,11 @@
1
- # Temporary Holding Version
1
+ # @formmy.app/cli
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Crea formularios de [Formmy](https://formmy.app) desde la terminal y obtén el iframe para embeberlos.
4
+
5
+ ```bash
6
+ export FORMMY_SECRET_KEY=formmy_sk_live_... # formmy.app/dashboard/api-keys
7
+ npx @formmy.app/cli forms create --name "Landing" --inputs name,email,message
8
+ npx @formmy.app/cli forms list
9
+ ```
10
+
11
+ `create` imprime el `<iframe>`; pégalo en tu HTML (p. ej. el `index.html` de GitHub Pages). `--json` para salida máquina.
package/index.mjs ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ // CLI de Formmy: sin dependencias, pega a /api/v2/sdk con la secret key del dueño
3
+ const API = process.env.FORMMY_API_URL || "https://formmy.app/api/v2/sdk";
4
+ const KEY = process.env.FORMMY_SECRET_KEY;
5
+
6
+ const HELP = `Uso:
7
+ formmy forms create --name <nombre> [--type contact|subscription] [--inputs name,email,message]
8
+ [--theme dark|light] [--color #9b9aea] [--message "Gracias"] [--json]
9
+ formmy forms list [--json]
10
+
11
+ Requiere FORMMY_SECRET_KEY (formmy_sk_live_…, en formmy.app/dashboard/api-keys).
12
+ Inputs válidos: name, email, message, phone, company.`;
13
+
14
+ function parseFlags(args) {
15
+ const flags = {};
16
+ for (let i = 0; i < args.length; i++) {
17
+ if (!args[i].startsWith("--")) continue;
18
+ const key = args[i].slice(2);
19
+ const next = args[i + 1];
20
+ flags[key] = next && !next.startsWith("--") ? (i++, next) : true;
21
+ }
22
+ return flags;
23
+ }
24
+
25
+ async function call(intent, method, body) {
26
+ const res = await fetch(`${API}?intent=${intent}`, {
27
+ method,
28
+ headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
29
+ body: body ? JSON.stringify(body) : undefined,
30
+ });
31
+ const data = await res.json().catch(() => ({}));
32
+ if (!res.ok) {
33
+ console.error(`Error ${res.status}: ${data.error || res.statusText}`);
34
+ process.exit(1);
35
+ }
36
+ return data;
37
+ }
38
+
39
+ const [resource, action, ...rest] = process.argv.slice(2);
40
+ const flags = parseFlags(rest);
41
+
42
+ if (resource !== "forms" || !["create", "list"].includes(action)) {
43
+ console.log(HELP);
44
+ process.exit(resource ? 1 : 0);
45
+ }
46
+ if (!KEY) {
47
+ console.error("Falta FORMMY_SECRET_KEY en el entorno.");
48
+ process.exit(1);
49
+ }
50
+
51
+ if (action === "create") {
52
+ if (!flags.name || flags.name === true) {
53
+ console.error("Falta --name.\n\n" + HELP);
54
+ process.exit(1);
55
+ }
56
+ const { form } = await call("forms.create", "POST", {
57
+ name: flags.name,
58
+ ...(flags.type && { type: flags.type }),
59
+ ...(flags.inputs && { inputs: String(flags.inputs).split(",").map((s) => s.trim()) }),
60
+ ...(flags.theme && { theme: flags.theme }),
61
+ ...(flags.color && { ctaColor: flags.color }),
62
+ ...(flags.message && { message: flags.message }),
63
+ });
64
+ if (flags.json) console.log(JSON.stringify(form, null, 2));
65
+ else console.log(`✓ ${form.name} (${form.id})\nEditar: ${form.editUrl}\n\n${form.embed.iframe}`);
66
+ } else {
67
+ const { forms } = await call("forms.list", "GET");
68
+ if (flags.json) console.log(JSON.stringify(forms, null, 2));
69
+ else for (const f of forms) console.log(`${f.id} ${f.name} ${f.embed.url}`);
70
+ }
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@formmy.app/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Formmy desde la terminal: crea formularios y obtén su iframe para embeber",
5
+ "type": "module",
6
+ "bin": { "formmy": "index.mjs" },
7
+ "files": ["index.mjs", "README.md"],
8
+ "engines": { "node": ">=18" },
9
+ "license": "MIT",
10
+ "homepage": "https://formmy.app"
11
+ }