```ts
export function chainTransforms(grid: number[][], steps: string[]): number[][] {
  if (grid.length === 0 || grid.some(row => row.length !== grid[0].length)) {
    throw new Error("Invalid grid");
  }

  const transformMap = {
    cw: (g: number[][]) => g[0].map((_, i) => g.map(row => row[i]).reverse()),
    ccw: (g: number[][]) => g[0].map((_, i) => g.map(row => row[row.length - 1 - i])),
    mirror: (g: number[][]) => g.map(row => [...row].reverse()),
    flip: (g: number[][]) => [...g].reverse(),
    diag: (g: number[][]) => Array.from({ length: g[0].length }, (_, i) => g.map(row => row[i]))
  };

  let result = grid;
  for (const step of steps) {
    if (!transformMap.hasOwnProperty(step)) {
      throw new Error("Invalid step");
    }
    result = transformMap[step](result);
  }

  return result;
}
```