@itcase/config 1.7.26 → 1.7.28

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itcase/config",
3
- "version": "1.7.26",
3
+ "version": "1.7.28",
4
4
  "author": "ITCase",
5
5
  "description": "ITCase Config",
6
6
  "engines": {
@@ -68,7 +68,7 @@
68
68
  "commitizen": "^4.3.2",
69
69
  "conventional-changelog-conventionalcommits": "9.3.1",
70
70
  "conventional-changelog-writer": "9.3.0",
71
- "cssnano": "^9.8.0",
71
+ "cssnano": "^9.9.0",
72
72
  "cssnano-preset-default": "^9.8.0",
73
73
  "inquirer": "^14.2.3",
74
74
  "log-update": "^8.0.0",
@@ -0,0 +1,103 @@
1
+ import { execFileSync } from 'node:child_process'
2
+ import { readFileSync, writeFileSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+
5
+ /**
6
+ * Prepare: bump Android → make APK.
7
+ * Upload в Mail.ru — отдельный CI action, не здесь.
8
+ *
9
+ * Env: SKIP_APK_BUILD, RELEASE_APK_TARGETS (stage,prod).
10
+ *
11
+ * @param {{ apkPrefix: string }} options
12
+ */
13
+ function createAndroidAppPreparePlugin({ apkPrefix }) {
14
+ if (!apkPrefix) {
15
+ throw new Error('createAndroidAppPreparePlugin: apkPrefix is required')
16
+ }
17
+
18
+ return {
19
+ prepare: async (_pluginConfig, context) => {
20
+ const { logger, nextRelease, options } = context
21
+ const version = nextRelease.version
22
+
23
+ bumpAndroidVersion(version, logger)
24
+
25
+ if (options.dryRun || process.env.SKIP_APK_BUILD === '1') {
26
+ logger.log('Skip APK build (dry-run or SKIP_APK_BUILD=1)')
27
+ return
28
+ }
29
+
30
+ const apks = resolveApks(apkPrefix, version)
31
+ for (const apk of apks) {
32
+ logger.log(`make ${apk.make}`)
33
+ execFileSync('make', [apk.make], { stdio: 'inherit' })
34
+ }
35
+ },
36
+ }
37
+ }
38
+
39
+ function bumpAndroidVersion(version, logger) {
40
+ if (!/^\d+\.\d+\.\d+(-[\w.-]+)?$/.test(version)) {
41
+ throw new Error(`Unsupported version format: "${version}"`)
42
+ }
43
+
44
+ const gradlePath = join(process.cwd(), 'android/app/build.gradle')
45
+ const content = readFileSync(gradlePath, 'utf8')
46
+ const vNameMatch = content.match(/def vName = "([^"]+)"/)
47
+ const vCodeMatch = content.match(/def vCode = (\d+)/)
48
+
49
+ if (!vNameMatch || !vCodeMatch) {
50
+ throw new Error('Could not find version in build.gradle')
51
+ }
52
+
53
+ if (vNameMatch[1] === version) {
54
+ logger.log(`Android vName already ${version}, skip bump`)
55
+ return
56
+ }
57
+
58
+ const newCode = Number(vCodeMatch[1]) + 1
59
+ writeFileSync(
60
+ gradlePath,
61
+ content
62
+ .replace(/def vName = "[^"]+"/, `def vName = "${version}"`)
63
+ .replace(/def vCode = \d+/, `def vCode = ${newCode}`),
64
+ )
65
+ logger.log(`Android vName = ${version}, vCode = ${newCode}`)
66
+ }
67
+
68
+ /** @returns {{ make: string, name: string, fileName: string }[]} */
69
+ function resolveApks(apkPrefix, version) {
70
+ const defs = {
71
+ stage: {
72
+ make: 'android-apk-stage',
73
+ name: 'STAGE',
74
+ fileName: `${apkPrefix}-v${version}-STAGE.apk`,
75
+ },
76
+ prod: {
77
+ make: 'android-apk-prod',
78
+ name: 'PROD',
79
+ fileName: `${apkPrefix}-v${version}.apk`,
80
+ },
81
+ }
82
+
83
+ const keys = (process.env.RELEASE_APK_TARGETS || 'stage,prod')
84
+ .split(',')
85
+ .map((part) => part.trim())
86
+ .filter(Boolean)
87
+
88
+ if (keys.length === 0) {
89
+ throw new Error('RELEASE_APK_TARGETS is empty')
90
+ }
91
+
92
+ return keys.map((key) => {
93
+ const apk = defs[key]
94
+ if (!apk) {
95
+ throw new Error(
96
+ `Unknown RELEASE_APK_TARGETS entry: "${key}". Use stage, prod`,
97
+ )
98
+ }
99
+ return apk
100
+ })
101
+ }
102
+
103
+ export { createAndroidAppPreparePlugin }
@@ -1,3 +1,4 @@
1
+ import { createAndroidAppPreparePlugin } from './androidAppPrepare.js'
1
2
  import {
2
3
  createSemanticReleaseConfig,
3
4
  releaseNotesFromIssuesPlugin,
@@ -17,27 +18,41 @@ const DEFAULT_RELEASE_ASSETS = ['builds/*.apk']
17
18
  *
18
19
  * - Не публикует в npm
19
20
  * - Коммитит package + Android version-файлы
20
- * - Прикрепляет к GitHub release APK из `builds/` (если есть; отсутствующие пропускаются)
21
- * - Заметки релиза: сначала задачи из releaseNotesFromIssues.js, если они есть, потом обычные коммиты
21
+ * - Прикрепляет к GitHub release APK из `builds/`
22
+ * - Заметки релиза: сначала задачи, потом коммиты
22
23
  *
23
- * Сборку APK делайте в prepare проекта или отдельным CI job до publish.
24
+ * Если передан `apk`, в prepare: bump → make.
25
+ * Upload в Mail.ru — отдельный GitHub Action (не здесь).
24
26
  *
25
27
  * @param {Object} [options]
26
28
  * @param {string|string[]} [options.branches=['master']]
27
- * @param {string[]} [options.versionAssets] - файлы для @semantic-release/git
28
- * @param {string[]|Object[]} [options.releaseAssets] - assets для @semantic-release/github
29
- * @param {Array} [options.preparePlugins] - плагины после npm (например bump Android version + build APK)
30
- * @param {Object} [options.githubConfig] - доп. опции github-плагина
31
- * @param {Object} [options.gitConfig] - доп. опции git-плагина (мержатся поверх message/assets)
29
+ * @param {Object} [options.apk]
30
+ * @param {string} options.apk.prefix - agro-pps → builds/agro-pps-v*.apk
31
+ * @param {string[]} [options.versionAssets]
32
+ * @param {string[]|Object[]} [options.releaseAssets] - по умолчанию builds/{prefix}-v*.apk
33
+ * @param {Array} [options.preparePlugins]
34
+ * @param {Object} [options.githubConfig]
35
+ * @param {Object} [options.gitConfig]
32
36
  */
33
- function createSemanticReleaseApp({
37
+ function semanticReleaseApp({
38
+ apk,
34
39
  branches = ['master'],
35
40
  gitConfig = {},
36
41
  githubConfig = {},
37
42
  preparePlugins = [],
38
- releaseAssets = DEFAULT_RELEASE_ASSETS,
43
+ releaseAssets,
39
44
  versionAssets = DEFAULT_VERSION_ASSETS,
40
45
  } = {}) {
46
+ const androidPrepare = apk
47
+ ? [createAndroidAppPreparePlugin({ apkPrefix: apk.prefix })]
48
+ : []
49
+
50
+ const githubAssets =
51
+ releaseAssets ??
52
+ (apk?.prefix
53
+ ? [`builds/${apk.prefix}-v*.apk`]
54
+ : DEFAULT_RELEASE_ASSETS)
55
+
41
56
  return createSemanticReleaseConfig({
42
57
  additionalPlugins: [releaseNotesFromIssuesPlugin],
43
58
  branches: branches,
@@ -48,16 +63,17 @@ function createSemanticReleaseApp({
48
63
  ...gitConfig,
49
64
  },
50
65
  githubConfig: {
51
- assets: releaseAssets,
66
+ assets: githubAssets,
52
67
  ...githubConfig,
53
68
  },
54
69
  npmConfig: {
55
70
  npmPublish: false,
56
71
  },
57
- preparePlugins: preparePlugins,
72
+ preparePlugins: [...androidPrepare, ...preparePlugins],
58
73
  })
59
74
  }
60
75
 
61
- const semanticReleaseApp = createSemanticReleaseApp()
76
+ /** @deprecated используй semanticReleaseApp — оставлено для совместимости */
77
+ const createSemanticReleaseApp = semanticReleaseApp
62
78
 
63
79
  export { createSemanticReleaseApp, semanticReleaseApp }