// package-lock.json 的 resolved 字段记的是完整下载地址,带 registry 主机名。
// 本仓在公司内外网两套 registry 下都要构建,带主机名的 lock 只能在其中一边用。
// 删掉这些地址后,下载地址由当前环境的 registry 配置推导,版本和内容仍由 integrity 锁死。
// 只处理 http(s) 地址,file: 的本地 tgz 和 git+ 的仓库地址必须原样保留。
import { readFileSync, writeFileSync } from 'node:fs';

const LOCK_FILE = 'package-lock.json';

function isRegistryUrl(resolved) {
  return typeof resolved === 'string' && /^https?:/.test(resolved);
}

function stripPackages(packages) {
  let count = 0;
  for (const entry of Object.values(packages)) {
    if (isRegistryUrl(entry.resolved)) {
      delete entry.resolved;
      count += 1;
    }
  }
  return count;
}

// lockfileVersion 2 除了 packages 还带一份嵌套的 dependencies,同样要清
function stripDependencies(dependencies) {
  let count = 0;
  for (const entry of Object.values(dependencies)) {
    if (isRegistryUrl(entry.resolved)) {
      delete entry.resolved;
      count += 1;
    }
    if (entry.dependencies) {
      count += stripDependencies(entry.dependencies);
    }
  }
  return count;
}

const lock = JSON.parse(readFileSync(LOCK_FILE, 'utf8'));
let count = 0;
if (lock.packages) {
  count += stripPackages(lock.packages);
}
if (lock.dependencies) {
  count += stripDependencies(lock.dependencies);
}

if (count === 0) {
  process.exit(0);
}

writeFileSync(LOCK_FILE, `${JSON.stringify(lock, null, 2)}\n`);
process.exit(1);