@vv0rkz/js-template 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +7 -13
- package/bin/init.js +10 -24
- package/package.json +4 -4
- package/templates/.husky/commit-msg +64 -0
- package/templates/.husky/post-commit +25 -0
- package/templates/.husky/pre-push +17 -0
- package/templates/changelog.config.js +9 -0
- package/templates/commitlint.config.js +6 -0
package/bin/cli.js
CHANGED
|
@@ -2,20 +2,14 @@
|
|
|
2
2
|
import { fileURLToPath } from 'url'
|
|
3
3
|
import { dirname, join } from 'path'
|
|
4
4
|
import { spawnSync } from 'child_process'
|
|
5
|
-
import { existsSync } from 'fs'
|
|
6
5
|
|
|
7
6
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
8
|
-
const toolsDir = join(__dirname, '../tools-gh')
|
|
7
|
+
const toolsDir = join(__dirname, '../tools-gh') // ВСЕГДА из node_modules
|
|
9
8
|
|
|
10
9
|
const args = process.argv.slice(2)
|
|
11
10
|
const command = args[0]
|
|
12
11
|
const commandArgs = args.slice(1)
|
|
13
12
|
|
|
14
|
-
// Проверка наличия tools-gh в текущем проекте
|
|
15
|
-
const projectToolsDir = join(process.cwd(), 'tools-gh')
|
|
16
|
-
const useProjectTools = existsSync(projectToolsDir)
|
|
17
|
-
const scriptsDir = useProjectTools ? projectToolsDir : toolsDir
|
|
18
|
-
|
|
19
13
|
const commands = {
|
|
20
14
|
init: () => {
|
|
21
15
|
const initScript = join(__dirname, 'init.js')
|
|
@@ -29,7 +23,7 @@ const commands = {
|
|
|
29
23
|
release: () => {
|
|
30
24
|
console.log('🚀 Запуск релиза...\n')
|
|
31
25
|
|
|
32
|
-
const checkDemo = spawnSync('node', [join(
|
|
26
|
+
const checkDemo = spawnSync('node', [join(toolsDir, 'check-demo-for-release.js')], { stdio: 'inherit' })
|
|
33
27
|
if (checkDemo.status !== 0) {
|
|
34
28
|
console.error('❌ Проверка демо не прошла')
|
|
35
29
|
process.exit(1)
|
|
@@ -41,16 +35,16 @@ const commands = {
|
|
|
41
35
|
process.exit(1)
|
|
42
36
|
}
|
|
43
37
|
|
|
44
|
-
spawnSync('node', [join(
|
|
38
|
+
spawnSync('node', [join(toolsDir, 'update-readme.js')], { stdio: 'inherit' })
|
|
45
39
|
console.log('\n✅ Релиз успешно создан!')
|
|
46
40
|
},
|
|
47
41
|
|
|
48
42
|
'update-readme': () => {
|
|
49
|
-
spawnSync('node', [join(
|
|
43
|
+
spawnSync('node', [join(toolsDir, 'update-readme.js')], { stdio: 'inherit' })
|
|
50
44
|
},
|
|
51
45
|
|
|
52
46
|
'push-release': () => {
|
|
53
|
-
spawnSync('node', [join(
|
|
47
|
+
spawnSync('node', [join(toolsDir, 'push-release-to-main.js')], { stdio: 'inherit' })
|
|
54
48
|
},
|
|
55
49
|
|
|
56
50
|
bugs: () => {
|
|
@@ -59,7 +53,7 @@ const commands = {
|
|
|
59
53
|
|
|
60
54
|
'create-bug': () => {
|
|
61
55
|
if (commandArgs.length === 0) {
|
|
62
|
-
spawnSync('node', [join(
|
|
56
|
+
spawnSync('node', [join(toolsDir, 'create-bug.js')], { stdio: 'inherit' })
|
|
63
57
|
} else {
|
|
64
58
|
const title = commandArgs.join(' ')
|
|
65
59
|
spawnSync('gh', ['issue', 'create', '--label', 'bug', '--title', title], { stdio: 'inherit', shell: true })
|
|
@@ -72,7 +66,7 @@ const commands = {
|
|
|
72
66
|
|
|
73
67
|
'create-task': () => {
|
|
74
68
|
if (commandArgs.length === 0) {
|
|
75
|
-
spawnSync('node', [join(
|
|
69
|
+
spawnSync('node', [join(toolsDir, 'create-task.js')], { stdio: 'inherit' })
|
|
76
70
|
} else {
|
|
77
71
|
const title = commandArgs.join(' ')
|
|
78
72
|
spawnSync('gh', ['issue', 'create', '--label', 'task', '--title', title], { stdio: 'inherit', shell: true })
|
package/bin/init.js
CHANGED
|
@@ -58,25 +58,9 @@ if (existsSync(huskyTemplateDir)) {
|
|
|
58
58
|
console.log(' ✅ Хуки скопированы')
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
// 3.
|
|
62
|
-
console.log('\n🔧
|
|
63
|
-
|
|
64
|
-
if (!existsSync(toolsDir)) {
|
|
65
|
-
mkdirSync(toolsDir, { recursive: true })
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const toolsSourceDir = join(__dirname, '../tools-gh')
|
|
69
|
-
if (existsSync(toolsSourceDir)) {
|
|
70
|
-
const toolFiles = readdirSync(toolsSourceDir)
|
|
71
|
-
toolFiles.forEach((file) => {
|
|
72
|
-
const src = join(toolsSourceDir, file)
|
|
73
|
-
const dest = join(toolsDir, file)
|
|
74
|
-
if (statSync(src).isFile()) {
|
|
75
|
-
copyFileSync(src, dest)
|
|
76
|
-
console.log(` ✅ ${file}`)
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
}
|
|
61
|
+
// 3. НЕ копируем tools-gh — они остаются в node_modules
|
|
62
|
+
console.log('\n🔧 GitHub скрипты...')
|
|
63
|
+
console.log(' ✅ Используются из @vv0rkz/js-template (не копируются)')
|
|
80
64
|
|
|
81
65
|
// 4. Добавление скриптов в package.json
|
|
82
66
|
console.log('\n📦 Обновление package.json...')
|
|
@@ -128,14 +112,16 @@ console.log(`
|
|
|
128
112
|
🎉 JS Template успешно установлен!
|
|
129
113
|
|
|
130
114
|
📖 БЫСТРЫЕ КОМАНДЫ:
|
|
131
|
-
npm run
|
|
132
|
-
npm run
|
|
133
|
-
npm run
|
|
134
|
-
npm run
|
|
115
|
+
npm run _ changelog # Создать changelog
|
|
116
|
+
npm run _ release # Полный релиз
|
|
117
|
+
npm run _ tasks # Список задач
|
|
118
|
+
npm run _ create-task # Создать задачу
|
|
135
119
|
|
|
136
120
|
📚 ПОЛНЫЙ СПИСОК:
|
|
137
|
-
npm run
|
|
121
|
+
npm run _
|
|
138
122
|
|
|
139
123
|
🚀 Начни работу:
|
|
140
124
|
npm run _ create-task "Моя первая задача"
|
|
125
|
+
|
|
126
|
+
💡 ВАЖНО: tools-gh скрипты используются из node_modules, не копируются в проект
|
|
141
127
|
`)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vv0rkz/js-template",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Reusable setup for JS projects with husky, changelog, gh tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"js-template": "./bin/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
|
-
"bin",
|
|
12
|
-
"templates",
|
|
13
|
-
"tools-gh"
|
|
11
|
+
"bin/",
|
|
12
|
+
"templates/",
|
|
13
|
+
"tools-gh/"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
16
|
"test": "echo 'Tests not implemented yet' && exit 0"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
COMMIT_MSG=$(cat "$1")
|
|
4
|
+
|
|
5
|
+
# Функция показа подсказки
|
|
6
|
+
show_help() {
|
|
7
|
+
echo ""
|
|
8
|
+
echo "🎯 РАЗРЕШЕННЫЕ ФОРМАТЫ КОММИТОВ:"
|
|
9
|
+
echo "────────────────────────────────────"
|
|
10
|
+
echo "✨ НОВЫЕ ФИЧИ: feat: #номер описание"
|
|
11
|
+
echo "🐛 ИСПРАВЛЕНИЯ: fix: #номер описание"
|
|
12
|
+
echo "🔧 РЕФАКТОРИНГ: refactor: описание"
|
|
13
|
+
echo "🏗️ ИНФРАСТРУКТУРА: build: описание"
|
|
14
|
+
echo "🛠️ ТЕХ. ЗАДАЧИ: chore: описание"
|
|
15
|
+
echo "📚 ДОКУМЕНТАЦИЯ: docs: описание"
|
|
16
|
+
echo "🚀 АВТО-РЕЛИЗЫ: chore(release): vX.X.X"
|
|
17
|
+
echo ""
|
|
18
|
+
echo "📝 ПРИМЕРЫ:"
|
|
19
|
+
echo " feat: #9 добавить нормализацию чисел"
|
|
20
|
+
echo " fix: #10 исправить валидацию операторов"
|
|
21
|
+
echo " refactor: оптимизировать алгоритм"
|
|
22
|
+
echo " chore: обновить зависимости"
|
|
23
|
+
echo " docs: обновить README"
|
|
24
|
+
echo " chore(release): v2.3.0"
|
|
25
|
+
echo "────────────────────────────────────"
|
|
26
|
+
exit 1
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# ИСКЛЮЧЕНИЕ: разрешаем авто-релизные коммиты от changelogen
|
|
30
|
+
if echo "$COMMIT_MSG" | grep -q "^chore(release): v[0-9]\+\.[0-9]\+\.[0-9]\+$"; then
|
|
31
|
+
echo "✅ Авто-релизный коммит: $COMMIT_MSG"
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# СТРОГАЯ ПРОВЕРКА для обычных коммитов
|
|
36
|
+
if ! echo "$COMMIT_MSG" | grep -q -E "^(feat: #[0-9]+ .+|fix: #[0-9]+ .+|refactor: .+|build: .+|chore: .+|docs: .+)"; then
|
|
37
|
+
echo "❌ Неправильный формат коммита: '$COMMIT_MSG'"
|
|
38
|
+
show_help
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Дополнительная проверка: feat/fix должны иметь #номер
|
|
42
|
+
if echo "$COMMIT_MSG" | grep -q "^\(feat\|fix\):"; then
|
|
43
|
+
if ! echo "$COMMIT_MSG" | grep -q "^\(feat\|fix\): #[0-9]"; then
|
|
44
|
+
echo "❌ Ошибка: feat и fix коммиты должны содержать номер задачи"
|
|
45
|
+
echo "💡 Твой коммит: $COMMIT_MSG"
|
|
46
|
+
echo "✅ Пример: feat: #9 добавить нормализацию чисел"
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Закрытие issues при fix: #номер
|
|
52
|
+
if echo "$COMMIT_MSG" | grep -q "^fix: #[0-9]"; then
|
|
53
|
+
ISSUE_NUMBER=$(echo "$COMMIT_MSG" | grep -o '#[0-9]*' | sed 's/#//')
|
|
54
|
+
echo "🔧 Закрываю issue #$ISSUE_NUMBER..."
|
|
55
|
+
|
|
56
|
+
COMMIT_HASH=$(git rev-parse --short HEAD)
|
|
57
|
+
REPO_URL=$(git remote get-url origin | sed 's/\.git$//')
|
|
58
|
+
COMMIT_URL="$REPO_URL/commit/$COMMIT_HASH"
|
|
59
|
+
|
|
60
|
+
gh issue close "$ISSUE_NUMBER" --comment "Исправлено в коммите: [$COMMIT_HASH]($COMMIT_URL) - $COMMIT_MSG"
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# Запускаем commitlint
|
|
64
|
+
npx --no -- commitlint --edit "$1"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
COMMIT_MSG=$(git log -1 --pretty=%B)
|
|
4
|
+
COMMIT_HASH=$(git rev-parse --short HEAD)
|
|
5
|
+
REPO_URL=$(git remote get-url origin)
|
|
6
|
+
|
|
7
|
+
# Исправляем URL
|
|
8
|
+
if echo "$REPO_URL" | grep -q "git@github.com"; then
|
|
9
|
+
REPO_URL=$(echo "$REPO_URL" | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')
|
|
10
|
+
else
|
|
11
|
+
REPO_URL=$(echo "$REPO_URL" | sed 's/\.git$//')
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
# Пуш коммита
|
|
15
|
+
git push origin HEAD
|
|
16
|
+
|
|
17
|
+
# Закрытие issues при feat: #номер И fix: #номер
|
|
18
|
+
if echo "$COMMIT_MSG" | grep -q "^\(feat\|fix\): #[0-9]"; then
|
|
19
|
+
ISSUE_NUMBER=$(echo "$COMMIT_MSG" | grep -o '#[0-9]*' | sed 's/#//')
|
|
20
|
+
echo "🔧 Закрываю issue #$ISSUE_NUMBER..."
|
|
21
|
+
|
|
22
|
+
COMMIT_LINK="$REPO_URL/commit/$COMMIT_HASH"
|
|
23
|
+
|
|
24
|
+
gh issue close "$ISSUE_NUMBER" --comment "✅ Завершено в коммите: [$COMMIT_HASH]($COMMIT_LINK) - $COMMIT_MSG"
|
|
25
|
+
fi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
4
|
+
if [ "$CURRENT_BRANCH" = "main" ]; then
|
|
5
|
+
echo "✅ Разрешённая ветка: $CURRENT_BRANCH"
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# Простая проверка: начинается с v и есть дефис
|
|
10
|
+
if ! echo "$CURRENT_BRANCH" | grep -q "^v.*-.*"; then
|
|
11
|
+
echo "❌ Неправильный формат ветки: $CURRENT_BRANCH"
|
|
12
|
+
echo "✅ Должен быть: vX.Y.Z-description"
|
|
13
|
+
echo "📝 Пример: v2.3.0-normalize-operators"
|
|
14
|
+
exit 1
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "✅ Формат ветки правильный: $CURRENT_BRANCH"
|