expo-release-it 0.0.12 → 0.0.13

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.
Files changed (34) hide show
  1. package/build/command/build.d.ts +1 -0
  2. package/build/command/build.js +59 -24
  3. package/build/command/build.js.map +1 -1
  4. package/build/command/bump.js +13 -13
  5. package/build/command/bump.js.map +1 -1
  6. package/build/command/init.js +16 -16
  7. package/build/command/init.js.map +1 -1
  8. package/build/command/submit.js +23 -23
  9. package/build/command/submit.js.map +1 -1
  10. package/build/command/upload.js +23 -23
  11. package/build/command/upload.js.map +1 -1
  12. package/build/index.js +32 -32
  13. package/build/index.js.map +1 -1
  14. package/build/util/FileUtil.d.ts +5 -2
  15. package/build/util/FileUtil.js +6 -2
  16. package/build/util/FileUtil.js.map +1 -1
  17. package/build/util/OptionHolder.d.ts +2 -2
  18. package/build/util/OptionHolder.js +3 -3
  19. package/build/util/OptionHolder.js.map +1 -1
  20. package/build/util/VersionUtil.js +9 -9
  21. package/build/util/VersionUtil.js.map +1 -1
  22. package/build/util/hydrateKeyholderFileValues.js +3 -3
  23. package/build/util/hydrateKeyholderFileValues.js.map +1 -1
  24. package/build/util/iterateAllFilesInGeneratedTemplate.js +4 -4
  25. package/build/util/iterateAllFilesInGeneratedTemplate.js.map +1 -1
  26. package/build/util/setup/prepareAndroid.js +10 -10
  27. package/build/util/setup/prepareAndroid.js.map +1 -1
  28. package/build/util/setup/prepareIos.js +9 -9
  29. package/build/util/setup/prepareIos.js.map +1 -1
  30. package/build/util/setup/promptCommonInputs.js +7 -7
  31. package/build/util/setup/promptCommonInputs.js.map +1 -1
  32. package/build/util/setup/setup.js +10 -10
  33. package/build/util/setup/setup.js.map +1 -1
  34. package/package.json +1 -1
@@ -30,8 +30,8 @@ function write(p, content) {
30
30
  }
31
31
  return fs.writeFileSync(p, content);
32
32
  }
33
- function copy(src, dest) {
34
- fs.copySync(src, dest);
33
+ function copy(src, dest, options) {
34
+ fs.copySync(src, dest, options);
35
35
  }
36
36
  function remove(path3) {
37
37
  if (!exist(path3)) {
@@ -57,7 +57,7 @@ var package_default = {
57
57
  name: "expo-release-it",
58
58
  module: "src/index.ts",
59
59
  type: "module",
60
- version: "0.0.11",
60
+ version: "0.0.12",
61
61
  license: "MIT",
62
62
  scripts: {
63
63
  build: "tsup",
@@ -120,8 +120,8 @@ var OptionHolder = {
120
120
  templateDirNames: ["fastlane-android", "fastlane-ios", "key"],
121
121
  iosBundleIdentifier: "",
122
122
  androidPackageName: "",
123
- rootDir: "",
124
- outDir: "",
123
+ projectDir: "",
124
+ outputOfInitDir: "",
125
125
  keyDir: "",
126
126
  keyholderFilePath: "",
127
127
  versionName: "",
@@ -142,12 +142,12 @@ ${msg.join(", ")}`)),
142
142
 
143
143
  // src/util/setup/prepareAndroid.ts
144
144
  async function prepareAndroid() {
145
- const androidDir = resolve2(OptionHolder.rootDir, "android");
146
- const fastlaneSrcDir = resolve2(OptionHolder.outDir, "fastlane-android");
147
- const fastlaneDestDir = resolve2(OptionHolder.rootDir, "android", "fastlane");
145
+ const androidDir = resolve2(OptionHolder.projectDir, "android");
146
+ const fastlaneSrcDir = resolve2(OptionHolder.outputOfInitDir, "fastlane-android");
147
+ const fastlaneDestDir = resolve2(OptionHolder.projectDir, "android", "fastlane");
148
148
  await spinner(
149
149
  "Prebuild Android",
150
- () => $`cd ${OptionHolder.rootDir} && expo prebuild -p android --no-install`
150
+ () => $`cd ${OptionHolder.projectDir} && expo prebuild -p android --no-install`
151
151
  );
152
152
  remove(fastlaneDestDir);
153
153
  await iterateDir(fastlaneSrcDir, async (file) => {
@@ -169,7 +169,7 @@ async function prepareAndroid() {
169
169
  `
170
170
  signingConfigs {
171
171
  debug {
172
- storeFile file('${path2.relative(buildGradlePath, resolve2(OptionHolder.outDir, "key", "android_release_keystore.jks"))}')
172
+ storeFile file('${path2.relative(buildGradlePath, resolve2(OptionHolder.outputOfInitDir, "key", "android_release_keystore.jks"))}')
173
173
  storePassword '${android_keystore_store_password}'
174
174
  keyAlias '${android_keystore_key_alias}'
175
175
  keyPassword '${android_keystore_key_password}'
@@ -191,7 +191,7 @@ var isWin = process.platform.startsWith("win");
191
191
 
192
192
  // src/util/setup/promptCommonInputs.ts
193
193
  async function promptCommonInputs() {
194
- OptionHolder.rootDir = isDev ? resolve2("example") : resolve2(
194
+ OptionHolder.projectDir = isDev ? resolve2("example") : resolve2(
195
195
  await input({
196
196
  message: "react native project root directory path",
197
197
  default: isDev ? "example" : ".",
@@ -204,9 +204,9 @@ async function promptCommonInputs() {
204
204
  }
205
205
  })
206
206
  );
207
- OptionHolder.outDir = resolve2(OptionHolder.rootDir, "expo-local-build");
208
- OptionHolder.keyDir = resolve2(OptionHolder.outDir, "key");
209
- OptionHolder.keyholderFilePath = resolve2(OptionHolder.outDir, "keyholder.json");
207
+ OptionHolder.outputOfInitDir = resolve2(OptionHolder.projectDir, "expo-local-build");
208
+ OptionHolder.keyDir = resolve2(OptionHolder.outputOfInitDir, "key");
209
+ OptionHolder.keyholderFilePath = resolve2(OptionHolder.outputOfInitDir, "keyholder.json");
210
210
  }
211
211
 
212
212
  // src/util/hydrateKeyholderFileValues.ts
@@ -227,7 +227,7 @@ function throwError(message, e) {
227
227
  // src/util/VersionUtil.ts
228
228
  import semver from "semver";
229
229
  async function parseBinaryVersions() {
230
- const files = readdir(OptionHolder.rootDir);
230
+ const files = readdir(OptionHolder.projectDir);
231
231
  const jsConfigFiles = ["app.config.ts", "app.config.js", "app.config.cjs", "app.config.mjs"];
232
232
  const jsonConfigFile = "app.json";
233
233
  for (const jsConfigFile of jsConfigFiles) {
@@ -242,7 +242,7 @@ async function parseBinaryVersions() {
242
242
  }
243
243
  throwError("expo config file not found");
244
244
  async function parseFromJsConfigFile(filename) {
245
- const filePath = resolve2(OptionHolder.rootDir, filename);
245
+ const filePath = resolve2(OptionHolder.projectDir, filename);
246
246
  const content = read(filePath);
247
247
  const VERSION_NAME = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];
248
248
  const VERSION_CODE = /const VERSION_CODE = (.*?);/.exec(content)?.[1];
@@ -259,7 +259,7 @@ async function parseBinaryVersions() {
259
259
  OptionHolder.versionCode = VERSION_CODE;
260
260
  }
261
261
  async function parseFromJsonConfigFile(filename) {
262
- const filePath = resolve2(OptionHolder.rootDir, filename);
262
+ const filePath = resolve2(OptionHolder.projectDir, filename);
263
263
  const json = readJsonSlow(filePath);
264
264
  const versionName = json.expo?.version + "";
265
265
  const iosVersionCode = json.expo?.ios?.buildNumber + "";
@@ -291,12 +291,12 @@ async function setup() {
291
291
  // src/util/setup/prepareIos.ts
292
292
  import { $ as $2, spinner as spinner2 } from "zx";
293
293
  async function prepareIos() {
294
- const iosDir = resolve2(OptionHolder.rootDir, "ios");
295
- const fastlaneSrcDir = resolve2(OptionHolder.outDir, "fastlane-ios");
296
- const fastlaneDestDir = resolve2(OptionHolder.rootDir, "ios", "fastlane");
294
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
295
+ const fastlaneSrcDir = resolve2(OptionHolder.outputOfInitDir, "fastlane-ios");
296
+ const fastlaneDestDir = resolve2(OptionHolder.projectDir, "ios", "fastlane");
297
297
  await spinner2(
298
298
  "Prebuild iOS",
299
- () => $2`cd ${OptionHolder.rootDir} && expo prebuild -p ios --no-install`
299
+ () => $2`cd ${OptionHolder.projectDir} && expo prebuild -p ios --no-install`
300
300
  );
301
301
  remove(fastlaneDestDir);
302
302
  await iterateDir(fastlaneSrcDir, async (file) => {
@@ -348,7 +348,7 @@ async function promptInputs() {
348
348
  }
349
349
  }
350
350
  async function uploadIos() {
351
- const iosDir = resolve2(OptionHolder.rootDir, "ios");
351
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
352
352
  const $$ = $3({
353
353
  verbose: false,
354
354
  cwd: iosDir,
@@ -370,7 +370,7 @@ async function uploadIos() {
370
370
  async function uploadAndroid() {
371
371
  const $$ = $3({
372
372
  verbose: false,
373
- cwd: resolve2(OptionHolder.rootDir, "android")
373
+ cwd: resolve2(OptionHolder.projectDir, "android")
374
374
  });
375
375
  await prepareAndroid();
376
376
  await fastlane();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/command/upload.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/FileUtil.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/logger.ts","../../src/util/setup/promptCommonInputs.ts","../../src/util/EnvUtil.ts","../../src/util/hydrateKeyholderFileValues.ts","../../src/util/throwError.ts","../../src/util/VersionUtil.ts","../../src/util/setup/setup.ts","../../src/util/setup/prepareIos.ts","../../src/util/calculateElapsed.ts"],"sourcesContent":["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.rootDir, '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.rootDir, '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.rootDir, 'android');\n const fastlaneSrcDir = resolve(OptionHolder.outDir, 'fastlane-android');\n const fastlaneDestDir = resolve(OptionHolder.rootDir, 'android', 'fastlane');\n\n await spinner(\n 'Prebuild Android',\n () => $`cd ${OptionHolder.rootDir} && 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.outDir, '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 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 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) {\n fs.copySync(src, dest);\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","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.11\",\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 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: { version: string; rootDir: string; templateDir: string };\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 rootDir: string;\n outDir: 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 rootDir: '',\n outDir: '',\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 '../OptionHolder';\nimport { input } from '@inquirer/prompts';\nimport { isDev } from '../EnvUtil';\nimport { exist, resolve } from '../FileUtil';\n\nexport async function promptCommonInputs() {\n OptionHolder.rootDir = 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.outDir = resolve(OptionHolder.rootDir, 'expo-local-build');\n OptionHolder.keyDir = resolve(OptionHolder.outDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.outDir, 'keyholder.json');\n}\n","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\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 { 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.rootDir);\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.rootDir, 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.rootDir, 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.rootDir);\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.rootDir, 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.rootDir, 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 { 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 { $, 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.rootDir, 'ios');\n const fastlaneSrcDir = resolve(OptionHolder.outDir, 'fastlane-ios');\n const fastlaneDestDir = resolve(OptionHolder.rootDir, 'ios', 'fastlane');\n\n await spinner(\n 'Prebuild iOS',\n () => $`cd ${OptionHolder.rootDir} && 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"],"mappings":"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","names":["path","resolve","path","path","path","resolve","resolve","path","resolve","resolve","$","spinner","resolve","spinner","$","spinner","$","chalk","chalk","resolve","$","spinner"]}
1
+ {"version":3,"sources":["../../src/command/upload.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/FileUtil.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/logger.ts","../../src/util/setup/promptCommonInputs.ts","../../src/util/EnvUtil.ts","../../src/util/hydrateKeyholderFileValues.ts","../../src/util/throwError.ts","../../src/util/VersionUtil.ts","../../src/util/setup/setup.ts","../../src/util/setup/prepareIos.ts","../../src/util/calculateElapsed.ts"],"sourcesContent":["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 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","{\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 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 '../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","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\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 { 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 { 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 { $, 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"],"mappings":"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","names":["path","resolve","path","path","path","resolve","resolve","path","resolve","resolve","$","spinner","resolve","spinner","$","spinner","$","chalk","chalk","resolve","$","spinner"]}
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.11",
9
+ version: "0.0.12",
10
10
  license: "MIT",
11
11
  scripts: {
12
12
  build: "tsup",
@@ -81,8 +81,8 @@ function write(p, content) {
81
81
  }
82
82
  return fs.writeFileSync(p, content);
83
83
  }
84
- function copy(src, dest) {
85
- fs.copySync(src, dest);
84
+ function copy(src, dest, options) {
85
+ fs.copySync(src, dest, options);
86
86
  }
87
87
  function writeJson(path4, json) {
88
88
  return write(path4, JSON.stringify(json, null, 2));
@@ -124,8 +124,8 @@ var OptionHolder = {
124
124
  templateDirNames: ["fastlane-android", "fastlane-ios", "key"],
125
125
  iosBundleIdentifier: "",
126
126
  androidPackageName: "",
127
- rootDir: "",
128
- outDir: "",
127
+ projectDir: "",
128
+ outputOfInitDir: "",
129
129
  keyDir: "",
130
130
  keyholderFilePath: "",
131
131
  versionName: "",
@@ -151,7 +151,7 @@ import { input as input2 } from "@inquirer/prompts";
151
151
  // src/util/iterateAllFilesInGeneratedTemplate.ts
152
152
  async function iterateAllFilesInGeneratedTemplate(callback) {
153
153
  for (const dir of OptionHolder.templateDirNames) {
154
- await go(join2(OptionHolder.outDir, dir));
154
+ await go(join2(OptionHolder.outputOfInitDir, dir));
155
155
  }
156
156
  async function go(dirPath) {
157
157
  const paths = readdir(dirPath).map((f) => join2(dirPath, f));
@@ -182,7 +182,7 @@ function throwError(message, e) {
182
182
  // src/util/VersionUtil.ts
183
183
  import semver from "semver";
184
184
  async function parseBinaryVersions() {
185
- const files = readdir(OptionHolder.rootDir);
185
+ const files = readdir(OptionHolder.projectDir);
186
186
  const jsConfigFiles = ["app.config.ts", "app.config.js", "app.config.cjs", "app.config.mjs"];
187
187
  const jsonConfigFile = "app.json";
188
188
  for (const jsConfigFile of jsConfigFiles) {
@@ -197,7 +197,7 @@ async function parseBinaryVersions() {
197
197
  }
198
198
  throwError("expo config file not found");
199
199
  async function parseFromJsConfigFile(filename) {
200
- const filePath = resolve2(OptionHolder.rootDir, filename);
200
+ const filePath = resolve2(OptionHolder.projectDir, filename);
201
201
  const content = read(filePath);
202
202
  const VERSION_NAME = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];
203
203
  const VERSION_CODE = /const VERSION_CODE = (.*?);/.exec(content)?.[1];
@@ -214,7 +214,7 @@ async function parseBinaryVersions() {
214
214
  OptionHolder.versionCode = VERSION_CODE;
215
215
  }
216
216
  async function parseFromJsonConfigFile(filename) {
217
- const filePath = resolve2(OptionHolder.rootDir, filename);
217
+ const filePath = resolve2(OptionHolder.projectDir, filename);
218
218
  const json = readJsonSlow(filePath);
219
219
  const versionName = json.expo?.version + "";
220
220
  const iosVersionCode = json.expo?.ios?.buildNumber + "";
@@ -239,7 +239,7 @@ async function injectBinaryVersions({
239
239
  versionCode,
240
240
  versionName
241
241
  }) {
242
- const files = readdir(OptionHolder.rootDir);
242
+ const files = readdir(OptionHolder.projectDir);
243
243
  const jsConfigFiles = ["app.config.ts", "app.config.js", "app.config.cjs", "app.config.mjs"];
244
244
  const jsonConfigFile = "app.json";
245
245
  for (const jsConfigFile of jsConfigFiles) {
@@ -254,7 +254,7 @@ async function injectBinaryVersions({
254
254
  }
255
255
  throwError("expo config file not found");
256
256
  async function injectToJsConfigFile(filename) {
257
- const filePath = resolve2(OptionHolder.rootDir, filename);
257
+ const filePath = resolve2(OptionHolder.projectDir, filename);
258
258
  let content = read(filePath);
259
259
  content = content.replace(
260
260
  /const VERSION_NAME = '(.*?)';/,
@@ -267,7 +267,7 @@ async function injectBinaryVersions({
267
267
  write(filePath, content);
268
268
  }
269
269
  async function injectToJsonConfigFile(filename) {
270
- const filePath = resolve2(OptionHolder.rootDir, filename);
270
+ const filePath = resolve2(OptionHolder.projectDir, filename);
271
271
  const json = readJsonSlow(filePath);
272
272
  json.expo.version = versionName;
273
273
  json.expo.ios.buildNumber = versionCode;
@@ -279,7 +279,7 @@ async function injectBinaryVersions({
279
279
  // src/util/setup/promptCommonInputs.ts
280
280
  import { input } from "@inquirer/prompts";
281
281
  async function promptCommonInputs() {
282
- OptionHolder.rootDir = isDev ? resolve2("example") : resolve2(
282
+ OptionHolder.projectDir = isDev ? resolve2("example") : resolve2(
283
283
  await input({
284
284
  message: "react native project root directory path",
285
285
  default: isDev ? "example" : ".",
@@ -292,9 +292,9 @@ async function promptCommonInputs() {
292
292
  }
293
293
  })
294
294
  );
295
- OptionHolder.outDir = resolve2(OptionHolder.rootDir, "expo-local-build");
296
- OptionHolder.keyDir = resolve2(OptionHolder.outDir, "key");
297
- OptionHolder.keyholderFilePath = resolve2(OptionHolder.outDir, "keyholder.json");
295
+ OptionHolder.outputOfInitDir = resolve2(OptionHolder.projectDir, "expo-local-build");
296
+ OptionHolder.keyDir = resolve2(OptionHolder.outputOfInitDir, "key");
297
+ OptionHolder.keyholderFilePath = resolve2(OptionHolder.outputOfInitDir, "keyholder.json");
298
298
  }
299
299
 
300
300
  // src/command/init.ts
@@ -367,11 +367,11 @@ async function copyTemplates() {
367
367
  }
368
368
  async function copyDirRecursively(dir) {
369
369
  const sourceDirPath = join2(OptionHolder.cli.templateDir, dir);
370
- const destDirPath = join2(OptionHolder.outDir, dir);
371
- if (exist(destDirPath)) {
370
+ const destDirPath = join2(OptionHolder.outputOfInitDir, dir);
371
+ if (exist(destDirPath) && dir !== "key") {
372
372
  remove(destDirPath);
373
373
  }
374
- copy(sourceDirPath, destDirPath);
374
+ copy(sourceDirPath, destDirPath, { overwrite: dir !== "key" });
375
375
  }
376
376
  }
377
377
  async function injectPlaceHolders() {
@@ -439,12 +439,12 @@ import { select } from "@inquirer/prompts";
439
439
  // src/util/setup/prepareAndroid.ts
440
440
  import { spinner, $ as $2, path as path3 } from "zx";
441
441
  async function prepareAndroid() {
442
- const androidDir = resolve2(OptionHolder.rootDir, "android");
443
- const fastlaneSrcDir = resolve2(OptionHolder.outDir, "fastlane-android");
444
- const fastlaneDestDir = resolve2(OptionHolder.rootDir, "android", "fastlane");
442
+ const androidDir = resolve2(OptionHolder.projectDir, "android");
443
+ const fastlaneSrcDir = resolve2(OptionHolder.outputOfInitDir, "fastlane-android");
444
+ const fastlaneDestDir = resolve2(OptionHolder.projectDir, "android", "fastlane");
445
445
  await spinner(
446
446
  "Prebuild Android",
447
- () => $2`cd ${OptionHolder.rootDir} && expo prebuild -p android --no-install`
447
+ () => $2`cd ${OptionHolder.projectDir} && expo prebuild -p android --no-install`
448
448
  );
449
449
  remove(fastlaneDestDir);
450
450
  await iterateDir(fastlaneSrcDir, async (file) => {
@@ -466,7 +466,7 @@ async function prepareAndroid() {
466
466
  `
467
467
  signingConfigs {
468
468
  debug {
469
- storeFile file('${path3.relative(buildGradlePath, resolve2(OptionHolder.outDir, "key", "android_release_keystore.jks"))}')
469
+ storeFile file('${path3.relative(buildGradlePath, resolve2(OptionHolder.outputOfInitDir, "key", "android_release_keystore.jks"))}')
470
470
  storePassword '${android_keystore_store_password}'
471
471
  keyAlias '${android_keystore_key_alias}'
472
472
  keyPassword '${android_keystore_key_password}'
@@ -482,12 +482,12 @@ async function prepareAndroid() {
482
482
  // src/util/setup/prepareIos.ts
483
483
  import { $ as $3, spinner as spinner2 } from "zx";
484
484
  async function prepareIos() {
485
- const iosDir = resolve2(OptionHolder.rootDir, "ios");
486
- const fastlaneSrcDir = resolve2(OptionHolder.outDir, "fastlane-ios");
487
- const fastlaneDestDir = resolve2(OptionHolder.rootDir, "ios", "fastlane");
485
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
486
+ const fastlaneSrcDir = resolve2(OptionHolder.outputOfInitDir, "fastlane-ios");
487
+ const fastlaneDestDir = resolve2(OptionHolder.projectDir, "ios", "fastlane");
488
488
  await spinner2(
489
489
  "Prebuild iOS",
490
- () => $3`cd ${OptionHolder.rootDir} && expo prebuild -p ios --no-install`
490
+ () => $3`cd ${OptionHolder.projectDir} && expo prebuild -p ios --no-install`
491
491
  );
492
492
  remove(fastlaneDestDir);
493
493
  await iterateDir(fastlaneSrcDir, async (file) => {
@@ -539,7 +539,7 @@ async function promptInputs2() {
539
539
  }
540
540
  }
541
541
  async function uploadIos() {
542
- const iosDir = resolve2(OptionHolder.rootDir, "ios");
542
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
543
543
  const $$ = $4({
544
544
  verbose: false,
545
545
  cwd: iosDir,
@@ -561,7 +561,7 @@ async function uploadIos() {
561
561
  async function uploadAndroid() {
562
562
  const $$ = $4({
563
563
  verbose: false,
564
- cwd: resolve2(OptionHolder.rootDir, "android")
564
+ cwd: resolve2(OptionHolder.projectDir, "android")
565
565
  });
566
566
  await prepareAndroid();
567
567
  await fastlane();
@@ -608,7 +608,7 @@ async function promptInputs3() {
608
608
  async function submitAndroid() {
609
609
  const $$ = $5({
610
610
  verbose: false,
611
- cwd: resolve2(OptionHolder.rootDir, "android")
611
+ cwd: resolve2(OptionHolder.projectDir, "android")
612
612
  });
613
613
  await prepareAndroid();
614
614
  await fastlane();
@@ -622,7 +622,7 @@ async function submitAndroid() {
622
622
  }
623
623
  }
624
624
  async function submitIos() {
625
- const iosDir = resolve2(OptionHolder.rootDir, "ios");
625
+ const iosDir = resolve2(OptionHolder.projectDir, "ios");
626
626
  const $$ = $5({
627
627
  verbose: false,
628
628
  cwd: iosDir