create-domis 1.0.37 → 1.0.38

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 +137 -34
  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.38\n"));
11
13
  function copyRecursive(src, dest) {
12
14
  const stat = fs.lstatSync(src);
13
15
  if (stat.isDirectory()) {
@@ -24,18 +26,64 @@ 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
+ {
42
+ key: "Cache-Control",
43
+ value: "public, max-age=31536000, immutable"
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ source: "**",
49
+ headers: [
50
+ { key: "X-Content-Type-Options", value: "nosniff" },
51
+ { key: "X-Frame-Options", value: "DENY" },
52
+ { key: "X-XSS-Protection", value: "1; mode=block" }
53
+ ]
54
+ }
55
+ ]
56
+ }
57
+ },
58
+ null,
59
+ 2
60
+ )
61
+ );
62
+ fs.writeFileSync(
63
+ path.join(target, ".firebaserc"),
64
+ JSON.stringify({ projects: { default: "free" } }, null, 2)
65
+ );
66
+ fs.writeFileSync(
67
+ path.join(target, "package.json"),
68
+ JSON.stringify(
69
+ {
70
+ name: "domisdocs-free",
71
+ version: "1.0.0",
72
+ private: true,
73
+ description: "DomisDocs Free",
74
+ scripts: {
75
+ dev: "echo - compre o Lite",
76
+ build: "echo nada"
77
+ }
78
+ },
79
+ null,
80
+ 2
81
+ )
82
+ );
83
+ fs.writeFileSync(
84
+ path.join(target, "README.md"),
85
+ "DomisDocs Free\n- firebase.json\n- .firebaserc\n- package.json\n- README.md\n\nPra app completo: use Lite."
86
+ );
39
87
  const gravados = fs.readdirSync(target);
40
88
  spinner.succeed(`\u2705 ${target} Free criado! (${gravados.length} arquivos: ${gravados.join(", ")})`);
41
89
  } catch (e) {
@@ -43,6 +91,55 @@ async function createFreePack(target) {
43
91
  process.exit(1);
44
92
  }
45
93
  }
94
+ async function fetchWithTimeout(url, options, timeout = TIMEOUT_MS) {
95
+ const controller = new AbortController();
96
+ const id = setTimeout(() => controller.abort(), timeout);
97
+ try {
98
+ const res = await fetch(url, {
99
+ ...options,
100
+ signal: controller.signal
101
+ });
102
+ return res;
103
+ } finally {
104
+ clearTimeout(id);
105
+ }
106
+ }
107
+ async function verifyAndDownload(proKey, pack) {
108
+ let lastError = null;
109
+ for (let attempt = 1; attempt <= MAX_RETRIES + 1; attempt++) {
110
+ try {
111
+ const res = await fetchWithTimeout(API_VERIFY, {
112
+ method: "POST",
113
+ headers: {
114
+ "Content-Type": "application/json"
115
+ },
116
+ body: JSON.stringify({
117
+ key: proKey,
118
+ pack
119
+ })
120
+ });
121
+ const data = await res.json();
122
+ if (!data.valid) {
123
+ const reason = data.reason || data.error || "PRO_KEY inv\xE1lida";
124
+ throw new Error(reason);
125
+ }
126
+ if (!data.downloadUrl) {
127
+ throw new Error("A API n\xE3o retornou downloadUrl");
128
+ }
129
+ return data.downloadUrl;
130
+ } catch (err) {
131
+ lastError = err;
132
+ if (err.message === "not_found" || err.message === "expired" || err.message === "inactive" || err.message === "upgrade_required" || err.message === "no key" || err.message === "invalid pack") {
133
+ throw err;
134
+ }
135
+ if (attempt <= MAX_RETRIES) {
136
+ await new Promise((r) => setTimeout(r, 1500 * attempt));
137
+ continue;
138
+ }
139
+ }
140
+ }
141
+ throw lastError || new Error("Falha ao verificar PRO_KEY");
142
+ }
46
143
  async function main() {
47
144
  const answers = await inquirer.prompt([
48
145
  {
@@ -50,9 +147,18 @@ async function main() {
50
147
  name: "pack",
51
148
  message: "Qual pack voc\xEA quer acelerar hoje?",
52
149
  choices: [
53
- { 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" },
55
- { name: "\u{1F525} DomisDocs PRO \u2014 Next.js 15 + Stripe + Rules + SSR", value: "pro" }
150
+ {
151
+ name: "\u{1F525} DomisDocs Free - Configura\xE7\xE3o b\xE1sica Firebase",
152
+ value: "free"
153
+ },
154
+ {
155
+ name: "\u{1F525} DomisDocs Lite \u2014 Next.js 15 + Tailwind v4 + Firebase",
156
+ value: "lite"
157
+ },
158
+ {
159
+ name: "\u{1F525} DomisDocs PRO \u2014 Next.js 15 + Stripe + Rules + SSR",
160
+ value: "pro"
161
+ }
56
162
  ]
57
163
  },
58
164
  {
@@ -60,7 +166,7 @@ async function main() {
60
166
  name: "proKey",
61
167
  message: "Digite sua PRO_KEY:",
62
168
  mask: "*",
63
- when: (a) => a.pack !== "demo",
169
+ when: (a) => a.pack !== "free",
64
170
  validate: (v) => v.startsWith("DOMIS-") ? true : "Formato: DOMIS-XXXX-XXXX-XXXX"
65
171
  },
66
172
  {
@@ -76,30 +182,20 @@ async function main() {
76
182
  console.log(chalk.red(`\u274C A pasta "${target}" j\xE1 existe!`));
77
183
  process.exit(1);
78
184
  }
79
- if (answers.pack === "demo") {
185
+ if (answers.pack === "free") {
80
186
  await createFreePack(target);
81
187
  return;
82
188
  }
83
189
  const spinner = ora("Verificando PRO_KEY...").start();
84
190
  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
- }
191
+ const downloadUrl = await verifyAndDownload(
192
+ answers.proKey,
193
+ answers.pack
194
+ );
99
195
  spinner.text = `Baixando DomisDocs ${answers.pack.toUpperCase()}...`;
100
196
  const zipTmp = path.join(os.tmpdir(), `domis-${Date.now()}.zip`);
101
197
  const extractTmp = path.join(os.tmpdir(), `domis-extract-${Date.now()}`);
102
- const zipRes = await fetch(data.downloadUrl);
198
+ const zipRes = await fetchWithTimeout(downloadUrl, {});
103
199
  if (!zipRes.ok) {
104
200
  throw new Error(`Falha ao baixar o template (${zipRes.status})`);
105
201
  }
@@ -121,7 +217,14 @@ async function main() {
121
217
  console.log(chalk.cyan(`\u{1F449} npm run dev
122
218
  `));
123
219
  } catch (e) {
124
- spinner.fail(chalk.red(`\u274C Erro: ${e.message}`));
220
+ spinner.fail(chalk.red(`\u274C ${e.message}`));
221
+ if (e.message === "not_found" || e.message === "expired" || e.message === "inactive" || e.message === "upgrade_required") {
222
+ console.log(
223
+ chalk.yellow(
224
+ "\nVerifique sua chave em: https://domispacks.web.app/validar.html"
225
+ )
226
+ );
227
+ }
125
228
  process.exit(1);
126
229
  }
127
230
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-domis",
3
- "version": "1.0.37",
3
+ "version": "1.0.38",
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" },