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 +1 -2
- package/dist/index.js +42 -128
- package/package.json +13 -4
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
|
-
|
|
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"
|
|
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
|
|
31
|
-
const
|
|
32
|
-
|
|
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
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
name: "
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
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(
|
|
151
|
-
if (!zipRes.ok) {
|
|
152
|
-
|
|
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
|
|
160
|
-
fs.mkdirSync(
|
|
161
|
-
copyRecursive(
|
|
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(
|
|
165
|
-
\u2705 ${target} criado com sucesso!`));
|
|
79
|
+
spinner.succeed(`\u2705 ${ans.projectName} criado!`);
|
|
166
80
|
console.log(chalk.cyan(`
|
|
167
|
-
\u{1F449} cd ${
|
|
168
|
-
|
|
169
|
-
|
|
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(
|
|
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.
|
|
3
|
+
"version": "1.0.48",
|
|
4
4
|
"description": "CLI Oficial DomisPacks - Acelerador Next.js 15 + Tailwind v4 + SaaS Boilerplate",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"
|
|
7
|
-
|
|
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": [
|
|
17
|
+
"keywords": [
|
|
18
|
+
"firebase",
|
|
19
|
+
"domis",
|
|
20
|
+
"create-domis",
|
|
21
|
+
"cli"
|
|
22
|
+
],
|
|
14
23
|
"author": "Domisnnet",
|
|
15
24
|
"license": "LICENSE",
|
|
16
25
|
"dependencies": {
|