@jytextiles/medusa-plugin-faire-store-sync 0.2.9 → 0.2.11

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.
@@ -63,9 +63,14 @@ const faireApi = {
63
63
  getSync: (id) => sdk.client.fetch(`/admin/faire/syncs/${id}`),
64
64
  retrySync: (id) => sdk.client.fetch(`/admin/faire/syncs/${id}`, { method: "POST" }),
65
65
  brand: () => sdk.client.fetch("/admin/faire/brand"),
66
- taxonomy: () => sdk.client.fetch(
67
- "/admin/faire/taxonomy"
68
- ),
66
+ taxonomy: (opts = {}) => {
67
+ var _a;
68
+ const query = {};
69
+ if (opts.q) query.q = opts.q;
70
+ if (opts.limit !== void 0) query.limit = String(opts.limit);
71
+ if ((_a = opts.ids) == null ? void 0 : _a.length) query.ids = opts.ids.join(",");
72
+ return sdk.client.fetch("/admin/faire/taxonomy", { query });
73
+ },
69
74
  products: (opts = {}) => {
70
75
  const query = {};
71
76
  if (opts.limit !== void 0) query.limit = String(opts.limit);
@@ -74,7 +79,7 @@ const faireApi = {
74
79
  return sdk.client.fetch("/admin/faire/products", { query });
75
80
  }
76
81
  };
77
- const MAX_RENDERED = 60;
82
+ const PICKER_LIMIT = 50;
78
83
  const badgeColor = (status) => {
79
84
  switch (status) {
80
85
  case "synced":
@@ -90,7 +95,7 @@ const badgeColor = (status) => {
90
95
  }
91
96
  };
92
97
  const FaireProductWidget = ({ data }) => {
93
- var _a, _b, _c, _d;
98
+ var _a, _b, _c, _d, _e, _f, _g, _h;
94
99
  const queryClient = reactQuery.useQueryClient();
95
100
  const productKey = ["faire", "product-status", data.id];
96
101
  const statusQuery = reactQuery.useQuery({
@@ -137,38 +142,46 @@ const FaireProductWidget = ({ data }) => {
137
142
  const productType = (_d = data.type) == null ? void 0 : _d.value;
138
143
  const [pickerOpen, setPickerOpen] = react.useState(false);
139
144
  const [pickerSearch, setPickerSearch] = react.useState("");
140
- const [pinnedOverride, setPinnedOverride] = react.useState(
141
- void 0
142
- );
145
+ const [debouncedSearch, setDebouncedSearch] = react.useState("");
146
+ react.useEffect(() => {
147
+ const t = setTimeout(() => setDebouncedSearch(pickerSearch.trim()), 250);
148
+ return () => clearTimeout(t);
149
+ }, [pickerSearch]);
150
+ const [pinnedOverride, setPinnedOverride] = react.useState(void 0);
143
151
  const taxonomyQuery = reactQuery.useQuery({
144
- queryKey: ["faire", "taxonomy"],
152
+ queryKey: ["faire", "taxonomy", "search", debouncedSearch],
145
153
  enabled: pickerOpen,
146
- queryFn: async () => (await faireApi.taxonomy()).taxonomy ?? []
154
+ placeholderData: reactQuery.keepPreviousData,
155
+ queryFn: async () => faireApi.taxonomy({
156
+ q: debouncedSearch || void 0,
157
+ limit: PICKER_LIMIT
158
+ })
147
159
  });
148
- const taxonomy = taxonomyQuery.data ?? [];
149
- const pinnedId = pinnedOverride !== void 0 ? pinnedOverride ?? void 0 : metadata.faire_taxonomy_type_id;
150
- const pinnedName = react.useMemo(() => {
151
- var _a2;
152
- if (!pinnedId) return void 0;
153
- if (!/^tt_/.test(String(pinnedId))) return String(pinnedId);
154
- return (_a2 = taxonomy.find((t) => t.id === pinnedId)) == null ? void 0 : _a2.name;
155
- }, [pinnedId, taxonomy]);
160
+ const results = ((_e = taxonomyQuery.data) == null ? void 0 : _e.taxonomy) ?? [];
161
+ const matchCount = ((_f = taxonomyQuery.data) == null ? void 0 : _f.count) ?? 0;
162
+ const pinnedId = pinnedOverride !== void 0 ? pinnedOverride.id ?? void 0 : metadata.faire_taxonomy_type_id;
163
+ const pinnedNameFromMeta = pinnedOverride !== void 0 ? pinnedOverride.name ?? void 0 : metadata.faire_taxonomy_type_name;
164
+ const pinnedResolveQuery = reactQuery.useQuery({
165
+ queryKey: ["faire", "taxonomy", "resolve", pinnedId],
166
+ enabled: !!pinnedId && !pinnedNameFromMeta && /^tt_/.test(String(pinnedId)),
167
+ queryFn: async () => (await faireApi.taxonomy({ ids: [pinnedId] })).taxonomy
168
+ });
169
+ const pinnedName = pinnedNameFromMeta ?? (pinnedId && /^tt_/.test(String(pinnedId)) ? (_h = (_g = pinnedResolveQuery.data) == null ? void 0 : _g[0]) == null ? void 0 : _h.name : pinnedId ? String(pinnedId) : void 0);
156
170
  const resolvedSource = pinnedId ? { label: pinnedName || String(pinnedId), from: "pinned" } : metadata.faire_category ? { label: String(metadata.faire_category), from: "metadata" } : productType ? { label: productType, from: "type" } : { label: "Account fallback", from: "fallback" };
157
- const filteredTaxonomy = react.useMemo(() => {
158
- const q = pickerSearch.trim().toLowerCase();
159
- const list = q ? taxonomy.filter((t) => t.name.toLowerCase().includes(q)) : taxonomy;
160
- return list.slice(0, MAX_RENDERED);
161
- }, [taxonomy, pickerSearch]);
162
171
  const saveCategory = reactQuery.useMutation({
163
- mutationFn: (value) => sdk.admin.product.update(data.id, {
164
- metadata: { ...metadata, faire_taxonomy_type_id: value }
172
+ mutationFn: (choice) => sdk.admin.product.update(data.id, {
173
+ metadata: {
174
+ ...metadata,
175
+ faire_taxonomy_type_id: (choice == null ? void 0 : choice.id) ?? null,
176
+ faire_taxonomy_type_name: (choice == null ? void 0 : choice.name) ?? null
177
+ }
165
178
  }),
166
- onSuccess: (_res, value) => {
167
- setPinnedOverride(value);
179
+ onSuccess: (_res, choice) => {
180
+ setPinnedOverride({ id: (choice == null ? void 0 : choice.id) ?? null, name: (choice == null ? void 0 : choice.name) ?? null });
168
181
  queryClient.invalidateQueries({ queryKey: ["product", data.id] });
169
182
  setPickerOpen(false);
170
183
  setPickerSearch("");
171
- ui.toast.success(value ? "Faire category set" : "Faire category cleared");
184
+ ui.toast.success(choice ? "Faire category set" : "Faire category cleared");
172
185
  },
173
186
  onError: (err) => ui.toast.error("Failed to save category", { description: err == null ? void 0 : err.message })
174
187
  });
@@ -251,15 +264,11 @@ const FaireProductWidget = ({ data }) => {
251
264
  }
252
265
  ),
253
266
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 overflow-y-auto", children: [
254
- taxonomyQuery.isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: "Loading categories…" }) : filteredTaxonomy.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: [
255
- "No categories match “",
256
- pickerSearch,
257
- "”."
258
- ] }) : filteredTaxonomy.map((t) => /* @__PURE__ */ jsxRuntime.jsxs(
267
+ taxonomyQuery.isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: "Loading categories…" }) : results.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: debouncedSearch ? `No categories match “${debouncedSearch}”.` : "No categories available." }) : results.map((t) => /* @__PURE__ */ jsxRuntime.jsxs(
259
268
  "button",
260
269
  {
261
270
  type: "button",
262
- onClick: () => saveCategory.mutate(t.id),
271
+ onClick: () => saveCategory.mutate(t),
263
272
  disabled: saveCategory.isPending,
264
273
  className: ui.clx(
265
274
  "flex items-center justify-between rounded-md px-3 py-2 text-left text-sm",
@@ -273,12 +282,12 @@ const FaireProductWidget = ({ data }) => {
273
282
  },
274
283
  t.id
275
284
  )),
276
- !taxonomyQuery.isLoading && taxonomy.length > filteredTaxonomy.length && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "text-ui-fg-muted px-1 py-1", children: [
285
+ !taxonomyQuery.isLoading && matchCount > results.length && /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "text-ui-fg-muted px-1 py-1", children: [
277
286
  "Showing ",
278
- filteredTaxonomy.length,
287
+ results.length,
279
288
  " of ",
280
- taxonomy.length,
281
- " — refine your search to narrow down."
289
+ matchCount,
290
+ " matches — refine your search to narrow down."
282
291
  ] })
283
292
  ] })
284
293
  ] }),
@@ -476,24 +485,28 @@ const FaireSettingsPage = () => {
476
485
  ] }),
477
486
  connected ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
478
487
  /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: "green", children: "Connected" }),
479
- /* @__PURE__ */ jsxRuntime.jsx(
480
- ui.Button,
481
- {
482
- size: "small",
483
- variant: "secondary",
484
- onClick: () => navigate("/settings/faire/bulk"),
485
- children: "Bulk sync"
486
- }
487
- ),
488
- /* @__PURE__ */ jsxRuntime.jsx(
489
- ui.Button,
490
- {
491
- size: "small",
492
- variant: "secondary",
493
- onClick: () => navigate("/settings/faire/settings"),
494
- children: "Sync settings"
495
- }
496
- ),
488
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
489
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", children: [
490
+ "Sync",
491
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronDownMini, {})
492
+ ] }) }),
493
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
494
+ /* @__PURE__ */ jsxRuntime.jsx(
495
+ ui.DropdownMenu.Item,
496
+ {
497
+ onClick: () => navigate("/settings/faire/bulk"),
498
+ children: "Bulk sync"
499
+ }
500
+ ),
501
+ /* @__PURE__ */ jsxRuntime.jsx(
502
+ ui.DropdownMenu.Item,
503
+ {
504
+ onClick: () => navigate("/settings/faire/settings"),
505
+ children: "Sync settings"
506
+ }
507
+ )
508
+ ] })
509
+ ] }),
497
510
  /* @__PURE__ */ jsxRuntime.jsx(
498
511
  ui.Button,
499
512
  {
@@ -2,7 +2,7 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { defineWidgetConfig, defineRouteConfig } from "@medusajs/admin-sdk";
3
3
  import { toast, Container, Heading, Text, StatusBadge, Alert, Badge, Button, Tooltip, Drawer, Input, clx, createDataTableColumnHelper, createDataTableFilterHelper, useDataTable, Skeleton, DropdownMenu, DataTable, Label, Toaster, Switch, Select, FocusModal, IconButton } from "@medusajs/ui";
4
4
  import { useQueryClient, useQuery, useMutation, keepPreviousData } from "@tanstack/react-query";
5
- import { useState, useMemo, useEffect } from "react";
5
+ import { useState, useEffect, useMemo } from "react";
6
6
  import Medusa from "@medusajs/js-sdk";
7
7
  import { BuildingStorefront, ChevronDownMini, EllipsisHorizontal, ArrowPath, ArrowUpRightOnBox } from "@medusajs/icons";
8
8
  import { useNavigate, Outlet, useParams, useSearchParams } from "react-router-dom";
@@ -60,9 +60,14 @@ const faireApi = {
60
60
  getSync: (id) => sdk.client.fetch(`/admin/faire/syncs/${id}`),
61
61
  retrySync: (id) => sdk.client.fetch(`/admin/faire/syncs/${id}`, { method: "POST" }),
62
62
  brand: () => sdk.client.fetch("/admin/faire/brand"),
63
- taxonomy: () => sdk.client.fetch(
64
- "/admin/faire/taxonomy"
65
- ),
63
+ taxonomy: (opts = {}) => {
64
+ var _a;
65
+ const query = {};
66
+ if (opts.q) query.q = opts.q;
67
+ if (opts.limit !== void 0) query.limit = String(opts.limit);
68
+ if ((_a = opts.ids) == null ? void 0 : _a.length) query.ids = opts.ids.join(",");
69
+ return sdk.client.fetch("/admin/faire/taxonomy", { query });
70
+ },
66
71
  products: (opts = {}) => {
67
72
  const query = {};
68
73
  if (opts.limit !== void 0) query.limit = String(opts.limit);
@@ -71,7 +76,7 @@ const faireApi = {
71
76
  return sdk.client.fetch("/admin/faire/products", { query });
72
77
  }
73
78
  };
74
- const MAX_RENDERED = 60;
79
+ const PICKER_LIMIT = 50;
75
80
  const badgeColor = (status) => {
76
81
  switch (status) {
77
82
  case "synced":
@@ -87,7 +92,7 @@ const badgeColor = (status) => {
87
92
  }
88
93
  };
89
94
  const FaireProductWidget = ({ data }) => {
90
- var _a, _b, _c, _d;
95
+ var _a, _b, _c, _d, _e, _f, _g, _h;
91
96
  const queryClient = useQueryClient();
92
97
  const productKey = ["faire", "product-status", data.id];
93
98
  const statusQuery = useQuery({
@@ -134,38 +139,46 @@ const FaireProductWidget = ({ data }) => {
134
139
  const productType = (_d = data.type) == null ? void 0 : _d.value;
135
140
  const [pickerOpen, setPickerOpen] = useState(false);
136
141
  const [pickerSearch, setPickerSearch] = useState("");
137
- const [pinnedOverride, setPinnedOverride] = useState(
138
- void 0
139
- );
142
+ const [debouncedSearch, setDebouncedSearch] = useState("");
143
+ useEffect(() => {
144
+ const t = setTimeout(() => setDebouncedSearch(pickerSearch.trim()), 250);
145
+ return () => clearTimeout(t);
146
+ }, [pickerSearch]);
147
+ const [pinnedOverride, setPinnedOverride] = useState(void 0);
140
148
  const taxonomyQuery = useQuery({
141
- queryKey: ["faire", "taxonomy"],
149
+ queryKey: ["faire", "taxonomy", "search", debouncedSearch],
142
150
  enabled: pickerOpen,
143
- queryFn: async () => (await faireApi.taxonomy()).taxonomy ?? []
151
+ placeholderData: keepPreviousData,
152
+ queryFn: async () => faireApi.taxonomy({
153
+ q: debouncedSearch || void 0,
154
+ limit: PICKER_LIMIT
155
+ })
144
156
  });
145
- const taxonomy = taxonomyQuery.data ?? [];
146
- const pinnedId = pinnedOverride !== void 0 ? pinnedOverride ?? void 0 : metadata.faire_taxonomy_type_id;
147
- const pinnedName = useMemo(() => {
148
- var _a2;
149
- if (!pinnedId) return void 0;
150
- if (!/^tt_/.test(String(pinnedId))) return String(pinnedId);
151
- return (_a2 = taxonomy.find((t) => t.id === pinnedId)) == null ? void 0 : _a2.name;
152
- }, [pinnedId, taxonomy]);
157
+ const results = ((_e = taxonomyQuery.data) == null ? void 0 : _e.taxonomy) ?? [];
158
+ const matchCount = ((_f = taxonomyQuery.data) == null ? void 0 : _f.count) ?? 0;
159
+ const pinnedId = pinnedOverride !== void 0 ? pinnedOverride.id ?? void 0 : metadata.faire_taxonomy_type_id;
160
+ const pinnedNameFromMeta = pinnedOverride !== void 0 ? pinnedOverride.name ?? void 0 : metadata.faire_taxonomy_type_name;
161
+ const pinnedResolveQuery = useQuery({
162
+ queryKey: ["faire", "taxonomy", "resolve", pinnedId],
163
+ enabled: !!pinnedId && !pinnedNameFromMeta && /^tt_/.test(String(pinnedId)),
164
+ queryFn: async () => (await faireApi.taxonomy({ ids: [pinnedId] })).taxonomy
165
+ });
166
+ const pinnedName = pinnedNameFromMeta ?? (pinnedId && /^tt_/.test(String(pinnedId)) ? (_h = (_g = pinnedResolveQuery.data) == null ? void 0 : _g[0]) == null ? void 0 : _h.name : pinnedId ? String(pinnedId) : void 0);
153
167
  const resolvedSource = pinnedId ? { label: pinnedName || String(pinnedId), from: "pinned" } : metadata.faire_category ? { label: String(metadata.faire_category), from: "metadata" } : productType ? { label: productType, from: "type" } : { label: "Account fallback", from: "fallback" };
154
- const filteredTaxonomy = useMemo(() => {
155
- const q = pickerSearch.trim().toLowerCase();
156
- const list = q ? taxonomy.filter((t) => t.name.toLowerCase().includes(q)) : taxonomy;
157
- return list.slice(0, MAX_RENDERED);
158
- }, [taxonomy, pickerSearch]);
159
168
  const saveCategory = useMutation({
160
- mutationFn: (value) => sdk.admin.product.update(data.id, {
161
- metadata: { ...metadata, faire_taxonomy_type_id: value }
169
+ mutationFn: (choice) => sdk.admin.product.update(data.id, {
170
+ metadata: {
171
+ ...metadata,
172
+ faire_taxonomy_type_id: (choice == null ? void 0 : choice.id) ?? null,
173
+ faire_taxonomy_type_name: (choice == null ? void 0 : choice.name) ?? null
174
+ }
162
175
  }),
163
- onSuccess: (_res, value) => {
164
- setPinnedOverride(value);
176
+ onSuccess: (_res, choice) => {
177
+ setPinnedOverride({ id: (choice == null ? void 0 : choice.id) ?? null, name: (choice == null ? void 0 : choice.name) ?? null });
165
178
  queryClient.invalidateQueries({ queryKey: ["product", data.id] });
166
179
  setPickerOpen(false);
167
180
  setPickerSearch("");
168
- toast.success(value ? "Faire category set" : "Faire category cleared");
181
+ toast.success(choice ? "Faire category set" : "Faire category cleared");
169
182
  },
170
183
  onError: (err) => toast.error("Failed to save category", { description: err == null ? void 0 : err.message })
171
184
  });
@@ -248,15 +261,11 @@ const FaireProductWidget = ({ data }) => {
248
261
  }
249
262
  ),
250
263
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 overflow-y-auto", children: [
251
- taxonomyQuery.isLoading ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: "Loading categories…" }) : filteredTaxonomy.length === 0 ? /* @__PURE__ */ jsxs(Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: [
252
- "No categories match “",
253
- pickerSearch,
254
- "”."
255
- ] }) : filteredTaxonomy.map((t) => /* @__PURE__ */ jsxs(
264
+ taxonomyQuery.isLoading ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: "Loading categories…" }) : results.length === 0 ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle px-1 py-2", children: debouncedSearch ? `No categories match “${debouncedSearch}”.` : "No categories available." }) : results.map((t) => /* @__PURE__ */ jsxs(
256
265
  "button",
257
266
  {
258
267
  type: "button",
259
- onClick: () => saveCategory.mutate(t.id),
268
+ onClick: () => saveCategory.mutate(t),
260
269
  disabled: saveCategory.isPending,
261
270
  className: clx(
262
271
  "flex items-center justify-between rounded-md px-3 py-2 text-left text-sm",
@@ -270,12 +279,12 @@ const FaireProductWidget = ({ data }) => {
270
279
  },
271
280
  t.id
272
281
  )),
273
- !taxonomyQuery.isLoading && taxonomy.length > filteredTaxonomy.length && /* @__PURE__ */ jsxs(Text, { size: "xsmall", className: "text-ui-fg-muted px-1 py-1", children: [
282
+ !taxonomyQuery.isLoading && matchCount > results.length && /* @__PURE__ */ jsxs(Text, { size: "xsmall", className: "text-ui-fg-muted px-1 py-1", children: [
274
283
  "Showing ",
275
- filteredTaxonomy.length,
284
+ results.length,
276
285
  " of ",
277
- taxonomy.length,
278
- " — refine your search to narrow down."
286
+ matchCount,
287
+ " matches — refine your search to narrow down."
279
288
  ] })
280
289
  ] })
281
290
  ] }),
@@ -473,24 +482,28 @@ const FaireSettingsPage = () => {
473
482
  ] }),
474
483
  connected ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
475
484
  /* @__PURE__ */ jsx(StatusBadge, { color: "green", children: "Connected" }),
476
- /* @__PURE__ */ jsx(
477
- Button,
478
- {
479
- size: "small",
480
- variant: "secondary",
481
- onClick: () => navigate("/settings/faire/bulk"),
482
- children: "Bulk sync"
483
- }
484
- ),
485
- /* @__PURE__ */ jsx(
486
- Button,
487
- {
488
- size: "small",
489
- variant: "secondary",
490
- onClick: () => navigate("/settings/faire/settings"),
491
- children: "Sync settings"
492
- }
493
- ),
485
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
486
+ /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { size: "small", variant: "secondary", children: [
487
+ "Sync",
488
+ /* @__PURE__ */ jsx(ChevronDownMini, {})
489
+ ] }) }),
490
+ /* @__PURE__ */ jsxs(DropdownMenu.Content, { children: [
491
+ /* @__PURE__ */ jsx(
492
+ DropdownMenu.Item,
493
+ {
494
+ onClick: () => navigate("/settings/faire/bulk"),
495
+ children: "Bulk sync"
496
+ }
497
+ ),
498
+ /* @__PURE__ */ jsx(
499
+ DropdownMenu.Item,
500
+ {
501
+ onClick: () => navigate("/settings/faire/settings"),
502
+ children: "Sync settings"
503
+ }
504
+ )
505
+ ] })
506
+ ] }),
494
507
  /* @__PURE__ */ jsx(
495
508
  Button,
496
509
  {
@@ -2,11 +2,34 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GET = void 0;
4
4
  const faire_sync_1 = require("../../../../modules/faire-sync");
5
- // GET /admin/faire/taxonomy — taxonomy types from Faire's /products/types
5
+ const DEFAULT_LIMIT = 50;
6
+ const MAX_LIMIT = 200;
7
+ // GET /admin/faire/taxonomy?q=&limit=&ids= — taxonomy types from Faire's
8
+ // /products/types. Faire returns the full ~3k list unpaginated with no
9
+ // server-side search, so the service caches the whole list and we filter/slice
10
+ // HERE. The browser sends `q` and gets back only matches, instead of pulling
11
+ // every row to filter client-side. `ids` resolves specific `tt_…` rows (used to
12
+ // show the name of an already-pinned category without loading the whole list).
6
13
  const GET = async (req, res) => {
7
14
  const service = req.scope.resolve(faire_sync_1.FAIRE_SYNC_MODULE);
8
- const types = await service.getTaxonomyTypes();
9
- res.json({ taxonomy: types });
15
+ const q = String(req.query.q ?? "").trim().toLowerCase();
16
+ const idsParam = String(req.query.ids ?? "").trim();
17
+ const limit = Math.min(Number(req.query.limit) || DEFAULT_LIMIT, MAX_LIMIT);
18
+ const all = await service.getTaxonomyTypes();
19
+ if (idsParam) {
20
+ const ids = new Set(idsParam.split(",").map((s) => s.trim()).filter(Boolean));
21
+ const rows = all.filter((t) => ids.has(t.id));
22
+ res.json({ taxonomy: rows, count: rows.length, total: all.length });
23
+ return;
24
+ }
25
+ const matched = q
26
+ ? all.filter((t) => t.name.toLowerCase().includes(q))
27
+ : all;
28
+ res.json({
29
+ taxonomy: matched.slice(0, limit),
30
+ count: matched.length,
31
+ total: all.length,
32
+ });
10
33
  };
11
34
  exports.GET = GET;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL3RheG9ub215L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUFrRTtBQUdsRSwwRUFBMEU7QUFDbkUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sT0FBTyxHQUFxQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQy9CLENBQUMsQ0FBQTtBQUpZLFFBQUEsR0FBRyxPQUlmIn0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ZhaXJlL3RheG9ub215L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUFrRTtBQUdsRSxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUE7QUFDeEIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBO0FBRXJCLHlFQUF5RTtBQUN6RSx1RUFBdUU7QUFDdkUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQ3hFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLE9BQU8sR0FBcUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQUMsQ0FBQTtJQUN0RSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFZLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRTNFLE1BQU0sR0FBRyxHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFFNUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUM3RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNuRSxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUVQLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ2pDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTTtRQUNyQixLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDbEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBeEJZLFFBQUEsR0FBRyxPQXdCZiJ9
@@ -11,6 +11,11 @@ async function refreshFaireTokenJob(container) {
11
11
  if (!account) {
12
12
  return;
13
13
  }
14
+ // API-key connections have no OAuth token to refresh — skip entirely so the
15
+ // cron never drives Faire's token endpoint (which 400s for non-OAuth creds).
16
+ if (account.auth_mode === "apiKey") {
17
+ return;
18
+ }
14
19
  try {
15
20
  await service.ensureFreshToken(account);
16
21
  }
@@ -22,4 +27,4 @@ exports.config = {
22
27
  name: "faire-refresh-token",
23
28
  schedule: "*/10 * * * *",
24
29
  };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC1mYWlyZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3JlZnJlc2gtZmFpcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsdUNBV0M7QUFoQkQsc0RBQXlEO0FBR3pELHdFQUF3RTtBQUN4RSxtRkFBbUY7QUFDcEUsS0FBSyxVQUFVLG9CQUFvQixDQUFDLFNBQTBCO0lBQzNFLE1BQU0sT0FBTyxHQUFxQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUNoRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xFLENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixRQUFRLEVBQUUsY0FBYztDQUN6QixDQUFBIn0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC1mYWlyZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3JlZnJlc2gtZmFpcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsdUNBZ0JDO0FBckJELHNEQUF5RDtBQUd6RCx3RUFBd0U7QUFDeEUsbUZBQW1GO0FBQ3BFLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxTQUEwQjtJQUMzRSxNQUFNLE9BQU8sR0FBcUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTTtJQUNSLENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLElBQUssT0FBZSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xFLENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixRQUFRLEVBQUUsY0FBYztDQUN6QixDQUFBIn0=
@@ -176,6 +176,12 @@ class FaireSyncService extends (0, utils_1.MedusaService)({
176
176
  if (!acct) {
177
177
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Faire account is not connected");
178
178
  }
179
+ // API keys never expire and have no OAuth refresh flow — short-circuit
180
+ // before touching the refresh path. Without this, a stray token_expires_at
181
+ // on an apiKey account would drive the OAuth token endpoint and 400 hourly.
182
+ if (acct.auth_mode === "apiKey") {
183
+ return this.withDecryptedTokens(acct);
184
+ }
179
185
  if (!acct.token_expires_at) {
180
186
  return this.withDecryptedTokens(acct);
181
187
  }
@@ -190,7 +196,8 @@ class FaireSyncService extends (0, utils_1.MedusaService)({
190
196
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Faire access token has expired. Please reconnect your Faire account.");
191
197
  }
192
198
  try {
193
- const client = this.getClient();
199
+ // OAuth-only path (apiKey accounts short-circuited above).
200
+ const client = this.getClient("oauth");
194
201
  const token = await client.refreshAccessToken(refreshToken);
195
202
  const updated = await this.updateFaireSyncAccounts({
196
203
  id: acct.id,
@@ -348,4 +355,4 @@ class FaireSyncService extends (0, utils_1.MedusaService)({
348
355
  }
349
356
  }
350
357
  exports.default = FaireSyncService;
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ZhaXJlLXN5bmMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFzRTtBQUN0RSxxRkFBMEQ7QUFDMUQsbUZBQXdEO0FBQ3hELHVGQUE0RDtBQUM1RCxpRkFBc0Q7QUFDdEQsdUVBQTZDO0FBQzdDLHlEQUFvRDtBQUNwRCw2Q0FBK0Q7QUFLL0QsU0FBUyxVQUFVLENBQUMsT0FBWSxFQUFFLEdBQVc7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3RELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQVE7SUFDN0IsSUFBSSxHQUFHLFlBQVksbUJBQVc7UUFBRSxPQUFPLEdBQUcsQ0FBQTtJQUUxQyxNQUFNLE1BQU0sR0FBdUIsR0FBRyxFQUFFLE1BQU0sQ0FBQTtJQUM5QyxNQUFNLElBQUksR0FBUSxHQUFHLEVBQUUsSUFBSSxDQUFBO0lBQzNCLE1BQU0sT0FBTyxHQUNYLElBQUksRUFBRSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksc0JBQXNCLENBQUE7SUFFbEYsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQy9FLE9BQU8sSUFBSSxtQkFBVyxDQUNwQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9FQUFvRSxDQUNyRSxDQUFBO0lBQ0gsQ0FBQztJ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
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ZhaXJlLXN5bmMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFzRTtBQUN0RSxxRkFBMEQ7QUFDMUQsbUZBQXdEO0FBQ3hELHVGQUE0RDtBQUM1RCxpRkFBc0Q7QUFDdEQsdUVBQTZDO0FBQzdDLHlEQUFvRDtBQUNwRCw2Q0FBK0Q7QUFLL0QsU0FBUyxVQUFVLENBQUMsT0FBWSxFQUFFLEdBQVc7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3RELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQVE7SUFDN0IsSUFBSSxHQUFHLFlBQVksbUJBQVc7UUFBRSxPQUFPLEdBQUcsQ0FBQTtJQUUxQyxNQUFNLE1BQU0sR0FBdUIsR0FBRyxFQUFFLE1BQU0sQ0FBQTtJQUM5QyxNQUFNLElBQUksR0FBUSxHQUFHLEVBQUUsSUFBSSxDQUFBO0lBQzNCLE1BQU0sT0FBTyxHQUNYLElBQUksRUFBRSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksc0JBQXNCLENBQUE7SUFFbEYsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQy9FLE9BQU8sSUFBSSxtQkFBVyxDQUNwQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9FQUFvRSxDQUNyRSxDQUFBO0lBQ0gsQ0FBQztJ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
@@ -71,7 +71,11 @@ const prepareProductStep = (0, workflows_sdk_1.createStep)("faire-prepare-produc
71
71
  "variants.prices.*",
72
72
  "variants.options.*",
73
73
  "variants.options.option.*",
74
+ "variants.manage_inventory",
74
75
  "variants.inventory_items.*",
76
+ // Real stock lives on the inventory item's per-location levels; the
77
+ // variant has no `inventory_quantity` column in a plain query.graph.
78
+ "variants.inventory_items.inventory.location_levels.*",
75
79
  "images.*",
76
80
  "variants.sku",
77
81
  ],
@@ -118,6 +122,37 @@ const prepareProductStep = (0, workflows_sdk_1.createStep)("faire-prepare-produc
118
122
  const pickPrice = (prices) => prices.find((p) => String(p.currency_code || "").toUpperCase() === currency) ??
119
123
  prices[0] ??
120
124
  null;
125
+ // Available quantity for Faire. Medusa v2 has no `variant.inventory_quantity`
126
+ // column in a plain query.graph — the old code read that undefined field so
127
+ // EVERY variant published to Faire as available_quantity 0 (sold out). Compute
128
+ // it from the inventory item location levels (available = stocked − reserved),
129
+ // matching Medusa's own `min(floor(itemAvailable / required_quantity))` rule.
130
+ const variantQuantity = (v) => {
131
+ // manage_inventory === false → Medusa treats the variant as always in
132
+ // stock, so there are no levels to read. Publish a healthy default (Faire
133
+ // needs a number) that operators can override per product.
134
+ if (v?.manage_inventory === false) {
135
+ const d = Number(metadata.faire_default_available_quantity);
136
+ return Number.isFinite(d) && d >= 0 ? Math.floor(d) : 100;
137
+ }
138
+ const items = v?.inventory_items || [];
139
+ if (!items.length)
140
+ return 0;
141
+ let available = Infinity;
142
+ for (const link of items) {
143
+ // Tolerate both the pivot shape ({ inventory: {...} }) and a flattened one.
144
+ const inv = link?.inventory ?? link;
145
+ const levels = inv?.location_levels || [];
146
+ const itemAvailable = levels.reduce((sum, lvl) => {
147
+ const stocked = Number(lvl?.stocked_quantity ?? 0);
148
+ const reserved = Number(lvl?.reserved_quantity ?? 0);
149
+ return sum + Math.max(0, stocked - reserved);
150
+ }, 0);
151
+ const required = Number(link?.required_quantity ?? 1) || 1;
152
+ available = Math.min(available, Math.floor(itemAvailable / required));
153
+ }
154
+ return Number.isFinite(available) ? Math.max(0, available) : 0;
155
+ };
121
156
  const buildVariant = (v, idx) => {
122
157
  const retail = pickPrice(v.prices || []);
123
158
  const retailMinor = retail ? toMinor(retail.amount) : 0;
@@ -136,7 +171,7 @@ const prepareProductStep = (0, workflows_sdk_1.createStep)("faire-prepare-produc
136
171
  name: v.title || sku,
137
172
  idempotence_token: `${product.id}:${v.id || sku}`,
138
173
  options: options.length ? options : undefined,
139
- available_quantity: Number(v.inventory_quantity) || 0,
174
+ available_quantity: variantQuantity(v),
140
175
  prices: retailMinor > 0
141
176
  ? [
142
177
  {
@@ -182,6 +217,18 @@ const prepareProductStep = (0, workflows_sdk_1.createStep)("faire-prepare-produc
182
217
  idempotence_token: `${product.id}:default`,
183
218
  available_quantity: 0,
184
219
  });
220
+ // Faire requires `unit_multiplier` — the number of individual units in one
221
+ // sellable unit (e.g. a case of 6) — as a positive integer, or it rejects
222
+ // the create with 400 "unit multiplier is mandatory…". Default to 1 (sold
223
+ // individually); allow a per-product override via metadata.
224
+ const toPositiveInt = (v) => {
225
+ const n = Math.floor(Number(v));
226
+ return Number.isFinite(n) && n > 0 ? n : null;
227
+ };
228
+ const unit_multiplier = toPositiveInt(metadata.faire_unit_multiplier) ?? 1;
229
+ const minimum_order_quantity = toPositiveInt(metadata.faire_min_order_quantity) ??
230
+ toPositiveInt(settings.default_min_order_quantity) ??
231
+ 1;
185
232
  const product_input = {
186
233
  name: (product.title || "Untitled Product").slice(0, 140),
187
234
  idempotence_token: product.id,
@@ -191,6 +238,8 @@ const prepareProductStep = (0, workflows_sdk_1.createStep)("faire-prepare-produc
191
238
  short_description: typeof metadata.faire_short_description === "string"
192
239
  ? metadata.faire_short_description
193
240
  : undefined,
241
+ unit_multiplier,
242
+ minimum_order_quantity,
194
243
  images,
195
244
  variants: builtVariants,
196
245
  };
@@ -337,4 +386,4 @@ exports.syncProductToFaireWorkflow = (0, workflows_sdk_1.createWorkflow)(exports
337
386
  warnings: result.warnings,
338
387
  });
339
388
  });
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0LXRvLWZhaXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zeW5jLXByb2R1Y3QtdG8tZmFpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTzBDO0FBQzFDLHFEQUEyRjtBQUczRixzREFBeUQ7QUFPNUMsUUFBQSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQTtBQThCekQ7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQXdCLEVBQWlCLEVBQUU7SUFDcEUsSUFBSSxPQUFPLENBQUMsR0FBRztRQUFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQTtJQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUN2QyxPQUFPLHdDQUF3QyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUE7QUFDeEUsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQ3JCLFFBQWdCLEVBQ2hCLE9BQXNCLEVBQ3dCLEVBQUU7SUFDaEQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLENBQUE7UUFDNUMsS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQixLQUFLLEtBQUs7WUFDUixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO1FBQzFCLEtBQUssS0FBSztZQUNSLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFDMUIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQjtZQUNFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFB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
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0LXRvLWZhaXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zeW5jLXByb2R1Y3QtdG8tZmFpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTzBDO0FBQzFDLHFEQUEyRjtBQUczRixzREFBeUQ7QUFPNUMsUUFBQSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQTtBQThCekQ7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQXdCLEVBQWlCLEVBQUU7SUFDcEUsSUFBSSxPQUFPLENBQUMsR0FBRztRQUFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQTtJQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUN2QyxPQUFPLHdDQUF3QyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUE7QUFDeEUsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQ3JCLFFBQWdCLEVBQ2hCLE9BQXNCLEVBQ3dCLEVBQUU7SUFDaEQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLENBQUE7UUFDNUMsS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQixLQUFLLEtBQUs7WUFDUixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO1FBQzFCLEtBQUssS0FBSztZQUNSLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFDMUIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQjtZQUNFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFBO0lBQ3RFLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRCw0RUFBNEU7QUFFNUUsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLDBCQUFVLEVBQ3ZDLDJCQUEyQixFQUMzQixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQXlDLEVBQUU7SUFDaEUsTUFBTSxPQUFPLEdBQXFCLFNBQVMsQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQUMsQ0FBQTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ2hELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzVDLE9BQU8sSUFBSSw0QkFBWSxDQUFDO1FBQ3RCLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLFNBQVMsRUFBRyxPQUFPLENBQUMsU0FBZ0MsSUFBSSxPQUFPO1FBQy9ELFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDbEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSTtRQUNoQyxRQUFRO0tBQ1QsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCw0RUFBNEU7QUFFNUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQ25DLDRCQUE0QixFQUM1QixLQUFLLEVBQ0gsS0FRQyxFQUNELEVBQUUsU0FBUyxFQUFFLEVBQzJCLEVBQUU7SUFDMUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDN0IsaUNBQXlCLENBQUMsS0FBSyxDQUNLLENBQUE7SUFDdEMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxJQUFJLENBQVMsQ0FBQTtJQUM1RSxNQUFNLE9BQU8sR0FBcUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBRXRFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLE1BQU0sRUFBRTtZQUNOLElBQUk7WUFDSixPQUFPO1lBQ1AsYUFBYTtZQUNiLFFBQVE7WUFDUixVQUFVO1lBQ1YsWUFBWTtZQUNaLFFBQVE7WUFDUixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLG9CQUFvQjtZQUNwQiwyQkFBMkI7WUFDM0IsMkJBQTJCO1lBQzNCLDRCQUE0QjtZQUM1QixvRUFBb0U7WUFDcEUscUVBQXFFO1lBQ3JFLHNEQUFzRDtZQUN0RCxVQUFVO1lBQ1YsY0FBYztTQUNmO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUU7S0FDbEMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxPQUFPLEdBQVEsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsV0FBVyxLQUFLLENBQUMsVUFBVSxZQUFZLENBQ3hDLENBQUE7SUFDSCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQUksc0JBQXNCLEdBQWtCLElBQUksQ0FBQTtJQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ2hELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JDLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ25ELENBQUMsOEJBQWlCLENBQUMsRUFBRSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7YUFDM0QsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxHQUFHLEdBQVMsUUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3pDLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxtQkFBbUIsSUFBSSxJQUFJLENBQUE7UUFDM0QsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGNBQWM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFBO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO0lBQ3ZDLE1BQU0sUUFBUSxHQUFVLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO0lBRTlDLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FDckIsUUFBUSxDQUFDLGNBQWM7UUFDckIsS0FBSyxDQUFDLFFBQVE7UUFDZCxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxJQUFJLEtBQUssQ0FBQyxDQUN2RSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ2YsTUFBTSxhQUFhLEdBQ2pCLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsS0FBSyxRQUFRO1FBQ2hGLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CO1FBQy9CLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUU3QywyRUFBMkU7SUFDM0UsK0NBQStDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBVyxFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFFOUUsTUFBTSxhQUFhLEdBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsOEJBQThCLElBQUksUUFBUSxDQUFDLGdDQUFnQyxDQUFDO1FBQzVGLENBQUMsQ0FBQTtJQUVILHdFQUF3RTtJQUN4RSxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWEsRUFBTyxFQUFFLENBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztRQUM1RSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ1QsSUFBSSxDQUFBO0lBRU4sOEVBQThFO0lBQzlFLDRFQUE0RTtJQUM1RSwrRUFBK0U7SUFDL0UsK0VBQStFO0lBQy9FLDhFQUE4RTtJQUM5RSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQU0sRUFBVSxFQUFFO1FBQ3pDLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxFQUFFLGdCQUFnQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtZQUMzRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQzNELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBVSxDQUFDLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQTtRQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUE7UUFDeEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6Qiw0RUFBNEU7WUFDNUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUE7WUFDbkMsTUFBTSxNQUFNLEdBQVUsR0FBRyxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUE7WUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxHQUFRLEVBQUUsRUFBRTtnQkFDNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFDcEQsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFBO1lBQzlDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNMLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEUsQ0FBQyxDQUFBO0lBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFNLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUE7UUFDeEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkQsTUFBTSxjQUFjLEdBQ2xCLGFBQWEsR0FBRyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDekQsQ0FBQyxDQUFDLFdBQVcsQ0FBQTtRQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDekIsTUFBTSxPQUFPLEdBQ1gsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQzthQUNkLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1lBQ3BELEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7U0FDN0IsQ0FBQyxDQUFDO2FBQ0YsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3RDLE9BQU87WUFDTCxHQUFHO1lBQ0gsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRztZQUNwQixpQkFBaUIsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDakQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM3QyxrQkFBa0IsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sRUFDSixXQUFXLEdBQUcsQ0FBQztnQkFDYixDQUFDLENBQUM7b0JBQ0U7d0JBQ0UsY0FBYyxFQUFFLGFBQWE7d0JBQzdCLGVBQWUsRUFBRSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFO3dCQUMzRCxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRTtxQkFDdEQ7aUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7U0FDaEIsQ0FBQTtJQUNILENBQUMsQ0FBQTtJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDbEMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRTVCLGlFQUFpRTtJQUNqRSxzRUFBc0U7SUFDdEUsNkNBQTZDO0lBQzdDLDJFQUEyRTtJQUMzRSxzREFBc0Q7SUFDdEQsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFlBQVksR0FDaEIsUUFBUSxDQUFDLHNCQUFzQjtRQUMvQixRQUFRLENBQUMsY0FBYztRQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDbkIsUUFBUSxDQUFDLGdCQUFnQjtRQUN6QixFQUFFLENBQUE7SUFDSixNQUFNLGNBQWMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDdkQsS0FBSyxDQUFDLFlBQVksRUFDbEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUNyQixDQUFBO0lBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHVFQUF1RTtZQUNyRSxzRUFBc0U7WUFDdEUsa0VBQWtFLENBQ3JFLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQ25CLFFBQVEsQ0FBQyxxQkFBcUIsS0FBSyxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXO1FBQ3hFLENBQUMsQ0FBQyxXQUFXO1FBQ2IsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUViLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3ZFLENBQUM7UUFDQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1lBQ0Usa0VBQWtFO1lBQ2xFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNmLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLFNBQVM7WUFDaEMsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVO1lBQzFDLGtCQUFrQixFQUFFLENBQUM7U0FDdEIsQ0FDTixDQUFBO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsNERBQTREO0lBQzVELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBTSxFQUFpQixFQUFFO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQy9DLENBQUMsQ0FBQTtJQUNELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDMUUsTUFBTSxzQkFBc0IsR0FDMUIsYUFBYSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztRQUNoRCxhQUFhLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDO1FBQ2xELENBQUMsQ0FBQTtJQUVILE1BQU0sYUFBYSxHQUF1QjtRQUN4QyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0IsZUFBZTtRQUNmLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUU7UUFDckMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtRQUN0QyxpQkFBaUIsRUFDZixPQUFPLFFBQVEsQ0FBQyx1QkFBdUIsS0FBSyxRQUFRO1lBQ2xELENBQUMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCO1lBQ2xDLENBQUMsQ0FBQyxTQUFTO1FBQ2YsZUFBZTtRQUNmLHNCQUFzQjtRQUN0QixNQUFNO1FBQ04sUUFBUSxFQUFFLGFBQWE7S0FDeEIsQ0FBQTtJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDO1FBQ3RCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUM1QixhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDNUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQzlCLGFBQWE7UUFDYixzQkFBc0I7S0FDdkIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCw0RUFBNEU7QUFFNUUsTUFBTSxlQUFlLEdBQUcsSUFBQSwwQkFBVSxFQUNoQyx5QkFBeUIsRUFDekIsS0FBSyxFQUNILEtBR0MsRUFDRCxFQUFFLFNBQVMsRUFBRSxFQUNzQixFQUFFO0lBQ3JDLE1BQU0sT0FBTyxHQUFxQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFDdEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtJQUMvQyxNQUFNLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxHQUM3RCxLQUFLLENBQUMsUUFBUSxDQUFBO0lBRWhCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQTtJQUM3QixJQUFJLE9BQXdCLENBQUE7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLHNCQUFzQixFQUFFO2dCQUN6RSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7Z0JBQ3hCLFdBQVcsRUFBRSxhQUFhLENBQUMsV0FBVztnQkFDdEMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEQsZUFBZSxFQUFFLGFBQWEsQ0FBQyxlQUFlO2dCQUM5QyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQWE7Z0JBQzFDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtnQkFDNUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2FBQ2pDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLDhEQUE4RDtRQUM5RCxRQUFRLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDckUsTUFBTSxHQUFHLENBQUE7SUFDWCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEQsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO2dCQUNWLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDO2FBQzVDLENBQUMsQ0FBQyxDQUFBO1lBQ0gsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsTUFBTSxhQUFhLEdBQ2pCLFFBQVEsQ0FBQyxxQkFBcUIsS0FBSyxLQUFLLElBQUksY0FBYyxLQUFLLFdBQVcsQ0FBQTtJQUM1RSxNQUFNLFNBQVMsR0FBRyxhQUFhLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUE7SUFFN0QsT0FBTyxJQUFJLDRCQUFZLENBQUM7UUFDdEIsT0FBTztRQUNQLFNBQVM7UUFDVCxRQUFRO0tBQ1QsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxFQUNELEtBQUssSUFBSSxFQUFFLEdBQUUsQ0FBQyxDQUNmLENBQUE7QUFFRCw0RUFBNEU7QUFFNUUsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3RDLGdDQUFnQyxFQUNoQyxLQUFLLEVBQ0gsS0FJQyxFQUNELEVBQUUsU0FBUyxFQUFFLEVBQ2dCLEVBQUU7SUFDL0IsTUFBTSxPQUFPLEdBQXFCLFNBQVMsQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQUMsQ0FBQTtJQUN0RSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLElBQUksQ0FBUyxDQUFBO0lBRTVFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUMxQyxNQUFNLE1BQU0sR0FBd0IsTUFBTSxDQUFDLFNBQVM7UUFDbEQsQ0FBQyxDQUFDLFNBQVM7UUFDWCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTztZQUNoQyxDQUFDLENBQUMsT0FBTztZQUNULENBQUMsQ0FBQyxTQUFTLENBQUE7SUFFZixNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLGFBQWEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWE7UUFDM0MsV0FBVyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSztRQUNuQyxNQUFNLEVBQUUsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDN0QsTUFBTTtRQUNOLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztRQUMzQixhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQzFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUMzQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7S0FDZixDQUFDLENBQUE7SUFFVCxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDdkI7Z0JBQ0UsQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDdEQsQ0FBQyw4QkFBaUIsQ0FBQyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTthQUNsRTtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCx3QkFBd0I7SUFDMUIsQ0FBQztJQUVELE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN0QjtZQUNFLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDdEQsQ0FBQyw4QkFBaUIsQ0FBQyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNqRSxJQUFJLEVBQUU7Z0JBQ0osbUJBQW1CLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2dCQUNqRCxTQUFTLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDNUMsV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLGNBQWMsRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDMUIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDdkUsUUFBUSxFQUFFO29CQUNSLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDM0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSztvQkFDM0IsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO2lCQUN4QzthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksNEJBQVksRUFBRSxDQUFBO0FBQzNCLENBQUMsQ0FDRixDQUFBO0FBRUQsNEVBQTRFO0FBRS9ELFFBQUEsMEJBQTBCLEdBQUcsSUFBQSw4QkFBYyxFQUN0RCw2QkFBcUIsRUFDckIsQ0FBQyxLQUE0QyxFQUFFLEVBQUU7SUFDL0MsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQTtJQUN2QyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FDakMsSUFBQSx5QkFBUyxFQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7UUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtRQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1FBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7UUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztRQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO1FBQ3RDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7S0FDakMsQ0FBQyxDQUFDLENBQ0osQ0FBQTtJQUVELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FDNUIsSUFBQSx5QkFBUyxFQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7S0FDeEIsQ0FBQyxDQUFDLENBQ0osQ0FBQTtJQUVELHFCQUFxQixDQUNuQixJQUFBLHlCQUFTLEVBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO0tBQ3BCLENBQUMsQ0FBQyxDQUNKLENBQUE7SUFFRCxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYTtRQUMzQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSztRQUMzQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jytextiles/medusa-plugin-faire-store-sync",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -84,10 +84,17 @@ export const faireApi = {
84
84
  retrySync: (id: string) =>
85
85
  sdk.client.fetch(`/admin/faire/syncs/${id}`, { method: "POST" }),
86
86
  brand: () => sdk.client.fetch("/admin/faire/brand"),
87
- taxonomy: () =>
88
- sdk.client.fetch<{ taxonomy: Array<{ id: string; name: string }> }>(
89
- "/admin/faire/taxonomy"
90
- ),
87
+ taxonomy: (opts: { q?: string; limit?: number; ids?: string[] } = {}) => {
88
+ const query: Record<string, string> = {}
89
+ if (opts.q) query.q = opts.q
90
+ if (opts.limit !== undefined) query.limit = String(opts.limit)
91
+ if (opts.ids?.length) query.ids = opts.ids.join(",")
92
+ return sdk.client.fetch<{
93
+ taxonomy: Array<{ id: string; name: string }>
94
+ count: number
95
+ total: number
96
+ }>("/admin/faire/taxonomy", { query })
97
+ },
91
98
  products: (opts: { limit?: number; page?: string; updated_at_min?: string } = {}) => {
92
99
  const query: Record<string, string> = {}
93
100
  if (opts.limit !== undefined) query.limit = String(opts.limit)
@@ -209,20 +209,26 @@ const FaireSettingsPage = () => {
209
209
  {connected ? (
210
210
  <div className="flex items-center gap-3">
211
211
  <StatusBadge color="green">Connected</StatusBadge>
212
- <Button
213
- size="small"
214
- variant="secondary"
215
- onClick={() => navigate("/settings/faire/bulk")}
216
- >
217
- Bulk sync
218
- </Button>
219
- <Button
220
- size="small"
221
- variant="secondary"
222
- onClick={() => navigate("/settings/faire/settings")}
223
- >
224
- Sync settings
225
- </Button>
212
+ <DropdownMenu>
213
+ <DropdownMenu.Trigger asChild>
214
+ <Button size="small" variant="secondary">
215
+ Sync
216
+ <ChevronDownMini />
217
+ </Button>
218
+ </DropdownMenu.Trigger>
219
+ <DropdownMenu.Content>
220
+ <DropdownMenu.Item
221
+ onClick={() => navigate("/settings/faire/bulk")}
222
+ >
223
+ Bulk sync
224
+ </DropdownMenu.Item>
225
+ <DropdownMenu.Item
226
+ onClick={() => navigate("/settings/faire/settings")}
227
+ >
228
+ Sync settings
229
+ </DropdownMenu.Item>
230
+ </DropdownMenu.Content>
231
+ </DropdownMenu>
226
232
  <Button
227
233
  size="small"
228
234
  variant="danger"
@@ -15,11 +15,16 @@ import {
15
15
  toast,
16
16
  } from "@medusajs/ui"
17
17
  import { DetailWidgetProps, AdminProduct } from "@medusajs/framework/types"
18
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
19
- import { useMemo, useState } from "react"
18
+ import {
19
+ keepPreviousData,
20
+ useMutation,
21
+ useQuery,
22
+ useQueryClient,
23
+ } from "@tanstack/react-query"
24
+ import { useEffect, useState } from "react"
20
25
  import { faireApi, sdk } from "../lib/api"
21
26
 
22
- const MAX_RENDERED = 60
27
+ const PICKER_LIMIT = 50
23
28
 
24
29
  const badgeColor = (status?: string): "green" | "red" | "orange" | "grey" => {
25
30
  switch (status) {
@@ -102,28 +107,60 @@ const FaireProductWidget = ({ data }: DetailWidgetProps<AdminProduct>) => {
102
107
 
103
108
  const [pickerOpen, setPickerOpen] = useState(false)
104
109
  const [pickerSearch, setPickerSearch] = useState("")
110
+ // Debounce the typed query so each keystroke doesn't fire a request; the
111
+ // backend searches its cached taxonomy and returns only matches.
112
+ const [debouncedSearch, setDebouncedSearch] = useState("")
113
+ useEffect(() => {
114
+ const t = setTimeout(() => setDebouncedSearch(pickerSearch.trim()), 250)
115
+ return () => clearTimeout(t)
116
+ }, [pickerSearch])
117
+
105
118
  // Local echo of the saved pin so the panel updates instantly (the parent
106
119
  // product page's `data.metadata` only refreshes on its own refetch).
107
- const [pinnedOverride, setPinnedOverride] = useState<string | null | undefined>(
108
- undefined
109
- )
120
+ const [pinnedOverride, setPinnedOverride] = useState<
121
+ { id: string | null; name: string | null } | undefined
122
+ >(undefined)
110
123
 
124
+ // Search results — server-side filtered + sliced (Faire has no search API, so
125
+ // the backend caches the full ~3k list and filters there). keepPreviousData
126
+ // avoids a flash of "loading" between keystrokes.
111
127
  const taxonomyQuery = useQuery({
112
- queryKey: ["faire", "taxonomy"],
128
+ queryKey: ["faire", "taxonomy", "search", debouncedSearch],
113
129
  enabled: pickerOpen,
114
- queryFn: async () => (await faireApi.taxonomy()).taxonomy ?? [],
130
+ placeholderData: keepPreviousData,
131
+ queryFn: async () =>
132
+ faireApi.taxonomy({
133
+ q: debouncedSearch || undefined,
134
+ limit: PICKER_LIMIT,
135
+ }),
115
136
  })
116
- const taxonomy = taxonomyQuery.data ?? []
137
+ const results = taxonomyQuery.data?.taxonomy ?? []
138
+ const matchCount = taxonomyQuery.data?.count ?? 0
117
139
 
118
140
  const pinnedId: string | undefined =
119
141
  pinnedOverride !== undefined
120
- ? pinnedOverride ?? undefined
142
+ ? pinnedOverride.id ?? undefined
121
143
  : metadata.faire_taxonomy_type_id
122
- const pinnedName = useMemo(() => {
123
- if (!pinnedId) return undefined
124
- if (!/^tt_/.test(String(pinnedId))) return String(pinnedId)
125
- return taxonomy.find((t: any) => t.id === pinnedId)?.name
126
- }, [pinnedId, taxonomy])
144
+ const pinnedNameFromMeta: string | undefined =
145
+ pinnedOverride !== undefined
146
+ ? pinnedOverride.name ?? undefined
147
+ : metadata.faire_taxonomy_type_name
148
+
149
+ // Resolve the name of an already-pinned `tt_…` id when it wasn't stored
150
+ // alongside (legacy pins) — a targeted `ids` lookup, not the whole list.
151
+ const pinnedResolveQuery = useQuery({
152
+ queryKey: ["faire", "taxonomy", "resolve", pinnedId],
153
+ enabled: !!pinnedId && !pinnedNameFromMeta && /^tt_/.test(String(pinnedId)),
154
+ queryFn: async () =>
155
+ (await faireApi.taxonomy({ ids: [pinnedId!] })).taxonomy,
156
+ })
157
+ const pinnedName =
158
+ pinnedNameFromMeta ??
159
+ (pinnedId && /^tt_/.test(String(pinnedId))
160
+ ? pinnedResolveQuery.data?.[0]?.name
161
+ : pinnedId
162
+ ? String(pinnedId)
163
+ : undefined)
127
164
 
128
165
  // What the sync will actually use as the category source, for display.
129
166
  const resolvedSource = pinnedId
@@ -134,25 +171,21 @@ const FaireProductWidget = ({ data }: DetailWidgetProps<AdminProduct>) => {
134
171
  ? { label: productType, from: "type" as const }
135
172
  : { label: "Account fallback", from: "fallback" as const }
136
173
 
137
- const filteredTaxonomy = useMemo(() => {
138
- const q = pickerSearch.trim().toLowerCase()
139
- const list = q
140
- ? taxonomy.filter((t: any) => t.name.toLowerCase().includes(q))
141
- : taxonomy
142
- return list.slice(0, MAX_RENDERED)
143
- }, [taxonomy, pickerSearch])
144
-
145
174
  const saveCategory = useMutation({
146
- mutationFn: (value: string | null) =>
175
+ mutationFn: (choice: { id: string; name: string } | null) =>
147
176
  sdk.admin.product.update(data.id, {
148
- metadata: { ...metadata, faire_taxonomy_type_id: value },
177
+ metadata: {
178
+ ...metadata,
179
+ faire_taxonomy_type_id: choice?.id ?? null,
180
+ faire_taxonomy_type_name: choice?.name ?? null,
181
+ },
149
182
  }),
150
- onSuccess: (_res, value) => {
151
- setPinnedOverride(value)
183
+ onSuccess: (_res, choice) => {
184
+ setPinnedOverride({ id: choice?.id ?? null, name: choice?.name ?? null })
152
185
  queryClient.invalidateQueries({ queryKey: ["product", data.id] })
153
186
  setPickerOpen(false)
154
187
  setPickerSearch("")
155
- toast.success(value ? "Faire category set" : "Faire category cleared")
188
+ toast.success(choice ? "Faire category set" : "Faire category cleared")
156
189
  },
157
190
  onError: (err: any) =>
158
191
  toast.error("Failed to save category", { description: err?.message }),
@@ -299,16 +332,18 @@ const FaireProductWidget = ({ data }: DetailWidgetProps<AdminProduct>) => {
299
332
  <Text size="small" className="text-ui-fg-subtle px-1 py-2">
300
333
  Loading categories…
301
334
  </Text>
302
- ) : filteredTaxonomy.length === 0 ? (
335
+ ) : results.length === 0 ? (
303
336
  <Text size="small" className="text-ui-fg-subtle px-1 py-2">
304
- No categories match “{pickerSearch}”.
337
+ {debouncedSearch
338
+ ? `No categories match “${debouncedSearch}”.`
339
+ : "No categories available."}
305
340
  </Text>
306
341
  ) : (
307
- filteredTaxonomy.map((t: any) => (
342
+ results.map((t) => (
308
343
  <button
309
344
  key={t.id}
310
345
  type="button"
311
- onClick={() => saveCategory.mutate(t.id)}
346
+ onClick={() => saveCategory.mutate(t)}
312
347
  disabled={saveCategory.isPending}
313
348
  className={clx(
314
349
  "flex items-center justify-between rounded-md px-3 py-2 text-left text-sm",
@@ -325,13 +360,12 @@ const FaireProductWidget = ({ data }: DetailWidgetProps<AdminProduct>) => {
325
360
  </button>
326
361
  ))
327
362
  )}
328
- {!taxonomyQuery.isLoading &&
329
- taxonomy.length > filteredTaxonomy.length && (
330
- <Text size="xsmall" className="text-ui-fg-muted px-1 py-1">
331
- Showing {filteredTaxonomy.length} of {taxonomy.length} — refine
332
- your search to narrow down.
333
- </Text>
334
- )}
363
+ {!taxonomyQuery.isLoading && matchCount > results.length && (
364
+ <Text size="xsmall" className="text-ui-fg-muted px-1 py-1">
365
+ Showing {results.length} of {matchCount} matches — refine your
366
+ search to narrow down.
367
+ </Text>
368
+ )}
335
369
  </div>
336
370
  </Drawer.Body>
337
371
  <Drawer.Footer>
@@ -2,9 +2,37 @@ import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
2
2
  import { FAIRE_SYNC_MODULE } from "../../../../modules/faire-sync"
3
3
  import FaireSyncService from "../../../../modules/faire-sync/service"
4
4
 
5
- // GET /admin/faire/taxonomy — taxonomy types from Faire's /products/types
5
+ const DEFAULT_LIMIT = 50
6
+ const MAX_LIMIT = 200
7
+
8
+ // GET /admin/faire/taxonomy?q=&limit=&ids= — taxonomy types from Faire's
9
+ // /products/types. Faire returns the full ~3k list unpaginated with no
10
+ // server-side search, so the service caches the whole list and we filter/slice
11
+ // HERE. The browser sends `q` and gets back only matches, instead of pulling
12
+ // every row to filter client-side. `ids` resolves specific `tt_…` rows (used to
13
+ // show the name of an already-pinned category without loading the whole list).
6
14
  export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
7
15
  const service: FaireSyncService = req.scope.resolve(FAIRE_SYNC_MODULE)
8
- const types = await service.getTaxonomyTypes()
9
- res.json({ taxonomy: types })
16
+ const q = String((req.query.q as string) ?? "").trim().toLowerCase()
17
+ const idsParam = String((req.query.ids as string) ?? "").trim()
18
+ const limit = Math.min(Number(req.query.limit) || DEFAULT_LIMIT, MAX_LIMIT)
19
+
20
+ const all = await service.getTaxonomyTypes()
21
+
22
+ if (idsParam) {
23
+ const ids = new Set(idsParam.split(",").map((s) => s.trim()).filter(Boolean))
24
+ const rows = all.filter((t) => ids.has(t.id))
25
+ res.json({ taxonomy: rows, count: rows.length, total: all.length })
26
+ return
27
+ }
28
+
29
+ const matched = q
30
+ ? all.filter((t) => t.name.toLowerCase().includes(q))
31
+ : all
32
+
33
+ res.json({
34
+ taxonomy: matched.slice(0, limit),
35
+ count: matched.length,
36
+ total: all.length,
37
+ })
10
38
  }
@@ -10,6 +10,11 @@ export default async function refreshFaireTokenJob(container: MedusaContainer) {
10
10
  if (!account) {
11
11
  return
12
12
  }
13
+ // API-key connections have no OAuth token to refresh — skip entirely so the
14
+ // cron never drives Faire's token endpoint (which 400s for non-OAuth creds).
15
+ if ((account as any).auth_mode === "apiKey") {
16
+ return
17
+ }
13
18
  try {
14
19
  await service.ensureFreshToken(account)
15
20
  } catch (err: any) {
@@ -208,6 +208,12 @@ class FaireSyncService extends MedusaService({
208
208
  "Faire account is not connected"
209
209
  )
210
210
  }
211
+ // API keys never expire and have no OAuth refresh flow — short-circuit
212
+ // before touching the refresh path. Without this, a stray token_expires_at
213
+ // on an apiKey account would drive the OAuth token endpoint and 400 hourly.
214
+ if (acct.auth_mode === "apiKey") {
215
+ return this.withDecryptedTokens(acct)
216
+ }
211
217
  if (!acct.token_expires_at) {
212
218
  return this.withDecryptedTokens(acct)
213
219
  }
@@ -225,7 +231,8 @@ class FaireSyncService extends MedusaService({
225
231
  )
226
232
  }
227
233
  try {
228
- const client = this.getClient()
234
+ // OAuth-only path (apiKey accounts short-circuited above).
235
+ const client = this.getClient("oauth")
229
236
  const token = await client.refreshAccessToken(refreshToken)
230
237
  const updated = await this.updateFaireSyncAccounts({
231
238
  id: acct.id,
@@ -137,7 +137,11 @@ const prepareProductStep = createStep(
137
137
  "variants.prices.*",
138
138
  "variants.options.*",
139
139
  "variants.options.option.*",
140
+ "variants.manage_inventory",
140
141
  "variants.inventory_items.*",
142
+ // Real stock lives on the inventory item's per-location levels; the
143
+ // variant has no `inventory_quantity` column in a plain query.graph.
144
+ "variants.inventory_items.inventory.location_levels.*",
141
145
  "images.*",
142
146
  "variants.sku",
143
147
  ],
@@ -199,6 +203,37 @@ const prepareProductStep = createStep(
199
203
  prices[0] ??
200
204
  null
201
205
 
206
+ // Available quantity for Faire. Medusa v2 has no `variant.inventory_quantity`
207
+ // column in a plain query.graph — the old code read that undefined field so
208
+ // EVERY variant published to Faire as available_quantity 0 (sold out). Compute
209
+ // it from the inventory item location levels (available = stocked − reserved),
210
+ // matching Medusa's own `min(floor(itemAvailable / required_quantity))` rule.
211
+ const variantQuantity = (v: any): number => {
212
+ // manage_inventory === false → Medusa treats the variant as always in
213
+ // stock, so there are no levels to read. Publish a healthy default (Faire
214
+ // needs a number) that operators can override per product.
215
+ if (v?.manage_inventory === false) {
216
+ const d = Number(metadata.faire_default_available_quantity)
217
+ return Number.isFinite(d) && d >= 0 ? Math.floor(d) : 100
218
+ }
219
+ const items: any[] = v?.inventory_items || []
220
+ if (!items.length) return 0
221
+ let available = Infinity
222
+ for (const link of items) {
223
+ // Tolerate both the pivot shape ({ inventory: {...} }) and a flattened one.
224
+ const inv = link?.inventory ?? link
225
+ const levels: any[] = inv?.location_levels || []
226
+ const itemAvailable = levels.reduce((sum: number, lvl: any) => {
227
+ const stocked = Number(lvl?.stocked_quantity ?? 0)
228
+ const reserved = Number(lvl?.reserved_quantity ?? 0)
229
+ return sum + Math.max(0, stocked - reserved)
230
+ }, 0)
231
+ const required = Number(link?.required_quantity ?? 1) || 1
232
+ available = Math.min(available, Math.floor(itemAvailable / required))
233
+ }
234
+ return Number.isFinite(available) ? Math.max(0, available) : 0
235
+ }
236
+
202
237
  const buildVariant = (v: any, idx: number) => {
203
238
  const retail = pickPrice(v.prices || [])
204
239
  const retailMinor = retail ? toMinor(retail.amount) : 0
@@ -219,7 +254,7 @@ const prepareProductStep = createStep(
219
254
  name: v.title || sku,
220
255
  idempotence_token: `${product.id}:${v.id || sku}`,
221
256
  options: options.length ? options : undefined,
222
- available_quantity: Number(v.inventory_quantity) || 0,
257
+ available_quantity: variantQuantity(v),
223
258
  prices:
224
259
  retailMinor > 0
225
260
  ? [
@@ -281,6 +316,20 @@ const prepareProductStep = createStep(
281
316
  }
282
317
  )
283
318
 
319
+ // Faire requires `unit_multiplier` — the number of individual units in one
320
+ // sellable unit (e.g. a case of 6) — as a positive integer, or it rejects
321
+ // the create with 400 "unit multiplier is mandatory…". Default to 1 (sold
322
+ // individually); allow a per-product override via metadata.
323
+ const toPositiveInt = (v: any): number | null => {
324
+ const n = Math.floor(Number(v))
325
+ return Number.isFinite(n) && n > 0 ? n : null
326
+ }
327
+ const unit_multiplier = toPositiveInt(metadata.faire_unit_multiplier) ?? 1
328
+ const minimum_order_quantity =
329
+ toPositiveInt(metadata.faire_min_order_quantity) ??
330
+ toPositiveInt(settings.default_min_order_quantity) ??
331
+ 1
332
+
284
333
  const product_input: CreateProductInput = {
285
334
  name: (product.title || "Untitled Product").slice(0, 140),
286
335
  idempotence_token: product.id,
@@ -291,6 +340,8 @@ const prepareProductStep = createStep(
291
340
  typeof metadata.faire_short_description === "string"
292
341
  ? metadata.faire_short_description
293
342
  : undefined,
343
+ unit_multiplier,
344
+ minimum_order_quantity,
294
345
  images,
295
346
  variants: builtVariants,
296
347
  }