How to create new block header correctly

import { Block } from "bitcoinjs-lib";
import scrypt from "scryptsy";

// Main: fetch blocks from each difficulty period
async function main() {
  try {
    // I want to create exact same hash from same input of already mined block
    const blockHash =
      "bd15d38eec25b454d3d9bc8fb498a460be8c6d9322e497f8cd57c3dc42f5123c";
    // block header hex = 00000020e23f015ddfacac68673ddb557e0170a8f0583d502dfc4c647fb4afd334cd3e322b63ff23c957b567d88b616e918cc7ab787fbbcb70b4d34c83b4d252d2727a69eb77f568fcff031c3478320e
    const block = Block.fromHex(
      "00000020e23f015ddfacac68673ddb557e0170a8f0583d502dfc4c647fb4afd334cd3e322b63ff23c957b567d88b616e918cc7ab787fbbcb70b4d34c83b4d252d2727a69eb77f568fcff031c3478320e"
    );
    const headerBuffer = block.toBuffer(true); // it return only header uint8array
    const header = Buffer.from(headerBuffer);
    const pow = scrypt(header, header, 1024, 1, 1, 32);
    const powHashBE = Buffer.from(pow); // Big-endian from scrypt
    const powHashLE = Buffer.from(pow).reverse(); // what Core shows in getblockheader
    const targetBuf = Block.calculateTarget(block.bits); // full 32-byte target

    console.log("PoW hash (BE):", powHashBE.toString("hex"));
    console.log("PoW hash (LE):", powHashLE.toString("hex"));
    console.log("Target (BE):", targetBuf.toString("hex"));
    console.log("Hash:", blockHash);
    // How i can generate pow same as blockHash, as i am using same header
    // output i am getting
    // PoW hash (BE): ccb957e3358b200dff3c64a5c4fc755e5e103d1e94040e4624a9200100000000
    // PoW hash (LE): 000000000120a924460e04941e3d105e5e75fcc4a5643cff0d208b35e357b9cc
    // Target (BE): 0,0,0,0,3,255,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    // Hash: bd15d38eec25b454d3d9bc8fb498a460be8c6d9322e497f8cd57c3dc42f5123c
  } catch (err) {
    console.error("❌ Error:", err);
  }
}

main();