@hot-updater/console 0.30.7 → 0.30.9

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.
Files changed (24) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{main-CoPJhqkz.js → main-5MdOCmsM.js} +2 -2
  3. package/.output/public/assets/{routes-CVEbccVq.js → routes-BmbL4goz.js} +2 -2
  4. package/.output/server/{__tanstack-start-server-fn-resolver-DB7Vwz3A.mjs → __tanstack-start-server-fn-resolver-rXMsqALt.mjs} +11 -11
  5. package/.output/server/_ssr/{api-rpc-kX2sZt80.mjs → api-rpc-DYKuUgOh.mjs} +2 -2
  6. package/.output/server/_ssr/{router-fogqFSFT.mjs → router-D-WWsYjv.mjs} +3 -3
  7. package/.output/server/_ssr/{routes-CgYYFBNT.mjs → routes-DyUhibF4.mjs} +87 -67
  8. package/.output/server/_ssr/{sidebar-B6a7DDef.mjs → sidebar-DXng0IOP.mjs} +1 -1
  9. package/.output/server/_ssr/ssr.mjs +3 -3
  10. package/.output/server/{_tanstack-start-manifest_v-OXy-e32b.mjs → _tanstack-start-manifest_v-xpdCj2Ct.mjs} +4 -4
  11. package/.output/server/index.mjs +47 -47
  12. package/README.md +0 -1
  13. package/package.json +6 -6
  14. package/.output/server/_libs/chownr.mjs +0 -60
  15. package/.output/server/_libs/core-util-is.mjs +0 -67
  16. package/.output/server/_libs/immediate.mjs +0 -57
  17. package/.output/server/_libs/inherits.mjs +0 -39
  18. package/.output/server/_libs/isaacs__fs-minipass+minipass.mjs +0 -1154
  19. package/.output/server/_libs/isarray.mjs +0 -10
  20. package/.output/server/_libs/jszip+[...].mjs +0 -8311
  21. package/.output/server/_libs/minizlib.mjs +0 -368
  22. package/.output/server/_libs/tar+yallist.mjs +0 -3318
  23. package/.output/server/_ssr/extract-timestamp-from-uuidv7-DO_lXhMa.mjs +0 -24
  24. package/.output/server/_ssr/promoteBundle-BBOSMtwu.mjs +0 -1571
@@ -1,44 +1,44 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/__tanstack-start-server-fn-resolver-DB7Vwz3A.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/__tanstack-start-server-fn-resolver-rXMsqALt.js
2
2
  var manifest = {
3
3
  "51a34c05479a893c7d320bd4cd1604427289d667698c48b9f30a01aabf8a5e68": {
4
4
  functionName: "getConfig_createServerFn_handler",
5
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
5
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
6
6
  },
7
7
  "79ada05964de8f2123bfcd62b10097d59bf8fd689ef5c7161031e5871d8396c5": {
8
8
  functionName: "getChannels_createServerFn_handler",
9
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
9
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
10
10
  },
11
11
  "f8bdca3d0579adb812d6404f55d9261a89cdb025e920b1fcad82883646a5fe9e": {
12
12
  functionName: "getConfigLoaded_createServerFn_handler",
13
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
13
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
14
14
  },
15
15
  "00ccacb4a0212c83ec29f4d11719046ad91ea8291cfc557d514dbf00d3bd7f5f": {
16
16
  functionName: "getBundles_createServerFn_handler",
17
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
17
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
18
18
  },
19
19
  "1bd85c2a50e24785cb6abb023a247a9f048f37ddfa85cbb1c57e579563bad013": {
20
20
  functionName: "getBundle_createServerFn_handler",
21
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
21
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
22
22
  },
23
23
  "e000081a14772a0496dfdf615232fbbb1a23b89191d0e32f89a05dd67a1916f7": {
24
24
  functionName: "getBundleDownloadUrl_createServerFn_handler",
25
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
25
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
26
26
  },
27
27
  "67f90ce4cd10fd0226cd9d77cdcd8d0f25a59a6ac406360b655e44296bc4208b": {
28
28
  functionName: "updateBundle_createServerFn_handler",
29
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
29
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
30
30
  },
31
31
  "c4ef3bbb77ea8a4410623fd18a4741e2ff0668b1a97510bcdd032a8428eaa5da": {
32
32
  functionName: "promoteBundle_createServerFn_handler",
33
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
33
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
34
34
  },
35
35
  "16cc7c2f080ea5b73e0c6bba815b110dbd7727796036d248ba0d8ae819ddef08": {
36
36
  functionName: "createBundle_createServerFn_handler",
37
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
37
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
38
38
  },
39
39
  "3a27ff5679228b86a346b3fe42142e7a5bf0264f73173c0dbe5f07fb37c43cf7": {
40
40
  functionName: "deleteBundle_createServerFn_handler",
41
- importer: () => import("./_ssr/api-rpc-kX2sZt80.mjs")
41
+ importer: () => import("./_ssr/api-rpc-DYKuUgOh.mjs")
42
42
  }
43
43
  };
44
44
  async function getServerFnById(id) {
@@ -1,5 +1,5 @@
1
1
  import { c as createServerFn, i as TSS_SERVER_FUNCTION } from "./createServerFn-CdeRXnVy.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/api-rpc-kX2sZt80.js
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/api-rpc-DYKuUgOh.js
3
3
  var createServerRpc = (serverFnMeta, splitImportFn) => {
4
4
  const url = "/_serverFn/" + serverFnMeta.id;
5
5
  return Object.assign(splitImportFn, {
@@ -165,7 +165,7 @@ var promoteBundle_createServerFn_handler = createServerRpc({
165
165
  var promoteBundle = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(promoteBundle_createServerFn_handler, async ({ data }) => {
166
166
  try {
167
167
  const { prepareConfig } = await import("./config.server-8YQWTTc0.mjs");
168
- const { promoteBundle: promoteBundleWithConfig } = await import("./promoteBundle-BBOSMtwu.mjs");
168
+ const { promoteBundle: promoteBundleWithConfig } = await import("@hot-updater/cli-tools");
169
169
  const { config, databasePlugin, storagePlugin } = await prepareConfig();
170
170
  return {
171
171
  success: true,
@@ -2,13 +2,13 @@ import { r as __toESM } from "../_runtime.mjs";
2
2
  import { P as require_jsx_runtime } from "../_libs/@radix-ui/react-alert-dialog+[...].mjs";
3
3
  import { u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
4
4
  import { _ as CircleCheck, c as Moon, f as Info, n as TriangleAlert, o as Package, r as Sun, s as OctagonX, u as LoaderCircle } from "../_libs/lucide-react.mjs";
5
- import { T as TooltipProvider, _ as SidebarMenu, b as SidebarProvider, d as SidebarFooter, f as SidebarGroup, g as SidebarInset, h as SidebarHeader, l as Sidebar, m as SidebarGroupLabel, p as SidebarGroupContent, t as Button, u as SidebarContent, v as SidebarMenuButton, y as SidebarMenuItem } from "./sidebar-B6a7DDef.mjs";
5
+ import { T as TooltipProvider, _ as SidebarMenu, b as SidebarProvider, d as SidebarFooter, f as SidebarGroup, g as SidebarInset, h as SidebarHeader, l as Sidebar, m as SidebarGroupLabel, p as SidebarGroupContent, t as Button, u as SidebarContent, v as SidebarMenuButton, y as SidebarMenuItem } from "./sidebar-DXng0IOP.mjs";
6
6
  import { a as createRouter, c as createFileRoute, l as createRootRoute, n as Scripts, o as Outlet, p as useRouterState, r as HeadContent, s as lazyRouteComponent, u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
7
7
  import { t as QueryClient } from "../_libs/tanstack__query-core.mjs";
8
8
  import { r as QueryClientProvider } from "../_libs/tanstack__react-query.mjs";
9
9
  import { t as z } from "../_libs/next-themes.mjs";
10
10
  import { t as Toaster } from "../_libs/sonner.mjs";
11
- //#region node_modules/.nitro/vite/services/ssr/assets/router-fogqFSFT.js
11
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-D-WWsYjv.js
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  var import_react = /* @__PURE__ */ __toESM(require_react());
14
14
  function HotUpdaterLogo({ className }) {
@@ -227,7 +227,7 @@ function RootLayout() {
227
227
  (0, import_react.useEffect)(() => {}, []);
228
228
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(SidebarProvider, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppSidebar, {}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarInset, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {}) })] });
229
229
  }
230
- var $$splitComponentImporter = () => import("./routes-CgYYFBNT.mjs");
230
+ var $$splitComponentImporter = () => import("./routes-DyUhibF4.mjs");
231
231
  var rootRouteChildren = { IndexRoute: createFileRoute("/")({
232
232
  component: lazyRouteComponent($$splitComponentImporter, "component"),
233
233
  validateSearch: (search) => {
@@ -1,6 +1,5 @@
1
1
  import { r as __toESM } from "../_runtime.mjs";
2
2
  import { c as createServerFn, i as TSS_SERVER_FUNCTION } from "./createServerFn-CdeRXnVy.mjs";
3
- import { n as extractTimestampFromUUIDv7, t as createUUIDv7 } from "./extract-timestamp-from-uuidv7-DO_lXhMa.mjs";
4
3
  import { A as Slot, P as require_jsx_runtime, a as Overlay2, c as Title2, d as Description, f as Overlay, g as Trigger, h as Title, i as Description2, l as Close, m as Root, n as Cancel, o as Portal2, p as Portal, r as Content2, s as Root2, t as Action, u as Content } from "../_libs/@radix-ui/react-alert-dialog+[...].mjs";
5
4
  import { u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
6
5
  import { S as Check, b as ChevronLeft, d as List, g as Download, h as ExternalLink, i as Plus, l as Minus, m as FingerprintPattern, n as TriangleAlert, o as Package, p as Funnel, t as X, v as ChevronUp, x as ChevronDown, y as ChevronRight } from "../_libs/lucide-react.mjs";
@@ -9,21 +8,84 @@ import { a as ItemText, c as ScrollDownButton, d as Value, f as Viewport, i as I
9
8
  import { t as Root$1 } from "../_libs/radix-ui__react-label.mjs";
10
9
  import { i as Track, n as Root$2, r as Thumb, t as Range } from "../_libs/radix-ui__react-slider.mjs";
11
10
  import { n as Thumb$1, t as Root$3 } from "../_libs/radix-ui__react-switch.mjs";
12
- import { C as Tooltip$1, D as cn, E as TooltipTrigger, S as Skeleton, T as TooltipProvider, a as SheetContent, c as SheetTitle, i as Sheet, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button, w as TooltipContent, x as SidebarTrigger } from "./sidebar-B6a7DDef.mjs";
11
+ import { C as Tooltip$1, D as cn, E as TooltipTrigger, S as Skeleton, T as TooltipProvider, a as SheetContent, c as SheetTitle, i as Sheet, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button, w as TooltipContent, x as SidebarTrigger } from "./sidebar-DXng0IOP.mjs";
13
12
  import { d as useNavigate, f as useSearch } from "../_libs/@tanstack/react-router+[...].mjs";
14
13
  import { n as useStore, t as useForm } from "../_libs/@tanstack/react-form+[...].mjs";
15
14
  import { i as useQueryClient, n as useQuery, t as useMutation } from "../_libs/tanstack__react-query.mjs";
16
15
  import { n as toast } from "../_libs/sonner.mjs";
17
- import { t as getServerFnById } from "../__tanstack-start-server-fn-resolver-DB7Vwz3A.mjs";
16
+ import { t as getServerFnById } from "../__tanstack-start-server-fn-resolver-rXMsqALt.mjs";
18
17
  import { t as require_semver } from "../_libs/semver.mjs";
19
18
  import { i as getCoreRowModel, n as useReactTable, r as createColumnHelper, t as flexRender } from "../_libs/@tanstack/react-table+[...].mjs";
20
19
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
21
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-CgYYFBNT.js
20
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-DyUhibF4.js
22
21
  var import_jsx_runtime = require_jsx_runtime();
23
22
  var import_react = /* @__PURE__ */ __toESM(require_react());
24
23
  var import_semver = /* @__PURE__ */ __toESM(require_semver());
25
24
  var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min());
26
25
  var import_relativeTime = /* @__PURE__ */ __toESM(require_relativeTime());
26
+ function AppleIcon({ className }) {
27
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
28
+ role: "img",
29
+ "aria-label": "iOS",
30
+ viewBox: "0 0 24 24",
31
+ xmlns: "http://www.w3.org/2000/svg",
32
+ className,
33
+ fill: "currentColor",
34
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" })
35
+ });
36
+ }
37
+ function AndroidIcon({ className }) {
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
39
+ role: "img",
40
+ "aria-label": "Android",
41
+ viewBox: "0 0 24 24",
42
+ xmlns: "http://www.w3.org/2000/svg",
43
+ className,
44
+ fill: "currentColor",
45
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18.4395 5.5586c-.675 1.1664-1.352 2.3318-2.0274 3.498-.0366-.0155-.0742-.0286-.1113-.043-1.8249-.6957-3.484-.8-4.42-.787-1.8551.0185-3.3544.4643-4.2597.8203-.084-.1494-1.7526-3.021-2.0215-3.4864a1.1451 1.1451 0 0 0-.1406-.1914c-.3312-.364-.9054-.4859-1.379-.203-.475.282-.7136.9361-.3886 1.5019 1.9466 3.3696-.0966-.2158 1.9473 3.3593.0172.031-.4946.2642-1.3926 1.0177C2.8987 12.176.452 14.772 0 18.9902h24c-.119-1.1108-.3686-2.099-.7461-3.0683-.7438-1.9118-1.8435-3.2928-2.7402-4.1836a12.1048 12.1048 0 0 0-2.1309-1.6875c.6594-1.122 1.312-2.2559 1.9649-3.3848.2077-.3615.1886-.7956-.0079-1.1191a1.1001 1.1001 0 0 0-.8515-.5332c-.5225-.0536-.9392.3128-1.0488.5449zm-.0391 8.461c.3944.5926.324 1.3306-.1563 1.6503-.4799.3197-1.188.0985-1.582-.4941-.3944-.5927-.324-1.3307.1563-1.6504.4727-.315 1.1812-.1086 1.582.4941zM7.207 13.5273c.4803.3197.5506 1.0577.1563 1.6504-.394.5926-1.1038.8138-1.584.4941-.48-.3197-.5503-1.0577-.1563-1.6504.4008-.6021 1.1087-.8106 1.584-.4941z" })
46
+ });
47
+ }
48
+ function PlatformIcon({ platform, className }) {
49
+ if (platform === "ios") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppleIcon, { className });
50
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AndroidIcon, { className });
51
+ }
52
+ function BundleBasicInfo({ bundle }) {
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
54
+ className: "flex flex-col gap-3 text-sm mt-1",
55
+ children: [
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
57
+ className: "flex items-center gap-2",
58
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PlatformIcon, {
59
+ platform: bundle.platform,
60
+ className: "h-4 w-4"
61
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
62
+ className: "font-medium",
63
+ children: bundle.platform === "ios" ? "iOS" : "Android"
64
+ })]
65
+ }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
67
+ className: "flex items-center gap-2",
68
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
69
+ className: "font-medium text-muted-foreground",
70
+ children: "Bundle ID"
71
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
72
+ className: "text-xs text-foreground",
73
+ children: bundle.id
74
+ })]
75
+ }),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
77
+ className: "flex items-center gap-2",
78
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
79
+ className: "font-medium text-muted-foreground",
80
+ children: "Channel"
81
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
82
+ className: "text-xs text-foreground",
83
+ children: bundle.channel
84
+ })]
85
+ })
86
+ ]
87
+ });
88
+ }
27
89
  var NUMERIC_COHORT_SIZE = 1e3;
28
90
  var DEFAULT_ROLLOUT_COHORT_COUNT = NUMERIC_COHORT_SIZE;
29
91
  var INVALID_COHORT_ERROR_MESSAGE = `Invalid cohort. Use 1-1000 or a lowercase slug without spaces, up to 64 characters.`;
@@ -114,69 +176,6 @@ function getNumericCohortRolloutPosition(bundleId, cohortValue) {
114
176
  const { offset, inverseMultiplier } = getRolloutShuffleParameters(bundleId);
115
177
  return positiveMod(inverseMultiplier * (cohortValue - 1 - offset), NUMERIC_COHORT_SIZE);
116
178
  }
117
- function AppleIcon({ className }) {
118
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
119
- role: "img",
120
- "aria-label": "iOS",
121
- viewBox: "0 0 24 24",
122
- xmlns: "http://www.w3.org/2000/svg",
123
- className,
124
- fill: "currentColor",
125
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" })
126
- });
127
- }
128
- function AndroidIcon({ className }) {
129
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
130
- role: "img",
131
- "aria-label": "Android",
132
- viewBox: "0 0 24 24",
133
- xmlns: "http://www.w3.org/2000/svg",
134
- className,
135
- fill: "currentColor",
136
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18.4395 5.5586c-.675 1.1664-1.352 2.3318-2.0274 3.498-.0366-.0155-.0742-.0286-.1113-.043-1.8249-.6957-3.484-.8-4.42-.787-1.8551.0185-3.3544.4643-4.2597.8203-.084-.1494-1.7526-3.021-2.0215-3.4864a1.1451 1.1451 0 0 0-.1406-.1914c-.3312-.364-.9054-.4859-1.379-.203-.475.282-.7136.9361-.3886 1.5019 1.9466 3.3696-.0966-.2158 1.9473 3.3593.0172.031-.4946.2642-1.3926 1.0177C2.8987 12.176.452 14.772 0 18.9902h24c-.119-1.1108-.3686-2.099-.7461-3.0683-.7438-1.9118-1.8435-3.2928-2.7402-4.1836a12.1048 12.1048 0 0 0-2.1309-1.6875c.6594-1.122 1.312-2.2559 1.9649-3.3848.2077-.3615.1886-.7956-.0079-1.1191a1.1001 1.1001 0 0 0-.8515-.5332c-.5225-.0536-.9392.3128-1.0488.5449zm-.0391 8.461c.3944.5926.324 1.3306-.1563 1.6503-.4799.3197-1.188.0985-1.582-.4941-.3944-.5927-.324-1.3307.1563-1.6504.4727-.315 1.1812-.1086 1.582.4941zM7.207 13.5273c.4803.3197.5506 1.0577.1563 1.6504-.394.5926-1.1038.8138-1.584.4941-.48-.3197-.5503-1.0577-.1563-1.6504.4008-.6021 1.1087-.8106 1.584-.4941z" })
137
- });
138
- }
139
- function PlatformIcon({ platform, className }) {
140
- if (platform === "ios") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppleIcon, { className });
141
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AndroidIcon, { className });
142
- }
143
- function BundleBasicInfo({ bundle }) {
144
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
145
- className: "flex flex-col gap-3 text-sm mt-1",
146
- children: [
147
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
148
- className: "flex items-center gap-2",
149
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PlatformIcon, {
150
- platform: bundle.platform,
151
- className: "h-4 w-4"
152
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
153
- className: "font-medium",
154
- children: bundle.platform === "ios" ? "iOS" : "Android"
155
- })]
156
- }),
157
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
158
- className: "flex items-center gap-2",
159
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
160
- className: "font-medium text-muted-foreground",
161
- children: "Bundle ID"
162
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
163
- className: "text-xs text-foreground",
164
- children: bundle.id
165
- })]
166
- }),
167
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
168
- className: "flex items-center gap-2",
169
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
170
- className: "font-medium text-muted-foreground",
171
- children: "Channel"
172
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
173
- className: "text-xs text-foreground",
174
- children: bundle.channel
175
- })]
176
- })
177
- ]
178
- });
179
- }
180
179
  var badgeVariants = cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", {
181
180
  variants: { variant: {
182
181
  default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
@@ -549,6 +548,27 @@ function DeleteBundleDialog({ bundle, open, onOpenChange, onSuccess }) {
549
548
  })
550
549
  });
551
550
  }
551
+ var extractTimestampFromUUIDv7 = (uuid) => {
552
+ const timestampHex = uuid.split("-").join("").slice(0, 12);
553
+ return Number.parseInt(timestampHex, 16);
554
+ };
555
+ function createUUIDv7FromTimestampHex(timestampHex) {
556
+ const randomBytes = new Uint8Array(10);
557
+ crypto.getRandomValues(randomBytes);
558
+ const randomHex = Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
559
+ const randA = randomHex.slice(0, 3);
560
+ const randBHex = randomHex.slice(3, 19);
561
+ const versionAndRandA = `7${randA}`;
562
+ const variantAndFirstRandB = (128 | parseInt(randBHex.slice(0, 2), 16) & 63).toString(16).padStart(2, "0");
563
+ return [
564
+ timestampHex.slice(0, 8),
565
+ timestampHex.slice(8, 12),
566
+ versionAndRandA,
567
+ variantAndFirstRandB + randBHex.slice(2, 4),
568
+ randBHex.slice(4, 16)
569
+ ].join("-");
570
+ }
571
+ var createUUIDv7 = () => createUUIDv7FromTimestampHex(Date.now().toString(16).padStart(12, "0"));
552
572
  function Dialog$1({ ...props }) {
553
573
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Root, {
554
574
  "data-slot": "dialog",
@@ -6,7 +6,7 @@ import { n as clsx, t as cva } from "../_libs/class-variance-authority+clsx.mjs"
6
6
  import { t as Root$1 } from "../_libs/radix-ui__react-separator.mjs";
7
7
  import { a as Root3, i as Provider, n as Content2, o as Trigger, r as Portal$1, t as Arrow2 } from "../_libs/radix-ui__react-tooltip.mjs";
8
8
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
9
- //#region node_modules/.nitro/vite/services/ssr/assets/sidebar-B6a7DDef.js
9
+ //#region node_modules/.nitro/vite/services/ssr/assets/sidebar-DXng0IOP.js
10
10
  var import_jsx_runtime = require_jsx_runtime();
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  function cn(...inputs) {
@@ -1,7 +1,7 @@
1
1
  import { a as X_TSS_RAW_RESPONSE, d as isRedirect, f as isResolvedRedirect, h as safeObjectMerge, i as TSS_SERVER_FUNCTION, l as flattenMiddlewares, m as runWithStartContext, n as TSS_CONTENT_TYPE_FRAMED_VERSIONED, o as X_TSS_SERIALIZED, p as mergeHeaders, r as TSS_FORMDATA_CONTEXT, s as createNullProtoObject, t as FrameType, u as getStartOptions } from "./createServerFn-CdeRXnVy.mjs";
2
2
  import { P as require_jsx_runtime } from "../_libs/@radix-ui/react-alert-dialog+[...].mjs";
3
3
  import { i as RouterProvider, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
4
- import { t as getServerFnById } from "../__tanstack-start-server-fn-resolver-DB7Vwz3A.mjs";
4
+ import { t as getServerFnById } from "../__tanstack-start-server-fn-resolver-rXMsqALt.mjs";
5
5
  import { t as defineHandlerCallback } from "../_libs/tanstack__router-core.mjs";
6
6
  import { PassThrough, Readable } from "node:stream";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -3955,7 +3955,7 @@ function getResponse() {
3955
3955
  return getH3Event().res;
3956
3956
  }
3957
3957
  async function getStartManifest(matchedRoutes) {
3958
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-OXy-e32b.mjs");
3958
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-xpdCj2Ct.mjs");
3959
3959
  const startManifest = tsrStartManifest();
3960
3960
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes["__root__"] || {};
3961
3961
  rootRoute.assets = rootRoute.assets || [];
@@ -4375,7 +4375,7 @@ var entriesPromise;
4375
4375
  var baseManifestPromise;
4376
4376
  var cachedFinalManifestPromise;
4377
4377
  async function loadEntries() {
4378
- const routerEntry = await import("./router-fogqFSFT.mjs");
4378
+ const routerEntry = await import("./router-D-WWsYjv.mjs");
4379
4379
  return {
4380
4380
  startEntry: await import("./start-DsRb6TkZ.mjs"),
4381
4381
  routerEntry
@@ -1,17 +1,17 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-OXy-e32b.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-xpdCj2Ct.js
2
2
  var tsrStartManifest = () => ({
3
3
  "routes": {
4
4
  "__root__": {
5
5
  "filePath": "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/__root.tsx",
6
6
  "children": ["/"],
7
- "preloads": ["/assets/main-CoPJhqkz.js", "/assets/dist-BKho179_.js"]
7
+ "preloads": ["/assets/main-5MdOCmsM.js", "/assets/dist-BKho179_.js"]
8
8
  },
9
9
  "/": {
10
10
  "filePath": "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/index.tsx",
11
- "preloads": ["/assets/routes-CVEbccVq.js"]
11
+ "preloads": ["/assets/routes-BmbL4goz.js"]
12
12
  }
13
13
  },
14
- "clientEntry": "/assets/main-CoPJhqkz.js"
14
+ "clientEntry": "/assets/main-5MdOCmsM.js"
15
15
  });
16
16
  //#endregion
17
17
  export { tsrStartManifest };
@@ -80,128 +80,128 @@ var public_assets_data_default = {
80
80
  "/apple-touch-icon.png": {
81
81
  "type": "image/png",
82
82
  "etag": "\"329e-uyxOmLQHjRnOIdaE3FE7O/uZ9l4\"",
83
- "mtime": "2026-05-02T07:14:38.374Z",
83
+ "mtime": "2026-05-06T16:33:29.489Z",
84
84
  "size": 12958,
85
85
  "path": "../public/apple-touch-icon.png"
86
86
  },
87
87
  "/favicon-16x16.png": {
88
88
  "type": "image/png",
89
89
  "etag": "\"240-h6ktCVLfjIcsDJuLwUXP4nCJxlI\"",
90
- "mtime": "2026-05-02T07:14:38.374Z",
90
+ "mtime": "2026-05-06T16:33:29.490Z",
91
91
  "size": 576,
92
92
  "path": "../public/favicon-16x16.png"
93
93
  },
94
94
  "/favicon-32x32.png": {
95
95
  "type": "image/png",
96
96
  "etag": "\"4f0-0qQrV3Eq3PzIigrp+8htf8vFCYA\"",
97
- "mtime": "2026-05-02T07:14:38.374Z",
97
+ "mtime": "2026-05-06T16:33:29.490Z",
98
98
  "size": 1264,
99
99
  "path": "../public/favicon-32x32.png"
100
100
  },
101
101
  "/favicon.ico": {
102
102
  "type": "image/vnd.microsoft.icon",
103
103
  "etag": "\"3c2e-eMwmbJNNg6G+Uu+rqWtuvtI2Om4\"",
104
- "mtime": "2026-05-02T07:14:38.374Z",
104
+ "mtime": "2026-05-06T16:33:29.490Z",
105
105
  "size": 15406,
106
106
  "path": "../public/favicon.ico"
107
107
  },
108
108
  "/logo.svg": {
109
109
  "type": "image/svg+xml",
110
110
  "etag": "\"478-zKvD9Jp5dDLCBmng0McewYMBxfs\"",
111
- "mtime": "2026-05-02T07:14:38.375Z",
111
+ "mtime": "2026-05-06T16:33:29.489Z",
112
112
  "size": 1144,
113
113
  "path": "../public/logo.svg"
114
114
  },
115
- "/manifest.json": {
116
- "type": "application/json",
117
- "etag": "\"258-CQdbkGDhbZhU+yrcSXanXKWFEpw\"",
118
- "mtime": "2026-05-02T07:14:38.375Z",
119
- "size": 600,
120
- "path": "../public/manifest.json"
121
- },
122
115
  "/robots.txt": {
123
116
  "type": "text/plain; charset=utf-8",
124
117
  "etag": "\"43-BEzmj4PuhUNHX+oW9uOnPSihxtU\"",
125
- "mtime": "2026-05-02T07:14:38.375Z",
118
+ "mtime": "2026-05-06T16:33:29.490Z",
126
119
  "size": 67,
127
120
  "path": "../public/robots.txt"
128
121
  },
129
- "/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2": {
130
- "type": "font/woff2",
131
- "etag": "\"493c-n3Oy9D6jvzfMjpClqox+Zo7ERQQ\"",
132
- "mtime": "2026-05-02T07:14:37.725Z",
133
- "size": 18748,
134
- "path": "../public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2"
122
+ "/manifest.json": {
123
+ "type": "application/json",
124
+ "etag": "\"258-CQdbkGDhbZhU+yrcSXanXKWFEpw\"",
125
+ "mtime": "2026-05-06T16:33:29.490Z",
126
+ "size": 600,
127
+ "path": "../public/manifest.json"
128
+ },
129
+ "/assets/dist-BKho179_.js": {
130
+ "type": "text/javascript; charset=utf-8",
131
+ "etag": "\"35235-u/sDKSWfxLQCuHBIXR8IYoldgSQ\"",
132
+ "mtime": "2026-05-06T16:33:28.780Z",
133
+ "size": 217653,
134
+ "path": "../public/assets/dist-BKho179_.js"
135
135
  },
136
136
  "/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2": {
137
137
  "type": "font/woff2",
138
138
  "etag": "\"6568-cF1iUGbboMFZ8TfnP5HiMgl9II0\"",
139
- "mtime": "2026-05-02T07:14:37.725Z",
139
+ "mtime": "2026-05-06T16:33:28.781Z",
140
140
  "size": 25960,
141
141
  "path": "../public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2"
142
142
  },
143
+ "/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2": {
144
+ "type": "font/woff2",
145
+ "etag": "\"493c-n3Oy9D6jvzfMjpClqox+Zo7ERQQ\"",
146
+ "mtime": "2026-05-06T16:33:28.781Z",
147
+ "size": 18748,
148
+ "path": "../public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2"
149
+ },
143
150
  "/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2": {
144
151
  "type": "font/woff2",
145
152
  "etag": "\"2be0-BP5iTzJeB8nLqYAgKpWNi5o1Zm8\"",
146
- "mtime": "2026-05-02T07:14:37.725Z",
153
+ "mtime": "2026-05-06T16:33:28.781Z",
147
154
  "size": 11232,
148
155
  "path": "../public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2"
149
156
  },
150
- "/assets/dist-BKho179_.js": {
151
- "type": "text/javascript; charset=utf-8",
152
- "etag": "\"35235-u/sDKSWfxLQCuHBIXR8IYoldgSQ\"",
153
- "mtime": "2026-05-02T07:14:37.725Z",
154
- "size": 217653,
155
- "path": "../public/assets/dist-BKho179_.js"
156
- },
157
157
  "/assets/inter-greek-wght-normal-CkhJZR-_.woff2": {
158
158
  "type": "font/woff2",
159
159
  "etag": "\"4a34-xor/hj4YNqI52zFecXnUbzQ4Xs4\"",
160
- "mtime": "2026-05-02T07:14:37.725Z",
160
+ "mtime": "2026-05-06T16:33:28.781Z",
161
161
  "size": 18996,
162
162
  "path": "../public/assets/inter-greek-wght-normal-CkhJZR-_.woff2"
163
163
  },
164
164
  "/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2": {
165
165
  "type": "font/woff2",
166
166
  "etag": "\"14c4c-zz61D7IQFMB9QxHvTAOk/Vh4ibQ\"",
167
- "mtime": "2026-05-02T07:14:37.725Z",
167
+ "mtime": "2026-05-06T16:33:28.781Z",
168
168
  "size": 85068,
169
169
  "path": "../public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2"
170
170
  },
171
171
  "/assets/inter-latin-wght-normal-Dx4kXJAl.woff2": {
172
172
  "type": "font/woff2",
173
173
  "etag": "\"bc80-8R1ym7Ck2DUNLqPQ/AYs9u8tUpg\"",
174
- "mtime": "2026-05-02T07:14:37.725Z",
174
+ "mtime": "2026-05-06T16:33:28.781Z",
175
175
  "size": 48256,
176
176
  "path": "../public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2"
177
177
  },
178
178
  "/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2": {
179
179
  "type": "font/woff2",
180
180
  "etag": "\"280c-nBythjoDQ0+5wVAendJ6wU7Xz2M\"",
181
- "mtime": "2026-05-02T07:14:37.725Z",
181
+ "mtime": "2026-05-06T16:33:28.781Z",
182
182
  "size": 10252,
183
183
  "path": "../public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2"
184
184
  },
185
+ "/assets/main-5MdOCmsM.js": {
186
+ "type": "text/javascript; charset=utf-8",
187
+ "etag": "\"439bb-FgeNTu4/ahv5yeqyOp0U8vweFm4\"",
188
+ "mtime": "2026-05-06T16:33:28.780Z",
189
+ "size": 276923,
190
+ "path": "../public/assets/main-5MdOCmsM.js"
191
+ },
192
+ "/assets/routes-BmbL4goz.js": {
193
+ "type": "text/javascript; charset=utf-8",
194
+ "etag": "\"34b05-9Vhnbv8DForMLWH+sVIYv/OBY6Q\"",
195
+ "mtime": "2026-05-06T16:33:28.780Z",
196
+ "size": 215813,
197
+ "path": "../public/assets/routes-BmbL4goz.js"
198
+ },
185
199
  "/assets/styles-M2W42JQb.css": {
186
200
  "type": "text/css; charset=utf-8",
187
201
  "etag": "\"16c09-0PgJUH0UJ7vffHYoje/awxCquoI\"",
188
- "mtime": "2026-05-02T07:14:37.725Z",
202
+ "mtime": "2026-05-06T16:33:28.781Z",
189
203
  "size": 93193,
190
204
  "path": "../public/assets/styles-M2W42JQb.css"
191
- },
192
- "/assets/routes-CVEbccVq.js": {
193
- "type": "text/javascript; charset=utf-8",
194
- "etag": "\"34b05-3mdibK1idGwv4pZIDgSJq2HS4Vc\"",
195
- "mtime": "2026-05-02T07:14:37.725Z",
196
- "size": 215813,
197
- "path": "../public/assets/routes-CVEbccVq.js"
198
- },
199
- "/assets/main-CoPJhqkz.js": {
200
- "type": "text/javascript; charset=utf-8",
201
- "etag": "\"439bb-uLvRmjLg5Gac65VCaKbIpqIGKpo\"",
202
- "mtime": "2026-05-02T07:14:37.723Z",
203
- "size": 276923,
204
- "path": "../public/assets/main-CoPJhqkz.js"
205
205
  }
206
206
  };
207
207
  //#endregion
package/README.md CHANGED
@@ -83,7 +83,6 @@ src/
83
83
  │ ├── api.ts # React Query hooks
84
84
  │ ├── constants.ts # Shared constants
85
85
  │ ├── utils.ts # Utility functions
86
- │ ├── extract-timestamp-from-uuidv7.ts
87
86
  │ └── server/
88
87
  │ ├── api.server.ts # Server functions
89
88
  │ └── config.server.ts # Hot Updater config loader
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hot-updater/console",
3
3
  "type": "module",
4
- "version": "0.30.7",
4
+ "version": "0.30.9",
5
5
  "files": [
6
6
  ".output",
7
7
  "package.json"
@@ -10,7 +10,7 @@
10
10
  "./package.json": "./package.json"
11
11
  },
12
12
  "peerDependencies": {
13
- "@hot-updater/cli-tools": "0.30.7"
13
+ "@hot-updater/cli-tools": "0.30.9"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@base-ui/react": "^1.3.0",
@@ -58,10 +58,10 @@
58
58
  "vite-tsconfig-paths": "^6.1.1",
59
59
  "vitest": "4.1.4",
60
60
  "web-vitals": "^5.1.0",
61
- "@hot-updater/cli-tools": "0.30.7",
62
- "@hot-updater/core": "0.30.7",
63
- "@hot-updater/mock": "0.30.7",
64
- "@hot-updater/plugin-core": "0.30.7"
61
+ "@hot-updater/cli-tools": "0.30.9",
62
+ "@hot-updater/core": "0.30.9",
63
+ "@hot-updater/mock": "0.30.9",
64
+ "@hot-updater/plugin-core": "0.30.9"
65
65
  },
66
66
  "description": "React Native OTA solution for self-hosted",
67
67
  "license": "MIT",
@@ -1,60 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- //#region ../../node_modules/.pnpm/chownr@3.0.0/node_modules/chownr/dist/esm/index.js
4
- var lchownSync = (path, uid, gid) => {
5
- try {
6
- return fs.lchownSync(path, uid, gid);
7
- } catch (er) {
8
- if (er?.code !== "ENOENT") throw er;
9
- }
10
- };
11
- var chown = (cpath, uid, gid, cb) => {
12
- fs.lchown(cpath, uid, gid, (er) => {
13
- cb(er && er?.code !== "ENOENT" ? er : null);
14
- });
15
- };
16
- var chownrKid = (p, child, uid, gid, cb) => {
17
- if (child.isDirectory()) chownr(path.resolve(p, child.name), uid, gid, (er) => {
18
- if (er) return cb(er);
19
- chown(path.resolve(p, child.name), uid, gid, cb);
20
- });
21
- else chown(path.resolve(p, child.name), uid, gid, cb);
22
- };
23
- var chownr = (p, uid, gid, cb) => {
24
- fs.readdir(p, { withFileTypes: true }, (er, children) => {
25
- if (er) {
26
- if (er.code === "ENOENT") return cb();
27
- else if (er.code !== "ENOTDIR" && er.code !== "ENOTSUP") return cb(er);
28
- }
29
- if (er || !children.length) return chown(p, uid, gid, cb);
30
- let len = children.length;
31
- let errState = null;
32
- const then = (er) => {
33
- /* c8 ignore start */
34
- if (errState) return;
35
- /* c8 ignore stop */
36
- if (er) return cb(errState = er);
37
- if (--len === 0) return chown(p, uid, gid, cb);
38
- };
39
- for (const child of children) chownrKid(p, child, uid, gid, then);
40
- });
41
- };
42
- var chownrKidSync = (p, child, uid, gid) => {
43
- if (child.isDirectory()) chownrSync(path.resolve(p, child.name), uid, gid);
44
- lchownSync(path.resolve(p, child.name), uid, gid);
45
- };
46
- var chownrSync = (p, uid, gid) => {
47
- let children;
48
- try {
49
- children = fs.readdirSync(p, { withFileTypes: true });
50
- } catch (er) {
51
- const e = er;
52
- if (e?.code === "ENOENT") return;
53
- else if (e?.code === "ENOTDIR" || e?.code === "ENOTSUP") return lchownSync(p, uid, gid);
54
- else throw e;
55
- }
56
- for (const child of children) chownrKidSync(p, child, uid, gid);
57
- return lchownSync(p, uid, gid);
58
- };
59
- //#endregion
60
- export { chownrSync as n, chownr as t };