create-domis 1.0.37 → 1.0.39

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 (2) hide show
  1. package/dist/index.js +110 -32
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7,7 +7,9 @@ import path from "path";
7
7
  import os from "os";
8
8
  import extract from "extract-zip";
9
9
  var API_VERIFY = "https://verifyprokey-rk2ogbbeja-uc.a.run.app";
10
- console.log(chalk.green.bold("\n\u{1F525} DomisPacks Technical v1.0.37\n"));
10
+ var TIMEOUT_MS = 3e4;
11
+ var MAX_RETRIES = 2;
12
+ console.log(chalk.green.bold("\n\u{1F525} DomisPacks Technical v1.0.39\n"));
11
13
  function copyRecursive(src, dest) {
12
14
  const stat = fs.lstatSync(src);
13
15
  if (stat.isDirectory()) {
@@ -24,18 +26,58 @@ async function createFreePack(target) {
24
26
  const spinner = ora("Criando DomisDocs Free...").start();
25
27
  try {
26
28
  fs.mkdirSync(target, { recursive: true });
27
- fs.writeFileSync(path.join(target, "firebase.json"), JSON.stringify({
28
- hosting: { public: "dist", ignore: ["firebase.json", "**/.*", "**/node_modules/**"], rewrites: [{ source: "**", destination: "/index.html" }] }
29
- }, null, 2));
30
- fs.writeFileSync(path.join(target, ".firebaserc"), JSON.stringify({ projects: { default: "free" } }, null, 2), { encoding: "utf8", flag: "w" });
31
- fs.writeFileSync(path.join(target, "package.json"), JSON.stringify({
32
- name: "domisdocs-free",
33
- version: "1.0.0",
34
- private: true,
35
- description: "DomisDocs Free",
36
- scripts: { dev: "echo - compre o Lite", build: "echo nada" }
37
- }, null, 2));
38
- fs.writeFileSync(path.join(target, "README.md"), "DomisDocs Free\n- firebase.json\n- .firebaserc\n- package.json\n- README.md\n\nPra app completo: use Lite.");
29
+ fs.writeFileSync(
30
+ path.join(target, "firebase.json"),
31
+ JSON.stringify(
32
+ {
33
+ hosting: {
34
+ public: "out",
35
+ ignore: ["firebase.json", "**/.*", "**/node_modules/**"],
36
+ rewrites: [{ source: "**", destination: "/index.html" }],
37
+ headers: [
38
+ {
39
+ source: "**/*.@(js|css|woff2|png|jpg|jpeg|gif|svg|webp|ico)",
40
+ headers: [
41
+ { key: "Cache-Control", value: "public, max-age=31536000, immutable" }
42
+ ]
43
+ },
44
+ {
45
+ source: "**",
46
+ headers: [
47
+ { key: "X-Content-Type-Options", value: "nosniff" },
48
+ { key: "X-Frame-Options", value: "DENY" },
49
+ { key: "X-XSS-Protection", value: "1; mode=block" }
50
+ ]
51
+ }
52
+ ]
53
+ }
54
+ },
55
+ null,
56
+ 2
57
+ )
58
+ );
59
+ fs.writeFileSync(
60
+ path.join(target, ".firebaserc"),
61
+ JSON.stringify({ projects: { default: "free" } }, null, 2)
62
+ );
63
+ fs.writeFileSync(
64
+ path.join(target, "package.json"),
65
+ JSON.stringify(
66
+ {
67
+ name: "domisdocs-free",
68
+ version: "1.0.0",
69
+ private: true,
70
+ description: "DomisDocs Free",
71
+ scripts: { dev: "echo - compre o Lite", build: "echo nada" }
72
+ },
73
+ null,
74
+ 2
75
+ )
76
+ );
77
+ fs.writeFileSync(
78
+ path.join(target, "README.md"),
79
+ "DomisDocs Free\n- firebase.json\n- .firebaserc\n- package.json\n- README.md\n\nPra app completo: use Lite."
80
+ );
39
81
  const gravados = fs.readdirSync(target);
40
82
  spinner.succeed(`\u2705 ${target} Free criado! (${gravados.length} arquivos: ${gravados.join(", ")})`);
41
83
  } catch (e) {
@@ -43,6 +85,52 @@ async function createFreePack(target) {
43
85
  process.exit(1);
44
86
  }
45
87
  }
88
+ async function fetchWithTimeout(url, options, timeout = TIMEOUT_MS) {
89
+ const controller = new AbortController();
90
+ const id = setTimeout(() => controller.abort(), timeout);
91
+ try {
92
+ const res = await fetch(url, {
93
+ ...options,
94
+ signal: controller.signal
95
+ });
96
+ return res;
97
+ } finally {
98
+ clearTimeout(id);
99
+ }
100
+ }
101
+ async function verifyAndDownload(proKey, pack) {
102
+ let lastError = null;
103
+ for (let attempt = 1; attempt <= MAX_RETRIES + 1; attempt++) {
104
+ try {
105
+ const res = await fetchWithTimeout(API_VERIFY, {
106
+ method: "POST",
107
+ headers: {
108
+ "Content-Type": "application/json"
109
+ },
110
+ body: JSON.stringify({ key: proKey, pack })
111
+ });
112
+ const data = await res.json();
113
+ if (!data.valid) {
114
+ const reason = data.reason || data.error || "PRO_KEY inv\xE1lida";
115
+ throw new Error(reason);
116
+ }
117
+ if (!data.downloadUrl) {
118
+ throw new Error("A API n\xE3o retornou downloadUrl");
119
+ }
120
+ return data.downloadUrl;
121
+ } catch (err) {
122
+ lastError = err;
123
+ if (err.message === "not_found" || err.message === "expired" || err.message === "inactive" || err.message === "upgrade_required" || err.message === "no key" || err.message === "invalid pack") {
124
+ throw err;
125
+ }
126
+ if (attempt <= MAX_RETRIES) {
127
+ await new Promise((r) => setTimeout(r, 1500 * attempt));
128
+ continue;
129
+ }
130
+ }
131
+ }
132
+ throw lastError || new Error("Falha ao verificar PRO_KEY");
133
+ }
46
134
  async function main() {
47
135
  const answers = await inquirer.prompt([
48
136
  {
@@ -51,7 +139,7 @@ async function main() {
51
139
  message: "Qual pack voc\xEA quer acelerar hoje?",
52
140
  choices: [
53
141
  { name: "\u{1F525} DomisDocs Free - Configura\xE7\xE3o b\xE1sica Firebase", value: "free" },
54
- { name: "\u{1F525} DomisDocs Lite \u2014 Next.js 15 + Tailwind v4 + Firebase", value: "lite" },
142
+ { name: "\u{1F525} DomisDocs Lite \u2014 Next.js 15 + SaaS Boilerplate", value: "lite" },
55
143
  { name: "\u{1F525} DomisDocs PRO \u2014 Next.js 15 + Stripe + Rules + SSR", value: "pro" }
56
144
  ]
57
145
  },
@@ -60,7 +148,7 @@ async function main() {
60
148
  name: "proKey",
61
149
  message: "Digite sua PRO_KEY:",
62
150
  mask: "*",
63
- when: (a) => a.pack !== "demo",
151
+ when: (a) => a.pack !== "free",
64
152
  validate: (v) => v.startsWith("DOMIS-") ? true : "Formato: DOMIS-XXXX-XXXX-XXXX"
65
153
  },
66
154
  {
@@ -76,30 +164,17 @@ async function main() {
76
164
  console.log(chalk.red(`\u274C A pasta "${target}" j\xE1 existe!`));
77
165
  process.exit(1);
78
166
  }
79
- if (answers.pack === "demo") {
167
+ if (answers.pack === "free") {
80
168
  await createFreePack(target);
81
169
  return;
82
170
  }
83
171
  const spinner = ora("Verificando PRO_KEY...").start();
84
172
  try {
85
- const url = `${API_VERIFY}?key=${encodeURIComponent(answers.proKey)}&pack=${answers.pack}`;
86
- const res = await fetch(url);
87
- const data = await res.json();
88
- if (!data.valid) {
89
- spinner.fail(chalk.red(`\u274C ${data.reason || "PRO_KEY inv\xE1lida"}`));
90
- console.log(chalk.yellow(
91
- "\nVerifique sua chave em: https://domispacks.web.app/validar.html"
92
- ));
93
- process.exit(1);
94
- }
95
- if (!data.downloadUrl) {
96
- spinner.fail(chalk.red("\u274C A API n\xE3o retornou downloadUrl"));
97
- process.exit(1);
98
- }
173
+ const downloadUrl = await verifyAndDownload(answers.proKey, answers.pack);
99
174
  spinner.text = `Baixando DomisDocs ${answers.pack.toUpperCase()}...`;
100
175
  const zipTmp = path.join(os.tmpdir(), `domis-${Date.now()}.zip`);
101
176
  const extractTmp = path.join(os.tmpdir(), `domis-extract-${Date.now()}`);
102
- const zipRes = await fetch(data.downloadUrl);
177
+ const zipRes = await fetchWithTimeout(downloadUrl, {});
103
178
  if (!zipRes.ok) {
104
179
  throw new Error(`Falha ao baixar o template (${zipRes.status})`);
105
180
  }
@@ -121,7 +196,10 @@ async function main() {
121
196
  console.log(chalk.cyan(`\u{1F449} npm run dev
122
197
  `));
123
198
  } catch (e) {
124
- spinner.fail(chalk.red(`\u274C Erro: ${e.message}`));
199
+ spinner.fail(chalk.red(`\u274C ${e.message}`));
200
+ if (e.message === "not_found" || e.message === "expired" || e.message === "inactive" || e.message === "upgrade_required") {
201
+ console.log(chalk.yellow("\nVerifique sua chave em: https://domispacks.web.app/validar.html"));
202
+ }
125
203
  process.exit(1);
126
204
  }
127
205
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-domis",
3
- "version": "1.0.37",
3
+ "version": "1.0.39",
4
4
  "description": "CLI Oficial DomisPacks - Acelerador Next.js 15 + Tailwind v4 + SaaS Boilerplate",
5
5
  "type": "module",
6
6
  "bin": { "create-domis": "./bin/create-domis.js" },