{"version":3,"file":"migrations.mjs","sources":["../../../src/migrations.ts"],"sourcesContent":["import {MigrationOperation} from '@shopify/shopify-app-session-storage';\n\nimport {SqliteConnection} from './sqlite-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\nasync function addUserInfoColumns(connection: SqliteConnection): 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 pragma_table_info('${connection.sessionStorageIdentifier}') WHERE name='onlineAccessInfo'`,\n  );\n  if (!rows[0] || rows[0].cnt === 0) return;\n\n  const tempTableName = `${connection.sessionStorageIdentifier}_for_addUserInfoColumns`;\n\n  await connection.executeRawQuery('BEGIN');\n\n  // 1. rename existing table\n  await connection.query(\n    `ALTER TABLE ${connection.sessionStorageIdentifier} RENAME TO ${tempTableName};`,\n  );\n\n  // 2. create new table with individual user info columns (preserving refresh token fields)\n  await connection.query(`\n    CREATE TABLE ${connection.sessionStorageIdentifier} (\n      id varchar(255) NOT NULL PRIMARY KEY,\n      shop varchar(255) NOT NULL,\n      state varchar(255) NOT NULL,\n      isOnline integer NOT NULL,\n      expires integer,\n      scope varchar(1024),\n      accessToken varchar(255),\n      userId integer,\n      firstName varchar(255),\n      lastName varchar(255),\n      email varchar(255),\n      accountOwner integer,\n      locale varchar(255),\n      collaborator integer,\n      emailVerified integer,\n      refreshToken varchar(255),\n      refreshTokenExpires integer\n    );\n  `);\n\n  // 3. copy data, converting onlineAccessInfo -> userId, preserving refresh token fields\n  await connection.query(`\n    INSERT INTO ${connection.sessionStorageIdentifier} (id, shop, state, isOnline, expires, scope, accessToken, userId, refreshToken, refreshTokenExpires)\n      SELECT id, shop, state, isOnline, expires, scope, accessToken,\n        CASE WHEN onlineAccessInfo IS NOT NULL THEN CAST(onlineAccessInfo AS INTEGER) ELSE NULL END,\n        refreshToken, refreshTokenExpires\n      FROM ${tempTableName};\n  `);\n\n  // 4. drop old table\n  await connection.query(`DROP TABLE ${tempTableName};`);\n\n  await connection.executeRawQuery('COMMIT');\n}\n\n// need to migrate exisiting scope from varchar 255 to varchar 1024\nasync function migrateScopeFieldToVarchar1024(\n  connection: SqliteConnection,\n): Promise<void> {\n  // Skip for new installs where the table was created with the new schema (no onlineAccessInfo column)\n  const rows = await connection.query(\n    `SELECT COUNT(*) as cnt FROM pragma_table_info('${connection.sessionStorageIdentifier}') WHERE name='onlineAccessInfo'`,\n  );\n  if (!rows[0] || rows[0].cnt === 0) return;\n\n  const tempTableName = `${connection.sessionStorageIdentifier}_for_migrateScopeFieldToVarchar1024`;\n\n  await connection.executeRawQuery('BEGIN');\n\n  //  1. rename exisiting table\n  const rename = `\n    ALTER TABLE ${connection.sessionStorageIdentifier} RENAME TO ${tempTableName};\n  `;\n  await connection.query(rename);\n\n  // 2. Create new table with 1024 chars\n  const newTable = `\n        CREATE TABLE ${connection.sessionStorageIdentifier} (\n          id varchar(255) NOT NULL PRIMARY KEY,\n          shop varchar(255) NOT NULL,\n          state varchar(255) NOT NULL,\n          isOnline integer NOT NULL,\n          expires integer,\n          scope varchar(1024),\n          accessToken varchar(255),\n          onlineAccessInfo varchar(255)\n        );\n      `;\n  await connection.query(newTable);\n\n  // 3. copy all content from old table into new table\n  const insert = `\n    INSERT INTO ${connection.sessionStorageIdentifier} (id,shop,state,isOnline,expires,scope,accessToken,onlineAccessInfo)\n      SELECT id,shop,state,isOnline,expires,scope,accessToken,onlineAccessInfo\n      FROM ${tempTableName};\n  `;\n  await connection.query(insert);\n\n  // 4. Delete old renamed table\n  const drop = `DROP TABLE ${tempTableName};`;\n  await connection.query(drop);\n\n  await connection.executeRawQuery('COMMIT');\n}\n\n// Add refresh token and refresh token expiration fields\nasync function addRefreshTokenFields(\n  connection: SqliteConnection,\n): Promise<void> {\n  // Skip for new installs where the table was created with the new schema (no onlineAccessInfo column)\n  const rows = await connection.query(\n    `SELECT COUNT(*) as cnt FROM pragma_table_info('${connection.sessionStorageIdentifier}') WHERE name='onlineAccessInfo'`,\n  );\n  if (!rows[0] || rows[0].cnt === 0) return;\n\n  const tempTableName = `${connection.sessionStorageIdentifier}_for_addRefreshTokenFields`;\n\n  await connection.executeRawQuery('BEGIN');\n\n  // 1. Rename existing table\n  const rename = `\n    ALTER TABLE ${connection.sessionStorageIdentifier} RENAME TO ${tempTableName};\n  `;\n  await connection.query(rename);\n\n  // 2. Create new table with refresh token fields\n  const newTable = `\n    CREATE TABLE ${connection.sessionStorageIdentifier} (\n      id varchar(255) NOT NULL PRIMARY KEY,\n      shop varchar(255) NOT NULL,\n      state varchar(255) NOT NULL,\n      isOnline integer NOT NULL,\n      expires integer,\n      scope varchar(1024),\n      accessToken varchar(255),\n      onlineAccessInfo varchar(255),\n      refreshToken varchar(255),\n      refreshTokenExpires integer\n    );\n  `;\n  await connection.query(newTable);\n\n  // 3. Copy all content from old table into new table\n  const insert = `\n    INSERT INTO ${connection.sessionStorageIdentifier}\n      (id, shop, state, isOnline, expires, scope, accessToken, onlineAccessInfo)\n    SELECT id, shop, state, isOnline, expires, scope, accessToken, onlineAccessInfo\n    FROM ${tempTableName};\n  `;\n  await connection.query(insert);\n\n  // 4. Delete old renamed table\n  const drop = `DROP TABLE ${tempTableName};`;\n  await connection.query(drop);\n\n  await connection.executeRawQuery('COMMIT');\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;;AAGlE,eAAe,kBAAkB,CAAC,UAA4B,EAAA;;AAE5D,IAAA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CACjC,CAAA,+CAAA,EAAkD,UAAU,CAAC,wBAAwB,CAAA,gCAAA,CAAkC,CACxH;AACD,IAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAAE;AAEnC,IAAA,MAAM,aAAa,GAAG,CAAA,EAAG,UAAU,CAAC,wBAAwB,yBAAyB;AAErF,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC;;AAGzC,IAAA,MAAM,UAAU,CAAC,KAAK,CACpB,CAAA,YAAA,EAAe,UAAU,CAAC,wBAAwB,CAAA,WAAA,EAAc,aAAa,CAAA,CAAA,CAAG,CACjF;;IAGD,MAAM,UAAU,CAAC,KAAK,CAAC;AACN,iBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;;;;;;;;;;;;;;;;;AAmBnD,EAAA,CAAA,CAAC;;IAGF,MAAM,UAAU,CAAC,KAAK,CAAC;AACP,gBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;;aAIxC,aAAa,CAAA;AACvB,EAAA,CAAA,CAAC;;IAGF,MAAM,UAAU,CAAC,KAAK,CAAC,cAAc,aAAa,CAAA,CAAA,CAAG,CAAC;AAEtD,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC5C;AAEA;AACA,eAAe,8BAA8B,CAC3C,UAA4B,EAAA;;AAG5B,IAAA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CACjC,CAAA,+CAAA,EAAkD,UAAU,CAAC,wBAAwB,CAAA,gCAAA,CAAkC,CACxH;AACD,IAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAAE;AAEnC,IAAA,MAAM,aAAa,GAAG,CAAA,EAAG,UAAU,CAAC,wBAAwB,qCAAqC;AAEjG,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC;;AAGzC,IAAA,MAAM,MAAM,GAAG;kBACC,UAAU,CAAC,wBAAwB,CAAA,WAAA,EAAc,aAAa,CAAA;GAC7E;AACD,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;;AAG9B,IAAA,MAAM,QAAQ,GAAG;AACI,qBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;;;;;;;;OAUnD;AACL,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;;AAGhC,IAAA,MAAM,MAAM,GAAG;AACC,gBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;aAExC,aAAa,CAAA;GACvB;AACD,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;;AAG9B,IAAA,MAAM,IAAI,GAAG,CAAA,WAAA,EAAc,aAAa,GAAG;AAC3C,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AAE5B,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC5C;AAEA;AACA,eAAe,qBAAqB,CAClC,UAA4B,EAAA;;AAG5B,IAAA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CACjC,CAAA,+CAAA,EAAkD,UAAU,CAAC,wBAAwB,CAAA,gCAAA,CAAkC,CACxH;AACD,IAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAAE;AAEnC,IAAA,MAAM,aAAa,GAAG,CAAA,EAAG,UAAU,CAAC,wBAAwB,4BAA4B;AAExF,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC;;AAGzC,IAAA,MAAM,MAAM,GAAG;kBACC,UAAU,CAAC,wBAAwB,CAAA,WAAA,EAAc,aAAa,CAAA;GAC7E;AACD,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;;AAG9B,IAAA,MAAM,QAAQ,GAAG;AACA,iBAAA,EAAA,UAAU,CAAC,wBAAwB,CAAA;;;;;;;;;;;;GAYnD;AACD,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;;AAGhC,IAAA,MAAM,MAAM,GAAG;AACC,gBAAA,EAAA,UAAU,CAAC,wBAAwB;;;WAG1C,aAAa,CAAA;GACrB;AACD,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;;AAG9B,IAAA,MAAM,IAAI,GAAG,CAAA,WAAA,EAAc,aAAa,GAAG;AAC3C,IAAA,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AAE5B,IAAA,MAAM,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC5C;;;;"}