@mohasinac/appkit 4.25.0 → 4.27.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.
Files changed (58) hide show
  1. package/dist/_internal/server/features/bundles/actions.d.ts +4 -1
  2. package/dist/_internal/server/features/bundles/actions.js +54 -5
  3. package/dist/_internal/server/features/bundles/data.d.ts +19 -0
  4. package/dist/_internal/server/features/bundles/data.js +32 -0
  5. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  6. package/dist/_internal/server/features/bundles/index.js +1 -1
  7. package/dist/_internal/server/features/checkout/actions.js +38 -68
  8. package/dist/_internal/server/features/checkout/expand-order-items.d.ts +35 -0
  9. package/dist/_internal/server/features/checkout/expand-order-items.js +85 -0
  10. package/dist/_internal/server/features/grouped/index.d.ts +2 -0
  11. package/dist/_internal/server/features/grouped/index.js +2 -0
  12. package/dist/_internal/server/features/grouped/metadata.d.ts +17 -0
  13. package/dist/_internal/server/features/grouped/metadata.js +48 -0
  14. package/dist/_internal/server/features/grouped/og.d.ts +16 -0
  15. package/dist/_internal/server/features/grouped/og.js +24 -0
  16. package/dist/_internal/server/features/seo/sitemap.js +24 -1
  17. package/dist/_internal/shared/checkout/order-math.d.ts +63 -4
  18. package/dist/_internal/shared/checkout/order-math.js +119 -7
  19. package/dist/client.d.ts +7 -3
  20. package/dist/client.js +3 -2
  21. package/dist/constants/api-endpoints.d.ts +0 -6
  22. package/dist/constants/api-endpoints.js +0 -2
  23. package/dist/features/analytics/types.d.ts +1 -1
  24. package/dist/features/analytics/types.js +3 -0
  25. package/dist/features/cart/components/CartGroupLineRow.d.ts +42 -0
  26. package/dist/features/cart/components/CartGroupLineRow.js +33 -0
  27. package/dist/features/cart/components/index.d.ts +2 -0
  28. package/dist/features/cart/components/index.js +1 -0
  29. package/dist/features/cart/repository/cart.repository.js +6 -0
  30. package/dist/features/cart/schemas/firestore.d.ts +7 -2
  31. package/dist/features/categories/components/BundleBuyNowCta.d.ts +18 -5
  32. package/dist/features/categories/components/BundleBuyNowCta.js +24 -10
  33. package/dist/features/categories/components/BundleDetailView.d.ts +8 -1
  34. package/dist/features/categories/components/BundleDetailView.js +2 -2
  35. package/dist/features/categories/components/BundlesListView.d.ts +1 -0
  36. package/dist/features/categories/components/CategoryBundlesListing.d.ts +3 -0
  37. package/dist/features/grouped/components/GroupedListingDetailView.d.ts +21 -0
  38. package/dist/features/grouped/components/GroupedListingDetailView.js +17 -0
  39. package/dist/features/grouped/components/GroupedListingsCarousel.js +6 -1
  40. package/dist/features/orders/index.d.ts +1 -1
  41. package/dist/features/orders/index.js +1 -1
  42. package/dist/features/orders/schemas/firestore.d.ts +11 -0
  43. package/dist/features/orders/utils/bundle-grouping.d.ts +29 -19
  44. package/dist/features/orders/utils/bundle-grouping.js +32 -22
  45. package/dist/features/tester/seed-data/categories-tester-seed-data.js +6 -0
  46. package/dist/features/tester/seed-data/products-tester-seed-data.js +150 -1
  47. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +118 -0
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.js +1 -1
  50. package/dist/next/routing/route-map.d.ts +12 -0
  51. package/dist/next/routing/route-map.js +6 -0
  52. package/dist/server-entry.d.ts +1 -1
  53. package/dist/server-entry.js +1 -1
  54. package/dist/server.d.ts +3 -1
  55. package/dist/server.js +5 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/tailwind-utilities.css +1 -1
  58. package/package.json +1 -1
@@ -729,6 +729,124 @@ const rawTesterChecklistItems = [
729
729
  href: "/cart",
730
730
  cases: [
731
731
  { key: "update-qty", label: "Updating item quantity in cart recalculates the total" },
732
+ // ── Grouped & bundle cart lines ──────────────────────────────────
733
+ // Fixtures backing these: product-tester-standard-1/2/3 (three members
734
+ // of one group, deliberately spanning two GST rates),
735
+ // product-tester-group-soldout (blocked member),
736
+ // product-tester-crossstore-a/b (a group spanning two sellers),
737
+ // bundle-tester-sandbox (a priced, all-or-nothing bundle).
738
+ {
739
+ key: "group-picker-opens",
740
+ label: "On a product that belongs to a group, the \"Part of: …\" strip has a \"Pick items →\" control that opens a picker with a Qty column and a +/- stepper on each member",
741
+ description: "Before this existed the panel was navigation only — the buyer had to open each member separately and add it as its own cart line.",
742
+ href: "/products/product-tester-standard-1",
743
+ },
744
+ {
745
+ key: "group-picker-running-total",
746
+ label: "Changing any member's quantity updates the picker's running total (\"N items · ₹X\") immediately, and \"Add selected to cart\" stays disabled while nothing is selected",
747
+ href: "/products/product-tester-standard-1",
748
+ },
749
+ {
750
+ key: "group-picker-stock-cap",
751
+ label: "A member's + button stops at that member's available stock — it cannot be pushed past it",
752
+ href: "/products/product-tester-standard-1",
753
+ },
754
+ {
755
+ key: "group-picker-blocked-member",
756
+ label: "A sold-out member shows a reason chip (e.g. \"Sold\" / \"Out of stock\") in place of its stepper and cannot be selected",
757
+ description: "Test Part — Sold Out is seeded into the tester group specifically for this. The rest of the group must stay selectable around it.",
758
+ href: "/products/product-tester-group-soldout",
759
+ },
760
+ {
761
+ key: "group-picker-one-line",
762
+ label: "\"Add selected to cart\" with two or more members creates ONE cart line, not one line per product",
763
+ description: "Pick 2 of one member and 1 of another, then open the cart: a single line reading \"N items\", not three separate rows.",
764
+ href: "/products/product-tester-standard-1",
765
+ },
766
+ {
767
+ key: "group-picker-single-member-plain-line",
768
+ label: "Selecting exactly ONE member produces an ordinary product line (with a normal quantity stepper), not a grouped line",
769
+ description: "1 item × qty N is already what a normal cart line means, so it deliberately does not become a group line.",
770
+ href: "/products/product-tester-standard-1",
771
+ },
772
+ {
773
+ key: "group-picker-cross-store",
774
+ label: "A group whose members belong to DIFFERENT sellers renders read-only — no Qty column, no \"Add selected\" button — with an explanation, rather than a button that always fails",
775
+ description: "Use the Test Cross-Store Set. Its two members sit in different stores on purpose.",
776
+ href: "/products/product-tester-crossstore-a",
777
+ },
778
+ {
779
+ key: "group-picker-guest",
780
+ label: "A signed-out visitor using the picker is shown the login prompt rather than silently losing the selection",
781
+ href: "/products/product-tester-standard-1",
782
+ },
783
+ {
784
+ key: "group-line-expands-in-cart",
785
+ label: "A grouped cart line in the cart expands to list its members with a thumbnail, unit price and its own +/- stepper each",
786
+ href: "/cart",
787
+ },
788
+ {
789
+ key: "group-line-no-line-level-stepper",
790
+ label: "A grouped line has NO line-level quantity stepper — only the per-member ones",
791
+ description: "The member quantities carry the whole selection; a second multiplier on top would double every price, tax and stock decrement.",
792
+ href: "/cart",
793
+ },
794
+ {
795
+ key: "group-line-member-edit-recalculates",
796
+ label: "Changing one member's quantity in the cart updates that line's total AND the seller-group subtotal above it",
797
+ href: "/cart",
798
+ },
799
+ {
800
+ key: "group-line-remove-member",
801
+ label: "Removing one member from a grouped line leaves the rest of the line intact; removing the LAST member removes the whole line",
802
+ href: "/cart",
803
+ },
804
+ {
805
+ key: "group-line-link-target",
806
+ label: "Clicking a grouped or bundle line's title in the cart lands on a real page — never a 404",
807
+ description: "A bundle line goes to /bundles/{slug}, a grouped-listing line to /groups/{slug}, a product-group line to its parent product. It used to point at /products/{categoryId}, which never existed.",
808
+ href: "/cart",
809
+ },
810
+ {
811
+ key: "bundle-copies-stepper",
812
+ label: "A bundle page has a \"Copies\" +/- stepper and BOTH \"Buy now\" and \"Add to cart\" — Add to cart stays on the page, Buy now goes to checkout",
813
+ description: "A bundle is all-or-nothing: there must be no per-member quantity controls anywhere on the bundle page, only the copies stepper.",
814
+ href: "/bundles/bundle-tester-sandbox",
815
+ },
816
+ {
817
+ key: "bundle-line-in-cart",
818
+ label: "A bundle in the cart lists its members READ-ONLY and offers a copies stepper; raising copies multiplies the bundle's discounted price, never the sum of the members' individual prices",
819
+ description: "Test Bundle is ₹199 while its members list at ₹199 + ₹149. Two copies must read ₹398, not ₹696.",
820
+ href: "/cart",
821
+ },
822
+ {
823
+ key: "bundle-cross-store-rejected",
824
+ label: "Saving a bundle whose items come from two different sellers is refused with a clear message naming how many sellers they span",
825
+ description: "Build a bundle mixing Test Cross-Store Set — Seller A with any Tester Sandbox product and save. Applies to both creating and editing, on the admin and the seller bundle editors. A bundle's storeId is a single value and is what decides which seller gets the order, the shipment and the payout — so a two-seller bundle would pay only one of them.",
826
+ href: "/store/bundles/new",
827
+ },
828
+ {
829
+ key: "grouped-listing-page-picker",
830
+ label: "A grouped listing has its own public page with the same picker, reachable from the \"Pick items from this group →\" button on a group carousel",
831
+ href: "/groups/group-beyblade-original-lineage",
832
+ },
833
+ {
834
+ key: "group-lane-gate",
835
+ label: "While an unpaid won auction or accepted offer is sitting in the cart, adding a group selection is refused with the same lane message as any other add",
836
+ description: "This path used to bypass the gate entirely, so a buyer could keep shopping around an obligation they had already committed to.",
837
+ href: "/products/product-tester-standard-1",
838
+ },
839
+ {
840
+ key: "group-checkout-order-rows",
841
+ label: "After checking out a grouped or bundle line, the order shows one row PER MEMBER under a single group header, and the line totals add up to the order total",
842
+ description: "Rows are expanded so each carries its own HSN code and GST rate — a collapsed row can only carry one of each, which is why bundles previously showed none.",
843
+ href: "/user/orders",
844
+ },
845
+ {
846
+ key: "group-checkout-stock",
847
+ label: "Checking out a grouped line decrements each member by (its per-copy quantity × the number of copies), not by one each",
848
+ href: "/user/orders",
849
+ },
732
850
  { key: "apply-coupon", label: "Applying a coupon code at checkout works" },
733
851
  { key: "remove-coupon", label: "Removing an already-applied coupon from the cart recalculates the total back down" },
734
852
  { key: "remove-item", label: "Removing an item from the cart works" },
package/dist/index.d.ts CHANGED
@@ -3125,7 +3125,7 @@ export type { SessionUser } from "./react/index";
3125
3125
  export type { UseUrlTableOptions } from "./react/index";
3126
3126
  export { SUCCESS_MESSAGES } from "./values/index";
3127
3127
  export { splitCartIntoOrderGroups } from "./features/orders/index";
3128
- export { groupOrderItemsByBundle, type BundleOrderGroup, type OrderItemForBundleGrouping, } from "./features/orders/index";
3128
+ export { groupOrderItemsByLine, type LineOrderGroup, type OrderItemForLineGrouping, } from "./features/orders/index";
3129
3129
  export { buildSieveFilters } from "./utils/filter.helper";
3130
3130
  export { formatCurrency, formatFileSize } from "./utils/number.formatter";
3131
3131
  export { formatMonthYear } from "./utils/date.formatter";
package/dist/index.js CHANGED
@@ -5530,7 +5530,7 @@ export { SUCCESS_MESSAGES } from "./values/index";
5530
5530
  // -- Missing order utils
5531
5531
  export { splitCartIntoOrderGroups } from "./features/orders/index";
5532
5532
  // S-SBUNI-5 2026-05-13 â€" bundle-aware order item grouping for receipts.
5533
- export { groupOrderItemsByBundle, } from "./features/orders/index";
5533
+ export { groupOrderItemsByLine, } from "./features/orders/index";
5534
5534
  // -- Missing utils
5535
5535
  export { buildSieveFilters } from "./utils/filter.helper";
5536
5536
  export { formatCurrency, formatFileSize } from "./utils/number.formatter";
@@ -25,6 +25,12 @@ export declare const DEFAULT_ROUTE_MAP: {
25
25
  readonly PRE_ORDER_DETAIL: (id: string) => string;
26
26
  readonly BUNDLES: "/bundles";
27
27
  readonly BUNDLE_DETAIL: (slug: string) => string;
28
+ /**
29
+ * A `groupedListings` document's public page. Distinct from a product
30
+ * GROUP (`product.groupId`), whose canonical page is its parent product's
31
+ * detail page — see § "Bundles vs Product Groups vs Grouped Listings".
32
+ */
33
+ readonly GROUP_DETAIL: (slug: string) => string;
28
34
  readonly PRIZE_DRAWS: "/prize-draws";
29
35
  readonly PRIZE_DRAW_DETAIL: (slug: string) => string;
30
36
  readonly SELLER_GUIDE_BUNDLES: "/seller-guide/bundles";
@@ -407,6 +413,12 @@ export declare const ROUTES: {
407
413
  readonly PRE_ORDER_DETAIL: (id: string) => string;
408
414
  readonly BUNDLES: "/bundles";
409
415
  readonly BUNDLE_DETAIL: (slug: string) => string;
416
+ /**
417
+ * A `groupedListings` document's public page. Distinct from a product
418
+ * GROUP (`product.groupId`), whose canonical page is its parent product's
419
+ * detail page — see § "Bundles vs Product Groups vs Grouped Listings".
420
+ */
421
+ readonly GROUP_DETAIL: (slug: string) => string;
410
422
  readonly PRIZE_DRAWS: "/prize-draws";
411
423
  readonly PRIZE_DRAW_DETAIL: (slug: string) => string;
412
424
  readonly SELLER_GUIDE_BUNDLES: "/seller-guide/bundles";
@@ -14,6 +14,12 @@ export const DEFAULT_ROUTE_MAP = {
14
14
  // SB1-J — bundles + prize draws (additive, pages not yet built)
15
15
  BUNDLES: "/bundles",
16
16
  BUNDLE_DETAIL: (slug) => `/bundles/${slug}`,
17
+ /**
18
+ * A `groupedListings` document's public page. Distinct from a product
19
+ * GROUP (`product.groupId`), whose canonical page is its parent product's
20
+ * detail page — see § "Bundles vs Product Groups vs Grouped Listings".
21
+ */
22
+ GROUP_DETAIL: (slug) => `/groups/${slug}`,
17
23
  PRIZE_DRAWS: "/prize-draws",
18
24
  PRIZE_DRAW_DETAIL: (slug) => `/prize-draws/${slug}`,
19
25
  SELLER_GUIDE_BUNDLES: "/seller-guide/bundles",
@@ -65,7 +65,7 @@ export { renderFaqOg, renderFaqOgImage, type FaqOgData, } from "./_internal/serv
65
65
  export { renderScamOg, renderScamOgImage, type ScamOgData, getScammerForDetail, getScammerProfilePageData as getScammerProfilePageDataCached, } from "./_internal/server/features/scams/index";
66
66
  export { getSearchResults, searchAction, type SearchQuery, } from "./_internal/server/features/search/index";
67
67
  export { getCategoryForDetail, listRootCategories, listFeaturedCategories, listMenuCategories, getCategoryTree, listSitemapCategories, CATEGORIES_PAGE_SIZE, CATEGORIES_ROOT_TIER, CATEGORIES_MAX_DEPTH, CATEGORIES_SITEMAP_LIMIT, CATEGORIES_FEATURED_LIMIT, CATEGORIES_MENU_LIMIT, } from "./_internal/server/features/categories/index";
68
- export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, type GroupedListingWithItems, type ListGroupedListingsParams, type SitemapGroupedListing, } from "./_internal/server/features/grouped/index";
68
+ export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, buildGroupedListingMetadata, renderGroupedListingOg, type GroupedListingWithItems, type ListGroupedListingsParams, type SitemapGroupedListing, type GroupedListingMetadataOptions, } from "./_internal/server/features/grouped/index";
69
69
  export { createCheckoutOrderAction, attachPaymentAction, verifyAndPlaceRazorpayOrderAction, previewCheckoutPricing, resolveShippingCost, formatShippingAddress, CHECKOUT_DEFAULT_COMMISSIONS, CHECKOUT_PAYMENT_METHODS, type CreateCheckoutOrderInput, type VerifyAndPlaceRazorpayOrderInput, type CheckoutOrderResult, type CheckoutPaymentMethod, type CheckoutPricingPreviewInput, type CheckoutPricingPreview, } from "./_internal/server/features/checkout/index";
70
70
  export { unitPriceFor, lineTotalFor, computePreOrderDepositAmount, } from "./_internal/shared/checkout/order-math";
71
71
  export { processRefundAction, type ProcessRefundInput, } from "./_internal/server/features/refunds/actions";
@@ -91,7 +91,7 @@ export { getSearchResults, searchAction, } from "./_internal/server/features/sea
91
91
  // S3: categories data layer
92
92
  export { getCategoryForDetail, listRootCategories, listFeaturedCategories, listMenuCategories, getCategoryTree, listSitemapCategories, CATEGORIES_PAGE_SIZE, CATEGORIES_ROOT_TIER, CATEGORIES_MAX_DEPTH, CATEGORIES_SITEMAP_LIMIT, CATEGORIES_FEATURED_LIMIT, CATEGORIES_MENU_LIMIT, } from "./_internal/server/features/categories/index";
93
93
  // S3: grouped listings data layer
94
- export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, } from "./_internal/server/features/grouped/index";
94
+ export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, buildGroupedListingMetadata, renderGroupedListingOg, } from "./_internal/server/features/grouped/index";
95
95
  // SB-UNI-V — bundles data layer deleted; consumers should query
96
96
  // `categoriesRepository.findBySlugAndType(slug, "bundle")` /
97
97
  // `.listByType("bundle", opts)` / `.findById(id)` directly.
package/dist/server.d.ts CHANGED
@@ -501,8 +501,10 @@ export { GoogleReviewsSection } from "./features/homepage/components/GoogleRevie
501
501
  export type { GoogleReviewsSectionProps } from "./features/homepage/components/GoogleReviewsSection";
502
502
  export { getProductForDetail, listSitemapProducts, computeRelatedItems, toProductItem, type SitemapProduct, type RelatedItemsResult, } from "./_internal/server/features/products/index";
503
503
  export { listPublicProducts, parsePublicProductParams, defaultAvailabilityForListingTypes, PUBLIC_PRODUCT_MAX_PAGE_SIZE, ANY_STATUS, type PublicProductListInput, type PublicProductListResult, type PublicProductListOptions, type PublicProductExecutor, type PublicProductQuery, } from "./_internal/server/features/products/index";
504
- export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, resolveBundleCategorySlugs, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, type BundleDataOptions, type BundleMetadataOptions, type BundleOgData, } from "./_internal/server/features/bundles/index";
504
+ export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, findBundleMemberStores, resolveBundleCategorySlugs, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, type BundleDataOptions, type BundleMetadataOptions, type BundleOgData, } from "./_internal/server/features/bundles/index";
505
505
  export { getGroupsForProduct, getGroupsWithItemsForProduct, getGroupsForCategory, getGroupsForBrand } from "./_internal/server/features/grouped/index";
506
+ export { getGroupedListingForDetail, getGroupedListingWithItems, buildGroupedListingMetadata, renderGroupedListingOg, type GroupedListingWithItems, type GroupedListingMetadataOptions, } from "./_internal/server/features/grouped/index";
507
+ export { toPublicGroupMember, toPublicGroupMembers, type PublicGroupMember, } from "./_internal/server/features/products/group-members";
506
508
  export { getAuctionForDetail, getProductFeaturesForAuction } from "./_internal/server/features/auctions/index";
507
509
  export { getPreOrderForDetail, getProductFeaturesForPreOrder } from "./_internal/server/features/pre-orders/index";
508
510
  export { getStoreForDetail, listStoreProductsInitial, listStoreAuctionsInitial, listStorePreOrdersInitial, listSitemapStores } from "./_internal/server/features/stores/index";
package/dist/server.js CHANGED
@@ -1356,8 +1356,12 @@ export { getProductForDetail, listSitemapProducts, computeRelatedItems, toProduc
1356
1356
  // share it so their filter semantics cannot drift (Root Cause #30).
1357
1357
  export { listPublicProducts, parsePublicProductParams, defaultAvailabilityForListingTypes, PUBLIC_PRODUCT_MAX_PAGE_SIZE, ANY_STATUS, } from "./_internal/server/features/products/index";
1358
1358
  // S-SBUNI-3/4 2026-05-13 — bundle data/metadata/og layer.
1359
- export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, resolveBundleCategorySlugs, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, } from "./_internal/server/features/bundles/index";
1359
+ export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, findBundleMemberStores, resolveBundleCategorySlugs, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, } from "./_internal/server/features/bundles/index";
1360
1360
  export { getGroupsForProduct, getGroupsWithItemsForProduct, getGroupsForCategory, getGroupsForBrand } from "./_internal/server/features/grouped/index";
1361
+ // Public /groups/{slug} page — data, metadata and OG.
1362
+ export { getGroupedListingForDetail, getGroupedListingWithItems, buildGroupedListingMetadata, renderGroupedListingOg, } from "./_internal/server/features/grouped/index";
1363
+ // Allow-list projection for group members — see § "Public Data Projections".
1364
+ export { toPublicGroupMember, toPublicGroupMembers, } from "./_internal/server/features/products/group-members";
1361
1365
  export { getAuctionForDetail, getProductFeaturesForAuction } from "./_internal/server/features/auctions/index";
1362
1366
  export { getPreOrderForDetail, getProductFeaturesForPreOrder } from "./_internal/server/features/pre-orders/index";
1363
1367
  export { getStoreForDetail, listStoreProductsInitial, listStoreAuctionsInitial, listStorePreOrdersInitial, listSitemapStores } from "./_internal/server/features/stores/index";