@hot-updater/console 0.35.11 → 0.36.0

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.
@@ -14,14 +14,13 @@ import { m as useSearch, p as useNavigate } from "../_libs/@tanstack/react-route
14
14
  import { n as useStore, t as useForm } from "../_libs/@tanstack/react-form+[...].mjs";
15
15
  import { i as useQueryClient, n as useQuery, t as useMutation } from "../_libs/tanstack__react-query.mjs";
16
16
  import { n as toast } from "../_libs/sonner.mjs";
17
- import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-DVQ3oVr1.mjs";
18
- import { t as require_semver } from "../_libs/semver.mjs";
17
+ import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-CgwgZ0-i.mjs";
18
+ import { t as normalizeRange } from "../_libs/verkit.mjs";
19
19
  import { i as getCoreRowModel, n as useReactTable, r as createColumnHelper, t as flexRender } from "../_libs/@tanstack/react-table+[...].mjs";
20
20
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
21
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-Bjhf6xFE.js
21
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-B0lQvvlC.js
22
22
  var import_react = /* @__PURE__ */ __toESM(require_react());
23
23
  var import_jsx_runtime = require_jsx_runtime();
24
- 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());
27
26
  var extractTimestampFromUUIDv7 = (uuid) => {
@@ -412,6 +411,7 @@ var updateBundle = createServerFn({ method: "POST" }).inputValidator((input) =>
412
411
  var promoteBundle = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("c4ef3bbb77ea8a4410623fd18a4741e2ff0668b1a97510bcdd032a8428eaa5da"));
413
412
  createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("16cc7c2f080ea5b73e0c6bba815b110dbd7727796036d248ba0d8ae819ddef08"));
414
413
  var deleteBundle = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("3a27ff5679228b86a346b3fe42142e7a5bf0264f73173c0dbe5f07fb37c43cf7"));
414
+ var deleteBundles = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("61de3b69779c5ce2a5f5d3c27e2cfaca8fba8f14c8803559b9cd733c456494fa"));
415
415
  var bundleListQueryKey = ["bundles"];
416
416
  var queryKeys = {
417
417
  config: ["config"],
@@ -446,6 +446,14 @@ function removeBundleFromQueryData(data, bundleId) {
446
446
  data: data.data.filter((bundle) => bundle.id !== bundleId)
447
447
  };
448
448
  }
449
+ function removeBundlesFromQueryData(data, bundleIds) {
450
+ if (!data) return data;
451
+ const bundleIdSet = new Set(bundleIds);
452
+ return {
453
+ ...data,
454
+ data: data.data.filter((bundle) => !bundleIdSet.has(bundle.id))
455
+ };
456
+ }
449
457
  var hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
450
458
  var invalidateInBackground = (queryClient, queryKey) => {
451
459
  queryClient.invalidateQueries({ queryKey }).catch(() => void 0);
@@ -541,6 +549,19 @@ function useDeleteBundleMutation() {
541
549
  }
542
550
  });
543
551
  }
552
+ function useDeleteBundlesMutation() {
553
+ const queryClient = useQueryClient();
554
+ return useMutation({
555
+ mutationFn: (params) => deleteBundles({ data: params }),
556
+ onSuccess: (_, vars) => {
557
+ for (const bundleId of vars.bundleIds) queryClient.removeQueries({ queryKey: queryKeys.bundle(bundleId) });
558
+ queryClient.setQueriesData({ queryKey: queryKeys.bundles.all }, (data) => removeBundlesFromQueryData(data, vars.bundleIds));
559
+ invalidateInBackground(queryClient, queryKeys.bundles.all);
560
+ invalidateInBackground(queryClient, queryKeys.bundleChildren.all);
561
+ invalidateInBackground(queryClient, queryKeys.channels);
562
+ }
563
+ });
564
+ }
544
565
  function AlertDialog$1({ ...props }) {
545
566
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Root2, {
546
567
  "data-slot": "alert-dialog",
@@ -759,6 +780,7 @@ function useFilterParams() {
759
780
  const filters = {
760
781
  channel: search.channel,
761
782
  platform: search.platform,
783
+ targetAppVersion: search.targetAppVersion,
762
784
  page: search.page,
763
785
  after: search.after,
764
786
  before: search.before
@@ -775,14 +797,16 @@ function useFilterParams() {
775
797
  const getNextFilters = (newFilters) => {
776
798
  const hasChannel = Object.hasOwn(newFilters, "channel");
777
799
  const hasPlatform = Object.hasOwn(newFilters, "platform");
800
+ const hasTargetAppVersion = Object.hasOwn(newFilters, "targetAppVersion");
778
801
  const hasPage = Object.hasOwn(newFilters, "page");
779
802
  const hasAfter = Object.hasOwn(newFilters, "after");
780
803
  const hasBefore = Object.hasOwn(newFilters, "before");
781
- const shouldResetPagination = hasChannel || hasPlatform;
804
+ const shouldResetPagination = hasChannel || hasPlatform || hasTargetAppVersion;
782
805
  const nextPage = hasPage && newFilters.page !== void 0 && newFilters.page > 1 ? newFilters.page : void 0;
783
806
  return {
784
807
  channel: hasChannel ? newFilters.channel : filters.channel,
785
808
  platform: hasPlatform ? newFilters.platform : filters.platform,
809
+ targetAppVersion: hasTargetAppVersion ? newFilters.targetAppVersion : filters.targetAppVersion,
786
810
  page: shouldResetPagination ? void 0 : hasPage ? nextPage : filters.page,
787
811
  after: shouldResetPagination ? void 0 : hasAfter ? newFilters.after : filters.after,
788
812
  before: shouldResetPagination ? void 0 : hasBefore ? newFilters.before : filters.before
@@ -813,6 +837,7 @@ function useFilterParams() {
813
837
  navigateWithSearch({
814
838
  channel: void 0,
815
839
  platform: void 0,
840
+ targetAppVersion: void 0,
816
841
  page: void 0,
817
842
  after: void 0,
818
843
  before: void 0,
@@ -1203,7 +1228,7 @@ function getTargetAppVersionValidation(value) {
1203
1228
  error: "Invalid target app version",
1204
1229
  normalizedRange: null
1205
1230
  };
1206
- const normalizedRange = import_semver.default.validRange(normalizedValue);
1231
+ const normalizedRange = normalizeRange(normalizedValue);
1207
1232
  if (!normalizedRange) return {
1208
1233
  error: "Invalid target app version",
1209
1234
  normalizedRange: null
@@ -2342,7 +2367,7 @@ function DeleteStatusIcon({ status }) {
2342
2367
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TooltipContent, { children: label })] });
2343
2368
  }
2344
2369
  function SelectedBundlesDeleteDialog({ bundles, open, onOpenChange, onComplete }) {
2345
- const deleteBundleMutation = useDeleteBundleMutation();
2370
+ const deleteBundlesMutation = useDeleteBundlesMutation();
2346
2371
  const [phase, setPhase] = (0, import_react.useState)("confirming");
2347
2372
  const [items, setItems] = (0, import_react.useState)(() => createDeleteItems(bundles));
2348
2373
  const isDeleting = phase === "deleting";
@@ -2351,15 +2376,8 @@ function SelectedBundlesDeleteDialog({ bundles, open, onOpenChange, onComplete }
2351
2376
  const failedBundleIds = items.filter((item) => item.status === "failed").map((item) => item.bundle.id);
2352
2377
  const hasFailures = failedBundleIds.length > 0;
2353
2378
  const title = phase === "confirming" ? "Delete selected bundles?" : "Deleting bundles";
2354
- const description = phase === "confirming" ? `This action cannot be undone. This will permanently delete ${bundles.length} bundles and remove them from storage.` : `${activeCount} of ${totalCount} delete requests finished.`;
2355
- const deleteButtonLabel = (0, import_react.useMemo)(() => {
2356
- if (!isDeleting) return "Delete";
2357
- return `Deleting ${Math.min(activeCount + 1, totalCount)}/${totalCount}`;
2358
- }, [
2359
- activeCount,
2360
- isDeleting,
2361
- totalCount
2362
- ]);
2379
+ const description = phase === "confirming" ? `This action cannot be undone. This deletes ${bundles.length} bundle records and schedules artifact cleanup; shared assets are reclaimed by storage prune.` : phase === "deleting" ? `Deleting ${totalCount} bundles in one batch.` : `${activeCount} of ${totalCount} delete requests finished.`;
2380
+ const deleteButtonLabel = isDeleting ? "Deleting..." : "Delete";
2363
2381
  (0, import_react.useEffect)(() => {
2364
2382
  if (open && phase === "confirming") setItems(createDeleteItems(bundles));
2365
2383
  }, [
@@ -2378,44 +2396,36 @@ function SelectedBundlesDeleteDialog({ bundles, open, onOpenChange, onComplete }
2378
2396
  const runDeletion = async (bundleIds) => {
2379
2397
  if (isDeleting || bundleIds.length === 0) return;
2380
2398
  const bundleIdSet = new Set(bundleIds);
2381
- const deletedBundleIds = [];
2382
- const nextFailedBundleIds = [];
2383
2399
  setPhase("deleting");
2384
2400
  setItems((currentItems) => currentItems.map((item) => bundleIdSet.has(item.bundle.id) ? {
2385
2401
  bundle: item.bundle,
2386
- status: "queued"
2402
+ status: "deleting"
2387
2403
  } : item));
2388
- for (const bundleId of bundleIds) {
2389
- setItems((currentItems) => currentItems.map((item) => item.bundle.id === bundleId ? {
2404
+ try {
2405
+ const result = await deleteBundlesMutation.mutateAsync({ bundleIds: [...bundleIds] });
2406
+ setItems((currentItems) => currentItems.map((item) => bundleIdSet.has(item.bundle.id) ? {
2390
2407
  bundle: item.bundle,
2391
- status: "deleting"
2408
+ status: "deleted"
2392
2409
  } : item));
2393
- try {
2394
- await deleteBundleMutation.mutateAsync({ bundleId });
2395
- deletedBundleIds.push(bundleId);
2396
- setItems((currentItems) => currentItems.map((item) => item.bundle.id === bundleId ? {
2397
- bundle: item.bundle,
2398
- status: "deleted"
2399
- } : item));
2400
- } catch (error) {
2401
- nextFailedBundleIds.push(bundleId);
2402
- setItems((currentItems) => currentItems.map((item) => item.bundle.id === bundleId ? {
2403
- bundle: item.bundle,
2404
- message: getDeleteErrorMessage(error),
2405
- status: "failed"
2406
- } : item));
2407
- }
2408
- }
2409
- setPhase("complete");
2410
- onComplete({
2411
- deletedBundleIds,
2412
- failedBundleIds: nextFailedBundleIds
2413
- });
2414
- if (nextFailedBundleIds.length > 0) {
2415
- toast.error(`${deletedBundleIds.length} deleted, ${nextFailedBundleIds.length} failed`);
2416
- return;
2410
+ setPhase("complete");
2411
+ onComplete({
2412
+ deletedBundleIds: bundleIds,
2413
+ failedBundleIds: []
2414
+ });
2415
+ toast.success(result.missingBundleIds.length > 0 ? `${result.deletedBundleIds.length} deleted, ${result.missingBundleIds.length} already absent` : `${bundleIds.length} bundles deleted successfully`);
2416
+ } catch (error) {
2417
+ setItems((currentItems) => currentItems.map((item) => bundleIdSet.has(item.bundle.id) ? {
2418
+ bundle: item.bundle,
2419
+ message: getDeleteErrorMessage(error),
2420
+ status: "failed"
2421
+ } : item));
2422
+ setPhase("complete");
2423
+ onComplete({
2424
+ deletedBundleIds: [],
2425
+ failedBundleIds: bundleIds
2426
+ });
2427
+ toast.error(`0 deleted, ${bundleIds.length} failed`);
2417
2428
  }
2418
- toast.success(`${deletedBundleIds.length} bundles deleted successfully`);
2419
2429
  };
2420
2430
  const handleDelete = () => {
2421
2431
  runDeletion(items.map((item) => item.bundle.id));
@@ -2897,7 +2907,14 @@ function BundlesTable({ bundles, pagination, expandedBundleId, selectedBundleId,
2897
2907
  function FilterToolbar() {
2898
2908
  const { filters, setFilters, resetFilters } = useFilterParams();
2899
2909
  const { data: channels = [] } = useChannelsQuery();
2900
- const hasActiveFilters = filters.channel || filters.platform;
2910
+ const [targetAppVersion, setTargetAppVersion] = (0, import_react.useState)(filters.targetAppVersion ?? "");
2911
+ (0, import_react.useEffect)(() => {
2912
+ setTargetAppVersion(filters.targetAppVersion ?? "");
2913
+ }, [filters.targetAppVersion]);
2914
+ const hasActiveFilters = filters.channel || filters.platform || filters.targetAppVersion;
2915
+ const applyTargetAppVersion = () => {
2916
+ setFilters({ targetAppVersion: targetAppVersion.trim() || void 0 });
2917
+ };
2901
2918
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
2902
2919
  className: "sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-2 border-b bg-background px-3 py-3 sm:h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:py-0 sm:backdrop-blur-sm",
2903
2920
  children: [
@@ -2930,6 +2947,17 @@ function FilterToolbar() {
2930
2947
  })
2931
2948
  ] })]
2932
2949
  }),
2950
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Input, {
2951
+ "aria-label": "Target app version",
2952
+ className: "h-8 w-full min-w-[132px] text-xs sm:w-[160px]",
2953
+ placeholder: "Target version",
2954
+ value: targetAppVersion,
2955
+ onBlur: applyTargetAppVersion,
2956
+ onChange: (event) => setTargetAppVersion(event.target.value),
2957
+ onKeyDown: (event) => {
2958
+ if (event.key === "Enter") applyTargetAppVersion();
2959
+ }
2960
+ }),
2933
2961
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Select$1, {
2934
2962
  value: filters.channel || "all",
2935
2963
  onValueChange: (value) => setFilters({ channel: value === "all" ? void 0 : value }),
@@ -2961,6 +2989,7 @@ function BundlesPage() {
2961
2989
  const { data: bundlesData, isLoading } = useBundlesQuery({
2962
2990
  channel: filters.channel,
2963
2991
  platform: filters.platform,
2992
+ targetAppVersion: filters.targetAppVersion,
2964
2993
  page: filters.page,
2965
2994
  after: filters.after,
2966
2995
  before: filters.before,
@@ -3,7 +3,7 @@ import { a as X_TSS_RAW_RESPONSE, d as getStartOptions, f as isRedirect, g as sa
3
3
  import { u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
4
4
  import { P as require_jsx_runtime } from "../_libs/@radix-ui/react-alert-dialog+[...].mjs";
5
5
  import { n as defineHandlerCallback, o as RouterProvider, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
6
- import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-DVQ3oVr1.mjs";
6
+ import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-CgwgZ0-i.mjs";
7
7
  import { PassThrough, Readable } from "node:stream";
8
8
  import { AsyncLocalStorage } from "node:async_hooks";
9
9
  require_react();
@@ -3831,7 +3831,7 @@ var defaultSerovalPlugins = [
3831
3831
  * the dev styles URL for route-scoped CSS collection.
3832
3832
  */
3833
3833
  async function getStartManifest(matchedRoutes) {
3834
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BroBMdSR.mjs");
3834
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-Bpx52WOU.mjs");
3835
3835
  const startManifest = tsrStartManifest();
3836
3836
  let routes = startManifest.routes;
3837
3837
  routes[rootRouteId];
@@ -5359,7 +5359,7 @@ var getBaseManifest = getProdBaseManifest;
5359
5359
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5360
5360
  async function loadEntries() {
5361
5361
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5362
- import("./router-CIjEvqDS.mjs"),
5362
+ import("./router-C3hqEy3k.mjs"),
5363
5363
  import("./start-02sLteYG.mjs"),
5364
5364
  import("./empty-plugin-adapters-B4HCzgmM.mjs")
5365
5365
  ]);
@@ -1,19 +1,19 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-BroBMdSR.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-Bpx52WOU.js
2
2
  var tsrStartManifest = () => ({ routes: {
3
3
  __root__: {
4
4
  filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/__root.tsx",
5
5
  children: ["/"],
6
- preloads: ["/assets/index-CCUspZZV.js", "/assets/dist-DJX53faP.js"],
6
+ preloads: ["/assets/index-Iylis5kY.js", "/assets/dist-DJX53faP.js"],
7
7
  scripts: [{ attrs: {
8
8
  type: "module",
9
9
  async: !0,
10
- src: "/assets/index-CCUspZZV.js"
10
+ src: "/assets/index-Iylis5kY.js"
11
11
  } }]
12
12
  },
13
13
  "/": {
14
14
  filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/index.tsx",
15
15
  children: void 0,
16
- preloads: ["/assets/routes-D0t6y5Fr.js"]
16
+ preloads: ["/assets/routes-HT21hs0C.js"]
17
17
  }
18
18
  } });
19
19
  //#endregion
@@ -11,131 +11,131 @@ var headers = ((m) => function headersRouteRule(event) {
11
11
  //#endregion
12
12
  //#region #nitro/virtual/public-assets-data
13
13
  var public_assets_data_default = {
14
- "/apple-touch-icon.png": {
15
- "type": "image/png",
16
- "etag": "\"329e-uyxOmLQHjRnOIdaE3FE7O/uZ9l4\"",
17
- "mtime": "2026-08-06T01:49:41.506Z",
18
- "size": 12958,
19
- "path": "../public/apple-touch-icon.png"
20
- },
21
14
  "/favicon-16x16.png": {
22
15
  "type": "image/png",
23
16
  "etag": "\"240-h6ktCVLfjIcsDJuLwUXP4nCJxlI\"",
24
- "mtime": "2026-08-06T01:49:41.506Z",
17
+ "mtime": "2026-08-13T07:56:49.356Z",
25
18
  "size": 576,
26
19
  "path": "../public/favicon-16x16.png"
27
20
  },
28
21
  "/favicon-32x32.png": {
29
22
  "type": "image/png",
30
23
  "etag": "\"4f0-0qQrV3Eq3PzIigrp+8htf8vFCYA\"",
31
- "mtime": "2026-08-06T01:49:41.506Z",
24
+ "mtime": "2026-08-13T07:56:49.356Z",
32
25
  "size": 1264,
33
26
  "path": "../public/favicon-32x32.png"
34
27
  },
35
28
  "/favicon.ico": {
36
29
  "type": "image/vnd.microsoft.icon",
37
30
  "etag": "\"3c2e-eMwmbJNNg6G+Uu+rqWtuvtI2Om4\"",
38
- "mtime": "2026-08-06T01:49:41.506Z",
31
+ "mtime": "2026-08-13T07:56:49.356Z",
39
32
  "size": 15406,
40
33
  "path": "../public/favicon.ico"
41
34
  },
42
35
  "/logo.svg": {
43
36
  "type": "image/svg+xml",
44
37
  "etag": "\"478-zKvD9Jp5dDLCBmng0McewYMBxfs\"",
45
- "mtime": "2026-08-06T01:49:41.507Z",
38
+ "mtime": "2026-08-13T07:56:49.357Z",
46
39
  "size": 1144,
47
40
  "path": "../public/logo.svg"
48
41
  },
49
42
  "/manifest.json": {
50
43
  "type": "application/json",
51
44
  "etag": "\"258-CQdbkGDhbZhU+yrcSXanXKWFEpw\"",
52
- "mtime": "2026-08-06T01:49:41.507Z",
45
+ "mtime": "2026-08-13T07:56:49.357Z",
53
46
  "size": 600,
54
47
  "path": "../public/manifest.json"
55
48
  },
56
49
  "/robots.txt": {
57
50
  "type": "text/plain; charset=utf-8",
58
51
  "etag": "\"43-BEzmj4PuhUNHX+oW9uOnPSihxtU\"",
59
- "mtime": "2026-08-06T01:49:41.507Z",
52
+ "mtime": "2026-08-13T07:56:49.357Z",
60
53
  "size": 67,
61
54
  "path": "../public/robots.txt"
62
55
  },
56
+ "/apple-touch-icon.png": {
57
+ "type": "image/png",
58
+ "etag": "\"329e-uyxOmLQHjRnOIdaE3FE7O/uZ9l4\"",
59
+ "mtime": "2026-08-13T07:56:49.356Z",
60
+ "size": 12958,
61
+ "path": "../public/apple-touch-icon.png"
62
+ },
63
63
  "/assets/dist-DJX53faP.js": {
64
64
  "type": "text/javascript; charset=utf-8",
65
65
  "etag": "\"2f040-7YsjRPYPOzs727quwj97y+YTXIY\"",
66
- "mtime": "2026-08-06T01:49:40.296Z",
66
+ "mtime": "2026-08-13T07:56:48.021Z",
67
67
  "size": 192576,
68
68
  "path": "../public/assets/dist-DJX53faP.js"
69
69
  },
70
+ "/assets/index-Iylis5kY.js": {
71
+ "type": "text/javascript; charset=utf-8",
72
+ "etag": "\"448c7-Y0mf8ainq/iep6OX+wNwaKsdLSc\"",
73
+ "mtime": "2026-08-13T07:56:48.020Z",
74
+ "size": 280775,
75
+ "path": "../public/assets/index-Iylis5kY.js"
76
+ },
70
77
  "/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2": {
71
78
  "type": "font/woff2",
72
79
  "etag": "\"6568-cF1iUGbboMFZ8TfnP5HiMgl9II0\"",
73
- "mtime": "2026-08-06T01:49:40.296Z",
80
+ "mtime": "2026-08-13T07:56:48.021Z",
74
81
  "size": 25960,
75
82
  "path": "../public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2"
76
83
  },
77
84
  "/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2": {
78
85
  "type": "font/woff2",
79
86
  "etag": "\"493c-n3Oy9D6jvzfMjpClqox+Zo7ERQQ\"",
80
- "mtime": "2026-08-06T01:49:40.297Z",
87
+ "mtime": "2026-08-13T07:56:48.021Z",
81
88
  "size": 18748,
82
89
  "path": "../public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2"
83
90
  },
84
91
  "/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2": {
85
92
  "type": "font/woff2",
86
93
  "etag": "\"2be0-BP5iTzJeB8nLqYAgKpWNi5o1Zm8\"",
87
- "mtime": "2026-08-06T01:49:40.297Z",
94
+ "mtime": "2026-08-13T07:56:48.021Z",
88
95
  "size": 11232,
89
96
  "path": "../public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2"
90
97
  },
91
98
  "/assets/inter-greek-wght-normal-CkhJZR-_.woff2": {
92
99
  "type": "font/woff2",
93
100
  "etag": "\"4a34-xor/hj4YNqI52zFecXnUbzQ4Xs4\"",
94
- "mtime": "2026-08-06T01:49:40.297Z",
101
+ "mtime": "2026-08-13T07:56:48.021Z",
95
102
  "size": 18996,
96
103
  "path": "../public/assets/inter-greek-wght-normal-CkhJZR-_.woff2"
97
104
  },
98
105
  "/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2": {
99
106
  "type": "font/woff2",
100
107
  "etag": "\"14c4c-zz61D7IQFMB9QxHvTAOk/Vh4ibQ\"",
101
- "mtime": "2026-08-06T01:49:40.297Z",
108
+ "mtime": "2026-08-13T07:56:48.021Z",
102
109
  "size": 85068,
103
110
  "path": "../public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2"
104
111
  },
105
112
  "/assets/inter-latin-wght-normal-Dx4kXJAl.woff2": {
106
113
  "type": "font/woff2",
107
114
  "etag": "\"bc80-8R1ym7Ck2DUNLqPQ/AYs9u8tUpg\"",
108
- "mtime": "2026-08-06T01:49:40.297Z",
115
+ "mtime": "2026-08-13T07:56:48.021Z",
109
116
  "size": 48256,
110
117
  "path": "../public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2"
111
118
  },
112
119
  "/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2": {
113
120
  "type": "font/woff2",
114
121
  "etag": "\"280c-nBythjoDQ0+5wVAendJ6wU7Xz2M\"",
115
- "mtime": "2026-08-06T01:49:40.297Z",
122
+ "mtime": "2026-08-13T07:56:48.021Z",
116
123
  "size": 10252,
117
124
  "path": "../public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2"
118
125
  },
119
- "/assets/routes-D0t6y5Fr.js": {
126
+ "/assets/routes-HT21hs0C.js": {
120
127
  "type": "text/javascript; charset=utf-8",
121
- "etag": "\"46ef6-I2/7U7JQ1XjrhOIL/DUajNoTC1Q\"",
122
- "mtime": "2026-08-06T01:49:40.296Z",
123
- "size": 290550,
124
- "path": "../public/assets/routes-D0t6y5Fr.js"
128
+ "etag": "\"42aff-ijr0WyUxqj3KtRhkJOrtK4xE8RY\"",
129
+ "mtime": "2026-08-13T07:56:48.021Z",
130
+ "size": 273151,
131
+ "path": "../public/assets/routes-HT21hs0C.js"
125
132
  },
126
- "/assets/styles-C0q26dS-.css": {
133
+ "/assets/styles-C0Re4quB.css": {
127
134
  "type": "text/css; charset=utf-8",
128
- "etag": "\"18966-45APsPquRTTpvKm1cDABPCrOZhs\"",
129
- "mtime": "2026-08-06T01:49:40.297Z",
130
- "size": 100710,
131
- "path": "../public/assets/styles-C0q26dS-.css"
132
- },
133
- "/assets/index-CCUspZZV.js": {
134
- "type": "text/javascript; charset=utf-8",
135
- "etag": "\"4485b-DRNtfLDdFR321J+PhmPr50J6wmg\"",
136
- "mtime": "2026-08-06T01:49:40.296Z",
137
- "size": 280667,
138
- "path": "../public/assets/index-CCUspZZV.js"
135
+ "etag": "\"18983-iQ64N/MMT2ZA9Kd6OSvDGJFw80E\"",
136
+ "mtime": "2026-08-13T07:56:48.022Z",
137
+ "size": 100739,
138
+ "path": "../public/assets/styles-C0Re4quB.css"
139
139
  }
140
140
  };
141
141
  //#endregion
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hot-updater/console",
3
3
  "type": "module",
4
- "version": "0.35.11",
4
+ "version": "0.36.0",
5
5
  "files": [
6
6
  ".output",
7
7
  "package.json"
@@ -13,8 +13,8 @@
13
13
  "@hot-updater/cli-tools": "*"
14
14
  },
15
15
  "dependencies": {
16
- "@hot-updater/bsdiff": "0.35.11",
17
- "@hot-updater/server": "0.35.11"
16
+ "@hot-updater/bsdiff": "0.36.0",
17
+ "@hot-updater/server": "0.36.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@base-ui/react": "^1.3.0",
@@ -35,7 +35,6 @@
35
35
  "@types/node": "^25.5.0",
36
36
  "@types/react": "^19.2.14",
37
37
  "@types/react-dom": "^19.2.0",
38
- "@types/semver": "^7.7.1",
39
38
  "@vitejs/plugin-react": "^6.0.1",
40
39
  "class-variance-authority": "^0.7.1",
41
40
  "clsx": "^2.1.1",
@@ -49,7 +48,6 @@
49
48
  "react": "^19.2.4",
50
49
  "react-dom": "^19.2.4",
51
50
  "react-grab": "^0.1.28",
52
- "semver": "^7.7.4",
53
51
  "shadcn": "^4.0.8",
54
52
  "sonner": "^2.0.7",
55
53
  "tailwind-merge": "^3.5.0",
@@ -59,14 +57,15 @@
59
57
  "tw-animate-css": "^1.4.0",
60
58
  "@typescript/native": "npm:typescript@^7.0.2",
61
59
  "typescript": "npm:@typescript/typescript6@^6.0.2",
60
+ "verkit": "0.3.2",
62
61
  "vite": "8.0.8",
63
62
  "vite-tsconfig-paths": "^6.1.1",
64
63
  "vitest": "4.1.4",
65
64
  "web-vitals": "^5.1.0",
66
- "@hot-updater/cli-tools": "0.35.11",
67
- "@hot-updater/core": "0.35.11",
68
- "@hot-updater/mock": "0.35.11",
69
- "@hot-updater/plugin-core": "0.35.11"
65
+ "@hot-updater/mock": "0.36.0",
66
+ "@hot-updater/core": "0.36.0",
67
+ "@hot-updater/plugin-core": "0.36.0",
68
+ "@hot-updater/cli-tools": "0.36.0"
70
69
  },
71
70
  "description": "React Native OTA solution for self-hosted",
72
71
  "license": "MIT",