← Files Product DesignARCHIVED FILE

templates/mobile-app/scripts/update-mobile-runtime-lock.mjs

1.69 KB · Sep 30, 2026 · 23:19 UTC

↓ Download file

#!/usr/bin/env node
import { createHash } from "node:crypto";
import { existsSync, readFileSync, writeFileSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const lockPath = path.join(root, "mobile-runtime.lock.json");
const protectedFiles = [
  "scripts/check-mobile-runtime.mjs",
  "scripts/prepare-sites-build.mjs",
  "scripts/update-mobile-runtime-lock.mjs",
  "vite.config.ts",
  "src/App.tsx",
  "src/main.tsx",
  "src/styles.css",
  "src/mobile/BottomSheet.tsx",
  "src/mobile/Carousel.tsx",
  "src/mobile/Device.tsx",
  "src/mobile/FlowStack.tsx",
  "src/mobile/Keyboard.tsx",
  "src/mobile/MobileCursor.tsx",
  "src/mobile/MobileRuntime.tsx",
  "src/mobile/MobileScroll.tsx",
  "src/mobile/PhoneFrame.tsx",
  "src/mobile/assets.ts",
  "src/mobile/components.tsx",
  "src/mobile/geometry.ts",
  "src/mobile/index.ts",
  "public/assets/iphone/Bezel.png",
  "public/assets/iphone/Keyboard.png",
  "public/assets/android/Pixel10.png",
  "public/assets/android/Keyboard.png",
  "public/assets/android/navigation-bar.svg",
  "public/assets/status/status-icons.svg",
  "public/assets/status/ios-status-icons.svg",
  "worker/index.js",
];

const hashes = {};
for (const relativePath of protectedFiles) {
  const filePath = path.join(root, relativePath);
  if (!existsSync(filePath)) throw new Error(`Protected runtime file is missing: ${relativePath}`);
  hashes[relativePath] = createHash("sha256").update(readFileSync(filePath)).digest("hex");
}

writeFileSync(lockPath, `${JSON.stringify(hashes, null, 2)}\n`);
console.log(`Updated mobile-runtime.lock.json (${protectedFiles.length} protected files).`);

SHA-256: b4e1aa41133f19ba8bb32685b3ec05798b1ceabaf72c328419d545aa60fe1f0b