brew-tui 0.3.2 → 0.3.4
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/build/index.js +48 -29
- package/build/index.js.map +1 -1
- package/package.json +2 -2
package/build/index.js
CHANGED
|
@@ -456,6 +456,13 @@ async function deactivateLicense(key, instanceId) {
|
|
|
456
456
|
}
|
|
457
457
|
|
|
458
458
|
// src/lib/license/license-manager.ts
|
|
459
|
+
var BUILTIN_ACCOUNTS = {
|
|
460
|
+
"admin@molinesdesigns.com": "pro",
|
|
461
|
+
"artax1983@icloud.com": "free"
|
|
462
|
+
};
|
|
463
|
+
function getBuiltinAccountType(email) {
|
|
464
|
+
return BUILTIN_ACCOUNTS[email] ?? null;
|
|
465
|
+
}
|
|
459
466
|
var REVALIDATION_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
460
467
|
var GRACE_PERIOD_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
461
468
|
var ACTIVATION_COOLDOWN_MS = 3e4;
|
|
@@ -535,8 +542,8 @@ async function getMachineId2() {
|
|
|
535
542
|
try {
|
|
536
543
|
const { readFile: readMachineId } = await import("fs/promises");
|
|
537
544
|
const { join: join4 } = await import("path");
|
|
538
|
-
const { homedir:
|
|
539
|
-
const machineIdPath = join4(
|
|
545
|
+
const { homedir: homedir3 } = await import("os");
|
|
546
|
+
const machineIdPath = join4(homedir3(), ".brew-tui", "machine-id");
|
|
540
547
|
return (await readMachineId(machineIdPath, "utf-8")).trim() || null;
|
|
541
548
|
} catch {
|
|
542
549
|
return null;
|
|
@@ -729,6 +736,15 @@ var useLicenseStore = create2((set, get) => ({
|
|
|
729
736
|
set({ status: "free", license: null, degradation: "none" });
|
|
730
737
|
return;
|
|
731
738
|
}
|
|
739
|
+
const builtinType = getBuiltinAccountType(license.customerEmail);
|
|
740
|
+
if (builtinType === "pro") {
|
|
741
|
+
set({ status: "pro", license, degradation: "none" });
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
if (builtinType === "free") {
|
|
745
|
+
set({ status: "free", license: null, degradation: "none" });
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
732
748
|
if (isExpired(license)) {
|
|
733
749
|
set({ status: "expired", license, degradation: "expired" });
|
|
734
750
|
return;
|
|
@@ -4019,48 +4035,50 @@ import { Box as Box28, Text as Text29, useInput as useInput13 } from "ink";
|
|
|
4019
4035
|
import { TextInput as TextInput5 } from "@inkjs/ui";
|
|
4020
4036
|
|
|
4021
4037
|
// src/lib/license/promo.ts
|
|
4022
|
-
import { readFile as readFile4, writeFile as writeFile4, rename as rename3 } from "fs/promises";
|
|
4023
|
-
import { randomBytes as randomBytes2 } from "crypto";
|
|
4038
|
+
import { readFile as readFile4, writeFile as writeFile4, rename as rename3, mkdir as mkdir2 } from "fs/promises";
|
|
4039
|
+
import { randomBytes as randomBytes2, randomUUID as randomUUID2 } from "crypto";
|
|
4024
4040
|
import { join as join3 } from "path";
|
|
4041
|
+
import { homedir as homedir2 } from "os";
|
|
4042
|
+
var MACHINE_ID_PATH2 = join3(homedir2(), ".brew-tui", "machine-id");
|
|
4043
|
+
async function getMachineId3() {
|
|
4044
|
+
try {
|
|
4045
|
+
const id2 = (await readFile4(MACHINE_ID_PATH2, "utf-8")).trim();
|
|
4046
|
+
if (id2) return id2;
|
|
4047
|
+
} catch {
|
|
4048
|
+
}
|
|
4049
|
+
const id = randomUUID2();
|
|
4050
|
+
await mkdir2(join3(homedir2(), ".brew-tui"), { recursive: true, mode: 448 });
|
|
4051
|
+
await writeFile4(MACHINE_ID_PATH2, id, { encoding: "utf-8", mode: 384 });
|
|
4052
|
+
return id;
|
|
4053
|
+
}
|
|
4025
4054
|
var PROMO_PATH = join3(DATA_DIR, "promo.json");
|
|
4026
|
-
var PROMO_API_URL = "https://api.molinesdesigns.com/promo";
|
|
4027
|
-
async function
|
|
4055
|
+
var PROMO_API_URL = "https://api.molinesdesigns.com/api/promo";
|
|
4056
|
+
async function redeemPromoCode(code) {
|
|
4028
4057
|
const normalized = code.trim().toUpperCase();
|
|
4029
|
-
|
|
4030
|
-
return { valid: false, error: "Invalid promo code format" };
|
|
4031
|
-
}
|
|
4058
|
+
const machineId = await getMachineId3();
|
|
4032
4059
|
try {
|
|
4033
|
-
const res = await fetchWithTimeout(`${PROMO_API_URL}/
|
|
4060
|
+
const res = await fetchWithTimeout(`${PROMO_API_URL}/redeem`, {
|
|
4034
4061
|
method: "POST",
|
|
4035
4062
|
headers: { "Content-Type": "application/json" },
|
|
4036
|
-
body: JSON.stringify({ code: normalized })
|
|
4063
|
+
body: JSON.stringify({ code: normalized, machineId })
|
|
4037
4064
|
}, 1e4);
|
|
4038
4065
|
if (!res.ok) {
|
|
4039
4066
|
const body = await res.json().catch(() => ({}));
|
|
4040
|
-
return {
|
|
4067
|
+
return { success: false, error: body.error ?? "Invalid or expired promo code" };
|
|
4041
4068
|
}
|
|
4042
4069
|
const data = await res.json();
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
type: data.type,
|
|
4046
|
-
durationDays: data.durationDays
|
|
4047
|
-
};
|
|
4070
|
+
var serverExpiresAt = data.data.expiresAt;
|
|
4071
|
+
var serverType = data.data.type;
|
|
4048
4072
|
} catch (err) {
|
|
4049
|
-
logger.error("Promo
|
|
4050
|
-
return {
|
|
4051
|
-
}
|
|
4052
|
-
}
|
|
4053
|
-
async function redeemPromoCode(code) {
|
|
4054
|
-
const validation = await validatePromoCode(code);
|
|
4055
|
-
if (!validation.valid) {
|
|
4056
|
-
return { success: false, error: validation.error };
|
|
4073
|
+
logger.error("Promo redeem failed", { error: String(err) });
|
|
4074
|
+
return { success: false, error: "Could not reach promo server. Check your connection." };
|
|
4057
4075
|
}
|
|
4058
4076
|
await ensureDataDirs();
|
|
4059
4077
|
const redemption = {
|
|
4060
|
-
code:
|
|
4078
|
+
code: normalized,
|
|
4061
4079
|
redeemedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
4062
|
-
expiresAt:
|
|
4063
|
-
type:
|
|
4080
|
+
expiresAt: serverExpiresAt,
|
|
4081
|
+
type: serverType
|
|
4064
4082
|
};
|
|
4065
4083
|
let file = { version: 1, redemptions: [] };
|
|
4066
4084
|
try {
|
|
@@ -4227,7 +4245,7 @@ function AccountView() {
|
|
|
4227
4245
|
/* @__PURE__ */ jsx30(Box28, { marginTop: 1, children: /* @__PURE__ */ jsxs29(Text29, { color: COLORS.textSecondary, children: [
|
|
4228
4246
|
status === "pro" ? `d ${t("hint_deactivate")}` : "",
|
|
4229
4247
|
" ",
|
|
4230
|
-
t("app_version", { version: "0.3.
|
|
4248
|
+
t("app_version", { version: "0.3.4" })
|
|
4231
4249
|
] }) })
|
|
4232
4250
|
] });
|
|
4233
4251
|
}
|
|
@@ -4413,6 +4431,7 @@ async function runCli() {
|
|
|
4413
4431
|
console.log(t("delete_account_success"));
|
|
4414
4432
|
return;
|
|
4415
4433
|
}
|
|
4434
|
+
process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
|
|
4416
4435
|
render(/* @__PURE__ */ jsx32(App, {}));
|
|
4417
4436
|
}
|
|
4418
4437
|
runCli().catch((err) => {
|