#!/usr/bin/env bash
# 发布到 npm 公共仓（令牌免浏览器 2FA 授权）
#
# 令牌配置（一次性）：在包根目录 .env 里加一行
#     NPM_TOKEN=npm_xxxxxxxxxxxx
#   令牌到 npmjs.com → 头像 → Access Tokens 生成：
#   推荐 Granular（限定 aims-workstation 包、Read and write、可设过期时间）；
#   选 Classic 时必须用 Automation 类型——Publish 类型在 2FA 开启下仍会要求验证码。
#   CI/临时覆盖可用环境变量：NPM_TOKEN=npm_xxx ./scripts/publish-npm.sh
#   ⚠ 令牌不要写进本文件：scripts/ 在 package.json 的 files 清单里，会随 npm 包发布出去
#
# 用法（在 aims-workstation/ 目录下）：
#   ./scripts/publish-npm.sh            发布当前版本
#   ./scripts/publish-npm.sh patch      先升版本（patch/minor/major/1.2.3）再发布
set -euo pipefail
cd "$(dirname "$0")/.."

REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}"

# 令牌：环境变量 > .env 的 NPM_TOKEN（不 source 整个 .env，只取这一行）
TOKEN="${NPM_TOKEN:-}"
if [[ -z "$TOKEN" && -f .env ]]; then
  TOKEN="$(sed -n 's/^NPM_TOKEN=//p' .env | tail -n1 | tr -d "[:space:]\"'")"
fi
if [[ -z "$TOKEN" ]]; then
  echo "✗ 未找到 NPM_TOKEN（环境变量或 .env）。到 npmjs.com → Access Tokens 生成后执行："
  echo "    echo 'NPM_TOKEN=npm_你的令牌' >> .env"
  exit 1
fi
case "$TOKEN" in
  npm_*) ;;
  *) echo "⚠ 令牌不以 npm_ 开头（npmjs.org 令牌通常以 npm_ 开头），请确认来源" ;;
esac

if [[ $# -ge 1 ]]; then
  npm version "$1" --no-git-tag-version
fi
NAME="$(node -p "require('./package.json').name")"
VERSION="$(node -p "require('./package.json').version")"
echo "→ 发布 $NAME@$VERSION → $REGISTRY"

# 令牌经临时 userconfig 传入，不写 ~/.npmrc、不落盘
CFG="$(mktemp)"
trap 'rm -f "$CFG"' EXIT
HOST_KEY="$(echo "$REGISTRY" | sed -E 's|^https?://||; s|/+$||')"
printf '//%s/:_authToken=%s\n' "$HOST_KEY" "$TOKEN" > "$CFG"

echo "→ 身份: $(NPM_CONFIG_USERCONFIG="$CFG" npm whoami --registry="$REGISTRY" 2>/dev/null || echo '未知（Granular 令牌不支持 whoami，属正常，直接尝试发布）')"
NPM_CONFIG_USERCONFIG="$CFG" npm publish --registry="$REGISTRY"
echo "✅ 已发布 $NAME@$VERSION"
echo "   安装: npx $NAME@$VERSION"
if [[ $# -ge 1 ]]; then
  echo "ℹ 版本号已变更，记得提交 package.json / package-lock.json"
fi
