chore: Migrate modules to use the Module util (#7964)

**What**
Apply the `Module` util to each module to handle the export and provide the linkable configuration object.

- Most joiner config that does not have any special config are removed/cleaned up in favor of the autogenerated one or simpler one
- linkable are now available in all modules
- cleaned up the dependencies of the modules

FIXES CORE-2410
This commit is contained in:
Adrien de Peretti
2024-07-05 13:00:40 +00:00
committed by GitHub
parent eafa3560ae
commit b368251ca3
99 changed files with 1267 additions and 488 deletions
@@ -1,11 +1,12 @@
import { IApiKeyModuleService } from "@medusajs/types"
import { ApiKeyType, Modules } from "@medusajs/utils"
import { ApiKeyType, Module, Modules } from "@medusajs/utils"
import crypto from "crypto"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import {
createPublishableKeyFixture,
createSecretKeyFixture,
} from "../__fixtures__"
import { ApiKeyModuleService } from "@services"
jest.setTimeout(100000)
@@ -39,6 +40,25 @@ moduleIntegrationTestRunner<IApiKeyModuleService>({
jest.restoreAllMocks()
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.API_KEY, {
service: ApiKeyModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["apiKey"])
linkable.apiKey.toJSON = undefined
expect(linkable.apiKey).toEqual({
id: {
linkable: "api_key_id",
primaryKey: "id",
serviceName: "apiKey",
field: "apiKey",
},
})
})
describe("API Key Module Service", () => {
describe("creating a publishable API key", () => {
it("should create it successfully", async function () {
+1 -4
View File
@@ -45,13 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+4 -3
View File
@@ -1,5 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { ApiKeyModuleService } from "@services"
const moduleDefinition: ModuleExports = { service: ApiKeyModuleService }
export default moduleDefinition
export default Module(Modules.API_KEY, {
service: ApiKeyModuleService,
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.API_KEY)
@@ -8,10 +8,8 @@ import {
FindConfig,
IApiKeyModuleService,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
} from "@medusajs/types"
import { joinerConfig } from "../joiner-config"
import { ApiKey } from "@models"
import {
CreateApiKeyDTO,
@@ -38,7 +36,7 @@ type InjectedDependencies = {
apiKeyService: ModulesSdkTypes.IMedusaInternalService<any>
}
export default class ApiKeyModuleService
export class ApiKeyModuleService
extends MedusaService<{
ApiKey: { dto: ApiKeyTypes.ApiKeyDTO }
}>({ ApiKey })
@@ -57,9 +55,6 @@ export default class ApiKeyModuleService
this.apiKeyService_ = apiKeyService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
//@ts-expect-error
createApiKeys(
data: ApiKeyTypes.CreateApiKeyDTO[],
@@ -1 +1 @@
export { default as ApiKeyModuleService } from "./api-key-module-service"
export { ApiKeyModuleService } from "./api-key-module-service"
@@ -1,7 +1,8 @@
import { IAuthModuleService } from "@medusajs/types"
import { moduleIntegrationTestRunner, SuiteOptions } from "medusa-test-utils"
import { resolve } from "path"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { AuthModuleService } from "@services"
let moduleOptions = {
providers: [
@@ -36,6 +37,25 @@ moduleIntegrationTestRunner({
})
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.AUTH, {
service: AuthModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["authIdentity"])
linkable.authIdentity.toJSON = undefined
expect(linkable.authIdentity).toEqual({
id: {
linkable: "auth_identity_id",
primaryKey: "id",
serviceName: "auth",
field: "authIdentity",
},
})
})
it("it fails if the provider does not exist", async () => {
const err = await service
.authenticate("facebook", {
+1 -3
View File
@@ -34,6 +34,7 @@
"orm:cache:clear": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm cache:clear"
},
"devDependencies": {
"@medusajs/types": "^1.11.14",
"@mikro-orm/cli": "5.9.7",
"cross-env": "^5.2.1",
"jest": "^29.7.0",
@@ -45,15 +46,12 @@
"dependencies": {
"@medusajs/auth-emailpass": "0.0.1",
"@medusajs/modules-sdk": "^1.12.9",
"@medusajs/types": "^1.11.14",
"@medusajs/utils": "^1.11.7",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"jsonwebtoken": "^9.0.2",
"knex": "2.4.2",
"scrypt-kdf": "^2.0.1",
"simple-oauth2": "^5.0.0"
}
+4 -5
View File
@@ -1,9 +1,8 @@
import { ModuleExports } from "@medusajs/types"
import { AuthModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
const moduleDefinition: ModuleExports = {
export default Module(Modules.AUTH, {
service: AuthModuleService,
loaders: [loadProviders] as any,
}
export default moduleDefinition
loaders: [loadProviders],
})
@@ -1,7 +1,8 @@
import { ICartModuleService } from "@medusajs/types"
import { BigNumber, Modules } from "@medusajs/utils"
import { BigNumber, Module, Modules } from "@medusajs/utils"
import { CheckConstraintViolationException } from "@mikro-orm/core"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { CartModuleService } from "@services"
jest.setTimeout(50000)
@@ -9,6 +10,112 @@ moduleIntegrationTestRunner<ICartModuleService>({
moduleName: Modules.CART,
testSuite: ({ service }) => {
describe("Cart Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.CART, {
service: CartModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"address",
"adjustmentLine",
"cart",
"lineItemAdjustment",
"lineItemTaxLine",
"lineItem",
"shippingMethodAdjustment",
"shippingMethodTaxLine",
"shippingMethod",
"taxLine",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
address: {
id: {
linkable: "address_id",
primaryKey: "id",
serviceName: "cart",
field: "address",
},
},
adjustmentLine: {
id: {
linkable: "adjustment_line_id",
primaryKey: "id",
serviceName: "cart",
field: "adjustmentLine",
},
},
cart: {
id: {
linkable: "cart_id",
primaryKey: "id",
serviceName: "cart",
field: "cart",
},
},
lineItemAdjustment: {
id: {
linkable: "line_item_adjustment_id",
primaryKey: "id",
serviceName: "cart",
field: "lineItemAdjustment",
},
},
lineItemTaxLine: {
id: {
linkable: "line_item_tax_line_id",
primaryKey: "id",
serviceName: "cart",
field: "lineItemTaxLine",
},
},
lineItem: {
id: {
linkable: "line_item_id",
primaryKey: "id",
serviceName: "cart",
field: "lineItem",
},
},
shippingMethodAdjustment: {
id: {
linkable: "shipping_method_adjustment_id",
primaryKey: "id",
serviceName: "cart",
field: "shippingMethodAdjustment",
},
},
shippingMethodTaxLine: {
id: {
linkable: "shipping_method_tax_line_id",
primaryKey: "id",
serviceName: "cart",
field: "shippingMethodTaxLine",
},
},
shippingMethod: {
id: {
linkable: "shipping_method_id",
primaryKey: "id",
serviceName: "cart",
field: "shippingMethod",
},
},
taxLine: {
id: {
linkable: "tax_line_id",
primaryKey: "id",
serviceName: "cart",
field: "taxLine",
},
},
})
})
describe("create", () => {
it("should throw an error when required params are not passed", async () => {
const error = await service
+1 -4
View File
@@ -45,13 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+4 -8
View File
@@ -1,10 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { CartModuleService } from "./services"
import { Module, Modules } from "@medusajs/utils"
const service = CartModuleService
export const moduleDefinition: ModuleExports = {
service,
}
export default moduleDefinition
export default Module(Modules.CART, {
service: CartModuleService,
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.CART)
@@ -6,7 +6,6 @@ import {
FindConfig,
ICartModuleService,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
} from "@medusajs/types"
import {
@@ -39,7 +38,6 @@ import {
UpdateLineItemDTO,
UpdateShippingMethodTaxLineDTO,
} from "@types"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -115,10 +113,6 @@ export default class CartModuleService
this.lineItemTaxLineService_ = lineItemTaxLineService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
private shouldIncludeTotals(config: FindConfig<any>): boolean {
const totalFields = [
"total",
@@ -1,6 +1,7 @@
import { ICurrencyModuleService } from "@medusajs/types"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { CurrencyModuleService } from "@services"
jest.setTimeout(100000)
@@ -8,6 +9,29 @@ moduleIntegrationTestRunner<ICurrencyModuleService>({
moduleName: Modules.CURRENCY,
testSuite: ({ service }) => {
describe("Currency Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.CURRENCY, {
service: CurrencyModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["currency"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
currency: {
code: {
linkable: "currency_code",
primaryKey: "code",
serviceName: "currency",
field: "currency",
},
},
})
})
describe("list", () => {
it("list currencies", async () => {
const currenciesResult = await service.listCurrencies(
+1 -4
View File
@@ -45,13 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
@@ -1,8 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.CURRENCY, {
primaryKeys: ["code"],
linkableKeys: {
currency_code: "currency",
},
})
@@ -7,13 +7,11 @@ import {
FindConfig,
ICurrencyModuleService,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
} from "@medusajs/types"
import { MedusaService } from "@medusajs/utils"
import { Currency } from "@models"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -41,10 +39,6 @@ export default class CurrencyModuleService
this.currencyService_ = currencyService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
async retrieveCurrency(
code: string,
@@ -1,6 +1,7 @@
import { ICustomerModuleService } from "@medusajs/types"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { CustomerModuleService } from "@services"
jest.setTimeout(30000)
@@ -8,6 +9,58 @@ moduleIntegrationTestRunner<ICustomerModuleService>({
moduleName: Modules.CUSTOMER,
testSuite: ({ service }) => {
describe("Customer Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.CUSTOMER, {
service: CustomerModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"address",
"customerGroupCustomer",
"customerGroup",
"customer",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
address: {
id: {
linkable: "address_id",
primaryKey: "id",
serviceName: "customer",
field: "address",
},
},
customerGroupCustomer: {
id: {
linkable: "customer_group_customer_id",
primaryKey: "id",
serviceName: "customer",
field: "customerGroupCustomer",
},
},
customerGroup: {
id: {
linkable: "customer_group_id",
primaryKey: "id",
serviceName: "customer",
field: "customerGroup",
},
},
customer: {
id: {
linkable: "customer_id",
primaryKey: "id",
serviceName: "customer",
field: "customer",
},
},
})
})
describe("create", () => {
it("should create a single customer", async () => {
const customerData = {
+1 -3
View File
@@ -50,8 +50,6 @@
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+3 -4
View File
@@ -1,7 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { CustomerModuleService } from "@services"
import { Module, Modules } from "@medusajs/utils"
const moduleDefinition: ModuleExports = {
export default Module(Modules.CUSTOMER, {
service: CustomerModuleService,
}
export default moduleDefinition
})
@@ -2,7 +2,8 @@ import { resolve } from "path"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { Entity, PrimaryKey } from "@mikro-orm/core"
import { IFileModuleService } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { FileModuleService } from "@services"
jest.setTimeout(100000)
@@ -31,6 +32,20 @@ moduleIntegrationTestRunner<IFileModuleService>({
moduleModels: [DummyEntity],
testSuite: ({ service }) => {
describe("File Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.FILE, {
service: FileModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({})
})
it("creates and gets a file", async () => {
const res = await service.createFiles({
filename: "test.jpg",
+2 -5
View File
@@ -47,14 +47,11 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.10",
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.8",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2",
"lodash": "^4.17.21"
"awilix": "^8.0.0"
}
}
+5 -10
View File
@@ -1,13 +1,8 @@
import { ModuleExports } from "@medusajs/types"
import { FileModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
const loaders = [loadProviders] as any
const service = FileModuleService
export const moduleDefinition: ModuleExports = {
service,
loaders,
}
export default moduleDefinition
export default Module(Modules.FILE, {
service: FileModuleService,
loaders: [loadProviders],
})
@@ -1,11 +1,11 @@
import { ModulesDefinition } from "@medusajs/modules-sdk"
import { FulfillmentSetDTO, IFulfillmentModuleService } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import { FulfillmentProviderService } from "@services"
import { Module, Modules } from "@medusajs/utils"
import { FulfillmentModuleService, FulfillmentProviderService } from "@services"
import {
SuiteOptions,
initModules,
moduleIntegrationTestRunner,
SuiteOptions,
} from "medusa-test-utils"
import { resolve } from "path"
import { createFullDataStructure } from "../../__fixtures__"
@@ -103,6 +103,58 @@ moduleIntegrationTestRunner({
service,
}: SuiteOptions<IFulfillmentModuleService>) =>
describe("Fulfillment Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.FULFILLMENT, {
service: FulfillmentModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"fulfillment",
"fulfillmentSet",
"shippingOption",
"shippingOptionRule",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
fulfillment: {
id: {
linkable: "fulfillment_id",
primaryKey: "id",
serviceName: "fulfillment",
field: "fulfillment",
},
},
fulfillmentSet: {
id: {
linkable: "fulfillment_set_id",
primaryKey: "id",
serviceName: "fulfillment",
field: "fulfillmentSet",
},
},
shippingOption: {
id: {
linkable: "shipping_option_id",
primaryKey: "id",
serviceName: "fulfillment",
field: "shippingOption",
},
},
shippingOptionRule: {
id: {
linkable: "shipping_option_rule_id",
primaryKey: "id",
serviceName: "fulfillment",
field: "shippingOptionRule",
},
},
})
})
it("should load and save all the providers on bootstrap with the correct is_enabled value", async () => {
const databaseConfig = {
schema: "public",
+1 -3
View File
@@ -51,8 +51,6 @@
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+5 -9
View File
@@ -1,15 +1,11 @@
import { ModuleExports } from "@medusajs/types"
import { FulfillmentModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
const service = FulfillmentModuleService
const loaders = [loadProviders]
export const moduleDefinition: ModuleExports = {
service,
loaders,
}
export default moduleDefinition
export default Module(Modules.FULFILLMENT, {
service: FulfillmentModuleService,
loaders: [loadProviders],
})
// Module options types
export { FulfillmentModuleOptions } from "./types"
@@ -1,6 +1,7 @@
import { IInventoryService, InventoryItemDTO } from "@medusajs/types"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { InventoryModuleService } from "../../src/services"
jest.setTimeout(100000)
@@ -8,6 +9,49 @@ moduleIntegrationTestRunner<IInventoryService>({
moduleName: Modules.INVENTORY,
testSuite: ({ service }) => {
describe("Inventory Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.INVENTORY, {
service: InventoryModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"inventoryItem",
"inventoryLevel",
"reservationItem",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
inventoryItem: {
id: {
field: "inventoryItem",
linkable: "inventory_item_id",
primaryKey: "id",
serviceName: "inventoryService",
},
},
inventoryLevel: {
id: {
field: "inventoryLevel",
linkable: "inventory_level_id",
primaryKey: "id",
serviceName: "inventoryService",
},
},
reservationItem: {
id: {
field: "reservationItem",
linkable: "reservation_item_id",
primaryKey: "id",
serviceName: "inventoryService",
},
},
})
})
describe("create", () => {
it("should create an inventory item", async () => {
const data = { sku: "test-sku", origin_country: "test-country" }
@@ -1,4 +1,10 @@
module.exports = {
moduleNameMapper: {
"^@models": "<rootDir>/src/models",
"^@services": "<rootDir>/src/services",
"^@repositories": "<rootDir>/src/repositories",
"^@types": "<rootDir>/src/types",
},
transform: {
"^.+\\.[jt]s$": [
"@swc/jest",
+1 -3
View File
@@ -36,9 +36,7 @@
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
},
"scripts": {
"watch": "tsc --build --watch",
+5 -6
View File
@@ -1,7 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import InventoryService from "./services/inventory-module"
import InventoryModuleService from "./services/inventory-module"
import { Module, Modules } from "@medusajs/utils"
const moduleDefinition: ModuleExports = {
service: InventoryService,
}
export default moduleDefinition
export default Module(Modules.INVENTORY, {
service: InventoryModuleService,
})
@@ -9,13 +9,6 @@ export const joinerConfig = defineJoinerConfig(Modules.INVENTORY, {
methodSuffix: "InventoryItems",
},
},
{
name: ["inventory_level", "inventory_levels"],
args: {
entity: "InventoryLevel",
methodSuffix: "InventoryLevels",
},
},
{
name: [
"reservation",
@@ -1,7 +1,8 @@
import { INotificationModuleService } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { moduleIntegrationTestRunner, SuiteOptions } from "medusa-test-utils"
import { resolve } from "path"
import { NotificationModuleService } from "@services"
let moduleOptions = {
providers: [
@@ -26,6 +27,29 @@ moduleIntegrationTestRunner({
moduleOptions,
testSuite: ({ service }: SuiteOptions<INotificationModuleService>) =>
describe("Notification Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.NOTIFICATION, {
service: NotificationModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["notification"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
notification: {
id: {
linkable: "notification_id",
primaryKey: "id",
serviceName: "notification",
field: "notification",
},
},
})
})
it("sends a notification and stores it in the database", async () => {
const notification = {
to: "admin@medusa.com",
+2 -4
View File
@@ -34,6 +34,7 @@
"orm:cache:clear": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm cache:clear"
},
"devDependencies": {
"@medusajs/types": "^1.11.16",
"@mikro-orm/cli": "5.9.7",
"cross-env": "^5.2.1",
"jest": "^29.7.0",
@@ -45,13 +46,10 @@
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/types": "^1.11.16",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+3 -5
View File
@@ -1,10 +1,8 @@
import { ModuleExports } from "@medusajs/types"
import { NotificationModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
export const moduleDefinition: ModuleExports = {
export default Module(Modules.NOTIFICATION, {
service: NotificationModuleService,
loaders: [loadProviders],
}
export default moduleDefinition
})
@@ -1,5 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.NOTIFICATION, {
models: [{ name: "Notification" }],
})
@@ -4,7 +4,6 @@ import {
InferEntityType,
INotificationModuleService,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
NotificationTypes,
} from "@medusajs/types"
@@ -17,7 +16,6 @@ import {
promiseAll,
} from "@medusajs/utils"
import { Notification } from "@models"
import { joinerConfig } from "../joiner-config"
import NotificationProviderService from "./notification-provider"
type InjectedDependencies = {
@@ -55,10 +53,6 @@ export default class NotificationModuleService
this.notificationProviderService_ = notificationProviderService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
createNotifications(
data: NotificationTypes.CreateNotificationDTO[],
@@ -0,0 +1,243 @@
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { IOrderModuleService } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { OrderModuleService } from "@services"
moduleIntegrationTestRunner<IOrderModuleService>({
moduleName: Modules.ORDER,
testSuite: () => {
describe("Order Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.ORDER, {
service: OrderModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"address",
"adjustmentLine",
"claimItemImage",
"orderClaimItem",
"orderClaim",
"orderExchangeItem",
"orderExchange",
"lineItemAdjustment",
"lineItemTaxLine",
"lineItem",
"orderChangeAction",
"orderChange",
"orderItem",
"orderShippingMethod",
"orderSummary",
"order",
"returnItem",
"returnReason",
"return",
"shippingMethodAdjustment",
"shippingMethodTaxLine",
"shippingMethod",
"taxLine",
"transaction",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
address: {
id: {
linkable: "address_id",
primaryKey: "id",
serviceName: "order",
field: "address",
},
},
adjustmentLine: {
id: {
linkable: "adjustment_line_id",
primaryKey: "id",
serviceName: "order",
field: "adjustmentLine",
},
},
claimItemImage: {
id: {
linkable: "claim_item_image_id",
primaryKey: "id",
serviceName: "order",
field: "claimItemImage",
},
},
orderClaimItem: {
id: {
linkable: "order_claim_item_id",
primaryKey: "id",
serviceName: "order",
field: "orderClaimItem",
},
},
orderClaim: {
id: {
linkable: "order_claim_id",
primaryKey: "id",
serviceName: "order",
field: "orderClaim",
},
},
orderExchangeItem: {
id: {
linkable: "order_exchange_item_id",
primaryKey: "id",
serviceName: "order",
field: "orderExchangeItem",
},
},
orderExchange: {
id: {
linkable: "order_exchange_id",
primaryKey: "id",
serviceName: "order",
field: "orderExchange",
},
},
lineItemAdjustment: {
id: {
linkable: "line_item_adjustment_id",
primaryKey: "id",
serviceName: "order",
field: "lineItemAdjustment",
},
},
lineItemTaxLine: {
id: {
linkable: "line_item_tax_line_id",
primaryKey: "id",
serviceName: "order",
field: "lineItemTaxLine",
},
},
lineItem: {
id: {
linkable: "line_item_id",
primaryKey: "id",
serviceName: "order",
field: "lineItem",
},
},
orderChangeAction: {
id: {
linkable: "order_change_action_id",
primaryKey: "id",
serviceName: "order",
field: "orderChangeAction",
},
},
orderChange: {
id: {
linkable: "order_change_id",
primaryKey: "id",
serviceName: "order",
field: "orderChange",
},
},
orderItem: {
id: {
linkable: "order_item_id",
primaryKey: "id",
serviceName: "order",
field: "orderItem",
},
},
orderShippingMethod: {
id: {
linkable: "order_shipping_method_id",
primaryKey: "id",
serviceName: "order",
field: "orderShippingMethod",
},
},
orderSummary: {
id: {
linkable: "order_summary_id",
primaryKey: "id",
serviceName: "order",
field: "orderSummary",
},
},
order: {
id: {
linkable: "order_id",
primaryKey: "id",
serviceName: "order",
field: "order",
},
},
returnItem: {
id: {
linkable: "return_item_id",
primaryKey: "id",
serviceName: "order",
field: "returnItem",
},
},
returnReason: {
id: {
linkable: "return_reason_id",
primaryKey: "id",
serviceName: "order",
field: "returnReason",
},
},
return: {
id: {
linkable: "return_id",
primaryKey: "id",
serviceName: "order",
field: "return",
},
},
shippingMethodAdjustment: {
id: {
linkable: "shipping_method_adjustment_id",
primaryKey: "id",
serviceName: "order",
field: "shippingMethodAdjustment",
},
},
shippingMethodTaxLine: {
id: {
linkable: "shipping_method_tax_line_id",
primaryKey: "id",
serviceName: "order",
field: "shippingMethodTaxLine",
},
},
shippingMethod: {
id: {
linkable: "shipping_method_id",
primaryKey: "id",
serviceName: "order",
field: "shippingMethod",
},
},
taxLine: {
id: {
linkable: "tax_line_id",
primaryKey: "id",
serviceName: "order",
field: "taxLine",
},
},
transaction: {
id: {
linkable: "transaction_id",
primaryKey: "id",
serviceName: "order",
field: "transaction",
},
},
})
})
})
},
})
+1 -3
View File
@@ -50,8 +50,6 @@
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+4 -12
View File
@@ -1,14 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { OrderModuleService } from "@services"
import { Module, Modules } from "@medusajs/utils"
const service = OrderModuleService
export const moduleDefinition: ModuleExports = {
service,
}
export * from "./models"
export * from "./services"
export * from "./types"
export default moduleDefinition
export default Module(Modules.ORDER, {
service: OrderModuleService,
})
@@ -1,4 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
// TODO: review configuration
export const joinerConfig = defineJoinerConfig(Modules.ORDER)
@@ -5,7 +5,6 @@ import {
FindConfig,
InternalModuleDeclaration,
IOrderModuleService,
ModuleJoinerConfig,
ModulesSdkTypes,
OrderDTO,
OrderTypes,
@@ -65,7 +64,6 @@ import {
UpdateOrderLineItemTaxLineDTO,
UpdateOrderShippingMethodTaxLineDTO,
} from "@types"
import { joinerConfig } from "../joiner-config"
import {
applyChangesToOrder,
ApplyOrderChangeDTO,
@@ -239,10 +237,6 @@ export default class OrderModuleService<
this.orderExchangeService_ = orderExchangeService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
private shouldIncludeTotals(config: FindConfig<any>): boolean {
const totalFields = [
"total",
@@ -1,11 +1,12 @@
import { IPaymentModuleService } from "@medusajs/types"
import { Modules, promiseAll } from "@medusajs/utils"
import { Module, Modules, promiseAll } from "@medusajs/utils"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import {
createPaymentCollections,
createPaymentSessions,
createPayments,
createPaymentSessions,
} from "../../../__fixtures__"
import { PaymentModuleService } from "@services"
jest.setTimeout(30000)
@@ -13,6 +14,49 @@ moduleIntegrationTestRunner<IPaymentModuleService>({
moduleName: Modules.PAYMENT,
testSuite: ({ MikroOrmWrapper, service }) => {
describe("Payment Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.PAYMENT, {
service: PaymentModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"payment",
"paymentCollection",
"paymentProvider",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
payment: {
id: {
linkable: "payment_id",
primaryKey: "id",
serviceName: "payment",
field: "payment",
},
},
paymentCollection: {
id: {
linkable: "payment_collection_id",
primaryKey: "id",
serviceName: "payment",
field: "paymentCollection",
},
},
paymentProvider: {
id: {
linkable: "payment_provider_id",
primaryKey: "id",
serviceName: "payment",
field: "paymentProvider",
},
},
})
})
describe("Payment Flow", () => {
it("complete payment flow successfully", async () => {
let paymentCollection = await service.createPaymentCollections({
+1 -3
View File
@@ -52,8 +52,6 @@
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"bignumber.js": "^9.1.2",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"bignumber.js": "^9.1.2"
}
}
+3 -6
View File
@@ -1,13 +1,10 @@
import { ModuleExports } from "@medusajs/types"
import { PaymentModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
const moduleDefinition: ModuleExports = {
export default Module(Modules.PAYMENT, {
service: PaymentModuleService,
loaders: [loadProviders],
}
export default moduleDefinition
})
export { PaymentModuleOptions } from "./types"
@@ -0,0 +1,63 @@
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { IPricingModuleService } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { PricingModuleService } from "@services"
moduleIntegrationTestRunner<IPricingModuleService>({
moduleName: Modules.PRICING,
testSuite: () => {
describe("PricingModule Service - Calculate Price", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.PRICING, {
service: PricingModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"priceSet",
"priceList",
"price",
"pricePreference",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
priceSet: {
id: {
linkable: "price_set_id",
primaryKey: "id",
serviceName: "pricingService",
field: "priceSet",
},
},
priceList: {
id: {
linkable: "price_list_id",
primaryKey: "id",
serviceName: "pricingService",
field: "priceList",
},
},
price: {
id: {
linkable: "price_id",
primaryKey: "id",
serviceName: "pricingService",
field: "price",
},
},
pricePreference: {
id: {
linkable: "price_preference_id",
primaryKey: "id",
serviceName: "pricingService",
field: "pricePreference",
},
},
})
})
})
},
})
+2 -5
View File
@@ -34,6 +34,7 @@
"orm:cache:clear": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm cache:clear"
},
"devDependencies": {
"@medusajs/types": "^1.11.16",
"@mikro-orm/cli": "5.9.7",
"cross-env": "^5.2.1",
"jest": "^29.7.0",
@@ -45,14 +46,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/types": "^1.11.16",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+4 -8
View File
@@ -1,12 +1,8 @@
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { PricingModuleService } from "@services"
const service = PricingModuleService
export const moduleDefinition: ModuleExports = {
service,
}
export default moduleDefinition
export default Module(Modules.PRICING, {
service: PricingModuleService,
})
export * from "./types"
@@ -3,10 +3,4 @@ import { Price, PriceList, PricePreference, PriceSet } from "@models"
export const joinerConfig = defineJoinerConfig(Modules.PRICING, {
models: [PriceSet, PriceList, Price, PricePreference],
linkableKeys: {
price_set_id: PriceSet.name,
price_list_id: PriceList.name,
price_id: Price.name,
price_preference_id: PricePreference.name,
},
})
@@ -9,9 +9,13 @@ import {
} from "../__fixtures__/product"
import { IProductModuleService, ProductDTO } from "@medusajs/types"
import { kebabCase, Modules, ProductStatus } from "@medusajs/utils"
import { kebabCase, Module, Modules, ProductStatus } from "@medusajs/utils"
import { SqlEntityManager } from "@mikro-orm/postgresql"
import { ProductCategoryService, ProductService } from "@services"
import {
ProductCategoryService,
ProductModuleService,
ProductService,
} from "@services"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import {
categoriesData,
@@ -37,6 +41,94 @@ moduleIntegrationTestRunner<Service>({
categoryService = moduleService.productCategoryService_
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.PRODUCT, {
service: ProductModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"product",
"productVariant",
"productOption",
"productType",
"productImage",
"productTag",
"productCollection",
"productCategory",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
product: {
id: {
linkable: "product_id",
primaryKey: "id",
serviceName: "productService",
field: "product",
},
},
productVariant: {
id: {
linkable: "product_variant_id",
primaryKey: "id",
serviceName: "productService",
field: "productVariant",
},
},
productOption: {
id: {
linkable: "product_option_id",
primaryKey: "id",
serviceName: "productService",
field: "productOption",
},
},
productType: {
id: {
linkable: "product_type_id",
primaryKey: "id",
serviceName: "productService",
field: "productType",
},
},
productImage: {
id: {
linkable: "product_image_id",
primaryKey: "id",
serviceName: "productService",
field: "productImage",
},
},
productTag: {
id: {
linkable: "product_tag_id",
primaryKey: "id",
serviceName: "productService",
field: "productTag",
},
},
productCollection: {
id: {
linkable: "product_collection_id",
primaryKey: "id",
serviceName: "productService",
field: "productCollection",
},
},
productCategory: {
id: {
linkable: "product_category_id",
primaryKey: "id",
serviceName: "productService",
field: "productCategory",
},
},
})
})
describe("Product Service", () => {
let testManager: SqlEntityManager
let products!: Product[]
+1 -5
View File
@@ -47,14 +47,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2",
"lodash": "^4.17.21"
"awilix": "^8.0.0"
}
}
+3 -4
View File
@@ -1,7 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { ProductModuleService } from "@services"
const moduleDefinition: ModuleExports = {
export default Module(Modules.PRODUCT, {
service: ProductModuleService,
}
export default moduleDefinition
})
+20 -43
View File
@@ -1,56 +1,33 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
import {
Product,
ProductCategory,
ProductCollection,
ProductOption,
ProductTag,
ProductType,
ProductVariant,
} from "@models"
import ProductImage from "./models/product-image"
export const joinerConfig = defineJoinerConfig(Modules.PRODUCT, {
models: [
Product,
ProductVariant,
ProductOption,
ProductType,
ProductImage,
ProductTag,
ProductCollection,
ProductCategory,
],
primaryKeys: ["id", "handle"],
// This module provides more alias than the default config builder
alias: [
{
name: ["product", "products"],
args: {
entity: "Product",
},
},
{
name: ["product_variant", "product_variants", "variant", "variants"],
args: {
entity: "ProductVariant",
},
},
{
name: ["product_option", "product_options"],
args: {
entity: "ProductOption",
},
},
{
name: ["product_type", "product_types"],
args: {
entity: "ProductType",
},
},
{
name: ["product_image", "product_images"],
args: {
entity: "ProductImage",
},
},
{
name: ["product_tag", "product_tags"],
args: {
entity: "ProductTag",
},
},
{
name: ["product_collection", "product_collections"],
args: {
entity: "ProductCollection",
},
},
{
name: ["product_category", "product_categories"],
args: {
entity: "ProductCategory",
},
},
],
})
@@ -2,6 +2,7 @@ import { IPromotionModuleService } from "@medusajs/types"
import {
ApplicationMethodType,
CampaignBudgetType,
Module,
Modules,
PromotionType,
} from "@medusajs/utils"
@@ -12,6 +13,7 @@ import {
createDefaultPromotions,
createPromotions,
} from "../../../__fixtures__/promotion"
import { PromotionModuleService } from "@services"
jest.setTimeout(30000)
@@ -26,6 +28,49 @@ moduleIntegrationTestRunner({
await createCampaigns(MikroOrmWrapper.forkManager())
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.PROMOTION, {
service: PromotionModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"promotion",
"campaign",
"promotionRule",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
promotion: {
id: {
linkable: "promotion_id",
primaryKey: "id",
serviceName: "promotion",
field: "promotion",
},
},
campaign: {
id: {
linkable: "campaign_id",
primaryKey: "id",
serviceName: "promotion",
field: "campaign",
},
},
promotionRule: {
id: {
linkable: "promotion_rule_id",
primaryKey: "id",
serviceName: "promotion",
field: "promotionRule",
},
},
})
})
describe("create", () => {
it("should throw an error when required params are not passed", async () => {
const error = await createDefaultPromotion(service, {
+1 -4
View File
@@ -46,13 +46,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+3 -4
View File
@@ -1,7 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { PromotionModuleService } from "@services"
const moduleDefinition: ModuleExports = {
export default Module(Modules.PROMOTION, {
service: PromotionModuleService,
}
export default moduleDefinition
})
@@ -3,9 +3,4 @@ import { Campaign, Promotion, PromotionRule } from "@models"
export const joinerConfig = defineJoinerConfig(Modules.PROMOTION, {
models: [Promotion, Campaign, PromotionRule],
linkableKeys: {
promotion_id: Promotion.name,
campaign_id: Campaign.name,
promotion_rule_id: PromotionRule.name,
},
})
@@ -1,6 +1,7 @@
import { IRegionModuleService } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { RegionModuleService } from "@services"
jest.setTimeout(30000)
@@ -8,6 +9,37 @@ moduleIntegrationTestRunner<IRegionModuleService>({
moduleName: Modules.REGION,
testSuite: ({ service }) => {
describe("Region Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.REGION, {
service: RegionModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["region", "country"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
region: {
id: {
linkable: "region_id",
primaryKey: "id",
serviceName: "region",
field: "region",
},
},
country: {
iso_2: {
linkable: "country_iso_2",
primaryKey: "iso_2",
serviceName: "region",
field: "country",
},
},
})
})
it("should create countries on application start", async () => {
const countries = await service.listCountries({}, { take: null })
expect(countries.length).toEqual(250)
+1 -4
View File
@@ -45,13 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.REGION)
@@ -6,7 +6,6 @@ import {
InferEntityType,
InternalModuleDeclaration,
IRegionModuleService,
ModuleJoinerConfig,
ModulesSdkTypes,
RegionCountryDTO,
RegionDTO,
@@ -28,7 +27,6 @@ import {
} from "@medusajs/utils"
import { Country, Region } from "@models"
import { UpdateRegionInput } from "@types"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -68,10 +66,6 @@ export default class RegionModuleService
this.countryService_ = countryService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
async createRegions(
data: CreateRegionDTO[],
@@ -1,6 +1,7 @@
import { ISalesChannelModuleService } from "@medusajs/types"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { SalesChannelModuleService } from "@services"
jest.setTimeout(30000)
@@ -33,6 +34,29 @@ moduleIntegrationTestRunner<ISalesChannelModuleService>({
await service.createSalesChannels(salesChannelData)
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.SALES_CHANNEL, {
service: SalesChannelModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["salesChannel"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
salesChannel: {
id: {
linkable: "sales_channel_id",
primaryKey: "id",
serviceName: "salesChannel",
field: "salesChannel",
},
},
})
})
describe("create", () => {
it("should create a SalesChannel successfully", async () => {
const [created] = await service.createSalesChannels([
+2 -5
View File
@@ -34,6 +34,7 @@
"orm:cache:clear": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm cache:clear"
},
"devDependencies": {
"@medusajs/types": "^1.11.14",
"@mikro-orm/cli": "5.9.7",
"cross-env": "^5.2.1",
"jest": "^29.7.0",
@@ -44,14 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.9",
"@medusajs/types": "^1.11.14",
"@medusajs/utils": "^1.11.7",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+3 -4
View File
@@ -1,7 +1,6 @@
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
import { SalesChannelModuleService } from "@services"
const moduleDefinition: ModuleExports = {
export default Module(Modules.SALES_CHANNEL, {
service: SalesChannelModuleService,
}
export default moduleDefinition
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.SALES_CHANNEL)
@@ -5,7 +5,6 @@ import {
FilterableSalesChannelProps,
InternalModuleDeclaration,
ISalesChannelModuleService,
ModuleJoinerConfig,
ModulesSdkTypes,
SalesChannelDTO,
UpdateSalesChannelDTO,
@@ -22,7 +21,6 @@ import {
import { SalesChannel } from "@models"
import { UpdateSalesChanneInput } from "@types"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -48,10 +46,6 @@ export default class SalesChannelModuleService
this.salesChannelService_ = salesChannelService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
async createSalesChannels(
data: CreateSalesChannelDTO[],
@@ -1,7 +1,8 @@
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { IStockLocationService } from "@medusajs/types"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { StockLocationModuleService } from "../../src/services"
jest.setTimeout(100000)
@@ -9,6 +10,29 @@ moduleIntegrationTestRunner<IStockLocationService>({
moduleName: Modules.STOCK_LOCATION,
testSuite: ({ service }) => {
describe("Stock Location Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.STOCK_LOCATION, {
service: StockLocationModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["stockLocation"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
stockLocation: {
location_id: {
linkable: "location_id",
primaryKey: "location_id",
serviceName: "stockLocationService",
field: "stockLocation",
},
},
})
})
describe("create", () => {
it("should create a stock location", async () => {
const data = { name: "location" }
@@ -36,9 +36,7 @@
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
},
"scripts": {
"watch": "tsc --build --watch",
@@ -1,7 +1,8 @@
import { IStoreModuleService } from "@medusajs/types"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { createStoreFixture } from "../__fixtures__"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { StoreModuleService } from "@services"
jest.setTimeout(100000)
@@ -9,6 +10,37 @@ moduleIntegrationTestRunner<IStoreModuleService>({
moduleName: Modules.STORE,
testSuite: ({ service }) => {
describe("Store Module Service", () => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.STORE, {
service: StoreModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["storeCurrency", "store"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
storeCurrency: {
id: {
linkable: "store_currency_id",
primaryKey: "id",
serviceName: "store",
field: "storeCurrency",
},
},
store: {
id: {
linkable: "store_id",
primaryKey: "id",
serviceName: "store",
field: "store",
},
},
})
})
describe("creating a store", () => {
it("should get created successfully", async function () {
const store = await service.createStores(createStoreFixture)
+1 -4
View File
@@ -45,13 +45,10 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+3 -5
View File
@@ -1,8 +1,6 @@
import { StoreModuleService } from "@services"
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
export const moduleDefinition: ModuleExports = {
export default Module(Modules.STORE, {
service: StoreModuleService,
}
export default moduleDefinition
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.STORE)
@@ -3,7 +3,6 @@ import {
DAL,
InternalModuleDeclaration,
IStoreModuleService,
ModuleJoinerConfig,
ModulesSdkTypes,
StoreTypes,
} from "@medusajs/types"
@@ -20,7 +19,6 @@ import {
} from "@medusajs/utils"
import { Store, StoreCurrency } from "@models"
import { joinerConfig } from "../joiner-config"
import { UpdateStoreInput } from "@types"
type InjectedDependencies = {
@@ -48,10 +46,6 @@ export default class StoreModuleService
this.storeService_ = storeService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
async createStores(
data: StoreTypes.CreateStoreDTO[],
@@ -1,7 +1,8 @@
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { ITaxModuleService } from "@medusajs/types"
import { setupTaxStructure } from "../utils/setup-tax-structure"
import { Modules } from "@medusajs/utils"
import { Module, Modules } from "@medusajs/utils"
import { TaxModuleService } from "@services"
jest.setTimeout(30000)
@@ -9,6 +10,58 @@ moduleIntegrationTestRunner<ITaxModuleService>({
moduleName: Modules.TAX,
testSuite: ({ service }) => {
describe("TaxModuleService", function () {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.TAX, {
service: TaxModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual([
"taxProvider",
"taxRateRule",
"taxRate",
"taxRegion",
])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
taxProvider: {
id: {
linkable: "tax_provider_id",
primaryKey: "id",
serviceName: "tax",
field: "taxProvider",
},
},
taxRateRule: {
id: {
linkable: "tax_rate_rule_id",
primaryKey: "id",
serviceName: "tax",
field: "taxRateRule",
},
},
taxRate: {
id: {
linkable: "tax_rate_id",
primaryKey: "id",
serviceName: "tax",
field: "taxRate",
},
},
taxRegion: {
id: {
linkable: "tax_region_id",
primaryKey: "id",
serviceName: "tax",
field: "taxRegion",
},
},
})
})
it("should create tax rates and update them", async () => {
const region = await service.createTaxRegions({
country_code: "US",
+2 -4
View File
@@ -34,6 +34,7 @@
"orm:cache:clear": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm cache:clear"
},
"devDependencies": {
"@medusajs/types": "^1.11.14",
"@mikro-orm/cli": "5.9.7",
"cross-env": "^5.2.1",
"jest": "^29.7.0",
@@ -45,13 +46,10 @@
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.9",
"@medusajs/types": "^1.11.14",
"@medusajs/utils": "^1.11.7",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"awilix": "^8.0.0"
}
}
+5 -10
View File
@@ -1,13 +1,8 @@
import { ModuleExports } from "@medusajs/types"
import { TaxModuleService } from "@services"
import loadProviders from "./loaders/providers"
import { Module, Modules } from "@medusajs/utils"
const service = TaxModuleService
const loaders = [loadProviders]
export const moduleDefinition: ModuleExports = {
service,
loaders,
}
export default moduleDefinition
export default Module(Modules.TAX, {
service: TaxModuleService,
loaders: [loadProviders],
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.TAX)
@@ -4,7 +4,6 @@ import {
InternalModuleDeclaration,
ITaxModuleService,
ITaxProvider,
ModuleJoinerConfig,
ModulesSdkTypes,
TaxRegionDTO,
TaxTypes,
@@ -20,7 +19,6 @@ import {
promiseAll,
} from "@medusajs/utils"
import { TaxProvider, TaxRate, TaxRateRule, TaxRegion } from "@models"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -75,10 +73,6 @@ export default class TaxModuleService
this.taxProviderService_ = taxProviderService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
// @ts-expect-error
async createTaxRates(
data: TaxTypes.CreateTaxRateDTO[],
@@ -1,9 +1,10 @@
import { IUserModuleService } from "@medusajs/types"
import { Modules, UserEvents } from "@medusajs/utils"
import { Module, Modules, UserEvents } from "@medusajs/utils"
import {
MockEventBusService,
moduleIntegrationTestRunner,
} from "medusa-test-utils"
import { UserModuleService } from "@services"
jest.setTimeout(30000)
@@ -27,6 +28,37 @@ moduleIntegrationTestRunner<IUserModuleService>({
eventBusModuleService: new MockEventBusService(),
},
testSuite: ({ service }) => {
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.USER, {
service: UserModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["invite", "user"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
invite: {
id: {
linkable: "invite_id",
primaryKey: "id",
serviceName: "user",
field: "invite",
},
},
user: {
id: {
linkable: "user_id",
primaryKey: "id",
serviceName: "user",
field: "user",
},
},
})
})
describe("UserModuleService - User", () => {
afterEach(async () => {
jest.clearAllMocks()
+1 -4
View File
@@ -47,14 +47,11 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.10",
"@medusajs/utils": "^1.11.8",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"dotenv": "^16.4.5",
"jsonwebtoken": "^9.0.2",
"knex": "2.4.2"
"jsonwebtoken": "^9.0.2"
}
}
+3 -4
View File
@@ -1,7 +1,6 @@
import { UserModuleService } from "@services"
import { ModuleExports } from "@medusajs/types"
import { Module, Modules } from "@medusajs/utils"
const moduleDefinition: ModuleExports = {
export default Module(Modules.USER, {
service: UserModuleService,
}
export default moduleDefinition
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.USER)
@@ -3,7 +3,6 @@ import {
DAL,
IEventBusModuleService,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
UserTypes,
} from "@medusajs/types"
@@ -19,7 +18,6 @@ import {
UserEvents,
} from "@medusajs/utils"
import jwt, { JwtPayload } from "jsonwebtoken"
import { joinerConfig } from "../joiner-config"
import crypto from "node:crypto"
import { Invite, User } from "@models"
@@ -44,10 +42,6 @@ export default class UserModuleService
}>({ User, Invite })
implements UserTypes.IUserModuleService
{
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
protected baseRepository_: DAL.RepositoryService
protected readonly userService_: ModulesSdkTypes.IMedusaInternalService<User>
@@ -4,7 +4,7 @@ import {
IWorkflowEngineService,
RemoteQueryFunction,
} from "@medusajs/types"
import { Modules, TransactionHandlerType } from "@medusajs/utils"
import { Module, Modules, TransactionHandlerType } from "@medusajs/utils"
import { moduleIntegrationTestRunner } from "medusa-test-utils"
import { setTimeout as setTimeoutPromise } from "timers/promises"
import "../__fixtures__"
@@ -20,6 +20,7 @@ import {
workflowEventGroupIdStep2Mock,
} from "../__fixtures__/workflow_event_group_id"
import { createScheduled } from "../__fixtures__/workflow_scheduled"
import { WorkflowsModuleService } from "@services"
jest.setTimeout(100000)
@@ -34,6 +35,29 @@ moduleIntegrationTestRunner<IWorkflowEngineService>({
query = medusaApp.query
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.WORKFLOW_ENGINE, {
service: WorkflowsModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["workflowExecution"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
workflowExecution: {
id: {
linkable: "workflow_execution_id",
primaryKey: "id",
serviceName: "workflows",
field: "workflowExecution",
},
},
})
})
it("should execute an async workflow keeping track of the event group id provided in the context", async () => {
const eventGroupId = "event-group-id"
@@ -45,15 +45,12 @@
"typescript": "^5.1.6"
},
"dependencies": {
"@medusajs/modules-sdk": "^1.12.11",
"@medusajs/utils": "^1.11.9",
"@medusajs/workflows-sdk": "^0.1.6",
"@mikro-orm/core": "5.9.7",
"@mikro-orm/migrations": "5.9.7",
"@mikro-orm/postgresql": "5.9.7",
"awilix": "^8.0.0",
"cron-parser": "^4.9.0",
"dotenv": "^16.4.5",
"knex": "2.4.2"
"cron-parser": "^4.9.0"
}
}
@@ -1,6 +1,8 @@
import { moduleDefinition } from "./module-definition"
import { Module, Modules } from "@medusajs/utils"
import { WorkflowsModuleService } from "@services"
import { loadUtils } from "./loaders"
export default moduleDefinition
export * from "./loaders"
export * from "./models"
export default Module(Modules.WORKFLOW_ENGINE, {
service: WorkflowsModuleService,
loaders: [loadUtils],
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.WORKFLOW_ENGINE)
@@ -1 +1 @@
export * from "./utils"
export { default as loadUtils } from "./utils"
@@ -1,11 +0,0 @@
import { ModuleExports } from "@medusajs/types"
import { WorkflowsModuleService } from "@services"
import loadUtils from "./loaders/utils"
const service = WorkflowsModuleService
const loaders = [loadUtils]
export const moduleDefinition: ModuleExports = {
service,
loaders,
}
@@ -2,7 +2,6 @@ import {
Context,
DAL,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
WorkflowsSdkTypes,
} from "@medusajs/types"
@@ -17,7 +16,6 @@ import type {
} from "@medusajs/workflows-sdk"
import { WorkflowExecution } from "@models"
import { WorkflowOrchestratorService } from "@services"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -50,10 +48,6 @@ export class WorkflowsModuleService<
this.workflowOrchestratorService_ = workflowOrchestratorService
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
@InjectSharedContext()
async run<TWorkflow extends string | ReturnWorkflow<any, any, any>>(
workflowIdOrWorkflow: TWorkflow,
@@ -11,9 +11,11 @@ import {
} from "@medusajs/types"
import {
ContainerRegistrationKeys,
createMedusaContainer,
Module,
Modules,
TransactionHandlerType,
TransactionStepState,
createMedusaContainer,
} from "@medusajs/utils"
import { asValue } from "awilix"
import { knex } from "knex"
@@ -21,6 +23,7 @@ import { setTimeout } from "timers/promises"
import "../__fixtures__"
import { createScheduled } from "../__fixtures__/workflow_scheduled"
import { DB_URL, TestDatabase } from "../utils"
import { WorkflowsModuleService } from "@medusajs/workflow-engine-inmemory/dist/services"
jest.setTimeout(100000)
@@ -78,6 +81,29 @@ describe("Workflow Orchestrator module", function () {
workflowOrcModule = modules.workflows as unknown as IWorkflowEngineService
})
it(`should export the appropriate linkable configuration`, () => {
const linkable = Module(Modules.WORKFLOW_ENGINE, {
service: WorkflowsModuleService,
}).linkable
expect(Object.keys(linkable)).toEqual(["workflowExecution"])
Object.keys(linkable).forEach((key) => {
delete linkable[key].toJSON
})
expect(linkable).toEqual({
workflowExecution: {
id: {
linkable: "workflow_execution_id",
primaryKey: "id",
serviceName: "workflows",
field: "workflowExecution",
},
},
})
})
describe("Testing basic workflow", function () {
afterEach(afterEach_)
@@ -1,6 +1,8 @@
import { moduleDefinition } from "./module-definition"
import { Module, Modules } from "@medusajs/utils"
import { WorkflowsModuleService } from "@services"
import { loadUtils, redisConnection } from "./loaders"
export default moduleDefinition
export * from "./loaders"
export * from "./models"
export default Module(Modules.WORKFLOW_ENGINE, {
service: WorkflowsModuleService,
loaders: [loadUtils, redisConnection] as any[],
})
@@ -1,3 +0,0 @@
import { defineJoinerConfig, Modules } from "@medusajs/utils"
export const joinerConfig = defineJoinerConfig(Modules.WORKFLOW_ENGINE)
@@ -1,2 +1,2 @@
export * from "./redis"
export * from "./utils"
export { default as redisConnection } from "./redis"
export { default as loadUtils } from "./utils"
@@ -1,12 +0,0 @@
import { ModuleExports } from "@medusajs/types"
import { WorkflowsModuleService } from "@services"
import redisConnection from "./loaders/redis"
import loadUtils from "./loaders/utils"
const service = WorkflowsModuleService
const loaders = [loadUtils, redisConnection] as any
export const moduleDefinition: ModuleExports = {
service,
loaders,
}
@@ -2,7 +2,6 @@ import {
Context,
DAL,
InternalModuleDeclaration,
ModuleJoinerConfig,
ModulesSdkTypes,
WorkflowsSdkTypes,
} from "@medusajs/types"
@@ -17,7 +16,6 @@ import type {
} from "@medusajs/workflows-sdk"
import { WorkflowExecution } from "@models"
import { WorkflowOrchestratorService } from "@services"
import { joinerConfig } from "../joiner-config"
type InjectedDependencies = {
baseRepository: DAL.RepositoryService
@@ -54,10 +52,6 @@ export class WorkflowsModuleService<
this.redisDisconnectHandler_ = redisDisconnectHandler
}
__joinerConfig(): ModuleJoinerConfig {
return joinerConfig
}
__hooks = {
onApplicationShutdown: async () => {
await this.workflowOrchestratorService_.onApplicationShutdown()