bananas-commerce-admin 0.20.2 → 0.20.3

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.
@@ -0,0 +1,98 @@
1
+ import React from "react";
2
+ import { TableBody, TableHead, TableRow } from "@mui/material";
3
+ import Box from "@mui/material/Box";
4
+ import ImageList from "@mui/material/ImageList";
5
+ import ImageListItem from "@mui/material/ImageListItem";
6
+ import ImageListItemBar from "@mui/material/ImageListItemBar";
7
+ import Modal from "@mui/material/Modal";
8
+ import Card from "../../../components/Card";
9
+ import CardContent from "../../../components/Card/CardContent";
10
+ import CardFieldText from "../../../components/Card/CardFieldText";
11
+ import CardHeader from "../../../components/Card/CardHeader";
12
+ import CardRow from "../../../components/Card/CardRow";
13
+ import Table from "../../../components/Table";
14
+ import { TableCell } from "../../../components/Table/TableCell";
15
+ import TableHeading from "../../../components/Table/TableHeading";
16
+ import { useI18n } from "../../../contexts/I18nContext";
17
+ import { capitalize } from "../../../util";
18
+ const ArticleProductCard = ({ data, params }) => {
19
+ const { t } = useI18n();
20
+ const [selectedAsset, setSelectedAsset] = React.useState(null);
21
+ const { code: articleCode } = params;
22
+ const { product, assets } = data;
23
+ const articleAssets = assets.filter((asset) => asset.article_code == articleCode || asset.article_code == "");
24
+ const imageAssets = articleAssets.filter((asset) => asset.asset_type == "image");
25
+ const otherAssets = articleAssets.filter((asset) => asset.asset_type !== "image");
26
+ const productProperties = Object.entries(product.properties);
27
+ return (React.createElement(Card, { columns: 1, isEditable: false },
28
+ React.createElement(CardHeader, { title: "Product" }),
29
+ React.createElement(CardContent, null,
30
+ React.createElement(CardRow, null,
31
+ React.createElement(CardFieldText, { formName: "name", label: t("Name"), required: true, value: product.name })),
32
+ React.createElement(CardRow, null,
33
+ React.createElement(CardFieldText, { formName: "description", label: t("Description"), required: true, value: product.description }))),
34
+ productProperties.length > 0 && (React.createElement(React.Fragment, null,
35
+ React.createElement(CardHeader, { title: t("Properties") }),
36
+ React.createElement(Table, { count: productProperties.length },
37
+ React.createElement(TableBody, { sx: {
38
+ "& .MuiTableRow-root:first-of-type .MuiTableCell-root": (theme) => ({
39
+ borderTop: `1px solid ${theme.palette.divider}`,
40
+ }),
41
+ } }, productProperties
42
+ .sort((a, b) => (a[0] < b[0] ? -1 : 1))
43
+ .map((prop) => (React.createElement(TableRow, { key: prop[0] },
44
+ React.createElement(TableCell, null, capitalize(prop[0])),
45
+ React.createElement(TableCell, { typographyProps: {
46
+ variant: "caption",
47
+ color: "text.secondary",
48
+ } }, prop[1])))))))),
49
+ articleAssets.length > 0 && React.createElement(CardHeader, { title: t("Assets") }),
50
+ imageAssets.length > 0 && (React.createElement(React.Fragment, null,
51
+ React.createElement(Modal, { "aria-describedby": "modal-modal-description", "aria-labelledby": "modal-modal-title", open: selectedAsset !== null, onClose: () => setSelectedAsset(null) },
52
+ React.createElement(Box, { sx: {
53
+ position: "absolute",
54
+ top: "50%",
55
+ left: "50%",
56
+ transform: "translate(-50%, -50%)",
57
+ width: "100vw", // Set explicit width
58
+ height: "100vh", // Set explicit height
59
+ bgcolor: "rgba(0, 0, 0, 0.7)", // Dark overlay background
60
+ boxShadow: 24,
61
+ p: 2, // Reduced padding
62
+ display: "flex",
63
+ justifyContent: "center",
64
+ alignItems: "center",
65
+ overflow: "hidden", // Hide any overflowing content
66
+ outline: "none",
67
+ }, onClick: () => setSelectedAsset(null) }, selectedAsset !== null && (React.createElement("img", { alt: selectedAsset.caption, loading: "lazy", src: selectedAsset.url, style: {
68
+ maxWidth: "100%",
69
+ maxHeight: "100%",
70
+ objectFit: "contain",
71
+ borderRadius: "8px", // Subtle rounded corners for the image
72
+ } })))),
73
+ React.createElement(CardContent, { sx: {
74
+ width: "100%",
75
+ height: 400,
76
+ overflowY: "scroll",
77
+ paddingTop: 0,
78
+ paddingBottom: 0,
79
+ paddingLeft: 3,
80
+ paddingRight: 3,
81
+ } },
82
+ React.createElement(ImageList, { cols: 3, gap: 8, variant: "masonry" }, imageAssets.map((asset) => (React.createElement(ImageListItem, { key: asset.id, onClick: () => setSelectedAsset(asset) },
83
+ React.createElement("img", { alt: asset.caption, loading: "lazy", src: asset.url }),
84
+ React.createElement(ImageListItemBar, { subtitle: asset.caption })))))))),
85
+ otherAssets.length > 0 && (React.createElement(Table, { count: otherAssets.length },
86
+ React.createElement(TableHead, null,
87
+ React.createElement(TableRow, null,
88
+ React.createElement(TableHeading, null, t("Asset ID")),
89
+ React.createElement(TableHeading, { align: "right" }, t("Type")),
90
+ React.createElement(TableHeading, { align: "right" }, t("Caption")))),
91
+ React.createElement(TableBody, { sx: { ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } } }, otherAssets.map((asset) => (React.createElement(TableRow, { key: asset.id, sx: { height: 56 } },
92
+ React.createElement(TableCell, { sx: { py: 0 } },
93
+ React.createElement("a", { href: asset.url, rel: "noreferrer", target: "_blank" }, asset.id)),
94
+ React.createElement(TableCell, { align: "right", sx: { py: 0 } }, asset.asset_type),
95
+ React.createElement(TableCell, { align: "right", sx: { py: 0 } }, asset.caption)))))))));
96
+ };
97
+ export default ArticleProductCard;
98
+ //# sourceMappingURL=ArticleProduct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleProduct.js","sourceRoot":"","sources":["../../../../../src/extensions/pim/contrib/ArticleProduct.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import InventoryOutlinedIcon from "@mui/icons-material/InventoryOutlined";
2
+ export const contrib = {
3
+ catalog: {
4
+ "catalog:article:detail:product": {
5
+ title: "Product",
6
+ icon: InventoryOutlinedIcon,
7
+ component: async () => (await import("./contrib/ArticleProduct")).default,
8
+ predicate: (article) => !!article.product_number,
9
+ variant: "inline",
10
+ },
11
+ },
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/pim/index.tsx"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,uCAAuC,CAAC;AAK1E,MAAM,CAAC,MAAM,OAAO,GAAwC;IAC1D,OAAO,EAAE;QACP,gCAAgC,EAAE;YAChC,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO;YACzE,SAAS,EAAE,CAAC,OAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc;YAC/D,OAAO,EAAE,QAAQ;SAClB;KACF;CACO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contrib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrib.js","sourceRoot":"","sources":["../../../../../src/extensions/pim/types/contrib.ts"],"names":[],"mappings":""}
package/dist/esm/index.js CHANGED
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
66
  export * as inventory from "./extensions/inventory";
67
67
  export * as member from "./extensions/member";
68
+ export * as pim from "./extensions/pim";
68
69
  export * as pos from "./extensions/pos";
69
70
  export * as pricing from "./extensions/pricing";
70
71
  export * as report from "./extensions/report";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,YAAY,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAE7B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ContribComponent } from "../../../types";
2
+ import { ArticleProductResponse } from "../types/contrib";
3
+ declare const ArticleProductCard: ContribComponent<ArticleProductResponse>;
4
+ export default ArticleProductCard;
@@ -0,0 +1,2 @@
1
+ import { ContribComponentMap } from "../../types";
2
+ export declare const contrib: Record<string, ContribComponentMap>;
@@ -0,0 +1,19 @@
1
+ export interface ArticleProduct {
2
+ number: string;
3
+ item_type: string;
4
+ name: string;
5
+ description: string;
6
+ properties: object;
7
+ is_active: boolean;
8
+ }
9
+ export interface ArticleAsset {
10
+ id: string;
11
+ asset_type: string;
12
+ caption: string;
13
+ article_code: string;
14
+ url: string;
15
+ }
16
+ export interface ArticleProductResponse {
17
+ product: ArticleProduct;
18
+ assets: ArticleAsset[];
19
+ }
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
66
  export * as inventory from "./extensions/inventory";
67
67
  export * as member from "./extensions/member";
68
+ export * as pim from "./extensions/pim";
68
69
  export * as pos from "./extensions/pos";
69
70
  export * as pricing from "./extensions/pricing";
70
71
  export * as report from "./extensions/report";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bananas-commerce-admin",
3
- "version": "0.20.2",
3
+ "version": "0.20.3",
4
4
  "description": "What's this, an admin for apes?",
5
5
  "keywords": [
6
6
  "admin",
@@ -12,6 +12,11 @@
12
12
  "bananas-commerce-admin"
13
13
  ],
14
14
  "author": "Elias Sjögreen",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/5m/bananas-commerce.git",
18
+ "directory": "admin/packages/bananas-commerce-admin"
19
+ },
15
20
  "module": "./dist/esm/index.js",
16
21
  "main": "./dist/cjs/index.js",
17
22
  "types": "./dist/types/index.d.ts",
@@ -0,0 +1,191 @@
1
+ import React from "react";
2
+
3
+ import { TableBody, TableHead, TableRow } from "@mui/material";
4
+ import Box from "@mui/material/Box";
5
+ import ImageList from "@mui/material/ImageList";
6
+ import ImageListItem from "@mui/material/ImageListItem";
7
+ import ImageListItemBar from "@mui/material/ImageListItemBar";
8
+ import Modal from "@mui/material/Modal";
9
+
10
+ import Card from "../../../components/Card";
11
+ import CardContent from "../../../components/Card/CardContent";
12
+ import CardFieldText from "../../../components/Card/CardFieldText";
13
+ import CardHeader from "../../../components/Card/CardHeader";
14
+ import CardRow from "../../../components/Card/CardRow";
15
+ import Table from "../../../components/Table";
16
+ import { TableCell } from "../../../components/Table/TableCell";
17
+ import TableHeading from "../../../components/Table/TableHeading";
18
+ import { useI18n } from "../../../contexts/I18nContext";
19
+ import { ContribComponent } from "../../../types";
20
+ import { capitalize } from "../../../util";
21
+ import { ArticleAsset, ArticleProductResponse } from "../types/contrib";
22
+
23
+ const ArticleProductCard: ContribComponent<ArticleProductResponse> = ({ data, params }) => {
24
+ const { t } = useI18n();
25
+ const [selectedAsset, setSelectedAsset] = React.useState<ArticleAsset | null>(null);
26
+
27
+ const { code: articleCode } = params as { code: string };
28
+ const { product, assets } = data;
29
+
30
+ const articleAssets = assets.filter(
31
+ (asset) => asset.article_code == articleCode || asset.article_code == "",
32
+ );
33
+ const imageAssets = articleAssets.filter((asset) => asset.asset_type == "image");
34
+ const otherAssets = articleAssets.filter((asset) => asset.asset_type !== "image");
35
+
36
+ const productProperties = Object.entries(product.properties);
37
+
38
+ return (
39
+ <Card columns={1} isEditable={false}>
40
+ <CardHeader title="Product" />
41
+
42
+ <CardContent>
43
+ <CardRow>
44
+ <CardFieldText formName="name" label={t("Name")} required={true} value={product.name} />
45
+ </CardRow>
46
+ <CardRow>
47
+ <CardFieldText
48
+ formName="description"
49
+ label={t("Description")}
50
+ required={true}
51
+ value={product.description}
52
+ />
53
+ </CardRow>
54
+ </CardContent>
55
+
56
+ {productProperties.length > 0 && (
57
+ <>
58
+ <CardHeader title={t("Properties")} />
59
+
60
+ <Table count={productProperties.length}>
61
+ <TableBody
62
+ sx={{
63
+ "& .MuiTableRow-root:first-of-type .MuiTableCell-root": (theme) => ({
64
+ borderTop: `1px solid ${theme.palette.divider}`,
65
+ }),
66
+ }}
67
+ >
68
+ {productProperties
69
+ .sort((a, b) => (a[0] < b[0] ? -1 : 1))
70
+ .map((prop) => (
71
+ <TableRow key={prop[0]}>
72
+ <TableCell>{capitalize(prop[0])}</TableCell>
73
+ <TableCell
74
+ typographyProps={{
75
+ variant: "caption",
76
+ color: "text.secondary",
77
+ }}
78
+ >
79
+ {prop[1]}
80
+ </TableCell>
81
+ </TableRow>
82
+ ))}
83
+ </TableBody>
84
+ </Table>
85
+ </>
86
+ )}
87
+
88
+ {articleAssets.length > 0 && <CardHeader title={t("Assets")} />}
89
+
90
+ {imageAssets.length > 0 && (
91
+ <>
92
+ <Modal
93
+ aria-describedby="modal-modal-description"
94
+ aria-labelledby="modal-modal-title"
95
+ open={selectedAsset !== null}
96
+ onClose={() => setSelectedAsset(null)}
97
+ >
98
+ <Box
99
+ sx={{
100
+ position: "absolute",
101
+ top: "50%",
102
+ left: "50%",
103
+ transform: "translate(-50%, -50%)",
104
+ width: "100vw", // Set explicit width
105
+ height: "100vh", // Set explicit height
106
+ bgcolor: "rgba(0, 0, 0, 0.7)", // Dark overlay background
107
+ boxShadow: 24,
108
+ p: 2, // Reduced padding
109
+ display: "flex",
110
+ justifyContent: "center",
111
+ alignItems: "center",
112
+ overflow: "hidden", // Hide any overflowing content
113
+ outline: "none",
114
+ }}
115
+ onClick={() => setSelectedAsset(null)}
116
+ >
117
+ {selectedAsset !== null && (
118
+ <img
119
+ alt={selectedAsset.caption}
120
+ loading="lazy"
121
+ src={selectedAsset.url}
122
+ style={{
123
+ maxWidth: "100%",
124
+ maxHeight: "100%",
125
+ objectFit: "contain",
126
+ borderRadius: "8px", // Subtle rounded corners for the image
127
+ }}
128
+ />
129
+ )}
130
+ </Box>
131
+ </Modal>
132
+
133
+ <CardContent
134
+ sx={{
135
+ width: "100%",
136
+ height: 400,
137
+ overflowY: "scroll",
138
+ paddingTop: 0,
139
+ paddingBottom: 0,
140
+ paddingLeft: 3,
141
+ paddingRight: 3,
142
+ }}
143
+ >
144
+ <ImageList cols={3} gap={8} variant="masonry">
145
+ {imageAssets.map((asset) => (
146
+ <ImageListItem key={asset.id} onClick={() => setSelectedAsset(asset)}>
147
+ <img alt={asset.caption} loading="lazy" src={asset.url} />
148
+ <ImageListItemBar subtitle={asset.caption} />
149
+ </ImageListItem>
150
+ ))}
151
+ </ImageList>
152
+ </CardContent>
153
+ </>
154
+ )}
155
+
156
+ {otherAssets.length > 0 && (
157
+ <Table count={otherAssets.length}>
158
+ <TableHead>
159
+ <TableRow>
160
+ <TableHeading>{t("Asset ID")}</TableHeading>
161
+ <TableHeading align="right">{t("Type")}</TableHeading>
162
+ <TableHeading align="right">{t("Caption")}</TableHeading>
163
+ </TableRow>
164
+ </TableHead>
165
+
166
+ <TableBody
167
+ sx={{ ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } }}
168
+ >
169
+ {otherAssets.map((asset) => (
170
+ <TableRow key={asset.id} sx={{ height: 56 }}>
171
+ <TableCell sx={{ py: 0 }}>
172
+ <a href={asset.url} rel="noreferrer" target="_blank">
173
+ {asset.id}
174
+ </a>
175
+ </TableCell>
176
+ <TableCell align="right" sx={{ py: 0 }}>
177
+ {asset.asset_type}
178
+ </TableCell>
179
+ <TableCell align="right" sx={{ py: 0 }}>
180
+ {asset.caption}
181
+ </TableCell>
182
+ </TableRow>
183
+ ))}
184
+ </TableBody>
185
+ </Table>
186
+ )}
187
+ </Card>
188
+ );
189
+ };
190
+
191
+ export default ArticleProductCard;
@@ -0,0 +1,16 @@
1
+ import InventoryOutlinedIcon from "@mui/icons-material/InventoryOutlined";
2
+
3
+ import { ArticleDetail } from "../../extensions/catalog";
4
+ import { ContribComponentMap } from "../../types";
5
+
6
+ export const contrib: Record<string, ContribComponentMap> = {
7
+ catalog: {
8
+ "catalog:article:detail:product": {
9
+ title: "Product",
10
+ icon: InventoryOutlinedIcon,
11
+ component: async () => (await import("./contrib/ArticleProduct")).default,
12
+ predicate: (article: ArticleDetail) => !!article.product_number,
13
+ variant: "inline",
14
+ },
15
+ },
16
+ } as const;
@@ -0,0 +1,21 @@
1
+ export interface ArticleProduct {
2
+ number: string;
3
+ item_type: string;
4
+ name: string;
5
+ description: string;
6
+ properties: object;
7
+ is_active: boolean;
8
+ }
9
+
10
+ export interface ArticleAsset {
11
+ id: string;
12
+ asset_type: string;
13
+ caption: string;
14
+ article_code: string;
15
+ url: string;
16
+ }
17
+
18
+ export interface ArticleProductResponse {
19
+ product: ArticleProduct;
20
+ assets: ArticleAsset[];
21
+ }
package/src/index.ts CHANGED
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
66
  export * as inventory from "./extensions/inventory";
67
67
  export * as member from "./extensions/member";
68
+ export * as pim from "./extensions/pim";
68
69
  export * as pos from "./extensions/pos";
69
70
  export * as pricing from "./extensions/pricing";
70
71
  export * as report from "./extensions/report";