@burdenoff/microfe-movethewheels 2026.1028.1 → 2026.1031.1

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 (40) hide show
  1. package/dist/MoveTheWheelsRoot.js +130 -122
  2. package/dist/MoveTheWheelsRoutes.js +55 -51
  3. package/dist/components/ExportStatusBanner.js +53 -0
  4. package/dist/components/marketplace/MarketplaceDialogs.js +524 -0
  5. package/dist/generated/wspace-types.d.ts +30737 -8505
  6. package/dist/hooks/useEntityExport.js +85 -0
  7. package/dist/hooks/useMarketplace.js +265 -0
  8. package/dist/movethewheels/components/ExportStatusBanner.d.ts +7 -0
  9. package/dist/movethewheels/components/marketplace/MarketplaceDialogs.d.ts +18 -0
  10. package/dist/movethewheels/hooks/useEntityExport.d.ts +32 -0
  11. package/dist/movethewheels/hooks/useMarketplace.d.ts +121 -0
  12. package/dist/movethewheels/pages/MarketplacePage.d.ts +1 -0
  13. package/dist/movethewheels/utils/entityExport.d.ts +64 -0
  14. package/dist/node_modules/lucide-react/dist/esm/icons/badge-check.js +11 -0
  15. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js +8 -0
  16. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +8 -0
  17. package/dist/node_modules/lucide-react/dist/esm/icons/pencil.js +11 -0
  18. package/dist/node_modules/lucide-react/dist/esm/icons/store.js +26 -0
  19. package/dist/pages/CustomersPage.js +64 -58
  20. package/dist/pages/DriversPage.js +113 -107
  21. package/dist/pages/MarketplacePage.js +503 -0
  22. package/dist/pages/OrdersListPage.js +85 -79
  23. package/dist/pages/ProductsPage.js +63 -57
  24. package/dist/pages/VehiclesPage.js +91 -85
  25. package/dist/utils/entityExport.js +54 -0
  26. package/package.json +3 -2
  27. package/src/generated/wspace-types.ts +34017 -8803
  28. package/src/movethewheels/MoveTheWheelsRoot.tsx +8 -0
  29. package/src/movethewheels/MoveTheWheelsRoutes.tsx +4 -0
  30. package/src/movethewheels/components/ExportStatusBanner.tsx +78 -0
  31. package/src/movethewheels/components/marketplace/MarketplaceDialogs.tsx +633 -0
  32. package/src/movethewheels/hooks/useEntityExport.ts +130 -0
  33. package/src/movethewheels/hooks/useMarketplace.ts +526 -0
  34. package/src/movethewheels/pages/CustomersPage.tsx +11 -2
  35. package/src/movethewheels/pages/DriversPage.tsx +11 -2
  36. package/src/movethewheels/pages/MarketplacePage.tsx +571 -0
  37. package/src/movethewheels/pages/OrdersListPage.tsx +13 -2
  38. package/src/movethewheels/pages/ProductsPage.tsx +11 -2
  39. package/src/movethewheels/pages/VehiclesPage.tsx +11 -2
  40. package/src/movethewheels/utils/entityExport.ts +140 -0
@@ -2,145 +2,151 @@ import { CircleCheck as e } from "../node_modules/lucide-react/dist/esm/icons/ci
2
2
  import { Download as t } from "../node_modules/lucide-react/dist/esm/icons/download.js";
3
3
  import { Filter as n } from "../node_modules/lucide-react/dist/esm/icons/filter.js";
4
4
  import { Plus as r } from "../node_modules/lucide-react/dist/esm/icons/plus.js";
5
- import { RefreshCw as ee } from "../node_modules/lucide-react/dist/esm/icons/refresh-cw.js";
6
- import { Route as i } from "../node_modules/lucide-react/dist/esm/icons/route.js";
7
- import { Truck as a } from "../node_modules/lucide-react/dist/esm/icons/truck.js";
8
- import { Wrench as o } from "../node_modules/lucide-react/dist/esm/icons/wrench.js";
9
- import { joinPath as s } from "../utils/navigation.js";
10
- import { useMoveTheWheels as c } from "../providers/MoveTheWheelsProvider.js";
11
- import { useFleetStats as l, useVehicles as u } from "../hooks/useFleet.js";
12
- import { Button as d, Card as f, CardContent as p, Progress as m, Select as h, SelectContent as g, SelectItem as _, SelectTrigger as v, SelectValue as y } from "../components/ui.js";
13
- import { PageLayout as b } from "../components/PageLayout.js";
14
- import { MetricCard as x, MetricGrid as S } from "../components/MetricCard.js";
15
- import { VEHICLE_STATUS_LABELS as C } from "../constants/index.js";
16
- import { StatusBadge as w, VehicleTypeBadge as T } from "../components/StatusBadge.js";
17
- import { DataTable as E } from "../components/DataTable.js";
18
- import { useDebouncedValue as D } from "../hooks/useDebouncedValue.js";
19
- import { useState as O } from "react";
20
- import { jsx as k, jsxs as A } from "react/jsx-runtime";
21
- import { CTAOverflowMenu as j, PagePurpose as M } from "@burdenoff/fe-libs/ui";
5
+ import { RefreshCw as i } from "../node_modules/lucide-react/dist/esm/icons/refresh-cw.js";
6
+ import { Route as a } from "../node_modules/lucide-react/dist/esm/icons/route.js";
7
+ import { Truck as o } from "../node_modules/lucide-react/dist/esm/icons/truck.js";
8
+ import { Wrench as s } from "../node_modules/lucide-react/dist/esm/icons/wrench.js";
9
+ import { joinPath as c } from "../utils/navigation.js";
10
+ import { useMoveTheWheels as l } from "../providers/MoveTheWheelsProvider.js";
11
+ import { useFleetStats as u, useVehicles as d } from "../hooks/useFleet.js";
12
+ import { Button as f, Card as ee, CardContent as p, Progress as m, Select as h, SelectContent as g, SelectItem as te, SelectTrigger as ne, SelectValue as re } from "../components/ui.js";
13
+ import { PageLayout as ie } from "../components/PageLayout.js";
14
+ import { MetricCard as _, MetricGrid as v } from "../components/MetricCard.js";
15
+ import { VEHICLE_STATUS_LABELS as y } from "../constants/index.js";
16
+ import { StatusBadge as b, VehicleTypeBadge as x } from "../components/StatusBadge.js";
17
+ import { DataTable as S } from "../components/DataTable.js";
18
+ import { useDebouncedValue as C } from "../hooks/useDebouncedValue.js";
19
+ import { useEntityExport as w } from "../hooks/useEntityExport.js";
20
+ import { ExportStatusBanner as T } from "../components/ExportStatusBanner.js";
21
+ import { useState as E } from "react";
22
+ import { jsx as D, jsxs as O } from "react/jsx-runtime";
23
+ import { CTAOverflowMenu as k, PagePurpose as A } from "@burdenoff/fe-libs/ui";
22
24
  //#region src/movethewheels/pages/VehiclesPage.tsx
23
- var N = [{
25
+ var j = [{
24
26
  value: "all",
25
27
  label: "All statuses"
26
- }, ...Object.entries(C).map(([e, t]) => ({
28
+ }, ...Object.entries(y).map(([e, t]) => ({
27
29
  value: e,
28
30
  label: t
29
31
  }))];
30
- function P() {
31
- let { basePath: C, navigate: P } = c(), [F, I] = O(0), [L, R] = O(25), [z, B] = O(""), [V, H] = O("all"), U = D(z), { vehicles: W, totalVehicles: G, hasMore: K, isLoading: q, error: J, refetch: Y } = u({
32
- limit: L,
33
- offset: F * L,
34
- search: U || void 0,
35
- status: V === "all" ? void 0 : V
36
- }), X = V !== "all" || z.length > 0, { stats: Z } = l(), Q = Z.totalVehicles, $ = (e) => {
37
- P && P(s(C, e));
32
+ function M() {
33
+ let { basePath: y, navigate: M } = l(), { state: N, isExporting: P, startExport: F, dismiss: ae } = w("vehicles", "vehicle"), [I, L] = E(0), [R, z] = E(25), [B, V] = E(""), [H, U] = E("all"), W = C(B), { vehicles: G, totalVehicles: K, hasMore: q, isLoading: J, error: Y, refetch: X } = d({
34
+ limit: R,
35
+ offset: I * R,
36
+ search: W || void 0,
37
+ status: H === "all" ? void 0 : H
38
+ }), oe = H !== "all" || B.length > 0, { stats: Z } = u(), Q = Z.totalVehicles, $ = (e) => {
39
+ M && M(c(y, e));
38
40
  };
39
- return /* @__PURE__ */ A(b, {
41
+ return /* @__PURE__ */ O(ie, {
40
42
  title: "Vehicles",
41
43
  subtitle: `${Q} vehicles in fleet`,
42
- icon: /* @__PURE__ */ k(a, { size: 24 }),
43
- headerActions: /* @__PURE__ */ k(j, {
44
+ icon: /* @__PURE__ */ D(o, { size: 24 }),
45
+ headerActions: /* @__PURE__ */ D(k, {
44
46
  primary: {
45
47
  label: "Add Vehicle",
46
- icon: /* @__PURE__ */ k(r, { size: 16 }),
48
+ icon: /* @__PURE__ */ D(r, { size: 16 }),
47
49
  onSelect: () => $("fleet/vehicles/new")
48
50
  },
49
51
  actions: [{
50
52
  label: "Refresh",
51
- icon: /* @__PURE__ */ k(ee, { size: 16 }),
52
- onSelect: () => Y()
53
+ icon: /* @__PURE__ */ D(i, { size: 16 }),
54
+ onSelect: () => X()
53
55
  }, {
54
- label: "Export",
55
- icon: /* @__PURE__ */ k(t, { size: 16 }),
56
- onSelect: () => $("import-export")
56
+ label: P ? "Exporting…" : "Export",
57
+ icon: /* @__PURE__ */ D(t, { size: 16 }),
58
+ onSelect: F
57
59
  }]
58
60
  }),
59
61
  children: [
60
- /* @__PURE__ */ k(M, {
61
- icon: /* @__PURE__ */ k(a, { size: 18 }),
62
+ /* @__PURE__ */ D(A, {
63
+ icon: /* @__PURE__ */ D(o, { size: 18 }),
62
64
  children: "Every truck, van and bike in your fleet. Monitor capacity, fuel level, mileage and maintenance status here so you always know which vehicles are road-ready before dispatching an order."
63
65
  }),
64
- /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("p", {
66
+ /* @__PURE__ */ D(T, {
67
+ state: N,
68
+ onDismiss: ae
69
+ }),
70
+ /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("p", {
65
71
  className: "mb-3 text-sm font-medium text-text-secondary",
66
72
  children: "Fleet at a glance"
67
- }), /* @__PURE__ */ A(S, {
73
+ }), /* @__PURE__ */ O(v, {
68
74
  columns: 4,
69
75
  children: [
70
- /* @__PURE__ */ k(x, {
76
+ /* @__PURE__ */ D(_, {
71
77
  label: "Total vehicles",
72
78
  value: Q,
73
- icon: /* @__PURE__ */ k(a, { size: 20 }),
79
+ icon: /* @__PURE__ */ D(o, { size: 20 }),
74
80
  accent: "brand"
75
81
  }),
76
- /* @__PURE__ */ k(x, {
82
+ /* @__PURE__ */ D(_, {
77
83
  label: "Available now",
78
84
  value: Z.vehiclesByStatus.available,
79
- icon: /* @__PURE__ */ k(e, { size: 20 }),
85
+ icon: /* @__PURE__ */ D(e, { size: 20 }),
80
86
  accent: "success",
81
87
  subtitle: "Ready to dispatch"
82
88
  }),
83
- /* @__PURE__ */ k(x, {
89
+ /* @__PURE__ */ D(_, {
84
90
  label: "On assignment",
85
91
  value: Z.vehiclesByStatus.assigned,
86
- icon: /* @__PURE__ */ k(i, { size: 20 }),
92
+ icon: /* @__PURE__ */ D(a, { size: 20 }),
87
93
  accent: "blue"
88
94
  }),
89
- /* @__PURE__ */ k(x, {
95
+ /* @__PURE__ */ D(_, {
90
96
  label: "In maintenance",
91
97
  value: Z.vehiclesByStatus.maintenance,
92
- icon: /* @__PURE__ */ k(o, { size: 20 }),
98
+ icon: /* @__PURE__ */ D(s, { size: 20 }),
93
99
  accent: "warning"
94
100
  })
95
101
  ]
96
102
  })] }),
97
- /* @__PURE__ */ k(f, { children: /* @__PURE__ */ k(p, {
103
+ /* @__PURE__ */ D(ee, { children: /* @__PURE__ */ D(p, {
98
104
  className: "p-4",
99
- children: /* @__PURE__ */ A("div", {
105
+ children: /* @__PURE__ */ O("div", {
100
106
  className: "flex flex-wrap items-center gap-4",
101
107
  children: [
102
- /* @__PURE__ */ A("div", {
108
+ /* @__PURE__ */ O("div", {
103
109
  className: "flex items-center gap-2",
104
- children: [/* @__PURE__ */ k(n, {
110
+ children: [/* @__PURE__ */ D(n, {
105
111
  size: 16,
106
112
  className: "text-text-secondary"
107
- }), /* @__PURE__ */ k("span", {
113
+ }), /* @__PURE__ */ D("span", {
108
114
  className: "text-sm font-medium",
109
115
  children: "Filters:"
110
116
  })]
111
117
  }),
112
- /* @__PURE__ */ A(h, {
113
- value: V,
118
+ /* @__PURE__ */ O(h, {
119
+ value: H,
114
120
  onValueChange: (e) => {
115
- H(e), I(0);
121
+ U(e), L(0);
116
122
  },
117
- children: [/* @__PURE__ */ k(v, {
123
+ children: [/* @__PURE__ */ D(ne, {
118
124
  className: "w-[180px]",
119
- children: /* @__PURE__ */ k(y, { placeholder: "Status" })
120
- }), /* @__PURE__ */ k(g, { children: N.map((e) => /* @__PURE__ */ k(_, {
125
+ children: /* @__PURE__ */ D(re, { placeholder: "Status" })
126
+ }), /* @__PURE__ */ D(g, { children: j.map((e) => /* @__PURE__ */ D(te, {
121
127
  value: e.value,
122
128
  children: e.label
123
129
  }, e.value)) })]
124
130
  }),
125
- X && /* @__PURE__ */ k(d, {
131
+ oe && /* @__PURE__ */ D(f, {
126
132
  variant: "ghost",
127
133
  size: "sm",
128
134
  onClick: () => {
129
- H("all"), B(""), I(0);
135
+ U("all"), V(""), L(0);
130
136
  },
131
137
  children: "Clear filters"
132
138
  })
133
139
  ]
134
140
  })
135
141
  }) }),
136
- /* @__PURE__ */ k(E, {
142
+ /* @__PURE__ */ D(S, {
137
143
  columns: [
138
144
  {
139
145
  id: "vehicleNumber",
140
146
  header: "Vehicle #",
141
147
  accessorKey: "vehicleNumber",
142
148
  sortable: !0,
143
- cell: (e) => /* @__PURE__ */ k("span", {
149
+ cell: (e) => /* @__PURE__ */ D("span", {
144
150
  className: "font-medium",
145
151
  children: e.vehicleNumber
146
152
  })
@@ -149,19 +155,19 @@ function P() {
149
155
  id: "type",
150
156
  header: "Type",
151
157
  accessorKey: "type",
152
- cell: (e) => /* @__PURE__ */ k(T, { type: e.type })
158
+ cell: (e) => /* @__PURE__ */ D(x, { type: e.type })
153
159
  },
154
160
  {
155
161
  id: "details",
156
162
  header: "Vehicle",
157
- cell: (e) => /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A("p", {
163
+ cell: (e) => /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ O("p", {
158
164
  className: "font-medium",
159
165
  children: [
160
166
  e.make,
161
167
  " ",
162
168
  e.model
163
169
  ]
164
- }), /* @__PURE__ */ k("p", {
170
+ }), /* @__PURE__ */ D("p", {
165
171
  className: "text-sm text-text-secondary",
166
172
  children: e.year ?? "—"
167
173
  })] })
@@ -171,7 +177,7 @@ function P() {
171
177
  header: "Status",
172
178
  accessorKey: "status",
173
179
  sortable: !0,
174
- cell: (e) => /* @__PURE__ */ k(w, {
180
+ cell: (e) => /* @__PURE__ */ D(b, {
175
181
  status: e.status,
176
182
  type: "vehicle"
177
183
  })
@@ -179,9 +185,9 @@ function P() {
179
185
  {
180
186
  id: "capacity",
181
187
  header: "Capacity",
182
- cell: (e) => /* @__PURE__ */ A("div", {
188
+ cell: (e) => /* @__PURE__ */ O("div", {
183
189
  className: "text-sm",
184
- children: [/* @__PURE__ */ k("p", { children: e.capacity.weight === void 0 ? "—" : `${e.capacity.weight} kg` }), /* @__PURE__ */ k("p", {
190
+ children: [/* @__PURE__ */ D("p", { children: e.capacity.weight === void 0 ? "—" : `${e.capacity.weight} kg` }), /* @__PURE__ */ D("p", {
185
191
  className: "text-text-secondary",
186
192
  children: e.capacity.volume === void 0 ? "—" : `${e.capacity.volume} m³`
187
193
  })]
@@ -190,12 +196,12 @@ function P() {
190
196
  {
191
197
  id: "fuel",
192
198
  header: "Fuel Level",
193
- cell: (e) => e.fuelLevel === void 0 ? "-" : /* @__PURE__ */ A("div", {
199
+ cell: (e) => e.fuelLevel === void 0 ? "-" : /* @__PURE__ */ O("div", {
194
200
  className: "flex items-center gap-2",
195
- children: [/* @__PURE__ */ k(m, {
201
+ children: [/* @__PURE__ */ D(m, {
196
202
  value: e.fuelLevel,
197
203
  className: "w-16 h-2"
198
- }), /* @__PURE__ */ A("span", {
204
+ }), /* @__PURE__ */ O("span", {
199
205
  className: "text-sm",
200
206
  children: [e.fuelLevel, "%"]
201
207
  })]
@@ -209,10 +215,10 @@ function P() {
209
215
  cell: (e) => e.mileage ? `${e.mileage.toLocaleString()} mi` : "-"
210
216
  }
211
217
  ],
212
- data: W,
213
- isLoading: q,
214
- error: J,
215
- onRetry: Y,
218
+ data: G,
219
+ isLoading: J,
220
+ error: Y,
221
+ onRetry: X,
216
222
  searchable: !0,
217
223
  searchPlaceholder: "Search vehicles...",
218
224
  searchFields: [
@@ -220,20 +226,20 @@ function P() {
220
226
  "make",
221
227
  "model"
222
228
  ],
223
- searchQuery: z,
229
+ searchQuery: B,
224
230
  onSearchQueryChange: (e) => {
225
- B(e), I(0);
231
+ V(e), L(0);
226
232
  },
227
233
  onRowClick: (e) => $(`fleet/vehicles/${e.id}`),
228
234
  getRowId: (e) => e.id,
229
- pageIndex: F,
230
- pageSize: L,
231
- onPageChange: I,
235
+ pageIndex: I,
236
+ pageSize: R,
237
+ onPageChange: L,
232
238
  onPageSizeChange: (e) => {
233
- R(e), I(0);
239
+ z(e), L(0);
234
240
  },
235
- totalItems: G,
236
- hasNextPage: K,
241
+ totalItems: K,
242
+ hasNextPage: q,
237
243
  emptyIllustration: "empty-data",
238
244
  emptyTitle: "No vehicles yet",
239
245
  emptyDescription: "Add vehicles to your fleet to start assigning them to deliveries."
@@ -242,4 +248,4 @@ function P() {
242
248
  });
243
249
  }
244
250
  //#endregion
245
- export { P as default };
251
+ export { M as default };
@@ -0,0 +1,54 @@
1
+ //#region src/movethewheels/utils/entityExport.ts
2
+ var e = {
3
+ customers: "movethewheels_customers",
4
+ drivers: "movethewheels_drivers",
5
+ orders: "movethewheels_delivery_jobs",
6
+ products: "movethewheels_cargo_items",
7
+ vehicles: "movethewheels_vehicles"
8
+ }, t = "\n mutation StartMovethewheelsEntityExport($input: ExportMtwEntitiesInput!) {\n exportMtwEntities(input: $input) {\n id\n status\n downloadUrl\n }\n }\n", n = "\n query GetMovethewheelsExportJob($id: ID!) {\n getExportJob(id: $id) {\n id\n status\n progress\n downloadUrl\n errorMessage\n }\n }\n", r = new Set([
9
+ "FAILED",
10
+ "CANCELLED",
11
+ "EXPIRED"
12
+ ]);
13
+ function i(e) {
14
+ return e.status === "COMPLETED" ? e.downloadUrl ? {
15
+ kind: "ready",
16
+ jobId: e.id,
17
+ downloadUrl: e.downloadUrl
18
+ } : {
19
+ kind: "failed",
20
+ jobId: e.id,
21
+ message: "The export finished without a download link."
22
+ } : r.has(e.status) ? {
23
+ kind: "failed",
24
+ jobId: e.id,
25
+ message: e.errorMessage?.trim() || `The export was ${e.status.toLowerCase()}.`
26
+ } : null;
27
+ }
28
+ var a = (e) => new Promise((t) => setTimeout(t, e));
29
+ async function o(e, t, { intervalMs: n = 2e3, timeoutMs: r = 9e4, sleep: o = a, now: s = Date.now, signal: c } = {}) {
30
+ let l = i(e);
31
+ if (l) return l;
32
+ let u = s() + r;
33
+ for (; s() < u && !(c?.aborted || (await o(n), c?.aborted));) {
34
+ let n = await t(e.id);
35
+ if (!n) return {
36
+ kind: "failed",
37
+ jobId: e.id,
38
+ message: "The export job could not be found."
39
+ };
40
+ let r = i(n);
41
+ if (r) return r;
42
+ }
43
+ return {
44
+ kind: "pending",
45
+ jobId: e.id
46
+ };
47
+ }
48
+ function s(e) {
49
+ if (typeof document > "u") return;
50
+ let t = document.createElement("a");
51
+ t.href = e, t.rel = "noopener", document.body.appendChild(t), t.click(), t.remove();
52
+ }
53
+ //#endregion
54
+ export { n as GET_MTW_EXPORT_JOB_QUERY, e as MTW_EXPORT_ENTITY_TYPES, t as START_MTW_EXPORT_MUTATION, s as triggerUrlDownload, o as waitForExportJob };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-movethewheels",
3
- "version": "2026.1028.1",
3
+ "version": "2026.1031.1",
4
4
  "description": "Burdenoff MoveTheWheels Microfrontend - Logistics & Supply Chain Management Platform",
5
5
  "type": "module",
6
6
  "files": [
@@ -37,7 +37,7 @@
37
37
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
38
38
  "type:check": "bash scripts/build-limits.sh tsc --noEmit",
39
39
  "validate:schema-drift": "graphql-schema-drift",
40
- "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run validate:schema-drift && bun run lint:sanity && bun run format && bun run type:check && bun run verify:live-logistics-contract && bun run verify:empty-reuse-retry && bun run verify:empty-reuse-recovery && bun run verify:trip-utilization-input && bun run verify:trip-draft-context && bun run verify:stock-binding-input && bun run verify:stock-observation-input && bun run verify:pending-pick-input && bun run verify:pick-review-ack && bun run verify:driver-license-expiry && bun run verify:freight-input && bun run verify:freight-recovery && bun run verify:freight-commercial && bun run verify:freight-invoice && bun run verify:procedure-input && bun run verify:consolidation && bun run verify:multimodal-single-attempt && bun run verify:workspace-predispatch && bun run verify:tracking-quality-outcomes && bun run verify:shipment-status-authority && bun run verify:free-time-permissions && bun run verify:core-codegen && bun run verify:order-vehicle-hold && bun run verify:pallet-preview && bun run verify:consumed-fuel-preview && bun run build && bun run build-storybook'",
40
+ "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run validate:schema-drift && bun run lint:sanity && bun run format && bun run type:check && bun run verify:live-logistics-contract && bun run verify:empty-reuse-retry && bun run verify:empty-reuse-recovery && bun run verify:trip-utilization-input && bun run verify:trip-draft-context && bun run verify:stock-binding-input && bun run verify:stock-observation-input && bun run verify:pending-pick-input && bun run verify:pick-review-ack && bun run verify:driver-license-expiry && bun run verify:freight-input && bun run verify:freight-recovery && bun run verify:freight-commercial && bun run verify:freight-invoice && bun run verify:procedure-input && bun run verify:consolidation && bun run verify:multimodal-single-attempt && bun run verify:workspace-predispatch && bun run verify:tracking-quality-outcomes && bun run verify:shipment-status-authority && bun run verify:free-time-permissions && bun run verify:core-codegen && bun run verify:order-vehicle-hold && bun run verify:pallet-preview && bun run verify:entity-export && bun run verify:consumed-fuel-preview && bun run build && bun run build-storybook'",
41
41
  "storybook": "storybook dev -p 6006",
42
42
  "build-storybook": "storybook build",
43
43
  "test:storybook": "vitest run --project=storybook",
@@ -71,6 +71,7 @@
71
71
  "verify:freight-invoice": "bun test scripts/verify-invoice-comparison.test.ts && bun scripts/verify-invoice-recovery-hook.mjs",
72
72
  "verify:driver-license-expiry": "bun test scripts/check-driver-license-expiry.test.ts",
73
73
  "verify:core-codegen": "bun test scripts/codegen.test.ts && node --test scripts/check-package-types.test.mjs",
74
+ "verify:entity-export": "bun test scripts/check-entity-export.test.ts",
74
75
  "verify:pallet-preview": "bun test scripts/check-pallet-preview.test.ts && bun scripts/verify-pallet-preview-hook.mjs",
75
76
  "verify:consumed-fuel-preview": "bun test scripts/check-consumed-fuel-preview.test.ts && bun scripts/verify-consumed-fuel-preview-hook.mjs && bun scripts/verify-consumed-fuel-preview-component.mjs"
76
77
  },