import RE2 from "re2"; export class convertHardMutes1644010796173 { name = "convertHardMutes1644010796173"; async up(queryRunner) { let entries = await queryRunner.query( `SELECT "userId", "mutedWords" FROM "user_profile" WHERE "userHost" IS NULL`, ); for (let i = 0; i < entries.length; i++) { let words = entries[i].mutedWords .map((line) => { if (typeof line === "string") return []; const regexp = line.join(" ").match(/^\/(.+)\/(.*)$/); if (regexp) { // convert regexp's try { new RE2(regexp[1], regexp[2]); return `/${regexp[1]}/${regexp[2]}`; } catch (err) { // invalid regex, ignore it return []; } } else { // remove empty segments return line.filter((x) => x !== ""); } }) // remove empty lines .filter((x) => !(Array.isArray(x) && x.length === 0)); await queryRunner.connection .createQueryBuilder() .update("user_profile") .set({ mutedWords: words, }) .where("userId = :id", { id: entries[i].userId }) .execute(); } } async down(queryRunner) { let entries = await queryRunner.query( `SELECT "userId", "mutedWords" FROM "user_profile"`, ); for (let i = 0; i < entries.length; i++) { let words = entries[i].mutedWords .map((line) => { if (Array.isArray(line)) { return line; } else { // do not split regex at spaces again return [line]; } }) // remove empty lines .filter((x) => !(Array.isArray(x) && x.length === 0)); await queryRunner.connection .createQueryBuilder() .update("user_profile") .set({ mutedWords: words, }) .where("userId = :id", { id: entries[i].userId }) .execute(); } } }