breaking: remove deprecated commands and code (#9521)
* breaking: remove deprecated commands * feat: remove deprecated code and usages * refactor: remove more logic around default relations * fix tests * remove log * fix: remove defaultFields usage * fix: add back accidentally removed code * refactor: implement feedback * feat: add --cluster flag to the start command * refactor: assign limit to defaultLimit property * fix: breaking code because of removed check --------- Co-authored-by: adrien2p <adrien.deperetti@gmail.com>
This commit is contained in:
1 parent
cea4cdc8d7
commit
ad322f2760
37 files changed
+162
-679
No files matched your search
@@ -1,7 +1,6 @@
|
|||||||
import { sync as existsSync } from "fs-exists-cached"
|
import { sync as existsSync } from "fs-exists-cached"
|
||||||
import { setTelemetryEnabled } from "medusa-telemetry"
|
import { setTelemetryEnabled } from "medusa-telemetry"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
|
||||||
import resolveCwd from "resolve-cwd"
|
import resolveCwd from "resolve-cwd"
|
||||||
import { newStarter } from "./commands/new"
|
import { newStarter } from "./commands/new"
|
||||||
import { didYouMean } from "./did-you-mean"
|
import { didYouMean } from "./did-you-mean"
|
||||||
@@ -278,66 +277,6 @@ function buildLocalCommands(cli, isLocalProject) {
|
|||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
.command({
|
|
||||||
command: `seed`,
|
|
||||||
desc: `Migrates and populates the database with the provided file.`,
|
|
||||||
builder: (_) =>
|
|
||||||
_.option(`f`, {
|
|
||||||
alias: `seed-file`,
|
|
||||||
type: `string`,
|
|
||||||
describe: `Path to the file where the seed is defined.`,
|
|
||||||
required: true,
|
|
||||||
}).option(`m`, {
|
|
||||||
alias: `migrate`,
|
|
||||||
type: `boolean`,
|
|
||||||
default: true,
|
|
||||||
describe: `Flag to indicate if migrations should be run prior to seeding the database`,
|
|
||||||
}),
|
|
||||||
handler: handlerP(
|
|
||||||
getCommandHandler(`seed`, (args, cmd) => {
|
|
||||||
process.env.NODE_ENV ??= `development`
|
|
||||||
return cmd(args)
|
|
||||||
})
|
|
||||||
),
|
|
||||||
})
|
|
||||||
.command({
|
|
||||||
command: `migrations [action] [modules...]`,
|
|
||||||
desc: `Manage migrations from the core and your own project`,
|
|
||||||
builder: {
|
|
||||||
action: {
|
|
||||||
demand: true,
|
|
||||||
description: "The action to perform on migrations",
|
|
||||||
choices: ["run", "revert", "show", "generate"],
|
|
||||||
},
|
|
||||||
modules: {
|
|
||||||
description: "Modules for which to run the action (revert, generate)",
|
|
||||||
demand: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
handler: handlerP(
|
|
||||||
getCommandHandler(`migrate`, (args, cmd) => {
|
|
||||||
process.env.NODE_ENV = process.env.NODE_ENV || `development`
|
|
||||||
return cmd(args)
|
|
||||||
})
|
|
||||||
),
|
|
||||||
})
|
|
||||||
.command({
|
|
||||||
command: `links [action]`,
|
|
||||||
desc: `Manage migrations for the links from the core, your project and packages`,
|
|
||||||
builder: {
|
|
||||||
action: {
|
|
||||||
demand: true,
|
|
||||||
description: "The action to perform on links",
|
|
||||||
choices: ["sync"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
handler: handlerP(
|
|
||||||
getCommandHandler(`links`, (args, cmd) => {
|
|
||||||
process.env.NODE_ENV = process.env.NODE_ENV || `development`
|
|
||||||
return cmd(args)
|
|
||||||
})
|
|
||||||
),
|
|
||||||
})
|
|
||||||
.command({
|
.command({
|
||||||
command: `develop`,
|
command: `develop`,
|
||||||
desc: `Start development server. Watches file and rebuilds when something changes`,
|
desc: `Start development server. Watches file and rebuilds when something changes`,
|
||||||
@@ -397,6 +336,12 @@ function buildLocalCommands(cli, isLocalProject) {
|
|||||||
describe: process.env.PORT
|
describe: process.env.PORT
|
||||||
? `Set port. Defaults to ${process.env.PORT} (set by env.PORT) (otherwise defaults ${defaultPort})`
|
? `Set port. Defaults to ${process.env.PORT} (set by env.PORT) (otherwise defaults ${defaultPort})`
|
||||||
: `Set port. Defaults to ${defaultPort}`,
|
: `Set port. Defaults to ${defaultPort}`,
|
||||||
|
})
|
||||||
|
.option(`cluster`, {
|
||||||
|
type: `number`,
|
||||||
|
default: process.env.CPUS,
|
||||||
|
describe:
|
||||||
|
"Start the Node.js server in cluster mode. You can specify the number of cpus to use, which defaults to (env.CPUS)",
|
||||||
}),
|
}),
|
||||||
handler: handlerP(
|
handler: handlerP(
|
||||||
getCommandHandler(`start`, (args, cmd) => {
|
getCommandHandler(`start`, (args, cmd) => {
|
||||||
@@ -422,42 +367,6 @@ function buildLocalCommands(cli, isLocalProject) {
|
|||||||
})
|
})
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
.command({
|
|
||||||
command: `start-cluster`,
|
|
||||||
desc: `Start development server in cluster mode (beta).`,
|
|
||||||
builder: (_) =>
|
|
||||||
_.option(`H`, {
|
|
||||||
alias: `host`,
|
|
||||||
type: `string`,
|
|
||||||
default: defaultHost,
|
|
||||||
describe: `Set host. Defaults to ${defaultHost}`,
|
|
||||||
})
|
|
||||||
.option(`p`, {
|
|
||||||
alias: `port`,
|
|
||||||
type: `string`,
|
|
||||||
default: process.env.PORT || defaultPort,
|
|
||||||
describe: process.env.PORT
|
|
||||||
? `Set port. Defaults to ${process.env.PORT} (set by env.PORT) (otherwise defaults ${defaultPort})`
|
|
||||||
: `Set port. Defaults to ${defaultPort}`,
|
|
||||||
})
|
|
||||||
.option(`c`, {
|
|
||||||
alias: `cpus`,
|
|
||||||
type: `number`,
|
|
||||||
default: process.env.CPUS,
|
|
||||||
describe:
|
|
||||||
"Set number of cpus to use. Defaults to max number of cpus available on the system (set by env.CPUS)",
|
|
||||||
}),
|
|
||||||
handler: handlerP(
|
|
||||||
getCommandHandler(`start-cluster`, (args, cmd) => {
|
|
||||||
process.env.NODE_ENV = process.env.NODE_ENV || `development`
|
|
||||||
cmd(args)
|
|
||||||
// Return an empty promise to prevent handlerP from exiting early.
|
|
||||||
// The development server shouldn't ever exit until the user directly
|
|
||||||
// kills it so this is fine.
|
|
||||||
return new Promise((resolve) => {})
|
|
||||||
})
|
|
||||||
),
|
|
||||||
})
|
|
||||||
.command({
|
.command({
|
||||||
command: `user`,
|
command: `user`,
|
||||||
desc: `Create a user`,
|
desc: `Create a user`,
|
||||||
|
|||||||
@@ -256,15 +256,6 @@ export type ProjectConfigOptions = {
|
|||||||
*/
|
*/
|
||||||
databaseLogging?: boolean
|
databaseLogging?: boolean
|
||||||
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
* @deprecated
|
|
||||||
*
|
|
||||||
* @privateRemarks
|
|
||||||
* only postgres is supported, so this config has no effect
|
|
||||||
*/
|
|
||||||
databaseType?: string
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This configuration is used to pass additional options to the database connection. You can pass any configuration. For example, pass the
|
* This configuration is used to pass additional options to the database connection. You can pass any configuration. For example, pass the
|
||||||
* `ssl` property that enables support for TLS/SSL connections.
|
* `ssl` property that enables support for TLS/SSL connections.
|
||||||
@@ -391,19 +382,6 @@ export type ProjectConfigOptions = {
|
|||||||
*/
|
*/
|
||||||
sessionOptions?: SessionOptions
|
sessionOptions?: SessionOptions
|
||||||
|
|
||||||
/**
|
|
||||||
* This property configures the HTTP compression from the application layer. If you have access to the HTTP server, the recommended approach would be to enable it there.
|
|
||||||
* However, some platforms don't offer access to the HTTP layer and in those cases, this is a good alternative.
|
|
||||||
*
|
|
||||||
* If you enable HTTP compression and you want to disable it for specific API Routes, you can pass in the request header `"x-no-compression": true`.
|
|
||||||
*
|
|
||||||
* @ignore
|
|
||||||
*
|
|
||||||
* @deprecated use {@link http }'s `compression` property instead.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
httpCompression?: HttpCompressionOptions
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the number of staged jobs that are polled from the database. Default is `1000`.
|
* Configure the number of staged jobs that are polled from the database. Default is `1000`.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import z from "zod"
|
import z from "zod"
|
||||||
import { MedusaError } from "@medusajs/utils"
|
import { MedusaError } from "@medusajs/utils"
|
||||||
import { validateAndTransformQuery } from "../utils/validate-query"
|
import { validateAndTransformQuery } from "../utils/validate-query"
|
||||||
import { MedusaRequest, MedusaResponse, MedusaNextFunction } from "../types"
|
import { MedusaNextFunction, MedusaRequest, MedusaResponse } from "../types"
|
||||||
|
|
||||||
export const createSelectParams = () => {
|
export const createSelectParams = () => {
|
||||||
return z.object({
|
return z.object({
|
||||||
@@ -124,7 +124,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let queryConfig: any = {
|
let queryConfig: any = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
@@ -134,12 +134,6 @@ describe("validateAndTransformQuery", () => {
|
|||||||
"metadata.children.id",
|
"metadata.children.id",
|
||||||
"metadata.product.id",
|
"metadata.product.id",
|
||||||
],
|
],
|
||||||
defaultRelations: [
|
|
||||||
"metadata",
|
|
||||||
"metadata.parent",
|
|
||||||
"metadata.children",
|
|
||||||
"metadata.product",
|
|
||||||
],
|
|
||||||
isList: true,
|
isList: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +210,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
const nextFunction: MedusaNextFunction = jest.fn()
|
const nextFunction: MedusaNextFunction = jest.fn()
|
||||||
|
|
||||||
let queryConfig: any = {
|
let queryConfig: any = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
@@ -226,12 +220,6 @@ describe("validateAndTransformQuery", () => {
|
|||||||
"metadata.children.id",
|
"metadata.children.id",
|
||||||
"metadata.product.id",
|
"metadata.product.id",
|
||||||
],
|
],
|
||||||
defaultRelations: [
|
|
||||||
"metadata",
|
|
||||||
"metadata.parent",
|
|
||||||
"metadata.children",
|
|
||||||
"metadata.product",
|
|
||||||
],
|
|
||||||
isList: true,
|
isList: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +240,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
} as unknown as MedusaRequest
|
} as unknown as MedusaRequest
|
||||||
|
|
||||||
queryConfig = {
|
queryConfig = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"prop-test-something",
|
"prop-test-something",
|
||||||
"created_at",
|
"created_at",
|
||||||
@@ -263,12 +251,6 @@ describe("validateAndTransformQuery", () => {
|
|||||||
"metadata.children.id",
|
"metadata.children.id",
|
||||||
"metadata.product.id",
|
"metadata.product.id",
|
||||||
],
|
],
|
||||||
defaultRelations: [
|
|
||||||
"metadata",
|
|
||||||
"metadata.parent",
|
|
||||||
"metadata.children",
|
|
||||||
"metadata.product",
|
|
||||||
],
|
|
||||||
isList: true,
|
isList: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,7 +397,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
} as unknown as MedusaRequest
|
} as unknown as MedusaRequest
|
||||||
|
|
||||||
queryConfig = {
|
queryConfig = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"deleted_at",
|
"deleted_at",
|
||||||
@@ -467,7 +449,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
const nextFunction: MedusaNextFunction = jest.fn()
|
const nextFunction: MedusaNextFunction = jest.fn()
|
||||||
|
|
||||||
let queryConfig: any = {
|
let queryConfig: any = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
@@ -514,7 +496,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
} as unknown as MedusaRequest
|
} as unknown as MedusaRequest
|
||||||
|
|
||||||
queryConfig = {
|
queryConfig = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
@@ -561,7 +543,7 @@ describe("validateAndTransformQuery", () => {
|
|||||||
} as unknown as MedusaRequest
|
} as unknown as MedusaRequest
|
||||||
|
|
||||||
queryConfig = {
|
queryConfig = {
|
||||||
defaultFields: [
|
defaults: [
|
||||||
"id",
|
"id",
|
||||||
"created_at",
|
"created_at",
|
||||||
"deleted_at",
|
"deleted_at",
|
||||||
|
|||||||
@@ -123,15 +123,10 @@ export interface MedusaRequest<Body = unknown>
|
|||||||
*/
|
*/
|
||||||
filterableFields: Record<string, unknown>
|
filterableFields: Record<string, unknown>
|
||||||
includes?: Record<string, boolean>
|
includes?: Record<string, boolean>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An array of fields and relations that are allowed to be queried, this can be set by the
|
* An array of fields and relations that are allowed to be queried, this can be set by the
|
||||||
* consumer as part of a middleware and it will take precedence over the defaultAllowedFields
|
* consumer as part of a middleware and it will take precedence over the req.allowed set
|
||||||
* @deprecated use `allowed` instead
|
|
||||||
*/
|
|
||||||
allowedFields?: string[]
|
|
||||||
/**
|
|
||||||
* An array of fields and relations that are allowed to be queried, this can be set by the
|
|
||||||
* consumer as part of a middleware and it will take precedence over the defaultAllowedFields set
|
|
||||||
* by the api
|
* by the api
|
||||||
*/
|
*/
|
||||||
allowed?: string[]
|
allowed?: string[]
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import {
|
|||||||
isDefined,
|
isDefined,
|
||||||
isPresent,
|
isPresent,
|
||||||
MedusaError,
|
MedusaError,
|
||||||
getSetDifference,
|
|
||||||
stringToSelectRelationObject,
|
stringToSelectRelationObject,
|
||||||
} from "@medusajs/utils"
|
} from "@medusajs/utils"
|
||||||
|
|
||||||
@@ -28,28 +27,15 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
validated: T,
|
validated: T,
|
||||||
queryConfig: QueryConfig<TEntity> = {}
|
queryConfig: QueryConfig<TEntity> = {}
|
||||||
) {
|
) {
|
||||||
// TODO: this function will be simplified a lot once we drop support for the old api
|
let { allowed = [], defaults = [], defaultLimit = 50, isList } = queryConfig
|
||||||
const { order, fields, limit = 50, expand, offset = 0 } = validated
|
const { order, fields, limit = defaultLimit, offset = 0 } = validated
|
||||||
let {
|
|
||||||
allowed = [],
|
|
||||||
defaults = [],
|
|
||||||
defaultFields = [],
|
|
||||||
defaultLimit,
|
|
||||||
allowedFields = [],
|
|
||||||
allowedRelations = [],
|
|
||||||
defaultRelations = [],
|
|
||||||
isList,
|
|
||||||
} = queryConfig
|
|
||||||
|
|
||||||
allowedFields = allowed.length ? allowed : allowedFields
|
|
||||||
defaultFields = defaults.length ? defaults : defaultFields
|
|
||||||
|
|
||||||
// e.g *product.variants meaning that we want all fields from the product.variants
|
// e.g *product.variants meaning that we want all fields from the product.variants
|
||||||
// in that case it wont be part of the select but it will be part of the relations.
|
// in that case it wont be part of the select but it will be part of the relations.
|
||||||
// For the remote query we will have to add the fields to the fields array as product.variants.*
|
// For the remote query we will have to add the fields to the fields array as product.variants.*
|
||||||
const starFields: Set<string> = new Set()
|
const starFields: Set<string> = new Set()
|
||||||
|
|
||||||
let allFields = new Set(defaultFields) as Set<string>
|
let allFields = new Set(defaults) as Set<string>
|
||||||
|
|
||||||
if (isDefined(fields)) {
|
if (isDefined(fields)) {
|
||||||
const customFields = fields.split(",").filter(Boolean)
|
const customFields = fields.split(",").filter(Boolean)
|
||||||
@@ -90,9 +76,9 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
|
|
||||||
const notAllowedFields: string[] = []
|
const notAllowedFields: string[] = []
|
||||||
|
|
||||||
if (allowedFields.length) {
|
if (allowed.length) {
|
||||||
;[...allFields, ...Array.from(starFields)].forEach((field) => {
|
;[...allFields, ...Array.from(starFields)].forEach((field) => {
|
||||||
const hasAllowedField = allowedFields.includes(field)
|
const hasAllowedField = allowed.includes(field)
|
||||||
|
|
||||||
if (hasAllowedField) {
|
if (hasAllowedField) {
|
||||||
return
|
return
|
||||||
@@ -108,7 +94,7 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const fieldStartsWithAllowedField = allowedFields.some((allowedField) =>
|
const fieldStartsWithAllowedField = allowed.some((allowedField) =>
|
||||||
field.startsWith(allowedField)
|
field.startsWith(allowedField)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -133,33 +119,8 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
Array.from(allFields)
|
Array.from(allFields)
|
||||||
)
|
)
|
||||||
|
|
||||||
let allRelations = new Set([
|
let allRelations = new Set([...relations, ...Array.from(starFields)])
|
||||||
...relations,
|
|
||||||
...defaultRelations,
|
|
||||||
...Array.from(starFields),
|
|
||||||
])
|
|
||||||
|
|
||||||
if (isDefined(expand)) {
|
|
||||||
allRelations = new Set(expand.split(",").filter(Boolean))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allowedRelations.length && expand) {
|
|
||||||
const allAllowedRelations = new Set([...allowedRelations])
|
|
||||||
|
|
||||||
const notAllowedRelations = getSetDifference(
|
|
||||||
allRelations,
|
|
||||||
allAllowedRelations
|
|
||||||
)
|
|
||||||
|
|
||||||
if (allRelations.size && notAllowedRelations.size) {
|
|
||||||
throw new MedusaError(
|
|
||||||
MedusaError.Types.INVALID_DATA,
|
|
||||||
`Requested fields [${Array.from(notAllowedRelations).join(
|
|
||||||
", "
|
|
||||||
)}] are not valid`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// End of expand compatibility
|
// End of expand compatibility
|
||||||
|
|
||||||
let orderBy: { [k: symbol]: "DESC" | "ASC" } | undefined = {}
|
let orderBy: { [k: symbol]: "DESC" | "ASC" } | undefined = {}
|
||||||
@@ -173,10 +134,7 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
orderBy = { [order]: "ASC" }
|
orderBy = { [order]: "ASC" }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (allowed.length && !allowed.includes(orderField)) {
|
||||||
queryConfig?.allowedFields?.length &&
|
|
||||||
!queryConfig?.allowedFields.includes(orderField)
|
|
||||||
) {
|
|
||||||
throw new MedusaError(
|
throw new MedusaError(
|
||||||
MedusaError.Types.INVALID_DATA,
|
MedusaError.Types.INVALID_DATA,
|
||||||
`Order field ${orderField} is not valid`
|
`Order field ${orderField} is not valid`
|
||||||
@@ -190,7 +148,7 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
select: select.length ? select : undefined,
|
select: select.length ? select : undefined,
|
||||||
relations: Array.from(allRelations),
|
relations: Array.from(allRelations),
|
||||||
skip: offset,
|
skip: offset,
|
||||||
take: limit ?? defaultLimit,
|
take: limit,
|
||||||
order: finalOrder,
|
order: finalOrder,
|
||||||
},
|
},
|
||||||
remoteQueryConfig: {
|
remoteQueryConfig: {
|
||||||
@@ -202,7 +160,7 @@ export function prepareListQuery<T extends RequestQueryFields, TEntity>(
|
|||||||
pagination: isList
|
pagination: isList
|
||||||
? {
|
? {
|
||||||
skip: offset,
|
skip: offset,
|
||||||
take: limit ?? defaultLimit,
|
take: limit,
|
||||||
order: finalOrder,
|
order: finalOrder,
|
||||||
}
|
}
|
||||||
: {},
|
: {},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
import { omit } from "lodash"
|
import { omit } from "lodash"
|
||||||
import { NextFunction } from "express"
|
import { NextFunction } from "express"
|
||||||
import { removeUndefinedProperties, MedusaError } from "@medusajs/utils"
|
import { MedusaError, removeUndefinedProperties } from "@medusajs/utils"
|
||||||
import { BaseEntity, QueryConfig, RequestQueryFields } from "@medusajs/types"
|
import { BaseEntity, QueryConfig, RequestQueryFields } from "@medusajs/types"
|
||||||
|
|
||||||
import { zodValidator } from "../../zod/zod-helpers"
|
import { zodValidator } from "../../zod/zod-helpers"
|
||||||
|
|||||||
@@ -119,12 +119,6 @@ export type TotalField =
|
|||||||
* Fields that can be passed in the query parameters of a request.
|
* Fields that can be passed in the query parameters of a request.
|
||||||
*/
|
*/
|
||||||
export type RequestQueryFields = {
|
export type RequestQueryFields = {
|
||||||
/**
|
|
||||||
* Comma-separated relations that should be expanded in the returned data.
|
|
||||||
* @deprecated Use `fields` instead and the relations will be inferred
|
|
||||||
*/
|
|
||||||
expand?: string
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comma-separated fields that should be included in the returned data.
|
* Comma-separated fields that should be included in the returned data.
|
||||||
* if a field is prefixed with `+` it will be added to the default fields, using `-` will remove it from the default fields.
|
* if a field is prefixed with `+` it will be added to the default fields, using `-` will remove it from the default fields.
|
||||||
@@ -309,26 +303,10 @@ export type QueryConfig<TEntity> = {
|
|||||||
* Default fields and relations to return
|
* Default fields and relations to return
|
||||||
*/
|
*/
|
||||||
defaults?: (keyof TEntity | string)[]
|
defaults?: (keyof TEntity | string)[]
|
||||||
/**
|
|
||||||
* @deprecated Use `defaults` instead
|
|
||||||
*/
|
|
||||||
defaultFields?: (keyof TEntity | string)[]
|
|
||||||
/**
|
|
||||||
* @deprecated Use `defaultFields` instead and the relations will be inferred
|
|
||||||
*/
|
|
||||||
defaultRelations?: string[]
|
|
||||||
/**
|
/**
|
||||||
* Fields and relations that are allowed to be requested
|
* Fields and relations that are allowed to be requested
|
||||||
*/
|
*/
|
||||||
allowed?: string[]
|
allowed?: string[]
|
||||||
/**
|
|
||||||
* @deprecated Use `allowed` instead
|
|
||||||
*/
|
|
||||||
allowedFields?: string[]
|
|
||||||
/**
|
|
||||||
* @deprecated Use `allowedFields` instead and the relations will be inferred
|
|
||||||
*/
|
|
||||||
allowedRelations?: string[]
|
|
||||||
defaultLimit?: number
|
defaultLimit?: number
|
||||||
isList?: boolean
|
isList?: boolean
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -265,15 +265,6 @@ export type ProjectConfigOptions = {
|
|||||||
*/
|
*/
|
||||||
databaseLogging?: boolean
|
databaseLogging?: boolean
|
||||||
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
* @deprecated
|
|
||||||
*
|
|
||||||
* @privateRemarks
|
|
||||||
* only postgres is supported, so this config has no effect
|
|
||||||
*/
|
|
||||||
databaseType?: string
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This configuration is used to pass additional options to the database connection. You can pass any configuration. For example, pass the
|
* This configuration is used to pass additional options to the database connection. You can pass any configuration. For example, pass the
|
||||||
* `ssl` property that enables support for TLS/SSL connections.
|
* `ssl` property that enables support for TLS/SSL connections.
|
||||||
@@ -400,19 +391,6 @@ export type ProjectConfigOptions = {
|
|||||||
*/
|
*/
|
||||||
sessionOptions?: SessionOptions
|
sessionOptions?: SessionOptions
|
||||||
|
|
||||||
/**
|
|
||||||
* This property configures the HTTP compression from the application layer. If you have access to the HTTP server, the recommended approach would be to enable it there.
|
|
||||||
* However, some platforms don't offer access to the HTTP layer and in those cases, this is a good alternative.
|
|
||||||
*
|
|
||||||
* If you enable HTTP compression and you want to disable it for specific API Routes, you can pass in the request header `"x-no-compression": true`.
|
|
||||||
*
|
|
||||||
* @ignore
|
|
||||||
*
|
|
||||||
* @deprecated use {@link http }'s `compression` property instead.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
httpCompression?: HttpCompressionOptions
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the number of staged jobs that are polled from the database. Default is `1000`.
|
* Configure the number of staged jobs that are polled from the database. Default is `1000`.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,23 +1,6 @@
|
|||||||
import { EventBusTypes } from "./bundles"
|
import { EventBusTypes } from "./bundles"
|
||||||
import { Message } from "./event-bus"
|
import { Message } from "./event-bus"
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated use `Context` instead
|
|
||||||
* @interface
|
|
||||||
*
|
|
||||||
* A context used to share resources, such as transaction manager, between the application and the module.
|
|
||||||
*/
|
|
||||||
export type SharedContext = {
|
|
||||||
/**
|
|
||||||
* An instance of a transaction manager.
|
|
||||||
*/
|
|
||||||
transactionManager?: any
|
|
||||||
/**
|
|
||||||
* An instance of an entity manager.
|
|
||||||
*/
|
|
||||||
manager?: any
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MessageAggregatorFormat {
|
export interface MessageAggregatorFormat {
|
||||||
groupBy?: string[]
|
groupBy?: string[]
|
||||||
sortBy?: { [key: string]: string[] | string | number }
|
sortBy?: { [key: string]: string[] | string | number }
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
export * as ApiKeyUtils from "./api-key"
|
export * as ApiKeyUtils from "./api-key"
|
||||||
export * as CoreFlowsUitls from "./core-flows"
|
export * as CoreFlowsUitls from "./core-flows"
|
||||||
export * as DALUtils from "./dal"
|
export * as DALUtils from "./dal"
|
||||||
export * as DecoratorUtils from "./decorators"
|
|
||||||
export * as DefaultsUtils from "./defaults"
|
export * as DefaultsUtils from "./defaults"
|
||||||
export * as DMLUtils from "./dml"
|
export * as DMLUtils from "./dml"
|
||||||
export * as EventBusUtils from "./event-bus"
|
export * as EventBusUtils from "./event-bus"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
export * from "./inject-entity-manager"
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import { Context, SharedContext } from "@medusajs/types"
|
|
||||||
import { MedusaContextType } from "../modules-sdk/decorators"
|
|
||||||
|
|
||||||
// @deprecated Use InjectManager instead
|
|
||||||
export function InjectEntityManager(
|
|
||||||
shouldForceTransaction: (target: any) => boolean = () => false,
|
|
||||||
managerProperty: string | false = "manager_"
|
|
||||||
): MethodDecorator {
|
|
||||||
return function (
|
|
||||||
target: any,
|
|
||||||
propertyKey: string | symbol,
|
|
||||||
descriptor: any
|
|
||||||
): void {
|
|
||||||
if (!target.MedusaContextIndex_) {
|
|
||||||
throw new Error(
|
|
||||||
`To apply @InjectEntityManager you have to flag a parameter using @MedusaContext`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const originalMethod = descriptor.value
|
|
||||||
|
|
||||||
const argIndex = target.MedusaContextIndex_[propertyKey]
|
|
||||||
descriptor.value = async function (...args: any[]) {
|
|
||||||
const shouldForceTransactionRes = shouldForceTransaction(target)
|
|
||||||
const context: SharedContext | Context = args[argIndex] ?? {}
|
|
||||||
|
|
||||||
if (!shouldForceTransactionRes && context?.transactionManager) {
|
|
||||||
return await originalMethod.apply(this, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
return await (managerProperty === false
|
|
||||||
? this
|
|
||||||
: this[managerProperty]
|
|
||||||
).transaction(
|
|
||||||
async (transactionManager) => {
|
|
||||||
args[argIndex] = args[argIndex] ?? { __type: MedusaContextType }
|
|
||||||
args[argIndex].transactionManager = transactionManager
|
|
||||||
|
|
||||||
return await originalMethod.apply(this, args)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
transaction: context?.transactionManager,
|
|
||||||
isolationLevel: (context as Context)?.isolationLevel,
|
|
||||||
enableNestedTransactions:
|
|
||||||
(context as Context).enableNestedTransactions ?? false,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,6 @@ export * from "./bundles"
|
|||||||
export * from "./common"
|
export * from "./common"
|
||||||
export * from "./core-flows"
|
export * from "./core-flows"
|
||||||
export * from "./dal"
|
export * from "./dal"
|
||||||
export * from "./decorators"
|
|
||||||
export * from "./defaults"
|
export * from "./defaults"
|
||||||
export * from "./dml"
|
export * from "./dml"
|
||||||
export * from "./event-bus"
|
export * from "./event-bus"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Context, SharedContext } from "@medusajs/types"
|
import { Context } from "@medusajs/types"
|
||||||
import { MedusaContextType } from "./context-parameter"
|
import { MedusaContextType } from "./context-parameter"
|
||||||
|
|
||||||
export function InjectSharedContext(): MethodDecorator {
|
export function InjectSharedContext(): MethodDecorator {
|
||||||
@@ -17,7 +17,7 @@ export function InjectSharedContext(): MethodDecorator {
|
|||||||
const argIndex = target.MedusaContextIndex_[propertyKey]
|
const argIndex = target.MedusaContextIndex_[propertyKey]
|
||||||
|
|
||||||
descriptor.value = function (...args: any[]) {
|
descriptor.value = function (...args: any[]) {
|
||||||
const context: SharedContext | Context = {
|
const context: Context = {
|
||||||
...(args[argIndex] ?? { __type: MedusaContextType }),
|
...(args[argIndex] ?? { __type: MedusaContextType }),
|
||||||
}
|
}
|
||||||
args[argIndex] = context
|
args[argIndex] = context
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Context, EventBusTypes } from "@medusajs/types"
|
import { Context, EventBusTypes } from "@medusajs/types"
|
||||||
import { buildModuleResourceEventName } from "../event-bus"
|
import { buildModuleResourceEventName } from "../event-bus/utils"
|
||||||
|
|
||||||
// TODO should that move closer to the event bus? and maybe be rename to modulemoduleEventBuilderFactory
|
// TODO should that move closer to the event bus? and maybe be rename to modulemoduleEventBuilderFactory
|
||||||
|
|
||||||
@@ -28,16 +28,11 @@ import { buildModuleResourceEventName } from "../event-bus"
|
|||||||
export function moduleEventBuilderFactory({
|
export function moduleEventBuilderFactory({
|
||||||
action,
|
action,
|
||||||
object,
|
object,
|
||||||
eventsEnum,
|
|
||||||
eventName,
|
eventName,
|
||||||
source,
|
source,
|
||||||
}: {
|
}: {
|
||||||
action: string
|
action: string
|
||||||
object: string
|
object: string
|
||||||
/**
|
|
||||||
* @deprecated use eventName instead
|
|
||||||
*/
|
|
||||||
eventsEnum?: Record<string, string>
|
|
||||||
eventName?: string
|
eventName?: string
|
||||||
source: string
|
source: string
|
||||||
}) {
|
}) {
|
||||||
@@ -57,14 +52,8 @@ export function moduleEventBuilderFactory({
|
|||||||
const aggregator = sharedContext.messageAggregator!
|
const aggregator = sharedContext.messageAggregator!
|
||||||
const messages: EventBusTypes.RawMessageFormat[] = []
|
const messages: EventBusTypes.RawMessageFormat[] = []
|
||||||
|
|
||||||
// The event enums contains event formatted like so [object]_[action] e.g. PRODUCT_CREATED
|
if (!eventName) {
|
||||||
// We expect the keys of events to be fully uppercased
|
eventName = buildModuleResourceEventName({
|
||||||
let eventName_ = eventsEnum
|
|
||||||
? eventsEnum[`${object.toUpperCase()}_${action.toUpperCase()}`]
|
|
||||||
: eventName
|
|
||||||
|
|
||||||
if (!eventName_) {
|
|
||||||
eventName_ = buildModuleResourceEventName({
|
|
||||||
prefix: source,
|
prefix: source,
|
||||||
objectName: object,
|
objectName: object,
|
||||||
action,
|
action,
|
||||||
@@ -77,7 +66,7 @@ export function moduleEventBuilderFactory({
|
|||||||
action,
|
action,
|
||||||
context: sharedContext,
|
context: sharedContext,
|
||||||
data: { id: dataItem.id },
|
data: { id: dataItem.id },
|
||||||
eventName: eventName_,
|
eventName: eventName!,
|
||||||
object,
|
object,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -25,16 +25,6 @@ export type ModelDTOConfig = {
|
|||||||
model?: DmlEntity<any, any>
|
model?: DmlEntity<any, any>
|
||||||
create?: any
|
create?: any
|
||||||
update?: any
|
update?: any
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
singular?: string
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
plural?: string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ModelsConfigTemplate = { [key: string]: ModelDTOConfig }
|
export type ModelsConfigTemplate = { [key: string]: ModelDTOConfig }
|
||||||
@@ -51,21 +41,6 @@ export type ModelConfigurationsToConfigTemplate<T extends ModelEntries> = {
|
|||||||
: T[Key] extends IDmlEntity<any, any>
|
: T[Key] extends IDmlEntity<any, any>
|
||||||
? T[Key]
|
? T[Key]
|
||||||
: never
|
: never
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
create: any
|
|
||||||
update: any
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
singular: T[Key] extends { singular: string } ? T[Key]["singular"] : Key
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
plural: T[Key] extends { plural: string }
|
|
||||||
? T[Key]["plural"]
|
|
||||||
: Pluralize<Key & string>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export const defaultAdminDetailsClaimFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminDetailsClaimFields,
|
defaults: defaultAdminDetailsClaimFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export const defaultAdminDetailsExchangeFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminDetailsExchangeFields,
|
defaults: defaultAdminDetailsExchangeFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export const defaultAdminDetailsOrderEditFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminDetailsOrderEditFields,
|
defaults: defaultAdminDetailsOrderEditFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export const defaultAdminRetrieveOrderChangesFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminRetrieveOrderFields,
|
defaults: defaultAdminRetrieveOrderFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +93,6 @@ export const listTransformQueryConfig = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const retrieveOrderChangesTransformQueryConfig = {
|
export const retrieveOrderChangesTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminRetrieveOrderChangesFields,
|
defaults: defaultAdminRetrieveOrderChangesFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ export const defaultAdminRetrieveRefundReasonFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminRetrieveRefundReasonFields,
|
defaults: defaultAdminRetrieveRefundReasonFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export const defaultAdminRetrieveReturnReasonFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminRetrieveReturnReasonFields,
|
defaults: defaultAdminRetrieveReturnReasonFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export const defaultAdminDetailsReturnFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultAdminDetailsReturnFields,
|
defaults: defaultAdminDetailsReturnFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
export const defaultAdminUploadFields = ["id", "url"]
|
export const defaultAdminUploadFields = ["id", "url"]
|
||||||
|
|
||||||
export const retrieveUploadConfig = {
|
export const retrieveUploadConfig = {
|
||||||
defaultFields: defaultAdminUploadFields,
|
defaults: defaultAdminUploadFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ export const defaultStoreRetrieveReturnReasonFields = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
export const retrieveTransformQueryConfig = {
|
export const retrieveTransformQueryConfig = {
|
||||||
defaultFields: defaultStoreRetrieveReturnReasonFields,
|
defaults: defaultStoreRetrieveReturnReasonFields,
|
||||||
isList: false,
|
isList: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,22 +25,6 @@ export const BigNumberInput = z.union([
|
|||||||
}),
|
}),
|
||||||
])
|
])
|
||||||
|
|
||||||
const optionalBooleanMapper = new Map([
|
|
||||||
["undefined", undefined],
|
|
||||||
["null", null],
|
|
||||||
["true", true],
|
|
||||||
["false", false],
|
|
||||||
])
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `booleanString` instead
|
|
||||||
* It support the chainable API of zod. Please note it does not come with `.optional()` by default
|
|
||||||
*/
|
|
||||||
export const OptionalBooleanValidator = z.preprocess(
|
|
||||||
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
|
|
||||||
z.boolean().optional()
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates that a value is a boolean when it is passed as a string.
|
* Validates that a value is a boolean when it is passed as a string.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
|
export { default as exec } from "./exec"
|
||||||
|
export { default as user } from "./user"
|
||||||
|
export { default as start } from "./start"
|
||||||
export { default as build } from "./build"
|
export { default as build } from "./build"
|
||||||
export { default as develop } from "./develop"
|
export { default as develop } from "./develop"
|
||||||
export { default as exec } from "./exec"
|
|
||||||
export { default as links } from "./links"
|
|
||||||
export { default as migrate } from "./migrate"
|
|
||||||
export { default as start } from "./start"
|
|
||||||
export { default as startCluster } from "./start-cluster"
|
|
||||||
export { default as user } from "./user"
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import syncLinksCmd from "./db/sync-links"
|
|
||||||
|
|
||||||
const main = async function (argv) {
|
|
||||||
if (argv.action !== "sync") {
|
|
||||||
return process.exit()
|
|
||||||
}
|
|
||||||
await syncLinksCmd(argv)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default main
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
import { LinkLoader } from "@medusajs/framework/links"
|
|
||||||
import { logger } from "@medusajs/framework/logger"
|
|
||||||
import { MedusaAppLoader } from "@medusajs/framework"
|
|
||||||
import { initializeContainer } from "../loaders"
|
|
||||||
import {
|
|
||||||
ContainerRegistrationKeys,
|
|
||||||
MedusaError,
|
|
||||||
} from "@medusajs/framework/utils"
|
|
||||||
import { getResolvedPlugins } from "../loaders/helpers/resolve-plugins"
|
|
||||||
import { join } from "path"
|
|
||||||
|
|
||||||
const TERMINAL_SIZE = process.stdout.columns
|
|
||||||
|
|
||||||
type Action = "run" | "revert" | "generate" | "show"
|
|
||||||
|
|
||||||
function validateInputArgs({
|
|
||||||
action,
|
|
||||||
modules,
|
|
||||||
}: {
|
|
||||||
action: Action
|
|
||||||
modules: string[]
|
|
||||||
}) {
|
|
||||||
const actionsRequiringModules = ["revert", "generate"]
|
|
||||||
|
|
||||||
if (modules.length && !actionsRequiringModules.includes(action)) {
|
|
||||||
logger.error(
|
|
||||||
`<modules> cannot be specified with the "${action}" action. Please remove the <modules> argument and try again.`
|
|
||||||
)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!modules.length && actionsRequiringModules.includes(action)) {
|
|
||||||
logger.error(
|
|
||||||
"Please provide the modules for which you want to revert migrations"
|
|
||||||
)
|
|
||||||
logger.error(`For example: "npx medusa migration revert <moduleName>"`)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const main = async function ({ directory }) {
|
|
||||||
const args = process.argv
|
|
||||||
args.shift()
|
|
||||||
args.shift()
|
|
||||||
args.shift()
|
|
||||||
|
|
||||||
const action = args[0] as Action
|
|
||||||
const modules = args.splice(1)
|
|
||||||
|
|
||||||
validateInputArgs({ action, modules })
|
|
||||||
|
|
||||||
const container = await initializeContainer(directory)
|
|
||||||
|
|
||||||
const configModule = container.resolve(
|
|
||||||
ContainerRegistrationKeys.CONFIG_MODULE
|
|
||||||
)
|
|
||||||
|
|
||||||
const medusaAppLoader = new MedusaAppLoader()
|
|
||||||
|
|
||||||
const plugins = getResolvedPlugins(directory, configModule, true) || []
|
|
||||||
const linksSourcePaths = plugins.map((plugin) =>
|
|
||||||
join(plugin.resolve, "links")
|
|
||||||
)
|
|
||||||
await new LinkLoader(linksSourcePaths).load()
|
|
||||||
|
|
||||||
if (action === "run") {
|
|
||||||
logger.info("Running migrations...")
|
|
||||||
|
|
||||||
await medusaAppLoader.runModulesMigrations({
|
|
||||||
action: "run",
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
|
||||||
logger.info("Migrations completed")
|
|
||||||
process.exit()
|
|
||||||
} else if (action === "revert") {
|
|
||||||
logger.info("Reverting migrations...")
|
|
||||||
|
|
||||||
try {
|
|
||||||
await medusaAppLoader.runModulesMigrations({
|
|
||||||
moduleNames: modules,
|
|
||||||
action: "revert",
|
|
||||||
})
|
|
||||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
|
||||||
logger.info("Migrations reverted")
|
|
||||||
process.exit()
|
|
||||||
} catch (error) {
|
|
||||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
|
||||||
if (error.code && error.code === MedusaError.Codes.UNKNOWN_MODULES) {
|
|
||||||
logger.error(error.message)
|
|
||||||
const modulesList = error.allModules.map(
|
|
||||||
(name: string) => ` - ${name}`
|
|
||||||
)
|
|
||||||
logger.error(`Available modules:\n${modulesList.join("\n")}`)
|
|
||||||
} else {
|
|
||||||
logger.error(error.message, error)
|
|
||||||
}
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
} else if (action === "generate") {
|
|
||||||
logger.info("Generating migrations...")
|
|
||||||
|
|
||||||
await medusaAppLoader.runModulesMigrations({
|
|
||||||
moduleNames: modules,
|
|
||||||
action: "generate",
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
|
||||||
logger.info("Migrations generated")
|
|
||||||
process.exit()
|
|
||||||
} else if (action === "show") {
|
|
||||||
logger.info("Action not supported yet")
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default main
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
import cluster from "cluster"
|
|
||||||
import express from "express"
|
|
||||||
import { track } from "medusa-telemetry"
|
|
||||||
import { scheduleJob } from "node-schedule"
|
|
||||||
import os from "os"
|
|
||||||
|
|
||||||
import { logger } from "@medusajs/framework/logger"
|
|
||||||
import { GracefulShutdownServer, isPresent } from "@medusajs/framework/utils"
|
|
||||||
import loaders from "../loaders"
|
|
||||||
|
|
||||||
const EVERY_SIXTH_HOUR = "0 */6 * * *"
|
|
||||||
const CRON_SCHEDULE = EVERY_SIXTH_HOUR
|
|
||||||
|
|
||||||
let isShuttingDown = false
|
|
||||||
export default async function ({ port, cpus, directory }) {
|
|
||||||
if (cluster.isPrimary) {
|
|
||||||
const killMainProccess = () => process.exit(0)
|
|
||||||
|
|
||||||
cpus ??= os.cpus().length
|
|
||||||
const numCPUs = Math.min(os.cpus().length, cpus)
|
|
||||||
|
|
||||||
for (let index = 0; index < numCPUs; index++) {
|
|
||||||
const worker = cluster.fork()
|
|
||||||
worker.send({ index })
|
|
||||||
}
|
|
||||||
|
|
||||||
cluster.on("exit", (worker) => {
|
|
||||||
if (!isShuttingDown) {
|
|
||||||
cluster.fork()
|
|
||||||
} else if (!isPresent(cluster.workers)) {
|
|
||||||
setTimeout(killMainProccess, 100)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const gracefulShutDown = () => {
|
|
||||||
isShuttingDown = true
|
|
||||||
for (const id of Object.keys(cluster.workers ?? {})) {
|
|
||||||
cluster.workers?.[id]?.kill("SIGTERM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scheduleJob(CRON_SCHEDULE, () => {
|
|
||||||
track("PING")
|
|
||||||
})
|
|
||||||
|
|
||||||
process.on("SIGTERM", gracefulShutDown)
|
|
||||||
process.on("SIGINT", gracefulShutDown)
|
|
||||||
} else {
|
|
||||||
const start = async () => {
|
|
||||||
track("CLI_START")
|
|
||||||
|
|
||||||
const app = express()
|
|
||||||
|
|
||||||
const { shutdown } = await loaders({
|
|
||||||
directory,
|
|
||||||
expressApp: app,
|
|
||||||
})
|
|
||||||
const serverActivity = logger.activity(`Creating server`)
|
|
||||||
const server = GracefulShutdownServer.create(
|
|
||||||
app.listen(port).on("listening", () => {
|
|
||||||
logger.success(serverActivity, `Server is ready on port: ${port}`)
|
|
||||||
track("CLI_START_COMPLETED")
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
const gracefulShutDown = () => {
|
|
||||||
server
|
|
||||||
.shutdown()
|
|
||||||
.then(async () => {
|
|
||||||
await shutdown()
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
process.exit(1)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on("SIGTERM", gracefulShutDown)
|
|
||||||
process.on("SIGINT", gracefulShutDown)
|
|
||||||
|
|
||||||
return { server }
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on("message", async (msg: any) => {
|
|
||||||
if (msg.index > 0) {
|
|
||||||
process.env.PLUGIN_ADMIN_UI_SKIP_CACHE = "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
await start()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
|
import os from "os"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
import http from "http"
|
||||||
import express from "express"
|
import express from "express"
|
||||||
|
import cluster from "cluster"
|
||||||
import { track } from "medusa-telemetry"
|
import { track } from "medusa-telemetry"
|
||||||
import { scheduleJob } from "node-schedule"
|
import { scheduleJob } from "node-schedule"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
dynamicImport,
|
dynamicImport,
|
||||||
|
isPresent,
|
||||||
FileSystem,
|
FileSystem,
|
||||||
gqlSchemaToTypes,
|
gqlSchemaToTypes,
|
||||||
GracefulShutdownServer,
|
GracefulShutdownServer,
|
||||||
} from "@medusajs/framework/utils"
|
} from "@medusajs/framework/utils"
|
||||||
import http from "http"
|
|
||||||
import { logger } from "@medusajs/framework/logger"
|
import { logger } from "@medusajs/framework/logger"
|
||||||
|
|
||||||
import loaders from "../loaders"
|
import loaders from "../loaders"
|
||||||
@@ -54,8 +57,14 @@ export async function registerInstrumentation(directory: string) {
|
|||||||
// eslint-disable-next-line no-var
|
// eslint-disable-next-line no-var
|
||||||
export var traceRequestHandler: (...args: any[]) => Promise<any> = void 0 as any
|
export var traceRequestHandler: (...args: any[]) => Promise<any> = void 0 as any
|
||||||
|
|
||||||
async function start({ port, directory, types }) {
|
async function start(args: {
|
||||||
async function internalStart() {
|
directory: string
|
||||||
|
port?: number
|
||||||
|
types?: boolean
|
||||||
|
cluster?: number
|
||||||
|
}) {
|
||||||
|
const { port, directory, types } = args
|
||||||
|
async function internalStart(generateTypes: boolean) {
|
||||||
track("CLI_START")
|
track("CLI_START")
|
||||||
await registerInstrumentation(directory)
|
await registerInstrumentation(directory)
|
||||||
|
|
||||||
@@ -84,7 +93,7 @@ async function start({ port, directory, types }) {
|
|||||||
expressApp: app,
|
expressApp: app,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (gqlSchema && types) {
|
if (gqlSchema && generateTypes) {
|
||||||
const outputDirGeneratedTypes = path.join(directory, ".medusa/types")
|
const outputDirGeneratedTypes = path.join(directory, ".medusa/types")
|
||||||
await gqlSchemaToTypes({
|
await gqlSchemaToTypes({
|
||||||
outputDir: outputDirGeneratedTypes,
|
outputDir: outputDirGeneratedTypes,
|
||||||
@@ -93,7 +102,7 @@ async function start({ port, directory, types }) {
|
|||||||
schema: gqlSchema,
|
schema: gqlSchema,
|
||||||
joinerConfigs: MedusaModule.getAllJoinerConfigs(),
|
joinerConfigs: MedusaModule.getAllJoinerConfigs(),
|
||||||
})
|
})
|
||||||
logger.info("Geneated modules types")
|
logger.info("Generated modules types")
|
||||||
}
|
}
|
||||||
|
|
||||||
const serverActivity = logger.activity(`Creating server`)
|
const serverActivity = logger.activity(`Creating server`)
|
||||||
@@ -133,7 +142,54 @@ async function start({ port, directory, types }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await internalStart()
|
/**
|
||||||
|
* When the cluster flag is used we will start the process in
|
||||||
|
* cluster mode
|
||||||
|
*/
|
||||||
|
if ("cluster" in args) {
|
||||||
|
const maxCpus = os.cpus().length
|
||||||
|
const cpus = args.cluster ?? maxCpus
|
||||||
|
|
||||||
|
if (cluster.isPrimary) {
|
||||||
|
let isShuttingDown = false
|
||||||
|
const numCPUs = Math.min(maxCpus, cpus)
|
||||||
|
const killMainProccess = () => process.exit(0)
|
||||||
|
const gracefulShutDown = () => {
|
||||||
|
isShuttingDown = true
|
||||||
|
for (const id of Object.keys(cluster.workers ?? {})) {
|
||||||
|
cluster.workers?.[id]?.kill("SIGTERM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let index = 0; index < numCPUs; index++) {
|
||||||
|
cluster.fork().send({ index })
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster.on("exit", () => {
|
||||||
|
if (!isShuttingDown) {
|
||||||
|
cluster.fork()
|
||||||
|
} else if (!isPresent(cluster.workers)) {
|
||||||
|
setTimeout(killMainProccess, 100)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
process.on("SIGTERM", gracefulShutDown)
|
||||||
|
process.on("SIGINT", gracefulShutDown)
|
||||||
|
} else {
|
||||||
|
process.on("message", async (msg: any) => {
|
||||||
|
if (msg.index > 0) {
|
||||||
|
process.env.PLUGIN_ADMIN_UI_SKIP_CACHE = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
await internalStart(!!types && msg.index === 0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* Not in cluster mode
|
||||||
|
*/
|
||||||
|
await internalStart(!!types)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default start
|
export default start
|
||||||
@@ -40,12 +40,6 @@ declare global {
|
|||||||
*/
|
*/
|
||||||
filterableFields: Record<string, unknown>
|
filterableFields: Record<string, unknown>
|
||||||
includes?: Record<string, boolean>
|
includes?: Record<string, boolean>
|
||||||
/**
|
|
||||||
* An array of fields and relations that are allowed to be queried, this can be set by the
|
|
||||||
* consumer as part of a middleware and it will take precedence over the defaultAllowedFields
|
|
||||||
* @deprecated use `allowed` instead
|
|
||||||
*/
|
|
||||||
allowedFields?: string[]
|
|
||||||
/**
|
/**
|
||||||
* An array of fields and relations that are allowed to be queried, this can be set by the
|
* An array of fields and relations that are allowed to be queried, this can be set by the
|
||||||
* consumer as part of a middleware and it will take precedence over the defaultAllowedFields set
|
* consumer as part of a middleware and it will take precedence over the defaultAllowedFields set
|
||||||
|
|||||||
@@ -20,151 +20,151 @@ export const eventBuilders = {
|
|||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "fulfillment",
|
object: "fulfillment",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedFulfillment: moduleEventBuilderFactory({
|
updatedFulfillment: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "fulfillment",
|
object: "fulfillment",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_UPDATED,
|
||||||
}),
|
}),
|
||||||
createdFulfillmentAddress: moduleEventBuilderFactory({
|
createdFulfillmentAddress: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "fulfillment_address",
|
object: "fulfillment_address",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_ADDRESS_CREATED,
|
||||||
}),
|
}),
|
||||||
createdFulfillmentItem: moduleEventBuilderFactory({
|
createdFulfillmentItem: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "fulfillment_item",
|
object: "fulfillment_item",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_ITEM_CREATED,
|
||||||
}),
|
}),
|
||||||
createdFulfillmentLabel: moduleEventBuilderFactory({
|
createdFulfillmentLabel: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "fulfillment_label",
|
object: "fulfillment_label",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_LABEL_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedFulfillmentLabel: moduleEventBuilderFactory({
|
updatedFulfillmentLabel: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "fulfillment_label",
|
object: "fulfillment_label",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_LABEL_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedFulfillmentLabel: moduleEventBuilderFactory({
|
deletedFulfillmentLabel: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "fulfillment_label",
|
object: "fulfillment_label",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_LABEL_DELETED,
|
||||||
}),
|
}),
|
||||||
createdShippingProfile: moduleEventBuilderFactory({
|
createdShippingProfile: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "shipping_profile",
|
object: "shipping_profile",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_PROFILE_CREATED,
|
||||||
}),
|
}),
|
||||||
createdShippingOptionType: moduleEventBuilderFactory({
|
createdShippingOptionType: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "shipping_option_type",
|
object: "shipping_option_type",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_TYPE_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedShippingOptionType: moduleEventBuilderFactory({
|
updatedShippingOptionType: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "shipping_option_type",
|
object: "shipping_option_type",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_TYPE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedShippingOptionType: moduleEventBuilderFactory({
|
deletedShippingOptionType: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "shipping_option_type",
|
object: "shipping_option_type",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_TYPE_DELETED,
|
||||||
}),
|
}),
|
||||||
createdShippingOptionRule: moduleEventBuilderFactory({
|
createdShippingOptionRule: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "shipping_option_rule",
|
object: "shipping_option_rule",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_RULE_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedShippingOptionRule: moduleEventBuilderFactory({
|
updatedShippingOptionRule: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "shipping_option_rule",
|
object: "shipping_option_rule",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_RULE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedShippingOptionRule: moduleEventBuilderFactory({
|
deletedShippingOptionRule: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "shipping_option_rule",
|
object: "shipping_option_rule",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_RULE_DELETED,
|
||||||
}),
|
}),
|
||||||
createdShippingOption: moduleEventBuilderFactory({
|
createdShippingOption: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "shipping_option",
|
object: "shipping_option",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedShippingOption: moduleEventBuilderFactory({
|
updatedShippingOption: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "shipping_option",
|
object: "shipping_option",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SHIPPING_OPTION_UPDATED,
|
||||||
}),
|
}),
|
||||||
createdFulfillmentSet: moduleEventBuilderFactory({
|
createdFulfillmentSet: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "fulfillment_set",
|
object: "fulfillment_set",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_SET_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedFulfillmentSet: moduleEventBuilderFactory({
|
updatedFulfillmentSet: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "fulfillment_set",
|
object: "fulfillment_set",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_SET_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedFulfillmentSet: moduleEventBuilderFactory({
|
deletedFulfillmentSet: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "fulfillment_set",
|
object: "fulfillment_set",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.FULFILLMENT_SET_DELETED,
|
||||||
}),
|
}),
|
||||||
createdServiceZone: moduleEventBuilderFactory({
|
createdServiceZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "service_zone",
|
object: "service_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SERVICE_ZONE_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedServiceZone: moduleEventBuilderFactory({
|
updatedServiceZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "service_zone",
|
object: "service_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SERVICE_ZONE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedServiceZone: moduleEventBuilderFactory({
|
deletedServiceZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "service_zone",
|
object: "service_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.SERVICE_ZONE_DELETED,
|
||||||
}),
|
}),
|
||||||
createdGeoZone: moduleEventBuilderFactory({
|
createdGeoZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "geo_zone",
|
object: "geo_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.GEO_ZONE_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedGeoZone: moduleEventBuilderFactory({
|
updatedGeoZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "geo_zone",
|
object: "geo_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.GEO_ZONE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedGeoZone: moduleEventBuilderFactory({
|
deletedGeoZone: moduleEventBuilderFactory({
|
||||||
source: Modules.FULFILLMENT,
|
source: Modules.FULFILLMENT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "geo_zone",
|
object: "geo_zone",
|
||||||
eventsEnum: FulfillmentEvents,
|
eventName: FulfillmentEvents.GEO_ZONE_DELETED,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,6 @@ export const eventBuilders = {
|
|||||||
source: Modules.NOTIFICATION,
|
source: Modules.NOTIFICATION,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "notification",
|
object: "notification",
|
||||||
eventsEnum: NotificationEvents,
|
eventName: NotificationEvents.NOTIFICATION_CREATED,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
@@ -10,60 +10,60 @@ export const eventBuilders = {
|
|||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "price_set",
|
object: "price_set",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_SET_CREATED,
|
||||||
}),
|
}),
|
||||||
createdPrice: moduleEventBuilderFactory({
|
createdPrice: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "price",
|
object: "price",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_CREATED,
|
||||||
}),
|
}),
|
||||||
createdPriceRule: moduleEventBuilderFactory({
|
createdPriceRule: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "price_rule",
|
object: "price_rule",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_RULE_CREATED,
|
||||||
}),
|
}),
|
||||||
createdPriceList: moduleEventBuilderFactory({
|
createdPriceList: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "price_list",
|
object: "price_list",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_LIST_CREATED,
|
||||||
}),
|
}),
|
||||||
createdPriceListRule: moduleEventBuilderFactory({
|
createdPriceListRule: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "price_list_rule",
|
object: "price_list_rule",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_LIST_RULE_CREATED,
|
||||||
}),
|
}),
|
||||||
attachedPriceListRule: moduleEventBuilderFactory({
|
attachedPriceListRule: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.ATTACHED,
|
action: CommonEvents.ATTACHED,
|
||||||
object: "price_list_rule",
|
object: "price_list_rule",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_LIST_RULE_ATTACHED,
|
||||||
}),
|
}),
|
||||||
updatedPrice: moduleEventBuilderFactory({
|
updatedPrice: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "price",
|
object: "price",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_UPDATED,
|
||||||
}),
|
}),
|
||||||
updatedPriceRule: moduleEventBuilderFactory({
|
updatedPriceRule: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "price_rule",
|
object: "price_rule",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_RULE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedPrice: moduleEventBuilderFactory({
|
deletedPrice: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "price",
|
object: "price",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_DELETED,
|
||||||
}),
|
}),
|
||||||
deletedPriceRule: moduleEventBuilderFactory({
|
deletedPriceRule: moduleEventBuilderFactory({
|
||||||
source: Modules.PRICING,
|
source: Modules.PRICING,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "price_rule",
|
object: "price_rule",
|
||||||
eventsEnum: PricingEvents,
|
eventName: PricingEvents.PRICE_RULE_DELETED,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
-1
@@ -680,7 +680,6 @@ moduleIntegrationTestRunner<IProductModuleService>({
|
|||||||
productCategoryTwo = categories[2]
|
productCategoryTwo = categories[2]
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: Normalize delete events as well
|
|
||||||
it("should emit events through event bus", async () => {
|
it("should emit events through event bus", async () => {
|
||||||
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
|
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
|
||||||
eventBusSpy.mockClear()
|
eventBusSpy.mockClear()
|
||||||
|
|||||||
@@ -10,109 +10,109 @@ export const eventBuilders = {
|
|||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product",
|
object: "product",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProduct: moduleEventBuilderFactory({
|
updatedProduct: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product",
|
object: "product",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProduct: moduleEventBuilderFactory({
|
deletedProduct: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product",
|
object: "product",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductVariant: moduleEventBuilderFactory({
|
createdProductVariant: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product_variant",
|
object: "product_variant",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_VARIANT_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProductVariant: moduleEventBuilderFactory({
|
updatedProductVariant: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product_variant",
|
object: "product_variant",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_VARIANT_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProductVariant: moduleEventBuilderFactory({
|
deletedProductVariant: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product_variant",
|
object: "product_variant",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_VARIANT_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductOption: moduleEventBuilderFactory({
|
createdProductOption: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product_option",
|
object: "product_option",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_OPTION_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProductOption: moduleEventBuilderFactory({
|
updatedProductOption: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product_option",
|
object: "product_option",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_OPTION_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProductOption: moduleEventBuilderFactory({
|
deletedProductOption: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product_option",
|
object: "product_option",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_OPTION_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductType: moduleEventBuilderFactory({
|
createdProductType: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product_type",
|
object: "product_type",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TYPE_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProductType: moduleEventBuilderFactory({
|
updatedProductType: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product_type",
|
object: "product_type",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TYPE_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProductType: moduleEventBuilderFactory({
|
deletedProductType: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product_type",
|
object: "product_type",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TYPE_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductTag: moduleEventBuilderFactory({
|
createdProductTag: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product_tag",
|
object: "product_tag",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TAG_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProductTag: moduleEventBuilderFactory({
|
updatedProductTag: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product_tag",
|
object: "product_tag",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TAG_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProductTag: moduleEventBuilderFactory({
|
deletedProductTag: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product_tag",
|
object: "product_tag",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_TAG_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductCategory: moduleEventBuilderFactory({
|
createdProductCategory: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.CREATED,
|
action: CommonEvents.CREATED,
|
||||||
object: "product_category",
|
object: "product_category",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_CATEGORY_CREATED,
|
||||||
}),
|
}),
|
||||||
updatedProductCategory: moduleEventBuilderFactory({
|
updatedProductCategory: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.UPDATED,
|
action: CommonEvents.UPDATED,
|
||||||
object: "product_category",
|
object: "product_category",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_CATEGORY_UPDATED,
|
||||||
}),
|
}),
|
||||||
deletedProductCategory: moduleEventBuilderFactory({
|
deletedProductCategory: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
action: CommonEvents.DELETED,
|
action: CommonEvents.DELETED,
|
||||||
object: "product_category",
|
object: "product_category",
|
||||||
eventsEnum: ProductEvents,
|
eventName: ProductEvents.PRODUCT_CATEGORY_DELETED,
|
||||||
}),
|
}),
|
||||||
createdProductCollection: moduleEventBuilderFactory({
|
createdProductCollection: moduleEventBuilderFactory({
|
||||||
source: Modules.PRODUCT,
|
source: Modules.PRODUCT,
|
||||||
|
|||||||
Reference in new issue
Block a user