@wix/agent-skills 1.20.1 → 1.22.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 (262) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +71 -113
  3. package/skills/wix-app/references/APP_TOOLS.md +2 -1
  4. package/skills/wix-app/references/BACKEND_EVENT.md +3 -3
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +41 -152
  6. package/skills/wix-app/references/DASHBOARD_MODAL.md +4 -4
  7. package/skills/wix-app/references/DASHBOARD_PAGE.md +11 -25
  8. package/skills/wix-app/references/DATA_COLLECTION.md +16 -219
  9. package/skills/wix-app/references/SDK_MODULE_MAP.md +44 -0
  10. package/skills/wix-app/references/SITE_PLUGIN.md +36 -190
  11. package/skills/wix-app/references/app-tools/TOOLS.md +3 -1
  12. package/skills/wix-app/references/custom-element-widget/SETTINGS_PANEL.md +21 -0
  13. package/skills/wix-app/references/dashboard-page/DATA_SOURCES.md +182 -0
  14. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +97 -0
  15. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_COLLECTION.md +184 -0
  16. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_ROUTER.md +203 -0
  17. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_SETTINGS.md +44 -0
  18. package/skills/wix-app/references/dashboard-page/ECOM_NAVIGATION.md +17 -0
  19. package/skills/wix-app/references/dashboard-page/QUERY_AND_PAGING.md +182 -0
  20. package/skills/wix-app/references/dashboard-page/TABLE_STATE.md +133 -0
  21. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +10 -5
  22. package/skills/wix-app/references/dashboard-plugin/SLOTS.md +4 -18
  23. package/skills/wix-app/references/data-collection/LIFECYCLE.md +68 -0
  24. package/skills/wix-app/references/data-collection/PERMISSIONS.md +47 -0
  25. package/skills/wix-app/references/data-collection/SCHEMA.md +181 -0
  26. package/skills/wix-app/references/data-collection/WIX_DATA.md +38 -66
  27. package/skills/wix-app/references/site-plugin/EXAMPLES.md +1 -1
  28. package/skills/wix-headless-fast/SKILL.md +144 -221
  29. package/skills/wix-headless-fast/cold-start/bootstrap.mjs +156 -0
  30. package/skills/wix-headless-fast/{entry/skill.md → cold-start/cold-start.md} +15 -15
  31. package/skills/wix-headless-fast/guides/existing-site.md +76 -0
  32. package/skills/wix-headless-fast/guides/reference-mode.md +97 -0
  33. package/skills/wix-headless-fast/install/AGENTS.md +35 -0
  34. package/skills/wix-headless-fast/install/agents-md.mjs +39 -0
  35. package/skills/wix-headless-fast/install/attach.mjs +161 -86
  36. package/skills/wix-headless-fast/install/deploy.mjs +21 -60
  37. package/skills/wix-headless-fast/install/lock.mjs +55 -0
  38. package/skills/wix-headless-fast/install/setup.mjs +259 -0
  39. package/skills/wix-headless-fast/install/templates.mjs +168 -0
  40. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-create-coupon.md +10 -19
  41. package/skills/wix-manage/references/events/create-wix-event.md +5 -1
  42. package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +27 -0
  43. package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +83 -37
  44. package/skills/wix-headless-fast/install/fast-path.mjs +0 -181
  45. package/skills/wix-headless-fast/references/blog/INSTRUCTIONS.md +0 -301
  46. package/skills/wix-headless-fast/references/blog/app/components/blog/BlogFeedView.tsx +0 -136
  47. package/skills/wix-headless-fast/references/blog/app/components/blog/PostView.tsx +0 -112
  48. package/skills/wix-headless-fast/references/blog/app/components/blog/RichContent.tsx +0 -42
  49. package/skills/wix-headless-fast/references/blog/app/hooks/blog/useBlogFeed.ts +0 -31
  50. package/skills/wix-headless-fast/references/blog/app/hooks/blog/usePost.ts +0 -22
  51. package/skills/wix-headless-fast/references/blog/app/wix/blog/blog-feed-store.ts +0 -137
  52. package/skills/wix-headless-fast/references/blog/app/wix/blog/post-store.ts +0 -78
  53. package/skills/wix-headless-fast/references/blog/app/wix/blog/posts-core.ts +0 -117
  54. package/skills/wix-headless-fast/references/blog/app/wix/blog/posts.ts +0 -52
  55. package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy-core.ts +0 -47
  56. package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy.ts +0 -58
  57. package/skills/wix-headless-fast/references/blog/app/wix/blog/types.ts +0 -62
  58. package/skills/wix-headless-fast/references/blog/app-astro/layouts/SiteLayout.astro +0 -40
  59. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog/[...slug].astro +0 -97
  60. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog.astro +0 -24
  61. package/skills/wix-headless-fast/references/blog/lock/astro/package-lock.json +0 -16156
  62. package/skills/wix-headless-fast/references/blog/rest/posts.ts +0 -42
  63. package/skills/wix-headless-fast/references/blog/rest/taxonomy.ts +0 -62
  64. package/skills/wix-headless-fast/references/blog/seed/SEED.md +0 -81
  65. package/skills/wix-headless-fast/references/blog/seed/seed-blog.mjs +0 -287
  66. package/skills/wix-headless-fast/references/bookings/INSTRUCTIONS.md +0 -275
  67. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServiceBookingView.tsx +0 -144
  68. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServicesView.tsx +0 -119
  69. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useBookingFlow.ts +0 -32
  70. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useServices.ts +0 -23
  71. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking-core.ts +0 -218
  72. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking-flow-store.ts +0 -169
  73. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking.ts +0 -121
  74. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services-core.ts +0 -92
  75. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services-store.ts +0 -90
  76. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services.ts +0 -57
  77. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/types.ts +0 -72
  78. package/skills/wix-headless-fast/references/bookings/app-astro/layouts/SiteLayout.astro +0 -40
  79. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services/[slug].astro +0 -76
  80. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services.astro +0 -22
  81. package/skills/wix-headless-fast/references/bookings/lock/astro/package-lock.json +0 -11962
  82. package/skills/wix-headless-fast/references/bookings/rest/booking.ts +0 -113
  83. package/skills/wix-headless-fast/references/bookings/rest/services.ts +0 -55
  84. package/skills/wix-headless-fast/references/bookings/seed/SEED.md +0 -71
  85. package/skills/wix-headless-fast/references/bookings/seed/seed-bookings.mjs +0 -302
  86. package/skills/wix-headless-fast/references/cms/INSTRUCTIONS.md +0 -353
  87. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useCollection.ts +0 -50
  88. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useItem.ts +0 -37
  89. package/skills/wix-headless-fast/references/cms/app/wix/cms/collection-store.ts +0 -158
  90. package/skills/wix-headless-fast/references/cms/app/wix/cms/item-store.ts +0 -93
  91. package/skills/wix-headless-fast/references/cms/app/wix/cms/items-core.ts +0 -177
  92. package/skills/wix-headless-fast/references/cms/app/wix/cms/items.ts +0 -123
  93. package/skills/wix-headless-fast/references/cms/app/wix/cms/types.ts +0 -75
  94. package/skills/wix-headless-fast/references/cms/app-astro/layouts/SiteLayout.astro +0 -41
  95. package/skills/wix-headless-fast/references/cms/lock/astro/package-lock.json +0 -11262
  96. package/skills/wix-headless-fast/references/cms/rest/items.ts +0 -125
  97. package/skills/wix-headless-fast/references/cms/seed/SEED.md +0 -112
  98. package/skills/wix-headless-fast/references/cms/seed/seed-cms.mjs +0 -324
  99. package/skills/wix-headless-fast/references/events/INSTRUCTIONS.md +0 -305
  100. package/skills/wix-headless-fast/references/events/app/components/events/EventConfirmationView.tsx +0 -66
  101. package/skills/wix-headless-fast/references/events/app/components/events/EventRegistrationView.tsx +0 -178
  102. package/skills/wix-headless-fast/references/events/app/components/events/EventsView.tsx +0 -118
  103. package/skills/wix-headless-fast/references/events/app/hooks/events/useEventRegistration.ts +0 -35
  104. package/skills/wix-headless-fast/references/events/app/hooks/events/useEvents.ts +0 -24
  105. package/skills/wix-headless-fast/references/events/app/wix/events/events-core.ts +0 -130
  106. package/skills/wix-headless-fast/references/events/app/wix/events/events-store.ts +0 -97
  107. package/skills/wix-headless-fast/references/events/app/wix/events/events.ts +0 -55
  108. package/skills/wix-headless-fast/references/events/app/wix/events/registration-core.ts +0 -113
  109. package/skills/wix-headless-fast/references/events/app/wix/events/registration-store.ts +0 -156
  110. package/skills/wix-headless-fast/references/events/app/wix/events/registration.ts +0 -97
  111. package/skills/wix-headless-fast/references/events/app/wix/events/types.ts +0 -61
  112. package/skills/wix-headless-fast/references/events/app-astro/layouts/SiteLayout.astro +0 -40
  113. package/skills/wix-headless-fast/references/events/app-astro/pages/event-confirmation.astro +0 -12
  114. package/skills/wix-headless-fast/references/events/app-astro/pages/events/[slug].astro +0 -80
  115. package/skills/wix-headless-fast/references/events/app-astro/pages/events.astro +0 -21
  116. package/skills/wix-headless-fast/references/events/lock/astro/package-lock.json +0 -11884
  117. package/skills/wix-headless-fast/references/events/rest/events.ts +0 -57
  118. package/skills/wix-headless-fast/references/events/rest/registration.ts +0 -83
  119. package/skills/wix-headless-fast/references/events/seed/SEED.md +0 -95
  120. package/skills/wix-headless-fast/references/events/seed/seed-events.mjs +0 -276
  121. package/skills/wix-headless-fast/references/forms/INSTRUCTIONS.md +0 -338
  122. package/skills/wix-headless-fast/references/forms/app/hooks/forms/useWixForm.ts +0 -85
  123. package/skills/wix-headless-fast/references/forms/app/wix/forms/form-store.ts +0 -332
  124. package/skills/wix-headless-fast/references/forms/app/wix/forms/forms-core.ts +0 -238
  125. package/skills/wix-headless-fast/references/forms/app/wix/forms/forms.ts +0 -54
  126. package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions-core.ts +0 -216
  127. package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions.ts +0 -59
  128. package/skills/wix-headless-fast/references/forms/app/wix/forms/types.ts +0 -135
  129. package/skills/wix-headless-fast/references/forms/lock/astro/package-lock.json +0 -10593
  130. package/skills/wix-headless-fast/references/forms/rest/forms.ts +0 -34
  131. package/skills/wix-headless-fast/references/forms/rest/submissions.ts +0 -56
  132. package/skills/wix-headless-fast/references/forms/seed/SEED.md +0 -116
  133. package/skills/wix-headless-fast/references/forms/seed/seed-forms.mjs +0 -327
  134. package/skills/wix-headless-fast/references/members/INSTRUCTIONS.md +0 -314
  135. package/skills/wix-headless-fast/references/members/app/components/members/AccountView.tsx +0 -60
  136. package/skills/wix-headless-fast/references/members/app/components/members/LoginForm.tsx +0 -155
  137. package/skills/wix-headless-fast/references/members/app/components/members/MemberMenu.tsx +0 -78
  138. package/skills/wix-headless-fast/references/members/app/components/members/RequireAuth.tsx +0 -47
  139. package/skills/wix-headless-fast/references/members/app/hooks/members/useMember.ts +0 -66
  140. package/skills/wix-headless-fast/references/members/app/wix/members/auth-core.ts +0 -105
  141. package/skills/wix-headless-fast/references/members/app/wix/members/auth.ts +0 -59
  142. package/skills/wix-headless-fast/references/members/app/wix/members/client.ts +0 -53
  143. package/skills/wix-headless-fast/references/members/app/wix/members/member-store.ts +0 -122
  144. package/skills/wix-headless-fast/references/members/app/wix/members/members-core.ts +0 -43
  145. package/skills/wix-headless-fast/references/members/app/wix/members/members.ts +0 -29
  146. package/skills/wix-headless-fast/references/members/app/wix/members/types.ts +0 -21
  147. package/skills/wix-headless-fast/references/members/app-astro/layouts/SiteLayout.astro +0 -42
  148. package/skills/wix-headless-fast/references/members/app-astro/pages/account.astro +0 -10
  149. package/skills/wix-headless-fast/references/members/app-astro/pages/login.astro +0 -11
  150. package/skills/wix-headless-fast/references/members/lock/astro/package-lock.json +0 -10329
  151. package/skills/wix-headless-fast/references/members/rest/auth.ts +0 -215
  152. package/skills/wix-headless-fast/references/members/rest/members.ts +0 -26
  153. package/skills/wix-headless-fast/references/members/seed/SEED.md +0 -39
  154. package/skills/wix-headless-fast/references/members/seed/seed-members.mjs +0 -94
  155. package/skills/wix-headless-fast/references/portfolio/INSTRUCTIONS.md +0 -313
  156. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionProjectsView.tsx +0 -110
  157. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionsView.tsx +0 -90
  158. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/GalleryMedia.tsx +0 -35
  159. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/ProjectDetailView.tsx +0 -85
  160. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollectionProjects.ts +0 -32
  161. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollections.ts +0 -21
  162. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useProjectDetail.ts +0 -31
  163. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/collection-projects-store.ts +0 -82
  164. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/collections-store.ts +0 -58
  165. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio-core.ts +0 -177
  166. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio.ts +0 -78
  167. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/project-detail-store.ts +0 -81
  168. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/types.ts +0 -55
  169. package/skills/wix-headless-fast/references/portfolio/app-astro/layouts/SiteLayout.astro +0 -40
  170. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio/[slug].astro +0 -30
  171. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio.astro +0 -21
  172. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/projects/[slug].astro +0 -29
  173. package/skills/wix-headless-fast/references/portfolio/lock/astro/package-lock.json +0 -10197
  174. package/skills/wix-headless-fast/references/portfolio/rest/portfolio.ts +0 -75
  175. package/skills/wix-headless-fast/references/portfolio/seed/SEED.md +0 -86
  176. package/skills/wix-headless-fast/references/portfolio/seed/seed-portfolio.mjs +0 -258
  177. package/skills/wix-headless-fast/references/pricing-plans/INSTRUCTIONS.md +0 -294
  178. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +0 -47
  179. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlansView.tsx +0 -101
  180. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/SubscribeButton.tsx +0 -41
  181. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +0 -16
  182. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlans.ts +0 -22
  183. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plan-purchase-store.ts +0 -54
  184. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans-core.ts +0 -106
  185. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans-store.ts +0 -64
  186. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans.ts +0 -27
  187. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase-core.ts +0 -43
  188. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase.ts +0 -22
  189. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/types.ts +0 -30
  190. package/skills/wix-headless-fast/references/pricing-plans/app-astro/layouts/SiteLayout.astro +0 -41
  191. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans/[slug].astro +0 -40
  192. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans.astro +0 -21
  193. package/skills/wix-headless-fast/references/pricing-plans/lock/astro/package-lock.json +0 -11226
  194. package/skills/wix-headless-fast/references/pricing-plans/rest/plans.ts +0 -31
  195. package/skills/wix-headless-fast/references/pricing-plans/rest/purchase.ts +0 -20
  196. package/skills/wix-headless-fast/references/pricing-plans/seed/SEED.md +0 -79
  197. package/skills/wix-headless-fast/references/pricing-plans/seed/seed-pricing-plans.mjs +0 -279
  198. package/skills/wix-headless-fast/references/restaurants/INSTRUCTIONS.md +0 -358
  199. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/MenuView.tsx +0 -142
  200. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartButton.tsx +0 -26
  201. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartDrawer.tsx +0 -121
  202. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/ReservationView.tsx +0 -155
  203. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useMenus.ts +0 -34
  204. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useOrderCart.ts +0 -43
  205. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useReservation.ts +0 -34
  206. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu-core.ts +0 -155
  207. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu-store.ts +0 -89
  208. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu.ts +0 -71
  209. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/order-store.ts +0 -103
  210. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering-core.ts +0 -124
  211. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering.ts +0 -185
  212. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservation-store.ts +0 -193
  213. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations-core.ts +0 -94
  214. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations.ts +0 -74
  215. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/types.ts +0 -168
  216. package/skills/wix-headless-fast/references/restaurants/app-astro/layouts/SiteLayout.astro +0 -47
  217. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/menu.astro +0 -22
  218. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/reservations.astro +0 -12
  219. package/skills/wix-headless-fast/references/restaurants/lock/astro/package-lock.json +0 -12560
  220. package/skills/wix-headless-fast/references/restaurants/rest/menu.ts +0 -60
  221. package/skills/wix-headless-fast/references/restaurants/rest/ordering.ts +0 -169
  222. package/skills/wix-headless-fast/references/restaurants/rest/reservations.ts +0 -68
  223. package/skills/wix-headless-fast/references/restaurants/seed/SEED.md +0 -89
  224. package/skills/wix-headless-fast/references/restaurants/seed/seed-restaurants.mjs +0 -479
  225. package/skills/wix-headless-fast/references/shared/CONTENT.md +0 -22
  226. package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +0 -73
  227. package/skills/wix-headless-fast/references/shared/DESIGN.md +0 -26
  228. package/skills/wix-headless-fast/references/shared/SUPPLIED-CONTENT.md +0 -23
  229. package/skills/wix-headless-fast/references/shared/app/styles/global.css +0 -52
  230. package/skills/wix-headless-fast/references/shared/app/wix/config.ts +0 -15
  231. package/skills/wix-headless-fast/references/shared/app/wix/media.ts +0 -81
  232. package/skills/wix-headless-fast/references/shared/app/wix/money.ts +0 -24
  233. package/skills/wix-headless-fast/references/shared/app/wix/sdk.ts +0 -89
  234. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app/wix/media-upload/client.ts +0 -46
  235. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +0 -46
  236. package/skills/wix-headless-fast/references/shared/rest/client.ts +0 -155
  237. package/skills/wix-headless-fast/references/shared/rest/config.ts +0 -3
  238. package/skills/wix-headless-fast/references/shared/rest/media.ts +0 -65
  239. package/skills/wix-headless-fast/references/shared/seed/images.mjs +0 -145
  240. package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +0 -608
  241. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartButton.tsx +0 -26
  242. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartDrawer.tsx +0 -155
  243. package/skills/wix-headless-fast/references/storefront/app/components/storefront/FilterPanel.tsx +0 -266
  244. package/skills/wix-headless-fast/references/storefront/app/components/storefront/OptionPicker.tsx +0 -95
  245. package/skills/wix-headless-fast/references/storefront/app/components/storefront/QuickAdd.tsx +0 -136
  246. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useCart.ts +0 -48
  247. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useProductDetail.ts +0 -39
  248. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +0 -34
  249. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-core.ts +0 -121
  250. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +0 -107
  251. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart.ts +0 -138
  252. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog-core.ts +0 -309
  253. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +0 -133
  254. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/product-detail-store.ts +0 -147
  255. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/shop-store.ts +0 -289
  256. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/types.ts +0 -167
  257. package/skills/wix-headless-fast/references/storefront/app-astro/layouts/SiteLayout.astro +0 -65
  258. package/skills/wix-headless-fast/references/storefront/lock/astro/package-lock.json +0 -12247
  259. package/skills/wix-headless-fast/references/storefront/rest/cart.ts +0 -132
  260. package/skills/wix-headless-fast/references/storefront/rest/catalog.ts +0 -123
  261. package/skills/wix-headless-fast/references/storefront/seed/SEED.md +0 -124
  262. package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +0 -525
@@ -1,132 +0,0 @@
1
- // Cart + checkout over REST (Wix eCom Cart V2) — the twin of app/wix/storefront/cart.ts. Same
2
- // exports, same Cart/CartLine DTOs; rules and mappers from cart-core (the SAME file the SDK
3
- // transport uses, deployed flat next to this one). The request shapes are
4
- // exact and rewriting them is how carts break. Failures are loud: out-of-stock lines, an empty cart
5
- // at checkout, a missing required selection all throw — surface the message to the buyer.
6
- // All calls run with the visitor token: the cart is the token's (see ../shared/client).
7
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/add-line-items-to-current-cart.md
8
- // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- import { WixApiError, wixRequest } from "./client.js";
10
- import { imgSrc } from "./media.js";
11
- import { WIX_STORES_APP_ID, addOptions, assertAdded, assertCheckoutable, rawId, summaryTotals, toCart } from "./cart-core.js";
12
- import type { Raw } from "./catalog-core.js";
13
- import type { Cart } from "./types.js";
14
-
15
- const CART = "/ecom/v2/carts/current";
16
-
17
- export interface AddToCartExtras {
18
- /** Choice modifiers: modifier key → chosen choice key (options.options — MODIFIERS only, never Size/Color). */
19
- modifierChoices?: Record<string, string>;
20
- /** Free-text modifiers: freeTextSettings.key → the buyer's text. */
21
- customTextFields?: Record<string, string>;
22
- /** A chosen recurring plan; omit for a one-time purchase. */
23
- subscriptionOptionId?: string;
24
- /** The resolved variant is out of stock but pre-orderable → preOrderRequested. */
25
- preorder?: boolean;
26
- }
27
-
28
- // A line's attributes.image comes back absent right after an add (verified live) — join the
29
- // products' main images by catalogItemId, once per product, cached for the session.
30
- // POST /stores/v3/products/query { query: { filter: { id: { $in: [...] } } } }
31
- const lineImageCache = new Map<string, string>();
32
- async function fillLineImages(cart: Cart, raws: Raw[]): Promise<void> {
33
- const wanted = new Map<string, number[]>();
34
- raws.forEach((raw, i) => {
35
- if (cart.lines[i].imageUrl) return;
36
- const pid = raw.source?.catalogReference?.catalogItemId;
37
- if (!pid) return;
38
- const cached = lineImageCache.get(pid);
39
- if (cached !== undefined) { cart.lines[i].imageUrl = cached; return; }
40
- wanted.set(pid, [...(wanted.get(pid) ?? []), i]);
41
- });
42
- if (!wanted.size) return;
43
- try {
44
- const res = await wixRequest<Raw>("/stores/v3/products/query", { body: { query: { filter: { id: { $in: [...wanted.keys()] } }, cursorPaging: { limit: 100 } } } });
45
- for (const p of (res?.products ?? []) as Raw[]) {
46
- const url = imgSrc(p.media?.main, 300, 300);
47
- lineImageCache.set(rawId(p), url);
48
- for (const i of wanted.get(rawId(p)) ?? []) cart.lines[i].imageUrl = url;
49
- }
50
- } catch {
51
- /* images are a nicety — the cart stays correct without them */
52
- }
53
- }
54
-
55
- async function readCartWithSubtotal(raw: Raw | null): Promise<Cart> {
56
- // Only estimate a cart WITH lines — on an absent/empty cart the endpoint returns 404.
57
- if (!raw?.lineItems?.length) return toCart(raw, "", "", imgSrc);
58
- // The after-discount subtotal and the CART-level discount come from the estimate, never from
59
- // hand-summing lines. Its delivery/tax/fees read "0" when nothing was calculated — never render
60
- // those as "Free"; shipping and tax resolve at checkout. POST /ecom/v2/carts/current/estimate
61
- let totals = { subtotal: "", discount: "" };
62
- try {
63
- totals = summaryTotals(await wixRequest<Raw>(`${CART}/estimate`, { body: {} }), raw);
64
- } catch {
65
- /* the estimate is a display nicety — the cart itself is still valid */
66
- }
67
- const cart = toCart(raw, totals.subtotal, totals.discount, imgSrc);
68
- await fillLineImages(cart, raw.lineItems as Raw[]);
69
- return cart;
70
- }
71
-
72
- // GET /ecom/v2/carts/current — a 404 (CURRENT_CART_NOT_FOUND / OWNED_CART_NOT_FOUND) means no cart yet.
73
- async function getCurrentCartRaw(): Promise<Raw | null> {
74
- try {
75
- return (await wixRequest<Raw>(CART, { method: "GET" }))?.cart ?? null;
76
- } catch (e) {
77
- if (e instanceof WixApiError && e.status === 404) return null;
78
- throw e;
79
- }
80
- }
81
-
82
- /** The visitor's current cart. An empty Cart (not an error) when none exists yet. */
83
- export async function fetchCart(): Promise<Cart> {
84
- return readCartWithSubtotal(await getCurrentCartRaw());
85
- }
86
-
87
- /**
88
- * Add a product. `variantId` is REQUIRED for any product with options — resolve it first
89
- * (resolveVariant); a refused add still returns 200, so the returned line is checked.
90
- * POST /ecom/v2/carts/current/add-line-items { catalogItems: [{ quantity, catalogReference: { appId, catalogItemId, options } }] }
91
- */
92
- export async function addToCart(productId: string, variantId?: string | null, quantity = 1, extras: AddToCartExtras = {}): Promise<Cart> {
93
- const options = addOptions({ variantId, ...extras });
94
- const res = await wixRequest<Raw>(`${CART}/add-line-items`, {
95
- body: { catalogItems: [{ quantity, catalogReference: { catalogItemId: productId, appId: WIX_STORES_APP_ID, ...(Object.keys(options).length ? { options } : {}) } }] },
96
- });
97
- assertAdded(res?.cart, productId, variantId);
98
- return readCartWithSubtotal(res?.cart ?? null);
99
- }
100
-
101
- /**
102
- * Change a line's quantity. `lineItemId` is CartLine.lineItemId, never the product id; a flat
103
- * { id, quantity } is a 400. POST /ecom/v2/carts/current/update-line-items { lineItems: [{ lineItemId, quantity: { newQuantity } }] }
104
- */
105
- export async function updateQuantity(lineItemId: string, quantity: number): Promise<Cart> {
106
- const res = await wixRequest<Raw>(`${CART}/update-line-items`, { body: { lineItems: [{ lineItemId, quantity: { newQuantity: quantity } }] } });
107
- return readCartWithSubtotal(res?.cart ?? null);
108
- }
109
-
110
- /** Remove a line by CartLine.lineItemId. POST /ecom/v2/carts/current/remove-line-items { lineItemIds } */
111
- export async function removeLine(lineItemId: string): Promise<Cart> {
112
- const res = await wixRequest<Raw>(`${CART}/remove-line-items`, { body: { lineItemIds: [lineItemId] } });
113
- return readCartWithSubtotal(res?.cart ?? null);
114
- }
115
-
116
- /**
117
- * Start the Wix-hosted checkout and return the URL to navigate the FULL document to. The cart's id
118
- * IS the checkout id. `origin` must be the site's real https origin as registered on the OAuth
119
- * app's allowed domains (browser: window.location.origin; server: the public https host, never
120
- * the request's internal origin) — an unlisted or http origin 403s on return.
121
- * POST /headless/v1/redirect-session { ecomCheckout: { checkoutId }, callbacks: { postFlowUrl, thankYouPageUrl } }
122
- */
123
- export async function checkoutUrl(origin: string = typeof window !== "undefined" ? window.location.origin : ""): Promise<string> {
124
- const raw = await getCurrentCartRaw();
125
- assertCheckoutable(raw);
126
- const res = await wixRequest<Raw>("/headless/v1/redirect-session", {
127
- body: { ecomCheckout: { checkoutId: rawId(raw) }, callbacks: origin ? { postFlowUrl: `${origin}/`, thankYouPageUrl: `${origin}/` } : {} },
128
- });
129
- const url = res?.redirectSession?.fullUrl;
130
- if (!url) throw new Error("Checkout couldn't start: no redirect URL returned.");
131
- return url;
132
- }
@@ -1,123 +0,0 @@
1
- // Catalog reads over REST — the twin of app/wix/storefront/catalog.ts. Same exports, same DTOs; the
2
- // rules and mappers come from catalog-core (the SAME file the SDK transport uses, deployed flat next
3
- // to this one by deploy.mjs --stack static), so this file is only the transport: one fetch with a
4
- // literal body per function. Every call here is safe from a
5
- // browser with a visitor token. Porting: keep the paths, keep the bodies, port the core once.
6
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/search-products.md
7
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/get-category-by-slug.md
8
- import { WixApiError, wixRequest } from "./client.js";
9
- import { imgSrc, mediaKey } from "./media.js";
10
- import {
11
- CATALOG_SORTS,
12
- DETAIL_FIELDS,
13
- LIST_FIELDS,
14
- catalogFilter,
15
- resolveVariant,
16
- searchQuery,
17
- sellingPrice,
18
- toCategory,
19
- toDetail,
20
- toFacetData,
21
- toSummary,
22
- type CatalogSearchOptions,
23
- type CatalogSort,
24
- type Raw,
25
- } from "./catalog-core.js";
26
- import type { Category, FacetData, ProductDetail, ProductSummary } from "./types.js";
27
-
28
- export { CATALOG_SORTS, resolveVariant, sellingPrice, type CatalogSearchOptions, type CatalogSort };
29
-
30
- const STORES_TREE = { appNamespace: "@wix/stores", treeKey: null };
31
- const notFound = (e: unknown): boolean => e instanceof WixApiError && e.status === 404;
32
-
33
- /**
34
- * The gallery query: sort, filter, facets, search, and cursor paging, all applied by Wix across the
35
- * whole catalog — never on a page already in hand. `total` is issued with the first page only.
36
- * POST /stores/v3/products/search { fields, search: { filter, sort, search, cursorPaging } }
37
- */
38
- export async function searchCatalog(o: CatalogSearchOptions = {}): Promise<{ products: ProductSummary[]; nextCursor: string | null; total: number | null }> {
39
- const search = searchQuery(o);
40
- const res = await wixRequest<Raw>("/stores/v3/products/search", { body: { fields: LIST_FIELDS, search } });
41
- let total: number | null = null;
42
- if (!o.cursor) {
43
- try {
44
- const c = await wixRequest<Raw>("/stores/v3/products/count", { body: { filter: search.filter } });
45
- total = typeof c?.count === "number" ? c.count : null;
46
- } catch {
47
- /* the count is a nicety — the page is still valid */
48
- }
49
- }
50
- return {
51
- products: ((res?.products ?? []) as Raw[]).map((p) => toSummary(p, imgSrc, mediaKey)),
52
- nextCursor: res?.pagingMetadata?.cursors?.next ?? null,
53
- total,
54
- };
55
- }
56
-
57
- /** Facets and price bounds of a scope from one 100-product read. Non-fatal: empty on failure. */
58
- export async function fetchFacetData({ categoryId }: { categoryId?: string | null } = {}): Promise<FacetData> {
59
- try {
60
- const res = await wixRequest<Raw>("/stores/v3/products/search", {
61
- body: { fields: ["CURRENCY"], search: { filter: catalogFilter({ categoryId }), cursorPaging: { limit: 100 } } },
62
- });
63
- return toFacetData((res?.products ?? []) as Raw[]);
64
- } catch {
65
- return { facets: [], priceRange: null };
66
- }
67
- }
68
-
69
- export async function fetchProducts({ limit = 24 } = {}): Promise<ProductSummary[]> {
70
- return (await searchCatalog({ limit })).products;
71
- }
72
-
73
- export async function fetchProductsByCategory(categoryId: string, { limit = 24 } = {}): Promise<ProductSummary[]> {
74
- return (await searchCatalog({ limit, categoryId })).products;
75
- }
76
-
77
- /**
78
- * One complete product for the PDP; null when the slug doesn't resolve — a real 404, never a
79
- * fallback to another product. GET /stores/v3/products/slug/{slug}?fields=…&fields=…
80
- */
81
- export async function fetchProductBySlug(slug: string): Promise<ProductDetail | null> {
82
- try {
83
- const res = await wixRequest<Raw>(`/stores/v3/products/slug/${encodeURIComponent(slug)}`, { method: "GET", query: { fields: DETAIL_FIELDS } });
84
- return res?.product ? toDetail(res.product, imgSrc, mediaKey) : null;
85
- } catch (e) {
86
- if (notFound(e)) return null;
87
- throw e;
88
- }
89
- }
90
-
91
- /**
92
- * The live category tree for navigation — never a seeded list. The filter must be non-empty;
93
- * `visible` is not filterable (dropped client-side); the auto-created "all-products" system
94
- * category is skipped. Non-fatal: [] on failure. POST /categories/v1/categories/query
95
- */
96
- export async function fetchCategories(): Promise<Category[]> {
97
- try {
98
- const res = await wixRequest<Raw>("/categories/v1/categories/query", {
99
- body: { treeReference: STORES_TREE, query: { filter: { name: { $exists: true } }, cursorPaging: { limit: 100 } } },
100
- });
101
- return ((res?.categories ?? []) as Raw[]).filter((c) => c.visible !== false && c.slug !== "all-products").map(toCategory);
102
- } catch {
103
- return [];
104
- }
105
- }
106
-
107
- /**
108
- * One category by URL slug (its id feeds searchCatalog). The response is WRAPPED: { category }.
109
- * null when missing or hidden → a real 404. GET /categories/v1/categories/slug/{slug}
110
- */
111
- export async function fetchCategoryBySlug(slug: string): Promise<Category | null> {
112
- try {
113
- const res = await wixRequest<Raw>(`/categories/v1/categories/slug/${encodeURIComponent(slug)}`, {
114
- method: "GET",
115
- query: { "treeReference.appNamespace": "@wix/stores" },
116
- });
117
- const raw: Raw | undefined = res?.category;
118
- return raw && raw.visible !== false ? toCategory(raw) : null;
119
- } catch (e) {
120
- if (notFound(e)) return null;
121
- throw e;
122
- }
123
- }
@@ -1,124 +0,0 @@
1
- # Storefront — seeding
2
-
3
- Seed the Wix Stores catalog by **running `seed-store.mjs` with a plan file** — don't hand-write
4
- the REST calls. The script mints its own site token via the Wix CLI (requires a logged-in CLI
5
- session and a `wix.config.json` in the working directory), installs the Stores app if needed,
6
- waits for the V3 catalog, and creates everything in the right order.
7
-
8
- **Set each product's type by what the buyer receives** — physical (shipped, has `quantity`) or
9
- digital (a file they keep, `digitalFilePath`/`digitalFileUrl`, no `quantity`); the plan below shows
10
- both. *Access* — a membership or an online course/program the buyer enrolls in — is Pricing Plans,
11
- not a store product.
12
-
13
- ```bash
14
- # from the project root (where wix.config.json lives):
15
- node <SKILL_ROOT>/references/storefront/seed/seed-store.mjs plan.json
16
- ```
17
-
18
- Run this way, the result is the process itself: exit code `0` and the JSON on stdout (redirect it
19
- to a file if you want it later). `.seed-exit` and `seed-result.json` are written by
20
- `install/fast-path.mjs` when IT starts the seed — don't wait for them after a manual run.
21
-
22
- `plan.json` is plain data — write it from the brief:
23
-
24
- ```json
25
- {
26
- "products": [
27
- { "name": "The Glam Rocker", "description": "Sequin-studded velvet legend…",
28
- "price": 49.99, "quantity": 12, "imageUrl": "https://…" },
29
- { "name": "The Understudy", "description": "…", "price": 245, "quantity": 8,
30
- "options": [{ "name": "Color", "type": "color",
31
- "choices": [{ "name": "Ink", "colorCode": "#1B1B2F" },
32
- { "name": "Bone", "colorCode": "#EDE6D6" }] }] },
33
- { "name": "Encore Jacket", "description": "…", "price": 68, "compareAtPrice": 129,
34
- "quantity": 5 },
35
- { "name": "Backstage Guide", "description": "…", "price": 12,
36
- "digitalFilePath": "/Users/me/guide.pdf" }
37
- ],
38
- "categories": { "Legends": ["The Glam Rocker"], "Rising Stars": [] },
39
- "currency": "EUR"
40
- }
41
- ```
42
-
43
- - `description` — plain text or simple HTML (`<p>`, `<br/>`, `<strong>`, `<em>`); converted to
44
- Wix rich text so the storefront renders paragraphs and bold, not tag text.
45
- - `options` — ONLY things the buyer selects-and-buys (Size, Color); they become variants.
46
- `type: "color"` renders as real swatches (give every color choice a `colorCode`); anything
47
- else renders as text pills. Variants are expanded automatically (full cross-product, each
48
- carrying the product's price/compareAtPrice/quantity) — keep option counts small.
49
- - `compareAtPrice` (> `price`) — the "was" price: strikethrough on the PDP, sale badge data on
50
- the tile.
51
- - **Give every product an image** (a store without product images looks broken: gray boxes on
52
- tiles, PDP, and cart) — the default is an `imagePrompt` (AI-generated, ~1 Wix AI credit
53
- per image, account-billed): brand-contextual — subject, aesthetic/mood, palette, lighting —
54
- always ending "no text, no watermarks". At least one image in the set shows the real subject of the business — the actual product/space/service, not abstract decoration. For an asset the user actually supplied use `imagePath` (a file on
55
- this machine — uploaded to Wix Media) or `imageUrl` (their own hosted URL; verify it with
56
- `curl -sI` → 200) — never a stock-photo or guessed URL. Images resolve in parallel and never block the seed; a failed image leaves
57
- that product text-only. Seed text-only only when the user explicitly asks.
58
- - `digitalFilePath` (a file on this machine) or `digitalFileUrl` — makes the product a digital
59
- download, uploaded and created with both the file and stock (`quantity` is ignored). It's also the
60
- only way in: a file-less digital product is created successfully, reads back healthy, and is then
61
- rejected at add-to-cart as `ITEM_NOT_FOUND_IN_CATALOG`. **No real file in hand?** Don't invent a
62
- URL and don't ship the product as digital — seed it physical with stock (drop
63
- `digitalFilePath`/`digitalFileUrl`, add `inStock` or a `quantity`) and tell the user the
64
- download needs a real file before it can be sold.
65
- - `categories` — category name → product NAMES. Omit when the brief names none.
66
- - `quantity` — tracked stock, a non-negative integer. For stock that isn't counted (made to
67
- order, print on demand, unlimited) use `"inStock": true` **instead** of `quantity`; sending
68
- both is rejected.
69
- - `currency` — 3-letter ISO code. Set it **only when the brief names one** ("prices in euros",
70
- "a German store charging EUR"). Do **not** infer it from a language, a country, or an address
71
- — an unrequested switch silently reprices the whole catalog. The seed applies it before
72
- creating anything, because a product's price is stored in the site currency at create time.
73
- For a few seconds afterwards product reads can still report the old currency; that lag is
74
- expected and self-resolves, so don't re-verify it or retry.
75
-
76
- **Default to 3 products** when you draft the catalog yourself — the seed shows the shape, not a
77
- full inventory; the owner adds the rest in the dashboard. **Make those 3 exercise the shipped
78
- UI**: give at least one product a color option and put one product on sale — truthfully to the
79
- business (a ceramics studio has glaze colors; a bakery doesn't).
80
-
81
- ## Supplied content
82
-
83
- The general rules are in `references/shared/SUPPLIED-CONTENT.md`. For a store, each product the user
84
- lists is one entry, whatever form the list arrives in. Its name, description and price become
85
- `name`, `description` and `price`. A "was", "regular" or "compare at" price becomes `compareAtPrice`
86
- when it is higher than the price. A stock count becomes `quantity`; "unlimited" or "made to order"
87
- becomes `"inStock": true`. A category, collection or type becomes an entry in `categories`. A set of
88
- choices the buyer picks from ("Small / Large", "S, M, L") becomes one `options` entry named after
89
- what it is (Size, Flavor), `type: "text"`; use `type: "color"` only when the source gives color codes.
90
- Their image becomes `imageUrl`. If a product has a separate price per size, seed it once at the
91
- lowest price and tell the user the per-variant prices are set in the dashboard. If a product has no
92
- price, ask; never invent one. Ribbons ("New", "Best Seller") and SKU codes are not seeded — say so.
93
-
94
- **Seeding is additive — never delete or overwrite existing content.** No cleanup, no removing
95
- "sample" data, no resets — not even on a site created a minute ago. The Stores install adds its
96
- own sample products to a new catalog; they stay, and the owner removes them in the dashboard
97
- (the Manage products link is in your summary). If a cleanup genuinely seems needed, ask the user
98
- first. Categories are idempotent by name — a re-run reuses "Donuts" instead of creating a second one.
99
-
100
- **A bulk create can partially succeed.** The result carries `failures: [{ name, error }]` next
101
- to `products` — read it. A non-empty `failures` means those products are genuinely absent, not
102
- mis-mapped, so the rest of the catalog is fine to build on. To retry, re-run the **same** plan:
103
- creation is idempotent by name, so products that already exist are skipped rather than
104
- duplicated. Never hand-patch ids to "fill the gap".
105
-
106
- Two things this module does not seed (dashboard-only — tell the merchant):
107
- **ribbons** ("New", "Best Seller") and **per-choice linked media** (color choice → gallery photo).
108
-
109
- ## Escape hatch — individual functions
110
-
111
- `setupStore` is built from exported steps; import them only for a partial re-seed or custom
112
- ordering: `installStoresApp`, `bulkCreateProducts`, `createCategories`,
113
- `addProductsToCategories`, `attachProductImages` — plus `makeCtx()` for the auth context.
114
-
115
- ## Reference
116
-
117
- If a call returns an unexpected shape or you need an operation this module doesn't cover, read
118
- the live Wix API reference — never guess. The authoritative source recipe is
119
- `wix-headless/references/inline-recipes/setup-online-store.md`. Key pages:
120
-
121
- - Bulk Create Products With Inventory: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/bulk-create-products-with-inventory.md
122
- - Create Category: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/create-category.md
123
- - Bulk Add Items To Category: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/bulk-add-items-to-category.md
124
- - Bulk Update Products (image attach): https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/bulk-update-products.md