expo-release-it 0.3.2 → 0.5.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 +5 -298
  2. package/build/command/build.js +90 -43
  3. package/build/command/build.js.map +1 -1
  4. package/build/command/bump.js +219 -24
  5. package/build/command/bump.js.map +1 -1
  6. package/build/command/init.js +84 -22
  7. package/build/command/init.js.map +1 -1
  8. package/build/command/pull.js +84 -37
  9. package/build/command/pull.js.map +1 -1
  10. package/build/command/submit.js +90 -43
  11. package/build/command/submit.js.map +1 -1
  12. package/build/command/upload.js +90 -43
  13. package/build/command/upload.js.map +1 -1
  14. package/build/index.js +196 -47
  15. package/build/index.js.map +1 -1
  16. package/build/type/ExpoReleaseItConfiguration.d.d.ts +54 -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 +20 -19
  23. package/build/util/FastlaneOption.js.map +1 -1
  24. package/build/util/MetadataSyncUtil.js +20 -19
  25. package/build/util/MetadataSyncUtil.js.map +1 -1
  26. package/build/util/OptionHolder.d.ts +9 -1
  27. package/build/util/OptionHolder.js +20 -19
  28. package/build/util/OptionHolder.js.map +1 -1
  29. package/build/util/generateAppStoreConnectApiKeyFile.js +20 -19
  30. package/build/util/generateAppStoreConnectApiKeyFile.js.map +1 -1
  31. package/build/util/injectTemplatePlaceHolders.js +20 -19
  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 +20 -34
  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 +151 -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 +45 -19
  41. package/build/util/setup/VersionUtil.js.map +1 -1
  42. package/build/util/setup/hydrateKeyholderFileValues.js +20 -19
  43. package/build/util/setup/hydrateKeyholderFileValues.js.map +1 -1
  44. package/build/util/setup/prepareAndroid.js +20 -19
  45. package/build/util/setup/prepareAndroid.js.map +1 -1
  46. package/build/util/setup/prepareIos.js +20 -19
  47. package/build/util/setup/prepareIos.js.map +1 -1
  48. package/build/util/setup/setup.js +85 -22
  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 +77 -0
  53. package/package.json +17 -18
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/FileUtil.ts","../../src/util/iterateAllFiles.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/injectTemplatePlaceHolders.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","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","{\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 { 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"],"mappings":"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","names":["join","resolve","path","path","join","resolve"]}
1
+ {"version":3,"sources":["../../src/util/FileUtil.ts","../../src/util/iterateAllFiles.ts","../../package.json","../../src/util/OptionHolder.ts","../../src/util/injectTemplatePlaceHolders.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","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","{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.4.0\",\n \"license\": \"MIT\",\n \"homepage\": \"https://expo-release-it.mjstudio.net/\",\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\": \"catalog:native\",\n \"react-native\": \"catalog:native\",\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\": \"catalog:\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"catalog:\",\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 git: {\n commit?: boolean;\n commitMessage?: string;\n tag?: boolean;\n tagName?: string;\n push?: boolean;\n };\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: {\n git: {},\n } 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 { 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"],"mappings":"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","names":["join","resolve","path","path","join","resolve"]}
@@ -1,6 +1,5 @@
1
1
  declare const InqueryInputs: {
2
2
  platform: () => Promise<void>;
3
- platformAll: () => Promise<void>;
4
3
  podinstall: () => Promise<void>;
5
4
  androidBuildOutput: () => Promise<void>;
6
5
  uploadMetadata: () => Promise<void>;
@@ -3,17 +3,16 @@ var package_default = {
3
3
  name: "expo-release-it",
4
4
  module: "src/index.ts",
5
5
  type: "module",
6
- version: "0.3.1",
6
+ version: "0.4.0",
7
7
  license: "MIT",
8
- homepage: "https://github.com/mym0404/expo-release-it",
8
+ homepage: "https://expo-release-it.mjstudio.net/",
9
9
  repository: "https://github.com/mym0404/expo-release-it",
10
10
  scripts: {
11
- build: "tsup",
12
- dev: "yarn run build && NODE_ENV=development node bin/expo-release-it.mjs",
13
- release: "yarn build && release-it",
14
- android: "expo run:android",
15
- ios: "expo run:ios",
16
- t: "tsc --noEmit -p ."
11
+ build: "pnpm build:json-schema-type && tsup",
12
+ "build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
13
+ dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
14
+ release: "pnpm build && pnpm run t && release-it",
15
+ t: "lefthook run check"
17
16
  },
18
17
  dependencies: {
19
18
  "@inquirer/prompts": "^7.4.1",
@@ -23,8 +22,8 @@ var package_default = {
23
22
  execa: "^9.5.2",
24
23
  "fs-extra": "^11.3.0",
25
24
  ora: "^8.2.0",
26
- react: "18.3.1",
27
- "react-native": "0.76.9",
25
+ react: "catalog:native",
26
+ "react-native": "catalog:native",
28
27
  semver: "^7.7.1",
29
28
  url: "^0.11.4"
30
29
  },
@@ -33,29 +32,29 @@ var package_default = {
33
32
  "@release-it/conventional-changelog": "^10.0.1",
34
33
  "@types/fs-extra": "^11.0.4",
35
34
  "@types/semver": "^7.7.0",
35
+ "json-schema-to-typescript": "^15.0.4",
36
36
  lefthook: "^1.11.11",
37
- prettier: "3.5.3",
37
+ prettier: "catalog:",
38
38
  "release-it": "^19.0.1",
39
39
  "tiny-glob": "^0.2.9",
40
40
  tsup: "^8.4.0",
41
- typescript: "^5.8.3"
41
+ typescript: "catalog:",
42
+ vitest: "^3.1.2"
42
43
  },
43
- workspaces: [
44
- "example"
45
- ],
46
44
  bin: "./bin/expo-release-it.mjs",
47
45
  files: [
48
46
  "build",
49
47
  "package.json",
50
48
  "bin",
51
- "template"
49
+ "template",
50
+ "expo-release-it.schema.json"
52
51
  ],
53
- packageManager: "yarn@4.9.1",
54
52
  commitlint: {
55
53
  extends: [
56
54
  "@commitlint/config-conventional"
57
55
  ]
58
- }
56
+ },
57
+ packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
59
58
  };
60
59
 
61
60
  // src/util/FileUtil.ts
@@ -71,7 +70,9 @@ var OptionHolder = {
71
70
  rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
72
71
  templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
73
72
  },
74
- input: {},
73
+ input: {
74
+ git: {}
75
+ },
75
76
  keyholderMap: {},
76
77
  templateDirNames: ["key"],
77
78
  projectDir: "",
@@ -102,21 +103,6 @@ var InqueryInputs = {
102
103
  });
103
104
  }
104
105
  },
105
- platformAll: async () => {
106
- if (!OptionHolder.input.platformAll) {
107
- OptionHolder.input.platformAll = await select({
108
- message: constructInquirerFormattedMessage({
109
- name: "Platform",
110
- explanation: `Platforms to run action`
111
- }),
112
- choices: [
113
- { name: "all", value: "all", description: "Both" },
114
- { name: "ios", value: "ios", description: "Release ios" },
115
- { name: "android", value: "android", description: "Release android" }
116
- ]
117
- });
118
- }
119
- },
120
106
  podinstall: async () => {
121
107
  if (OptionHolder.input.platform === "ios") {
122
108
  OptionHolder.input.pod = await select({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../package.json","../../../src/util/FileUtil.ts","../../../src/util/OptionHolder.ts","../../../src/util/input/InqueryInputs.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.3.1\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/mym0404/expo-release-it\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"yarn run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"ora\": \"^8.2.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"lefthook\": \"^1.11.11\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\",\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n }\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n platformAll: 'android' | 'ios' | 'all';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n ios_match_password: string;\n\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n android_package_name: string;\n };\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {} as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n platformAll: async () => {\n if (!OptionHolder.input.platformAll) {\n OptionHolder.input.platformAll = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platforms to run action`,\n }),\n choices: [\n { name: 'all', value: 'all', description: 'Both' },\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n"],"mappings":"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","names":["resolve","resolve"]}
1
+ {"version":3,"sources":["../../../package.json","../../../src/util/FileUtil.ts","../../../src/util/OptionHolder.ts","../../../src/util/input/InqueryInputs.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.4.0\",\n \"license\": \"MIT\",\n \"homepage\": \"https://expo-release-it.mjstudio.net/\",\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\": \"catalog:native\",\n \"react-native\": \"catalog:native\",\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\": \"catalog:\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"^3.1.2\"\n },\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\",\n \"expo-release-it.schema.json\"\n ],\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n },\n \"packageManager\": \"pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n git: {\n commit?: boolean;\n commitMessage?: string;\n tag?: boolean;\n tagName?: string;\n push?: boolean;\n };\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: {\n git: {},\n } as any,\n keyholderMap: {} as any,\n templateDirNames: ['key'],\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { OptionHolder } from '../OptionHolder';\nimport { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nexport const InqueryInputs = {\n platform: async () => {\n if (!OptionHolder.input.platform) {\n OptionHolder.input.platform = await select({\n message: constructInquirerFormattedMessage({\n name: 'Platform',\n explanation: `Platform to run action`,\n }),\n choices: [\n { name: 'ios', value: 'ios', description: 'Release ios' },\n { name: 'android', value: 'android', description: 'Release android' },\n ],\n });\n }\n },\n podinstall: async () => {\n if (OptionHolder.input.platform === 'ios') {\n OptionHolder.input.pod = await select({\n message: constructInquirerFormattedMessage({\n name: 'Install CocoaPods?',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Install pods before release' },\n { name: 'no', value: false, description: 'Skip pods install' },\n ],\n });\n }\n },\n androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n"],"mappings":"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","names":["resolve","resolve"]}
@@ -0,0 +1,3 @@
1
+ declare function parseConfigFile(): Promise<void>;
2
+
3
+ export { parseConfigFile };
@@ -0,0 +1,151 @@
1
+ // package.json
2
+ var package_default = {
3
+ name: "expo-release-it",
4
+ module: "src/index.ts",
5
+ type: "module",
6
+ version: "0.4.0",
7
+ license: "MIT",
8
+ homepage: "https://expo-release-it.mjstudio.net/",
9
+ repository: "https://github.com/mym0404/expo-release-it",
10
+ scripts: {
11
+ build: "pnpm build:json-schema-type && tsup",
12
+ "build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
13
+ dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
14
+ release: "pnpm build && pnpm run t && release-it",
15
+ t: "lefthook run check"
16
+ },
17
+ dependencies: {
18
+ "@inquirer/prompts": "^7.4.1",
19
+ "@mj-studio/js-util": "^1.1.20",
20
+ chalk: "^5.4.1",
21
+ commander: "^13.1.0",
22
+ execa: "^9.5.2",
23
+ "fs-extra": "^11.3.0",
24
+ ora: "^8.2.0",
25
+ react: "catalog:native",
26
+ "react-native": "catalog:native",
27
+ semver: "^7.7.1",
28
+ url: "^0.11.4"
29
+ },
30
+ devDependencies: {
31
+ "@commitlint/config-conventional": "^19.8.0",
32
+ "@release-it/conventional-changelog": "^10.0.1",
33
+ "@types/fs-extra": "^11.0.4",
34
+ "@types/semver": "^7.7.0",
35
+ "json-schema-to-typescript": "^15.0.4",
36
+ lefthook: "^1.11.11",
37
+ prettier: "catalog:",
38
+ "release-it": "^19.0.1",
39
+ "tiny-glob": "^0.2.9",
40
+ tsup: "^8.4.0",
41
+ typescript: "catalog:",
42
+ vitest: "^3.1.2"
43
+ },
44
+ bin: "./bin/expo-release-it.mjs",
45
+ files: [
46
+ "build",
47
+ "package.json",
48
+ "bin",
49
+ "template",
50
+ "expo-release-it.schema.json"
51
+ ],
52
+ commitlint: {
53
+ extends: [
54
+ "@commitlint/config-conventional"
55
+ ]
56
+ },
57
+ packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
58
+ };
59
+
60
+ // src/util/FileUtil.ts
61
+ import fs from "fs-extra";
62
+ import * as path from "path";
63
+ var join2 = path.join;
64
+ var resolve2 = path.resolve;
65
+ function exist(path2) {
66
+ return fs.existsSync(path2);
67
+ }
68
+ function readJsonSlow(path2) {
69
+ return fs.readJSONSync(path2);
70
+ }
71
+
72
+ // src/util/OptionHolder.ts
73
+ import { fileURLToPath } from "url";
74
+ var OptionHolder = {
75
+ cli: {
76
+ version: package_default.version,
77
+ rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
78
+ templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
79
+ },
80
+ input: {
81
+ git: {}
82
+ },
83
+ keyholderMap: {},
84
+ templateDirNames: ["key"],
85
+ projectDir: "",
86
+ resourcesDir: "",
87
+ keyDir: "",
88
+ keyholderFilePath: "",
89
+ versionName: "",
90
+ versionCode: "",
91
+ tempDir: ""
92
+ };
93
+
94
+ // src/util/parseConfigFile.ts
95
+ import { is } from "@mj-studio/js-util";
96
+ async function parseConfigFile() {
97
+ const candidates = [
98
+ join2(OptionHolder.resourcesDir, "expo-release-it.config.json"),
99
+ join2(OptionHolder.projectDir, "expo-release-it.config.json")
100
+ ];
101
+ if (OptionHolder.input.config) {
102
+ candidates.unshift(OptionHolder.input.config);
103
+ }
104
+ const validConfigFilePath = candidates.find(
105
+ (candidate) => exist(candidate) && is.object(readJsonSlow(candidate))
106
+ );
107
+ if (!validConfigFilePath) return;
108
+ const config = readJsonSlow(validConfigFilePath);
109
+ assignIfValueIsValidAndNotSetAlready(
110
+ OptionHolder.input,
111
+ "semverIncrement",
112
+ config.bump?.increment
113
+ );
114
+ assignIfValueIsValidAndNotSetAlready(
115
+ OptionHolder.input,
116
+ "androidOutput",
117
+ config.build?.androidBuildOutput ?? config.upload?.androidBuildOutput
118
+ );
119
+ assignIfValueIsValidAndNotSetAlready(
120
+ OptionHolder.input,
121
+ "uploadMetadata",
122
+ config.upload?.uploadMetadata ?? config.submit?.uploadMetadata
123
+ );
124
+ assignIfValueIsValidAndNotSetAlready(
125
+ OptionHolder.input,
126
+ "uploadScreenshot",
127
+ config.upload?.uploadScreenshot ?? config.submit?.uploadScreenshot
128
+ );
129
+ assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, "commit", config.bump?.git?.commit);
130
+ assignIfValueIsValidAndNotSetAlready(
131
+ OptionHolder.input.git,
132
+ "commitMessage",
133
+ config.bump?.git?.commitMessage
134
+ );
135
+ assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, "tag", config.bump?.git?.tag);
136
+ assignIfValueIsValidAndNotSetAlready(
137
+ OptionHolder.input.git,
138
+ "tagName",
139
+ config.bump?.git?.tagName
140
+ );
141
+ assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, "push", config.bump?.git?.push);
142
+ }
143
+ function assignIfValueIsValidAndNotSetAlready(object, key, value) {
144
+ if (!object[key] && value) {
145
+ object[key] = value;
146
+ }
147
+ }
148
+ export {
149
+ parseConfigFile
150
+ };
151
+ //# sourceMappingURL=parseConfigFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/parseConfigFile.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.4.0\",\n \"license\": \"MIT\",\n \"homepage\": \"https://expo-release-it.mjstudio.net/\",\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\": \"catalog:native\",\n \"react-native\": \"catalog:native\",\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\": \"catalog:\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"^3.1.2\"\n },\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\",\n \"expo-release-it.schema.json\"\n ],\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n },\n \"packageManager\": \"pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\nexport function move(src: string, dest: string, options?: fs.MoveOptions) {\n fs.moveSync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n pod: boolean;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n git: {\n commit?: boolean;\n commitMessage?: string;\n tag?: boolean;\n tagName?: string;\n push?: boolean;\n };\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: {\n git: {},\n } 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 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 assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, 'commit', config.bump?.git?.commit);\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input.git,\n 'commitMessage',\n config.bump?.git?.commitMessage,\n );\n assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, 'tag', config.bump?.git?.tag);\n assignIfValueIsValidAndNotSetAlready(\n OptionHolder.input.git,\n 'tagName',\n config.bump?.git?.tagName,\n );\n assignIfValueIsValidAndNotSetAlready(OptionHolder.input.git, 'push', config.bump?.git?.push);\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: Partial<T>,\n key: K,\n value: R,\n) {\n if (!object[key] && value) {\n object[key] = value as any;\n }\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","join"]}
@@ -3,5 +3,7 @@ declare function injectBinaryVersions({ versionCode, versionName, }: {
3
3
  versionName: string;
4
4
  versionCode: string;
5
5
  }): Promise<void>;
6
+ declare function checkVersionCodeIsTiedWithVersionName(versionName: string, versionCode: string): boolean;
7
+ declare function generateVersionCodeTiedWithVersionName(versionName: string): string;
6
8
 
7
- export { injectBinaryVersions, parseBinaryVersions };
9
+ export { checkVersionCodeIsTiedWithVersionName, generateVersionCodeTiedWithVersionName, injectBinaryVersions, parseBinaryVersions };
@@ -3,17 +3,16 @@ var package_default = {
3
3
  name: "expo-release-it",
4
4
  module: "src/index.ts",
5
5
  type: "module",
6
- version: "0.3.1",
6
+ version: "0.4.0",
7
7
  license: "MIT",
8
- homepage: "https://github.com/mym0404/expo-release-it",
8
+ homepage: "https://expo-release-it.mjstudio.net/",
9
9
  repository: "https://github.com/mym0404/expo-release-it",
10
10
  scripts: {
11
- build: "tsup",
12
- dev: "yarn run build && NODE_ENV=development node bin/expo-release-it.mjs",
13
- release: "yarn build && release-it",
14
- android: "expo run:android",
15
- ios: "expo run:ios",
16
- t: "tsc --noEmit -p ."
11
+ build: "pnpm build:json-schema-type && tsup",
12
+ "build:json-schema-type": "json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts",
13
+ dev: "pnpm build && NODE_ENV=development node bin/expo-release-it.mjs",
14
+ release: "pnpm build && pnpm run t && release-it",
15
+ t: "lefthook run check"
17
16
  },
18
17
  dependencies: {
19
18
  "@inquirer/prompts": "^7.4.1",
@@ -23,8 +22,8 @@ var package_default = {
23
22
  execa: "^9.5.2",
24
23
  "fs-extra": "^11.3.0",
25
24
  ora: "^8.2.0",
26
- react: "18.3.1",
27
- "react-native": "0.76.9",
25
+ react: "catalog:native",
26
+ "react-native": "catalog:native",
28
27
  semver: "^7.7.1",
29
28
  url: "^0.11.4"
30
29
  },
@@ -33,29 +32,29 @@ var package_default = {
33
32
  "@release-it/conventional-changelog": "^10.0.1",
34
33
  "@types/fs-extra": "^11.0.4",
35
34
  "@types/semver": "^7.7.0",
35
+ "json-schema-to-typescript": "^15.0.4",
36
36
  lefthook: "^1.11.11",
37
- prettier: "3.5.3",
37
+ prettier: "catalog:",
38
38
  "release-it": "^19.0.1",
39
39
  "tiny-glob": "^0.2.9",
40
40
  tsup: "^8.4.0",
41
- typescript: "^5.8.3"
41
+ typescript: "catalog:",
42
+ vitest: "^3.1.2"
42
43
  },
43
- workspaces: [
44
- "example"
45
- ],
46
44
  bin: "./bin/expo-release-it.mjs",
47
45
  files: [
48
46
  "build",
49
47
  "package.json",
50
48
  "bin",
51
- "template"
49
+ "template",
50
+ "expo-release-it.schema.json"
52
51
  ],
53
- packageManager: "yarn@4.9.1",
54
52
  commitlint: {
55
53
  extends: [
56
54
  "@commitlint/config-conventional"
57
55
  ]
58
- }
56
+ },
57
+ packageManager: "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
59
58
  };
60
59
 
61
60
  // src/util/FileUtil.ts
@@ -93,7 +92,9 @@ var OptionHolder = {
93
92
  rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
94
93
  templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
95
94
  },
96
- input: {},
95
+ input: {
96
+ git: {}
97
+ },
97
98
  keyholderMap: {},
98
99
  templateDirNames: ["key"],
99
100
  projectDir: "",
@@ -118,6 +119,11 @@ ${msg.join(", ")}`)),
118
119
  dim: (...msg) => console.log(chalk.dim(msg.join(", ")))
119
120
  };
120
121
 
122
+ // src/util/EnvUtil.ts
123
+ var isDev = process.env.NODE_ENV === "development";
124
+ var isWin = process.platform.startsWith("win");
125
+ var isTest = process.env.NODE_ENV === "test";
126
+
121
127
  // src/util/throwError.ts
122
128
  function throwError(message, e) {
123
129
  if (e) {
@@ -125,11 +131,15 @@ function throwError(message, e) {
125
131
  } else {
126
132
  logger.error(message);
127
133
  }
134
+ if (isTest) {
135
+ throw new Error("throwError");
136
+ }
128
137
  process.exit(1);
129
138
  }
130
139
 
131
140
  // src/util/setup/VersionUtil.ts
132
141
  import semver from "semver";
142
+ import { padZero } from "@mj-studio/js-util";
133
143
  var versionNameRegex = () => /const\s+VERSION_NAME\s*?=\s*?['"]([\d\.]*?)['"]\s*?;?/;
134
144
  var versionCodeRegex = () => /const\s+VERSION_CODE\s*?=\s*?(\d+)\s*?;?/;
135
145
  async function parseBinaryVersions() {
@@ -220,7 +230,23 @@ async function injectBinaryVersions({
220
230
  writeJson(filePath, json);
221
231
  }
222
232
  }
233
+ function checkVersionCodeIsTiedWithVersionName(versionName, versionCode) {
234
+ if (!semver.valid(versionName)) return false;
235
+ return generateVersionCodeTiedWithVersionName(versionName) === versionCode;
236
+ }
237
+ function generateVersionCodeTiedWithVersionName(versionName) {
238
+ if (!semver.valid(versionName))
239
+ throwError(
240
+ "Version Name is not a valid semver format when running `generateVersionCodeTiedWithVersionName`"
241
+ );
242
+ const major = semver.major(versionName);
243
+ const minor = semver.minor(versionName);
244
+ const patch = semver.patch(versionName);
245
+ return `${major}${padZero(minor, 3)}${padZero(patch, 3)}`;
246
+ }
223
247
  export {
248
+ checkVersionCodeIsTiedWithVersionName,
249
+ generateVersionCodeTiedWithVersionName,
224
250
  injectBinaryVersions,
225
251
  parseBinaryVersions
226
252
  };