222
schangxiang@126.com
2025-06-13 6a8393408d8cefcea02b7a598967de8dc1e565c2
1
{"version":3,"sources":["../../src/commands/MigrationGenerateCommand.ts"],"names":[],"mappings":";;;AAAA,iFAA8E;AAC9E,+CAA4C;AAE5C,kCAA0C;AAC1C,2DAAwD;AACxD,mDAA8C;AAE9C,IAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/B;;GAEG;AACH;IAAA;QAEI,YAAO,GAAG,oBAAoB,CAAC;QAC/B,aAAQ,GAAG,gFAAgF,CAAC;QAC5F,YAAO,GAAG,qBAAqB,CAAC;IAmIpC,CAAC;IAjIG,0CAAO,GAAP,UAAQ,IAAgB;QACpB,OAAO,IAAI;aACN,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,8CAA8C;SAC3D,CAAC;aACD,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,8BAA8B;YACxC,MAAM,EAAE,IAAI;SACf,CAAC;aACD,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,8CAA8C;SAC3D,CAAC;aACD,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,iDAAiD;SAC9D,CAAC,CAAC;IACX,CAAC;IAEK,0CAAO,GAAb,UAAc,IAAqB;;;;;;wBAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE;4BACrC,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;yBAC/F;wBAEK,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;wBACjC,QAAQ,GAAG,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;wBACjD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;6BAGrB,CAAC,SAAS,EAAV,wBAAU;;;;wBAEA,uBAAuB,GAAG,IAAI,iDAAuB,CAAC;4BACxD,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;4BACnB,UAAU,EAAE,IAAI,CAAC,MAAa;yBACjC,CAAC,CAAC;wBACuB,qBAAM,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAiB,CAAC,EAAA;;wBAA7E,iBAAiB,GAAG,SAAyD;wBACnF,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;;;;;;wBAIxF,UAAU,GAAyB,SAAS,CAAC;;;;wBAEvC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC;4BACxD,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;4BACnB,UAAU,EAAE,IAAI,CAAC,MAAa;yBACjC,CAAC,CAAC;wBACuB,qBAAM,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAiB,CAAC,EAAA;;wBAA7E,iBAAiB,GAAG,SAAyD;wBACnF,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE;4BAC7B,WAAW,EAAE,KAAK;4BAClB,aAAa,EAAE,KAAK;4BACpB,UAAU,EAAE,KAAK;4BACjB,OAAO,EAAE,KAAK;yBACjB,CAAC,CAAC;wBACU,qBAAM,wBAAgB,CAAC,iBAAiB,CAAC,EAAA;;wBAAtD,UAAU,GAAG,SAAyC,CAAC;wBACnC,qBAAM,UAAU,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAA;;wBAAjE,WAAW,GAAG,SAAmD;wBACjE,WAAmB,EAAE,EAAE,aAAqB,EAAE,CAAC;wBAErD,4GAA4G;wBAC5G,sEAAsE;wBACtE,IAAI,UAAU,CAAC,MAAM,YAAY,yBAAW,EAAE;4BAC1C,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,UAAA,OAAO;gCACjC,QAAM,CAAC,IAAI,CAAC,oCAAoC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAG,EAAE,GAAG,CAAC,EAAE,MAAK,CAAC,GAAG,MAAM,CAAC,CAAC;4BACpH,CAAC,CAAC,CAAC;4BACH,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,UAAA,SAAS;gCACrC,UAAQ,CAAC,IAAI,CAAC,oCAAoC,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAG,EAAE,GAAG,CAAC,EAAE,MAAK,CAAC,GAAG,MAAM,CAAC,CAAC;4BACxH,CAAC,CAAC,CAAC;yBACN;6BAAM;4BACH,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,UAAA,OAAO;gCACjC,QAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;4BAClH,CAAC,CAAC,CAAC;4BACH,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,UAAA,SAAS;gCACrC,UAAQ,CAAC,IAAI,CAAC,mCAAmC,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;4BACtH,CAAC,CAAC,CAAC;yBACN;6BAEG,QAAM,CAAC,MAAM,EAAb,yBAAa;6BACT,IAAI,CAAC,IAAI,EAAT,yBAAS;wBACH,WAAW,GAAG,wBAAwB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAW,EAAE,SAAS,EAAE,QAAM,EAAE,UAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;wBAC5G,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;wBACnF,qBAAM,2BAAY,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,EAAA;;wBAAhD,SAAgD,CAAC;wBAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAmC,CAAC,CAAC,CAAC;;;wBAE3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;;;;wBAG/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kJAAgJ,CAAC,CAAC,CAAC;;6BAEhL,qBAAM,UAAU,CAAC,KAAK,EAAE,EAAA;;wBAAxB,SAAwB,CAAC;;;;6BAGrB,UAAU,EAAV,yBAAU;wBAAE,qBAAO,UAAyB,CAAC,KAAK,EAAE,EAAA;;wBAAxC,SAAwC,CAAC;;;wBAEzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;wBACrE,OAAO,CAAC,KAAK,CAAC,KAAG,CAAC,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;;;KAEvB;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IAE5E;;OAEG;IACc,oCAAW,GAA5B,UAA6B,IAAY,EAAE,SAAiB,EAAE,MAAgB,EAAE,QAAkB;QAC9F,OAAO,gFAEA,uBAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,2GAG9C,MAAM,CAAC,IAAI,CAAC,IACb,CAAC,oFAIA,QAAQ,CAAC,IAAI,CAAC,IACf,CAAC,mBAID,CAAC;IACE,CAAC;IAEL,+BAAC;AAAD,CAvIA,AAuIC,IAAA;AAvIY,4DAAwB","file":"MigrationGenerateCommand.js","sourcesContent":["import {ConnectionOptionsReader} from \"../connection/ConnectionOptionsReader\";\nimport {CommandUtils} from \"./CommandUtils\";\nimport {Connection} from \"../connection/Connection\";\nimport {createConnection} from \"../index\";\nimport {MysqlDriver} from \"../driver/mysql/MysqlDriver\";\nimport {camelCase} from \"../util/StringUtils\";\nimport * as yargs from \"yargs\";\nconst chalk = require(\"chalk\");\n\n/**\n * Generates a new migration file with sql needs to be executed to update schema.\n */\nexport class MigrationGenerateCommand implements yargs.CommandModule {\n\n    command = \"migration:generate\";\n    describe = \"Generates a new migration file with sql needs to be executed to update schema.\";\n    aliases = \"migrations:generate\";\n\n    builder(args: yargs.Argv) {\n        return args\n            .option(\"c\", {\n                alias: \"connection\",\n                default: \"default\",\n                describe: \"Name of the connection on which run a query.\"\n            })\n            .option(\"n\", {\n                alias: \"name\",\n                describe: \"Name of the migration class.\",\n                demand: true\n            })\n            .option(\"d\", {\n                alias: \"dir\",\n                describe: \"Directory where migration should be created.\"\n            })\n            .option(\"f\", {\n                alias: \"config\",\n                default: \"ormconfig\",\n                describe: \"Name of the file with connection configuration.\"\n            });\n    }\n\n    async handler(args: yargs.Arguments) {\n        if (args._[0] === \"migrations:generate\") {\n            console.log(\"'migrations:generate' is deprecated, please use 'migration:generate' instead\");\n        }\n\n        const timestamp = new Date().getTime();\n        const filename = timestamp + \"-\" + args.name + \".ts\";\n        let directory = args.dir;\n\n        // if directory is not set then try to open tsconfig and find default path there\n        if (!directory) {\n            try {\n                const connectionOptionsReader = new ConnectionOptionsReader({\n                    root: process.cwd(),\n                    configName: args.config as any\n                });\n                const connectionOptions = await connectionOptionsReader.get(args.connection as any);\n                directory = connectionOptions.cli ? connectionOptions.cli.migrationsDir : undefined;\n            } catch (err) { }\n        }\n\n        let connection: Connection|undefined = undefined;\n        try {\n            const connectionOptionsReader = new ConnectionOptionsReader({\n                root: process.cwd(),\n                configName: args.config as any\n            });\n            const connectionOptions = await connectionOptionsReader.get(args.connection as any);\n            Object.assign(connectionOptions, {\n                synchronize: false,\n                migrationsRun: false,\n                dropSchema: false,\n                logging: false\n            });\n            connection = await createConnection(connectionOptions);\n            const sqlInMemory = await connection.driver.createSchemaBuilder().log();\n            const upSqls: string[] = [], downSqls: string[] = [];\n\n            // mysql is exceptional here because it uses ` character in to escape names in queries, that's why for mysql\n            // we are using simple quoted string instead of template string syntax\n            if (connection.driver instanceof MysqlDriver) {\n                sqlInMemory.upQueries.forEach(upQuery => {\n                    upSqls.push(\"        await queryRunner.query(\\\"\" + upQuery.query.replace(new RegExp(`\"`, \"g\"), `\\\\\"`) + \"\\\");\");\n                });\n                sqlInMemory.downQueries.forEach(downQuery => {\n                    downSqls.push(\"        await queryRunner.query(\\\"\" + downQuery.query.replace(new RegExp(`\"`, \"g\"), `\\\\\"`) + \"\\\");\");\n                });\n            } else {\n                sqlInMemory.upQueries.forEach(upQuery => {\n                    upSqls.push(\"        await queryRunner.query(`\" + upQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") + \"`);\");\n                });\n                sqlInMemory.downQueries.forEach(downQuery => {\n                    downSqls.push(\"        await queryRunner.query(`\" + downQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") + \"`);\");\n                });\n            }\n\n            if (upSqls.length) {\n                if (args.name) {\n                    const fileContent = MigrationGenerateCommand.getTemplate(args.name as any, timestamp, upSqls, downSqls.reverse());\n                    const path = process.cwd() + \"/\" + (directory ? (directory + \"/\") : \"\") + filename;\n                    await CommandUtils.createFile(path, fileContent);\n\n                    console.log(chalk.green(`Migration ${chalk.blue(path)} has been generated successfully.`));\n                } else {\n                    console.log(chalk.yellow(\"Please specify migration name\"));\n                }\n            } else {\n                console.log(chalk.yellow(`No changes in database schema were found - cannot generate a migration. To create a new empty migration use \"typeorm migration:create\" command`));\n            }\n            await connection.close();\n\n        } catch (err) {\n            if (connection) await (connection as Connection).close();\n\n            console.log(chalk.black.bgRed(\"Error during migration generation:\"));\n            console.error(err);\n            process.exit(1);\n        }\n    }\n\n    // -------------------------------------------------------------------------\n    // Protected Static Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Gets contents of the migration file.\n     */\n    protected static getTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n        return `import {MigrationInterface, QueryRunner} from \"typeorm\";\n\nexport class ${camelCase(name, true)}${timestamp} implements MigrationInterface {\n\n    public async up(queryRunner: QueryRunner): Promise<any> {\n${upSqls.join(`\n`)}\n    }\n\n    public async down(queryRunner: QueryRunner): Promise<any> {\n${downSqls.join(`\n`)}\n    }\n\n}\n`;\n    }\n\n}\n"],"sourceRoot":".."}