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.
- package/dist/index.js +110 -32
- 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
|
-
|
|
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(
|
|
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
|
+
{ 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 +
|
|
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 !== "
|
|
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 === "
|
|
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
|
|
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
|
|
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
|
|
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