feat(migrations): CLI generate command (#8103)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import Logger from "../loaders/logger"
|
||||
import { migrateMedusaApp, revertMedusaApp } from "../loaders/medusa-app"
|
||||
import { runMedusaAppMigrations } from "../loaders/medusa-app"
|
||||
import { initializeContainer } from "../loaders"
|
||||
import { ContainerRegistrationKeys, MedusaError } from "@medusajs/utils"
|
||||
import { getResolvedPlugins } from "../loaders/helpers/resolve-plugins"
|
||||
@@ -7,13 +7,44 @@ import { resolvePluginsLinks } from "../loaders/helpers/resolve-plugins-links"
|
||||
|
||||
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]
|
||||
const action = args[0] as "run" | "revert" | "generate" | "show"
|
||||
const modules = args.splice(1)
|
||||
|
||||
validateInputArgs({ action, modules })
|
||||
|
||||
const container = await initializeContainer(directory)
|
||||
|
||||
const configModule = container.resolve(
|
||||
@@ -26,33 +57,26 @@ const main = async function ({ directory }) {
|
||||
if (action === "run") {
|
||||
Logger.info("Running migrations...")
|
||||
|
||||
await migrateMedusaApp({
|
||||
await runMedusaAppMigrations({
|
||||
configModule,
|
||||
linkModules: pluginLinks,
|
||||
container,
|
||||
action: "run",
|
||||
})
|
||||
|
||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
||||
Logger.info("Migrations completed")
|
||||
process.exit()
|
||||
} else if (action === "revert") {
|
||||
const modulesToRevert = args.slice(1)
|
||||
if (!modulesToRevert.length) {
|
||||
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)
|
||||
}
|
||||
|
||||
Logger.info("Reverting migrations...")
|
||||
|
||||
try {
|
||||
await revertMedusaApp({
|
||||
modulesToRevert,
|
||||
await runMedusaAppMigrations({
|
||||
moduleNames: modules,
|
||||
configModule,
|
||||
linkModules: pluginLinks,
|
||||
container,
|
||||
action: "revert",
|
||||
})
|
||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
||||
Logger.info("Migrations reverted")
|
||||
@@ -70,6 +94,20 @@ const main = async function ({ directory }) {
|
||||
}
|
||||
process.exit(1)
|
||||
}
|
||||
} else if (action === "generate") {
|
||||
Logger.info("Generating migrations...")
|
||||
|
||||
await runMedusaAppMigrations({
|
||||
moduleNames: modules,
|
||||
configModule,
|
||||
linkModules: pluginLinks,
|
||||
container,
|
||||
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)
|
||||
|
||||
@@ -126,11 +126,11 @@ export const runIsolatedModulesMigration = async (configModule) => {
|
||||
continue
|
||||
}
|
||||
|
||||
await MedusaModule.migrateUp(
|
||||
moduleResolution.definition.key,
|
||||
moduleResolution.resolutionPath,
|
||||
moduleResolution.options
|
||||
)
|
||||
await MedusaModule.migrateUp({
|
||||
moduleKey: moduleResolution.definition.key,
|
||||
modulePath: moduleResolution.resolutionPath,
|
||||
options: moduleResolution.options,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,10 +151,10 @@ export const revertIsolatedModulesMigration = async (configModule) => {
|
||||
continue
|
||||
}
|
||||
|
||||
await MedusaModule.migrateDown(
|
||||
moduleResolution.definition.key,
|
||||
moduleResolution.resolutionPath,
|
||||
moduleResolution.options
|
||||
)
|
||||
await MedusaModule.migrateDown({
|
||||
moduleKey: moduleResolution.definition.key,
|
||||
modulePath: moduleResolution.resolutionPath,
|
||||
options: moduleResolution.options,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
MedusaApp,
|
||||
MedusaAppMigrateDown,
|
||||
MedusaAppMigrateGenerate,
|
||||
MedusaAppMigrateUp,
|
||||
MedusaAppOptions,
|
||||
MedusaAppOutput,
|
||||
@@ -57,12 +58,21 @@ export function mergeDefaultModules(
|
||||
return configModules
|
||||
}
|
||||
|
||||
async function runMedusaAppMigrations({
|
||||
/**
|
||||
* Run, Revert or Generate the migrations for the medusa app.
|
||||
*
|
||||
* @param configModule
|
||||
* @param container
|
||||
* @param moduleNames
|
||||
* @param linkModules
|
||||
* @param action
|
||||
*/
|
||||
export async function runMedusaAppMigrations({
|
||||
configModule,
|
||||
container,
|
||||
moduleNames,
|
||||
revert = false,
|
||||
linkModules,
|
||||
action = "run",
|
||||
}: {
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
@@ -73,11 +83,11 @@ async function runMedusaAppMigrations({
|
||||
} & (
|
||||
| {
|
||||
moduleNames?: never
|
||||
revert: false
|
||||
action: "run"
|
||||
}
|
||||
| {
|
||||
moduleNames: string[]
|
||||
revert: true
|
||||
action: "revert" | "generate"
|
||||
}
|
||||
)): Promise<void> {
|
||||
const injectedDependencies = {
|
||||
@@ -101,82 +111,23 @@ async function runMedusaAppMigrations({
|
||||
}
|
||||
const configModules = mergeDefaultModules(configModule.modules)
|
||||
|
||||
if (revert) {
|
||||
await MedusaAppMigrateDown(moduleNames!, {
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
})
|
||||
const migrationOptions = {
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
}
|
||||
|
||||
if (action === "revert") {
|
||||
await MedusaAppMigrateDown(moduleNames!, migrationOptions)
|
||||
} else if (action === "run") {
|
||||
await MedusaAppMigrateUp(migrationOptions)
|
||||
} else {
|
||||
await MedusaAppMigrateUp({
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
})
|
||||
await MedusaAppMigrateGenerate(moduleNames!, migrationOptions)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param configModule The config module
|
||||
* @param linkModules Custom links from the plugins
|
||||
* @param container The medusa container
|
||||
*/
|
||||
export async function migrateMedusaApp({
|
||||
configModule,
|
||||
linkModules,
|
||||
container,
|
||||
}: {
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
projectConfig: CommonTypes.ConfigModule["projectConfig"]
|
||||
}
|
||||
container: MedusaContainer
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
}): Promise<void> {
|
||||
await runMedusaAppMigrations({
|
||||
configModule,
|
||||
container,
|
||||
linkModules,
|
||||
revert: false,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param modulesToRevert An array of modules for which you want to revert
|
||||
* migrations
|
||||
* @param configModule The config module
|
||||
* @param linkModules Custom links from the plugins
|
||||
* @param container The medusa container
|
||||
*/
|
||||
export async function revertMedusaApp({
|
||||
modulesToRevert,
|
||||
configModule,
|
||||
linkModules,
|
||||
container,
|
||||
}: {
|
||||
modulesToRevert: string[]
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
projectConfig: CommonTypes.ConfigModule["projectConfig"]
|
||||
}
|
||||
container: MedusaContainer
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
}): Promise<void> {
|
||||
await runMedusaAppMigrations({
|
||||
moduleNames: modulesToRevert,
|
||||
configModule,
|
||||
container,
|
||||
revert: true,
|
||||
linkModules,
|
||||
})
|
||||
}
|
||||
|
||||
export const loadMedusaApp = async (
|
||||
{
|
||||
container,
|
||||
|
||||
Reference in New Issue
Block a user