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 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: homedir2 } = await import("os");
539
- const machineIdPath = join4(homedir2(), ".brew-tui", "machine-id");
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 validatePromoCode(code) {
4055
+ var PROMO_API_URL = "https://api.molinesdesigns.com/api/promo";
4056
+ async function redeemPromoCode(code) {
4028
4057
  const normalized = code.trim().toUpperCase();
4029
- if (!normalized || normalized.length < 8) {
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}/validate`, {
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 { valid: false, error: body.error ?? "Invalid or expired promo code" };
4067
+ return { success: false, error: body.error ?? "Invalid or expired promo code" };
4041
4068
  }
4042
4069
  const data = await res.json();
4043
- return {
4044
- valid: true,
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 validation failed", { error: String(err) });
4050
- return { valid: false, error: "Could not validate promo code. Check your connection." };
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: code.trim().toUpperCase(),
4078
+ code: normalized,
4061
4079
  redeemedAt: (/* @__PURE__ */ new Date()).toISOString(),
4062
- expiresAt: new Date(Date.now() + validation.durationDays * 24 * 60 * 60 * 1e3).toISOString(),
4063
- type: validation.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.2" })
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) => {