expo-release-it 0.3.2 → 0.4.0
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/README.md +15 -8
- package/build/command/build.js +70 -38
- package/build/command/build.js.map +1 -1
- package/build/command/bump.js +90 -19
- package/build/command/bump.js.map +1 -1
- package/build/command/init.js +64 -17
- package/build/command/init.js.map +1 -1
- package/build/command/pull.js +64 -32
- package/build/command/pull.js.map +1 -1
- package/build/command/submit.js +70 -38
- package/build/command/submit.js.map +1 -1
- package/build/command/upload.js +70 -38
- package/build/command/upload.js.map +1 -1
- package/build/index.js +102 -42
- package/build/index.js.map +1 -1
- package/build/type/ExpoReleaseItConfiguration.d.d.ts +46 -0
- package/build/type/ExpoReleaseItConfiguration.d.js +1 -0
- package/build/type/ExpoReleaseItConfiguration.d.js.map +1 -0
- package/build/util/EnvUtil.d.ts +2 -1
- package/build/util/EnvUtil.js +2 -0
- package/build/util/EnvUtil.js.map +1 -1
- package/build/util/FastlaneOption.js +13 -14
- package/build/util/FastlaneOption.js.map +1 -1
- package/build/util/MetadataSyncUtil.js +13 -14
- package/build/util/MetadataSyncUtil.js.map +1 -1
- package/build/util/OptionHolder.d.ts +2 -1
- package/build/util/OptionHolder.js +13 -14
- package/build/util/OptionHolder.js.map +1 -1
- package/build/util/generateAppStoreConnectApiKeyFile.js +13 -14
- package/build/util/generateAppStoreConnectApiKeyFile.js.map +1 -1
- package/build/util/injectTemplatePlaceHolders.js +13 -14
- package/build/util/injectTemplatePlaceHolders.js.map +1 -1
- package/build/util/input/InqueryInputs.d.ts +0 -1
- package/build/util/input/InqueryInputs.js +13 -29
- package/build/util/input/InqueryInputs.js.map +1 -1
- package/build/util/parseConfigFile.d.ts +3 -0
- package/build/util/parseConfigFile.js +136 -0
- package/build/util/parseConfigFile.js.map +1 -0
- package/build/util/setup/VersionUtil.d.ts +3 -1
- package/build/util/setup/VersionUtil.js +38 -14
- package/build/util/setup/VersionUtil.js.map +1 -1
- package/build/util/setup/hydrateKeyholderFileValues.js +13 -14
- package/build/util/setup/hydrateKeyholderFileValues.js.map +1 -1
- package/build/util/setup/prepareAndroid.js +13 -14
- package/build/util/setup/prepareAndroid.js.map +1 -1
- package/build/util/setup/prepareIos.js +13 -14
- package/build/util/setup/prepareIos.js.map +1 -1
- package/build/util/setup/setup.js +65 -17
- package/build/util/setup/setup.js.map +1 -1
- package/build/util/throwError.js +8 -0
- package/build/util/throwError.js.map +1 -1
- package/expo-release-it.schema.json +57 -0
- package/package.json +13 -14
package/build/command/pull.js
CHANGED
|
@@ -3,17 +3,16 @@ var package_default = {
|
|
|
3
3
|
name: "expo-release-it",
|
|
4
4
|
module: "src/index.ts",
|
|
5
5
|
type: "module",
|
|
6
|
-
version: "0.3.
|
|
6
|
+
version: "0.3.2",
|
|
7
7
|
license: "MIT",
|
|
8
8
|
homepage: "https://github.com/mym0404/expo-release-it",
|
|
9
9
|
repository: "https://github.com/mym0404/expo-release-it",
|
|
10
10
|
scripts: {
|
|
11
|
-
build: "tsup",
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
t: "tsc --noEmit -p ."
|
|
11
|
+
build: "pnpm build:json-schema-type && tsup",
|
|
12
|
+
"build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
|
|
13
|
+
dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
|
|
14
|
+
release: "pnpm build && pnpm run t && release-it",
|
|
15
|
+
t: "lefthook run check"
|
|
17
16
|
},
|
|
18
17
|
dependencies: {
|
|
19
18
|
"@inquirer/prompts": "^7.4.1",
|
|
@@ -33,29 +32,29 @@ var package_default = {
|
|
|
33
32
|
"@release-it/conventional-changelog": "^10.0.1",
|
|
34
33
|
"@types/fs-extra": "^11.0.4",
|
|
35
34
|
"@types/semver": "^7.7.0",
|
|
35
|
+
"json-schema-to-typescript": "^15.0.4",
|
|
36
36
|
lefthook: "^1.11.11",
|
|
37
37
|
prettier: "3.5.3",
|
|
38
38
|
"release-it": "^19.0.1",
|
|
39
39
|
"tiny-glob": "^0.2.9",
|
|
40
40
|
tsup: "^8.4.0",
|
|
41
|
-
typescript: "^5.8.3"
|
|
41
|
+
typescript: "^5.8.3",
|
|
42
|
+
vitest: "^3.1.2"
|
|
42
43
|
},
|
|
43
|
-
workspaces: [
|
|
44
|
-
"example"
|
|
45
|
-
],
|
|
46
44
|
bin: "./bin/expo-release-it.mjs",
|
|
47
45
|
files: [
|
|
48
46
|
"build",
|
|
49
47
|
"package.json",
|
|
50
48
|
"bin",
|
|
51
|
-
"template"
|
|
49
|
+
"template",
|
|
50
|
+
"expo-release-it.schema.json"
|
|
52
51
|
],
|
|
53
|
-
packageManager: "yarn@4.9.1",
|
|
54
52
|
commitlint: {
|
|
55
53
|
extends: [
|
|
56
54
|
"@commitlint/config-conventional"
|
|
57
55
|
]
|
|
58
|
-
}
|
|
56
|
+
},
|
|
57
|
+
packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
|
|
59
58
|
};
|
|
60
59
|
|
|
61
60
|
// src/util/FileUtil.ts
|
|
@@ -155,21 +154,6 @@ var InqueryInputs = {
|
|
|
155
154
|
});
|
|
156
155
|
}
|
|
157
156
|
},
|
|
158
|
-
platformAll: async () => {
|
|
159
|
-
if (!OptionHolder.input.platformAll) {
|
|
160
|
-
OptionHolder.input.platformAll = await select({
|
|
161
|
-
message: constructInquirerFormattedMessage({
|
|
162
|
-
name: "Platform",
|
|
163
|
-
explanation: `Platforms to run action`
|
|
164
|
-
}),
|
|
165
|
-
choices: [
|
|
166
|
-
{ name: "all", value: "all", description: "Both" },
|
|
167
|
-
{ name: "ios", value: "ios", description: "Release ios" },
|
|
168
|
-
{ name: "android", value: "android", description: "Release android" }
|
|
169
|
-
]
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
157
|
podinstall: async () => {
|
|
174
158
|
if (OptionHolder.input.platform === "ios") {
|
|
175
159
|
OptionHolder.input.pod = await select({
|
|
@@ -287,6 +271,11 @@ ${msg.join(", ")}`)),
|
|
|
287
271
|
dim: (...msg) => console.log(chalk2.dim(msg.join(", ")))
|
|
288
272
|
};
|
|
289
273
|
|
|
274
|
+
// src/util/EnvUtil.ts
|
|
275
|
+
var isDev = process.env.NODE_ENV === "development";
|
|
276
|
+
var isWin = process.platform.startsWith("win");
|
|
277
|
+
var isTest = process.env.NODE_ENV === "test";
|
|
278
|
+
|
|
290
279
|
// src/util/throwError.ts
|
|
291
280
|
function throwError(message, e) {
|
|
292
281
|
if (e) {
|
|
@@ -294,11 +283,15 @@ function throwError(message, e) {
|
|
|
294
283
|
} else {
|
|
295
284
|
logger.error(message);
|
|
296
285
|
}
|
|
286
|
+
if (isTest) {
|
|
287
|
+
throw new Error("throwError");
|
|
288
|
+
}
|
|
297
289
|
process.exit(1);
|
|
298
290
|
}
|
|
299
291
|
|
|
300
292
|
// src/util/setup/VersionUtil.ts
|
|
301
293
|
import semver from "semver";
|
|
294
|
+
import { padZero } from "@mj-studio/js-util";
|
|
302
295
|
var versionNameRegex = () => /const\s+VERSION_NAME\s*?=\s*?['"]([\d\.]*?)['"]\s*?;?/;
|
|
303
296
|
var versionCodeRegex = () => /const\s+VERSION_CODE\s*?=\s*?(\d+)\s*?;?/;
|
|
304
297
|
async function parseBinaryVersions() {
|
|
@@ -356,13 +349,52 @@ async function parseBinaryVersions() {
|
|
|
356
349
|
}
|
|
357
350
|
}
|
|
358
351
|
|
|
359
|
-
// src/util/
|
|
360
|
-
|
|
361
|
-
|
|
352
|
+
// src/util/parseConfigFile.ts
|
|
353
|
+
import { is as is2 } from "@mj-studio/js-util";
|
|
354
|
+
async function parseConfigFile() {
|
|
355
|
+
const candidates = [
|
|
356
|
+
join2(OptionHolder.resourcesDir, "expo-release-it.config.json"),
|
|
357
|
+
join2(OptionHolder.projectDir, "expo-release-it.config.json")
|
|
358
|
+
];
|
|
359
|
+
if (OptionHolder.input.config) {
|
|
360
|
+
candidates.unshift(OptionHolder.input.config);
|
|
361
|
+
}
|
|
362
|
+
const validConfigFilePath = candidates.find(
|
|
363
|
+
(candidate) => exist(candidate) && is2.object(readJsonSlow(candidate))
|
|
364
|
+
);
|
|
365
|
+
if (!validConfigFilePath) return;
|
|
366
|
+
const config = readJsonSlow(validConfigFilePath);
|
|
367
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
368
|
+
OptionHolder.input,
|
|
369
|
+
"semverIncrement",
|
|
370
|
+
config.bump?.increment
|
|
371
|
+
);
|
|
372
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
373
|
+
OptionHolder.input,
|
|
374
|
+
"androidOutput",
|
|
375
|
+
config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput
|
|
376
|
+
);
|
|
377
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
378
|
+
OptionHolder.input,
|
|
379
|
+
"uploadMetadata",
|
|
380
|
+
config.upload?.uploadMetadata ?? config.submit?.uploadMetadata
|
|
381
|
+
);
|
|
382
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
383
|
+
OptionHolder.input,
|
|
384
|
+
"uploadScreenshot",
|
|
385
|
+
config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
function assignIfValueIsValidAndNotSetAlready(object, key, value) {
|
|
389
|
+
if (!object[key] && value) {
|
|
390
|
+
object[key] = value;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
362
393
|
|
|
363
394
|
// src/util/setup/setup.ts
|
|
364
395
|
async function setup() {
|
|
365
396
|
await setupBasicOptions();
|
|
397
|
+
await parseConfigFile();
|
|
366
398
|
await hydrateKeyholderFileValues();
|
|
367
399
|
await parseBinaryVersions();
|
|
368
400
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/input/InqueryInputs.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/logger.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/EnvUtil.ts","../../src/util/setup/setup.ts","../../src/util/setup/execShellScript.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/MetadataSyncUtil.ts","../../src/util/setup/prepareIos.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/generateAppStoreConnectApiKeyFile.ts","../../src/command/pull.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.3.1\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/mym0404/expo-release-it\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"yarn run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"ora\": \"^8.2.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"lefthook\": \"^1.11.11\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\",\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n }\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n platformAll: 'android' | 'ios' | 'all';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n ios_match_password: string;\n\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n android_package_name: string;\n };\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {} as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n platformAll: async () => {\n if (!OptionHolder.input.platformAll) {\n OptionHolder.input.platformAll = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platforms to run action`,\n }),\n choices: [\n { name: 'all', value: 'all', description: 'Both' },\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { logger } from './logger';\n\nexport function throwError(message: string, e?: any): never {\n if (e) {\n logger.error(message, e);\n } else {\n logger.error(message);\n }\n process.exit(1);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { throwError } from '../throwError';\nimport semver from 'semver';\nimport { readdir, read, readJsonSlow, write, writeJson, resolve } from '../FileUtil';\n\nconst versionNameRegex = () => /const\\s+VERSION_NAME\\s*?=\\s*?['\"]([\\d\\.]*?)['\"]\\s*?;?/;\nconst versionCodeRegex = () => /const\\s+VERSION_CODE\\s*?=\\s*?(\\d+)\\s*?;?/;\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = versionNameRegex().exec(content)?.[1];\n const VERSION_CODE = versionCodeRegex().exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = json.expo?.version + '';\n const iosVersionCode = json.expo?.ios?.buildNumber + '';\n const androidVersionCode = json.expo?.android?.versionCode + '';\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(versionNameRegex(), `const VERSION_NAME = '${versionName}';`);\n content = content.replace(versionCodeRegex(), `const VERSION_CODE = ${versionCode};`);\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\n\nexport async function setup() {\n await setupBasicOptions();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.resourcesDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.resourcesDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.resourcesDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.resourcesDir, '.temp');\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { join, relativePath, copy, exist } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport { logger } from './logger';\nimport chalk from 'chalk';\n\nexport function copyIosMetadata(to: 'resources' | 'native') {\n const iosDir = join(OptionHolder.projectDir, 'ios');\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n if (exist(metadataNativeDir) && exist(screenshotsNativeDir)) {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(metadataResourcesDir) && exist(screenshotsResourcesDir)) {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n\nexport function copyAndroidMetadata(to: 'resouces' | 'native') {\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resouces') {\n if (exist(nativeDir)) {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(resourcesDir)) {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyIosMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyIosMetadata('native');\n}\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyAndroidMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyAndroidMetadata('native');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.resourcesDir, 'key', 'android_release.keystore'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve, read, writeJson, join } from './FileUtil';\n\nexport function generateAppStoreConnectApiKeyFile() {\n const json = {\n key: read(resolve(OptionHolder.keyDir, 'ios_app_store_connect_api_key.p8')),\n key_id: OptionHolder.keyholderMap.ios_app_store_connect_api_key_id,\n issuer_id: OptionHolder.keyholderMap.ios_app_store_connect_api_key_issuer_id,\n };\n const file = join(OptionHolder.tempDir, 'app_store_connect_api.json');\n writeJson(file, json);\n return file;\n}\n","import { OptionHolder } from '../util/OptionHolder';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { setup } from '../util/setup/setup';\nimport { join, resolve } from '../util/FileUtil';\nimport { exe } from '../util/setup/execShellScript';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { generateAppStoreConnectApiKeyFile } from '../util/generateAppStoreConnectApiKeyFile';\nimport { copyIosMetadata, copyAndroidMetadata } from '../util/MetadataSyncUtil';\n\nexport async function pull({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n await setup();\n await promptInputs();\n\n if (OptionHolder.input.platform === 'ios') {\n await pullIosMetadata();\n } else {\n await pullAndroidMetadata();\n }\n}\n\nasync function promptInputs() {\n await InqueryInputs.platform();\n await InqueryInputs.useLiveVersionIos();\n}\n\nasync function pullIosMetadata() {\n await prepareIos();\n const iosDir = join(OptionHolder.projectDir, 'ios');\n const exeEnv = exe({\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderMap.ios_match_password,\n },\n });\n\n await exeEnv('bundle', [\n 'exec',\n 'fastlane',\n 'deliver',\n 'download_metadata',\n '-f',\n '--api_key_path',\n generateAppStoreConnectApiKeyFile(),\n ]);\n\n await exeEnv('bundle', [\n 'exec',\n 'fastlane',\n 'deliver',\n 'download_screenshots',\n '-f',\n '--api_key_path',\n generateAppStoreConnectApiKeyFile(),\n '--use_live_version',\n OptionHolder.input.useLiveVersionIos + '',\n ]);\n\n copyIosMetadata('resources');\n}\n\nasync function pullAndroidMetadata() {\n await prepareAndroid();\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n await exe(\n 'bundle',\n [\n 'exec',\n 'fastlane',\n 'supply',\n 'init',\n '--json_key',\n resolve(OptionHolder.keyDir, 'android_play_console_service_account.json'),\n '--package_name',\n OptionHolder.keyholderMap.android_package_name,\n ],\n { cwd: androidDir },\n );\n\n copyAndroidMetadata('resouces');\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","chalk","resolve","resolve","join","chalk","chalk","join","resolve","resolve","resolve","join","join","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/input/InqueryInputs.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/logger.ts","../../src/util/EnvUtil.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/parseConfigFile.ts","../../src/util/setup/setup.ts","../../src/util/setup/execShellScript.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/MetadataSyncUtil.ts","../../src/util/setup/prepareIos.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/generateAppStoreConnectApiKeyFile.ts","../../src/command/pull.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.3.2\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/mym0404/expo-release-it\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"scripts\": {\n \"build\": \"pnpm build:json-schema-type && tsup\",\n \"build:json-schema-type\": \"json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts\",\n \"dev\": \"pnpm build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"pnpm build && pnpm run t && release-it\",\n \"t\": \"lefthook run check\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"ora\": \"^8.2.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"lefthook\": \"^1.11.11\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.1.2\"\n },\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\",\n \"expo-release-it.schema.json\"\n ],\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n },\n \"packageManager\": \"pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n ios_match_password: string;\n\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n android_package_name: string;\n };\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {} as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\nexport const isTest = process.env.NODE_ENV === 'test';\n","import { logger } from './logger';\nimport { isTest } from './EnvUtil';\n\nexport function throwError(message: string, e?: any): never {\n if (e) {\n logger.error(message, e);\n } else {\n logger.error(message);\n }\n if (isTest) {\n throw new Error('throwError');\n }\n process.exit(1);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { throwError } from '../throwError';\nimport semver from 'semver';\nimport { readdir, read, readJsonSlow, write, writeJson, resolve } from '../FileUtil';\nimport { padZero } from '@mj-studio/js-util';\n\nconst versionNameRegex = () => /const\\s+VERSION_NAME\\s*?=\\s*?['\"]([\\d\\.]*?)['\"]\\s*?;?/;\nconst versionCodeRegex = () => /const\\s+VERSION_CODE\\s*?=\\s*?(\\d+)\\s*?;?/;\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = versionNameRegex().exec(content)?.[1];\n const VERSION_CODE = versionCodeRegex().exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = json.expo?.version + '';\n const iosVersionCode = json.expo?.ios?.buildNumber + '';\n const androidVersionCode = json.expo?.android?.versionCode + '';\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(versionNameRegex(), `const VERSION_NAME = '${versionName}';`);\n content = content.replace(versionCodeRegex(), `const VERSION_CODE = ${versionCode};`);\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n\nexport function checkVersionCodeIsTiedWithVersionName(\n versionName: string,\n versionCode: string,\n): boolean {\n if (!semver.valid(versionName)) return false;\n return generateVersionCodeTiedWithVersionName(versionName) === versionCode;\n}\n\nexport function generateVersionCodeTiedWithVersionName(versionName: string) {\n if (!semver.valid(versionName))\n throwError(\n 'Version Name is not a valid semver format when running `generateVersionCodeTiedWithVersionName`',\n );\n const major = semver.major(versionName);\n const minor = semver.minor(versionName);\n const patch = semver.patch(versionName);\n\n return `${major}${padZero(minor, 3)}${padZero(patch, 3)}`;\n}\n","import type { ExpoReleaseItConfiguration } from '../type/ExpoReleaseItConfiguration';\nimport { OptionHolder } from './OptionHolder';\nimport { join, exist, readJsonSlow } from './FileUtil';\nimport { is } from '@mj-studio/js-util';\n\nexport async function parseConfigFile() {\n const candidates = [\n join(OptionHolder.resourcesDir, 'expo-release-it.config.json'),\n join(OptionHolder.projectDir, 'expo-release-it.config.json'),\n ];\n if (OptionHolder.input.config) {\n candidates.unshift(OptionHolder.input.config);\n }\n\n const validConfigFilePath = candidates.find(\n (candidate) => exist(candidate) && is.object(readJsonSlow(candidate)),\n );\n\n if (!validConfigFilePath) return;\n\n const config = readJsonSlow(validConfigFilePath) as ExpoReleaseItConfiguration;\n\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'semverIncrement',\n config.bump?.increment,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'androidOutput',\n config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'uploadMetadata',\n config.upload?.uploadMetadata ?? config.submit?.uploadMetadata,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'uploadScreenshot',\n config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot,\n );\n}\n\n// make sure config file options doesn't overwrite passed options from cli directly.\nfunction assignIfValueIsValidAndNotSetAlready<R, T extends Record<K, R>, K extends keyof T>(\n object: T,\n key: K,\n value?: NonNullable<R>,\n) {\n if (!object[key] && value) {\n object[key] = value as any;\n }\n}\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\nimport { parseConfigFile } from '../parseConfigFile';\n\nexport async function setup() {\n await setupBasicOptions();\n await parseConfigFile();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.resourcesDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.resourcesDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.resourcesDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.resourcesDir, '.temp');\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { join, relativePath, copy, exist } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport { logger } from './logger';\nimport chalk from 'chalk';\n\nexport function copyIosMetadata(to: 'resources' | 'native') {\n const iosDir = join(OptionHolder.projectDir, 'ios');\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n if (exist(metadataNativeDir) && exist(screenshotsNativeDir)) {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(metadataResourcesDir) && exist(screenshotsResourcesDir)) {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n\nexport function copyAndroidMetadata(to: 'resouces' | 'native') {\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resouces') {\n if (exist(nativeDir)) {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(resourcesDir)) {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyIosMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyIosMetadata('native');\n}\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyAndroidMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyAndroidMetadata('native');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.resourcesDir, 'key', 'android_release.keystore'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve, read, writeJson, join } from './FileUtil';\n\nexport function generateAppStoreConnectApiKeyFile() {\n const json = {\n key: read(resolve(OptionHolder.keyDir, 'ios_app_store_connect_api_key.p8')),\n key_id: OptionHolder.keyholderMap.ios_app_store_connect_api_key_id,\n issuer_id: OptionHolder.keyholderMap.ios_app_store_connect_api_key_issuer_id,\n };\n const file = join(OptionHolder.tempDir, 'app_store_connect_api.json');\n writeJson(file, json);\n return file;\n}\n","import { OptionHolder } from '../util/OptionHolder';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { setup } from '../util/setup/setup';\nimport { join, resolve } from '../util/FileUtil';\nimport { exe } from '../util/setup/execShellScript';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { generateAppStoreConnectApiKeyFile } from '../util/generateAppStoreConnectApiKeyFile';\nimport { copyIosMetadata, copyAndroidMetadata } from '../util/MetadataSyncUtil';\n\nexport async function pull({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n await setup();\n await promptInputs();\n\n if (OptionHolder.input.platform === 'ios') {\n await pullIosMetadata();\n } else {\n await pullAndroidMetadata();\n }\n}\n\nasync function promptInputs() {\n await InqueryInputs.platform();\n await InqueryInputs.useLiveVersionIos();\n}\n\nasync function pullIosMetadata() {\n await prepareIos();\n const iosDir = join(OptionHolder.projectDir, 'ios');\n const exeEnv = exe({\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderMap.ios_match_password,\n },\n });\n\n await exeEnv('bundle', [\n 'exec',\n 'fastlane',\n 'deliver',\n 'download_metadata',\n '-f',\n '--api_key_path',\n generateAppStoreConnectApiKeyFile(),\n ]);\n\n await exeEnv('bundle', [\n 'exec',\n 'fastlane',\n 'deliver',\n 'download_screenshots',\n '-f',\n '--api_key_path',\n generateAppStoreConnectApiKeyFile(),\n '--use_live_version',\n OptionHolder.input.useLiveVersionIos + '',\n ]);\n\n copyIosMetadata('resources');\n}\n\nasync function pullAndroidMetadata() {\n await prepareAndroid();\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n await exe(\n 'bundle',\n [\n 'exec',\n 'fastlane',\n 'supply',\n 'init',\n '--json_key',\n resolve(OptionHolder.keyDir, 'android_play_console_service_account.json'),\n '--package_name',\n OptionHolder.keyholderMap.android_package_name,\n ],\n { cwd: androidDir },\n );\n\n copyAndroidMetadata('resouces');\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","chalk","resolve","is","join","resolve","join","chalk","chalk","join","resolve","resolve","resolve","join","join","resolve"]}
|
package/build/command/submit.js
CHANGED
|
@@ -3,17 +3,16 @@ var package_default = {
|
|
|
3
3
|
name: "expo-release-it",
|
|
4
4
|
module: "src/index.ts",
|
|
5
5
|
type: "module",
|
|
6
|
-
version: "0.3.
|
|
6
|
+
version: "0.3.2",
|
|
7
7
|
license: "MIT",
|
|
8
8
|
homepage: "https://github.com/mym0404/expo-release-it",
|
|
9
9
|
repository: "https://github.com/mym0404/expo-release-it",
|
|
10
10
|
scripts: {
|
|
11
|
-
build: "tsup",
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
t: "tsc --noEmit -p ."
|
|
11
|
+
build: "pnpm build:json-schema-type && tsup",
|
|
12
|
+
"build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
|
|
13
|
+
dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
|
|
14
|
+
release: "pnpm build && pnpm run t && release-it",
|
|
15
|
+
t: "lefthook run check"
|
|
17
16
|
},
|
|
18
17
|
dependencies: {
|
|
19
18
|
"@inquirer/prompts": "^7.4.1",
|
|
@@ -33,29 +32,29 @@ var package_default = {
|
|
|
33
32
|
"@release-it/conventional-changelog": "^10.0.1",
|
|
34
33
|
"@types/fs-extra": "^11.0.4",
|
|
35
34
|
"@types/semver": "^7.7.0",
|
|
35
|
+
"json-schema-to-typescript": "^15.0.4",
|
|
36
36
|
lefthook: "^1.11.11",
|
|
37
37
|
prettier: "3.5.3",
|
|
38
38
|
"release-it": "^19.0.1",
|
|
39
39
|
"tiny-glob": "^0.2.9",
|
|
40
40
|
tsup: "^8.4.0",
|
|
41
|
-
typescript: "^5.8.3"
|
|
41
|
+
typescript: "^5.8.3",
|
|
42
|
+
vitest: "^3.1.2"
|
|
42
43
|
},
|
|
43
|
-
workspaces: [
|
|
44
|
-
"example"
|
|
45
|
-
],
|
|
46
44
|
bin: "./bin/expo-release-it.mjs",
|
|
47
45
|
files: [
|
|
48
46
|
"build",
|
|
49
47
|
"package.json",
|
|
50
48
|
"bin",
|
|
51
|
-
"template"
|
|
49
|
+
"template",
|
|
50
|
+
"expo-release-it.schema.json"
|
|
52
51
|
],
|
|
53
|
-
packageManager: "yarn@4.9.1",
|
|
54
52
|
commitlint: {
|
|
55
53
|
extends: [
|
|
56
54
|
"@commitlint/config-conventional"
|
|
57
55
|
]
|
|
58
|
-
}
|
|
56
|
+
},
|
|
57
|
+
packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
|
|
59
58
|
};
|
|
60
59
|
|
|
61
60
|
// src/util/FileUtil.ts
|
|
@@ -153,6 +152,11 @@ ${msg.join(", ")}`)),
|
|
|
153
152
|
dim: (...msg) => console.log(chalk.dim(msg.join(", ")))
|
|
154
153
|
};
|
|
155
154
|
|
|
155
|
+
// src/util/EnvUtil.ts
|
|
156
|
+
var isDev = process.env.NODE_ENV === "development";
|
|
157
|
+
var isWin = process.platform.startsWith("win");
|
|
158
|
+
var isTest = process.env.NODE_ENV === "test";
|
|
159
|
+
|
|
156
160
|
// src/util/throwError.ts
|
|
157
161
|
function throwError(message, e) {
|
|
158
162
|
if (e) {
|
|
@@ -160,11 +164,15 @@ function throwError(message, e) {
|
|
|
160
164
|
} else {
|
|
161
165
|
logger.error(message);
|
|
162
166
|
}
|
|
167
|
+
if (isTest) {
|
|
168
|
+
throw new Error("throwError");
|
|
169
|
+
}
|
|
163
170
|
process.exit(1);
|
|
164
171
|
}
|
|
165
172
|
|
|
166
173
|
// src/util/setup/VersionUtil.ts
|
|
167
174
|
import semver from "semver";
|
|
175
|
+
import { padZero } from "@mj-studio/js-util";
|
|
168
176
|
var versionNameRegex = () => /const\s+VERSION_NAME\s*?=\s*?['"]([\d\.]*?)['"]\s*?;?/;
|
|
169
177
|
var versionCodeRegex = () => /const\s+VERSION_CODE\s*?=\s*?(\d+)\s*?;?/;
|
|
170
178
|
async function parseBinaryVersions() {
|
|
@@ -222,13 +230,52 @@ async function parseBinaryVersions() {
|
|
|
222
230
|
}
|
|
223
231
|
}
|
|
224
232
|
|
|
225
|
-
// src/util/
|
|
226
|
-
|
|
227
|
-
|
|
233
|
+
// src/util/parseConfigFile.ts
|
|
234
|
+
import { is } from "@mj-studio/js-util";
|
|
235
|
+
async function parseConfigFile() {
|
|
236
|
+
const candidates = [
|
|
237
|
+
join2(OptionHolder.resourcesDir, "expo-release-it.config.json"),
|
|
238
|
+
join2(OptionHolder.projectDir, "expo-release-it.config.json")
|
|
239
|
+
];
|
|
240
|
+
if (OptionHolder.input.config) {
|
|
241
|
+
candidates.unshift(OptionHolder.input.config);
|
|
242
|
+
}
|
|
243
|
+
const validConfigFilePath = candidates.find(
|
|
244
|
+
(candidate) => exist(candidate) && is.object(readJsonSlow(candidate))
|
|
245
|
+
);
|
|
246
|
+
if (!validConfigFilePath) return;
|
|
247
|
+
const config = readJsonSlow(validConfigFilePath);
|
|
248
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
249
|
+
OptionHolder.input,
|
|
250
|
+
"semverIncrement",
|
|
251
|
+
config.bump?.increment
|
|
252
|
+
);
|
|
253
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
254
|
+
OptionHolder.input,
|
|
255
|
+
"androidOutput",
|
|
256
|
+
config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput
|
|
257
|
+
);
|
|
258
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
259
|
+
OptionHolder.input,
|
|
260
|
+
"uploadMetadata",
|
|
261
|
+
config.upload?.uploadMetadata ?? config.submit?.uploadMetadata
|
|
262
|
+
);
|
|
263
|
+
assignIfValueIsValidAndNotSetAlready(
|
|
264
|
+
OptionHolder.input,
|
|
265
|
+
"uploadScreenshot",
|
|
266
|
+
config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
function assignIfValueIsValidAndNotSetAlready(object, key, value) {
|
|
270
|
+
if (!object[key] && value) {
|
|
271
|
+
object[key] = value;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
228
274
|
|
|
229
275
|
// src/util/setup/setup.ts
|
|
230
276
|
async function setup() {
|
|
231
277
|
await setupBasicOptions();
|
|
278
|
+
await parseConfigFile();
|
|
232
279
|
await hydrateKeyholderFileValues();
|
|
233
280
|
await parseBinaryVersions();
|
|
234
281
|
}
|
|
@@ -244,12 +291,12 @@ async function setupBasicOptions() {
|
|
|
244
291
|
import chalk5 from "chalk";
|
|
245
292
|
|
|
246
293
|
// src/util/calculateElapsed.ts
|
|
247
|
-
import { padZero } from "@mj-studio/js-util";
|
|
294
|
+
import { padZero as padZero2 } from "@mj-studio/js-util";
|
|
248
295
|
function calculateElapsed(t) {
|
|
249
296
|
let seconds = Math.floor((Date.now() - t) / 1e3);
|
|
250
297
|
const minutes = Math.floor(seconds / 60);
|
|
251
298
|
seconds = seconds % 60;
|
|
252
|
-
return `${minutes}:${
|
|
299
|
+
return `${minutes}:${padZero2(seconds)}`;
|
|
253
300
|
}
|
|
254
301
|
|
|
255
302
|
// src/util/iterateAllFiles.ts
|
|
@@ -445,7 +492,7 @@ async function prepareIos() {
|
|
|
445
492
|
|
|
446
493
|
// src/util/input/InqueryInputs.ts
|
|
447
494
|
import { select } from "@inquirer/prompts";
|
|
448
|
-
import { is } from "@mj-studio/js-util";
|
|
495
|
+
import { is as is2 } from "@mj-studio/js-util";
|
|
449
496
|
import chalk4 from "chalk";
|
|
450
497
|
var InqueryInputs = {
|
|
451
498
|
platform: async () => {
|
|
@@ -462,21 +509,6 @@ var InqueryInputs = {
|
|
|
462
509
|
});
|
|
463
510
|
}
|
|
464
511
|
},
|
|
465
|
-
platformAll: async () => {
|
|
466
|
-
if (!OptionHolder.input.platformAll) {
|
|
467
|
-
OptionHolder.input.platformAll = await select({
|
|
468
|
-
message: constructInquirerFormattedMessage({
|
|
469
|
-
name: "Platform",
|
|
470
|
-
explanation: `Platforms to run action`
|
|
471
|
-
}),
|
|
472
|
-
choices: [
|
|
473
|
-
{ name: "all", value: "all", description: "Both" },
|
|
474
|
-
{ name: "ios", value: "ios", description: "Release ios" },
|
|
475
|
-
{ name: "android", value: "android", description: "Release android" }
|
|
476
|
-
]
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
},
|
|
480
512
|
podinstall: async () => {
|
|
481
513
|
if (OptionHolder.input.platform === "ios") {
|
|
482
514
|
OptionHolder.input.pod = await select({
|
|
@@ -506,7 +538,7 @@ var InqueryInputs = {
|
|
|
506
538
|
}
|
|
507
539
|
},
|
|
508
540
|
uploadMetadata: async () => {
|
|
509
|
-
if (!
|
|
541
|
+
if (!is2.boolean(OptionHolder.input.uploadMetadata)) {
|
|
510
542
|
OptionHolder.input.uploadMetadata = await select({
|
|
511
543
|
message: constructInquirerFormattedMessage({
|
|
512
544
|
name: "Upload Text Metadata(title, description, ...)"
|
|
@@ -519,7 +551,7 @@ var InqueryInputs = {
|
|
|
519
551
|
}
|
|
520
552
|
},
|
|
521
553
|
uploadScreenshot: async () => {
|
|
522
|
-
if (!
|
|
554
|
+
if (!is2.boolean(OptionHolder.input.uploadScreenshot)) {
|
|
523
555
|
OptionHolder.input.uploadScreenshot = await select({
|
|
524
556
|
message: constructInquirerFormattedMessage({
|
|
525
557
|
name: "Upload Screenshots & Images"
|
|
@@ -532,7 +564,7 @@ var InqueryInputs = {
|
|
|
532
564
|
}
|
|
533
565
|
},
|
|
534
566
|
useLiveVersionIos: async () => {
|
|
535
|
-
if (!
|
|
567
|
+
if (!is2.boolean(OptionHolder.input.useLiveVersionIos) && OptionHolder.input.platform === "ios") {
|
|
536
568
|
OptionHolder.input.useLiveVersionIos = await select({
|
|
537
569
|
message: constructInquirerFormattedMessage({
|
|
538
570
|
name: "Download metadatas from live version rather than draft"
|