create-domis 1.0.36 → 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.
- package/dist/index.js +137 -34
- package/package.json +2 -2
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
|
-
|
|
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(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
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 !== "
|
|
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 === "
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
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
|
|
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,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-domis",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.38",
|
|
4
4
|
"description": "CLI Oficial DomisPacks - Acelerador Next.js 15 + Tailwind v4 + SaaS Boilerplate",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"bin": "./bin/create-domis",
|
|
6
|
+
"bin": { "create-domis": "./bin/create-domis.js" },
|
|
7
7
|
"files": [ "dist", "bin" ],
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "tsup src/index.ts --format esm --dts",
|