expo-release-it 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/bin/expo-release-it.mjs +3 -1
  2. package/build/command/build.d.ts +10 -0
  3. package/build/command/build.js +422 -69
  4. package/build/command/build.js.map +1 -0
  5. package/build/command/bump.d.ts +6 -0
  6. package/build/command/bump.js +291 -32
  7. package/build/command/bump.js.map +1 -0
  8. package/build/command/init.d.ts +6 -0
  9. package/build/command/init.js +334 -92
  10. package/build/command/init.js.map +1 -0
  11. package/build/command/submit.d.ts +8 -0
  12. package/build/command/submit.js +376 -56
  13. package/build/command/submit.js.map +1 -0
  14. package/build/command/upload.d.ts +8 -0
  15. package/build/command/upload.js +379 -57
  16. package/build/command/upload.js.map +1 -0
  17. package/build/index.d.ts +3 -0
  18. package/build/index.js +670 -53
  19. package/build/index.js.map +1 -0
  20. package/build/util/EnvUtil.d.ts +4 -0
  21. package/build/util/EnvUtil.js +8 -2
  22. package/build/util/EnvUtil.js.map +1 -0
  23. package/build/util/FileUtil.d.ts +18 -0
  24. package/build/util/FileUtil.js +73 -55
  25. package/build/util/FileUtil.js.map +1 -0
  26. package/build/util/OptionHolder.d.ts +50 -0
  27. package/build/util/OptionHolder.js +83 -28
  28. package/build/util/OptionHolder.js.map +1 -0
  29. package/build/util/VersionUtil.d.ts +7 -0
  30. package/build/util/VersionUtil.js +217 -80
  31. package/build/util/VersionUtil.js.map +1 -0
  32. package/build/util/calculateElapsed.d.ts +3 -0
  33. package/build/util/calculateElapsed.js +11 -6
  34. package/build/util/calculateElapsed.js.map +1 -0
  35. package/build/util/hydrateKeyholderFileValues.d.ts +3 -0
  36. package/build/util/hydrateKeyholderFileValues.js +91 -4
  37. package/build/util/hydrateKeyholderFileValues.js.map +1 -0
  38. package/build/util/iterateAllFilesInGeneratedTemplate.d.ts +3 -0
  39. package/build/util/iterateAllFilesInGeneratedTemplate.js +112 -16
  40. package/build/util/iterateAllFilesInGeneratedTemplate.js.map +1 -0
  41. package/build/util/logger.d.ts +10 -0
  42. package/build/util/logger.js +15 -0
  43. package/build/util/logger.js.map +1 -0
  44. package/build/util/setup/prepareAndroid.d.ts +3 -0
  45. package/build/util/setup/prepareAndroid.js +170 -26
  46. package/build/util/setup/prepareAndroid.js.map +1 -0
  47. package/build/util/setup/prepareIos.d.ts +3 -0
  48. package/build/util/setup/prepareIos.js +143 -16
  49. package/build/util/setup/prepareIos.js.map +1 -0
  50. package/build/util/setup/promptCommonInputs.d.ts +3 -0
  51. package/build/util/setup/promptCommonInputs.js +113 -21
  52. package/build/util/setup/promptCommonInputs.js.map +1 -0
  53. package/build/util/setup/setup.d.ts +3 -0
  54. package/build/util/setup/setup.js +213 -7
  55. package/build/util/setup/setup.js.map +1 -0
  56. package/build/util/throwError.d.ts +3 -0
  57. package/build/util/throwError.js +24 -9
  58. package/build/util/throwError.js.map +1 -0
  59. package/package.json +5 -3
  60. package/build/command/release.js +0 -86
  61. package/build/util/EnvironmentPreparationUtil.js +0 -41
  62. package/build/util/Log.js +0 -9
  63. package/build/util/Logger.js +0 -9
  64. package/build/util/logutil.js +0 -9
  65. package/build/util/parseBinaryVersion.js +0 -59
  66. package/build/util/pathfinder.js +0 -5
  67. package/build/util/prepareAndroid.js +0 -34
  68. package/build/util/prepareIos.js +0 -17
  69. package/build/util/promptCommonInputs.js +0 -27
  70. package/build/util/setup.js +0 -8
@@ -1,89 +1,226 @@
1
- import { OptionHolder } from './OptionHolder';
2
- import { throwError } from './throwError';
3
- import semver from 'semver';
4
- import { readdir, read, readJsonSlow, write, writeJson, resolve } from './FileUtil';
5
- export async function parseBinaryVersions() {
6
- const files = readdir(OptionHolder.rootDir);
7
- const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];
8
- const jsonConfigFile = 'app.json';
9
- for (const jsConfigFile of jsConfigFiles) {
10
- if (files.includes(jsConfigFile)) {
11
- await parseFromJsConfigFile(jsConfigFile);
12
- return;
13
- }
1
+ // package.json
2
+ var package_default = {
3
+ name: "expo-release-it",
4
+ module: "src/index.ts",
5
+ type: "module",
6
+ version: "0.0.12",
7
+ license: "MIT",
8
+ scripts: {
9
+ build: "tsup",
10
+ dev: "bun run build && NODE_ENV=development node bin/expo-release-it.mjs",
11
+ release: "yarn build && release-it",
12
+ android: "expo run:android",
13
+ ios: "expo run:ios",
14
+ t: "tsc --noEmit -p ."
15
+ },
16
+ dependencies: {
17
+ "@inquirer/prompts": "^7.4.1",
18
+ "@mj-studio/js-util": "^1.1.20",
19
+ chalk: "^5.4.1",
20
+ commander: "^13.1.0",
21
+ "fs-extra": "^11.3.0",
22
+ react: "18.3.1",
23
+ "react-native": "0.76.9",
24
+ semver: "^7.7.1",
25
+ url: "^0.11.4",
26
+ zx: "^8.5.3"
27
+ },
28
+ devDependencies: {
29
+ "@types/bun": "latest",
30
+ "@types/fs-extra": "^11.0.4",
31
+ "@types/semver": "^7.7.0",
32
+ prettier: "3.5.3",
33
+ "release-it": "^19.0.1",
34
+ "tiny-glob": "^0.2.9",
35
+ tsup: "^8.4.0",
36
+ typescript: "^5.8.3"
37
+ },
38
+ workspaces: [
39
+ "example"
40
+ ],
41
+ bin: "./bin/expo-release-it.mjs",
42
+ files: [
43
+ "build",
44
+ "package.json",
45
+ "bin",
46
+ "template"
47
+ ],
48
+ packageManager: "yarn@4.9.1"
49
+ };
50
+
51
+ // src/util/FileUtil.ts
52
+ import fs from "fs-extra";
53
+ import * as path from "path";
54
+ var resolve2 = path.resolve;
55
+ function exist(path2) {
56
+ return fs.existsSync(path2);
57
+ }
58
+ function read(path2) {
59
+ return fs.readFileSync(path2, { encoding: "utf8" });
60
+ }
61
+ function readdir(path2) {
62
+ return fs.readdirSync(path2);
63
+ }
64
+ function readJsonSlow(path2) {
65
+ return fs.readJSONSync(path2);
66
+ }
67
+ function write(p, content) {
68
+ const dir = path.dirname(p);
69
+ if (!exist(dir)) {
70
+ fs.mkdirSync(dir, { recursive: true });
71
+ }
72
+ return fs.writeFileSync(p, content);
73
+ }
74
+ function writeJson(path2, json) {
75
+ return write(path2, JSON.stringify(json, null, 2));
76
+ }
77
+
78
+ // src/util/OptionHolder.ts
79
+ import { fileURLToPath } from "url";
80
+ var OptionHolder = {
81
+ cli: {
82
+ version: package_default.version,
83
+ rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
84
+ templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
85
+ },
86
+ init: {},
87
+ bump: {},
88
+ build: {},
89
+ upload: {},
90
+ submit: {},
91
+ templateValuePlaceholderMap: {},
92
+ keyholderFileValueMap: {},
93
+ templateDirNames: ["fastlane-android", "fastlane-ios", "key"],
94
+ iosBundleIdentifier: "",
95
+ androidPackageName: "",
96
+ projectDir: "",
97
+ outputOfInitDir: "",
98
+ keyDir: "",
99
+ keyholderFilePath: "",
100
+ versionName: "",
101
+ versionCode: ""
102
+ };
103
+
104
+ // src/util/logger.ts
105
+ import chalk from "chalk";
106
+ var logger = {
107
+ success: (...msg) => console.log(chalk.green(`\u2714 ${msg.join(", ")}`)),
108
+ error: (...msg) => console.log(chalk.red(`\u2716 ${msg.join(", ")}`)),
109
+ warn: (...msg) => console.log(chalk.yellow(`\u26A0 ${msg.join(", ")}`)),
110
+ info: (...msg) => console.log(chalk.cyan(`\u2139 ${msg.join(", ")}`)),
111
+ title: (...msg) => console.log(chalk.bold.blue(`
112
+ ${msg.join(", ")}`)),
113
+ dim: (...msg) => console.log(chalk.dim(msg.join(", ")))
114
+ };
115
+
116
+ // src/util/throwError.ts
117
+ function throwError(message, e) {
118
+ if (e) {
119
+ logger.error(message, e);
120
+ } else {
121
+ logger.error(message);
122
+ }
123
+ process.exit(1);
124
+ }
125
+
126
+ // src/util/VersionUtil.ts
127
+ import semver from "semver";
128
+ async function parseBinaryVersions() {
129
+ const files = readdir(OptionHolder.projectDir);
130
+ const jsConfigFiles = ["app.config.ts", "app.config.js", "app.config.cjs", "app.config.mjs"];
131
+ const jsonConfigFile = "app.json";
132
+ for (const jsConfigFile of jsConfigFiles) {
133
+ if (files.includes(jsConfigFile)) {
134
+ await parseFromJsConfigFile(jsConfigFile);
135
+ return;
14
136
  }
15
- if (files.includes(jsonConfigFile)) {
16
- await parseFromJsonConfigFile(jsonConfigFile);
17
- return;
137
+ }
138
+ if (files.includes(jsonConfigFile)) {
139
+ await parseFromJsonConfigFile(jsonConfigFile);
140
+ return;
141
+ }
142
+ throwError("expo config file not found");
143
+ async function parseFromJsConfigFile(filename) {
144
+ const filePath = resolve2(OptionHolder.projectDir, filename);
145
+ const content = read(filePath);
146
+ const VERSION_NAME = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];
147
+ const VERSION_CODE = /const VERSION_CODE = (.*?);/.exec(content)?.[1];
148
+ if (!VERSION_NAME) {
149
+ throwError("cannot parse version name");
18
150
  }
19
- throwError('expo config file not found');
20
- async function parseFromJsConfigFile(filename) {
21
- const filePath = resolve(OptionHolder.rootDir, filename);
22
- const content = read(filePath);
23
- const VERSION_NAME = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];
24
- const VERSION_CODE = /const VERSION_CODE = (.*?);/.exec(content)?.[1];
25
- if (!VERSION_NAME) {
26
- throwError('cannot parse version name');
27
- }
28
- if (!VERSION_CODE) {
29
- throwError('cannot parse version code');
30
- }
31
- if (!semver.valid(VERSION_NAME)) {
32
- throwError('VERSION_NAME is not a valid semver format');
33
- }
34
- OptionHolder.versionName = VERSION_NAME;
35
- OptionHolder.versionCode = VERSION_CODE;
151
+ if (!VERSION_CODE) {
152
+ throwError("cannot parse version code");
36
153
  }
37
- async function parseFromJsonConfigFile(filename) {
38
- const filePath = resolve(OptionHolder.rootDir, filename);
39
- const json = readJsonSlow(filePath);
40
- const versionName = json.expo?.version + '';
41
- const iosVersionCode = json.expo?.ios?.buildNumber + '';
42
- const androidVersionCode = json.expo?.android?.versionCode + '';
43
- if (!/\d+/.test(iosVersionCode)) {
44
- throwError('app.json expo.ios.buildNumber is not an integer');
45
- }
46
- if (!/\d+/.test(androidVersionCode)) {
47
- throwError('app.json expo.android.versionCode is not an integer');
48
- }
49
- if (iosVersionCode !== androidVersionCode) {
50
- throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');
51
- }
52
- if (!semver.valid(versionName)) {
53
- throwError('VERSION_NAME is not a valid semver format');
54
- }
55
- OptionHolder.versionName = versionName;
56
- OptionHolder.versionCode = iosVersionCode;
154
+ if (!semver.valid(VERSION_NAME)) {
155
+ throwError("VERSION_NAME is not a valid semver format");
57
156
  }
58
- }
59
- export async function injectBinaryVersions({ versionCode, versionName, }) {
60
- const files = readdir(OptionHolder.rootDir);
61
- const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];
62
- const jsonConfigFile = 'app.json';
63
- for (const jsConfigFile of jsConfigFiles) {
64
- if (files.includes(jsConfigFile)) {
65
- await injectToJsConfigFile(jsConfigFile);
66
- return;
67
- }
157
+ OptionHolder.versionName = VERSION_NAME;
158
+ OptionHolder.versionCode = VERSION_CODE;
159
+ }
160
+ async function parseFromJsonConfigFile(filename) {
161
+ const filePath = resolve2(OptionHolder.projectDir, filename);
162
+ const json = readJsonSlow(filePath);
163
+ const versionName = json.expo?.version + "";
164
+ const iosVersionCode = json.expo?.ios?.buildNumber + "";
165
+ const androidVersionCode = json.expo?.android?.versionCode + "";
166
+ if (!/\d+/.test(iosVersionCode)) {
167
+ throwError("app.json expo.ios.buildNumber is not an integer");
68
168
  }
69
- if (files.includes(jsonConfigFile)) {
70
- await injectToJsonConfigFile(jsonConfigFile);
71
- return;
169
+ if (!/\d+/.test(androidVersionCode)) {
170
+ throwError("app.json expo.android.versionCode is not an integer");
72
171
  }
73
- throwError('expo config file not found');
74
- async function injectToJsConfigFile(filename) {
75
- const filePath = resolve(OptionHolder.rootDir, filename);
76
- let content = read(filePath);
77
- content = content.replace(/const VERSION_NAME = '(.*?)';/, `const VERSION_NAME = '${versionName}';`);
78
- content = content.replace(/const VERSION_CODE = (.*?);/, `const VERSION_CODE = ${versionCode};`);
79
- write(filePath, content);
172
+ if (iosVersionCode !== androidVersionCode) {
173
+ throwError("app.json expo.ios.buildNumber is not equal with expo.android.versionCode");
80
174
  }
81
- async function injectToJsonConfigFile(filename) {
82
- const filePath = resolve(OptionHolder.rootDir, filename);
83
- const json = readJsonSlow(filePath);
84
- json.expo.version = versionName;
85
- json.expo.ios.buildNumber = versionCode;
86
- json.expo.android.versionCode = +versionCode;
87
- writeJson(filePath, json);
175
+ if (!semver.valid(versionName)) {
176
+ throwError("VERSION_NAME is not a valid semver format");
177
+ }
178
+ OptionHolder.versionName = versionName;
179
+ OptionHolder.versionCode = iosVersionCode;
180
+ }
181
+ }
182
+ async function injectBinaryVersions({
183
+ versionCode,
184
+ versionName
185
+ }) {
186
+ const files = readdir(OptionHolder.projectDir);
187
+ const jsConfigFiles = ["app.config.ts", "app.config.js", "app.config.cjs", "app.config.mjs"];
188
+ const jsonConfigFile = "app.json";
189
+ for (const jsConfigFile of jsConfigFiles) {
190
+ if (files.includes(jsConfigFile)) {
191
+ await injectToJsConfigFile(jsConfigFile);
192
+ return;
88
193
  }
194
+ }
195
+ if (files.includes(jsonConfigFile)) {
196
+ await injectToJsonConfigFile(jsonConfigFile);
197
+ return;
198
+ }
199
+ throwError("expo config file not found");
200
+ async function injectToJsConfigFile(filename) {
201
+ const filePath = resolve2(OptionHolder.projectDir, filename);
202
+ let content = read(filePath);
203
+ content = content.replace(
204
+ /const VERSION_NAME = '(.*?)';/,
205
+ `const VERSION_NAME = '${versionName}';`
206
+ );
207
+ content = content.replace(
208
+ /const VERSION_CODE = (.*?);/,
209
+ `const VERSION_CODE = ${versionCode};`
210
+ );
211
+ write(filePath, content);
212
+ }
213
+ async function injectToJsonConfigFile(filename) {
214
+ const filePath = resolve2(OptionHolder.projectDir, filename);
215
+ const json = readJsonSlow(filePath);
216
+ json.expo.version = versionName;
217
+ json.expo.ios.buildNumber = versionCode;
218
+ json.expo.android.versionCode = +versionCode;
219
+ writeJson(filePath, json);
220
+ }
89
221
  }
222
+ export {
223
+ injectBinaryVersions,
224
+ parseBinaryVersions
225
+ };
226
+ //# sourceMappingURL=VersionUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/logger.ts","../../src/util/throwError.ts","../../src/util/VersionUtil.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.12\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { logger } from './logger';\n\nexport function throwError(message: string, e?: any): never {\n if (e) {\n logger.error(message, e);\n } else {\n logger.error(message);\n }\n process.exit(1);\n}\n","import { OptionHolder } from './OptionHolder';\nimport { throwError } from './throwError';\nimport semver from 'semver';\nimport { readdir, read, readJsonSlow, write, writeJson, resolve } from './FileUtil';\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = /const VERSION_NAME = '(.*?)';/.exec(content)?.[1];\n const VERSION_CODE = /const VERSION_CODE = (.*?);/.exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = json.expo?.version + '';\n const iosVersionCode = json.expo?.ios?.buildNumber + '';\n const androidVersionCode = json.expo?.android?.versionCode + '';\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(\n /const VERSION_NAME = '(.*?)';/,\n `const VERSION_NAME = '${versionName}';`,\n );\n content = content.replace(\n /const VERSION_CODE = (.*?);/,\n `const VERSION_CODE = ${versionCode};`,\n );\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n"],"mappings":"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","names":["resolve","path","path","path","resolve","resolve"]}
@@ -0,0 +1,3 @@
1
+ declare function calculateElapsed(t: number): string;
2
+
3
+ export { calculateElapsed };
@@ -1,7 +1,12 @@
1
- import { padZero } from '@mj-studio/js-util';
2
- export function calculateElapsed(t) {
3
- let seconds = Math.floor((Date.now() - t) / 1000);
4
- const minutes = Math.floor(seconds / 60);
5
- seconds = seconds % 60;
6
- return `${minutes}:${padZero(seconds)}`;
1
+ // src/util/calculateElapsed.ts
2
+ import { padZero } from "@mj-studio/js-util";
3
+ function calculateElapsed(t) {
4
+ let seconds = Math.floor((Date.now() - t) / 1e3);
5
+ const minutes = Math.floor(seconds / 60);
6
+ seconds = seconds % 60;
7
+ return `${minutes}:${padZero(seconds)}`;
7
8
  }
9
+ export {
10
+ calculateElapsed
11
+ };
12
+ //# sourceMappingURL=calculateElapsed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/calculateElapsed.ts"],"sourcesContent":["import { padZero } from '@mj-studio/js-util';\n\nexport function calculateElapsed(t: number) {\n let seconds = Math.floor((Date.now() - t) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n return `${minutes}:${padZero(seconds)}`;\n}\n"],"mappings":";AAAA,SAAS,eAAe;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,IAAI,QAAQ,OAAO,CAAC;AACvC;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function hydrateKeyholderFileValues(): Promise<void>;
2
+
3
+ export { hydrateKeyholderFileValues };
@@ -1,5 +1,92 @@
1
- import { OptionHolder } from './OptionHolder';
2
- import { readJsonSlow } from './FileUtil';
3
- export async function hydrateKeyholderFileValues() {
4
- Object.assign(OptionHolder.keyholderFileValueMap, readJsonSlow(OptionHolder.keyholderFilePath));
1
+ // package.json
2
+ var package_default = {
3
+ name: "expo-release-it",
4
+ module: "src/index.ts",
5
+ type: "module",
6
+ version: "0.0.12",
7
+ license: "MIT",
8
+ scripts: {
9
+ build: "tsup",
10
+ dev: "bun run build && NODE_ENV=development node bin/expo-release-it.mjs",
11
+ release: "yarn build && release-it",
12
+ android: "expo run:android",
13
+ ios: "expo run:ios",
14
+ t: "tsc --noEmit -p ."
15
+ },
16
+ dependencies: {
17
+ "@inquirer/prompts": "^7.4.1",
18
+ "@mj-studio/js-util": "^1.1.20",
19
+ chalk: "^5.4.1",
20
+ commander: "^13.1.0",
21
+ "fs-extra": "^11.3.0",
22
+ react: "18.3.1",
23
+ "react-native": "0.76.9",
24
+ semver: "^7.7.1",
25
+ url: "^0.11.4",
26
+ zx: "^8.5.3"
27
+ },
28
+ devDependencies: {
29
+ "@types/bun": "latest",
30
+ "@types/fs-extra": "^11.0.4",
31
+ "@types/semver": "^7.7.0",
32
+ prettier: "3.5.3",
33
+ "release-it": "^19.0.1",
34
+ "tiny-glob": "^0.2.9",
35
+ tsup: "^8.4.0",
36
+ typescript: "^5.8.3"
37
+ },
38
+ workspaces: [
39
+ "example"
40
+ ],
41
+ bin: "./bin/expo-release-it.mjs",
42
+ files: [
43
+ "build",
44
+ "package.json",
45
+ "bin",
46
+ "template"
47
+ ],
48
+ packageManager: "yarn@4.9.1"
49
+ };
50
+
51
+ // src/util/FileUtil.ts
52
+ import fs from "fs-extra";
53
+ import * as path from "path";
54
+ var resolve2 = path.resolve;
55
+ function readJsonSlow(path2) {
56
+ return fs.readJSONSync(path2);
5
57
  }
58
+
59
+ // src/util/OptionHolder.ts
60
+ import { fileURLToPath } from "url";
61
+ var OptionHolder = {
62
+ cli: {
63
+ version: package_default.version,
64
+ rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
65
+ templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
66
+ },
67
+ init: {},
68
+ bump: {},
69
+ build: {},
70
+ upload: {},
71
+ submit: {},
72
+ templateValuePlaceholderMap: {},
73
+ keyholderFileValueMap: {},
74
+ templateDirNames: ["fastlane-android", "fastlane-ios", "key"],
75
+ iosBundleIdentifier: "",
76
+ androidPackageName: "",
77
+ projectDir: "",
78
+ outputOfInitDir: "",
79
+ keyDir: "",
80
+ keyholderFilePath: "",
81
+ versionName: "",
82
+ versionCode: ""
83
+ };
84
+
85
+ // src/util/hydrateKeyholderFileValues.ts
86
+ async function hydrateKeyholderFileValues() {
87
+ Object.assign(OptionHolder.keyholderFileValueMap, readJsonSlow(OptionHolder.keyholderFilePath));
88
+ }
89
+ export {
90
+ hydrateKeyholderFileValues
91
+ };
92
+ //# sourceMappingURL=hydrateKeyholderFileValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/hydrateKeyholderFileValues.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.12\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n","import { OptionHolder } from './OptionHolder';\nimport { readJsonSlow } from './FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n Object.assign(OptionHolder.keyholderFileValueMap, readJsonSlow(OptionHolder.keyholderFilePath));\n}\n"],"mappings":";AAAA;AAAA,EACE,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,SAAW;AAAA,IACX,SAAW;AAAA,IACX,KAAO;AAAA,IACP,GAAK;AAAA,EACP;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAU;AAAA,IACV,KAAO;AAAA,IACP,IAAM;AAAA,EACR;AAAA,EACA,iBAAmB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;AC/CA,OAAO,QAAQ;AACf,YAAY,UAAU;AAGf,IAAMA,WAAe;AA2BrB,SAAS,aAAaC,OAAc;AACzC,SAAO,GAAG,aAAaA,KAAI;AAC7B;;;AC1BA,SAAS,qBAAqB;AAMvB,IAAM,eA4CT;AAAA,EACF,KAAK;AAAA,IACH,SAAS,gBAAQ;AAAA,IACjB,SAASC,SAAQ,cAAc,YAAY,GAAG,GAAG,OAAO;AAAA,IACxD,aAAaA,SAAQ,cAAc,YAAY,GAAG,GAAG,gBAAgB;AAAA,EACvE;AAAA,EACA,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC;AAAA,EACT,6BAA6B,CAAC;AAAA,EAC9B,uBAAuB,CAAC;AAAA,EACxB,kBAAkB,CAAC,oBAAoB,gBAAgB,KAAK;AAAA,EAC5D,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AACf;;;AC5EA,eAAsB,6BAA6B;AACjD,SAAO,OAAO,aAAa,uBAAuB,aAAa,aAAa,iBAAiB,CAAC;AAChG;","names":["resolve","path","resolve"]}
@@ -0,0 +1,3 @@
1
+ declare function iterateAllFilesInGeneratedTemplate(callback: (filePath: string) => Promise<void>): Promise<void>;
2
+
3
+ export { iterateAllFilesInGeneratedTemplate };
@@ -1,18 +1,114 @@
1
- import { OptionHolder } from './OptionHolder';
2
- import { readdir, isFile, isDir, join } from './FileUtil';
3
- export async function iterateAllFilesInGeneratedTemplate(callback) {
4
- for (const dir of OptionHolder.templateDirNames) {
5
- await go(join(OptionHolder.outDir, dir));
6
- }
7
- async function go(dirPath) {
8
- const paths = readdir(dirPath).map((f) => join(dirPath, f));
9
- for (const p of paths) {
10
- if (isFile(p)) {
11
- await callback(p);
12
- }
13
- else if (isDir(p)) {
14
- await go(p);
15
- }
16
- }
1
+ // package.json
2
+ var package_default = {
3
+ name: "expo-release-it",
4
+ module: "src/index.ts",
5
+ type: "module",
6
+ version: "0.0.12",
7
+ license: "MIT",
8
+ scripts: {
9
+ build: "tsup",
10
+ dev: "bun run build && NODE_ENV=development node bin/expo-release-it.mjs",
11
+ release: "yarn build && release-it",
12
+ android: "expo run:android",
13
+ ios: "expo run:ios",
14
+ t: "tsc --noEmit -p ."
15
+ },
16
+ dependencies: {
17
+ "@inquirer/prompts": "^7.4.1",
18
+ "@mj-studio/js-util": "^1.1.20",
19
+ chalk: "^5.4.1",
20
+ commander: "^13.1.0",
21
+ "fs-extra": "^11.3.0",
22
+ react: "18.3.1",
23
+ "react-native": "0.76.9",
24
+ semver: "^7.7.1",
25
+ url: "^0.11.4",
26
+ zx: "^8.5.3"
27
+ },
28
+ devDependencies: {
29
+ "@types/bun": "latest",
30
+ "@types/fs-extra": "^11.0.4",
31
+ "@types/semver": "^7.7.0",
32
+ prettier: "3.5.3",
33
+ "release-it": "^19.0.1",
34
+ "tiny-glob": "^0.2.9",
35
+ tsup: "^8.4.0",
36
+ typescript: "^5.8.3"
37
+ },
38
+ workspaces: [
39
+ "example"
40
+ ],
41
+ bin: "./bin/expo-release-it.mjs",
42
+ files: [
43
+ "build",
44
+ "package.json",
45
+ "bin",
46
+ "template"
47
+ ],
48
+ packageManager: "yarn@4.9.1"
49
+ };
50
+
51
+ // src/util/FileUtil.ts
52
+ import fs from "fs-extra";
53
+ import * as path from "path";
54
+ var join2 = path.join;
55
+ var resolve2 = path.resolve;
56
+ function exist(path2) {
57
+ return fs.existsSync(path2);
58
+ }
59
+ function isDir(path2) {
60
+ return exist(path2) && fs.lstatSync(path2).isDirectory();
61
+ }
62
+ function isFile(path2) {
63
+ return exist(path2) && fs.lstatSync(path2).isFile();
64
+ }
65
+ function readdir(path2) {
66
+ return fs.readdirSync(path2);
67
+ }
68
+
69
+ // src/util/OptionHolder.ts
70
+ import { fileURLToPath } from "url";
71
+ var OptionHolder = {
72
+ cli: {
73
+ version: package_default.version,
74
+ rootDir: resolve2(fileURLToPath(import.meta.url), "../.."),
75
+ templateDir: resolve2(fileURLToPath(import.meta.url), "../../template")
76
+ },
77
+ init: {},
78
+ bump: {},
79
+ build: {},
80
+ upload: {},
81
+ submit: {},
82
+ templateValuePlaceholderMap: {},
83
+ keyholderFileValueMap: {},
84
+ templateDirNames: ["fastlane-android", "fastlane-ios", "key"],
85
+ iosBundleIdentifier: "",
86
+ androidPackageName: "",
87
+ projectDir: "",
88
+ outputOfInitDir: "",
89
+ keyDir: "",
90
+ keyholderFilePath: "",
91
+ versionName: "",
92
+ versionCode: ""
93
+ };
94
+
95
+ // src/util/iterateAllFilesInGeneratedTemplate.ts
96
+ async function iterateAllFilesInGeneratedTemplate(callback) {
97
+ for (const dir of OptionHolder.templateDirNames) {
98
+ await go(join2(OptionHolder.outputOfInitDir, dir));
99
+ }
100
+ async function go(dirPath) {
101
+ const paths = readdir(dirPath).map((f) => join2(dirPath, f));
102
+ for (const p of paths) {
103
+ if (isFile(p)) {
104
+ await callback(p);
105
+ } else if (isDir(p)) {
106
+ await go(p);
107
+ }
17
108
  }
109
+ }
18
110
  }
111
+ export {
112
+ iterateAllFilesInGeneratedTemplate
113
+ };
114
+ //# sourceMappingURL=iterateAllFilesInGeneratedTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/iterateAllFilesInGeneratedTemplate.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.0.12\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"bun run build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"yarn build && release-it\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"t\": \"tsc --noEmit -p .\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.4.1\",\n \"@mj-studio/js-util\": \"^1.1.20\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"fs-extra\": \"^11.3.0\",\n \"react\": \"18.3.1\",\n \"react-native\": \"0.76.9\",\n \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\",\n \"zx\": \"^8.5.3\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"prettier\": \"3.5.3\",\n \"release-it\": \"^19.0.1\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"workspaces\": [\n \"example\"\n ],\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\"\n ],\n \"packageManager\": \"yarn@4.9.1\"\n}\n","import fs from 'fs-extra';\nimport * as path from 'path';\n\nexport const join = path.join;\nexport const resolve = path.resolve;\n\nexport function exist(path: string) {\n return fs.existsSync(path);\n}\n\nexport function isDir(path: string) {\n return exist(path) && fs.lstatSync(path).isDirectory();\n}\n\nexport function relativePath(from: string, to: string) {\n return path.relative(from, to);\n}\n\nexport function isFile(path: string) {\n return exist(path) && fs.lstatSync(path).isFile();\n}\n\nexport function read(path: string) {\n return fs.readFileSync(path, { encoding: 'utf8' });\n}\n\nexport function readdir(path: string) {\n return fs.readdirSync(path);\n}\n\n// you should require when possible(optimized in js)\nexport function readJsonSlow(path: string) {\n return fs.readJSONSync(path);\n}\n\nexport function write(p: string, content: string) {\n const dir = path.dirname(p);\n if (!exist(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return fs.writeFileSync(p, content);\n}\nexport function copy(src: string, dest: string, options?: fs.CopyOptionsSync) {\n fs.copySync(src, dest, options);\n}\n\nexport function writeJson(path: string, json: any) {\n return write(path, JSON.stringify(json, null, 2));\n}\n\nexport function remove(path: string) {\n if (!exist(path)) {\n return;\n }\n\n if (fs.lstatSync(path).isDirectory()) {\n return fs.rmSync(path, { force: true, recursive: true });\n } else {\n return fs.rmSync(path, { force: true });\n }\n}\n\nexport async function iterateDir(path: string, fn: (file: string) => Promise<void> | void) {\n if (!isDir(path)) {\n return;\n }\n\n for (const file of fs.readdirSync(path)) {\n await fn(file);\n }\n}\n","import pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\nimport type { BuildOptions } from '../command/build';\nimport type { InitOptions } from '../command/init';\nimport type { BumpOptions } from '../command/bump';\nimport type { SubmitOptions } from '../command/submit';\nimport type { UploadOptions } from '../command/upload';\nimport { fileURLToPath } from 'url';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n init: InitOptions;\n bump: BumpOptions;\n build: BuildOptions;\n upload: UploadOptions;\n submit: SubmitOptions;\n\n templateValuePlaceholderMap: {\n ios_app_identifier: string;\n ios_app_store_connect_team_id: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_xcode_project_target: string;\n android_package_name: string;\n key_dir_relative_path: string;\n };\n keyholderFileValueMap: {\n android_keystore_store_password: string;\n android_keystore_key_alias: string;\n android_keystore_key_password: string;\n ios_match_password: string;\n };\n iosBundleIdentifier: string;\n androidPackageName: string;\n templateDirNames: string[];\n // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n outputOfInitDir: string;\n keyDir: string;\n keyholderFilePath: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n init: {} as any,\n bump: {} as any,\n build: {} as any,\n upload: {} as any,\n submit: {} as any,\n templateValuePlaceholderMap: {} as any,\n keyholderFileValueMap: {} as any,\n templateDirNames: ['fastlane-android', 'fastlane-ios', 'key'],\n iosBundleIdentifier: '',\n androidPackageName: '',\n projectDir: '',\n outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n};\n","import { OptionHolder } from './OptionHolder';\nimport { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFilesInGeneratedTemplate(\n callback: (filePath: string) => Promise<void>,\n) {\n for (const dir of OptionHolder.templateDirNames) {\n await go(join(OptionHolder.outputOfInitDir, dir));\n }\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n"],"mappings":";AAAA;AAAA,EACE,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,SAAW;AAAA,IACX,SAAW;AAAA,IACX,KAAO;AAAA,IACP,GAAK;AAAA,EACP;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAU;AAAA,IACV,KAAO;AAAA,IACP,IAAM;AAAA,EACR;AAAA,EACA,iBAAmB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;AC/CA,OAAO,QAAQ;AACf,YAAY,UAAU;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;AAMO,SAAS,OAAOC,OAAc;AACnC,SAAO,MAAMA,KAAI,KAAK,GAAG,UAAUA,KAAI,EAAE,OAAO;AAClD;AAMO,SAAS,QAAQC,OAAc;AACpC,SAAO,GAAG,YAAYA,KAAI;AAC5B;;;ACrBA,SAAS,qBAAqB;AAMvB,IAAM,eA4CT;AAAA,EACF,KAAK;AAAA,IACH,SAAS,gBAAQ;AAAA,IACjB,SAASC,SAAQ,cAAc,YAAY,GAAG,GAAG,OAAO;AAAA,IACxD,aAAaA,SAAQ,cAAc,YAAY,GAAG,GAAG,gBAAgB;AAAA,EACvE;AAAA,EACA,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC;AAAA,EACT,6BAA6B,CAAC;AAAA,EAC9B,uBAAuB,CAAC;AAAA,EACxB,kBAAkB,CAAC,oBAAoB,gBAAgB,KAAK;AAAA,EAC5D,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AACf;;;AC5EA,eAAsB,mCACpB,UACA;AACA,aAAW,OAAO,aAAa,kBAAkB;AAC/C,UAAM,GAAGC,MAAK,aAAa,iBAAiB,GAAG,CAAC;AAAA,EAClD;AAEA,iBAAe,GAAG,SAAiB;AACjC,UAAM,QAAQ,QAAQ,OAAO,EAAE,IAAI,CAAC,MAAMA,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;","names":["join","resolve","path","path","path","resolve","join"]}