expo-release-it 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +15 -8
  2. package/build/command/build.js +70 -38
  3. package/build/command/build.js.map +1 -1
  4. package/build/command/bump.js +90 -19
  5. package/build/command/bump.js.map +1 -1
  6. package/build/command/init.js +64 -17
  7. package/build/command/init.js.map +1 -1
  8. package/build/command/pull.js +64 -32
  9. package/build/command/pull.js.map +1 -1
  10. package/build/command/submit.js +70 -38
  11. package/build/command/submit.js.map +1 -1
  12. package/build/command/upload.js +70 -38
  13. package/build/command/upload.js.map +1 -1
  14. package/build/index.js +102 -42
  15. package/build/index.js.map +1 -1
  16. package/build/type/ExpoReleaseItConfiguration.d.d.ts +46 -0
  17. package/build/type/ExpoReleaseItConfiguration.d.js +1 -0
  18. package/build/type/ExpoReleaseItConfiguration.d.js.map +1 -0
  19. package/build/util/EnvUtil.d.ts +2 -1
  20. package/build/util/EnvUtil.js +2 -0
  21. package/build/util/EnvUtil.js.map +1 -1
  22. package/build/util/FastlaneOption.js +13 -14
  23. package/build/util/FastlaneOption.js.map +1 -1
  24. package/build/util/MetadataSyncUtil.js +13 -14
  25. package/build/util/MetadataSyncUtil.js.map +1 -1
  26. package/build/util/OptionHolder.d.ts +2 -1
  27. package/build/util/OptionHolder.js +13 -14
  28. package/build/util/OptionHolder.js.map +1 -1
  29. package/build/util/generateAppStoreConnectApiKeyFile.js +13 -14
  30. package/build/util/generateAppStoreConnectApiKeyFile.js.map +1 -1
  31. package/build/util/injectTemplatePlaceHolders.js +13 -14
  32. package/build/util/injectTemplatePlaceHolders.js.map +1 -1
  33. package/build/util/input/InqueryInputs.d.ts +0 -1
  34. package/build/util/input/InqueryInputs.js +13 -29
  35. package/build/util/input/InqueryInputs.js.map +1 -1
  36. package/build/util/parseConfigFile.d.ts +3 -0
  37. package/build/util/parseConfigFile.js +136 -0
  38. package/build/util/parseConfigFile.js.map +1 -0
  39. package/build/util/setup/VersionUtil.d.ts +3 -1
  40. package/build/util/setup/VersionUtil.js +38 -14
  41. package/build/util/setup/VersionUtil.js.map +1 -1
  42. package/build/util/setup/hydrateKeyholderFileValues.js +13 -14
  43. package/build/util/setup/hydrateKeyholderFileValues.js.map +1 -1
  44. package/build/util/setup/prepareAndroid.js +13 -14
  45. package/build/util/setup/prepareAndroid.js.map +1 -1
  46. package/build/util/setup/prepareIos.js +13 -14
  47. package/build/util/setup/prepareIos.js.map +1 -1
  48. package/build/util/setup/setup.js +65 -17
  49. package/build/util/setup/setup.js.map +1 -1
  50. package/build/util/throwError.js +8 -0
  51. package/build/util/throwError.js.map +1 -1
  52. package/expo-release-it.schema.json +57 -0
  53. package/package.json +13 -14
package/README.md CHANGED
@@ -21,16 +21,16 @@ Opinionated Expo CICD workflow CLI for building & uploading & submitting Expo pr
21
21
  <details>
22
22
  <summary>Full Details</summary>
23
23
 
24
- Expo EAS is convenient, but it requires additional configuration files, console setup, and a conceptual understanding of Over-The-Air (OTA) updates. Also, builds must be performed on EAS Cloud, which is not free and can be slow.
24
+ Expo EAS is convenient, but it requires additional configuration files, console setup, and a conceptual understanding of Over-The-Air (OTA) updates.
25
+ Also, builds must be performed on EAS Cloud, which is not free and can be slow.
25
26
 
26
27
  While EAS is useful for larger teams, if you are developing alone or with just a few people and question the need for such a process, `expo-release-it` is the answer.
27
28
 
28
- Based on years of experience developing with React Native, I encourage a more traditional approach: build APK, AAB, and IPA files locally, upload them to each platform’s store testing track, and request reviews—without worrying about binary versions, OTA update versions, or branch management.
29
+ Based on years of experience developing with React Native, I encourage a more traditional approach: build APK, AAB, and IPA files locally,
30
+ upload them to each platform’s store testing track, and request reviews—without worrying about binary versions, OTA update versions, or branch management.
29
31
 
30
32
  This approach is much faster, simpler, and, most importantly, allows you to take full advantage of your computer’s fast CPU.
31
33
 
32
- OTA updates are a powerful tool in React Native, but to fully take advantage of them, you need a self-hosted CDN server, a version management console both in the cloud and inside the app, and you have to separately manage binary versions and bundle versions—all of which introduce significant complexity and semantic overhead that often outweigh the benefits of implementing OTA updates. Furthermore, due to a general lack of deep understanding about OTA updates, issues like native library version mismatches can occur frequently, so OTA updates are excluded by default.
33
-
34
34
  I’m also a big fan of OTA updates, and I’ve enjoyed a lot of efficiency when working in larger teams, but it always required setting up many supporting systems in advance.
35
35
 
36
36
  `expo-release-it` is a CLI tool that encapsulates the know-how I have gained over years of automating build and review processes.
@@ -59,7 +59,10 @@ If not, set up your environment so that `ruby` and `bundler` are available by fo
59
59
  `init` command generates sample key files structure in `expo-release-it/key`. They are **noob files** and you must replace file contents.
60
60
 
61
61
  > [!IMPORTANT]
62
- **You must prepare all required key files in `expo-release-it/key` exactly the same filenames.**
62
+ > **You must prepare all required key files in `expo-release-it/key` exactly the same filenames.**
63
+
64
+ > [!TIP]
65
+ > You can add the following files in `.gitignore` if you aren't sure about security issues. Treat them as `.env` and share it to your teammates.
63
66
 
64
67
  ### `android_play_console_service_account.json`
65
68
 
@@ -148,9 +151,11 @@ export default ({ config }: ConfigContext): ExpoConfig => {
148
151
  expo-release-it/.temp
149
152
  android/vendor/bundle
150
153
  ios/vendor/bundle
151
- !*.jks
152
- !*.p8
153
- !*.keystore
154
+ # if you excluded android, ios for using CNG
155
+ !expo-release-it/metadata/*
156
+ # if you aren't sure about security issues, feel free to exclude these files from the VCS.
157
+ !expo-release-it/key/*.p8
158
+ !expo-release-it/key/*.keystore
154
159
  ```
155
160
 
156
161
  ## 6. Run `expo-release-it init`
@@ -242,6 +247,8 @@ npx expo-release-it submit
242
247
  That’s right. You might be wondering whether storing files like .p8, keystore files, or key values in version control is truly secure.
243
248
  In conclusion, if you’re using a private repository, you can consider it to be somewhat safe.
244
249
 
250
+ Whereas, you can exclude those key files from the VCS and share it to your teamates.
251
+
245
252
  For example, Fastlane Match also uses OpenSSL encryption, but it still stores certificates and profiles in a private Git repository.
246
253
 
247
254
  While you could implement additional security policies, I haven’t taken any extra measures for now.
@@ -58,17 +58,16 @@ var package_default = {
58
58
  name: "expo-release-it",
59
59
  module: "src/index.ts",
60
60
  type: "module",
61
- version: "0.3.1",
61
+ version: "0.3.2",
62
62
  license: "MIT",
63
63
  homepage: "https://github.com/mym0404/expo-release-it",
64
64
  repository: "https://github.com/mym0404/expo-release-it",
65
65
  scripts: {
66
- build: "tsup",
67
- dev: "yarn run build && NODE_ENV=development node bin/expo-release-it.mjs",
68
- release: "yarn build && release-it",
69
- android: "expo run:android",
70
- ios: "expo run:ios",
71
- t: "tsc --noEmit -p ."
66
+ build: "pnpm build:json-schema-type && tsup",
67
+ "build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
68
+ dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
69
+ release: "pnpm build && pnpm run t && release-it",
70
+ t: "lefthook run check"
72
71
  },
73
72
  dependencies: {
74
73
  "@inquirer/prompts": "^7.4.1",
@@ -88,29 +87,29 @@ var package_default = {
88
87
  "@release-it/conventional-changelog": "^10.0.1",
89
88
  "@types/fs-extra": "^11.0.4",
90
89
  "@types/semver": "^7.7.0",
90
+ "json-schema-to-typescript": "^15.0.4",
91
91
  lefthook: "^1.11.11",
92
92
  prettier: "3.5.3",
93
93
  "release-it": "^19.0.1",
94
94
  "tiny-glob": "^0.2.9",
95
95
  tsup: "^8.4.0",
96
- typescript: "^5.8.3"
96
+ typescript: "^5.8.3",
97
+ vitest: "^3.1.2"
97
98
  },
98
- workspaces: [
99
- "example"
100
- ],
101
99
  bin: "./bin/expo-release-it.mjs",
102
100
  files: [
103
101
  "build",
104
102
  "package.json",
105
103
  "bin",
106
- "template"
104
+ "template",
105
+ "expo-release-it.schema.json"
107
106
  ],
108
- packageManager: "yarn@4.9.1",
109
107
  commitlint: {
110
108
  extends: [
111
109
  "@commitlint/config-conventional"
112
110
  ]
113
- }
111
+ },
112
+ packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
114
113
  };
115
114
 
116
115
  // src/util/OptionHolder.ts
@@ -319,6 +318,11 @@ async function hydrateKeyholderFileValues() {
319
318
  }
320
319
  }
321
320
 
321
+ // src/util/EnvUtil.ts
322
+ var isDev = process.env.NODE_ENV === "development";
323
+ var isWin = process.platform.startsWith("win");
324
+ var isTest = process.env.NODE_ENV === "test";
325
+
322
326
  // src/util/throwError.ts
323
327
  function throwError(message, e) {
324
328
  if (e) {
@@ -326,11 +330,15 @@ function throwError(message, e) {
326
330
  } else {
327
331
  logger.error(message);
328
332
  }
333
+ if (isTest) {
334
+ throw new Error("throwError");
335
+ }
329
336
  process.exit(1);
330
337
  }
331
338
 
332
339
  // src/util/setup/VersionUtil.ts
333
340
  import semver from "semver";
341
+ import { padZero } from "@mj-studio/js-util";
334
342
  var versionNameRegex = () => /const\s+VERSION_NAME\s*?=\s*?['"]([\d\.]*?)['"]\s*?;?/;
335
343
  var versionCodeRegex = () => /const\s+VERSION_CODE\s*?=\s*?(\d+)\s*?;?/;
336
344
  async function parseBinaryVersions() {
@@ -388,13 +396,52 @@ async function parseBinaryVersions() {
388
396
  }
389
397
  }
390
398
 
391
- // src/util/EnvUtil.ts
392
- var isDev = process.env.NODE_ENV === "development";
393
- var isWin = process.platform.startsWith("win");
399
+ // src/util/parseConfigFile.ts
400
+ import { is } from "@mj-studio/js-util";
401
+ async function parseConfigFile() {
402
+ const candidates = [
403
+ join2(OptionHolder.resourcesDir, "expo-release-it.config.json"),
404
+ join2(OptionHolder.projectDir, "expo-release-it.config.json")
405
+ ];
406
+ if (OptionHolder.input.config) {
407
+ candidates.unshift(OptionHolder.input.config);
408
+ }
409
+ const validConfigFilePath = candidates.find(
410
+ (candidate) => exist(candidate) && is.object(readJsonSlow(candidate))
411
+ );
412
+ if (!validConfigFilePath) return;
413
+ const config = readJsonSlow(validConfigFilePath);
414
+ assignIfValueIsValidAndNotSetAlready(
415
+ OptionHolder.input,
416
+ "semverIncrement",
417
+ config.bump?.increment
418
+ );
419
+ assignIfValueIsValidAndNotSetAlready(
420
+ OptionHolder.input,
421
+ "androidOutput",
422
+ config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput
423
+ );
424
+ assignIfValueIsValidAndNotSetAlready(
425
+ OptionHolder.input,
426
+ "uploadMetadata",
427
+ config.upload?.uploadMetadata ?? config.submit?.uploadMetadata
428
+ );
429
+ assignIfValueIsValidAndNotSetAlready(
430
+ OptionHolder.input,
431
+ "uploadScreenshot",
432
+ config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot
433
+ );
434
+ }
435
+ function assignIfValueIsValidAndNotSetAlready(object, key, value) {
436
+ if (!object[key] && value) {
437
+ object[key] = value;
438
+ }
439
+ }
394
440
 
395
441
  // src/util/setup/setup.ts
396
442
  async function setup() {
397
443
  await setupBasicOptions();
444
+ await parseConfigFile();
398
445
  await hydrateKeyholderFileValues();
399
446
  await parseBinaryVersions();
400
447
  }
@@ -435,17 +482,17 @@ async function prepareIos() {
435
482
  import chalk5 from "chalk";
436
483
 
437
484
  // src/util/calculateElapsed.ts
438
- import { padZero } from "@mj-studio/js-util";
485
+ import { padZero as padZero2 } from "@mj-studio/js-util";
439
486
  function calculateElapsed(t) {
440
487
  let seconds = Math.floor((Date.now() - t) / 1e3);
441
488
  const minutes = Math.floor(seconds / 60);
442
489
  seconds = seconds % 60;
443
- return `${minutes}:${padZero(seconds)}`;
490
+ return `${minutes}:${padZero2(seconds)}`;
444
491
  }
445
492
 
446
493
  // src/util/input/InqueryInputs.ts
447
494
  import { select } from "@inquirer/prompts";
448
- import { is } from "@mj-studio/js-util";
495
+ import { is as is2 } from "@mj-studio/js-util";
449
496
  import chalk4 from "chalk";
450
497
  var InqueryInputs = {
451
498
  platform: async () => {
@@ -462,21 +509,6 @@ var InqueryInputs = {
462
509
  });
463
510
  }
464
511
  },
465
- platformAll: async () => {
466
- if (!OptionHolder.input.platformAll) {
467
- OptionHolder.input.platformAll = await select({
468
- message: constructInquirerFormattedMessage({
469
- name: "Platform",
470
- explanation: `Platforms to run action`
471
- }),
472
- choices: [
473
- { name: "all", value: "all", description: "Both" },
474
- { name: "ios", value: "ios", description: "Release ios" },
475
- { name: "android", value: "android", description: "Release android" }
476
- ]
477
- });
478
- }
479
- },
480
512
  podinstall: async () => {
481
513
  if (OptionHolder.input.platform === "ios") {
482
514
  OptionHolder.input.pod = await select({
@@ -506,7 +538,7 @@ var InqueryInputs = {
506
538
  }
507
539
  },
508
540
  uploadMetadata: async () => {
509
- if (!is.boolean(OptionHolder.input.uploadMetadata)) {
541
+ if (!is2.boolean(OptionHolder.input.uploadMetadata)) {
510
542
  OptionHolder.input.uploadMetadata = await select({
511
543
  message: constructInquirerFormattedMessage({
512
544
  name: "Upload Text Metadata(title, description, ...)"
@@ -519,7 +551,7 @@ var InqueryInputs = {
519
551
  }
520
552
  },
521
553
  uploadScreenshot: async () => {
522
- if (!is.boolean(OptionHolder.input.uploadScreenshot)) {
554
+ if (!is2.boolean(OptionHolder.input.uploadScreenshot)) {
523
555
  OptionHolder.input.uploadScreenshot = await select({
524
556
  message: constructInquirerFormattedMessage({
525
557
  name: "Upload Screenshots & Images"
@@ -532,7 +564,7 @@ var InqueryInputs = {
532
564
  }
533
565
  },
534
566
  useLiveVersionIos: async () => {
535
- if (!is.boolean(OptionHolder.input.useLiveVersionIos) && OptionHolder.input.platform === "ios") {
567
+ if (!is2.boolean(OptionHolder.input.useLiveVersionIos) && OptionHolder.input.platform === "ios") {
536
568
  OptionHolder.input.useLiveVersionIos = await select({
537
569
  message: constructInquirerFormattedMessage({
538
570
  name: "Download metadatas from live version rather than draft"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/FileUtil.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/setup/execShellScript.ts","../../src/util/logger.ts","../../src/util/MetadataSyncUtil.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/EnvUtil.ts","../../src/util/setup/setup.ts","../../src/util/setup/prepareIos.ts","../../src/command/build.ts","../../src/util/calculateElapsed.ts","../../src/util/input/InqueryInputs.ts","../../src/util/FastlaneOption.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.3.1\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/mym0404/expo-release-it\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"yarn run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"ora\": \"^8.2.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"lefthook\": \"^1.11.11\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\",\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n platformAll: 'android' | 'ios' | 'all';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n ios_match_password: string;\n\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n android_package_name: string;\n };\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {} as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { join, relativePath, copy, exist } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport { logger } from './logger';\nimport chalk from 'chalk';\n\nexport function copyIosMetadata(to: 'resources' | 'native') {\n const iosDir = join(OptionHolder.projectDir, 'ios');\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n if (exist(metadataNativeDir) && exist(screenshotsNativeDir)) {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(metadataResourcesDir) && exist(screenshotsResourcesDir)) {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n\nexport function copyAndroidMetadata(to: 'resouces' | 'native') {\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resouces') {\n if (exist(nativeDir)) {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(resourcesDir)) {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyAndroidMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyAndroidMetadata('native');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.resourcesDir, 'key', 'android_release.keystore'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","import { logger } from './logger';\n\nexport function throwError(message: string, e?: any): never {\n if (e) {\n logger.error(message, e);\n } else {\n logger.error(message);\n }\n process.exit(1);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { throwError } from '../throwError';\nimport semver from 'semver';\nimport { readdir, read, readJsonSlow, write, writeJson, resolve } from '../FileUtil';\n\nconst versionNameRegex = () => /const\\s+VERSION_NAME\\s*?=\\s*?['\"]([\\d\\.]*?)['\"]\\s*?;?/;\nconst versionCodeRegex = () => /const\\s+VERSION_CODE\\s*?=\\s*?(\\d+)\\s*?;?/;\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = versionNameRegex().exec(content)?.[1];\n const VERSION_CODE = versionCodeRegex().exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = json.expo?.version + '';\n const iosVersionCode = json.expo?.ios?.buildNumber + '';\n const androidVersionCode = json.expo?.android?.versionCode + '';\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(versionNameRegex(), `const VERSION_NAME = '${versionName}';`);\n content = content.replace(versionCodeRegex(), `const VERSION_CODE = ${versionCode};`);\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\n\nexport async function setup() {\n await setupBasicOptions();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.resourcesDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.resourcesDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.resourcesDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.resourcesDir, '.temp');\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyIosMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyIosMetadata('native');\n}\n","import { 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 { resolve, remove, copy, relativePath } from '../util/FileUtil';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { isWin } from '../util/EnvUtil';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { getIosFastlaneOptions } from '../util/FastlaneOption';\nimport { exe } from '../util/setup/execShellScript';\n\nexport async function build({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Build Started');\n\n if (OptionHolder.input.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 await InqueryInputs.platform();\n await InqueryInputs.podinstall();\n await InqueryInputs.androidBuildOutput();\n}\n\nasync function buildIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const exeEnv = exe({\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderMap.ios_match_password,\n },\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n if (OptionHolder.input.pod) {\n await exeEnv('bundle', ['exec', 'pod', 'install']);\n logger.done('Pod Install');\n }\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await exeEnv('bundle', ['exec', 'fastlane', 'build', ...getIosFastlaneOptions()]);\n\n logger.success(\n `artifact generated: ${relativePath(OptionHolder.projectDir, resolve(OptionHolder.resourcesDir, 'output', 'ios', 'app.ipa'))}`,\n );\n }\n}\nasync function buildAndroid() {\n const androidDir = resolve(OptionHolder.projectDir, 'android');\n const exeEnv = exe({\n cwd: androidDir,\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n let buildOutputDir: string;\n let outputDir: string;\n\n if (OptionHolder.input.androidOutput === 'aab') {\n // aab: app/build/outputs/bundle/release/app-release.aab\n await exeEnv(isWin ? 'gradle.bat' : './gradlew', ['app:bundleRelease']);\n logger.done('Bundle AAB');\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'bundle', 'release');\n outputDir = resolve(OptionHolder.resourcesDir, 'output', 'android', 'aab');\n } else {\n // apk: app/build/outputs/apk/release/app-release.apk\n await exeEnv(isWin ? 'gradle.bat' : './gradlew', ['app:assembleRelease']);\n logger.done('Assemble APK');\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'apk', 'release');\n outputDir = resolve(OptionHolder.resourcesDir, '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","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 { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n platformAll: async () => {\n if (!OptionHolder.input.platformAll) {\n OptionHolder.input.platformAll = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platforms to run action`,\n }),\n choices: [\n { name: 'all', value: 'all', description: 'Both' },\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve } from './FileUtil';\n\nexport function getAndroidFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `json_key:${resolve(OptionHolder.keyDir, 'android_play_console_service_account.json')}`,\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `upload_screenshot:${OptionHolder.input.uploadScreenshot}`,\n `aab_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'aab', 'app-release.aab')}`,\n `apk_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'apk', 'app-release.apk')}`,\n `skip_upload_apk:${OptionHolder.input.androidOutput !== 'apk'}`,\n `skip_upload_aab:${OptionHolder.input.androidOutput !== 'aab'}`,\n ];\n}\n\nexport function getIosFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `api_key_filepath:${resolve(OptionHolder.keyDir, 'ios_app_store_connect_api_key.p8')}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `upload_screenshot:${OptionHolder.input.uploadScreenshot}`,\n `ipa_path:${resolve(OptionHolder.resourcesDir, 'output', 'ios', 'app.ipa')}`,\n `ipa_dir:${resolve(OptionHolder.resourcesDir, 'output', 'ios')}`,\n `ipa_name:app.ipa`,\n ];\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","join","chalk","chalk","join","resolve","resolve","resolve","resolve","chalk","chalk","resolve","chalk","resolve"]}
1
+ {"version":3,"sources":["../../src/util/FileUtil.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/setup/execShellScript.ts","../../src/util/logger.ts","../../src/util/MetadataSyncUtil.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/EnvUtil.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/parseConfigFile.ts","../../src/util/setup/setup.ts","../../src/util/setup/prepareIos.ts","../../src/command/build.ts","../../src/util/calculateElapsed.ts","../../src/util/input/InqueryInputs.ts","../../src/util/FastlaneOption.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.3.2\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/mym0404/expo-release-it\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"scripts\": {\n \"build\": \"pnpm build:json-schema-type && tsup\",\n \"build:json-schema-type\": \"json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts\",\n \"dev\": \"pnpm build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"pnpm build && pnpm run t && release-it\",\n \"t\": \"lefthook run check\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"ora\": \"^8.2.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"lefthook\": \"^1.11.11\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.1.2\"\n },\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\",\n \"expo-release-it.schema.json\"\n ],\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n },\n \"packageManager\": \"pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39\"\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n ios_match_password: string;\n\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n android_package_name: string;\n };\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {} as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { join, relativePath, copy, exist } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport { logger } from './logger';\nimport chalk from 'chalk';\n\nexport function copyIosMetadata(to: 'resources' | 'native') {\n const iosDir = join(OptionHolder.projectDir, 'ios');\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n if (exist(metadataNativeDir) && exist(screenshotsNativeDir)) {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(metadataResourcesDir) && exist(screenshotsResourcesDir)) {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n\nexport function copyAndroidMetadata(to: 'resouces' | 'native') {\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resouces') {\n if (exist(nativeDir)) {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(resourcesDir)) {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyAndroidMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyAndroidMetadata('native');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.resourcesDir, 'key', 'android_release.keystore'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\nexport const isTest = process.env.NODE_ENV === 'test';\n","import { logger } from './logger';\nimport { isTest } from './EnvUtil';\n\nexport function throwError(message: string, e?: any): never {\n if (e) {\n logger.error(message, e);\n } else {\n logger.error(message);\n }\n if (isTest) {\n throw new Error('throwError');\n }\n process.exit(1);\n}\n","import { OptionHolder } from '../OptionHolder';\nimport { throwError } from '../throwError';\nimport semver from 'semver';\nimport { readdir, read, readJsonSlow, write, writeJson, resolve } from '../FileUtil';\nimport { padZero } from '@mj-studio/js-util';\n\nconst versionNameRegex = () => /const\\s+VERSION_NAME\\s*?=\\s*?['\"]([\\d\\.]*?)['\"]\\s*?;?/;\nconst versionCodeRegex = () => /const\\s+VERSION_CODE\\s*?=\\s*?(\\d+)\\s*?;?/;\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = versionNameRegex().exec(content)?.[1];\n const VERSION_CODE = versionCodeRegex().exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = json.expo?.version + '';\n const iosVersionCode = json.expo?.ios?.buildNumber + '';\n const androidVersionCode = json.expo?.android?.versionCode + '';\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(versionNameRegex(), `const VERSION_NAME = '${versionName}';`);\n content = content.replace(versionCodeRegex(), `const VERSION_CODE = ${versionCode};`);\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n\nexport function checkVersionCodeIsTiedWithVersionName(\n versionName: string,\n versionCode: string,\n): boolean {\n if (!semver.valid(versionName)) return false;\n return generateVersionCodeTiedWithVersionName(versionName) === versionCode;\n}\n\nexport function generateVersionCodeTiedWithVersionName(versionName: string) {\n if (!semver.valid(versionName))\n throwError(\n 'Version Name is not a valid semver format when running `generateVersionCodeTiedWithVersionName`',\n );\n const major = semver.major(versionName);\n const minor = semver.minor(versionName);\n const patch = semver.patch(versionName);\n\n return `${major}${padZero(minor, 3)}${padZero(patch, 3)}`;\n}\n","import type { ExpoReleaseItConfiguration } from '../type/ExpoReleaseItConfiguration';\nimport { OptionHolder } from './OptionHolder';\nimport { join, exist, readJsonSlow } from './FileUtil';\nimport { is } from '@mj-studio/js-util';\n\nexport async function parseConfigFile() {\n const candidates = [\n join(OptionHolder.resourcesDir, 'expo-release-it.config.json'),\n join(OptionHolder.projectDir, 'expo-release-it.config.json'),\n ];\n if (OptionHolder.input.config) {\n candidates.unshift(OptionHolder.input.config);\n }\n\n const validConfigFilePath = candidates.find(\n (candidate) => exist(candidate) && is.object(readJsonSlow(candidate)),\n );\n\n if (!validConfigFilePath) return;\n\n const config = readJsonSlow(validConfigFilePath) as ExpoReleaseItConfiguration;\n\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'semverIncrement',\n config.bump?.increment,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'androidOutput',\n config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'uploadMetadata',\n config.upload?.uploadMetadata ?? config.submit?.uploadMetadata,\n );\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input,\n 'uploadScreenshot',\n config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot,\n );\n}\n\n// make sure config file options doesn't overwrite passed options from cli directly.\nfunction assignIfValueIsValidAndNotSetAlready<R, T extends Record<K, R>, K extends keyof T>(\n object: T,\n key: K,\n value?: NonNullable<R>,\n) {\n if (!object[key] && value) {\n object[key] = value as any;\n }\n}\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\nimport { parseConfigFile } from '../parseConfigFile';\n\nexport async function setup() {\n await setupBasicOptions();\n await parseConfigFile();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.resourcesDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.resourcesDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.resourcesDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.resourcesDir, '.temp');\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyIosMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe('bundle', ['install'], { cwd: destDir });\n logger.success('Bunder Install - Done');\n\n copyIosMetadata('native');\n}\n","import { 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 { resolve, remove, copy, relativePath } from '../util/FileUtil';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { isWin } from '../util/EnvUtil';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { getIosFastlaneOptions } from '../util/FastlaneOption';\nimport { exe } from '../util/setup/execShellScript';\n\nexport async function build({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Build Started');\n\n if (OptionHolder.input.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 await InqueryInputs.platform();\n await InqueryInputs.podinstall();\n await InqueryInputs.androidBuildOutput();\n}\n\nasync function buildIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n const exeEnv = exe({\n cwd: iosDir,\n env: {\n MATCH_PASSWORD: OptionHolder.keyholderMap.ios_match_password,\n },\n });\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n if (OptionHolder.input.pod) {\n await exeEnv('bundle', ['exec', 'pod', 'install']);\n logger.done('Pod Install');\n }\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await exeEnv('bundle', ['exec', 'fastlane', 'build', ...getIosFastlaneOptions()]);\n\n logger.success(\n `artifact generated: ${relativePath(OptionHolder.projectDir, resolve(OptionHolder.resourcesDir, 'output', 'ios', 'app.ipa'))}`,\n );\n }\n}\nasync function buildAndroid() {\n const androidDir = resolve(OptionHolder.projectDir, 'android');\n const exeEnv = exe({\n cwd: androidDir,\n });\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n let buildOutputDir: string;\n let outputDir: string;\n\n if (OptionHolder.input.androidOutput === 'aab') {\n // aab: app/build/outputs/bundle/release/app-release.aab\n await exeEnv(isWin ? 'gradle.bat' : './gradlew', ['app:bundleRelease']);\n logger.done('Bundle AAB');\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'bundle', 'release');\n outputDir = resolve(OptionHolder.resourcesDir, 'output', 'android', 'aab');\n } else {\n // apk: app/build/outputs/apk/release/app-release.apk\n await exeEnv(isWin ? 'gradle.bat' : './gradlew', ['app:assembleRelease']);\n logger.done('Assemble APK');\n buildOutputDir = resolve(androidDir, 'app', 'build', 'outputs', 'apk', 'release');\n outputDir = resolve(OptionHolder.resourcesDir, '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","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 { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve } from './FileUtil';\n\nexport function getAndroidFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `json_key:${resolve(OptionHolder.keyDir, 'android_play_console_service_account.json')}`,\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `upload_screenshot:${OptionHolder.input.uploadScreenshot}`,\n `aab_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'aab', 'app-release.aab')}`,\n `apk_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'apk', 'app-release.apk')}`,\n `skip_upload_apk:${OptionHolder.input.androidOutput !== 'apk'}`,\n `skip_upload_aab:${OptionHolder.input.androidOutput !== 'aab'}`,\n ];\n}\n\nexport function getIosFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `api_key_filepath:${resolve(OptionHolder.keyDir, 'ios_app_store_connect_api_key.p8')}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `upload_screenshot:${OptionHolder.input.uploadScreenshot}`,\n `ipa_path:${resolve(OptionHolder.resourcesDir, 'output', 'ios', 'app.ipa')}`,\n `ipa_dir:${resolve(OptionHolder.resourcesDir, 'output', 'ios')}`,\n `ipa_name:app.ipa`,\n ];\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,YAAY,UAAU;AAEf,IAAMA,QAAY;AAClB,IAAMC,WAAe;AAErB,SAAS,MAAMC,OAAc;AAClC,SAAO,GAAG,WAAWA,KAAI;AAC3B;AAEO,SAAS,MAAMA,OAAc;AAClC,SAAO,MAAMA,KAAI,KAAK,GAAG,UAAUA,KAAI,EAAE,YAAY;AACvD;AAEO,SAAS,aAAa,MAAc,IAAY;AACrD,SAAY,cAAS,MAAM,EAAE;AAC/B;AAEO,SAAS,OAAOA,OAAc;AACnC,SAAO,MAAMA,KAAI,KAAK,GAAG,UAAUA,KAAI,EAAE,OAAO;AAClD;AAEO,SAAS,KAAKA,OAAc;AACjC,SAAO,GAAG,aAAaA,OAAM,EAAE,UAAU,OAAO,CAAC;AACnD;AAEO,SAAS,QAAQA,OAAc;AACpC,SAAO,GAAG,YAAYA,KAAI;AAC5B;AAGO,SAAS,aAAaA,OAAc;AACzC,SAAO,GAAG,aAAaA,KAAI;AAC7B;AAEO,SAAS,MAAM,GAAW,SAAiB;AAChD,QAAM,MAAW,aAAQ,CAAC;AAC1B,MAAI,CAAC,MAAM,GAAG,GAAG;AACf,OAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,SAAO,GAAG,cAAc,GAAG,OAAO;AACpC;AACO,SAAS,KAAK,KAAa,MAAc,SAA8B;AAC5E,KAAG,SAAS,KAAK,MAAM,OAAO;AAChC;AASO,SAAS,OAAOC,OAAc;AACnC,MAAI,CAAC,MAAMA,KAAI,GAAG;AAChB;AAAA,EACF;AAEA,MAAI,GAAG,UAAUA,KAAI,EAAE,YAAY,GAAG;AACpC,WAAO,GAAG,OAAOA,OAAM,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EACzD,OAAO;AACL,WAAO,GAAG,OAAOA,OAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EACxC;AACF;AAEA,eAAsB,WAAWA,OAAc,IAA4C;AACzF,MAAI,CAAC,MAAMA,KAAI,GAAG;AAChB;AAAA,EACF;AAEA,aAAW,QAAQ,GAAG,YAAYA,KAAI,GAAG;AACvC,UAAM,GAAG,IAAI;AAAA,EACf;AACF;;;AC1EA;AAAA,EACE,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,UAAY;AAAA,EACZ,YAAc;AAAA,EACd,SAAW;AAAA,IACT,OAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,KAAO;AAAA,IACP,SAAW;AAAA,IACX,GAAK;AAAA,EACP;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,OAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAU;AAAA,IACV,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mCAAmC;AAAA,IACnC,sCAAsC;AAAA,IACtC,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,6BAA6B;AAAA,IAC7B,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AAAA,EACA,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ,SAAW;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;ACtDA,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,OAAO,CAAC;AAAA,EACR,cAAc,CAAC;AAAA,EACf,kBAAkB,CAAC,KAAK;AAAA,EACxB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AACX;;;AClEA,eAAsB,gBAAgB,MAAc,UAA+C;AACjG,QAAM,GAAG,IAAI;AAEb,iBAAe,GAAG,SAAiB;AACjC,UAAM,QAAQ,QAAQ,OAAO,EAAE,IAAI,CAAC,MAAMC,MAAK,SAAS,CAAC,CAAC;AAE1D,eAAW,KAAK,OAAO;AACrB,UAAI,OAAO,CAAC,GAAG;AACb,cAAM,SAAS,CAAC;AAAA,MAClB,WAAW,MAAM,CAAC,GAAG;AACnB,cAAM,GAAG,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;ACZA,eAAsB,2BAA2B,MAAc;AAC7D,QAAM,gBAAgB,MAAM,OAAO,aAAqB;AACtD,QAAI,UAAU,KAAK,QAAQ;AAC3B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,aAAa,YAAY,GAAG;AACpE,gBAAU,QAAQ,WAAW,KAAK,GAAG,MAAM,KAAK;AAAA,IAClD;AACA,UAAM,UAAU,OAAO;AAAA,EACzB,CAAC;AACH;;;ACZA,SAAS,kBAAkB;AAC3B,OAAO,WAAW;AAElB,eAAsB,QAAW,MAAc,SAAiC;AAC9E,SAAO,WAAW,SAAS;AAAA,IACzB;AAAA,IACA,aAAa,MAAM,MAAM,GAAG,IAAI,SAAS;AAAA,IACzC,UAAU,MAAM,IAAI,GAAG,IAAI,WAAW;AAAA,EACxC,CAAC;AACH;;;ACTA,SAAS,aAA2B;AAE7B,IAAM,MAAM,MAAM;AAAA,EACvB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AACT,CAAC;AAEM,IAAM,WAAW,CACtB,SACA,OAAiB,CAAC,GAClB,YACG;AACH,QAAM,aAAa,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS,OAAO,OAAO,CAAC;AACnE,aAAW,OAAO,MAAM,KAAK;AAC7B,aAAW,OAAO,IAAI;AACtB,SAAO;AACT;;;AClBA,OAAOC,YAAW;AAEX,IAAM,SAAS;AAAA,EACpB,SAAS,IAAI,QAAe,QAAQ,IAAIA,OAAM,MAAM,UAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAC1E,MAAM,IAAI,QAAe,QAAQ,IAAIA,OAAM,MAAM,UAAK,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC;AAAA,EAC9E,OAAO,IAAI,QAAe,QAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACtE,MAAM,IAAI,QAAe,QAAQ,IAAIA,OAAM,OAAO,UAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxE,MAAM,IAAI,QAAe,QAAQ,IAAIA,OAAM,KAAK,UAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACtE,OAAO,IAAI,QAAe,QAAQ,IAAIA,OAAM,KAAK,KAAK;AAAA,EAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAC5E,KAAK,IAAI,QAAe,QAAQ,IAAIA,OAAM,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/D;;;ACPA,OAAOC,YAAW;AAEX,SAAS,gBAAgB,IAA4B;AAC1D,QAAM,SAASC,MAAK,aAAa,YAAY,KAAK;AAElD,QAAM,YAAYA,MAAK,QAAQ,UAAU;AACzC,QAAM,oBAAoBA,MAAK,WAAW,UAAU;AACpD,QAAM,uBAAuBA,MAAK,WAAW,aAAa;AAE1D,QAAM,eAAeA,MAAK,aAAa,cAAc,cAAc;AACnE,QAAM,uBAAuBA,MAAK,cAAc,UAAU;AAC1D,QAAM,0BAA0BA,MAAK,cAAc,aAAa;AAEhE,MAAI,OAAO,aAAa;AACtB,QAAI,MAAM,iBAAiB,KAAK,MAAM,oBAAoB,GAAG;AAC3D,WAAK,mBAAmB,oBAAoB;AAC5C,WAAK,sBAAsB,uBAAuB;AAElD,aAAO;AAAA,QACL,yBAAyBD,OAAM,QAAQ,aAAa,aAAa,YAAY,YAAY,CAAC,CAAC;AAAA,MAC7F;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,6BAA6BA,OAAM,QAAQ,aAAa,aAAa,YAAY,SAAS,CAAC,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,MAAM,oBAAoB,KAAK,MAAM,uBAAuB,GAAG;AACjE,WAAK,sBAAsB,iBAAiB;AAC5C,WAAK,yBAAyB,oBAAoB;AAElD,aAAO;AAAA,QACL,0BAA0BA,OAAM,QAAQ,aAAa,aAAa,YAAY,SAAS,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,6BAA6BA,OAAM,QAAQ,aAAa,aAAa,YAAY,YAAY,CAAC,CAAC;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,IAA2B;AAC7D,QAAM,aAAaC,MAAK,aAAa,YAAY,SAAS;AAE1D,QAAM,YAAYA,MAAK,YAAY,2BAA2B;AAC9D,QAAM,eAAeA,MAAK,aAAa,cAAc,kBAAkB;AAEvE,MAAI,OAAO,YAAY;AACrB,QAAI,MAAM,SAAS,GAAG;AACpB,WAAK,WAAW,YAAY;AAC5B,aAAO;AAAA,QACL,6BAA6BD,OAAM,QAAQ,aAAa,aAAa,YAAY,YAAY,CAAC,CAAC;AAAA,MACjG;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,iCAAiCA,OAAM,QAAQ,aAAa,aAAa,YAAY,SAAS,CAAC,CAAC;AAAA,MAClG;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,MAAM,YAAY,GAAG;AACvB,WAAK,cAAc,SAAS;AAC5B,aAAO;AAAA,QACL,8BAA8BA,OAAM,QAAQ,aAAa,aAAa,YAAY,SAAS,CAAC,CAAC;AAAA,MAC/F;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,iCAAiCA,OAAM,QAAQ,aAAa,aAAa,YAAY,YAAY,CAAC,CAAC;AAAA,MACrG;AAAA,IACF;AAAA,EACF;AACF;;;AClEA,eAAsB,iBAAiB;AACrC,QAAM,SAASE,SAAQ,aAAa,IAAI,aAAa,SAAS;AAC9D,QAAM,UAAUA,SAAQ,aAAa,YAAY,SAAS;AAE1D,QAAM,SAAS,QAAQ,CAAC,YAAY,MAAM,WAAW,cAAc,GAAG;AAAA,IACpE,KAAK,aAAa;AAAA,EACpB,CAAC;AACD,SAAO,QAAQ,sBAAsB;AAErC,QAAM;AAAA,IACJ;AAAA,IACA,WAAW,QAAQ,OAAO,SAAS;AACjC,YAAM,WAAWA,SAAQ,QAAQ,IAAI;AACrC,aAAOA,SAAQ,SAAS,IAAI,CAAC;AAC7B,WAAK,UAAUA,SAAQ,SAAS,IAAI,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,4CAA4C,4BAA4B,OAAO,CAAC;AAE9F,QAAM;AAAA,IACJ;AAAA,IACA,2BAA2BA,SAAQ,SAAS,UAAU,CAAC;AAAA,EACzD;AAEA,QAAM,IAAI,UAAU,CAAC,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;AACjD,SAAO,QAAQ,uBAAuB;AAEtC,sBAAoB,QAAQ;AAC9B;AAEA,eAAe,4BAA4B,SAAiB;AAC1D,QAAM,qBAAqBA,SAAQ,SAAS,KAAK;AACjD,QAAM,kBAAkBA,SAAQ,SAAS,OAAO,cAAc;AAC9D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AAEjB,QAAM,UAAU,KAAK,eAAe,EAAE;AAAA,IACpC;AAAA,IACA;AAAA;AAAA;AAAA,0BAGsB,aAAa,oBAAoBA,SAAQ,aAAa,cAAc,OAAO,0BAA0B,CAAC,CAAC;AAAA,yBACxG,+BAA+B;AAAA,oBACpC,0BAA0B;AAAA,uBACvB,6BAA6B;AAAA;AAAA;AAAA;AAAA,EAIlD;AACA,QAAM,iBAAiB,OAAO;AAChC;;;AC3DA,eAAsB,6BAA6B;AACjD,MAAI,MAAM,aAAa,iBAAiB,GAAG;AACzC,WAAO,OAAO,aAAa,cAAc,aAAa,aAAa,iBAAiB,CAAC;AAAA,EACvF;AACF;;;ACPO,IAAM,QAAQ,QAAQ,IAAI,aAAa;AACvC,IAAM,QAAQ,QAAQ,SAAS,WAAW,KAAK;AAC/C,IAAM,SAAS,QAAQ,IAAI,aAAa;;;ACCxC,SAAS,WAAW,SAAiB,GAAgB;AAC1D,MAAI,GAAG;AACL,WAAO,MAAM,SAAS,CAAC;AAAA,EACzB,OAAO;AACL,WAAO,MAAM,OAAO;AAAA,EACtB;AACA,MAAI,QAAQ;AACV,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AACA,UAAQ,KAAK,CAAC;AAChB;;;ACXA,OAAO,YAAY;AAEnB,SAAS,eAAe;AAExB,IAAM,mBAAmB,MAAM;AAC/B,IAAM,mBAAmB,MAAM;AAE/B,eAAsB,sBAAsB;AAC1C,QAAM,QAAQ,QAAQ,aAAa,UAAU;AAE7C,QAAM,gBAAgB,CAAC,iBAAiB,iBAAiB,kBAAkB,gBAAgB;AAC3F,QAAM,iBAAiB;AAEvB,aAAW,gBAAgB,eAAe;AACxC,QAAI,MAAM,SAAS,YAAY,GAAG;AAChC,YAAM,sBAAsB,YAAY;AACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,cAAc,GAAG;AAClC,UAAM,wBAAwB,cAAc;AAC5C;AAAA,EACF;AAEA,aAAW,4BAA4B;AAEvC,iBAAe,sBAAsB,UAAkB;AACrD,UAAM,WAAWC,SAAQ,aAAa,YAAY,QAAQ;AAC1D,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,eAAe,iBAAiB,EAAE,KAAK,OAAO,IAAI,CAAC;AACzD,UAAM,eAAe,iBAAiB,EAAE,KAAK,OAAO,IAAI,CAAC;AAEzD,QAAI,CAAC,cAAc;AACjB,iBAAW,2BAA2B;AAAA,IACxC;AACA,QAAI,CAAC,cAAc;AACjB,iBAAW,2BAA2B;AAAA,IACxC;AAEA,QAAI,CAAC,OAAO,MAAM,YAAY,GAAG;AAC/B,iBAAW,2CAA2C;AAAA,IACxD;AAEA,iBAAa,cAAc;AAC3B,iBAAa,cAAc;AAAA,EAC7B;AAEA,iBAAe,wBAAwB,UAAkB;AACvD,UAAM,WAAWA,SAAQ,aAAa,YAAY,QAAQ;AAC1D,UAAM,OAAO,aAAa,QAAQ;AAElC,UAAM,cAAc,KAAK,MAAM,UAAU;AACzC,UAAM,iBAAiB,KAAK,MAAM,KAAK,cAAc;AACrD,UAAM,qBAAqB,KAAK,MAAM,SAAS,cAAc;AAE7D,QAAI,CAAC,MAAM,KAAK,cAAc,GAAG;AAC/B,iBAAW,iDAAiD;AAAA,IAC9D;AAEA,QAAI,CAAC,MAAM,KAAK,kBAAkB,GAAG;AACnC,iBAAW,qDAAqD;AAAA,IAClE;AAEA,QAAI,mBAAmB,oBAAoB;AACzC,iBAAW,0EAA0E;AAAA,IACvF;AAEA,QAAI,CAAC,OAAO,MAAM,WAAW,GAAG;AAC9B,iBAAW,2CAA2C;AAAA,IACxD;AAEA,iBAAa,cAAc;AAC3B,iBAAa,cAAc;AAAA,EAC7B;AACF;;;AC3EA,SAAS,UAAU;AAEnB,eAAsB,kBAAkB;AACtC,QAAM,aAAa;AAAA,IACjBC,MAAK,aAAa,cAAc,6BAA6B;AAAA,IAC7DA,MAAK,aAAa,YAAY,6BAA6B;AAAA,EAC7D;AACA,MAAI,aAAa,MAAM,QAAQ;AAC7B,eAAW,QAAQ,aAAa,MAAM,MAAM;AAAA,EAC9C;AAEA,QAAM,sBAAsB,WAAW;AAAA,IACrC,CAAC,cAAc,MAAM,SAAS,KAAK,GAAG,OAAO,aAAa,SAAS,CAAC;AAAA,EACtE;AAEA,MAAI,CAAC,oBAAqB;AAE1B,QAAM,SAAS,aAAa,mBAAmB;AAE/C;AAAA,IACE,aAAa;AAAA,IACb;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACA;AAAA,IACE,aAAa;AAAA,IACb;AAAA,IACA,OAAO,OAAO,sBAAsB,OAAO,QAAQ;AAAA,EACrD;AACA;AAAA,IACE,aAAa;AAAA,IACb;AAAA,IACA,OAAO,QAAQ,kBAAkB,OAAO,QAAQ;AAAA,EAClD;AACA;AAAA,IACE,aAAa;AAAA,IACb;AAAA,IACA,OAAO,QAAQ,oBAAoB,OAAO,QAAQ;AAAA,EACpD;AACF;AAGA,SAAS,qCACP,QACA,KACA,OACA;AACA,MAAI,CAAC,OAAO,GAAG,KAAK,OAAO;AACzB,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;;;AC9CA,eAAsB,QAAQ;AAC5B,QAAM,kBAAkB;AACxB,QAAM,gBAAgB;AACtB,QAAM,2BAA2B;AACjC,QAAM,oBAAoB;AAC5B;AAEA,eAAsB,oBAAoB;AACxC,eAAa,aAAa,QAAQC,SAAQ,SAAS,IAAIA,SAAQ,GAAG;AAClE,eAAa,eAAeA,SAAQ,aAAa,YAAY,iBAAiB;AAC9E,eAAa,SAASA,SAAQ,aAAa,cAAc,KAAK;AAC9D,eAAa,oBAAoBA,SAAQ,aAAa,cAAc,gBAAgB;AACpF,eAAa,UAAUA,SAAQ,aAAa,cAAc,OAAO;AACnE;;;ACZA,eAAsB,aAAa;AACjC,QAAM,SAASC,SAAQ,aAAa,IAAI,aAAa,KAAK;AAC1D,QAAM,UAAUA,SAAQ,aAAa,YAAY,KAAK;AAEtD,QAAM,SAAS,QAAQ,CAAC,YAAY,MAAM,OAAO,cAAc,GAAG;AAAA,IAChE,KAAK,aAAa;AAAA,EACpB,CAAC;AACD,SAAO,QAAQ,sBAAsB;AAErC,QAAM;AAAA,IACJ;AAAA,IACA,WAAW,QAAQ,OAAO,SAAS;AACjC,YAAM,WAAWA,SAAQ,QAAQ,IAAI;AACrC,aAAOA,SAAQ,SAAS,IAAI,CAAC;AAC7B,WAAK,UAAUA,SAAQ,SAAS,IAAI,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,2BAA2BA,SAAQ,SAAS,UAAU,CAAC;AAAA,EACzD;AAEA,QAAM,IAAI,UAAU,CAAC,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;AACjD,SAAO,QAAQ,uBAAuB;AAEtC,kBAAgB,QAAQ;AAC1B;;;AC7BA,OAAOC,YAAW;;;ACNlB,SAAS,WAAAC,gBAAe;AAEjB,SAAS,iBAAiB,GAAW;AAC1C,MAAI,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,GAAI;AAChD,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,YAAU,UAAU;AACpB,SAAO,GAAG,OAAO,IAAIA,SAAQ,OAAO,CAAC;AACvC;;;ACNA,SAAS,cAAc;AACvB,SAAS,MAAAC,WAAU;AACnB,OAAOC,YAAW;AAEX,IAAM,gBAAgB;AAAA,EAC3B,UAAU,YAAY;AACpB,QAAI,CAAC,aAAa,MAAM,UAAU;AAChC,mBAAa,MAAM,WAAW,MAAM,OAAO;AAAA,QACzC,SAAS,kCAAkC;AAAA,UACzC,MAAM;AAAA,UACN,aAAa;AAAA,QACf,CAAC;AAAA,QACD,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,OAAO,aAAa,cAAc;AAAA,UACxD,EAAE,MAAM,WAAW,OAAO,WAAW,aAAa,kBAAkB;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,YAAY,YAAY;AACtB,QAAI,aAAa,MAAM,aAAa,OAAO;AACzC,mBAAa,MAAM,MAAM,MAAM,OAAO;AAAA,QACpC,SAAS,kCAAkC;AAAA,UACzC,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,MAAM,aAAa,8BAA8B;AAAA,UACvE,EAAE,MAAM,MAAM,OAAO,OAAO,aAAa,oBAAoB;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,oBAAoB,YAAY;AAC9B,QAAI,aAAa,MAAM,aAAa,WAAW;AAC7C,UAAI,CAAC,aAAa,MAAM,eAAe;AACrC,qBAAa,MAAM,gBAAgB,MAAM,OAAO;AAAA,UAC9C,SAAS,kCAAkC;AAAA,YACzC,MAAM;AAAA,UACR,CAAC;AAAA,UACD,SAAS;AAAA,YACP,EAAE,MAAM,OAAO,OAAO,OAAO,aAAa,sBAAsB;AAAA,YAChE,EAAE,MAAM,OAAO,OAAO,OAAO,aAAa,eAAe;AAAA,UAC3D;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EACA,gBAAgB,YAAY;AAC1B,QAAI,CAACD,IAAG,QAAQ,aAAa,MAAM,cAAc,GAAG;AAClD,mBAAa,MAAM,iBAAiB,MAAM,OAAO;AAAA,QAC/C,SAAS,kCAAkC;AAAA,UACzC,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,MAAM,aAAa,SAAS;AAAA,UAClD,EAAE,MAAM,MAAM,OAAO,OAAO,aAAa,eAAe;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,kBAAkB,YAAY;AAC5B,QAAI,CAACA,IAAG,QAAQ,aAAa,MAAM,gBAAgB,GAAG;AACpD,mBAAa,MAAM,mBAAmB,MAAM,OAAO;AAAA,QACjD,SAAS,kCAAkC;AAAA,UACzC,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,MAAM,aAAa,SAAS;AAAA,UAClD,EAAE,MAAM,MAAM,OAAO,OAAO,aAAa,eAAe;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,mBAAmB,YAAY;AAC7B,QACE,CAACA,IAAG,QAAQ,aAAa,MAAM,iBAAiB,KAChD,aAAa,MAAM,aAAa,OAChC;AACA,mBAAa,MAAM,oBAAoB,MAAM,OAAO;AAAA,QAClD,SAAS,kCAAkC;AAAA,UACzC,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,MAAM,aAAa,6BAA6B;AAAA,UACtE,EAAE,MAAM,MAAM,OAAO,OAAO,aAAa,sBAAsB;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI,MAAM,GAAGC,OAAM,KAAK,IAAI,CAAC;AAC7B,MAAI,aAAa;AACf,WAAO;AAAA;AAAA,EAAOA,OAAM,OAAO,KAAK,WAAW,CAAC;AAAA,EAC9C;AACA,MAAI,SAAS;AACX,WAAO;AAAA,EAAKA,OAAM,OAAO,GAAGA,OAAM,YAAY,cAAc,CAAC,IAAI,OAAO,EAAE,CAAC;AAAA,EAC7E;AACA,MAAI,UAAU;AACZ,WAAO;AAAA,EAAKA,OAAM,OAAO,GAAGA,OAAM,YAAY,cAAc,CAAC,IAAIA,OAAM,UAAU,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,EACpG;AAEA,MAAI,aAAa;AACf,WAAO;AACP,QAAI,WAAW,UAAU;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACxGO,SAAS,wBAAwB;AACtC,SAAO;AAAA,IACL,GAAG,OAAO,QAAQ,aAAa,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,IACxE,gBAAgB,aAAa,WAAW;AAAA,IACxC,gBAAgB,aAAa,WAAW;AAAA,IACxC,oBAAoBC,SAAQ,aAAa,QAAQ,kCAAkC,CAAC;AAAA,IACpF,mBAAmB,aAAa,MAAM,cAAc;AAAA,IACpD,qBAAqB,aAAa,MAAM,gBAAgB;AAAA,IACxD,YAAYA,SAAQ,aAAa,cAAc,UAAU,OAAO,SAAS,CAAC;AAAA,IAC1E,WAAWA,SAAQ,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;;;AHjBA,eAAsB,MAAM,EAAE,QAAQ,GAAqB;AACzD,SAAO,OAAO,aAAa,OAAO,OAAO;AACzC,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,MAAM;AACZ,QAAM,aAAa;AAEnB,SAAO,KAAK,eAAe;AAE3B,MAAI,aAAa,MAAM,aAAa,OAAO;AACzC,UAAM,SAAS;AACf,WAAO,QAAQ,aAAaC,OAAM,KAAK,QAAQ,iBAAiB,SAAS,CAAC,CAAC,EAAE;AAAA,EAC/E,OAAO;AACL,UAAM,aAAa;AACnB,WAAO,QAAQ,iBAAiBA,OAAM,KAAK,QAAQ,iBAAiB,SAAS,CAAC,CAAC,EAAE;AAAA,EACnF;AACF;AAEA,eAAe,eAAe;AAC5B,QAAM,cAAc,SAAS;AAC7B,QAAM,cAAc,WAAW;AAC/B,QAAM,cAAc,mBAAmB;AACzC;AAEA,eAAe,WAAW;AACxB,QAAM,SAASC,SAAQ,aAAa,YAAY,KAAK;AACrD,QAAM,SAAS,IAAI;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,MACH,gBAAgB,aAAa,aAAa;AAAA,IAC5C;AAAA,EACF,CAAC;AACD,QAAM,WAAW;AACjB,QAAM,SAAS;AAEf,iBAAe,WAAW;AACxB,QAAI,aAAa,MAAM,KAAK;AAC1B,YAAM,OAAO,UAAU,CAAC,QAAQ,OAAO,SAAS,CAAC;AACjD,aAAO,KAAK,aAAa;AAAA,IAC3B;AACA,WAAOA,SAAQ,QAAQ,kBAAkB,CAAC;AAE1C,UAAM,OAAO,UAAU,CAAC,QAAQ,YAAY,SAAS,GAAG,sBAAsB,CAAC,CAAC;AAEhF,WAAO;AAAA,MACL,uBAAuB,aAAa,aAAa,YAAYA,SAAQ,aAAa,cAAc,UAAU,OAAO,SAAS,CAAC,CAAC;AAAA,IAC9H;AAAA,EACF;AACF;AACA,eAAe,eAAe;AAC5B,QAAM,aAAaA,SAAQ,aAAa,YAAY,SAAS;AAC7D,QAAM,SAAS,IAAI;AAAA,IACjB,KAAK;AAAA,EACP,CAAC;AACD,QAAM,eAAe;AACrB,QAAM,SAAS;AAEf,iBAAe,WAAW;AACxB,QAAI;AACJ,QAAI;AAEJ,QAAI,aAAa,MAAM,kBAAkB,OAAO;AAE9C,YAAM,OAAO,QAAQ,eAAe,aAAa,CAAC,mBAAmB,CAAC;AACtE,aAAO,KAAK,YAAY;AACxB,uBAAiBA,SAAQ,YAAY,OAAO,SAAS,WAAW,UAAU,SAAS;AACnF,kBAAYA,SAAQ,aAAa,cAAc,UAAU,WAAW,KAAK;AAAA,IAC3E,OAAO;AAEL,YAAM,OAAO,QAAQ,eAAe,aAAa,CAAC,qBAAqB,CAAC;AACxE,aAAO,KAAK,cAAc;AAC1B,uBAAiBA,SAAQ,YAAY,OAAO,SAAS,WAAW,OAAO,SAAS;AAChF,kBAAYA,SAAQ,aAAa,cAAc,UAAU,WAAW,KAAK;AAAA,IAC3E;AAEA,WAAO,SAAS;AAChB,SAAK,gBAAgB,SAAS;AAE9B,WAAO,QAAQ,uBAAuB,aAAa,aAAa,YAAY,SAAS,CAAC,EAAE;AAAA,EAC1F;AACF;","names":["join","resolve","path","path","resolve","join","chalk","chalk","join","resolve","resolve","join","resolve","resolve","chalk","padZero","is","chalk","resolve","chalk","resolve"]}