expo-release-it 0.0.13 → 0.0.15

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/build/index.js CHANGED
@@ -6,7 +6,7 @@ var package_default = {
6
6
  name: "expo-release-it",
7
7
  module: "src/index.ts",
8
8
  type: "module",
9
- version: "0.0.12",
9
+ version: "0.0.14",
10
10
  license: "MIT",
11
11
  scripts: {
12
12
  build: "tsup",
@@ -56,23 +56,26 @@ import fs from "fs-extra";
56
56
  import * as path from "path";
57
57
  var join2 = path.join;
58
58
  var resolve2 = path.resolve;
59
- function exist(path4) {
60
- return fs.existsSync(path4);
59
+ function exist(path3) {
60
+ return fs.existsSync(path3);
61
61
  }
62
- function isDir(path4) {
63
- return exist(path4) && fs.lstatSync(path4).isDirectory();
62
+ function isDir(path3) {
63
+ return exist(path3) && fs.lstatSync(path3).isDirectory();
64
64
  }
65
- function isFile(path4) {
66
- return exist(path4) && fs.lstatSync(path4).isFile();
65
+ function relativePath(from, to) {
66
+ return path.relative(from, to);
67
67
  }
68
- function read(path4) {
69
- return fs.readFileSync(path4, { encoding: "utf8" });
68
+ function isFile(path3) {
69
+ return exist(path3) && fs.lstatSync(path3).isFile();
70
70
  }
71
- function readdir(path4) {
72
- return fs.readdirSync(path4);
71
+ function read(path3) {
72
+ return fs.readFileSync(path3, { encoding: "utf8" });
73
73
  }
74
- function readJsonSlow(path4) {
75
- return fs.readJSONSync(path4);
74
+ function readdir(path3) {
75
+ return fs.readdirSync(path3);
76
+ }
77
+ function readJsonSlow(path3) {
78
+ return fs.readJSONSync(path3);
76
79
  }
77
80
  function write(p, content) {
78
81
  const dir = path.dirname(p);
@@ -84,24 +87,24 @@ function write(p, content) {
84
87
  function copy(src, dest, options) {
85
88
  fs.copySync(src, dest, options);
86
89
  }
87
- function writeJson(path4, json) {
88
- return write(path4, JSON.stringify(json, null, 2));
90
+ function writeJson(path3, json) {
91
+ return write(path3, JSON.stringify(json, null, 2));
89
92
  }
90
- function remove(path4) {
91
- if (!exist(path4)) {
93
+ function remove(path3) {
94
+ if (!exist(path3)) {
92
95
  return;
93
96
  }
94
- if (fs.lstatSync(path4).isDirectory()) {
95
- return fs.rmSync(path4, { force: true, recursive: true });
97
+ if (fs.lstatSync(path3).isDirectory()) {
98
+ return fs.rmSync(path3, { force: true, recursive: true });
96
99
  } else {
97
- return fs.rmSync(path4, { force: true });
100
+ return fs.rmSync(path3, { force: true });
98
101
  }
99
102
  }
100
- async function iterateDir(path4, fn) {
101
- if (!isDir(path4)) {
103
+ async function iterateDir(path3, fn) {
104
+ if (!isDir(path3)) {
102
105
  return;
103
106
  }
104
- for (const file of fs.readdirSync(path4)) {
107
+ for (const file of fs.readdirSync(path3)) {
105
108
  await fn(file);
106
109
  }
107
110
  }
@@ -376,13 +379,14 @@ async function copyTemplates() {
376
379
  }
377
380
  async function injectPlaceHolders() {
378
381
  await iterateAllFilesInGeneratedTemplate(async (filePath) => {
382
+ const dirPath = path2.dirname(filePath);
379
383
  let content = read(filePath);
380
384
  for (const [key, value] of Object.entries(OptionHolder.templateValuePlaceholderMap)) {
381
385
  content = content.replaceAll(`{{${key}}}`, value);
382
386
  }
383
387
  content = content.replaceAll(
384
388
  "{{key_dir_relative_path}}",
385
- path2.relative(filePath, OptionHolder.keyDir)
389
+ relativePath(dirPath, OptionHolder.keyDir)
386
390
  );
387
391
  write(filePath, content);
388
392
  });
@@ -437,7 +441,7 @@ async function preCheck() {
437
441
  import { select } from "@inquirer/prompts";
438
442
 
439
443
  // src/util/setup/prepareAndroid.ts
440
- import { spinner, $ as $2, path as path3 } from "zx";
444
+ import { spinner, $ as $2 } from "zx";
441
445
  async function prepareAndroid() {
442
446
  const androidDir = resolve2(OptionHolder.projectDir, "android");
443
447
  const fastlaneSrcDir = resolve2(OptionHolder.outputOfInitDir, "fastlane-android");
@@ -455,6 +459,7 @@ async function prepareAndroid() {
455
459
  logger.success("Inject Android Fastlane files");
456
460
  await replaceAndroidSigningConfig();
457
461
  async function replaceAndroidSigningConfig() {
462
+ const buildGradleDirPath = resolve2(androidDir, "app");
458
463
  const buildGradlePath = resolve2(androidDir, "app", "build.gradle");
459
464
  const {
460
465
  android_keystore_store_password,
@@ -466,7 +471,7 @@ async function prepareAndroid() {
466
471
  `
467
472
  signingConfigs {
468
473
  debug {
469
- storeFile file('${path3.relative(buildGradlePath, resolve2(OptionHolder.outputOfInitDir, "key", "android_release_keystore.jks"))}')
474
+ storeFile file('${relativePath(buildGradleDirPath, resolve2(OptionHolder.outputOfInitDir, "key", "android_release_keystore.jks"))}')
470
475
  storePassword '${android_keystore_store_password}'
471
476
  keyAlias '${android_keystore_key_alias}'
472
477
  keyPassword '${android_keystore_key_password}'
@@ -640,6 +645,117 @@ async function submitIos() {
640
645
  }
641
646
  }
642
647
 
648
+ // src/command/build.ts
649
+ import { select as select3 } from "@inquirer/prompts";
650
+ import { spinner as spinner5, $ as $6 } from "zx";
651
+ import chalk5 from "chalk";
652
+ import { formatJson } from "@mj-studio/js-util";
653
+ async function build({ options }) {
654
+ Object.assign(OptionHolder.build, options);
655
+ logger.dim(formatJson(OptionHolder.build));
656
+ const startTime = Date.now();
657
+ await setup();
658
+ await promptInputs4();
659
+ logger.info("Build Started");
660
+ logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);
661
+ if (OptionHolder.build.platform === "ios") {
662
+ await buildIos();
663
+ logger.success(`iOS Build ${chalk5.bold.inverse(calculateElapsed(startTime))}`);
664
+ } else {
665
+ await buildAndroid();
666
+ logger.success(`Android Build ${chalk5.bold.inverse(calculateElapsed(startTime))}`);
667
+ }
668
+ }
669
+ async function promptInputs4() {
670
+ if (!OptionHolder.build.platform) {
671
+ OptionHolder.build.platform = await select3({
672
+ message: "Platform to release",
673
+ choices: [
674
+ { name: "ios", value: "ios", description: "Release ios" },
675
+ { name: "android", value: "android", description: "Release android" }
676
+ ]
677
+ });
678
+ }
679
+ if (OptionHolder.build.platform === "ios") {
680
+ OptionHolder.build.pod = await select3({
681
+ message: "Install Cocoapods",
682
+ choices: [
683
+ { name: "yes", value: true, description: "Install pods before release" },
684
+ { name: "no", value: false, description: "Skip pods install" }
685
+ ]
686
+ });
687
+ }
688
+ if (OptionHolder.build.platform === "android") {
689
+ if (!OptionHolder.build.androidOutput) {
690
+ OptionHolder.build.androidOutput = await select3({
691
+ message: "Android Output",
692
+ choices: [
693
+ { name: "aab", value: "aab", description: "Build as App bundle" },
694
+ { name: "apk", value: "apk", description: "Build as APK" }
695
+ ]
696
+ });
697
+ }
698
+ }
699
+ }
700
+ async function buildIos() {
701
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
702
+ const $$ = $6({
703
+ verbose: false,
704
+ cwd: iosDir,
705
+ env: {
706
+ MATCH_PASSWORD: OptionHolder.keyholderFileValueMap.ios_match_password
707
+ }
708
+ });
709
+ await prepareIos();
710
+ await fastlane();
711
+ async function fastlane() {
712
+ await spinner5("Bundler Install", () => $$`bundle install`);
713
+ logger.success("Bundler Install");
714
+ if (OptionHolder.build.pod) {
715
+ await spinner5("Pod Install", () => $$`bundle exec pod install`);
716
+ logger.success("Pod Install");
717
+ }
718
+ remove(resolve2(iosDir, ".xcode.env.local"));
719
+ await spinner5(
720
+ "Fastlane",
721
+ () => $$`bundle exec fastlane build version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`
722
+ );
723
+ }
724
+ }
725
+ async function buildAndroid() {
726
+ const androidDir = resolve2(OptionHolder.projectDir, "android");
727
+ const $$ = $6({
728
+ verbose: false,
729
+ cwd: androidDir
730
+ });
731
+ await prepareAndroid();
732
+ await fastlane();
733
+ async function fastlane() {
734
+ await spinner5("Bundler Install", () => $$`bundle install`);
735
+ logger.success("Bundler Install");
736
+ let buildOutputDir;
737
+ let outputDir;
738
+ if (OptionHolder.build.androidOutput === "aab") {
739
+ await spinner5(
740
+ "Bundle AAB",
741
+ () => $$`${isWin ? "gradle.bat" : "./gradlew"} app:bundleRelease`
742
+ );
743
+ buildOutputDir = resolve2(androidDir, "app", "build", "outputs", "bundle", "release");
744
+ outputDir = resolve2(OptionHolder.outputOfInitDir, "output", "android", "aab");
745
+ } else {
746
+ await spinner5(
747
+ "Bundle APK",
748
+ () => $$`${isWin ? "gradle.bat" : "./gradlew"} app:assembleRelease`
749
+ );
750
+ buildOutputDir = resolve2(androidDir, "app", "build", "outputs", "apk", "release");
751
+ outputDir = resolve2(OptionHolder.outputOfInitDir, "output", "android", "apk");
752
+ }
753
+ remove(outputDir);
754
+ copy(buildOutputDir, outputDir);
755
+ logger.success(`artifact generated: ${relativePath(OptionHolder.projectDir, outputDir)}`);
756
+ }
757
+ }
758
+
643
759
  // src/index.ts
644
760
  var run = () => {
645
761
  const platformOption = new Option("-p --platform <platform>", "Platform").choices([
@@ -658,8 +774,10 @@ var run = () => {
658
774
  program.command("bump").description("Bump binary release patch version with modifying app.json").action(async (options) => {
659
775
  await bump({ options });
660
776
  });
661
- program.command("build").description("Build binary").addOption(platformOption).action(async (options) => {
662
- await upload({ options });
777
+ program.command("build").description("Build binary").addOption(platformOption).addOption(
778
+ new Option("--androidOutput <output>", "Android Build Output").choices(["aab", "apk"])
779
+ ).action(async (options) => {
780
+ await build({ options });
663
781
  });
664
782
  program.command("upload").description("Upload artifact to play console internal test track(android) and testflight(ios)").addOption(platformOption).action(async (options) => {
665
783
  await upload({ options });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../src/util/FileUtil.ts","../src/util/OptionHolder.ts","../src/util/logger.ts","../src/command/init.ts","../src/util/iterateAllFilesInGeneratedTemplate.ts","../src/util/EnvUtil.ts","../src/util/throwError.ts","../src/util/VersionUtil.ts","../src/util/setup/promptCommonInputs.ts","../src/command/bump.ts","../src/util/hydrateKeyholderFileValues.ts","../src/util/setup/setup.ts","../src/command/upload.ts","../src/util/setup/prepareAndroid.ts","../src/util/setup/prepareIos.ts","../src/util/calculateElapsed.ts","../src/command/submit.ts"],"sourcesContent":["import { Command, Option } from 'commander';\n\nimport { init } from './command/init';\nimport { OptionHolder } from './util/OptionHolder';\nimport { logger } from './util/logger';\nimport { bump } from './command/bump';\nimport { upload } from './command/upload';\nimport { submit } from './command/submit';\n\nexport const run = () => {\n const platformOption = new Option('-p --platform <platform>', 'Platform').choices([\n 'android',\n 'ios',\n ]);\n\n const program = new Command();\n program\n .name('expo-release-it')\n .description('Build & Upload & Submit locally for Expo project')\n .version(OptionHolder.cli.version);\n\n program\n .command('init')\n .description('Initialize CLI utilities')\n .action(async (options) => {\n try {\n await init({ options });\n } catch (e: any) {\n logger.error(e);\n }\n });\n\n program\n .command('bump')\n .description('Bump binary release patch version with modifying app.json')\n // .addOption(\n // new Option('-i --increment <type>', 'increment type').choices(['major', 'minor', 'patch']),\n // )\n .action(async (options) => {\n await bump({ options });\n });\n\n program\n .command('build')\n .description('Build binary')\n .addOption(platformOption)\n .action(async (options) => {\n await upload({ options });\n });\n\n program\n .command('upload')\n .description('Upload artifact to play console internal test track(android) and testflight(ios)')\n .addOption(platformOption)\n .action(async (options) => {\n await upload({ options });\n });\n\n program\n .command('submit')\n .description('Submit Google Play Console & App Store Connect Review with latest testing track')\n .addOption(platformOption)\n .action(async (options) => {\n await submit({ options });\n });\n\n program.parse();\n};\n","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.12\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun 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 \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\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}\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}\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 type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\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 init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: 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 android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: 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 init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\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 { OptionHolder } from '../util/OptionHolder';\nimport { logger } from '../util/logger';\nimport chalk from 'chalk';\nimport { input } from '@inquirer/prompts';\nimport { iterateAllFilesInGeneratedTemplate } from '../util/iterateAllFilesInGeneratedTemplate';\nimport { isDev } from '../util/EnvUtil';\nimport { parseBinaryVersions } from '../util/VersionUtil';\nimport { promptCommonInputs } from '../util/setup/promptCommonInputs';\nimport { exist, remove, copy, read, write, join, writeJson } from '../util/FileUtil';\nimport { path } from 'zx';\n\nexport type InitOptions = {};\n\nexport async function init({ options }: { options: InitOptions }) {\n Object.assign(OptionHolder.init, options);\n\n logger.info(`${chalk.inverse('expo-local-build')}`);\n\n await promptCommonInputs();\n await parseBinaryVersions();\n await promptInputs();\n await copyTemplates();\n await injectPlaceHolders();\n\n logger.success('expo-local-build init success');\n}\n\nasync function promptInputs() {\n /* ios */\n OptionHolder.iosBundleIdentifier = OptionHolder.templateValuePlaceholderMap.ios_app_identifier =\n await input({\n message: 'IOS Bundle Identifier',\n required: true,\n default: isDev ? 'ios_app_identifier' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_team_id = await input({\n message: 'IOS App Store Connect Team Id',\n default: isDev ? 'ios_app_store_connect_team_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_developer_team_id = await input({\n message: 'IOS Developer Portal Team Id',\n default: isDev ? 'ios_developer_team_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_match_git_url = await input({\n message: 'IOS Match Key Storage Github URL',\n default: isDev ? 'ios_match_git_url' : undefined,\n });\n\n OptionHolder.keyholderFileValueMap.ios_match_password = await input({\n message: 'IOS Match Password',\n default: isDev ? 'ios_match_password' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_api_key_id = await input({\n message: 'IOS App Store Connect Api Key Id',\n default: isDev ? 'ios_app_store_connect_api_key_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_api_key_issuer_id = await input({\n message: 'IOS App Store Connect Api Key Issuer Id',\n default: isDev ? 'ios_app_store_connect_api_key_issuer_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_xcode_project_target = await input({\n message: 'IOS Xcode Target Name',\n default: 'app',\n });\n\n /* android */\n OptionHolder.androidPackageName = OptionHolder.templateValuePlaceholderMap.android_package_name =\n await input({\n message: 'Android Package Name',\n default: isDev ? 'android_package_name' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_store_password = await input({\n message: 'Android Keystore Store Password',\n default: isDev ? 'android_keystore_store_password' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_key_alias = await input({\n message: 'Android Keystore Key Alias',\n default: isDev ? 'android_keystore_key_alias' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_key_password = await input({\n message: 'Android Keystore Key Password',\n default: isDev ? 'android_keystore_key_password' : undefined,\n });\n\n writeJson(OptionHolder.keyholderFilePath, OptionHolder.keyholderFileValueMap);\n}\n\nasync function copyTemplates() {\n for (const dir of OptionHolder.templateDirNames) {\n await copyDirRecursively(dir);\n }\n\n async function copyDirRecursively(dir: string) {\n const sourceDirPath = join(OptionHolder.cli.templateDir, dir);\n const destDirPath = join(OptionHolder.outputOfInitDir, dir);\n // don't overwirte key\n if (exist(destDirPath) && dir !== 'key') {\n remove(destDirPath);\n }\n copy(sourceDirPath, destDirPath, { overwrite: dir !== 'key' });\n }\n}\n\nasync function injectPlaceHolders() {\n await iterateAllFilesInGeneratedTemplate(async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.templateValuePlaceholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n // dynamic replacements\n content = content.replaceAll(\n '{{key_dir_relative_path}}',\n path.relative(filePath, OptionHolder.keyDir),\n );\n write(filePath, content);\n });\n}\n","import { OptionHolder } from './OptionHolder';\nimport { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFilesInGeneratedTemplate(\n callback: (filePath: string) => Promise<void>,\n) {\n for (const dir of OptionHolder.templateDirNames) {\n await go(join(OptionHolder.outputOfInitDir, dir));\n }\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","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\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\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 = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];\n const VERSION_CODE = /const VERSION_CODE = (.*?);/.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(\n /const VERSION_NAME = '(.*?)';/,\n `const VERSION_NAME = '${versionName}';`,\n );\n content = content.replace(\n /const VERSION_CODE = (.*?);/,\n `const VERSION_CODE = ${versionCode};`,\n );\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","import { OptionHolder } from '../OptionHolder';\nimport { input } from '@inquirer/prompts';\nimport { isDev } from '../EnvUtil';\nimport { exist, resolve } from '../FileUtil';\n\nexport async function promptCommonInputs() {\n OptionHolder.projectDir = isDev\n ? resolve('example')\n : resolve(\n await input({\n message: 'react native project root directory path',\n default: isDev ? 'example' : '.',\n validate: (value) => {\n const p = resolve(value, 'package.json');\n if (!exist(p)) {\n return \"package.json hasn\\'t been detected. provider valid project root.\";\n }\n return true;\n },\n }),\n );\n\n OptionHolder.outputOfInitDir = resolve(OptionHolder.projectDir, 'expo-local-build');\n OptionHolder.keyDir = resolve(OptionHolder.outputOfInitDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.outputOfInitDir, 'keyholder.json');\n}\n","import { injectBinaryVersions } from '../util/VersionUtil';\nimport { throwError } from '../util/throwError';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport semver from 'semver';\nimport { isDev } from '../util/EnvUtil';\nimport { $ } from 'zx';\nimport { setup } from '../util/setup/setup';\n\nexport type BumpOptions = {};\n\nexport async function bump({ options }: { options: BumpOptions }) {\n Object.assign(OptionHolder.bump, options);\n await preCheck();\n await setup();\n\n logger.info(`current version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n const nextVersionName = semver.inc(OptionHolder.versionName, 'patch')!;\n const nextVersionCode = Number(OptionHolder.versionCode) + 1 + '';\n logger.info(`next version: ${nextVersionName}(${nextVersionCode})`);\n\n await injectBinaryVersions({ versionName: nextVersionName, versionCode: nextVersionCode });\n logger.success('Binary versions have been bumped in expo config file');\n}\n\nasync function preCheck() {\n if (isDev) return;\n try {\n let hasChange = false;\n try {\n await $`git diff --quiet HEAD`;\n } catch (_) {\n hasChange = true;\n }\n if (hasChange) {\n throwError('Workspace is not clean. Before bump version, you should commit all changes.');\n }\n } catch (e) {\n throwError('Precheck Failed', e);\n }\n}\n","import { OptionHolder } from './OptionHolder';\nimport { readJsonSlow } from './FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n Object.assign(OptionHolder.keyholderFileValueMap, readJsonSlow(OptionHolder.keyholderFilePath));\n}\n","import { promptCommonInputs } from './promptCommonInputs';\nimport { hydrateKeyholderFileValues } from '../hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from '../VersionUtil';\n\nexport async function setup() {\n await promptCommonInputs();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n","import { select } from '@inquirer/prompts';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { setup } from '../util/setup/setup';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport { spinner, $ } from 'zx';\nimport { resolve } from '../util/FileUtil';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\n\nexport type UploadOptions = {\n platform: 'ios' | 'android';\n};\n\nexport async function upload({ options }: { options: UploadOptions }) {\n Object.assign(OptionHolder.upload, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Build & Upload Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.upload.platform === 'ios') {\n await uploadIos();\n logger.success(`iOS Upload ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await uploadAndroid();\n logger.success(`Android Upload ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n if (!OptionHolder.upload.platform) {\n OptionHolder.upload.platform = await select({\n message: 'Platform to release',\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n}\n\nasync function uploadIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const $$ = $({\n verbose: false,\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderFileValueMap.ios_match_password,\n },\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane upload version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\nasync function uploadAndroid() {\n const $$ = $({\n verbose: false,\n cwd: resolve(OptionHolder.projectDir, 'android'),\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n await spinner(\n 'Fastlane Supply',\n () =>\n $$`bundle exec fastlane deploy version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\n","import { spinner, $, path } from 'zx';\nimport { resolve, remove, iterateDir, copy, read, write } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { logger } from '../logger';\n\nexport async function prepareAndroid() {\n const androidDir = resolve(OptionHolder.projectDir, 'android');\n const fastlaneSrcDir = resolve(OptionHolder.outputOfInitDir, 'fastlane-android');\n const fastlaneDestDir = resolve(OptionHolder.projectDir, 'android', 'fastlane');\n\n await spinner(\n 'Prebuild Android',\n () => $`cd ${OptionHolder.projectDir} && expo prebuild -p android --no-install`,\n );\n\n remove(fastlaneDestDir);\n\n await iterateDir(fastlaneSrcDir, async (file) => {\n const filePath = resolve(fastlaneSrcDir, file);\n remove(resolve(androidDir, file));\n copy(filePath, resolve(androidDir, file));\n });\n logger.success('Inject Android Fastlane files');\n await replaceAndroidSigningConfig();\n\n async function replaceAndroidSigningConfig() {\n const buildGradlePath = resolve(androidDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderFileValueMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${path.relative(buildGradlePath, resolve(OptionHolder.outputOfInitDir, 'key', 'android_release_keystore.jks'))}')\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 logger.success('Replace Android Signing Config');\n }\n}\n","import { $, spinner } from 'zx';\nimport { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { logger } from '../logger';\n\nexport async function prepareIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const fastlaneSrcDir = resolve(OptionHolder.outputOfInitDir, 'fastlane-ios');\n const fastlaneDestDir = resolve(OptionHolder.projectDir, 'ios', 'fastlane');\n\n await spinner(\n 'Prebuild iOS',\n () => $`cd ${OptionHolder.projectDir} && expo prebuild -p ios --no-install`,\n );\n\n remove(fastlaneDestDir);\n\n await iterateDir(fastlaneSrcDir, async (file) => {\n const filePath = resolve(fastlaneSrcDir, file);\n remove(resolve(iosDir, file));\n copy(filePath, resolve(iosDir, file));\n });\n\n logger.success('Inject iOS Fastlane files');\n}\n","import { padZero } from '@mj-studio/js-util';\n\nexport function calculateElapsed(t: number) {\n let seconds = Math.floor((Date.now() - t) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n return `${minutes}:${padZero(seconds)}`;\n}\n","import { setup } from '../util/setup/setup';\nimport { select } from '@inquirer/prompts';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { spinner, $ } from 'zx';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { remove, resolve } from '../util/FileUtil';\nimport { prepareIos } from '../util/setup/prepareIos';\n\nexport type SubmitOptions = {\n platform: 'ios' | 'android';\n};\n\nexport async function submit({ options }: { options: SubmitOptions }) {\n Object.assign(OptionHolder.submit, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Submit Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.submit.platform === 'ios') {\n await submitIos();\n logger.success(`Appstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await submitAndroid();\n logger.success(`Playstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n if (!OptionHolder.submit.platform) {\n OptionHolder.submit.platform = await select({\n message: 'Platform to submit',\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n}\n\nasync function submitAndroid() {\n const $$ = $({\n verbose: false,\n cwd: resolve(OptionHolder.projectDir, 'android'),\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane submit_playstore_review version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\nasync function submitIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const $$ = $({\n verbose: false,\n cwd: iosDir,\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane submit_appstore_review version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","chalk","input","join","resolve","resolve","path","chalk","input","join","semver","semver","$","path","resolve","$","path","$","spinner","resolve","spinner","$","spinner","$","chalk","promptInputs","chalk","resolve","$","spinner","select","chalk","spinner","$","promptInputs","chalk","select","$","resolve","spinner"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/util/FileUtil.ts","../src/util/OptionHolder.ts","../src/util/logger.ts","../src/command/init.ts","../src/util/iterateAllFilesInGeneratedTemplate.ts","../src/util/EnvUtil.ts","../src/util/throwError.ts","../src/util/VersionUtil.ts","../src/util/setup/promptCommonInputs.ts","../src/command/bump.ts","../src/util/hydrateKeyholderFileValues.ts","../src/util/setup/setup.ts","../src/command/upload.ts","../src/util/setup/prepareAndroid.ts","../src/util/setup/prepareIos.ts","../src/util/calculateElapsed.ts","../src/command/submit.ts","../src/command/build.ts"],"sourcesContent":["import { Command, Option } from 'commander';\n\nimport { init } from './command/init';\nimport { OptionHolder } from './util/OptionHolder';\nimport { logger } from './util/logger';\nimport { bump } from './command/bump';\nimport { upload } from './command/upload';\nimport { submit } from './command/submit';\nimport { build } from './command/build';\n\nexport const run = () => {\n const platformOption = new Option('-p --platform <platform>', 'Platform').choices([\n 'android',\n 'ios',\n ]);\n\n const program = new Command();\n program\n .name('expo-release-it')\n .description('Build & Upload & Submit locally for Expo project')\n .version(OptionHolder.cli.version);\n\n program\n .command('init')\n .description('Initialize CLI utilities')\n .action(async (options) => {\n try {\n await init({ options });\n } catch (e: any) {\n logger.error(e);\n }\n });\n\n program\n .command('bump')\n .description('Bump binary release patch version with modifying app.json')\n // .addOption(\n // new Option('-i --increment <type>', 'increment type').choices(['major', 'minor', 'patch']),\n // )\n .action(async (options) => {\n await bump({ options });\n });\n\n program\n .command('build')\n .description('Build binary')\n .addOption(platformOption)\n .addOption(\n new Option('--androidOutput <output>', 'Android Build Output').choices(['aab', 'apk']),\n )\n .action(async (options) => {\n await build({ options });\n });\n\n program\n .command('upload')\n .description('Upload artifact to play console internal test track(android) and testflight(ios)')\n .addOption(platformOption)\n .action(async (options) => {\n await upload({ options });\n });\n\n program\n .command('submit')\n .description('Submit Google Play Console & App Store Connect Review with latest testing track')\n .addOption(platformOption)\n .action(async (options) => {\n await submit({ options });\n });\n\n program.parse();\n};\n","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.14\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun 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 \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\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}\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}\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 type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\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 init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: 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 android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: 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 init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\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 { OptionHolder } from '../util/OptionHolder';\nimport { logger } from '../util/logger';\nimport chalk from 'chalk';\nimport { input } from '@inquirer/prompts';\nimport { iterateAllFilesInGeneratedTemplate } from '../util/iterateAllFilesInGeneratedTemplate';\nimport { isDev } from '../util/EnvUtil';\nimport { parseBinaryVersions } from '../util/VersionUtil';\nimport { promptCommonInputs } from '../util/setup/promptCommonInputs';\nimport { exist, remove, copy, read, write, join, writeJson, relativePath } from '../util/FileUtil';\nimport { path } from 'zx';\n\nexport type InitOptions = {};\n\nexport async function init({ options }: { options: InitOptions }) {\n Object.assign(OptionHolder.init, options);\n\n logger.info(`${chalk.inverse('expo-local-build')}`);\n\n await promptCommonInputs();\n await parseBinaryVersions();\n await promptInputs();\n await copyTemplates();\n await injectPlaceHolders();\n\n logger.success('expo-local-build init success');\n}\n\nasync function promptInputs() {\n /* ios */\n OptionHolder.iosBundleIdentifier = OptionHolder.templateValuePlaceholderMap.ios_app_identifier =\n await input({\n message: 'IOS Bundle Identifier',\n required: true,\n default: isDev ? 'ios_app_identifier' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_team_id = await input({\n message: 'IOS App Store Connect Team Id',\n default: isDev ? 'ios_app_store_connect_team_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_developer_team_id = await input({\n message: 'IOS Developer Portal Team Id',\n default: isDev ? 'ios_developer_team_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_match_git_url = await input({\n message: 'IOS Match Key Storage Github URL',\n default: isDev ? 'ios_match_git_url' : undefined,\n });\n\n OptionHolder.keyholderFileValueMap.ios_match_password = await input({\n message: 'IOS Match Password',\n default: isDev ? 'ios_match_password' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_api_key_id = await input({\n message: 'IOS App Store Connect Api Key Id',\n default: isDev ? 'ios_app_store_connect_api_key_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_app_store_connect_api_key_issuer_id = await input({\n message: 'IOS App Store Connect Api Key Issuer Id',\n default: isDev ? 'ios_app_store_connect_api_key_issuer_id' : undefined,\n });\n\n OptionHolder.templateValuePlaceholderMap.ios_xcode_project_target = await input({\n message: 'IOS Xcode Target Name',\n default: 'app',\n });\n\n /* android */\n OptionHolder.androidPackageName = OptionHolder.templateValuePlaceholderMap.android_package_name =\n await input({\n message: 'Android Package Name',\n default: isDev ? 'android_package_name' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_store_password = await input({\n message: 'Android Keystore Store Password',\n default: isDev ? 'android_keystore_store_password' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_key_alias = await input({\n message: 'Android Keystore Key Alias',\n default: isDev ? 'android_keystore_key_alias' : undefined,\n });\n OptionHolder.keyholderFileValueMap.android_keystore_key_password = await input({\n message: 'Android Keystore Key Password',\n default: isDev ? 'android_keystore_key_password' : undefined,\n });\n\n writeJson(OptionHolder.keyholderFilePath, OptionHolder.keyholderFileValueMap);\n}\n\nasync function copyTemplates() {\n for (const dir of OptionHolder.templateDirNames) {\n await copyDirRecursively(dir);\n }\n\n async function copyDirRecursively(dir: string) {\n const sourceDirPath = join(OptionHolder.cli.templateDir, dir);\n const destDirPath = join(OptionHolder.outputOfInitDir, dir);\n // don't overwirte key\n if (exist(destDirPath) && dir !== 'key') {\n remove(destDirPath);\n }\n copy(sourceDirPath, destDirPath, { overwrite: dir !== 'key' });\n }\n}\n\nasync function injectPlaceHolders() {\n await iterateAllFilesInGeneratedTemplate(async (filePath: string) => {\n const dirPath = path.dirname(filePath);\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.templateValuePlaceholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n // dynamic replacements\n content = content.replaceAll(\n '{{key_dir_relative_path}}',\n relativePath(dirPath, OptionHolder.keyDir),\n );\n write(filePath, content);\n });\n}\n","import { OptionHolder } from './OptionHolder';\nimport { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFilesInGeneratedTemplate(\n callback: (filePath: string) => Promise<void>,\n) {\n for (const dir of OptionHolder.templateDirNames) {\n await go(join(OptionHolder.outputOfInitDir, dir));\n }\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","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\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\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 = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];\n const VERSION_CODE = /const VERSION_CODE = (.*?);/.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(\n /const VERSION_NAME = '(.*?)';/,\n `const VERSION_NAME = '${versionName}';`,\n );\n content = content.replace(\n /const VERSION_CODE = (.*?);/,\n `const VERSION_CODE = ${versionCode};`,\n );\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","import { OptionHolder } from '../OptionHolder';\nimport { input } from '@inquirer/prompts';\nimport { isDev } from '../EnvUtil';\nimport { exist, resolve } from '../FileUtil';\n\nexport async function promptCommonInputs() {\n OptionHolder.projectDir = isDev\n ? resolve('example')\n : resolve(\n await input({\n message: 'react native project root directory path',\n default: isDev ? 'example' : '.',\n validate: (value) => {\n const p = resolve(value, 'package.json');\n if (!exist(p)) {\n return \"package.json hasn\\'t been detected. provider valid project root.\";\n }\n return true;\n },\n }),\n );\n\n OptionHolder.outputOfInitDir = resolve(OptionHolder.projectDir, 'expo-local-build');\n OptionHolder.keyDir = resolve(OptionHolder.outputOfInitDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.outputOfInitDir, 'keyholder.json');\n}\n","import { injectBinaryVersions } from '../util/VersionUtil';\nimport { throwError } from '../util/throwError';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport semver from 'semver';\nimport { isDev } from '../util/EnvUtil';\nimport { $ } from 'zx';\nimport { setup } from '../util/setup/setup';\n\nexport type BumpOptions = {};\n\nexport async function bump({ options }: { options: BumpOptions }) {\n Object.assign(OptionHolder.bump, options);\n await preCheck();\n await setup();\n\n logger.info(`current version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n const nextVersionName = semver.inc(OptionHolder.versionName, 'patch')!;\n const nextVersionCode = Number(OptionHolder.versionCode) + 1 + '';\n logger.info(`next version: ${nextVersionName}(${nextVersionCode})`);\n\n await injectBinaryVersions({ versionName: nextVersionName, versionCode: nextVersionCode });\n logger.success('Binary versions have been bumped in expo config file');\n}\n\nasync function preCheck() {\n if (isDev) return;\n try {\n let hasChange = false;\n try {\n await $`git diff --quiet HEAD`;\n } catch (_) {\n hasChange = true;\n }\n if (hasChange) {\n throwError('Workspace is not clean. Before bump version, you should commit all changes.');\n }\n } catch (e) {\n throwError('Precheck Failed', e);\n }\n}\n","import { OptionHolder } from './OptionHolder';\nimport { readJsonSlow } from './FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n Object.assign(OptionHolder.keyholderFileValueMap, readJsonSlow(OptionHolder.keyholderFilePath));\n}\n","import { promptCommonInputs } from './promptCommonInputs';\nimport { hydrateKeyholderFileValues } from '../hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from '../VersionUtil';\n\nexport async function setup() {\n await promptCommonInputs();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n","import { select } from '@inquirer/prompts';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { setup } from '../util/setup/setup';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport { spinner, $ } from 'zx';\nimport { resolve } from '../util/FileUtil';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\n\nexport type UploadOptions = {\n platform: 'ios' | 'android';\n};\n\nexport async function upload({ options }: { options: UploadOptions }) {\n Object.assign(OptionHolder.upload, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Build & Upload Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.upload.platform === 'ios') {\n await uploadIos();\n logger.success(`iOS Upload ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await uploadAndroid();\n logger.success(`Android Upload ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n if (!OptionHolder.upload.platform) {\n OptionHolder.upload.platform = await select({\n message: 'Platform to release',\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n}\n\nasync function uploadIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const $$ = $({\n verbose: false,\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderFileValueMap.ios_match_password,\n },\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane upload version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\nasync function uploadAndroid() {\n const $$ = $({\n verbose: false,\n cwd: resolve(OptionHolder.projectDir, 'android'),\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n await spinner(\n 'Fastlane Supply',\n () =>\n $$`bundle exec fastlane deploy version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\n","import { spinner, $ } from 'zx';\nimport { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { logger } from '../logger';\n\nexport async function prepareAndroid() {\n const androidDir = resolve(OptionHolder.projectDir, 'android');\n const fastlaneSrcDir = resolve(OptionHolder.outputOfInitDir, 'fastlane-android');\n const fastlaneDestDir = resolve(OptionHolder.projectDir, 'android', 'fastlane');\n\n await spinner(\n 'Prebuild Android',\n () => $`cd ${OptionHolder.projectDir} && expo prebuild -p android --no-install`,\n );\n\n remove(fastlaneDestDir);\n\n await iterateDir(fastlaneSrcDir, async (file) => {\n const filePath = resolve(fastlaneSrcDir, file);\n remove(resolve(androidDir, file));\n copy(filePath, resolve(androidDir, file));\n });\n logger.success('Inject Android Fastlane files');\n await replaceAndroidSigningConfig();\n\n async function replaceAndroidSigningConfig() {\n const buildGradleDirPath = resolve(androidDir, 'app');\n const buildGradlePath = resolve(androidDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderFileValueMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.outputOfInitDir, 'key', 'android_release_keystore.jks'))}')\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 logger.success('Replace Android Signing Config');\n }\n}\n","import { $, spinner } from 'zx';\nimport { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { logger } from '../logger';\n\nexport async function prepareIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const fastlaneSrcDir = resolve(OptionHolder.outputOfInitDir, 'fastlane-ios');\n const fastlaneDestDir = resolve(OptionHolder.projectDir, 'ios', 'fastlane');\n\n await spinner(\n 'Prebuild iOS',\n () => $`cd ${OptionHolder.projectDir} && expo prebuild -p ios --no-install`,\n );\n\n remove(fastlaneDestDir);\n\n await iterateDir(fastlaneSrcDir, async (file) => {\n const filePath = resolve(fastlaneSrcDir, file);\n remove(resolve(iosDir, file));\n copy(filePath, resolve(iosDir, file));\n });\n\n logger.success('Inject iOS Fastlane files');\n}\n","import { padZero } from '@mj-studio/js-util';\n\nexport function calculateElapsed(t: number) {\n let seconds = Math.floor((Date.now() - t) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n return `${minutes}:${padZero(seconds)}`;\n}\n","import { setup } from '../util/setup/setup';\nimport { select } from '@inquirer/prompts';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { spinner, $ } from 'zx';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { remove, resolve } from '../util/FileUtil';\nimport { prepareIos } from '../util/setup/prepareIos';\n\nexport type SubmitOptions = {\n platform: 'ios' | 'android';\n};\n\nexport async function submit({ options }: { options: SubmitOptions }) {\n Object.assign(OptionHolder.submit, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Submit Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.submit.platform === 'ios') {\n await submitIos();\n logger.success(`Appstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await submitAndroid();\n logger.success(`Playstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n if (!OptionHolder.submit.platform) {\n OptionHolder.submit.platform = await select({\n message: 'Platform to submit',\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n}\n\nasync function submitAndroid() {\n const $$ = $({\n verbose: false,\n cwd: resolve(OptionHolder.projectDir, 'android'),\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane submit_playstore_review version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\nasync function submitIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const $$ = $({\n verbose: false,\n cwd: iosDir,\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane submit_appstore_review version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\n","import { select } from '@inquirer/prompts';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { setup } from '../util/setup/setup';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport { spinner, $ } from 'zx';\nimport { resolve, remove, copy, relativePath } from '../util/FileUtil';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { isWin } from '../util/EnvUtil';\nimport { formatJson } from '@mj-studio/js-util';\n\nexport type BuildOptions = {\n platform: 'ios' | 'android';\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n};\n\nexport async function build({ options }: { options: BuildOptions }) {\n Object.assign(OptionHolder.build, options);\n logger.dim(formatJson(OptionHolder.build));\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Build Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.build.platform === 'ios') {\n await buildIos();\n logger.success(`iOS Build ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await buildAndroid();\n logger.success(`Android Build ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n if (!OptionHolder.build.platform) {\n OptionHolder.build.platform = await select({\n message: 'Platform to release',\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n\n // ios\n if (OptionHolder.build.platform === 'ios') {\n OptionHolder.build.pod = await select({\n message: 'Install Cocoapods',\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 // android\n if (OptionHolder.build.platform === 'android') {\n if (!OptionHolder.build.androidOutput) {\n OptionHolder.build.androidOutput = await select({\n message: 'Android Output',\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\nasync function buildIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const $$ = $({\n verbose: false,\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderFileValueMap.ios_match_password,\n },\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n if (OptionHolder.build.pod) {\n await spinner('Pod Install', () => $$`bundle exec pod install`);\n logger.success('Pod Install');\n }\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await spinner(\n 'Fastlane',\n () =>\n $$`bundle exec fastlane build version_name:${OptionHolder.versionName} version_code:${OptionHolder.versionCode}`,\n );\n }\n}\nasync function buildAndroid() {\n const androidDir = resolve(OptionHolder.projectDir, 'android');\n const $$ = $({\n verbose: false,\n cwd: androidDir,\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await spinner('Bundler Install', () => $$`bundle install`);\n logger.success('Bundler Install');\n\n let buildOutputDir: string;\n let outputDir: string;\n\n if (OptionHolder.build.androidOutput === 'aab') {\n // aab: app/build/outputs/bundle/release/app-release.aab\n await spinner(\n 'Bundle AAB',\n () => $$`${isWin ? 'gradle.bat' : './gradlew'} app:bundleRelease`,\n );\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'bundle', 'release');\n outputDir = resolve(OptionHolder.outputOfInitDir, 'output', 'android', 'aab');\n } else {\n // apk: app/build/outputs/apk/release/app-release.apk\n await spinner(\n 'Bundle APK',\n () => $$`${isWin ? 'gradle.bat' : './gradlew'} app:assembleRelease`,\n );\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'apk', 'release');\n outputDir = resolve(OptionHolder.outputOfInitDir, 'output', 'android', 'apk');\n }\n\n remove(outputDir);\n copy(buildOutputDir, outputDir);\n\n logger.success(`artifact generated: ${relativePath(OptionHolder.projectDir, outputDir)}`);\n }\n}\n"],"mappings":"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","names":["join","resolve","path","resolve","chalk","input","join","resolve","resolve","path","chalk","input","join","semver","semver","$","resolve","$","$","spinner","resolve","spinner","$","spinner","$","chalk","promptInputs","chalk","resolve","$","spinner","select","chalk","spinner","$","promptInputs","chalk","select","$","resolve","spinner","select","spinner","$","chalk","promptInputs","chalk","select","resolve","$","spinner"]}
@@ -3,7 +3,7 @@ var package_default = {
3
3
  name: "expo-release-it",
4
4
  module: "src/index.ts",
5
5
  type: "module",
6
- version: "0.0.12",
6
+ version: "0.0.14",
7
7
  license: "MIT",
8
8
  scripts: {
9
9
  build: "tsup",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.12\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun 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 \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\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}\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}\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 type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\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 init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: 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 android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: 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 init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n"],"mappings":";AAAA;AAAA,EACE,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,SAAW;AAAA,IACX,SAAW;AAAA,IACX,KAAO;AAAA,IACP,GAAK;AAAA,EACP;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAU;AAAA,IACV,KAAO;AAAA,IACP,IAAM;AAAA,EACR;AAAA,EACA,iBAAmB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;AC/CA,OAAO,QAAQ;AACf,YAAY,UAAU;AAGf,IAAMA,WAAe;;;ACG5B,SAAS,qBAAqB;AAMvB,IAAM,eA4CT;AAAA,EACF,KAAK;AAAA,IACH,SAAS,gBAAQ;AAAA,IACjB,SAASC,SAAQ,cAAc,YAAY,GAAG,GAAG,OAAO;AAAA,IACxD,aAAaA,SAAQ,cAAc,YAAY,GAAG,GAAG,gBAAgB;AAAA,EACvE;AAAA,EACA,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC;AAAA,EACT,6BAA6B,CAAC;AAAA,EAC9B,uBAAuB,CAAC;AAAA,EACxB,kBAAkB,CAAC,oBAAoB,gBAAgB,KAAK;AAAA,EAC5D,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AACf;","names":["resolve","resolve"]}
1
+ {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.14\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun 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 \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\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}\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}\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 type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\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 init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: 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 android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: 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 init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n"],"mappings":";AAAA;AAAA,EACE,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,SAAW;AAAA,IACX,SAAW;AAAA,IACX,KAAO;AAAA,IACP,GAAK;AAAA,EACP;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAU;AAAA,IACV,KAAO;AAAA,IACP,IAAM;AAAA,EACR;AAAA,EACA,iBAAmB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;AC/CA,OAAO,QAAQ;AACf,YAAY,UAAU;AAGf,IAAMA,WAAe;;;ACG5B,SAAS,qBAAqB;AAMvB,IAAM,eA4CT;AAAA,EACF,KAAK;AAAA,IACH,SAAS,gBAAQ;AAAA,IACjB,SAASC,SAAQ,cAAc,YAAY,GAAG,GAAG,OAAO;AAAA,IACxD,aAAaA,SAAQ,cAAc,YAAY,GAAG,GAAG,gBAAgB;AAAA,EACvE;AAAA,EACA,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC;AAAA,EACT,6BAA6B,CAAC;AAAA,EAC9B,uBAAuB,CAAC;AAAA,EACxB,kBAAkB,CAAC,oBAAoB,gBAAgB,KAAK;AAAA,EAC5D,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AACf;","names":["resolve","resolve"]}
@@ -3,7 +3,7 @@ var package_default = {
3
3
  name: "expo-release-it",
4
4
  module: "src/index.ts",
5
5
  type: "module",
6
- version: "0.0.12",
6
+ version: "0.0.14",
7
7
  license: "MIT",
8
8
  scripts: {
9
9
  build: "tsup",