{"version":3,"file":"migrations.mjs","sources":["../../../src/migrations.ts"],"sourcesContent":["import {MigrationOperation} from '@shopify/shopify-app-session-storage';\n\nimport {MySqlConnection} from './mysql-connection';\n\nexport const migrationList = [\n  new MigrationOperation(\n    'migrateScopeFieldToVarchar1024',\n    migrateScopeFieldToVarchar1024,\n  ),\n  new MigrationOperation('addRefreshTokenFields', addRefreshTokenFields),\n  new MigrationOperation('addUserInfoColumns', addUserInfoColumns),\n];\n\nexport async function addRefreshTokenFields(\n  connection: MySqlConnection,\n): Promise<void> {\n  const hasColumn = async (columnName: string): Promise<boolean> => {\n    const [rows] = await connection.query(\n      `SELECT COLUMN_NAME\n       FROM INFORMATION_SCHEMA.COLUMNS\n       WHERE TABLE_SCHEMA = DATABASE()\n         AND TABLE_NAME = ?\n         AND COLUMN_NAME = ?`,\n      [connection.sessionStorageIdentifier, columnName],\n    );\n    return Array.isArray(rows) && rows.length > 0;\n  };\n\n  if (!(await hasColumn('refreshToken'))) {\n    await connection.query(\n      `ALTER TABLE ${connection.sessionStorageIdentifier} ADD COLUMN refreshToken varchar(255)`,\n    );\n  }\n\n  if (!(await hasColumn('refreshTokenExpires'))) {\n    await connection.query(\n      `ALTER TABLE ${connection.sessionStorageIdentifier} ADD COLUMN refreshTokenExpires integer`,\n    );\n  }\n}\n\nexport async function addUserInfoColumns(\n  connection: MySqlConnection,\n): Promise<void> {\n  // Check if the old onlineAccessInfo column exists (skips migration for new installs)\n  const [rows] = await connection.query(\n    `SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS\n     WHERE TABLE_NAME = ? AND COLUMN_NAME = 'onlineAccessInfo' AND TABLE_SCHEMA = DATABASE()`,\n    [connection.sessionStorageIdentifier],\n  );\n  // mysql2 returns COUNT as BigInt, use loose equality\n  // eslint-disable-next-line eqeqeq\n  if (!rows[0] || rows[0].cnt == 0) return;\n\n  // MySQL DDL (ALTER TABLE) causes an implicit commit, so a single transaction cannot\n  // give full atomicity here. Instead, each step is made idempotent so that a crash\n  // mid-migration leaves the DB in a state that is safe to retry.\n\n  // Step 1: Add new columns — skip if they already exist (handles a previous partial run).\n  const [newColRows] = await connection.query(\n    `SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS\n     WHERE TABLE_NAME = ? AND COLUMN_NAME = 'userId' AND TABLE_SCHEMA = DATABASE()`,\n    [connection.sessionStorageIdentifier],\n  );\n  // eslint-disable-next-line eqeqeq\n  if (newColRows[0]?.cnt == 0) {\n    await connection.query(`\n      ALTER TABLE \\`${connection.sessionStorageIdentifier}\\`\n        ADD COLUMN \\`userId\\` BIGINT,\n        ADD COLUMN \\`firstName\\` varchar(255),\n        ADD COLUMN \\`lastName\\` varchar(255),\n        ADD COLUMN \\`email\\` varchar(255),\n        ADD COLUMN \\`accountOwner\\` tinyint,\n        ADD COLUMN \\`locale\\` varchar(255),\n        ADD COLUMN \\`collaborator\\` tinyint,\n        ADD COLUMN \\`emailVerified\\` tinyint\n    `);\n  }\n\n  // Step 2: Preserve userId from the old onlineAccessInfo column (idempotent).\n  await connection.query(`\n    UPDATE \\`${connection.sessionStorageIdentifier}\\`\n    SET \\`userId\\` = CAST(\\`onlineAccessInfo\\` AS UNSIGNED)\n    WHERE \\`onlineAccessInfo\\` IS NOT NULL\n  `);\n\n  // Step 3: Drop the old column.\n  await connection.query(`\n    ALTER TABLE \\`${connection.sessionStorageIdentifier}\\`\n      DROP COLUMN \\`onlineAccessInfo\\`\n  `);\n}\n\n// need change the sizr of the scope column from 255 to 1024 char\nexport async function migrateScopeFieldToVarchar1024(\n  connection: MySqlConnection,\n): Promise<void> {\n  await connection.query(`ALTER TABLE ${connection.sessionStorageIdentifier} \n      MODIFY COLUMN scope varchar(1024)`);\n}\n"],"names":[],"mappings":";;AAIO,MAAM,aAAa,GAAG;AAC3B,IAAA,IAAI,kBAAkB,CACpB,gCAAgC,EAChC,8BAA8B,CAC/B;AACD,IAAA,IAAI,kBAAkB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;AACtE,IAAA,IAAI,kBAAkB,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;;AAG3D,eAAe,qBAAqB,CACzC,UAA2B,EAAA;AAE3B,IAAA,MAAM,SAAS,GAAG,OAAO,UAAkB,KAAsB;QAC/D,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CACnC,CAAA;;;;6BAIuB,EACvB,CAAC,UAAU,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAClD;AACD,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAC/C,IAAA,CAAC;IAED,IAAI,EAAE,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE;QACtC,MAAM,UAAU,CAAC,KAAK,CACpB,CAAA,YAAA,EAAe,UAAU,CAAC,wBAAwB,CAAA,qCAAA,CAAuC,CAC1F;IACH;IAEA,IAAI,EAAE,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAC,EAAE;QAC7C,MAAM,UAAU,CAAC,KAAK,CACpB,CAAA,YAAA,EAAe,UAAU,CAAC,wBAAwB,CAAA,uCAAA,CAAyC,CAC5F;IACH;AACF;AAEO,eAAe,kBAAkB,CACtC,UAA2B,EAAA;;IAG3B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CACnC,CAAA;AACyF,4FAAA,CAAA,EACzF,CAAC,UAAU,CAAC,wBAAwB,CAAC,CACtC;;;AAGD,IAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAAE;;;;;IAOlC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CACzC,CAAA;AAC+E,kFAAA,CAAA,EAC/E,CAAC,UAAU,CAAC,wBAAwB,CAAC,CACtC;;IAED,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;QAC3B,MAAM,UAAU,CAAC,KAAK,CAAC;AACL,oBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;;;;;;;AASpD,IAAA,CAAA,CAAC;IACJ;;IAGA,MAAM,UAAU,CAAC,KAAK,CAAC;AACV,aAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;AAG/C,EAAA,CAAA,CAAC;;IAGF,MAAM,UAAU,CAAC,KAAK,CAAC;AACL,kBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;AAEpD,EAAA,CAAA,CAAC;AACJ;AAEA;AACO,eAAe,8BAA8B,CAClD,UAA2B,EAAA;AAE3B,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA,YAAA,EAAe,UAAU,CAAC,wBAAwB,CAAA;AACnC,uCAAA,CAAA,CAAC;AACzC;;;;"}