@vendure/dashboard 3.7.4-master-202609110210 → 3.7.4-master-202609150211

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 (22) hide show
  1. package/dist/bundle/chunks/{2SSKDMRQ-CpRbj3yV.js → 2SSKDMRQ-k_avoCk4.js} +2 -2
  2. package/dist/bundle/chunks/{AP7HFJJL-_aalgtfO.js → AP7HFJJL-CqVn78A2.js} +1 -1
  3. package/dist/bundle/chunks/{WDYDFRGG-BOh7WOyA.js → WDYDFRGG-COu6CgYo.js} +2 -2
  4. package/dist/bundle/chunks/{locale-CR8peDne.js → locale-Ds-_762_.js} +1 -1
  5. package/dist/bundle/chunks/{main-D_rN3aKO.js → main-DJTS8BrQ.js} +110 -74
  6. package/dist/bundle/chunks/{use-job-queue-polling-Cqr5CKxU.js → use-job-queue-polling-PQ-fadAl.js} +23 -3
  7. package/dist/bundle/lib.js +2 -2
  8. package/dist/bundle/main.js +2 -2
  9. package/dist/vite/utils/compiler.js +49 -17
  10. package/dist/vite/vite-plugin-translations.d.ts +4 -4
  11. package/dist/vite/vite-plugin-translations.js +17 -5
  12. package/package.json +3 -3
  13. package/src/app/routes/_authenticated/_option-groups/option-groups_.$groupId.options_.$id.tsx +31 -30
  14. package/src/app/routes/_authenticated/_option-groups/option-groups_.$id.tsx +31 -32
  15. package/src/app/routes/_authenticated/_products/product-option-groups.graphql.ts +2 -0
  16. package/src/app/routes/_authenticated/_products/products.graphql.ts +1 -0
  17. package/src/app/routes/_authenticated/_products/products_.$id.tsx +34 -17
  18. package/src/lib/components/data-table/use-generated-columns.spec.tsx +42 -1
  19. package/src/lib/components/data-table/use-generated-columns.tsx +41 -15
  20. package/src/lib/framework/page/use-extended-router.spec.tsx +85 -0
  21. package/src/lib/framework/page/use-extended-router.tsx +10 -2
  22. package/src/lib/virtual.d.ts +5 -1
@@ -1,5 +1,5 @@
1
- import { c as createLocalStorage, T as THEME_PREFERENCE, P as PiPProvider, a as ThemeContext, b as ParentPanel, C as ContentView, Q as QueryDevtoolsContext } from "./AP7HFJJL-_aalgtfO.js";
2
- import { g as getPreferredColorScheme, c as createMemo, a as createComponent } from "./main-D_rN3aKO.js";
1
+ import { c as createLocalStorage, T as THEME_PREFERENCE, P as PiPProvider, a as ThemeContext, b as ParentPanel, C as ContentView, Q as QueryDevtoolsContext } from "./AP7HFJJL-CqVn78A2.js";
2
+ import { g as getPreferredColorScheme, c as createMemo, a as createComponent } from "./main-DJTS8BrQ.js";
3
3
  var DevtoolsPanelComponent = (props) => {
4
4
  const [localStore, setLocalStore] = createLocalStorage({
5
5
  prefix: "TanstackQueryDevtools"
@@ -1,4 +1,4 @@
1
- import { b as createContext, d as createSignal, o as onMount, e as createEffect, c as createMemo, a as createComponent, P as Portal, m as memo, S as Show, t as template, i as insert, f as createRenderEffect, h as className, j as clearDelegatedEvents, k as delegateEvents, u as useContext, l as onCleanup, s as sortFns, n as mutationSortFns, p as on, q as setAttribute, r as getSidedProp, v as use, w as convertRemToPixels, x as createUniqueId, y as batch, z as getQueryStatusLabel, A as getMutationStatusColor, B as getQueryStatusColor, C as getQueryStatusColorByLabel, D as displayValue, F as For, E as untrack, $ as $TRACK, G as useTransition, H as spread, I as mergeProps, J as createRoot, K as serialize, L as Index, M as updateNestedDataByPath, N as addEventListener, O as stringify, Q as Match, R as Switch, T as deleteNestedDataByPath, U as splitProps, V as Dynamic, W as createComputed } from "./main-D_rN3aKO.js";
1
+ import { b as createContext, d as createSignal, o as onMount, e as createEffect, c as createMemo, a as createComponent, P as Portal, m as memo, S as Show, t as template, i as insert, f as createRenderEffect, h as className, j as clearDelegatedEvents, k as delegateEvents, u as useContext, l as onCleanup, s as sortFns, n as mutationSortFns, p as on, q as setAttribute, r as getSidedProp, v as use, w as convertRemToPixels, x as createUniqueId, y as batch, z as getQueryStatusLabel, A as getMutationStatusColor, B as getQueryStatusColor, C as getQueryStatusColorByLabel, D as displayValue, F as For, E as untrack, $ as $TRACK, G as useTransition, H as spread, I as mergeProps, J as createRoot, K as serialize, L as Index, M as updateNestedDataByPath, N as addEventListener, O as stringify, Q as Match, R as Switch, T as deleteNestedDataByPath, U as splitProps, V as Dynamic, W as createComputed } from "./main-DJTS8BrQ.js";
2
2
  var isNonNullable = (i2) => i2 != null;
3
3
  var filterNonNullable = (arr) => arr.filter(isNonNullable);
4
4
  function chain(callbacks) {
@@ -1,5 +1,5 @@
1
- import { c as createLocalStorage, T as THEME_PREFERENCE, P as PiPProvider, a as ThemeContext, D as Devtools, Q as QueryDevtoolsContext } from "./AP7HFJJL-_aalgtfO.js";
2
- import { g as getPreferredColorScheme, c as createMemo, a as createComponent } from "./main-D_rN3aKO.js";
1
+ import { c as createLocalStorage, T as THEME_PREFERENCE, P as PiPProvider, a as ThemeContext, D as Devtools, Q as QueryDevtoolsContext } from "./AP7HFJJL-CqVn78A2.js";
2
+ import { g as getPreferredColorScheme, c as createMemo, a as createComponent } from "./main-DJTS8BrQ.js";
3
3
  var DevtoolsComponent = (props) => {
4
4
  const [localStore, setLocalStore] = createLocalStorage({
5
5
  prefix: "TanstackQueryDevtools"
@@ -1,4 +1,4 @@
1
- import { op as normalizeDates$1, oq as startOfWeek$1, or as buildFormatLongFn$1, os as buildLocalizeFn$1, ot as buildMatchFn$1, ou as buildMatchPatternFn$1, ov as toDate$1, ow as match$1l, ox as localize$1n, oy as formatRelative$1n, oz as formatDistance$1n, oA as DateLib, oB as enUS$1 } from "./use-job-queue-polling-Cqr5CKxU.js";
1
+ import { op as normalizeDates$1, oq as startOfWeek$1, or as buildFormatLongFn$1, os as buildLocalizeFn$1, ot as buildMatchFn$1, ou as buildMatchPatternFn$1, ov as toDate$1, ow as match$1l, ox as localize$1n, oy as formatRelative$1n, oz as formatDistance$1n, oA as DateLib, oB as enUS$1 } from "./use-job-queue-polling-PQ-fadAl.js";
2
2
  function isSameWeek$1(laterDate, earlierDate, options2) {
3
3
  const [laterDate_, earlierDate_] = normalizeDates$1(
4
4
  options2?.in,
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { c as createLucideIcon, nu as loadI18nMessages, nE as UserSettingsProvider, nF as ThemeProvider, nG as AuthProvider, nH as ServerConfigProvider, nI as ChannelProvider, nJ as AlertsProvider, l5 as CustomProviders, df as objectType, du as stringType, mV as useAuth, gv as LoginForm, hq as LoginBranding, gk as AppLayout, nK as endOfDay, nL as startOfMonth, bD as useUserSettings, nc as usePermissions, kx as getDashboardWidgetRegistry, eL as Page, eM as PageTitle, eN as PageActionBar, me as ActionBarItem, gi as DateRangePicker, dP as Button, eP as PageLayout, mp as FullWidthPageBlock, kA as WidgetFiltersProvider, i$ as GridLayout, ky as getDashboardWidget, nb as usePaginatedList, mF as api, kV as getMutationName, fA as DataTableBulkActionItem, nM as Trash, mN as graphql, gf as useGeneratedColumns, fU as DataTable, gY as CountrySelector, jt as Sheet, jA as SheetTrigger, jv as SheetContent, jy as SheetHeader, jz as SheetTitle, jw as SheetDescription, jm as ScrollArea, mx as ListPage, dQ as Plus, h3 as DetailPageButton, eX as BooleanDisplayBadge, dR as Badge, mS as setSettingsStoreValueDocument, nN as createColumnHelper, gX as CopyableText, jV as Switch$1, iE as Dialog, iM as DialogTrigger, iG as DialogContent, iJ as DialogHeader, iD as DialogTitle, iH as DialogDescription, eZ as JsonViewer, iI as DialogFooter, dO as Input, n7 as useLocalFormat, bR as DropdownMenu, bS as DropdownMenuTrigger, bT as Ellipsis, bV as DropdownMenuContent, bW as DropdownMenuItem, nO as Clock, nP as Check, nQ as RefreshCw, nR as ChevronDown, nS as EllipsisVertical, bF as Select, bG as SelectTrigger, bI as SelectValue, bJ as SelectContent, bK as SelectItem, gJ as AssignToChannelBulkAction, mW as useChannel, hs as RemoveFromChannelBulkAction, mJ as configurableOperationFragment, nq as LS_KEY_SHIPPING_TEST_ADDRESS, hR as AccordionItem, hS as AccordionTrigger, hQ as AccordionContent, i_ as Form, eS as FormFieldWrapper, nT as AddressCountrySelect, nr as LS_KEY_SHIPPING_TEST_ORDER, nU as useReactTable, nV as getCoreRowModel, jW as Table, k0 as TableHeader, k1 as TableRow, j$ as TableHead, nW as flexRender, jX as TableBody, jZ as TableCell, hr as ProductVariantSelector, hJ as VendureImage, bZ as Trash2, e$ as Money, ij as Card, ip as CardHeader, iq as CardTitle, il as CardContent, i3 as Alert, i4 as AlertDescription, hP as Accordion, hG as RichTextDescriptionCell, nt as SUPER_ADMIN_ROLE_CODE, nl as CUSTOMER_ROLE_CODE, nX as Layers, gP as ChannelCodeLabel, hz as RoleCodeLabel, mH as getEntityDuplicatorsDocument, nY as getInitialConfigArgValue, gS as ConfigurableOperationInput, mG as duplicateEntityDocument, nZ as Copy, h5 as ErrorPage, kI as extendDetailFormQuery, kP as addCustomFields, mA as getDetailQueryOptions, eJ as useDetailPage, eQ as PageBlock, eR as DetailFormGrid, jd as PasswordInput, eU as CustomFieldsPageBlock, mI as assetFragment, h7 as FacetValueSelector, h6 as FacetValueChip, gL as usePriceFactor, fF as FacetValueFacetedFilter, hC as StockLevelLabel, mM as errorResultFragment, mL as configurableOperationDefFragment, bC as useServerConfig, hD as CustomerCell, hE as OrderStateCell, hF as OrderMoneyCell, eH as NEW_ENTITY_PATH, hh as LanguageSelector, mP as schemaLanguageCodes, fb as NumberInput, hn as PaginatedListDataTable, hm as PaginatedListDataTableKey, h2 as CustomerSelector, n_ as useDebounce, bX as Folder, n$ as Search, o0 as ChevronRight, o1 as getExpandedRowModel, fO as getItemParentId, fR as calculateDragTargetPosition, fQ as isCircularReference, fS as calculateSiblingIndex, o2 as deleteAssetsDocument, cW as enumType, cP as coerce, gD as AssetGallery, mw as detailPageRouteLoader, hH as TaxCategorySelector, hO as ZoneSelector, k7 as Textarea, gV as ConfigurableOperationSelector, eT as TranslatableFormFieldWrapper, fq as RichTextInput, n5 as useGroupedPermissions, ke as TooltipProvider, kc as Tooltip, kf as TooltipTrigger, o3 as Info, kd as TooltipContent, gQ as ChannelSelector, gU as ConfigurableOperationMultiSelector, f7 as DateTimeInput, dS as X, cM as arrayType, nD as a, k2 as Tabs, k4 as TabsList, k5 as TabsTrigger, o4 as Link$1, k3 as TabsContent, iu as Command, iy as CommandInput, iA as CommandList, iw as CommandEmpty, iz as CommandItem, cO as booleanType, cl as ZodIssueCode, dq as recordType, C as Checkbox, iQ as Field, iT as FieldError, fa as MoneyInput, gW as ConfirmationDialog, hU as AlertDialog, hX as AlertDialogContent, h_ as AlertDialogHeader, hT as AlertDialogTitle, hY as AlertDialogDescription, hZ as AlertDialogFooter, hW as AlertDialogCancel, hV as AlertDialogAction, ho as PermissionGuard, na as usePage, fs as SlugInput, gN as AssignedFacetValues, gM as AssignedChannels, h4 as EntityAssets, dV as Separator, g_ as CustomFieldsForm, iV as FieldLabel, m$ as useDynamicTranslations, o5 as getTypeForState, bH as cn, nn as DEFAULT_CHANNEL_CODE, fp as createRelationSelectorConfig, fo as RelationSelector, j5 as Label, o6 as CircleAlert, mX as useCustomFieldConfig, gj as LabeledData, ir as Collapsible, is as CollapsibleTrigger, it as CollapsibleContent, o7 as Globe, md as HistoryEntry, o8 as SquarePen, hf as useHistoryNoteEditor, hd as HistoryTimelineWithGrouping, hc as HistoryNoteInput, ha as HistoryNoteEditor, hb as HistoryNoteEntry, jS as Skeleton, kR as getFieldsFromDocumentNode, fL as getColumnVisibility, o9 as Pencil, oa as stateTypeToBadgeVariant, ob as ChevronLeft, g$ as CustomerAddressForm$1, oc as Users, h0 as CustomerGroupChip, h1 as CustomerGroupSelector, od as availableCountriesQueryKey, oe as Eye, i5 as AlertTitle, n6 as useJobQueuePolling, hB as SellerSelector, gZ as CurrencySelector, of as tagListDocument, og as updateTagDocument, oh as deleteTagDocument, oi as createTagDocument, je as Popover, jj as PopoverTrigger, oj as ChevronsUpDown, jf as PopoverContent, ix as CommandGroup, ok as Settings2, ol as assetDetailDocument, om as assetUpdateDocument, gB as AssetFocalPointEditor, gI as AssetProperties, gG as AssetPreviewSelector, on as Focus, hA as RoleSelector, hj as MultiSelect, oo as useRedirectToListOnNotFound, fh as SingleRelationInput, lD as useGeneratedForm, de as numberType, f0 as AffixedInput, iF as DialogClose, jU as Spinner, lq as useDashboardExtensions, kH as registerDefaults, l7 as executeDashboardExtensionCallbacks, jT as Toaster, mB as useExtendedRouter, mZ as useDisplayLocale, nh as useUiLanguageLoader, kL as setCustomFieldsMap, iN as DirectionProvider, kM as clearCustomFieldsMap } from "./use-job-queue-polling-Cqr5CKxU.js";
2
+ import { c as createLucideIcon, nu as loadI18nMessages, nE as UserSettingsProvider, nF as ThemeProvider, nG as AuthProvider, nH as ServerConfigProvider, nI as ChannelProvider, nJ as AlertsProvider, l5 as CustomProviders, df as objectType, du as stringType, mV as useAuth, gv as LoginForm, hq as LoginBranding, gk as AppLayout, nK as endOfDay, nL as startOfMonth, bD as useUserSettings, nc as usePermissions, kx as getDashboardWidgetRegistry, eL as Page, eM as PageTitle, eN as PageActionBar, me as ActionBarItem, gi as DateRangePicker, dP as Button, eP as PageLayout, mp as FullWidthPageBlock, kA as WidgetFiltersProvider, i$ as GridLayout, ky as getDashboardWidget, nb as usePaginatedList, mF as api, kV as getMutationName, fA as DataTableBulkActionItem, nM as Trash, mN as graphql, gf as useGeneratedColumns, fU as DataTable, gY as CountrySelector, jt as Sheet, jA as SheetTrigger, jv as SheetContent, jy as SheetHeader, jz as SheetTitle, jw as SheetDescription, jm as ScrollArea, mx as ListPage, dQ as Plus, h3 as DetailPageButton, eX as BooleanDisplayBadge, dR as Badge, mS as setSettingsStoreValueDocument, nN as createColumnHelper, gX as CopyableText, jV as Switch$1, iE as Dialog, iM as DialogTrigger, iG as DialogContent, iJ as DialogHeader, iD as DialogTitle, iH as DialogDescription, eZ as JsonViewer, iI as DialogFooter, dO as Input, n7 as useLocalFormat, bR as DropdownMenu, bS as DropdownMenuTrigger, bT as Ellipsis, bV as DropdownMenuContent, bW as DropdownMenuItem, nO as Clock, nP as Check, nQ as RefreshCw, nR as ChevronDown, nS as EllipsisVertical, bF as Select, bG as SelectTrigger, bI as SelectValue, bJ as SelectContent, bK as SelectItem, gJ as AssignToChannelBulkAction, mW as useChannel, hs as RemoveFromChannelBulkAction, mJ as configurableOperationFragment, nq as LS_KEY_SHIPPING_TEST_ADDRESS, hR as AccordionItem, hS as AccordionTrigger, hQ as AccordionContent, i_ as Form, eS as FormFieldWrapper, nT as AddressCountrySelect, nr as LS_KEY_SHIPPING_TEST_ORDER, nU as useReactTable, nV as getCoreRowModel, jW as Table, k0 as TableHeader, k1 as TableRow, j$ as TableHead, nW as flexRender, jX as TableBody, jZ as TableCell, hr as ProductVariantSelector, hJ as VendureImage, bZ as Trash2, e$ as Money, ij as Card, ip as CardHeader, iq as CardTitle, il as CardContent, i3 as Alert, i4 as AlertDescription, hP as Accordion, hG as RichTextDescriptionCell, nt as SUPER_ADMIN_ROLE_CODE, nl as CUSTOMER_ROLE_CODE, nX as Layers, gP as ChannelCodeLabel, hz as RoleCodeLabel, mH as getEntityDuplicatorsDocument, nY as getInitialConfigArgValue, gS as ConfigurableOperationInput, mG as duplicateEntityDocument, nZ as Copy, h5 as ErrorPage, kI as extendDetailFormQuery, kP as addCustomFields, mA as getDetailQueryOptions, eJ as useDetailPage, eQ as PageBlock, eR as DetailFormGrid, jd as PasswordInput, eU as CustomFieldsPageBlock, mI as assetFragment, h7 as FacetValueSelector, h6 as FacetValueChip, gL as usePriceFactor, fF as FacetValueFacetedFilter, hC as StockLevelLabel, mM as errorResultFragment, mL as configurableOperationDefFragment, bC as useServerConfig, hD as CustomerCell, hE as OrderStateCell, hF as OrderMoneyCell, eH as NEW_ENTITY_PATH, hh as LanguageSelector, mP as schemaLanguageCodes, fb as NumberInput, hn as PaginatedListDataTable, hm as PaginatedListDataTableKey, h2 as CustomerSelector, n_ as useDebounce, bX as Folder, n$ as Search, o0 as ChevronRight, o1 as getExpandedRowModel, fO as getItemParentId, fR as calculateDragTargetPosition, fQ as isCircularReference, fS as calculateSiblingIndex, o2 as deleteAssetsDocument, cW as enumType, cP as coerce, gD as AssetGallery, mw as detailPageRouteLoader, hH as TaxCategorySelector, hO as ZoneSelector, k7 as Textarea, gV as ConfigurableOperationSelector, eT as TranslatableFormFieldWrapper, fq as RichTextInput, n5 as useGroupedPermissions, ke as TooltipProvider, kc as Tooltip, kf as TooltipTrigger, o3 as Info, kd as TooltipContent, gQ as ChannelSelector, gU as ConfigurableOperationMultiSelector, f7 as DateTimeInput, dS as X, cM as arrayType, nD as a, k2 as Tabs, k4 as TabsList, k5 as TabsTrigger, o4 as Link$1, k3 as TabsContent, iu as Command, iy as CommandInput, iA as CommandList, iw as CommandEmpty, iz as CommandItem, cO as booleanType, cl as ZodIssueCode, dq as recordType, C as Checkbox, iQ as Field, iT as FieldError, fa as MoneyInput, gW as ConfirmationDialog, hU as AlertDialog, hX as AlertDialogContent, h_ as AlertDialogHeader, hT as AlertDialogTitle, hY as AlertDialogDescription, hZ as AlertDialogFooter, hW as AlertDialogCancel, hV as AlertDialogAction, ho as PermissionGuard, na as usePage, fs as SlugInput, gN as AssignedFacetValues, gM as AssignedChannels, h4 as EntityAssets, dV as Separator, g_ as CustomFieldsForm, iV as FieldLabel, m$ as useDynamicTranslations, o5 as getTypeForState, bH as cn, nn as DEFAULT_CHANNEL_CODE, fp as createRelationSelectorConfig, fo as RelationSelector, j5 as Label, o6 as CircleAlert, mX as useCustomFieldConfig, gj as LabeledData, ir as Collapsible, is as CollapsibleTrigger, it as CollapsibleContent, o7 as Globe, md as HistoryEntry, o8 as SquarePen, hf as useHistoryNoteEditor, hd as HistoryTimelineWithGrouping, hc as HistoryNoteInput, ha as HistoryNoteEditor, hb as HistoryNoteEntry, jS as Skeleton, kR as getFieldsFromDocumentNode, fL as getColumnVisibility, o9 as Pencil, oa as stateTypeToBadgeVariant, ob as ChevronLeft, g$ as CustomerAddressForm$1, oc as Users, h0 as CustomerGroupChip, h1 as CustomerGroupSelector, od as availableCountriesQueryKey, oe as Eye, i5 as AlertTitle, n6 as useJobQueuePolling, hB as SellerSelector, gZ as CurrencySelector, of as tagListDocument, og as updateTagDocument, oh as deleteTagDocument, oi as createTagDocument, je as Popover, jj as PopoverTrigger, oj as ChevronsUpDown, jf as PopoverContent, ix as CommandGroup, ok as Settings2, ol as assetDetailDocument, om as assetUpdateDocument, gB as AssetFocalPointEditor, gI as AssetProperties, gG as AssetPreviewSelector, on as Focus, hA as RoleSelector, hj as MultiSelect, oo as useRedirectToListOnNotFound, fh as SingleRelationInput, lD as useGeneratedForm, de as numberType, f0 as AffixedInput, iF as DialogClose, jU as Spinner, lq as useDashboardExtensions, kH as registerDefaults, l7 as executeDashboardExtensionCallbacks, jT as Toaster, mB as useExtendedRouter, mZ as useDisplayLocale, nh as useUiLanguageLoader, kL as setCustomFieldsMap, iN as DirectionProvider, kM as clearCustomFieldsMap } from "./use-job-queue-polling-PQ-fadAl.js";
3
3
  import { toast } from "sonner";
4
4
  import { i18n } from "@lingui/core";
5
5
  import { I18nProvider as I18nProvider$1, useLingui, Trans } from "@lingui/react";
@@ -2948,7 +2948,7 @@ var TanstackQueryDevtools = class {
2948
2948
  if (this.#Component) {
2949
2949
  Devtools = this.#Component;
2950
2950
  } else {
2951
- Devtools = lazy(() => import("./WDYDFRGG-BOh7WOyA.js"));
2951
+ Devtools = lazy(() => import("./WDYDFRGG-COu6CgYo.js"));
2952
2952
  this.#Component = Devtools;
2953
2953
  }
2954
2954
  setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget);
@@ -3086,7 +3086,7 @@ var TanstackQueryDevtoolsPanel = class {
3086
3086
  if (this.#Component) {
3087
3087
  Devtools = this.#Component;
3088
3088
  } else {
3089
- Devtools = lazy(() => import("./2SSKDMRQ-CpRbj3yV.js"));
3089
+ Devtools = lazy(() => import("./2SSKDMRQ-k_avoCk4.js"));
3090
3090
  this.#Component = Devtools;
3091
3091
  }
3092
3092
  setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget);
@@ -7280,6 +7280,7 @@ const productDetailFragment = graphql(`
7280
7280
  id
7281
7281
  code
7282
7282
  name
7283
+ productCount
7283
7284
  options {
7284
7285
  id
7285
7286
  code
@@ -14937,6 +14938,23 @@ function ProductVariantsTable({
14937
14938
  }
14938
14939
  } });
14939
14940
  }
14941
+ function SharedOptionGroupWarning({
14942
+ productCount
14943
+ }) {
14944
+ if (productCount <= 1) {
14945
+ return null;
14946
+ }
14947
+ return /* @__PURE__ */ jsxs(Alert, { children: [
14948
+ /* @__PURE__ */ jsx(TriangleAlert, { className: "h-4 w-4" }),
14949
+ /* @__PURE__ */ jsx(AlertDescription, { children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
14950
+ {
14951
+ id: "Bv+2kN",
14952
+ values: {
14953
+ productCount
14954
+ }
14955
+ } }) })
14956
+ ] });
14957
+ }
14940
14958
  const pageId$g = "product-detail";
14941
14959
  const Route$j = createFileRoute("/_authenticated/_products/products_/$id")({
14942
14960
  component: ProductDetailPage,
@@ -15205,7 +15223,13 @@ function ProductDetailPage() {
15205
15223
  {
15206
15224
  id: "HiuEp7"
15207
15225
  } }), children: [
15208
- /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mb-3", children: entity.optionGroups.map((g) => /* @__PURE__ */ jsx(ProductOptionGroupBadge, { id: g.id, name: g.name, productId: entity.id, onRemoved: () => refreshEntity() }, g.id)) }),
15226
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mb-3", children: entity.optionGroups.map((g) => {
15227
+ const badge = /* @__PURE__ */ jsx(ProductOptionGroupBadge, { id: g.id, name: g.name, productId: entity.id, onRemoved: () => refreshEntity() }, g.id);
15228
+ return g.productCount > 1 ? /* @__PURE__ */ jsxs("div", { className: "w-full space-y-2", children: [
15229
+ badge,
15230
+ /* @__PURE__ */ jsx(SharedOptionGroupWarning, { productCount: g.productCount })
15231
+ ] }, g.id) : badge;
15232
+ }) }),
15209
15233
  /* @__PURE__ */ jsx(AddOptionGroupDialog, { productId: entity.id, existingGroupIds: entity.optionGroups.map((g) => g.id), onSuccess: () => refreshEntity() })
15210
15234
  ] }),
15211
15235
  /* @__PURE__ */ jsx(PageBlock, { column: "side", blockId: "facet-values", title: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
@@ -19348,76 +19372,6 @@ function OrderDetailPage() {
19348
19372
  id: "Y5F7pT"
19349
19373
  } }), children: /* @__PURE__ */ jsx(SellerOrdersCard, { orderId: params.id }) }) : void 0 });
19350
19374
  }
19351
- const PAGE_SIZE = 10;
19352
- function OptionGroupProductsBlock({
19353
- optionGroupId
19354
- }) {
19355
- const {
19356
- _: _t
19357
- } = useLingui();
19358
- const [searchTerm, setSearchTerm] = useState("");
19359
- const [page, setPage] = useState(1);
19360
- const debouncedSearchTerm = useDebounce(searchTerm, 300);
19361
- const {
19362
- data,
19363
- isFetching
19364
- } = useQuery({
19365
- queryKey: ["optionGroupProducts", optionGroupId, debouncedSearchTerm, page],
19366
- queryFn: () => api.query(productsByOptionGroupDocument, {
19367
- options: {
19368
- filter: {
19369
- optionGroupId: {
19370
- eq: optionGroupId
19371
- },
19372
- ...debouncedSearchTerm ? {
19373
- name: {
19374
- contains: debouncedSearchTerm
19375
- }
19376
- } : {}
19377
- },
19378
- take: PAGE_SIZE,
19379
- skip: (page - 1) * PAGE_SIZE
19380
- }
19381
- }),
19382
- placeholderData: keepPreviousData
19383
- });
19384
- const items = data?.products?.items ?? [];
19385
- const totalItems = data?.products?.totalItems ?? 0;
19386
- const totalPages = Math.ceil(totalItems / PAGE_SIZE);
19387
- const hasMultiplePages = totalPages > 1;
19388
- return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
19389
- /* @__PURE__ */ jsx(Input, { placeholder: _t(
19390
- /*i18n*/
19391
- {
19392
- id: "6HLTEb"
19393
- }
19394
- ), value: searchTerm, onChange: (e) => {
19395
- setSearchTerm(e.target.value);
19396
- setPage(1);
19397
- }, className: "h-8" }),
19398
- /* @__PURE__ */ jsx("div", { className: "divide-y rounded-md border", children: isFetching && items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-3 text-sm text-muted-foreground text-center", children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19399
- {
19400
- id: "Z3FXyt"
19401
- } }) }) : items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-3 text-sm text-muted-foreground text-center", children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19402
- {
19403
- id: "9k1f3h"
19404
- } }) }) : items.map((item) => /* @__PURE__ */ jsx("div", { className: "px-1 py-0.5", children: /* @__PURE__ */ jsx(DetailPageButton, { id: item.id, label: item.name, href: `/products/${item.id}` }) }, item.id)) }),
19405
- hasMultiplePages && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-sm text-muted-foreground", children: [
19406
- /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19407
- {
19408
- id: "VLy2cu",
19409
- values: {
19410
- page,
19411
- totalPages
19412
- }
19413
- } }) }),
19414
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
19415
- /* @__PURE__ */ jsx(Button, { variant: "outline", size: "icon", className: "h-7 w-7", disabled: page <= 1, onClick: () => setPage((p) => p - 1), children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" }) }),
19416
- /* @__PURE__ */ jsx(Button, { variant: "outline", size: "icon", className: "h-7 w-7", disabled: page >= totalPages, onClick: () => setPage((p) => p + 1), children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" }) })
19417
- ] })
19418
- ] })
19419
- ] });
19420
- }
19421
19375
  const productOptionGroupDetailDocument = graphql(`
19422
19376
  query ProductOptionGroupDetail($id: ID!) {
19423
19377
  productOptionGroup(id: $id) {
@@ -19455,6 +19409,7 @@ const productOptionGroupIdNameDocument = graphql(`
19455
19409
  productOptionGroup(id: $id) {
19456
19410
  id
19457
19411
  name
19412
+ productCount
19458
19413
  }
19459
19414
  }
19460
19415
  `);
@@ -19490,6 +19445,7 @@ const productOptionDetailDocument = graphql(`
19490
19445
  id
19491
19446
  name
19492
19447
  code
19448
+ productCount
19493
19449
  }
19494
19450
  customFields
19495
19451
  }
@@ -19605,6 +19561,76 @@ function ProductOptionsTable({
19605
19561
  ] }) })
19606
19562
  ] });
19607
19563
  }
19564
+ const PAGE_SIZE = 10;
19565
+ function OptionGroupProductsBlock({
19566
+ optionGroupId
19567
+ }) {
19568
+ const {
19569
+ _: _t
19570
+ } = useLingui();
19571
+ const [searchTerm, setSearchTerm] = useState("");
19572
+ const [page, setPage] = useState(1);
19573
+ const debouncedSearchTerm = useDebounce(searchTerm, 300);
19574
+ const {
19575
+ data,
19576
+ isFetching
19577
+ } = useQuery({
19578
+ queryKey: ["optionGroupProducts", optionGroupId, debouncedSearchTerm, page],
19579
+ queryFn: () => api.query(productsByOptionGroupDocument, {
19580
+ options: {
19581
+ filter: {
19582
+ optionGroupId: {
19583
+ eq: optionGroupId
19584
+ },
19585
+ ...debouncedSearchTerm ? {
19586
+ name: {
19587
+ contains: debouncedSearchTerm
19588
+ }
19589
+ } : {}
19590
+ },
19591
+ take: PAGE_SIZE,
19592
+ skip: (page - 1) * PAGE_SIZE
19593
+ }
19594
+ }),
19595
+ placeholderData: keepPreviousData
19596
+ });
19597
+ const items = data?.products?.items ?? [];
19598
+ const totalItems = data?.products?.totalItems ?? 0;
19599
+ const totalPages = Math.ceil(totalItems / PAGE_SIZE);
19600
+ const hasMultiplePages = totalPages > 1;
19601
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
19602
+ /* @__PURE__ */ jsx(Input, { placeholder: _t(
19603
+ /*i18n*/
19604
+ {
19605
+ id: "6HLTEb"
19606
+ }
19607
+ ), value: searchTerm, onChange: (e) => {
19608
+ setSearchTerm(e.target.value);
19609
+ setPage(1);
19610
+ }, className: "h-8" }),
19611
+ /* @__PURE__ */ jsx("div", { className: "divide-y rounded-md border", children: isFetching && items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-3 text-sm text-muted-foreground text-center", children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19612
+ {
19613
+ id: "Z3FXyt"
19614
+ } }) }) : items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-3 text-sm text-muted-foreground text-center", children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19615
+ {
19616
+ id: "9k1f3h"
19617
+ } }) }) : items.map((item) => /* @__PURE__ */ jsx("div", { className: "px-1 py-0.5", children: /* @__PURE__ */ jsx(DetailPageButton, { id: item.id, label: item.name, href: `/products/${item.id}` }) }, item.id)) }),
19618
+ hasMultiplePages && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-sm text-muted-foreground", children: [
19619
+ /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19620
+ {
19621
+ id: "VLy2cu",
19622
+ values: {
19623
+ page,
19624
+ totalPages
19625
+ }
19626
+ } }) }),
19627
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
19628
+ /* @__PURE__ */ jsx(Button, { variant: "outline", size: "icon", className: "h-7 w-7", disabled: page <= 1, onClick: () => setPage((p) => p - 1), children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" }) }),
19629
+ /* @__PURE__ */ jsx(Button, { variant: "outline", size: "icon", className: "h-7 w-7", disabled: page >= totalPages, onClick: () => setPage((p) => p + 1), children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" }) })
19630
+ ] })
19631
+ ] })
19632
+ ] });
19633
+ }
19608
19634
  const pageId$d = "option-group-detail";
19609
19635
  const Route$f = createFileRoute("/_authenticated/_option-groups/option-groups_/$id")({
19610
19636
  component: OptionGroupDetailPage,
@@ -19769,6 +19795,7 @@ function OptionGroupDetailPage() {
19769
19795
  id: "EkH9pt"
19770
19796
  } }) }) }) }),
19771
19797
  /* @__PURE__ */ jsxs(PageLayout, { children: [
19798
+ entity && entity.productCount > 1 && /* @__PURE__ */ jsx(PageBlock, { column: "main", blockId: "shared-option-group-warning", children: /* @__PURE__ */ jsx(SharedOptionGroupWarning, { productCount: entity.productCount }) }),
19772
19799
  /* @__PURE__ */ jsx(PageBlock, { column: "main", blockId: "main-form", children: /* @__PURE__ */ jsxs(DetailFormGrid, { children: [
19773
19800
  /* @__PURE__ */ jsx(TranslatableFormFieldWrapper, { control: form.control, name: "name", label: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
19774
19801
  {
@@ -25842,6 +25869,7 @@ const Route$1 = createFileRoute("/_authenticated/_option-groups/option-groups_/$
25842
25869
  throw new Error(`ProductOption with the ID ${params.id} was not found`);
25843
25870
  }
25844
25871
  let optionGroupName;
25872
+ let productCount = 0;
25845
25873
  if (isNew) {
25846
25874
  const optionGroupResult = await context.queryClient.fetchQuery({
25847
25875
  queryKey: [pageId$1, "optionGroupIdName", params.groupId],
@@ -25850,8 +25878,10 @@ const Route$1 = createFileRoute("/_authenticated/_option-groups/option-groups_/$
25850
25878
  })
25851
25879
  });
25852
25880
  optionGroupName = optionGroupResult.productOptionGroup?.name;
25881
+ productCount = optionGroupResult.productOptionGroup?.productCount ?? 0;
25853
25882
  } else {
25854
25883
  optionGroupName = result.productOption.group.name;
25884
+ productCount = result.productOption.group.productCount;
25855
25885
  }
25856
25886
  const search = location.search;
25857
25887
  const groupId = isNew ? params.groupId : result.productOption.group.id;
@@ -25863,6 +25893,7 @@ const Route$1 = createFileRoute("/_authenticated/_option-groups/option-groups_/$
25863
25893
  })
25864
25894
  });
25865
25895
  return {
25896
+ productCount,
25866
25897
  breadcrumb: [{
25867
25898
  path: "/products",
25868
25899
  label: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
@@ -25888,6 +25919,7 @@ const Route$1 = createFileRoute("/_authenticated/_option-groups/option-groups_/$
25888
25919
  };
25889
25920
  }
25890
25921
  return {
25922
+ productCount,
25891
25923
  breadcrumb: [{
25892
25924
  path: "/option-groups",
25893
25925
  label: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
@@ -25909,6 +25941,9 @@ const Route$1 = createFileRoute("/_authenticated/_option-groups/option-groups_/$
25909
25941
  });
25910
25942
  function OptionGroupOptionDetailPage() {
25911
25943
  const params = Route$1.useParams();
25944
+ const {
25945
+ productCount
25946
+ } = Route$1.useLoaderData();
25912
25947
  const navigate = useNavigate();
25913
25948
  const creatingNewEntity = params.id === NEW_ENTITY_PATH;
25914
25949
  const {
@@ -26000,6 +26035,7 @@ function OptionGroupOptionDetailPage() {
26000
26035
  id: "EkH9pt"
26001
26036
  } }) }) }) }),
26002
26037
  /* @__PURE__ */ jsxs(PageLayout, { children: [
26038
+ productCount > 1 && /* @__PURE__ */ jsx(PageBlock, { column: "main", blockId: "shared-option-group-warning", children: /* @__PURE__ */ jsx(SharedOptionGroupWarning, { productCount }) }),
26003
26039
  entity?.group && /* @__PURE__ */ jsx(PageBlock, { column: "side", blockId: "option-group-info", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
26004
26040
  /* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: /* @__PURE__ */ jsx(Trans, { .../*i18n*/
26005
26041
  {
@@ -39350,7 +39350,7 @@ function useDayPickerLocale() {
39350
39350
  } = useDisplayLocale();
39351
39351
  const [calendarLocale, setCalendarLocale] = useState(void 0);
39352
39352
  useEffect(() => {
39353
- import("./locale-CR8peDne.js").then((mod) => {
39353
+ import("./locale-Ds-_762_.js").then((mod) => {
39354
39354
  setCalendarLocale(bcpTagToDatePickerLocale(bcp47Tag, mod));
39355
39355
  });
39356
39356
  }, [bcp47Tag]);
@@ -85831,6 +85831,13 @@ function useGeneratedColumns({
85831
85831
  })));
85832
85832
  customFieldColumnNames2.push(...customFieldFields.map((field) => field.name));
85833
85833
  }
85834
+ const resolveDisplayComponent = (columnId) => {
85835
+ const displayComponentId = pageId && pageBlock?.blockId ? generateDisplayComponentKey(pageId, pageBlock.blockId, columnId) : void 0;
85836
+ return {
85837
+ displayComponentId,
85838
+ registeredDisplayComponent: displayComponentId ? getDisplayComponent(displayComponentId) : void 0
85839
+ };
85840
+ };
85834
85841
  const queryBasedColumns = columnConfigs.map(({
85835
85842
  fieldInfo,
85836
85843
  isCustomField
@@ -85847,8 +85854,10 @@ function useGeneratedColumns({
85847
85854
  ...customConfigRest
85848
85855
  } = customConfig;
85849
85856
  const enableColumnFilter = (fieldInfo.isScalar || isEnumType(fieldInfo.type)) && !facetedFilters?.[fieldInfo.name];
85850
- const displayComponentId = pageId && pageBlock?.blockId ? generateDisplayComponentKey(pageId, pageBlock.blockId, fieldInfo.name) : void 0;
85851
- const registeredDisplayComponent = displayComponentId ? getDisplayComponent(displayComponentId) : void 0;
85857
+ const {
85858
+ displayComponentId,
85859
+ registeredDisplayComponent
85860
+ } = resolveDisplayComponent(fieldInfo.name);
85852
85861
  const cellFn = typeof customCell === "function" && !registeredDisplayComponent ? customCell : (cellContext) => /* @__PURE__ */ jsx(CellWrapper, { cellContext, fieldInfo, isCustomField, displayComponentId });
85853
85862
  return columnHelper.accessor(fieldInfo.name, {
85854
85863
  id: fieldInfo.name,
@@ -85875,9 +85884,13 @@ function useGeneratedColumns({
85875
85884
  if (!id2) {
85876
85885
  throw new Error("Column id is required");
85877
85886
  }
85887
+ const RegisteredDisplayComponent = resolveDisplayComponent(id2).registeredDisplayComponent;
85878
85888
  finalColumns.push(columnHelper.accessor(id2, {
85879
85889
  enableColumnFilter: false,
85880
85890
  ...column,
85891
+ ...RegisteredDisplayComponent ? {
85892
+ cell: (cellContext) => /* @__PURE__ */ jsx(RegisteredDisplayComponent, { value: cellContext.cell.getValue(), ...cellContext })
85893
+ } : {},
85881
85894
  id: id2
85882
85895
  }));
85883
85896
  }
@@ -131090,6 +131103,7 @@ const useExtendedRouter = (baseRouteTree, routerOptions) => {
131090
131103
  const isAuthenticated = config2.authenticated !== false;
131091
131104
  if (isAuthenticated) {
131092
131105
  if (authenticatedRoute.children.findIndex((r2) => r2.path === pathWithoutLeadingSlash) > -1) {
131106
+ warnRouteCollision(path);
131093
131107
  continue;
131094
131108
  }
131095
131109
  const newRoute = createRoute({
@@ -131106,6 +131120,7 @@ const useExtendedRouter = (baseRouteTree, routerOptions) => {
131106
131120
  } else {
131107
131121
  const routeExists = routeTree.children.some((r2) => r2.path === `/${pathWithoutLeadingSlash}` || r2.path === pathWithoutLeadingSlash || r2.id === `/${pathWithoutLeadingSlash}`) || newRootRoutes.some((r2) => r2.path === `/${pathWithoutLeadingSlash}` || r2.id === `/${pathWithoutLeadingSlash}`);
131108
131122
  if (routeExists) {
131123
+ warnRouteCollision(path);
131109
131124
  continue;
131110
131125
  }
131111
131126
  const newRoute = createRoute({
@@ -131130,6 +131145,11 @@ const useExtendedRouter = (baseRouteTree, routerOptions) => {
131130
131145
  return createExtendedRouter(routerOptions, extendedRouteTree);
131131
131146
  }, [baseRouteTree, routerOptions, extensionsLoaded]);
131132
131147
  };
131148
+ function warnRouteCollision(path) {
131149
+ if (process.env.NODE_ENV !== "production") {
131150
+ console.warn(`[Dashboard] Extension route "${path}" conflicts with an existing route and will not be registered.`);
131151
+ }
131152
+ }
131133
131153
  function createExtendedRouter(routerOptions, extendedRouteTree) {
131134
131154
  return createRouter({
131135
131155
  ...routerOptions,
@@ -1,5 +1,5 @@
1
- import { c as createLucideIcon, g as getComputedStyle$1, i as isHTMLElement, r as round, a as createLucideIcon$1, b as isFieldDisabled, C as Checkbox, u as useBaseUiId, d as useIsoLayoutEffect, f as formatErrorMessage, e as useRenderElement, N as NOOP, h as useTransitionStatus, j as useStableCallback, k as useOpenChangeComplete, t as transitionStatusMapping, l as useTimeout, m as createSelector, n as compareItemEquality, o as hasNullItemLabel, s as stringifyAsLabel, p as defaultItemEquality, q as useFormContext, v as useFieldRootContext, w as useLabelableId, x as useControlled, E as EMPTY_ARRAY, y as useRefWithInit, z as isGroupedItems, S as Store, A as EMPTY_OBJECT, B as stringifyAsValue, D as useStore, F as useValueAsRef, G as useOpenInteractionType, H as useField, I as createGenericEventDetails, J as inputClear, K as inputChange, L as createChangeEventDetails, M as focusOut, O as outsidePress, P as getTarget, Q as itemPress, R as selectedValueIncludes, T as removeItem, U as none, V as findItemIndex, W as useValueChanged, X as useFloatingRootContext, Y as useClick, Z as inputPress, _ as useDismiss, $ as contains, a0 as useListNavigation, a1 as useInteractions, a2 as useOnFirstRender, a3 as useMergedRefs, a4 as visuallyHiddenInput, a5 as visuallyHidden, a6 as resolveMultipleLabels, a7 as resolveSelectedLabel, a8 as fieldValidityMapping, a9 as pressableTriggerOpenStateMapping, aa as useButton, ab as closePress, ac as useLabelableContext, ad as useDirection, ae as DEFAULT_FIELD_STATE_ATTRIBUTES, af as resolveAriaLabelledBy, ag as stopEvent, ah as isFirefox, ai as escapeKey, aj as isAndroid, ak as useTypeahead, al as listNavigation, am as ownerDocument, an as getPseudoElementBounds, ao as CompositeList, ap as FloatingPortal, aq as DROPDOWN_COLLISION_AVOIDANCE, ar as useAnchorPositioning, as as useScrollLock, at as InternalBackdrop, au as inertValue, av as getDisabledMountTransitionStyles, aw as popupStateMapping, ax as FloatingFocusManager, ay as useCompositeListItem, az as IndexGuessBehavior, aA as chipRemovePress, aB as triggerOpenStateMapping, aC as clearPress, aD as useId, aE as ContextMenuRootContext, aF as MenuRootContext, aG as MenuRoot, aH as useContextMenuRootContext, aI as useMenuRootContext, aJ as findRootOwnerId, aK as cancelOpen, aL as triggerPress, aM as MenubarContext, aN as FloatingTree, aO as CompositeRoot, aP as useFloatingNodeId, aQ as useFloatingTree, aR as useMenubarContext, aS as FloatingNode, aT as useFloatingParentNodeId, aU as linkPress, aV as activeElement, aW as triggerHover, aX as getEmptyRootContext, aY as useHoverFloatingInteraction, aZ as getNodeChildren, a_ as useAnimationFrame, a$ as useAnimationsFinished, b0 as getWindow, b1 as TransitionStatusDataAttributes, b2 as useHoverInteractionSharedState, b3 as clearSafePolygonPointerEventsMutation, b4 as useHoverReferenceInteraction, b5 as safePolygon, b6 as isWebKit, b7 as CompositeItem, b8 as FocusGuard, b9 as isOutsideEvent, ba as getPreviousTabbable, bb as ownerVisuallyHidden, bc as isTabbable, bd as getNextTabbable, be as getTabbableAfterElement, bf as applySafePolygonPointerEventsMutation, bg as PATIENT_CLICK_THRESHOLD, bh as POPUP_COLLISION_AVOIDANCE, bi as adaptiveOrigin, bj as enableFocusInside, bk as disableFocusInside, bl as clamp, bm as warn, bn as getDefaultLabelId, bo as keyboard, bp as isElement, bq as drag, br as trackPress, bs as useCSPContext, bt as useOnMount, bu as mergeProps, bv as COMPOSITE_KEYS, bw as HOME, bx as END, by as ARROW_LEFT, bz as ARROW_DOWN, bA as ARROW_RIGHT, bB as ARROW_UP, bC as useServerConfig, bD as useUserSettings, bE as useSortedLanguages, bF as Select, bG as SelectTrigger, bH as cn, bI as SelectValue, bJ as SelectContent, bK as SelectItem, bL as useSidebar, bM as SidebarGroup, bN as SidebarGroupLabel, bO as SidebarMenu, bP as SidebarMenuItem, bQ as SidebarMenuButton, bR as DropdownMenu, bS as DropdownMenuTrigger, bT as Ellipsis, bU as SidebarMenuAction, bV as DropdownMenuContent, bW as DropdownMenuItem, bX as Folder, bY as DropdownMenuSeparator, bZ as Trash2, b_ as BRAND, b$ as DIRTY, c0 as EMPTY_PATH, c1 as INVALID, c2 as NEVER, c3 as OK, c4 as ParseStatus, c5 as ZodType, c6 as ZodAny, c7 as ZodArray, c8 as ZodBigInt, c9 as ZodBoolean, ca as ZodBranded, cb as ZodCatch, cc as ZodDate, cd as ZodDefault, ce as ZodDiscriminatedUnion, cf as ZodEffects, cg as ZodEnum, ch as ZodError, ci as ZodFirstPartyTypeKind, cj as ZodFunction, ck as ZodIntersection, cl as ZodIssueCode, cm as ZodLazy, cn as ZodLiteral, co as ZodMap, cp as ZodNaN, cq as ZodNativeEnum, cr as ZodNever, cs as ZodNull, ct as ZodNullable, cu as ZodNumber, cv as ZodObject, cw as ZodOptional, cx as ZodParsedType, cy as ZodPipeline, cz as ZodPromise, cA as ZodReadonly, cB as ZodRecord, cC as ZodSet, cD as ZodString, cE as ZodSymbol, cF as ZodTuple, cG as ZodUndefined, cH as ZodUnion, cI as ZodUnknown, cJ as ZodVoid, cK as addIssueToContext, cL as anyType, cM as arrayType, cN as bigIntType, cO as booleanType, cP as coerce, cQ as custom, cR as dateType, cS as datetimeRegex, cT as errorMap, cU as discriminatedUnionType, cV as effectsType, cW as enumType, cX as functionType, cY as getErrorMap, cZ as getParsedType, c_ as instanceOfType, c$ as intersectionType, d0 as isAborted, d1 as isAsync, d2 as isDirty, d3 as isValid, d4 as late, d5 as lazyType, d6 as literalType, d7 as makeIssue, d8 as mapType, d9 as nanType, da as nativeEnumType, db as neverType, dc as nullType, dd as nullableType, de as numberType, df as objectType, dg as objectUtil, dh as oboolean, di as onumber, dj as optionalType, dk as ostring, dl as pipelineType, dm as preprocessType, dn as promiseType, dp as quotelessJson, dq as recordType, dr as setType, ds as setErrorMap, dt as strictObjectType, du as stringType, dv as symbolType, dw as tupleType, dx as undefinedType, dy as unionType, dz as unknownType, dA as util, dB as voidType, dC as MotionConfigContext, dD as isHTMLElement$1, dE as useConstant, dF as PresenceContext, dG as usePresence, dH as useIsomorphicLayoutEffect$1, dI as LayoutGroupContext, dJ as frame, dK as animateVisualElement, dL as setTarget, dM as invariant, dN as resolveElements, dO as Input, dP as Button, dQ as Plus, dR as Badge, dS as X, dT as cn$1, dU as cva, dV as Separator, dW as useRender, dX as Button$1, dY as ChevronLeft, dZ as ChevronRight, d_ as throttle, d$ as warn$1, e0 as isPercent, e1 as getDisplayName, e2 as clsx, e3 as Tooltip, e4 as Legend, e5 as X$1, e6 as InputGroup, e7 as InputGroupInput, e8 as InputGroupAddon, e9 as InputGroupButton, ea as Check, eb as Separator$1, ec as ChevronDown, ed as MenuCheckboxItem, ee as MenuCheckboxItemIndicator, ef as MenuPortal, eg as MenuPositioner, eh as MenuPopup, ei as MenuGroup, ej as MenuItem, ek as MenuGroupLabel, el as MenuRadioGroup, em as MenuRadioItem, en as MenuRadioItemIndicator, eo as MenuSubmenuRoot, ep as MenuSubmenuTrigger, eq as Close, er as Description, es as Title, et as Trigger, eu as Root$1, ev as Content$1, ew as Overlay$1, ex as Portal$1, ey as DropdownMenuContent$1, ez as DropdownMenuGroup, eA as DropdownMenuLabel, eB as DropdownMenuPortal, eC as DropdownMenuRadioGroup, eD as DropdownMenuShortcut, eE as DropdownMenuSub, eF as DropdownMenuSubContent, eG as DropdownMenuSubTrigger, eH as NEW_ENTITY_PATH, eI as getEntityName, eJ as useDetailPage, eK as getOperationVariablesFields, eL as Page, eM as PageTitle, eN as PageActionBar, eO as PageActionBarRight, eP as PageLayout, eQ as PageBlock, eR as DetailFormGrid, eS as FormFieldWrapper, eT as TranslatableFormFieldWrapper, eU as CustomFieldsPageBlock, eV as DefaultInputForType } from "./chunks/use-job-queue-polling-Cqr5CKxU.js";
2
- import { nk, hP, hQ, hR, hS, me, mf, fz, fx, f0, i3, i6, i4, hU, hV, hW, hX, hY, hZ, h_, h$, i0, i1, hT, i2, kj, i5, gw, kk, gy, gx, gk, gl, gA, gB, gD, gE, gH, gF, gG, gI, gJ, gK, gM, gN, fV, eX, eW, f1, i8, i9, ia, ib, ic, id, ie, nl, ih, ii, ij, ik, il, im, io, ip, iq, gO, gP, gQ, gm, ir, it, is, fy, f2, iu, iv, iw, ix, iy, iz, iA, iB, iC, gR, gS, f3, gU, gV, gW, gX, gY, hM, nm, gZ, f4, g_, lu, l5, g$, hD, h0, f5, h1, h2, fX, nn, kq, fU, fW, fA, fB, fC, fD, f_, fG, fI, fH, fJ, g0, g2, fK, fE, g4, fT, gi, eY, f7, f8, h3, mg, gn, gu, iE, iF, iG, iH, iI, iJ, iK, iL, iD, iM, iN, ko, iO, iP, h4, h5, h6, fF, f9, h7, iQ, iR, iS, iT, iU, iV, iW, iX, iY, iZ, i_, lv, mp, go, g5, g6, i$, md, h8, h9, ha, hb, hc, he, hd, j0, j1, j2, g7, f$, hg, ht, j3, j4, e_, eZ, no, np, nq, nr, ns, j5, gj, gp, hh, hu, mx, ml, hq, gv, hi, g8, gq, hp, kt, e$, fa, fi, hj, g9, g1, gr, gs, gt, hk, fb, hF, hE, lC, mo, mm, mn, mr, hl, hn, hm, j6, j7, j8, j9, ja, jb, jc, fc, jd, ho, hK, je, jf, jg, jh, ji, jj, fg, ff, hr, jk, jl, ga, fo, fm, hs, hN, hv, hG, hw, fq, hz, hA, g3, nt, gb, gc, jm, jn, jo, jp, jq, jr, js, fr, hB, jt, ju, jv, jw, jx, jy, jz, jA, jB, jC, jD, jE, jF, jG, jH, jI, jJ, jK, jL, jM, jN, jO, jP, jQ, jR, fh, jS, fs, jU, hC, ft, fu, jV, jW, jX, jY, jZ, hx, hy, j_, j$, k0, k1, k2, k3, k4, k5, hH, fv, k7, fw, hL, jT, ka, k8, k9, kc, kd, ke, kf, hI, gg, hJ, gh, kp, kz, kA, hO, kC, lf, kP, kO, lt, lb, le, kE, mu, mv, kG, mF, gz, ly, mI, i7, fZ, ig, fR, fS, nz, kM, fl, mK, mL, mJ, lG, gC, lw, fp, fk, l8, mw, mG, mM, l7, kI, kJ, my, lZ, nA, la, ld, ki, kh, kB, fL, kN, mc, mi, l1, mk, ky, kx, lz, lx, ls, mA, l9, mH, k_, n2, kR, lB, lc, fO, fP, kD, kQ, kV, ms, kU, kW, kS, kT, mR, fN, mE, kX, ma, kF, lA, mC, kK, mN, m7, m4, l0, gT, lQ, m0, fQ, lK, lJ, lT, m1, kZ, m6, lS, l$, lR, l_, m2, lN, lP, m5, mq, m3, lU, kY, lL, lM, lX, lY, lV, lW, lO, m9, kr, ks, nu, fd, fe, nv, m8, gd, nB, l6, ku, kv, fY, fM, fj, mO, kg, lg, mh, l2, l3, mj, kw, lh, kH, li, lj, lk, ll, lm, ln, mz, lo, mD, lp, lF, nC, l4, kl, mQ, mP, km, kL, mt, mS, lH, lI, k6, kb, lE, mb, mU, mT, ge, mV, mW, kn, mX, lq, mY, f6, mZ, m_, m$, n0, n1, mB, n3, n4, gf, lD, n5, hf, n8, ne, n6, k$, n7, lr, nw, na, n9, nb, nc, gL, fn, ng, nd, nx, nf, ny, nh, ni, nj, nD } from "./chunks/use-job-queue-polling-Cqr5CKxU.js";
1
+ import { c as createLucideIcon, g as getComputedStyle$1, i as isHTMLElement, r as round, a as createLucideIcon$1, b as isFieldDisabled, C as Checkbox, u as useBaseUiId, d as useIsoLayoutEffect, f as formatErrorMessage, e as useRenderElement, N as NOOP, h as useTransitionStatus, j as useStableCallback, k as useOpenChangeComplete, t as transitionStatusMapping, l as useTimeout, m as createSelector, n as compareItemEquality, o as hasNullItemLabel, s as stringifyAsLabel, p as defaultItemEquality, q as useFormContext, v as useFieldRootContext, w as useLabelableId, x as useControlled, E as EMPTY_ARRAY, y as useRefWithInit, z as isGroupedItems, S as Store, A as EMPTY_OBJECT, B as stringifyAsValue, D as useStore, F as useValueAsRef, G as useOpenInteractionType, H as useField, I as createGenericEventDetails, J as inputClear, K as inputChange, L as createChangeEventDetails, M as focusOut, O as outsidePress, P as getTarget, Q as itemPress, R as selectedValueIncludes, T as removeItem, U as none, V as findItemIndex, W as useValueChanged, X as useFloatingRootContext, Y as useClick, Z as inputPress, _ as useDismiss, $ as contains, a0 as useListNavigation, a1 as useInteractions, a2 as useOnFirstRender, a3 as useMergedRefs, a4 as visuallyHiddenInput, a5 as visuallyHidden, a6 as resolveMultipleLabels, a7 as resolveSelectedLabel, a8 as fieldValidityMapping, a9 as pressableTriggerOpenStateMapping, aa as useButton, ab as closePress, ac as useLabelableContext, ad as useDirection, ae as DEFAULT_FIELD_STATE_ATTRIBUTES, af as resolveAriaLabelledBy, ag as stopEvent, ah as isFirefox, ai as escapeKey, aj as isAndroid, ak as useTypeahead, al as listNavigation, am as ownerDocument, an as getPseudoElementBounds, ao as CompositeList, ap as FloatingPortal, aq as DROPDOWN_COLLISION_AVOIDANCE, ar as useAnchorPositioning, as as useScrollLock, at as InternalBackdrop, au as inertValue, av as getDisabledMountTransitionStyles, aw as popupStateMapping, ax as FloatingFocusManager, ay as useCompositeListItem, az as IndexGuessBehavior, aA as chipRemovePress, aB as triggerOpenStateMapping, aC as clearPress, aD as useId, aE as ContextMenuRootContext, aF as MenuRootContext, aG as MenuRoot, aH as useContextMenuRootContext, aI as useMenuRootContext, aJ as findRootOwnerId, aK as cancelOpen, aL as triggerPress, aM as MenubarContext, aN as FloatingTree, aO as CompositeRoot, aP as useFloatingNodeId, aQ as useFloatingTree, aR as useMenubarContext, aS as FloatingNode, aT as useFloatingParentNodeId, aU as linkPress, aV as activeElement, aW as triggerHover, aX as getEmptyRootContext, aY as useHoverFloatingInteraction, aZ as getNodeChildren, a_ as useAnimationFrame, a$ as useAnimationsFinished, b0 as getWindow, b1 as TransitionStatusDataAttributes, b2 as useHoverInteractionSharedState, b3 as clearSafePolygonPointerEventsMutation, b4 as useHoverReferenceInteraction, b5 as safePolygon, b6 as isWebKit, b7 as CompositeItem, b8 as FocusGuard, b9 as isOutsideEvent, ba as getPreviousTabbable, bb as ownerVisuallyHidden, bc as isTabbable, bd as getNextTabbable, be as getTabbableAfterElement, bf as applySafePolygonPointerEventsMutation, bg as PATIENT_CLICK_THRESHOLD, bh as POPUP_COLLISION_AVOIDANCE, bi as adaptiveOrigin, bj as enableFocusInside, bk as disableFocusInside, bl as clamp, bm as warn, bn as getDefaultLabelId, bo as keyboard, bp as isElement, bq as drag, br as trackPress, bs as useCSPContext, bt as useOnMount, bu as mergeProps, bv as COMPOSITE_KEYS, bw as HOME, bx as END, by as ARROW_LEFT, bz as ARROW_DOWN, bA as ARROW_RIGHT, bB as ARROW_UP, bC as useServerConfig, bD as useUserSettings, bE as useSortedLanguages, bF as Select, bG as SelectTrigger, bH as cn, bI as SelectValue, bJ as SelectContent, bK as SelectItem, bL as useSidebar, bM as SidebarGroup, bN as SidebarGroupLabel, bO as SidebarMenu, bP as SidebarMenuItem, bQ as SidebarMenuButton, bR as DropdownMenu, bS as DropdownMenuTrigger, bT as Ellipsis, bU as SidebarMenuAction, bV as DropdownMenuContent, bW as DropdownMenuItem, bX as Folder, bY as DropdownMenuSeparator, bZ as Trash2, b_ as BRAND, b$ as DIRTY, c0 as EMPTY_PATH, c1 as INVALID, c2 as NEVER, c3 as OK, c4 as ParseStatus, c5 as ZodType, c6 as ZodAny, c7 as ZodArray, c8 as ZodBigInt, c9 as ZodBoolean, ca as ZodBranded, cb as ZodCatch, cc as ZodDate, cd as ZodDefault, ce as ZodDiscriminatedUnion, cf as ZodEffects, cg as ZodEnum, ch as ZodError, ci as ZodFirstPartyTypeKind, cj as ZodFunction, ck as ZodIntersection, cl as ZodIssueCode, cm as ZodLazy, cn as ZodLiteral, co as ZodMap, cp as ZodNaN, cq as ZodNativeEnum, cr as ZodNever, cs as ZodNull, ct as ZodNullable, cu as ZodNumber, cv as ZodObject, cw as ZodOptional, cx as ZodParsedType, cy as ZodPipeline, cz as ZodPromise, cA as ZodReadonly, cB as ZodRecord, cC as ZodSet, cD as ZodString, cE as ZodSymbol, cF as ZodTuple, cG as ZodUndefined, cH as ZodUnion, cI as ZodUnknown, cJ as ZodVoid, cK as addIssueToContext, cL as anyType, cM as arrayType, cN as bigIntType, cO as booleanType, cP as coerce, cQ as custom, cR as dateType, cS as datetimeRegex, cT as errorMap, cU as discriminatedUnionType, cV as effectsType, cW as enumType, cX as functionType, cY as getErrorMap, cZ as getParsedType, c_ as instanceOfType, c$ as intersectionType, d0 as isAborted, d1 as isAsync, d2 as isDirty, d3 as isValid, d4 as late, d5 as lazyType, d6 as literalType, d7 as makeIssue, d8 as mapType, d9 as nanType, da as nativeEnumType, db as neverType, dc as nullType, dd as nullableType, de as numberType, df as objectType, dg as objectUtil, dh as oboolean, di as onumber, dj as optionalType, dk as ostring, dl as pipelineType, dm as preprocessType, dn as promiseType, dp as quotelessJson, dq as recordType, dr as setType, ds as setErrorMap, dt as strictObjectType, du as stringType, dv as symbolType, dw as tupleType, dx as undefinedType, dy as unionType, dz as unknownType, dA as util, dB as voidType, dC as MotionConfigContext, dD as isHTMLElement$1, dE as useConstant, dF as PresenceContext, dG as usePresence, dH as useIsomorphicLayoutEffect$1, dI as LayoutGroupContext, dJ as frame, dK as animateVisualElement, dL as setTarget, dM as invariant, dN as resolveElements, dO as Input, dP as Button, dQ as Plus, dR as Badge, dS as X, dT as cn$1, dU as cva, dV as Separator, dW as useRender, dX as Button$1, dY as ChevronLeft, dZ as ChevronRight, d_ as throttle, d$ as warn$1, e0 as isPercent, e1 as getDisplayName, e2 as clsx, e3 as Tooltip, e4 as Legend, e5 as X$1, e6 as InputGroup, e7 as InputGroupInput, e8 as InputGroupAddon, e9 as InputGroupButton, ea as Check, eb as Separator$1, ec as ChevronDown, ed as MenuCheckboxItem, ee as MenuCheckboxItemIndicator, ef as MenuPortal, eg as MenuPositioner, eh as MenuPopup, ei as MenuGroup, ej as MenuItem, ek as MenuGroupLabel, el as MenuRadioGroup, em as MenuRadioItem, en as MenuRadioItemIndicator, eo as MenuSubmenuRoot, ep as MenuSubmenuTrigger, eq as Close, er as Description, es as Title, et as Trigger, eu as Root$1, ev as Content$1, ew as Overlay$1, ex as Portal$1, ey as DropdownMenuContent$1, ez as DropdownMenuGroup, eA as DropdownMenuLabel, eB as DropdownMenuPortal, eC as DropdownMenuRadioGroup, eD as DropdownMenuShortcut, eE as DropdownMenuSub, eF as DropdownMenuSubContent, eG as DropdownMenuSubTrigger, eH as NEW_ENTITY_PATH, eI as getEntityName, eJ as useDetailPage, eK as getOperationVariablesFields, eL as Page, eM as PageTitle, eN as PageActionBar, eO as PageActionBarRight, eP as PageLayout, eQ as PageBlock, eR as DetailFormGrid, eS as FormFieldWrapper, eT as TranslatableFormFieldWrapper, eU as CustomFieldsPageBlock, eV as DefaultInputForType } from "./chunks/use-job-queue-polling-PQ-fadAl.js";
2
+ import { nk, hP, hQ, hR, hS, me, mf, fz, fx, f0, i3, i6, i4, hU, hV, hW, hX, hY, hZ, h_, h$, i0, i1, hT, i2, kj, i5, gw, kk, gy, gx, gk, gl, gA, gB, gD, gE, gH, gF, gG, gI, gJ, gK, gM, gN, fV, eX, eW, f1, i8, i9, ia, ib, ic, id, ie, nl, ih, ii, ij, ik, il, im, io, ip, iq, gO, gP, gQ, gm, ir, it, is, fy, f2, iu, iv, iw, ix, iy, iz, iA, iB, iC, gR, gS, f3, gU, gV, gW, gX, gY, hM, nm, gZ, f4, g_, lu, l5, g$, hD, h0, f5, h1, h2, fX, nn, kq, fU, fW, fA, fB, fC, fD, f_, fG, fI, fH, fJ, g0, g2, fK, fE, g4, fT, gi, eY, f7, f8, h3, mg, gn, gu, iE, iF, iG, iH, iI, iJ, iK, iL, iD, iM, iN, ko, iO, iP, h4, h5, h6, fF, f9, h7, iQ, iR, iS, iT, iU, iV, iW, iX, iY, iZ, i_, lv, mp, go, g5, g6, i$, md, h8, h9, ha, hb, hc, he, hd, j0, j1, j2, g7, f$, hg, ht, j3, j4, e_, eZ, no, np, nq, nr, ns, j5, gj, gp, hh, hu, mx, ml, hq, gv, hi, g8, gq, hp, kt, e$, fa, fi, hj, g9, g1, gr, gs, gt, hk, fb, hF, hE, lC, mo, mm, mn, mr, hl, hn, hm, j6, j7, j8, j9, ja, jb, jc, fc, jd, ho, hK, je, jf, jg, jh, ji, jj, fg, ff, hr, jk, jl, ga, fo, fm, hs, hN, hv, hG, hw, fq, hz, hA, g3, nt, gb, gc, jm, jn, jo, jp, jq, jr, js, fr, hB, jt, ju, jv, jw, jx, jy, jz, jA, jB, jC, jD, jE, jF, jG, jH, jI, jJ, jK, jL, jM, jN, jO, jP, jQ, jR, fh, jS, fs, jU, hC, ft, fu, jV, jW, jX, jY, jZ, hx, hy, j_, j$, k0, k1, k2, k3, k4, k5, hH, fv, k7, fw, hL, jT, ka, k8, k9, kc, kd, ke, kf, hI, gg, hJ, gh, kp, kz, kA, hO, kC, lf, kP, kO, lt, lb, le, kE, mu, mv, kG, mF, gz, ly, mI, i7, fZ, ig, fR, fS, nz, kM, fl, mK, mL, mJ, lG, gC, lw, fp, fk, l8, mw, mG, mM, l7, kI, kJ, my, lZ, nA, la, ld, ki, kh, kB, fL, kN, mc, mi, l1, mk, ky, kx, lz, lx, ls, mA, l9, mH, k_, n2, kR, lB, lc, fO, fP, kD, kQ, kV, ms, kU, kW, kS, kT, mR, fN, mE, kX, ma, kF, lA, mC, kK, mN, m7, m4, l0, gT, lQ, m0, fQ, lK, lJ, lT, m1, kZ, m6, lS, l$, lR, l_, m2, lN, lP, m5, mq, m3, lU, kY, lL, lM, lX, lY, lV, lW, lO, m9, kr, ks, nu, fd, fe, nv, m8, gd, nB, l6, ku, kv, fY, fM, fj, mO, kg, lg, mh, l2, l3, mj, kw, lh, kH, li, lj, lk, ll, lm, ln, mz, lo, mD, lp, lF, nC, l4, kl, mQ, mP, km, kL, mt, mS, lH, lI, k6, kb, lE, mb, mU, mT, ge, mV, mW, kn, mX, lq, mY, f6, mZ, m_, m$, n0, n1, mB, n3, n4, gf, lD, n5, hf, n8, ne, n6, k$, n7, lr, nw, na, n9, nb, nc, gL, fn, ng, nd, nx, nf, ny, nh, ni, nj, nD } from "./chunks/use-job-queue-polling-PQ-fadAl.js";
3
3
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import React__default, { useId as useId$1, useRef, useContext, useInsertionEffect, useMemo, Children, isValidElement, useState, createContext, useCallback, useEffect, forwardRef, useImperativeHandle, cloneElement, useLayoutEffect, useSyncExternalStore } from "react";
@@ -1,7 +1,7 @@
1
1
  import "react/jsx-runtime";
2
- import "./chunks/use-job-queue-polling-Cqr5CKxU.js";
2
+ import "./chunks/use-job-queue-polling-PQ-fadAl.js";
3
3
  import "sonner";
4
- import "./chunks/main-D_rN3aKO.js";
4
+ import "./chunks/main-DJTS8BrQ.js";
5
5
  import "@tanstack/react-router";
6
6
  import "react";
7
7
  import "react-dom";
@@ -251,28 +251,23 @@ async function resolveSourceContext(inputPath, customSourceRoot, logger) {
251
251
  */
252
252
  async function compileTypeScript({ outputPath, logger, module, sourceRoot, tsConfigInfo, sourceFiles, }) {
253
253
  await fs.ensureDir(outputPath);
254
- // Copying the JSON is enough for CommonJS, whose require() reads it directly.
255
- // ESM emits the import unchanged, and Node refuses to load a JSON module
256
- // without an `with { type: 'json' }` attribute that TypeScript will not emit
257
- // for a source file targeting CommonJS. Say so here, naming the files, so the
258
- // ERR_IMPORT_ATTRIBUTE_MISSING that follows has an explanation above it.
259
- if (module === 'esm') {
260
- const jsonFiles = sourceFiles.filter(file => file.endsWith('.json'));
261
- if (jsonFiles.length) {
262
- logger.warn(`Imported JSON is not yet supported with module: 'esm', so loading the config will fail on ` +
263
- `${jsonFiles.join(', ')}. Use module: 'commonjs', or read the file at runtime instead of importing it.`);
264
- }
265
- }
254
+ const afterTransformers = [];
266
255
  // Build path transformer for ESM mode
267
256
  // This is necessary because tsconfig-paths.register() only works for CommonJS require(),
268
257
  // not for ESM import(). We need to transform the import paths during transpilation.
269
- let pathTransformer;
270
258
  if (module === 'esm' && tsConfigInfo) {
271
259
  logger.debug('Adding path transformer for ESM mode');
272
- pathTransformer = createPathTransformer({
260
+ afterTransformers.push(createPathTransformer({
273
261
  baseUrl: tsConfigInfo.baseUrl,
274
262
  paths: tsConfigInfo.paths,
275
- });
263
+ }));
264
+ }
265
+ // Copying the JSON is enough for CommonJS, whose require() reads it directly.
266
+ // TypeScript emits the import without an attribute, and Node refuses to load a
267
+ // JSON module in ESM without `with { type: 'json' }`, which the author cannot write
268
+ // in a source file that also targets CommonJS for the server build.
269
+ if (module === 'esm') {
270
+ afterTransformers.push(createJsonImportAttributeTransformer());
276
271
  }
277
272
  // Note: emitDecoratorMetadata with transpileModule emits `Object` for all
278
273
  // imported types since there is no type resolver. This is acceptable because
@@ -289,8 +284,8 @@ async function compileTypeScript({ outputPath, logger, module, sourceRoot, tsCon
289
284
  emitDecoratorMetadata: true,
290
285
  esModuleInterop: true,
291
286
  };
292
- const transformers = pathTransformer
293
- ? { after: [pathTransformer] }
287
+ const transformers = afterTransformers.length
288
+ ? { after: afterTransformers }
294
289
  : undefined;
295
290
  const pendingEmits = [];
296
291
  for (const filePath of sourceFiles) {
@@ -318,6 +313,43 @@ async function compileTypeScript({ outputPath, logger, module, sourceRoot, tsCon
318
313
  await fs.writeFile(emit.outputFilePath, emit.outputText);
319
314
  }
320
315
  }
316
+ /**
317
+ * Adds `type: 'json'` to the import attributes of import and export declarations
318
+ * of `.json` specifiers that do not already carry a `type` attribute. Any other
319
+ * attributes, including an empty `with {}`, are kept and the entry is appended.
320
+ *
321
+ * Matching on the `.json` suffix is a superset of the rule `collectLocalSourceFiles`
322
+ * uses to copy a JSON file. Bare specifiers such as `some-pkg/data.json` are never
323
+ * copied, but still get the attribute, because Node requires it for them too.
324
+ */
325
+ function createJsonImportAttributeTransformer() {
326
+ return context => {
327
+ const { factory } = context;
328
+ const withJsonAttribute = (attributes) => {
329
+ const typeJson = factory.createImportAttribute(factory.createIdentifier('type'), factory.createStringLiteral('json'));
330
+ return attributes
331
+ ? factory.updateImportAttributes(attributes, factory.createNodeArray([...attributes.elements, typeJson]), attributes.multiLine)
332
+ : factory.createImportAttributes(factory.createNodeArray([typeJson]));
333
+ };
334
+ const needsJsonAttributes = (node) => {
335
+ var _a;
336
+ return !((_a = node.attributes) === null || _a === void 0 ? void 0 : _a.elements.some(attribute => attribute.name.text === 'type')) &&
337
+ !!node.moduleSpecifier &&
338
+ ts.isStringLiteral(node.moduleSpecifier) &&
339
+ node.moduleSpecifier.text.endsWith('.json');
340
+ };
341
+ const visitor = node => {
342
+ if (ts.isImportDeclaration(node) && needsJsonAttributes(node)) {
343
+ return factory.updateImportDeclaration(node, node.modifiers, node.importClause, node.moduleSpecifier, withJsonAttribute(node.attributes));
344
+ }
345
+ if (ts.isExportDeclaration(node) && needsJsonAttributes(node)) {
346
+ return factory.updateExportDeclaration(node, node.modifiers, node.isTypeOnly, node.exportClause, node.moduleSpecifier, withJsonAttribute(node.attributes));
347
+ }
348
+ return node;
349
+ };
350
+ return sourceFile => ts.visitEachChild(sourceFile, visitor, context);
351
+ };
352
+ }
321
353
  function assertWithinOutputPath(outputFilePath, outputPath) {
322
354
  // An emit outside outputPath escapes the package.json written there to
323
355
  // declare the module type, and Node then resolves the file against the
@@ -20,11 +20,11 @@ export interface TranslationsPluginOptions {
20
20
  *
21
21
  * It handles 2 modes: dev and build.
22
22
  *
23
- * - The dev case is handled in the `load` function using Vite virtual
24
- * modules to compile and return translations from plugins _only_, which then get merged with the built-in
23
+ * - The `load` function serves the `virtual:plugin-translations` module in both dev and build. It
24
+ * compiles and returns translations from plugins _only_, which then get merged with the built-in
25
25
  * translations in the `loadI18nMessages` function
26
- * - The build case loads both built-in and plugin translations, merges them, and outputs the compiled
27
- * files as .js files that can be statically consumed by the built app.
26
+ * - The `generateBundle` function additionally emits the merged built-in and plugin catalogs as .js
27
+ * files under the `outputPath` directory. Nothing in the dashboard reads those files today.
28
28
  *
29
29
  * @param options
30
30
  */