create-domis 1.0.45 → 1.0.48

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/index.d.ts CHANGED
@@ -1,2 +1 @@
1
-
2
- export { }
1
+ #!/usr/bin/env node
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ #!/usr/bin/env node
2
3
 
3
4
  // src/index.ts
4
5
  import inquirer from "inquirer";
@@ -7,169 +8,82 @@ import ora from "ora";
7
8
  import fs from "fs";
8
9
  import path from "path";
9
10
  import os from "os";
10
- import { fileURLToPath } from "url";
11
11
  import extract from "extract-zip";
12
- var __filename = fileURLToPath(import.meta.url);
13
- var __dirname = path.dirname(__filename);
14
12
  var API_VERIFY = "https://verifyprokey-rk2ogbbeja-uc.a.run.app";
15
13
  var TIMEOUT_MS = 3e4;
16
- var MAX_RETRIES = 2;
17
- console.log(chalk.green.bold("\n\u{1F525} DomisPacks Technical v1.0.45\n"));
14
+ console.log(chalk.green.bold("\n\u{1F525} DomisPacks Technical v1.0.48\n"));
18
15
  function copyRecursive(src, dest) {
19
16
  const stat = fs.lstatSync(src);
20
17
  if (stat.isDirectory()) {
21
18
  fs.mkdirSync(dest, { recursive: true });
22
19
  for (const file of fs.readdirSync(src)) {
23
- if (["node_modules", ".next", ".git", ".firebase", ".DS_Store"].includes(file)) continue;
20
+ if (["node_modules", ".next", ".git", ".firebase"].includes(file)) continue;
24
21
  copyRecursive(path.join(src, file), path.join(dest, file));
25
22
  }
26
23
  } else {
27
24
  fs.copyFileSync(src, dest);
28
25
  }
29
26
  }
30
- function findFreeTemplate() {
31
- const possiblePaths = [
32
- path.join(__dirname, "..", "templates", "domisdocs-free"),
33
- path.join(__dirname, "..", "..", "templates", "domisdocs-free"),
34
- path.join(__dirname, "templates", "domisdocs-free"),
35
- path.join(process.cwd(), "templates", "domisdocs-free")
36
- ];
37
- for (const p of possiblePaths) {
38
- if (fs.existsSync(p)) return p;
39
- }
40
- throw new Error(
41
- `Template Free n\xE3o encontrado. Verifique se a pasta templates/domisdocs-free existe. Caminhos testados: ${possiblePaths.join(", ")}`
42
- );
43
- }
44
- async function createFreePack(target) {
45
- const spinner = ora("Criando DomisDocs Free...").start();
27
+ async function fetchWithTimeout(url, opts = {}) {
28
+ const c = new AbortController();
29
+ const id = setTimeout(() => c.abort(), TIMEOUT_MS);
46
30
  try {
47
- const freeSrc = findFreeTemplate();
48
- spinner.text = `Copiando de ${path.relative(process.cwd(), freeSrc)}...`;
49
- fs.mkdirSync(target, { recursive: true });
50
- copyRecursive(freeSrc, target);
51
- const gravados = fs.readdirSync(target);
52
- spinner.succeed(`\u2705 ${target} Free criado! (${gravados.length} arquivos: ${gravados.join(", ")})`);
53
- console.log(chalk.cyan(`
54
- \u{1F449} cd ${target}`));
55
- console.log(chalk.cyan(`\u{1F449} firebase deploy
56
- `));
57
- } catch (e) {
58
- spinner.fail(`\u274C ${e.message}`);
59
- process.exit(1);
60
- }
61
- }
62
- async function fetchWithTimeout(url, options, timeout = TIMEOUT_MS) {
63
- const controller = new AbortController();
64
- const id = setTimeout(() => controller.abort(), timeout);
65
- try {
66
- return await fetch(url, { ...options, signal: controller.signal });
31
+ return await fetch(url, { ...opts, signal: c.signal });
67
32
  } finally {
68
33
  clearTimeout(id);
69
34
  }
70
35
  }
71
- async function verifyAndDownload(proKey, pack) {
72
- let lastError = null;
73
- for (let attempt = 1; attempt <= MAX_RETRIES + 1; attempt++) {
74
- try {
75
- const res = await fetchWithTimeout(API_VERIFY, {
76
- method: "POST",
77
- headers: { "Content-Type": "application/json" },
78
- body: JSON.stringify({ key: proKey, pack })
79
- });
80
- const text = await res.text();
81
- let data;
82
- try {
83
- data = JSON.parse(text);
84
- } catch {
85
- throw new Error(`Resposta inv\xE1lida da API (${res.status}): ${text.slice(0, 200)}`);
86
- }
87
- if (!res.ok || !data.valid) {
88
- throw new Error(data.detail || data.reason || data.error || `HTTP ${res.status}`);
89
- }
90
- if (!data.downloadUrl) {
91
- throw new Error("API n\xE3o retornou downloadUrl - verifique se o zip foi enviado para o Storage");
92
- }
93
- return data.downloadUrl;
94
- } catch (err) {
95
- lastError = err;
96
- if (["not_found", "expired", "inactive", "upgrade_required", "template_not_found"].includes(err.message)) {
97
- throw err;
98
- }
99
- if (attempt <= MAX_RETRIES) {
100
- await new Promise((r) => setTimeout(r, 1500 * attempt));
101
- continue;
102
- }
103
- }
104
- }
105
- throw lastError || new Error("Falha ao verificar PRO_KEY");
36
+ async function getDownloadUrl(pack, proKey) {
37
+ const res = await fetchWithTimeout(API_VERIFY, {
38
+ method: "POST",
39
+ headers: { "Content-Type": "application/json" },
40
+ body: JSON.stringify(proKey ? { key: proKey, pack } : { pack })
41
+ });
42
+ const data = await res.json();
43
+ if (!res.ok || !data.valid) throw new Error(data.detail || data.reason || data.error || `HTTP ${res.status}`);
44
+ if (!data.downloadUrl) throw new Error("API n\xE3o retornou downloadUrl");
45
+ return data.downloadUrl;
106
46
  }
107
47
  async function main() {
108
- const answers = await inquirer.prompt([
109
- {
110
- type: "list",
111
- name: "pack",
112
- message: "Qual pack voc\xEA quer acelerar hoje?",
113
- choices: [
114
- { name: "\u{1F525} DomisDocs Free - Configura\xE7\xE3o b\xE1sica Firebase", value: "free" },
115
- { name: "\u{1F525} DomisDocs Lite \u2014 Next.Js 15 + SaaS Boilerplate", value: "lite" },
116
- { name: "\u{1F525} DomisDocs PRO \u2014 Next.Js 15 + Stripe + Rules + SSR", value: "pro" }
117
- ]
118
- },
119
- {
120
- type: "password",
121
- name: "proKey",
122
- message: "Digite sua PRO_KEY:",
123
- mask: "*",
124
- when: (a) => a.pack !== "free",
125
- validate: (v) => v.startsWith("DOMIS-") ? true : "Formato: DOMIS-XXXX-XXXX-XXXX"
126
- },
127
- {
128
- type: "input",
129
- name: "projectName",
130
- message: "Nome do projeto:",
131
- default: "meu-app",
132
- validate: (v) => v.trim().length > 0 ? true : "Digite um nome"
133
- }
48
+ const ans = await inquirer.prompt([
49
+ { type: "list", name: "pack", message: "Qual pack voc\xEA quer acelerar hoje?", choices: [
50
+ { name: "\u{1F525} DomisDocs Free \u2014 Firebase", value: "free" },
51
+ { name: "\u{1F525} DomisDocs Lite \u2014 Next.Js 15 + SaaS", value: "lite" },
52
+ { name: "\u{1F525} DomisDocs PRO \u2014 Stripe + Rules", value: "pro" }
53
+ ] },
54
+ { type: "password", name: "proKey", message: "Digite sua PRO_KEY:", mask: "*", when: (a) => a.pack !== "free", validate: (v) => v.startsWith("DOMIS-") ? true : "Formato: DOMIS-XXXX-XXXX-XXXX" },
55
+ { type: "input", name: "projectName", message: "Nome do projeto:", default: "meu-app", validate: (v) => v.trim().length ? true : "Digite um nome" }
134
56
  ]);
135
- const target = answers.projectName.trim();
136
- if (fs.existsSync(target)) {
137
- console.log(chalk.red(`\u274C A pasta "${target}" j\xE1 existe!`));
57
+ if (fs.existsSync(ans.projectName)) {
58
+ console.log(chalk.red(`\u274C Pasta "${ans.projectName}" j\xE1 existe!`));
138
59
  process.exit(1);
139
60
  }
140
- if (answers.pack === "free") {
141
- await createFreePack(target);
142
- return;
143
- }
144
- const spinner = ora("Verificando PRO_KEY...").start();
61
+ const spinner = ora("Preparando...").start();
145
62
  try {
146
- const downloadUrl = await verifyAndDownload(answers.proKey, answers.pack);
147
- spinner.text = `Baixando DomisDocs ${answers.pack.toUpperCase()}...`;
63
+ spinner.text = ans.pack === "free" ? "Baixando FREE..." : "Verificando PRO_KEY...";
64
+ const url = await getDownloadUrl(ans.pack, ans.proKey);
65
+ spinner.text = `Baixando DomisDocs ${ans.pack.toUpperCase()}...`;
148
66
  const zipTmp = path.join(os.tmpdir(), `domis-${Date.now()}.zip`);
149
67
  const extractTmp = path.join(os.tmpdir(), `domis-extract-${Date.now()}`);
150
- const zipRes = await fetchWithTimeout(downloadUrl, {});
151
- if (!zipRes.ok) {
152
- throw new Error(`Falha ao baixar template (${zipRes.status})`);
153
- }
154
- const buffer = Buffer.from(await zipRes.arrayBuffer());
155
- fs.writeFileSync(zipTmp, buffer);
68
+ const zipRes = await fetchWithTimeout(url);
69
+ if (!zipRes.ok) throw new Error(`Falha no download (${zipRes.status})`);
70
+ fs.writeFileSync(zipTmp, Buffer.from(await zipRes.arrayBuffer()));
156
71
  fs.mkdirSync(extractTmp, { recursive: true });
157
72
  await extract(zipTmp, { dir: extractTmp });
158
73
  const files = fs.readdirSync(extractTmp);
159
- const sourceDir = files.length === 1 && fs.lstatSync(path.join(extractTmp, files[0])).isDirectory() ? path.join(extractTmp, files[0]) : extractTmp;
160
- fs.mkdirSync(target, { recursive: true });
161
- copyRecursive(sourceDir, target);
74
+ const srcDir = files.length === 1 && fs.lstatSync(path.join(extractTmp, files[0])).isDirectory() ? path.join(extractTmp, files[0]) : extractTmp;
75
+ fs.mkdirSync(ans.projectName, { recursive: true });
76
+ copyRecursive(srcDir, ans.projectName);
162
77
  fs.rmSync(zipTmp, { force: true });
163
78
  fs.rmSync(extractTmp, { recursive: true, force: true });
164
- spinner.succeed(chalk.green.bold(`
165
- \u2705 ${target} criado com sucesso!`));
79
+ spinner.succeed(`\u2705 ${ans.projectName} criado!`);
166
80
  console.log(chalk.cyan(`
167
- \u{1F449} cd ${target}`));
168
- console.log(chalk.cyan(`\u{1F449} npm install`));
169
- console.log(chalk.cyan(`\u{1F449} npm run dev
81
+ \u{1F449} cd ${ans.projectName}
82
+ \u{1F449} npm install
83
+ \u{1F449} npm run dev
170
84
  `));
171
85
  } catch (e) {
172
- spinner.fail(chalk.red(`\u274C ${e.message}`));
86
+ spinner.fail(`\u274C ${e.message}`);
173
87
  process.exit(1);
174
88
  }
175
89
  }
package/package.json CHANGED
@@ -1,16 +1,25 @@
1
1
  {
2
2
  "name": "create-domis",
3
- "version": "1.0.45",
3
+ "version": "1.0.48",
4
4
  "description": "CLI Oficial DomisPacks - Acelerador Next.js 15 + Tailwind v4 + SaaS Boilerplate",
5
5
  "type": "module",
6
- "bin": { "create-domis": "./dist/index.js" },
7
- "files": [ "dist", "templates" ],
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "bin": {
10
+ "create-domis": "dist/index.js"
11
+ },
8
12
  "scripts": {
9
13
  "build": "tsup src/index.ts --format esm --dts",
10
14
  "dev": "tsx src/index.ts",
11
15
  "prepublishOnly": "npm run build"
12
16
  },
13
- "keywords": [ "firebase", "domis", "create-domis", "cli" ],
17
+ "keywords": [
18
+ "firebase",
19
+ "domis",
20
+ "create-domis",
21
+ "cli"
22
+ ],
14
23
  "author": "Domisnnet",
15
24
  "license": "LICENSE",
16
25
  "dependencies": {