-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpublish.sh
More file actions
executable file
·131 lines (112 loc) · 5.13 KB
/
Copy pathpublish.sh
File metadata and controls
executable file
·131 lines (112 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env bash
set -euo pipefail
# ── 配置 ──────────────────────────────────────────────
SCOPE="@d3ara1n"
REGISTRY="https://registry.npmjs.org"
# ── 颜色 ──────────────────────────────────────────────
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
DIM='\033[2m'
RESET='\033[0m'
info() { echo -e "${GREEN}✓${RESET} $*"; }
warn() { echo -e "${YELLOW}⚠${RESET} $*"; }
err() { echo -e "${RED}✗${RESET} $*"; exit 1; }
# ── 参数 ──────────────────────────────────────────────
PKG="${1:-}"
BUMP="${2:-patch}" # patch | minor | major
if [[ -z "$PKG" ]]; then
echo "Usage: ./publish.sh <package-name> [patch|minor|major]"
echo ""
echo "Available packages:"
ls -d packages/*/ 2>/dev/null | sed 's|packages/||;s|/||' | prefix=" "
exit 1
fi
PKG_DIR="packages/$PKG"
[[ -d "$PKG_DIR" ]] || err "Package not found: $PKG_DIR"
PKG_JSON="$PKG_DIR/package.json"
FULL_NAME=$(node -e "console.log(require('./$PKG_JSON').name)")
[[ -z "$FULL_NAME" ]] && err "Cannot read package name from $PKG_JSON"
echo ""
echo -e "${DIM}────────────────────────────────────────${RESET}"
echo -e " ${FULL_NAME}"
echo -e "${DIM}────────────────────────────────────────────────${RESET}"
echo ""
# ── 1. 检查 npm 已发布版本 ─────────────────────────────
REMOTE_VERSION=$(npm view "$FULL_NAME" version 2>/dev/null || echo "0.0.0")
LOCAL_VERSION=$(node -e "console.log(require('./$PKG_JSON').version)")
echo -e " Remote: ${REMOTE_VERSION}"
echo -e " Local: ${LOCAL_VERSION}"
echo ""
# ── 2. 确定目标版本 ────────────────────────────────────
if [[ "$REMOTE_VERSION" == "0.0.0" ]]; then
# 从未发布过,使用本地版本
TARGET_VERSION="$LOCAL_VERSION"
info "First publish, using local version ${TARGET_VERSION}"
else
# 已发布过,比较版本
HIGHER=$(node -e "
const r = '${REMOTE_VERSION}'.split('.').map(Number);
const l = '${LOCAL_VERSION}'.split('.').map(Number);
console.log(l[0] > r[0] || l[1] > r[1] || l[2] > r[2] ? 'local' : 'remote');
")
if [[ "$HIGHER" == "local" ]]; then
TARGET_VERSION="$LOCAL_VERSION"
info "Local version is higher, publishing as-is: ${TARGET_VERSION}"
else
# 自动 bump
TARGET_VERSION=$(node -e "
const semver = require('semver');
console.log(semver.inc('${REMOTE_VERSION}', '${BUMP}'));
" 2>/dev/null || node -e "
// Fallback: simple bump without semver dep
const [major, minor, patch] = '${REMOTE_VERSION}'.split('.').map(Number);
'${BUMP}' === 'major' ? console.log(major+1+'.0.0')
: '${BUMP}' === 'minor' ? console.log(major+'.'+(minor+1)+'.0')
: console.log(major+'.'+minor+'.'+(patch+1));
")
info "Auto-bumping (${BUMP}): ${REMOTE_VERSION} → ${TARGET_VERSION}"
fi
fi
# ── 3. 确认 ────────────────────────────────────────────
echo ""
read -rp " Publish ${FULL_NAME}@${TARGET_VERSION}? [Y/n] " CONFIRM
[[ "${CONFIRM,,}" == "n" ]] && { warn "Cancelled"; exit 0; }
# ── 4. Save original version and update ─────────────────
ORIGINAL_VERSION=$(node -e "console.log(require('./$PKG_JSON').version)")
npm version "$TARGET_VERSION" --no-git-tag-version -w "$PKG_DIR" 2>/dev/null || \
node -e "
const fs = require('fs');
const p = '$PKG_JSON';
const pkg = JSON.parse(fs.readFileSync(p, 'utf8'));
pkg.version = '${TARGET_VERSION}';
fs.writeFileSync(p, JSON.stringify(pkg, null, 2) + '\n');
"
info "Version set to ${TARGET_VERSION}"
TAG="${FULL_NAME}@${TARGET_VERSION}"
# ── 5. npm publish first ───────────────────────────────
if npm publish -w "$PKG_DIR" --access public; then
info "Published to npm: ${TAG}"
# ── 6. Git commit + tag + push (only on success) ─────
git add "$PKG_JSON"
git commit -m "release: ${TAG}" || true
git tag -m "$TAG" "$TAG"
info "Git tag: ${TAG}"
git push
git push --tags
info "Git pushed"
echo ""
info "Done! 🚀"
echo ""
echo -e " Install: ${DIM}pi install npm:${FULL_NAME}${RESET}"
else
# Publish failed — revert package.json
node -e "
const fs = require('fs');
const p = '$PKG_JSON';
const pkg = JSON.parse(fs.readFileSync(p, 'utf8'));
pkg.version = '$ORIGINAL_VERSION';
fs.writeFileSync(p, JSON.stringify(pkg, null, 2) + '\n');
"
err "Failed to publish ${TAG}"
fi