@csbeker/medusa-product-attributes 2.2.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 (237) hide show
  1. package/.medusa/server/src/admin/index.js +9012 -0
  2. package/.medusa/server/src/admin/index.mjs +9010 -0
  3. package/.medusa/server/src/api/admin/middlewares.js +10 -0
  4. package/.medusa/server/src/api/admin/plugin/attribute-set/[id]/attributes/route.js +17 -0
  5. package/.medusa/server/src/api/admin/plugin/attribute-set/[id]/route.js +33 -0
  6. package/.medusa/server/src/api/admin/plugin/attribute-set/middlewares.js +44 -0
  7. package/.medusa/server/src/api/admin/plugin/attribute-set/query-config.js +22 -0
  8. package/.medusa/server/src/api/admin/plugin/attribute-set/route.js +25 -0
  9. package/.medusa/server/src/api/admin/plugin/attribute-set/validators.js +37 -0
  10. package/.medusa/server/src/api/admin/plugin/attributes/[id]/route.js +68 -0
  11. package/.medusa/server/src/api/admin/plugin/attributes/[id]/values/[valueId]/route.js +37 -0
  12. package/.medusa/server/src/api/admin/plugin/attributes/[id]/values/route.js +31 -0
  13. package/.medusa/server/src/api/admin/plugin/attributes/middlewares.js +103 -0
  14. package/.medusa/server/src/api/admin/plugin/attributes/query-config.js +41 -0
  15. package/.medusa/server/src/api/admin/plugin/attributes/route.js +28 -0
  16. package/.medusa/server/src/api/admin/plugin/attributes/validators.js +69 -0
  17. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  18. package/.medusa/server/src/api/middlewares.js +12 -0
  19. package/.medusa/server/src/api/store/middlewares.js +8 -0
  20. package/.medusa/server/src/api/store/plugin/attributes/middlewares.js +64 -0
  21. package/.medusa/server/src/api/store/plugin/attributes/products/middlewares.js +100 -0
  22. package/.medusa/server/src/api/store/plugin/attributes/products/query-config.js +20 -0
  23. package/.medusa/server/src/api/store/plugin/attributes/products/route.js +48 -0
  24. package/.medusa/server/src/api/store/plugin/attributes/products/validators.js +39 -0
  25. package/.medusa/server/src/api/store/plugin/attributes/query-config.js +21 -0
  26. package/.medusa/server/src/api/store/plugin/attributes/route.js +15 -0
  27. package/.medusa/server/src/api/store/plugin/attributes/validators.js +14 -0
  28. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  29. package/.medusa/server/src/api/utils/common-validators.js +23 -0
  30. package/.medusa/server/src/api/utils/constants.js +6 -0
  31. package/.medusa/server/src/api/utils/middlewares.js +34 -0
  32. package/.medusa/server/src/links/attribute-product-category.js +16 -0
  33. package/.medusa/server/src/links/attribute-value-product.js +16 -0
  34. package/.medusa/server/src/modules/attribute/events/index.js +8 -0
  35. package/.medusa/server/src/modules/attribute/index.js +13 -0
  36. package/.medusa/server/src/modules/attribute/migrations/Migration20250319161229.js +24 -0
  37. package/.medusa/server/src/modules/attribute/migrations/Migration20250320182643.js +16 -0
  38. package/.medusa/server/src/modules/attribute/migrations/Migration20250321162638.js +14 -0
  39. package/.medusa/server/src/modules/attribute/migrations/Migration20250505144933.js +23 -0
  40. package/.medusa/server/src/modules/attribute/migrations/Migration20250505201747.js +21 -0
  41. package/.medusa/server/src/modules/attribute/migrations/Migration20250506162300.js +14 -0
  42. package/.medusa/server/src/modules/attribute/migrations/Migration20250611160552.js +14 -0
  43. package/.medusa/server/src/modules/attribute/migrations/Migration20250611173345.js +16 -0
  44. package/.medusa/server/src/modules/attribute/migrations/Migration20250612192857.js +16 -0
  45. package/.medusa/server/src/modules/attribute/models/attribute-possible-value.js +24 -0
  46. package/.medusa/server/src/modules/attribute/models/attribute-set.js +22 -0
  47. package/.medusa/server/src/modules/attribute/models/attribute-value.js +17 -0
  48. package/.medusa/server/src/modules/attribute/models/attribute.js +27 -0
  49. package/.medusa/server/src/modules/attribute/service.js +84 -0
  50. package/.medusa/server/src/modules/attribute/types/attribute/common.js +13 -0
  51. package/.medusa/server/src/modules/attribute/types/attribute/index.js +18 -0
  52. package/.medusa/server/src/modules/attribute/types/attribute-set/index.js +18 -0
  53. package/.medusa/server/src/modules/attribute/types/attribute-set/mutations.js +3 -0
  54. package/.medusa/server/src/modules/attribute/types/attribute-value/index.js +18 -0
  55. package/.medusa/server/src/modules/attribute/types/attribute-value/mutations.js +3 -0
  56. package/.medusa/server/src/modules/attribute/types/index.js +20 -0
  57. package/.medusa/server/src/types/attribute/common.js +3 -0
  58. package/.medusa/server/src/types/attribute/http/attribute/admin/index.js +3 -0
  59. package/.medusa/server/src/types/attribute/http/attribute/index.js +18 -0
  60. package/.medusa/server/src/types/attribute/http/attribute-set/index.js +3 -0
  61. package/.medusa/server/src/types/attribute/http/index.js +19 -0
  62. package/.medusa/server/src/types/attribute/index.js +19 -0
  63. package/.medusa/server/src/utils/index.js +18 -0
  64. package/.medusa/server/src/utils/products-created-handler.js +22 -0
  65. package/.medusa/server/src/utils/products-updated-handler.js +58 -0
  66. package/.medusa/server/src/utils/validate-attribute-values-to-link.js +43 -0
  67. package/.medusa/server/src/workflows/attribute/index.js +19 -0
  68. package/.medusa/server/src/workflows/attribute/steps/create-attribute-possible-values.js +18 -0
  69. package/.medusa/server/src/workflows/attribute/steps/create-attributes.js +27 -0
  70. package/.medusa/server/src/workflows/attribute/steps/delete-attribute.js +31 -0
  71. package/.medusa/server/src/workflows/attribute/steps/index.js +21 -0
  72. package/.medusa/server/src/workflows/attribute/steps/update-attributes.js +34 -0
  73. package/.medusa/server/src/workflows/attribute/workflows/create-attribute-possible-values.js +11 -0
  74. package/.medusa/server/src/workflows/attribute/workflows/create-attributes.js +46 -0
  75. package/.medusa/server/src/workflows/attribute/workflows/delete-attribute.js +10 -0
  76. package/.medusa/server/src/workflows/attribute/workflows/index.js +20 -0
  77. package/.medusa/server/src/workflows/attribute/workflows/update-attributes.js +73 -0
  78. package/.medusa/server/src/workflows/attribute-set/steps/batch-link-attribute-set-attributes.js +66 -0
  79. package/.medusa/server/src/workflows/attribute-set/steps/create-attribute-set.js +24 -0
  80. package/.medusa/server/src/workflows/attribute-set/steps/index.js +20 -0
  81. package/.medusa/server/src/workflows/attribute-set/steps/update-attribute-set.js +22 -0
  82. package/.medusa/server/src/workflows/attribute-set/workflows/batch-link-attribute-set-attributes.js +10 -0
  83. package/.medusa/server/src/workflows/attribute-set/workflows/create-attribute-set.js +11 -0
  84. package/.medusa/server/src/workflows/attribute-set/workflows/index.js +20 -0
  85. package/.medusa/server/src/workflows/attribute-set/workflows/update-attribute-set.js +10 -0
  86. package/.medusa/server/src/workflows/attribute-value/steps/create-attribute-value.js +18 -0
  87. package/.medusa/server/src/workflows/attribute-value/steps/delete-attribute-value.js +18 -0
  88. package/.medusa/server/src/workflows/attribute-value/steps/index.js +20 -0
  89. package/.medusa/server/src/workflows/attribute-value/steps/validate-attribute-value.js +53 -0
  90. package/.medusa/server/src/workflows/attribute-value/workflow/create-attribute-value.js +28 -0
  91. package/.medusa/server/src/workflows/attribute-value/workflow/delete-attribute-value.js +38 -0
  92. package/.medusa/server/src/workflows/attribute-value/workflow/index.js +19 -0
  93. package/.medusa/server/src/workflows/attribute_possible_value/index.js +19 -0
  94. package/.medusa/server/src/workflows/attribute_possible_value/steps/index.js +18 -0
  95. package/.medusa/server/src/workflows/attribute_possible_value/steps/update-attribute-possible-value.js +18 -0
  96. package/.medusa/server/src/workflows/attribute_possible_value/workflows/index.js +18 -0
  97. package/.medusa/server/src/workflows/attribute_possible_value/workflows/update-attribute-possible-value.js +11 -0
  98. package/.medusa/server/src/workflows/index.js +18 -0
  99. package/CHANGELOG.md +104 -0
  100. package/README.md +86 -0
  101. package/package.json +90 -0
  102. package/src/admin/README.md +31 -0
  103. package/src/admin/components/metadata-editor/index.tsx +101 -0
  104. package/src/admin/components/section-row.tsx +41 -0
  105. package/src/admin/hooks/api/attribute-set.ts +122 -0
  106. package/src/admin/hooks/api/attributes.ts +126 -0
  107. package/src/admin/hooks/table/columns/index.ts +1 -0
  108. package/src/admin/hooks/table/columns/use-attribute-table-columns.tsx +280 -0
  109. package/src/admin/layouts/single-column.tsx +11 -0
  110. package/src/admin/lib/config.ts +8 -0
  111. package/src/admin/lib/query-key-factory.ts +53 -0
  112. package/src/admin/routes/attributes/[id]/edit/page.tsx +133 -0
  113. package/src/admin/routes/attributes/[id]/edit-possible-value/page.tsx +174 -0
  114. package/src/admin/routes/attributes/[id]/page.tsx +127 -0
  115. package/src/admin/routes/attributes/components/AttributeForm.tsx +301 -0
  116. package/src/admin/routes/attributes/components/AttributeSetTable.tsx +108 -0
  117. package/src/admin/routes/attributes/components/category-selection-modal.tsx +82 -0
  118. package/src/admin/routes/attributes/components/possible-values-table.tsx +119 -0
  119. package/src/admin/routes/attributes/create/components/MultiSelectCategory.tsx +148 -0
  120. package/src/admin/routes/attributes/create/components/PossibleValuesList.tsx +151 -0
  121. package/src/admin/routes/attributes/create/page.tsx +123 -0
  122. package/src/admin/routes/attributes/create-set/page.tsx +110 -0
  123. package/src/admin/routes/attributes/page.tsx +346 -0
  124. package/src/admin/routes/attributes/set/[id]/attributes/page.tsx +35 -0
  125. package/src/admin/routes/attributes/set/[id]/components/AttributeSetAttributesSection.tsx +114 -0
  126. package/src/admin/routes/attributes/set/[id]/components/AttributeSetGeneralSection.tsx +42 -0
  127. package/src/admin/routes/attributes/set/[id]/components/attribute-set-attributes-form.tsx +143 -0
  128. package/src/admin/routes/attributes/set/[id]/components/index.ts +2 -0
  129. package/src/admin/routes/attributes/set/[id]/edit/page.tsx +119 -0
  130. package/src/admin/routes/attributes/set/[id]/page.tsx +45 -0
  131. package/src/admin/tsconfig.json +27 -0
  132. package/src/admin/types/global.d.ts +3 -0
  133. package/src/admin/vite-env.d.ts +1 -0
  134. package/src/api/README.md +133 -0
  135. package/src/api/admin/middlewares.ts +8 -0
  136. package/src/api/admin/plugin/attribute-set/[id]/attributes/route.ts +17 -0
  137. package/src/api/admin/plugin/attribute-set/[id]/route.ts +41 -0
  138. package/src/api/admin/plugin/attribute-set/middlewares.ts +42 -0
  139. package/src/api/admin/plugin/attribute-set/query-config.ts +20 -0
  140. package/src/api/admin/plugin/attribute-set/route.ts +34 -0
  141. package/src/api/admin/plugin/attribute-set/validators.ts +45 -0
  142. package/src/api/admin/plugin/attributes/[id]/route.ts +85 -0
  143. package/src/api/admin/plugin/attributes/[id]/values/[valueId]/route.ts +41 -0
  144. package/src/api/admin/plugin/attributes/[id]/values/route.ts +39 -0
  145. package/src/api/admin/plugin/attributes/middlewares.ts +91 -0
  146. package/src/api/admin/plugin/attributes/query-config.ts +42 -0
  147. package/src/api/admin/plugin/attributes/route.ts +33 -0
  148. package/src/api/admin/plugin/attributes/validators.ts +91 -0
  149. package/src/api/admin/plugin/route.ts +8 -0
  150. package/src/api/middlewares.ts +10 -0
  151. package/src/api/store/middlewares.ts +6 -0
  152. package/src/api/store/plugin/attributes/middlewares.ts +33 -0
  153. package/src/api/store/plugin/attributes/products/middlewares.ts +73 -0
  154. package/src/api/store/plugin/attributes/products/query-config.ts +19 -0
  155. package/src/api/store/plugin/attributes/products/route.ts +68 -0
  156. package/src/api/store/plugin/attributes/products/validators.ts +55 -0
  157. package/src/api/store/plugin/attributes/query-config.ts +19 -0
  158. package/src/api/store/plugin/attributes/route.ts +13 -0
  159. package/src/api/store/plugin/attributes/validators.ts +14 -0
  160. package/src/api/store/plugin/route.ts +8 -0
  161. package/src/api/utils/common-validators.ts +24 -0
  162. package/src/api/utils/constants.ts +2 -0
  163. package/src/api/utils/middlewares.ts +31 -0
  164. package/src/jobs/README.md +36 -0
  165. package/src/links/README.md +26 -0
  166. package/src/links/attribute-product-category.ts +14 -0
  167. package/src/links/attribute-value-product.ts +14 -0
  168. package/src/modules/README.md +116 -0
  169. package/src/modules/attribute/events/index.ts +4 -0
  170. package/src/modules/attribute/index.ts +8 -0
  171. package/src/modules/attribute/migrations/.snapshot-medusa-attribute.json +624 -0
  172. package/src/modules/attribute/migrations/Migration20250319161229.ts +27 -0
  173. package/src/modules/attribute/migrations/Migration20250320182643.ts +15 -0
  174. package/src/modules/attribute/migrations/Migration20250321162638.ts +13 -0
  175. package/src/modules/attribute/migrations/Migration20250505144933.ts +26 -0
  176. package/src/modules/attribute/migrations/Migration20250505201747.ts +23 -0
  177. package/src/modules/attribute/migrations/Migration20250506162300.ts +13 -0
  178. package/src/modules/attribute/migrations/Migration20250611160552.ts +13 -0
  179. package/src/modules/attribute/migrations/Migration20250611173345.ts +17 -0
  180. package/src/modules/attribute/migrations/Migration20250612192857.ts +17 -0
  181. package/src/modules/attribute/models/attribute-possible-value.ts +20 -0
  182. package/src/modules/attribute/models/attribute-set.ts +18 -0
  183. package/src/modules/attribute/models/attribute-value.ts +13 -0
  184. package/src/modules/attribute/models/attribute.ts +23 -0
  185. package/src/modules/attribute/service.ts +102 -0
  186. package/src/modules/attribute/types/attribute/common.ts +94 -0
  187. package/src/modules/attribute/types/attribute/index.ts +1 -0
  188. package/src/modules/attribute/types/attribute-set/index.ts +1 -0
  189. package/src/modules/attribute/types/attribute-set/mutations.ts +7 -0
  190. package/src/modules/attribute/types/attribute-value/index.ts +1 -0
  191. package/src/modules/attribute/types/attribute-value/mutations.ts +5 -0
  192. package/src/modules/attribute/types/index.ts +3 -0
  193. package/src/providers/README.md +30 -0
  194. package/src/subscribers/README.md +59 -0
  195. package/src/types/attribute/common.ts +173 -0
  196. package/src/types/attribute/http/attribute/admin/index.ts +0 -0
  197. package/src/types/attribute/http/attribute/index.ts +42 -0
  198. package/src/types/attribute/http/attribute-set/index.ts +10 -0
  199. package/src/types/attribute/http/index.ts +2 -0
  200. package/src/types/attribute/index.ts +2 -0
  201. package/src/utils/index.ts +1 -0
  202. package/src/utils/products-created-handler.ts +35 -0
  203. package/src/utils/products-updated-handler.ts +74 -0
  204. package/src/utils/validate-attribute-values-to-link.ts +67 -0
  205. package/src/workflows/README.md +79 -0
  206. package/src/workflows/attribute/index.ts +2 -0
  207. package/src/workflows/attribute/steps/create-attribute-possible-values.ts +29 -0
  208. package/src/workflows/attribute/steps/create-attributes.ts +35 -0
  209. package/src/workflows/attribute/steps/delete-attribute.ts +41 -0
  210. package/src/workflows/attribute/steps/index.ts +4 -0
  211. package/src/workflows/attribute/steps/update-attributes.ts +45 -0
  212. package/src/workflows/attribute/workflows/create-attribute-possible-values.ts +17 -0
  213. package/src/workflows/attribute/workflows/create-attributes.ts +56 -0
  214. package/src/workflows/attribute/workflows/delete-attribute.ts +15 -0
  215. package/src/workflows/attribute/workflows/index.ts +3 -0
  216. package/src/workflows/attribute/workflows/update-attributes.ts +103 -0
  217. package/src/workflows/attribute-set/steps/batch-link-attribute-set-attributes.ts +82 -0
  218. package/src/workflows/attribute-set/steps/create-attribute-set.ts +34 -0
  219. package/src/workflows/attribute-set/steps/index.ts +3 -0
  220. package/src/workflows/attribute-set/steps/update-attribute-set.ts +32 -0
  221. package/src/workflows/attribute-set/workflows/batch-link-attribute-set-attributes.ts +12 -0
  222. package/src/workflows/attribute-set/workflows/create-attribute-set.ts +17 -0
  223. package/src/workflows/attribute-set/workflows/index.ts +3 -0
  224. package/src/workflows/attribute-set/workflows/update-attribute-set.ts +14 -0
  225. package/src/workflows/attribute-value/steps/create-attribute-value.ts +26 -0
  226. package/src/workflows/attribute-value/steps/delete-attribute-value.ts +26 -0
  227. package/src/workflows/attribute-value/steps/index.ts +3 -0
  228. package/src/workflows/attribute-value/steps/validate-attribute-value.ts +95 -0
  229. package/src/workflows/attribute-value/workflow/create-attribute-value.ts +36 -0
  230. package/src/workflows/attribute-value/workflow/delete-attribute-value.ts +46 -0
  231. package/src/workflows/attribute-value/workflow/index.ts +2 -0
  232. package/src/workflows/attribute_possible_value/index.ts +2 -0
  233. package/src/workflows/attribute_possible_value/steps/index.ts +1 -0
  234. package/src/workflows/attribute_possible_value/steps/update-attribute-possible-value.ts +25 -0
  235. package/src/workflows/attribute_possible_value/workflows/index.ts +1 -0
  236. package/src/workflows/attribute_possible_value/workflows/update-attribute-possible-value.ts +15 -0
  237. package/src/workflows/index.ts +1 -0
@@ -0,0 +1,31 @@
1
+ import { MedusaNextFunction, MedusaRequest, MedusaResponse } from "@medusajs/framework";
2
+ import { arrayDifference, ContainerRegistrationKeys, deduplicate } from "@medusajs/framework/utils";
3
+ import attributeProductCategory from "../../links/attribute-product-category";
4
+
5
+ export const addGlobalAttributesIfNecessary = () => async (req: MedusaRequest, res: MedusaResponse, next: MedusaNextFunction) => {
6
+ const filterableFields = req.filterableFields || {}
7
+ const shouldIncludeGlobals = filterableFields.include_globals
8
+
9
+ if(!shouldIncludeGlobals) {
10
+ return next()
11
+ }
12
+
13
+ const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
14
+ const { data: allAttributes } = await query.graph({
15
+ entity: 'attribute',
16
+ fields: ['id']
17
+ })
18
+ const { data: attributesWithCategories } = await query.graph({
19
+ entity: attributeProductCategory.entryPoint,
20
+ fields: ['attribute_id']
21
+ })
22
+
23
+ const alreadyFilteredAttributeIds = (filterableFields.id || []) as string[]
24
+ const allAttributesIds = allAttributes.map(attr => attr.id)
25
+ const attributesWithCategoriesIds = deduplicate(attributesWithCategories.map(attrCat => attrCat.attribute_id))
26
+ req.filterableFields.id = [
27
+ ...alreadyFilteredAttributeIds,
28
+ ...arrayDifference(allAttributesIds, attributesWithCategoriesIds)
29
+ ]
30
+ return next()
31
+ }
@@ -0,0 +1,36 @@
1
+ # Custom scheduled jobs
2
+
3
+ A scheduled job is a function executed at a specified interval of time in the background of your Medusa application.
4
+
5
+ A scheduled job is created in a TypeScript or JavaScript file under the `src/jobs` directory.
6
+
7
+ For example, create the file `src/jobs/hello-world.ts` with the following content:
8
+
9
+ ```ts
10
+ import {
11
+ MedusaContainer
12
+ } from "@medusajs/framework/types";
13
+
14
+ export default async function myCustomJob(container: MedusaContainer) {
15
+ const productService = container.resolve("product")
16
+
17
+ const products = await productService.listAndCountProducts();
18
+
19
+ // Do something with the products
20
+ }
21
+
22
+ export const config = {
23
+ name: "daily-product-report",
24
+ schedule: "0 0 * * *", // Every day at midnight
25
+ };
26
+ ```
27
+
28
+ A scheduled job file must export:
29
+
30
+ - The function to be executed whenever it’s time to run the scheduled job.
31
+ - A configuration object defining the job. It has three properties:
32
+ - `name`: a unique name for the job.
33
+ - `schedule`: a [cron expression](https://crontab.guru/).
34
+ - `numberOfExecutions`: an optional integer, specifying how many times the job will execute before being removed
35
+
36
+ The `handler` is a function that accepts one parameter, `container`, which is a `MedusaContainer` instance used to resolve services.
@@ -0,0 +1,26 @@
1
+ # Module Links
2
+
3
+ A module link forms an association between two data models of different modules, while maintaining module isolation.
4
+
5
+ Learn more about links in [this documentation](https://docs.medusajs.com/learn/fundamentals/module-links)
6
+
7
+ For example:
8
+
9
+ ```ts
10
+ import BlogModule from "../modules/blog"
11
+ import ProductModule from "@medusajs/medusa/product"
12
+ import { defineLink } from "@medusajs/framework/utils"
13
+
14
+ export default defineLink(
15
+ ProductModule.linkable.product,
16
+ BlogModule.linkable.post
17
+ )
18
+ ```
19
+
20
+ This defines a link between the Product Module's `product` data model and the Blog Module (custom module)'s `post` data model.
21
+
22
+ Then, in the Medusa application using this plugin, run the following command to sync the links to the database:
23
+
24
+ ```bash
25
+ npx medusa db:migrate
26
+ ```
@@ -0,0 +1,14 @@
1
+ import { defineLink } from "@medusajs/framework/utils";
2
+ import AttributeModule from '../modules/attribute'
3
+ import ProductModule from "@medusajs/medusa/product";
4
+
5
+ export default defineLink(
6
+ {
7
+ linkable: AttributeModule.linkable.attribute,
8
+ isList: true
9
+ },
10
+ {
11
+ linkable: ProductModule.linkable.productCategory,
12
+ isList: true
13
+ }
14
+ )
@@ -0,0 +1,14 @@
1
+ import { defineLink } from "@medusajs/framework/utils"
2
+ import AttributeModule from '../modules/attribute'
3
+ import ProductModule from "@medusajs/medusa/product"
4
+
5
+ export default defineLink(
6
+ {
7
+ linkable: AttributeModule.linkable.attributeValue,
8
+ isList: true,
9
+ },
10
+ {
11
+ linkable: ProductModule.linkable.product,
12
+ isList: true,
13
+ }
14
+ )
@@ -0,0 +1,116 @@
1
+ # Custom Module
2
+
3
+ A module is a package of reusable functionalities. It can be integrated into your Medusa application without affecting the overall system. You can create a module as part of a plugin.
4
+
5
+ Learn more about modules in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules).
6
+
7
+ To create a module:
8
+
9
+ ## 1. Create a Data Model
10
+
11
+ A data model represents a table in the database. You create a data model in a TypeScript or JavaScript file under the `models` directory of a module.
12
+
13
+ For example, create the file `src/modules/blog/models/post.ts` with the following content:
14
+
15
+ ```ts
16
+ import { model } from "@medusajs/framework/utils"
17
+
18
+ const Post = model.define("post", {
19
+ id: model.id().primaryKey(),
20
+ title: model.text(),
21
+ })
22
+
23
+ export default Post
24
+ ```
25
+
26
+ ## 2. Create a Service
27
+
28
+ A module must define a service. A service is a TypeScript or JavaScript class holding methods related to a business logic or commerce functionality.
29
+
30
+ For example, create the file `src/modules/blog/service.ts` with the following content:
31
+
32
+ ```ts
33
+ import { MedusaService } from "@medusajs/framework/utils"
34
+ import Post from "./models/post"
35
+
36
+ class BlogModuleService extends MedusaService({
37
+ Post,
38
+ }){
39
+ }
40
+
41
+ export default BlogModuleService
42
+ ```
43
+
44
+ ## 3. Export Module Definition
45
+
46
+ A module must have an `index.ts` file in its root directory that exports its definition. The definition specifies the main service of the module.
47
+
48
+ For example, create the file `src/modules/blog/index.ts` with the following content:
49
+
50
+ ```ts
51
+ import BlogModuleService from "./service"
52
+ import { Module } from "@medusajs/framework/utils"
53
+
54
+ export const BLOG_MODULE = "blog"
55
+
56
+ export default Module(BLOG_MODULE, {
57
+ service: BlogModuleService,
58
+ })
59
+ ```
60
+
61
+ ## 4. Generate Migrations
62
+
63
+ To generate migrations for your module, run the following command in the plugin's directory:
64
+
65
+ ```bash
66
+ npx medusa plugin:db:genreate
67
+ ```
68
+
69
+ ## Use Module
70
+
71
+ You can use the module in customizations within the plugin or within the Medusa application using this plugin. When the plugin is added to a Medusa application, all its modules are registered as well.
72
+
73
+ For example, to use the module in an API route:
74
+
75
+ ```ts
76
+ import { MedusaRequest, MedusaResponse } from "@medusajs/framework"
77
+ import BlogModuleService from "../../../modules/blog/service"
78
+ import { BLOG_MODULE } from "../../../modules/blog"
79
+
80
+ export async function GET(
81
+ req: MedusaRequest,
82
+ res: MedusaResponse
83
+ ): Promise<void> {
84
+ const blogModuleService: BlogModuleService = req.scope.resolve(
85
+ BLOG_MODULE
86
+ )
87
+
88
+ const posts = await blogModuleService.listPosts()
89
+
90
+ res.json({
91
+ posts
92
+ })
93
+ }
94
+ ```
95
+
96
+ ## Module Options
97
+
98
+ When you register the plugin in the Medusa application, it can accept options. These options are passed to the modules within the plugin:
99
+
100
+ ```ts
101
+ import { defineConfig } from "@medusajs/framework/utils"
102
+
103
+ module.exports = defineConfig({
104
+ // ...
105
+ plugins: [
106
+ {
107
+ resolve: "@myorg/plugin-name",
108
+ options: {
109
+ apiKey: process.env.API_KEY,
110
+ },
111
+ },
112
+ ],
113
+ })
114
+ ```
115
+
116
+ Learn more about module options in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules/options).
@@ -0,0 +1,4 @@
1
+ export const AttributeWorkflowsEvents = {
2
+ CREATED: 'attribute.created',
3
+ UPDATED: 'attribute.updated',
4
+ }
@@ -0,0 +1,8 @@
1
+ import AttributeModuleService from "./service"
2
+ import { Module } from "@medusajs/framework/utils"
3
+
4
+ export const ATTRIBUTE_MODULE = 'attribute'
5
+
6
+ export default Module(ATTRIBUTE_MODULE, {
7
+ service: AttributeModuleService,
8
+ })