{"id":"201f22fca739ab70","repo":"sequelize/sequelize","slug":"migration-inspect-migrationname-has-an-invalid-201f22","errorCode":null,"errorMessage":"Migration ${inspect(migrationName)} has an invalid \"down\" export: It must be a function, but it is ${inspect(down)}","messagePattern":"Migration (.+?) has an invalid \"down\" export: It must be a function, but it is (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cli/src/api/get-umzug.ts","lineNumber":162,"sourceCode":"        );\n      }\n\n      const sequelize = migrationParams.context.sequelize;\n\n      await up(sequelize.queryInterface, sequelize, migrationParams);\n    },\n    down: async migrationParams => {\n      const migration = await import(pathToFileURL(migrationPath).href);\n      const down = migration.down ?? migration.default?.down;\n\n      if (!down) {\n        throw new Error(\n          `Migration ${inspect(migrationName)} is missing the \"down\" export, so cannot be reverted.`,\n        );\n      }\n\n      if (!isFunction(down)) {\n        throw new Error(\n          `Migration ${inspect(migrationName)} has an invalid \"down\" export: It must be a function, but it is ${inspect(down)}`,\n        );\n      }\n\n      const sequelize = migrationParams.context.sequelize;\n\n      await down(sequelize.queryInterface, sequelize, migrationParams);\n    },\n  };\n}\n","sourceCodeStart":144,"sourceCodeEnd":173,"githubUrl":"https://github.com/sequelize/sequelize/blob/7e1deec499d5afbb8d1877c2f4d545cead1214ec/packages/cli/src/api/get-umzug.ts#L144-L173","documentation":"createJsMigration located a `down` export but `isFunction(down)` is false. Since `down` is invoked as a function to revert the migration, a non-callable value is rejected.","triggerScenarios":"Exporting `down` as a non-function — an object, string, or constant — in a JS migration that is then reverted.","commonSituations":"Placeholder `export const down = null`/`false`; copying a config object into `down`; refactor leftover.","solutions":["Make `down` a function: `export async function down(queryInterface) { ... }`.","If irreversibility is intended, omit `down` entirely (you will get error [7] on undo instead) and simply never undo it."],"exampleFix":"// before\nexport const down = null;\n// after\nexport async function down(queryInterface) { await queryInterface.dropTable('users'); }","handlingStrategy":"type-guard","validationCode":"function assertDownIsFunction(mod: any, file: string) {\n  const down = mod.down ?? mod.default?.down;\n  if (typeof down !== 'function') {\n    throw new Error(`'down' in ${file} must be a function, got ${typeof down}`);\n  }\n}","typeGuard":"function isMigrationDown(mod: any): mod is { down: (...a: any[]) => any } {\n  return typeof mod?.down === 'function' || typeof mod?.default?.down === 'function';\n}","tryCatchPattern":null,"preventionTips":["Never assign non-function values to `down`; if irreversible, omit `down` and avoid undoing it.","Run a CI check asserting `down` is a function for every migration file."],"tags":["cli","migrations","exports","type-mismatch","undo"],"analyzedSha":"7e1deec499d5afbb8d1877c2f4d545cead1214ec","analyzedAt":"2026-08-03T18:58:44.549Z","schemaVersion":2}