@mercurjs/algolia 1.3.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 (30) hide show
  1. package/.medusa/server/src/admin/index.js +117 -0
  2. package/.medusa/server/src/admin/index.mjs +118 -0
  3. package/.medusa/server/src/api/admin/algolia/route.d.ts +61 -0
  4. package/.medusa/server/src/api/admin/algolia/route.js +79 -0
  5. package/.medusa/server/src/modules/algolia/index.d.ts +8 -0
  6. package/.medusa/server/src/modules/algolia/index.js +17 -0
  7. package/.medusa/server/src/modules/algolia/service.d.ts +25 -0
  8. package/.medusa/server/src/modules/algolia/service.js +110 -0
  9. package/.medusa/server/src/subscribers/algolia-products-changed.d.ts +5 -0
  10. package/.medusa/server/src/subscribers/algolia-products-changed.js +22 -0
  11. package/.medusa/server/src/subscribers/algolia-products-deleted.d.ts +5 -0
  12. package/.medusa/server/src/subscribers/algolia-products-deleted.js +17 -0
  13. package/.medusa/server/src/subscribers/utils/algolia-product.d.ts +58 -0
  14. package/.medusa/server/src/subscribers/utils/algolia-product.js +139 -0
  15. package/.medusa/server/src/subscribers/utils/algolia-reviews.d.ts +9 -0
  16. package/.medusa/server/src/subscribers/utils/algolia-reviews.js +23 -0
  17. package/.medusa/server/src/subscribers/utils/index.d.ts +2 -0
  18. package/.medusa/server/src/subscribers/utils/index.js +19 -0
  19. package/.medusa/server/src/workflows/algolia/steps/index.d.ts +1 -0
  20. package/.medusa/server/src/workflows/algolia/steps/index.js +18 -0
  21. package/.medusa/server/src/workflows/algolia/steps/sync-algolia-products.d.ts +1 -0
  22. package/.medusa/server/src/workflows/algolia/steps/sync-algolia-products.js +54 -0
  23. package/.medusa/server/src/workflows/algolia/workflows/index.d.ts +1 -0
  24. package/.medusa/server/src/workflows/algolia/workflows/index.js +18 -0
  25. package/.medusa/server/src/workflows/algolia/workflows/sync-algolia.d.ts +1 -0
  26. package/.medusa/server/src/workflows/algolia/workflows/sync-algolia.js +9 -0
  27. package/.medusa/server/src/workflows/index.d.ts +2 -0
  28. package/.medusa/server/src/workflows/index.js +19 -0
  29. package/README.md +22 -0
  30. package/package.json +88 -0
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ const jsxRuntime = require("react/jsx-runtime");
3
+ const adminSdk = require("@medusajs/admin-sdk");
4
+ const ui = require("@medusajs/ui");
5
+ const reactQuery = require("@tanstack/react-query");
6
+ const mercurQuery = async (url, {
7
+ method,
8
+ body,
9
+ query,
10
+ headers
11
+ }) => {
12
+ const bearer = await window.localStorage.getItem("medusa_auth_token") || "";
13
+ const params = Object.entries(query || {}).reduce(
14
+ (acc, [key, value], index) => {
15
+ if (value && value !== void 0) {
16
+ const queryLength = Object.values(query || {}).filter(
17
+ (i) => i && i !== void 0
18
+ ).length;
19
+ acc += `${key}=${value}${index + 1 <= queryLength ? "&" : ""}`;
20
+ }
21
+ return acc;
22
+ },
23
+ ""
24
+ );
25
+ const response = await fetch(`${url}${params && `?${params}`}`, {
26
+ method,
27
+ headers: {
28
+ authorization: `Bearer ${bearer}`,
29
+ "Content-Type": "application/json",
30
+ ...headers
31
+ },
32
+ body: body ? JSON.stringify(body) : null
33
+ });
34
+ if (!response.ok) {
35
+ const errorData = await response.json();
36
+ throw new Error(errorData.message || "Nieznany błąd serwera");
37
+ }
38
+ return response.json();
39
+ };
40
+ const useSyncAlgolia = () => {
41
+ return reactQuery.useMutation({
42
+ mutationFn: () => mercurQuery("/admin/algolia", {
43
+ method: "POST"
44
+ })
45
+ });
46
+ };
47
+ const useAlgolia = () => {
48
+ return reactQuery.useQuery({
49
+ queryKey: ["algolia"],
50
+ queryFn: () => mercurQuery("/admin/algolia", { method: "GET" })
51
+ });
52
+ };
53
+ const AlgoliaSearchEnginePage = () => {
54
+ const { data: algolia } = useAlgolia();
55
+ const { mutateAsync: triggerSynchronization } = useSyncAlgolia();
56
+ const handleTriggerSynchronization = async () => {
57
+ try {
58
+ await triggerSynchronization();
59
+ ui.toast.success("Synchronization triggered!");
60
+ } catch {
61
+ ui.toast.error("Error!");
62
+ }
63
+ };
64
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { children: [
65
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
66
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
67
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Algolia Search Engine" }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", size: "small", children: "Check Algolia Search Engine status" })
69
+ ] }),
70
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: handleTriggerSynchronization, children: "Trigger Synchronization" })
71
+ ] }),
72
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Table, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Body, { children: [
73
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
74
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: "Application ID" }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: algolia == null ? void 0 : algolia.appId })
76
+ ] }),
77
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
78
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: "ProductIndex" }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: (algolia == null ? void 0 : algolia.productIndex) ? /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: "green", children: "Exists" }) : /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: "red", children: "Doesn't exist" }) })
80
+ ] })
81
+ ] }) })
82
+ ] });
83
+ };
84
+ const config = adminSdk.defineRouteConfig({
85
+ label: "Algolia Search Engine"
86
+ });
87
+ const widgetModule = { widgets: [] };
88
+ const routeModule = {
89
+ routes: [
90
+ {
91
+ Component: AlgoliaSearchEnginePage,
92
+ path: "/algolia"
93
+ }
94
+ ]
95
+ };
96
+ const menuItemModule = {
97
+ menuItems: [
98
+ {
99
+ label: config.label,
100
+ icon: void 0,
101
+ path: "/algolia",
102
+ nested: void 0
103
+ }
104
+ ]
105
+ };
106
+ const formModule = { customFields: {} };
107
+ const displayModule = {
108
+ displays: {}
109
+ };
110
+ const plugin = {
111
+ widgetModule,
112
+ routeModule,
113
+ menuItemModule,
114
+ formModule,
115
+ displayModule
116
+ };
117
+ module.exports = plugin;
@@ -0,0 +1,118 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { defineRouteConfig } from "@medusajs/admin-sdk";
3
+ import { Container, Heading, Text, Button, Table, StatusBadge, toast } from "@medusajs/ui";
4
+ import { useQuery, useMutation } from "@tanstack/react-query";
5
+ const mercurQuery = async (url, {
6
+ method,
7
+ body,
8
+ query,
9
+ headers
10
+ }) => {
11
+ const bearer = await window.localStorage.getItem("medusa_auth_token") || "";
12
+ const params = Object.entries(query || {}).reduce(
13
+ (acc, [key, value], index) => {
14
+ if (value && value !== void 0) {
15
+ const queryLength = Object.values(query || {}).filter(
16
+ (i) => i && i !== void 0
17
+ ).length;
18
+ acc += `${key}=${value}${index + 1 <= queryLength ? "&" : ""}`;
19
+ }
20
+ return acc;
21
+ },
22
+ ""
23
+ );
24
+ const response = await fetch(`${url}${params && `?${params}`}`, {
25
+ method,
26
+ headers: {
27
+ authorization: `Bearer ${bearer}`,
28
+ "Content-Type": "application/json",
29
+ ...headers
30
+ },
31
+ body: body ? JSON.stringify(body) : null
32
+ });
33
+ if (!response.ok) {
34
+ const errorData = await response.json();
35
+ throw new Error(errorData.message || "Nieznany błąd serwera");
36
+ }
37
+ return response.json();
38
+ };
39
+ const useSyncAlgolia = () => {
40
+ return useMutation({
41
+ mutationFn: () => mercurQuery("/admin/algolia", {
42
+ method: "POST"
43
+ })
44
+ });
45
+ };
46
+ const useAlgolia = () => {
47
+ return useQuery({
48
+ queryKey: ["algolia"],
49
+ queryFn: () => mercurQuery("/admin/algolia", { method: "GET" })
50
+ });
51
+ };
52
+ const AlgoliaSearchEnginePage = () => {
53
+ const { data: algolia } = useAlgolia();
54
+ const { mutateAsync: triggerSynchronization } = useSyncAlgolia();
55
+ const handleTriggerSynchronization = async () => {
56
+ try {
57
+ await triggerSynchronization();
58
+ toast.success("Synchronization triggered!");
59
+ } catch {
60
+ toast.error("Error!");
61
+ }
62
+ };
63
+ return /* @__PURE__ */ jsxs(Container, { children: [
64
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
65
+ /* @__PURE__ */ jsxs("div", { children: [
66
+ /* @__PURE__ */ jsx(Heading, { children: "Algolia Search Engine" }),
67
+ /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", size: "small", children: "Check Algolia Search Engine status" })
68
+ ] }),
69
+ /* @__PURE__ */ jsx(Button, { onClick: handleTriggerSynchronization, children: "Trigger Synchronization" })
70
+ ] }),
71
+ /* @__PURE__ */ jsx(Table, { children: /* @__PURE__ */ jsxs(Table.Body, { children: [
72
+ /* @__PURE__ */ jsxs(Table.Row, { children: [
73
+ /* @__PURE__ */ jsx(Table.Cell, { children: "Application ID" }),
74
+ /* @__PURE__ */ jsx(Table.Cell, { children: algolia == null ? void 0 : algolia.appId })
75
+ ] }),
76
+ /* @__PURE__ */ jsxs(Table.Row, { children: [
77
+ /* @__PURE__ */ jsx(Table.Cell, { children: "ProductIndex" }),
78
+ /* @__PURE__ */ jsx(Table.Cell, { children: (algolia == null ? void 0 : algolia.productIndex) ? /* @__PURE__ */ jsx(StatusBadge, { color: "green", children: "Exists" }) : /* @__PURE__ */ jsx(StatusBadge, { color: "red", children: "Doesn't exist" }) })
79
+ ] })
80
+ ] }) })
81
+ ] });
82
+ };
83
+ const config = defineRouteConfig({
84
+ label: "Algolia Search Engine"
85
+ });
86
+ const widgetModule = { widgets: [] };
87
+ const routeModule = {
88
+ routes: [
89
+ {
90
+ Component: AlgoliaSearchEnginePage,
91
+ path: "/algolia"
92
+ }
93
+ ]
94
+ };
95
+ const menuItemModule = {
96
+ menuItems: [
97
+ {
98
+ label: config.label,
99
+ icon: void 0,
100
+ path: "/algolia",
101
+ nested: void 0
102
+ }
103
+ ]
104
+ };
105
+ const formModule = { customFields: {} };
106
+ const displayModule = {
107
+ displays: {}
108
+ };
109
+ const plugin = {
110
+ widgetModule,
111
+ routeModule,
112
+ menuItemModule,
113
+ formModule,
114
+ displayModule
115
+ };
116
+ export {
117
+ plugin as default
118
+ };
@@ -0,0 +1,61 @@
1
+ import { MedusaRequest, MedusaResponse } from "@medusajs/framework";
2
+ /**
3
+ * @oas [post] /admin/algolia
4
+ * operationId: "AdminSyncAlgolia"
5
+ * summary: "Sync Algolia"
6
+ * description: "Initiates a synchronization process for Algolia indices."
7
+ * x-authenticated: true
8
+ * responses:
9
+ * "200":
10
+ * description: OK
11
+ * content:
12
+ * application/json:
13
+ * schema:
14
+ * type: object
15
+ * properties:
16
+ * message:
17
+ * type: string
18
+ * description: Confirmation message that sync is in progress
19
+ * example: "Sync in progress"
20
+ * tags:
21
+ * - Admin Algolia
22
+ * security:
23
+ * - api_token: []
24
+ * - cookie_auth: []
25
+ */
26
+ export declare const POST: (req: MedusaRequest, res: MedusaResponse) => Promise<void>;
27
+ /**
28
+ * @oas [get] /admin/algolia
29
+ * operationId: "AdminGetAlgoliaStatus"
30
+ * summary: "Get Algolia Status"
31
+ * description: "Retrieves the current status of Algolia configuration and product index."
32
+ * x-authenticated: true
33
+ * responses:
34
+ * "200":
35
+ * description: OK
36
+ * content:
37
+ * application/json:
38
+ * schema:
39
+ * type: object
40
+ * properties:
41
+ * appId:
42
+ * type: string
43
+ * description: The Algolia application ID
44
+ * example: "YOUR_ALGOLIA_APP_ID"
45
+ * productIndex:
46
+ * type: object
47
+ * description: The status of the product index
48
+ * properties:
49
+ * exists:
50
+ * type: boolean
51
+ * description: Whether the product index exists
52
+ * name:
53
+ * type: string
54
+ * description: The name of the product index
55
+ * tags:
56
+ * - Admin Algolia
57
+ * security:
58
+ * - api_token: []
59
+ * - cookie_auth: []
60
+ */
61
+ export declare const GET: (req: MedusaRequest, res: MedusaResponse) => Promise<void>;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = exports.POST = void 0;
4
+ const algolia_1 = require("../../../modules/algolia");
5
+ const framework_1 = require("@mercurjs/framework");
6
+ const sync_algolia_1 = require("../../../workflows/algolia/workflows/sync-algolia");
7
+ /**
8
+ * @oas [post] /admin/algolia
9
+ * operationId: "AdminSyncAlgolia"
10
+ * summary: "Sync Algolia"
11
+ * description: "Initiates a synchronization process for Algolia indices."
12
+ * x-authenticated: true
13
+ * responses:
14
+ * "200":
15
+ * description: OK
16
+ * content:
17
+ * application/json:
18
+ * schema:
19
+ * type: object
20
+ * properties:
21
+ * message:
22
+ * type: string
23
+ * description: Confirmation message that sync is in progress
24
+ * example: "Sync in progress"
25
+ * tags:
26
+ * - Admin Algolia
27
+ * security:
28
+ * - api_token: []
29
+ * - cookie_auth: []
30
+ */
31
+ const POST = async (req, res) => {
32
+ await sync_algolia_1.syncAlgoliaWorkflow.run({
33
+ container: req.scope,
34
+ });
35
+ res.status(200).json({ message: "Sync in progress" });
36
+ };
37
+ exports.POST = POST;
38
+ /**
39
+ * @oas [get] /admin/algolia
40
+ * operationId: "AdminGetAlgoliaStatus"
41
+ * summary: "Get Algolia Status"
42
+ * description: "Retrieves the current status of Algolia configuration and product index."
43
+ * x-authenticated: true
44
+ * responses:
45
+ * "200":
46
+ * description: OK
47
+ * content:
48
+ * application/json:
49
+ * schema:
50
+ * type: object
51
+ * properties:
52
+ * appId:
53
+ * type: string
54
+ * description: The Algolia application ID
55
+ * example: "YOUR_ALGOLIA_APP_ID"
56
+ * productIndex:
57
+ * type: object
58
+ * description: The status of the product index
59
+ * properties:
60
+ * exists:
61
+ * type: boolean
62
+ * description: Whether the product index exists
63
+ * name:
64
+ * type: string
65
+ * description: The name of the product index
66
+ * tags:
67
+ * - Admin Algolia
68
+ * security:
69
+ * - api_token: []
70
+ * - cookie_auth: []
71
+ */
72
+ const GET = async (req, res) => {
73
+ const algoliaService = req.scope.resolve(algolia_1.ALGOLIA_MODULE);
74
+ const appId = algoliaService.getAppId();
75
+ const productIndex = await algoliaService.checkIndex(framework_1.IndexType.PRODUCT);
76
+ res.status(200).json({ appId, productIndex });
77
+ };
78
+ exports.GET = GET;
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FsZ29saWEvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsc0RBQWdGO0FBQ2hGLG1EQUFnRDtBQUVoRCxvRkFBd0Y7QUFFeEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sa0NBQW1CLENBQUMsR0FBRyxDQUFDO1FBQzVCLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSztLQUNyQixDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBTlcsUUFBQSxJQUFJLFFBTWY7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sY0FBYyxHQUNsQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFDO0lBRTFELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QyxNQUFNLFlBQVksR0FBRyxNQUFNLGNBQWMsQ0FBQyxVQUFVLENBQUMscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQVBXLFFBQUEsR0FBRyxPQU9kIn0=
@@ -0,0 +1,8 @@
1
+ import AlgoliaModuleService from "./service";
2
+ export declare const ALGOLIA_MODULE = "algolia";
3
+ export { AlgoliaModuleService };
4
+ export { defaultProductSettings, defaultReviewSettings } from "./service";
5
+ declare const _default: import("@medusajs/types").ModuleExports<typeof AlgoliaModuleService> & {
6
+ linkable: Record<string, any>;
7
+ };
8
+ export default _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultReviewSettings = exports.defaultProductSettings = exports.AlgoliaModuleService = exports.ALGOLIA_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.AlgoliaModuleService = service_1.default;
10
+ exports.ALGOLIA_MODULE = "algolia";
11
+ var service_2 = require("./service");
12
+ Object.defineProperty(exports, "defaultProductSettings", { enumerable: true, get: function () { return service_2.defaultProductSettings; } });
13
+ Object.defineProperty(exports, "defaultReviewSettings", { enumerable: true, get: function () { return service_2.defaultReviewSettings; } });
14
+ exports.default = (0, utils_1.Module)(exports.ALGOLIA_MODULE, {
15
+ service: service_1.default,
16
+ });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hbGdvbGlhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFtRDtBQUVuRCx3REFBNkM7QUFHcEMsK0JBSEYsaUJBQW9CLENBR0U7QUFEaEIsUUFBQSxjQUFjLEdBQUcsU0FBUyxDQUFDO0FBRXhDLHFDQUEwRTtBQUFqRSxpSEFBQSxzQkFBc0IsT0FBQTtBQUFFLGdIQUFBLHFCQUFxQixPQUFBO0FBRXRELGtCQUFlLElBQUEsY0FBTSxFQUFDLHNCQUFjLEVBQUU7SUFDcEMsT0FBTyxFQUFFLGlCQUFvQjtDQUM5QixDQUFDLENBQUMifQ==
@@ -0,0 +1,25 @@
1
+ import { IndexSettings } from "algoliasearch";
2
+ import { IndexType, AlgoliaEntity } from "@mercurjs/framework";
3
+ type ModuleOptions = {
4
+ appId: string;
5
+ apiKey: string;
6
+ };
7
+ export declare const defaultProductSettings: IndexSettings;
8
+ export declare const defaultReviewSettings: IndexSettings;
9
+ declare class AlgoliaModuleService {
10
+ private options_;
11
+ private algolia_;
12
+ constructor(_: any, options: ModuleOptions);
13
+ getAppId(): string;
14
+ checkIndex(index: IndexType): Promise<boolean>;
15
+ updateSettings(index: IndexType, settings: IndexSettings): Promise<import("algoliasearch").UpdatedAtResponse>;
16
+ batch(type: IndexType, toAdd: AlgoliaEntity[], toDelete: string[]): Promise<import("algoliasearch").BatchResponse>;
17
+ batchUpsert(type: IndexType, entities: AlgoliaEntity[]): Promise<import("algoliasearch").BatchResponse>;
18
+ batchDelete(type: IndexType, ids: string[]): Promise<import("algoliasearch").BatchResponse>;
19
+ upsert(type: IndexType, entity: AlgoliaEntity): Promise<import("algoliasearch").UpdatedAtWithObjectIdResponse>;
20
+ delete(type: IndexType, id: string): Promise<import("algoliasearch").DeletedAtResponse>;
21
+ partialUpdate(type: IndexType, entity: Partial<AlgoliaEntity> & {
22
+ id: string;
23
+ }): Promise<import("algoliasearch").UpdatedAtWithObjectIdResponse>;
24
+ }
25
+ export default AlgoliaModuleService;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultReviewSettings = exports.defaultProductSettings = void 0;
4
+ const algoliasearch_1 = require("algoliasearch");
5
+ exports.defaultProductSettings = {
6
+ searchableAttributes: [
7
+ "title",
8
+ "subtitle",
9
+ "tags.value",
10
+ "type.value",
11
+ "categories.name",
12
+ "collection.title",
13
+ "variants.title",
14
+ ],
15
+ };
16
+ exports.defaultReviewSettings = {
17
+ attributesForFaceting: ["filterOnly(reference_id)", "filterOnly(reference)"],
18
+ };
19
+ class AlgoliaModuleService {
20
+ constructor(_, options) {
21
+ this.options_ = options;
22
+ this.algolia_ = (0, algoliasearch_1.algoliasearch)(this.options_.appId, this.options_.apiKey);
23
+ }
24
+ getAppId() {
25
+ return this.options_.appId;
26
+ }
27
+ checkIndex(index) {
28
+ return this.algolia_.indexExists({
29
+ indexName: index,
30
+ });
31
+ }
32
+ updateSettings(index, settings) {
33
+ return this.algolia_.setSettings({
34
+ indexName: index,
35
+ indexSettings: settings,
36
+ });
37
+ }
38
+ batch(type, toAdd, toDelete) {
39
+ const requests = toAdd.map((entity) => {
40
+ return {
41
+ action: "addObject",
42
+ objectID: entity.id,
43
+ body: entity,
44
+ };
45
+ });
46
+ requests.concat(toDelete.map((id) => {
47
+ return {
48
+ action: "deleteObject",
49
+ objectID: id,
50
+ body: {},
51
+ };
52
+ }));
53
+ return this.algolia_.batch({
54
+ indexName: type,
55
+ batchWriteParams: {
56
+ requests,
57
+ },
58
+ });
59
+ }
60
+ batchUpsert(type, entities) {
61
+ return this.algolia_.batch({
62
+ indexName: type,
63
+ batchWriteParams: {
64
+ requests: entities.map((entity) => {
65
+ return {
66
+ action: "addObject",
67
+ objectID: entity.id,
68
+ body: entity,
69
+ };
70
+ }),
71
+ },
72
+ });
73
+ }
74
+ batchDelete(type, ids) {
75
+ return this.algolia_.batch({
76
+ indexName: type,
77
+ batchWriteParams: {
78
+ requests: ids.map((id) => {
79
+ return {
80
+ action: "deleteObject",
81
+ objectID: id,
82
+ body: {},
83
+ };
84
+ }),
85
+ },
86
+ });
87
+ }
88
+ upsert(type, entity) {
89
+ return this.algolia_.addOrUpdateObject({
90
+ indexName: type,
91
+ objectID: entity.id,
92
+ body: entity,
93
+ });
94
+ }
95
+ delete(type, id) {
96
+ return this.algolia_.deleteObject({
97
+ indexName: type,
98
+ objectID: id,
99
+ });
100
+ }
101
+ partialUpdate(type, entity) {
102
+ return this.algolia_.partialUpdateObject({
103
+ indexName: type,
104
+ objectID: entity.id,
105
+ attributesToUpdate: { ...entity },
106
+ });
107
+ }
108
+ }
109
+ exports.default = AlgoliaModuleService;
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FsZ29saWEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFNdUI7QUFRVixRQUFBLHNCQUFzQixHQUFrQjtJQUNuRCxvQkFBb0IsRUFBRTtRQUNwQixPQUFPO1FBQ1AsVUFBVTtRQUNWLFlBQVk7UUFDWixZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGtCQUFrQjtRQUNsQixnQkFBZ0I7S0FDakI7Q0FDRixDQUFDO0FBRVcsUUFBQSxxQkFBcUIsR0FBa0I7SUFDbEQscUJBQXFCLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSx1QkFBdUIsQ0FBQztDQUM3RSxDQUFDO0FBRUYsTUFBTSxvQkFBb0I7SUFJeEIsWUFBWSxDQUFDLEVBQUUsT0FBc0I7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFBLDZCQUFhLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBZ0IsRUFBRSxRQUF1QjtRQUN0RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLGFBQWEsRUFBRSxRQUFRO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZSxFQUFFLEtB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
@@ -0,0 +1,5 @@
1
+ import { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
2
+ export default function algoliaProductsChangedHandler({ event, container, }: SubscriberArgs<{
3
+ ids: string[];
4
+ }>): Promise<void>;
5
+ export declare const config: SubscriberConfig;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = algoliaProductsChangedHandler;
5
+ const algolia_1 = require("../modules/algolia");
6
+ const framework_1 = require("@mercurjs/framework");
7
+ const utils_1 = require("../subscribers/utils");
8
+ async function algoliaProductsChangedHandler({ event, container, }) {
9
+ const algolia = container.resolve(algolia_1.ALGOLIA_MODULE);
10
+ const { published, other } = await (0, utils_1.filterProductsByStatus)(container, event.data.ids);
11
+ const productsToInsert = published.length
12
+ ? await (0, utils_1.findAndTransformAlgoliaProducts)(container, published)
13
+ : [];
14
+ await algolia.batch(framework_1.IndexType.PRODUCT, productsToInsert, other);
15
+ }
16
+ exports.config = {
17
+ event: framework_1.AlgoliaEvents.PRODUCTS_CHANGED,
18
+ context: {
19
+ subscriberId: "algolia-products-changed-handler",
20
+ },
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0cy1jaGFuZ2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2FsZ29saWEtcHJvZHVjdHMtY2hhbmdlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxnREFnQkM7QUF4QkQsZ0RBQTBFO0FBQzFFLG1EQUErRDtBQUUvRCxnREFHOEI7QUFFZixLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFDMUQsS0FBSyxFQUNMLFNBQVMsR0FDeUI7SUFDbEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFDO0lBRXhFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFBLDhCQUFzQixFQUN2RCxTQUFTLEVBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2YsQ0FBQztJQUVGLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE1BQU07UUFDdkMsQ0FBQyxDQUFDLE1BQU0sSUFBQSx1Q0FBK0IsRUFBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQzdELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFUCxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQVMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUseUJBQWEsQ0FBQyxnQkFBZ0I7SUFDckMsT0FBTyxFQUFFO1FBQ1AsWUFBWSxFQUFFLGtDQUFrQztLQUNqRDtDQUNGLENBQUMifQ==
@@ -0,0 +1,5 @@
1
+ import { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
2
+ export default function algoliaProductsDeletedHandler({ event, container, }: SubscriberArgs<{
3
+ ids: string[];
4
+ }>): Promise<void>;
5
+ export declare const config: SubscriberConfig;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = algoliaProductsDeletedHandler;
5
+ const algolia_1 = require("../modules/algolia");
6
+ const framework_1 = require("@mercurjs/framework");
7
+ async function algoliaProductsDeletedHandler({ event, container, }) {
8
+ const algolia = container.resolve(algolia_1.ALGOLIA_MODULE);
9
+ await algolia.batchDelete(framework_1.IndexType.PRODUCT, event.data.ids);
10
+ }
11
+ exports.config = {
12
+ event: framework_1.AlgoliaEvents.PRODUCTS_DELETED,
13
+ context: {
14
+ subscriberId: "algolia-products-deleted-handler",
15
+ },
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0cy1kZWxldGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2FsZ29saWEtcHJvZHVjdHMtZGVsZXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxnREFPQztBQVZELGdEQUEwRTtBQUMxRSxtREFBK0Q7QUFFaEQsS0FBSyxVQUFVLDZCQUE2QixDQUFDLEVBQzFELEtBQUssRUFDTCxTQUFTLEdBQ3lCO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXVCLHdCQUFjLENBQUMsQ0FBQztJQUV4RSxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx5QkFBYSxDQUFDLGdCQUFnQjtJQUNyQyxPQUFPLEVBQUU7UUFDUCxZQUFZLEVBQUUsa0NBQWtDO0tBQ2pEO0NBQ0YsQ0FBQyJ9
@@ -0,0 +1,58 @@
1
+ import { MedusaContainer } from "@medusajs/framework";
2
+ export declare function filterProductsByStatus(container: MedusaContainer, ids?: string[]): Promise<{
3
+ published: any[];
4
+ other: any[];
5
+ }>;
6
+ export declare function findAndTransformAlgoliaProducts(container: MedusaContainer, ids?: string[]): Promise<{
7
+ id: string;
8
+ description: string | null;
9
+ handle: string;
10
+ seller: {
11
+ id: string;
12
+ handle?: string | null | undefined;
13
+ store_status?: import("@mercurjs/framework").StoreStatus | null | undefined;
14
+ } | null;
15
+ title: string;
16
+ subtitle: string | null;
17
+ thumbnail: string | null;
18
+ average_rating: number | null;
19
+ options: Record<string, string>[] | null;
20
+ supported_countries: string[] | null;
21
+ images?: {
22
+ id: string;
23
+ rank: number;
24
+ url: string;
25
+ }[] | null | undefined;
26
+ collection?: {
27
+ title: string;
28
+ } | null | undefined;
29
+ type?: {
30
+ value: string;
31
+ } | null | undefined;
32
+ tags?: {
33
+ value: string;
34
+ }[] | undefined;
35
+ categories?: {
36
+ id: string;
37
+ name: string;
38
+ }[] | undefined;
39
+ variants?: any;
40
+ attribute_values?: {
41
+ name: string;
42
+ value: string;
43
+ is_filterable: boolean;
44
+ ui_component: string;
45
+ }[] | undefined;
46
+ sku?: string | null | undefined;
47
+ ean?: string | null | undefined;
48
+ upc?: string | null | undefined;
49
+ barcode?: string | null | undefined;
50
+ hs_code?: string | null | undefined;
51
+ mid_code?: string | null | undefined;
52
+ weight?: number | null | undefined;
53
+ length?: number | null | undefined;
54
+ height?: number | null | undefined;
55
+ width?: number | null | undefined;
56
+ origin_country?: string | null | undefined;
57
+ material?: string | null | undefined;
58
+ }[]>;
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterProductsByStatus = filterProductsByStatus;
4
+ exports.findAndTransformAlgoliaProducts = findAndTransformAlgoliaProducts;
5
+ const zod_1 = require("zod");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const framework_1 = require("@mercurjs/framework");
8
+ async function selectProductVariantsSupportedCountries(container, product_id) {
9
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
10
+ const { data: variants } = await query.graph({
11
+ entity: "product_variant",
12
+ fields: ["inventory_items.inventory.location_levels.location_id"],
13
+ filters: {
14
+ product_id,
15
+ },
16
+ });
17
+ let location_ids = [];
18
+ for (const variant of variants) {
19
+ const inventory_items = variant.inventory_items?.map((item) => item.inventory) || [];
20
+ const locations = inventory_items
21
+ .flatMap((inventory_item) => inventory_item.location_levels || [])
22
+ .map((level) => level.location_id);
23
+ location_ids = location_ids.concat(locations);
24
+ }
25
+ const { data: stock_locations } = await query.graph({
26
+ entity: "stock_location",
27
+ fields: ["fulfillment_sets.service_zones.geo_zones.country_code"],
28
+ filters: {
29
+ id: location_ids,
30
+ },
31
+ });
32
+ let country_codes = [];
33
+ for (const location of stock_locations) {
34
+ const fulfillmentSets = location.fulfillment_sets?.flatMap((set) => set.service_zones || []) ||
35
+ [];
36
+ const codes = fulfillmentSets
37
+ .flatMap((sz) => sz.geo_zones || [])
38
+ .map((gz) => gz.country_code);
39
+ country_codes = country_codes.concat(codes);
40
+ }
41
+ return [...new Set(country_codes)];
42
+ }
43
+ async function selectProductSeller(container, product_id) {
44
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
45
+ const { data: [product], } = await query.graph({
46
+ entity: "product",
47
+ fields: ["seller.id", "seller.handle", "seller.store_status"],
48
+ filters: {
49
+ id: product_id,
50
+ },
51
+ });
52
+ return product && product.seller
53
+ ? {
54
+ id: product.seller.id,
55
+ handle: product.seller.handle,
56
+ store_status: product.seller.store_status,
57
+ }
58
+ : null;
59
+ }
60
+ async function filterProductsByStatus(container, ids = []) {
61
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
62
+ const { data: products } = await query.graph({
63
+ entity: "product",
64
+ fields: ["id", "status"],
65
+ filters: {
66
+ id: ids,
67
+ },
68
+ });
69
+ const published = products.filter((p) => p.status === "published");
70
+ const other = (0, utils_1.arrayDifference)(products, published);
71
+ return {
72
+ published: published.map((p) => p.id),
73
+ other: other.map((p) => p.id),
74
+ };
75
+ }
76
+ async function findAndTransformAlgoliaProducts(container, ids = []) {
77
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
78
+ const { data: products } = await query.graph({
79
+ entity: "product",
80
+ fields: [
81
+ "*",
82
+ "categories.name",
83
+ "categories.id",
84
+ "collection.title ",
85
+ "tags.value",
86
+ "type.value",
87
+ "variants.*",
88
+ "variants.options.*",
89
+ "variants.options.prices.*",
90
+ "variants.prices.*",
91
+ "options.*",
92
+ "options.values.*",
93
+ "images.*",
94
+ "attribute_values.value",
95
+ "attribute_values.attribute.name",
96
+ "attribute_values.attribute.is_filterable",
97
+ "attribute_values.attribute.ui_component",
98
+ ],
99
+ filters: ids.length
100
+ ? {
101
+ id: ids,
102
+ status: "published",
103
+ }
104
+ : { status: "published" },
105
+ });
106
+ for (const product of products) {
107
+ product.average_rating = 0;
108
+ product.supported_countries = await selectProductVariantsSupportedCountries(container, product.id);
109
+ product.seller = await selectProductSeller(container, product.id);
110
+ product.options = product.options
111
+ ?.map((option) => {
112
+ return option.values.map((value) => {
113
+ const entry = {};
114
+ entry[option.title.toLowerCase()] = value.value;
115
+ return entry;
116
+ });
117
+ })
118
+ .flat();
119
+ product.variants = zod_1.z.array(framework_1.AlgoliaVariantValidator).parse(product.variants);
120
+ product.variants = product.variants
121
+ ?.map((variant) => {
122
+ return variant.options?.reduce((entry, item) => {
123
+ entry[item.option.title.toLowerCase()] = item.value;
124
+ return entry;
125
+ }, variant);
126
+ })
127
+ .flat();
128
+ product.attribute_values = product.attribute_values?.map((attribute) => {
129
+ return {
130
+ name: attribute.attribute.name,
131
+ value: attribute.value,
132
+ is_filterable: attribute.attribute.is_filterable,
133
+ ui_component: attribute.attribute.ui_component,
134
+ };
135
+ });
136
+ }
137
+ return zod_1.z.array(framework_1.AlgoliaProductValidator).parse(products);
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3V0aWxzL2FsZ29saWEtcHJvZHVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVGQSx3REFxQkM7QUFFRCwwRUF3RUM7QUF0TEQsNkJBQXdCO0FBR3hCLHFEQUdtQztBQUVuQyxtREFHNkI7QUFFN0IsS0FBSyxVQUFVLHVDQUF1QyxDQUNwRCxTQUEwQixFQUMxQixVQUFrQjtJQUVsQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxpQkFBaUI7UUFDekIsTUFBTSxFQUFFLENBQUMsdURBQXVELENBQUM7UUFDakUsT0FBTyxFQUFFO1lBQ1AsVUFBVTtTQUNYO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLEdBQ25CLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELE1BQU0sU0FBUyxHQUFHLGVBQWU7YUFDOUIsT0FBTyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQzthQUNqRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQyxZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNo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
@@ -0,0 +1,9 @@
1
+ import { MedusaContainer } from '@medusajs/framework';
2
+ export declare function findAndTransformAlgoliaReviews(container: MedusaContainer, ids?: string[]): Promise<{
3
+ id: string;
4
+ reference_id: string;
5
+ reference: string;
6
+ rating: number;
7
+ customer_note: string | null;
8
+ seller_note: string | null;
9
+ }[]>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findAndTransformAlgoliaReviews = findAndTransformAlgoliaReviews;
4
+ const zod_1 = require("zod");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const framework_1 = require("@mercurjs/framework");
7
+ async function findAndTransformAlgoliaReviews(container, ids = []) {
8
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
9
+ const { data: reviews } = await query.graph({
10
+ entity: 'review',
11
+ fields: ['*', 'seller.id', 'product.id'],
12
+ filters: ids.length
13
+ ? {
14
+ id: ids
15
+ }
16
+ : {}
17
+ });
18
+ for (const review of reviews) {
19
+ review.reference_id = review.seller?.id || review.product?.id;
20
+ }
21
+ return zod_1.z.array(framework_1.AlgoliaReviewValidator).parse(reviews);
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1yZXZpZXdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3V0aWxzL2FsZ29saWEtcmV2aWV3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHdFQW9CQztBQTNCRCw2QkFBdUI7QUFHdkIscURBQXFFO0FBRXJFLG1EQUE0RDtBQUVyRCxLQUFLLFVBQVUsOEJBQThCLENBQ2xELFNBQTBCLEVBQzFCLE1BQWdCLEVBQUU7SUFFbEIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQyxNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQztRQUN4QyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDakIsQ0FBQyxDQUFDO2dCQUNFLEVBQUUsRUFBRSxHQUFHO2FBQ1I7WUFDSCxDQUFDLENBQUMsRUFBRTtLQUNQLENBQUMsQ0FBQTtJQUVGLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsT0FBTyxPQUFDLENBQUMsS0FBSyxDQUFDLGtDQUFzQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZELENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ export * from './algolia-product';
2
+ export * from './algolia-reviews';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./algolia-product"), exports);
18
+ __exportStar(require("./algolia-reviews"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFpQztBQUNqQyxvREFBaUMifQ==
@@ -0,0 +1 @@
1
+ export * from './sync-algolia-products';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./sync-algolia-products"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FsZ29saWEvc3RlcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBEQUF1QyJ9
@@ -0,0 +1 @@
1
+ export declare const syncAlgoliaProductsStep: import("@medusajs/framework/workflows-sdk").StepFunction<void, unknown>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncAlgoliaProductsStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const algolia_1 = require("../../../modules/algolia");
7
+ const framework_1 = require("@mercurjs/framework");
8
+ const CHUNK_SIZE = 100;
9
+ exports.syncAlgoliaProductsStep = (0, workflows_sdk_1.createStep)("sync-algolia-products", async (_, { container }) => {
10
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
11
+ const algolia = container.resolve(algolia_1.ALGOLIA_MODULE);
12
+ const { data: productsToDelete } = await query.graph({
13
+ entity: "product",
14
+ filters: {
15
+ $or: [
16
+ {
17
+ deleted_at: {
18
+ $ne: null,
19
+ },
20
+ },
21
+ {
22
+ status: {
23
+ $ne: "published",
24
+ },
25
+ },
26
+ ],
27
+ },
28
+ fields: ["id"],
29
+ });
30
+ await algolia.batchDelete(framework_1.IndexType.PRODUCT, productsToDelete.map((p) => p.id));
31
+ const { data: publishedProducts } = await query.graph({
32
+ entity: "product",
33
+ filters: {
34
+ status: "published",
35
+ },
36
+ fields: ["id"],
37
+ });
38
+ const productsToInsert = publishedProducts.map((p) => p.id);
39
+ const productChunks = [];
40
+ for (let i = 0; i < productsToInsert.length; i += CHUNK_SIZE) {
41
+ productChunks.push(productsToInsert.slice(i, i + CHUNK_SIZE));
42
+ }
43
+ const eventBus = container.resolve(utils_1.Modules.EVENT_BUS);
44
+ for (const chunk of productChunks) {
45
+ await eventBus.emit({
46
+ name: framework_1.AlgoliaEvents.PRODUCTS_CHANGED,
47
+ data: {
48
+ ids: chunk,
49
+ },
50
+ });
51
+ }
52
+ return new workflows_sdk_1.StepResponse();
53
+ });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hbGdvbGlhLXByb2R1Y3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hbGdvbGlhL3N0ZXBzL3N5bmMtYWxnb2xpYS1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBK0U7QUFDL0UscUVBQTZFO0FBRTdFLHNEQUFnRjtBQUNoRixtREFBK0Q7QUFFL0QsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRVYsUUFBQSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQy9DLHVCQUF1QixFQUN2QixLQUFLLEVBQUUsQ0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXVCLHdCQUFjLENBQUMsQ0FBQztJQUV4RSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ25ELE1BQU0sRUFBRSxTQUFTO1FBQ2pCLE9BQU8sRUFBRTtZQUNQLEdBQUcsRUFBRTtnQkFDSDtvQkFDRSxVQUFVLEVBQUU7d0JBQ1YsR0FBRyxFQUFFLElBQUk7cUJBQ1Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsTUFBTSxFQUFFO3dCQUNOLEdBQUcsRUFBRSxXQUFXO3FCQUNqQjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7S0FDZixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQ3ZCLHFCQUFTLENBQUMsT0FBTyxFQUNqQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDbEMsQ0FBQztJQUVGLE1BQU0sRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDcEQsTUFBTSxFQUFFLFNBQVM7UUFDakIsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLFdBQVc7U0FDcEI7UUFDRCxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7S0FDZixDQUFDLENBQUM7SUFFSCxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM3RCxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2xCLElBQUksRUFBRSx5QkFBYSxDQUFDLGdCQUFnQjtZQUNwQyxJQUFJLEVBQUU7Z0JBQ0osR0FBRyxFQUFFLEtBQUs7YUFDWDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksRUFBRSxDQUFDO0FBQzVCLENBQUMsQ0FDRixDQUFDIn0=
@@ -0,0 +1 @@
1
+ export * from './sync-algolia';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./sync-algolia"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2FsZ29saWEvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBOEIifQ==
@@ -0,0 +1 @@
1
+ export declare const syncAlgoliaWorkflow: import("@medusajs/workflows-sdk").ReturnWorkflow<unknown, unknown, []>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncAlgoliaWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/workflows-sdk");
5
+ const steps_1 = require("../steps");
6
+ exports.syncAlgoliaWorkflow = (0, workflows_sdk_1.createWorkflow)('sync-algolia-workflow', function () {
7
+ return new workflows_sdk_1.WorkflowResponse((0, steps_1.syncAlgoliaProductsStep)());
8
+ });
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hbGdvbGlhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hbGdvbGlhL3dvcmtmbG93cy9zeW5jLWFsZ29saWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQTBFO0FBRTFFLG9DQUFrRDtBQUVyQyxRQUFBLG1CQUFtQixHQUFHLElBQUEsOEJBQWMsRUFDL0MsdUJBQXVCLEVBQ3ZCO0lBQ0UsT0FBTyxJQUFJLGdDQUFnQixDQUFDLElBQUEsK0JBQXVCLEdBQUUsQ0FBQyxDQUFBO0FBQ3hELENBQUMsQ0FDRixDQUFBIn0=
@@ -0,0 +1,2 @@
1
+ export * from "./algolia/steps";
2
+ export * from "./algolia/workflows";
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./algolia/steps"), exports);
18
+ __exportStar(require("./algolia/workflows"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMsc0RBQW9DIn0=
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ ![Mercur Main Cover](https://cdn.prod.website-files.com/6790aeffc4b432ccaf1b56e5/67a225dc6fa298afc1cc4ae6_Mercur%20Cover.png)
2
+
3
+ <div align="center">
4
+ <h1>Mercur <br> Open Source Marketplace Platform</h1>
5
+ <!-- Shields.io Badges -->
6
+ <a href="https://github.com/mercurjs/mercur/tree/main?tab=MIT-1-ov-file">
7
+ <img alt="License" src="https://img.shields.io/badge/license-MIT-blue.svg" />
8
+ </a>
9
+ <a href="#">
10
+ <img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" />
11
+ </a>
12
+ <a href="https://rigbyjs.com/#contact">
13
+ <img alt="Support" src="https://img.shields.io/badge/support-contact%20author-blueviolet.svg" />
14
+ </a>
15
+ <p>
16
+ <a href="https://mercurjs.com/">Mercur</a> | <a href="https://docs.mercurjs.com/">Docs</a>
17
+ </p>
18
+ </div>
19
+
20
+ # @mercurjs/algolia
21
+
22
+ This package is a part of MercurJS! Check our <a href="https://github.com/mercurjs/mercur">Github</a> for more information!
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@mercurjs/algolia",
3
+ "version": "1.3.0",
4
+ "author": "MercurJS <hello@mercurjs.com> (https://mercurjs.com)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/mercurjs/mercur"
8
+ },
9
+ "license": "MIT",
10
+ "keywords": [
11
+ "mercur",
12
+ "marketplace",
13
+ "medusajs",
14
+ "mercurjs"
15
+ ],
16
+ "files": [
17
+ ".medusa/server"
18
+ ],
19
+ "exports": {
20
+ "./package.json": "./package.json",
21
+ "./workflows": "./.medusa/server/src/workflows/index.js",
22
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
23
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
24
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
25
+ "./admin": {
26
+ "import": "./.medusa/server/src/admin/index.mjs",
27
+ "require": "./.medusa/server/src/admin/index.js",
28
+ "default": "./.medusa/server/src/admin/index.js"
29
+ },
30
+ "./*": "./.medusa/server/src/*.js"
31
+ },
32
+ "scripts": {
33
+ "build": "medusa plugin:build",
34
+ "dev": "medusa plugin:develop",
35
+ "prepublishOnly": "medusa plugin:build"
36
+ },
37
+ "devDependencies": {
38
+ "@medusajs/admin-sdk": "2.8.6",
39
+ "@medusajs/cli": "2.8.6",
40
+ "@medusajs/framework": "2.8.6",
41
+ "@medusajs/icons": "2.8.6",
42
+ "@medusajs/medusa": "2.8.6",
43
+ "@medusajs/test-utils": "2.8.6",
44
+ "@medusajs/ui": "4.0.4",
45
+ "@mercurjs/framework": "*",
46
+ "@mikro-orm/cli": "6.4.3",
47
+ "@mikro-orm/core": "6.4.3",
48
+ "@mikro-orm/knex": "6.4.3",
49
+ "@mikro-orm/migrations": "6.4.3",
50
+ "@mikro-orm/postgresql": "6.4.3",
51
+ "@swc/core": "1.5.7",
52
+ "@types/node": "^20.0.0",
53
+ "@types/react": "^18.3.2",
54
+ "@types/react-dom": "^18.2.25",
55
+ "awilix": "^8.0.1",
56
+ "pg": "^8.13.0",
57
+ "prop-types": "^15.8.1",
58
+ "react": "^18.2.0",
59
+ "react-dom": "^18.2.0",
60
+ "ts-node": "^10.9.2",
61
+ "typescript": "^5.6.2",
62
+ "vite": "^5.2.11",
63
+ "yalc": "^1.0.0-pre.53"
64
+ },
65
+ "peerDependencies": {
66
+ "@medusajs/admin-sdk": "2.8.6",
67
+ "@medusajs/cli": "2.8.6",
68
+ "@medusajs/framework": "2.8.6",
69
+ "@medusajs/icons": "2.8.6",
70
+ "@medusajs/medusa": "2.8.6",
71
+ "@medusajs/test-utils": "2.8.6",
72
+ "@medusajs/ui": "4.0.3",
73
+ "@mercurjs/framework": "*",
74
+ "@mikro-orm/cli": "6.4.3",
75
+ "@mikro-orm/core": "6.4.3",
76
+ "@mikro-orm/knex": "6.4.3",
77
+ "@mikro-orm/migrations": "6.4.3",
78
+ "@mikro-orm/postgresql": "6.4.3",
79
+ "awilix": "^8.0.1",
80
+ "pg": "^8.13.0"
81
+ },
82
+ "engines": {
83
+ "node": ">=20"
84
+ },
85
+ "dependencies": {
86
+ "algoliasearch": "^5.40.0"
87
+ }
88
+ }