feat(migrations): CLI generate command (#8103)

This commit is contained in:
Adrien de Peretti
2024-07-12 13:12:49 +02:00
committed by GitHub
parent 4c2e9a3239
commit 104b00d4e9
14 changed files with 341 additions and 164 deletions
+52 -14
View File
@@ -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,
})
}
}
+27 -76
View File
@@ -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,