DEV Community

Cover image for Checking if we migrated all the pages
Sibelius Seraphini for Woovi

Posted on

Checking if we migrated all the pages

We migrated our landing page woovi.com from Gatsby to Next.js. Gatsby was a good idea back then, but Next.js evolved better and faster. We need to modify our landing page faster to add new products, articles and experimentation, so the migration to Next.js was worth it.

Migrating the Landing page

Our landing page has many pages and articles, and we want to make sure we migrated everything from the old Gatsby to the new Next.js.
Our landing pages are in a monorepo, and instead of modifying the existing Gatsby landing page (woovi package), we created a new package woovi-next where we are going to do the migration.

This migration pattern can be called Tick Tock or parallel implementation, where both implementation coexist until the new ones reaches the feature parity, and we can discontinue the old one.

This is the safest way to migrate anything, and let you compare the old with the new.

Making it sure we migrated all the pages

Both Gatsby and Next.js uses a pages folder structure to declare each route/endpoint/page. So the easiest way to check if we migrated all the pages is to check if the pages folder are "equal". Two folders are equal if they have the same files, and folder recursively.

Here is the script that checks that both pages have the same structure.

export const compareDirectories = async (dir1: string, dir2: string) => {
  const dir1Contents = fs.readdirSync(dir1, { withFileTypes: true });

  for (const item of dir1Contents) {
    const itemPath1 = `${dir1}/${item.name}`;
    const itemPath2 = `${dir2}/${item.name}`;

    if (!fs.existsSync(itemPath1) || !fs.existsSync(itemPath2)) {
      missing++;
      // eslint-disable-next-line
      console.log(
        `File or directory not found: ${
          !fs.existsSync(itemPath1) ? itemPath1 : itemPath2
        }`,
      );
      continue;
    }

    const stats1 = fs.statSync(itemPath1);
    const stats2 = fs.statSync(itemPath2);

    if (stats1.isDirectory() && stats2.isDirectory()) {
      // recursively compare subdirectories
      const subDirsEqual = compareDirectories(itemPath1, itemPath2);
      if (!subDirsEqual) {
        continue;
      }
    } else if (stats1.isFile() && stats2.isFile()) {
      continue;
    } else {
      // eslint-disable-next-line
      console.log(
        `Item types don't match: ${itemPath1} (${
          stats1.isDirectory() ? 'directory' : 'file'
        }) vs ${itemPath2} (${stats2.isDirectory() ? 'directory' : 'file'})`,
      );
      // item types don't match
      continue;
    }
  }

  // all items in the directories are equal
  return true;
};
Enter fullscreen mode Exit fullscreen mode

This is how to use the function:

const cwd = process.cwd();

const gatsbyPages = path.join(cwd, './packages/woovi/src/pages');
const nextPages = path.join(cwd, './packages/woovi-next/src/pages');

await compareDirectories(gatsbyPages, nextPages);
Enter fullscreen mode Exit fullscreen mode

Here is the output of our script during our migration:

File or directory not found: packages/woovi-next/src/pages/ecommerce/images
File or directory not found: packages/woovi-next/src/pages/plugin
File or directory not found: packages/woovi-next/src/pages/pricing
File or directory not found: packages/woovi-next/src/pages/pricing-old
File or directory not found: packages/woovi-next/src/pages/qrcode/scanner
File or directory not found: packages/woovi-next/src/pages/sales
File or directory not found: packages/woovi-next/src/pages/virtual-account
Enter fullscreen mode Exit fullscreen mode

In Summary

You can write scripts and automations to help you migrate a website and avoid missing some page.
Instead of using a sitemap or something more complex, just comparing two folders was enough to achieve our goal.
We are going to write more about our automation for our landing page in the next articles.


Woovi
Woovi is a Startup that enables shoppers to pay as they like. To make this possible, Woovi provides instant payment solutions for merchants to accept orders.

If you want to work with us, we are hiring!


Photo by Sumner Mahaffey on Unsplash

Top comments (0)