@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 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(scriptsDir, 'check-demo-for-release.js')], { stdio: 'inherit' })
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(scriptsDir, 'update-readme.js')], { stdio: 'inherit' })
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(scriptsDir, 'update-readme.js')], { stdio: 'inherit' })
43
+ spawnSync('node', [join(toolsDir, 'update-readme.js')], { stdio: 'inherit' })
50
44
  },
51
45
 
52
46
  'push-release': () => {
53
- spawnSync('node', [join(scriptsDir, 'push-release-to-main.js')], { stdio: 'inherit' })
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(scriptsDir, 'create-bug.js')], { stdio: 'inherit' })
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(scriptsDir, 'create-task.js')], { stdio: 'inherit' })
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. Копирование tools-gh
62
- console.log('\n🔧 Копирование GitHub скриптов...')
63
- const toolsDir = join(targetDir, 'tools-gh')
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 jst changelog # или: npm run _ changelog
132
- npm run jst release # или: npm run _ release
133
- npm run jst tasks # или: npm run _ tasks
134
- npm run jst create-task # или: npm run _ create-task
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 jst
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.0.0",
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"
@@ -0,0 +1,9 @@
1
+ export default {
2
+ types: {
3
+ feat: { title: "✨ Фичи" },
4
+ fix: { title: "🐛 Исправленные баги" },
5
+ build: { title: "🏗️ Инфраструктура" },
6
+ refactor: { title: "🔧 Рефакторинг", hidden: true },
7
+ chore: { title: "🛠️ Технические задачи", hidden: true },
8
+ },
9
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ extends: ["@commitlint/config-conventional"],
3
+ rules: {
4
+ "type-enum": [2, "always", ["feat", "fix", "refactor", "build", "chore", "docs"]],
5
+ },
6
+ }