expo-release-it 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/build/command/build.js +87 -54
- package/build/command/build.js.map +1 -1
- package/build/command/bump.js +6 -6
- package/build/command/bump.js.map +1 -1
- package/build/command/init.js +7 -7
- package/build/command/init.js.map +1 -1
- package/build/command/pull.js +88 -45
- package/build/command/pull.js.map +1 -1
- package/build/command/submit.js +83 -45
- package/build/command/submit.js.map +1 -1
- package/build/command/upload.js +83 -45
- package/build/command/upload.js.map +1 -1
- package/build/index.js +110 -70
- package/build/index.js.map +1 -1
- package/build/util/FastlaneOption.js +7 -6
- package/build/util/FastlaneOption.js.map +1 -1
- package/build/util/MetadataSyncUtil.d.ts +4 -0
- package/build/util/MetadataSyncUtil.js +140 -0
- package/build/util/MetadataSyncUtil.js.map +1 -0
- package/build/util/OptionHolder.d.ts +1 -1
- package/build/util/OptionHolder.js +2 -2
- package/build/util/OptionHolder.js.map +1 -1
- package/build/util/generateAppStoreConnectApiKeyFile.js +2 -2
- package/build/util/generateAppStoreConnectApiKeyFile.js.map +1 -1
- package/build/util/injectTemplatePlaceHolders.js +12 -21
- package/build/util/injectTemplatePlaceHolders.js.map +1 -1
- package/build/util/input/InqueryInputs.js +2 -2
- package/build/util/input/InqueryInputs.js.map +1 -1
- package/build/util/setup/VersionUtil.js +2 -2
- package/build/util/setup/VersionUtil.js.map +1 -1
- package/build/util/setup/hydrateKeyholderFileValues.js +2 -2
- package/build/util/setup/hydrateKeyholderFileValues.js.map +1 -1
- package/build/util/setup/prepareAndroid.js +41 -27
- package/build/util/setup/prepareAndroid.js.map +1 -1
- package/build/util/setup/prepareIos.js +46 -26
- package/build/util/setup/prepareIos.js.map +1 -1
- package/build/util/setup/setup.js +6 -6
- package/build/util/setup/setup.js.map +1 -1
- package/package.json +1 -1
- package/template/android/fastlane/Fastfile +2 -0
- package/template/android/fastlane/Appfile +0 -2
- package/template/android/fastlane/metadata/android/ko-KR/changelogs/default.txt +0 -1
- package/template/android/fastlane/metadata/android/ko-KR/full_description.txt +0 -0
- package/template/android/fastlane/metadata/android/ko-KR/short_description.txt +0 -0
- package/template/android/fastlane/metadata/android/ko-KR/title.txt +0 -0
- package/template/android/fastlane/metadata/android/ko-KR/video.txt +0 -0
- package/template/ios/fastlane/metadata/copyright.txt +0 -0
- package/template/ios/fastlane/metadata/ko/apple_tv_privacy_policy.txt +0 -0
- package/template/ios/fastlane/metadata/ko/description.txt +0 -0
- package/template/ios/fastlane/metadata/ko/keywords.txt +0 -0
- package/template/ios/fastlane/metadata/ko/marketing_url.txt +0 -0
- package/template/ios/fastlane/metadata/ko/name.txt +0 -0
- package/template/ios/fastlane/metadata/ko/privacy_url.txt +0 -0
- package/template/ios/fastlane/metadata/ko/promotional_text.txt +0 -0
- package/template/ios/fastlane/metadata/ko/release_notes.txt +0 -0
- package/template/ios/fastlane/metadata/ko/subtitle.txt +0 -0
- package/template/ios/fastlane/metadata/ko/support_url.txt +0 -0
- package/template/ios/fastlane/metadata/primary_category.txt +0 -0
- package/template/ios/fastlane/metadata/primary_first_sub_category.txt +0 -1
- package/template/ios/fastlane/metadata/primary_second_sub_category.txt +0 -1
- package/template/ios/fastlane/metadata/review_information/demo_password.txt +0 -0
- package/template/ios/fastlane/metadata/review_information/demo_user.txt +0 -0
- package/template/ios/fastlane/metadata/review_information/email_address.txt +0 -0
- package/template/ios/fastlane/metadata/review_information/first_name.txt +0 -0
- package/template/ios/fastlane/metadata/review_information/last_name.txt +0 -0
- package/template/ios/fastlane/metadata/review_information/notes.txt +0 -1
- package/template/ios/fastlane/metadata/review_information/phone_number.txt +0 -0
- package/template/ios/fastlane/metadata/secondary_category.txt +0 -1
- package/template/ios/fastlane/metadata/secondary_first_sub_category.txt +0 -1
- package/template/ios/fastlane/metadata/secondary_second_sub_category.txt +0 -1
- package/template/ios/fastlane/screenshots/README.txt +0 -30
package/build/command/submit.js
CHANGED
|
@@ -3,7 +3,7 @@ var package_default = {
|
|
|
3
3
|
name: "expo-release-it",
|
|
4
4
|
module: "src/index.ts",
|
|
5
5
|
type: "module",
|
|
6
|
-
version: "0.1.
|
|
6
|
+
version: "0.1.2",
|
|
7
7
|
license: "MIT",
|
|
8
8
|
scripts: {
|
|
9
9
|
build: "tsup",
|
|
@@ -53,26 +53,26 @@ import fs from "fs-extra";
|
|
|
53
53
|
import * as path from "path";
|
|
54
54
|
var join2 = path.join;
|
|
55
55
|
var resolve2 = path.resolve;
|
|
56
|
-
function exist(
|
|
57
|
-
return fs.existsSync(
|
|
56
|
+
function exist(path2) {
|
|
57
|
+
return fs.existsSync(path2);
|
|
58
58
|
}
|
|
59
|
-
function isDir(
|
|
60
|
-
return exist(
|
|
59
|
+
function isDir(path2) {
|
|
60
|
+
return exist(path2) && fs.lstatSync(path2).isDirectory();
|
|
61
61
|
}
|
|
62
62
|
function relativePath(from, to) {
|
|
63
63
|
return path.relative(from, to);
|
|
64
64
|
}
|
|
65
|
-
function isFile(
|
|
66
|
-
return exist(
|
|
65
|
+
function isFile(path2) {
|
|
66
|
+
return exist(path2) && fs.lstatSync(path2).isFile();
|
|
67
67
|
}
|
|
68
|
-
function read(
|
|
69
|
-
return fs.readFileSync(
|
|
68
|
+
function read(path2) {
|
|
69
|
+
return fs.readFileSync(path2, { encoding: "utf8" });
|
|
70
70
|
}
|
|
71
|
-
function readdir(
|
|
72
|
-
return fs.readdirSync(
|
|
71
|
+
function readdir(path2) {
|
|
72
|
+
return fs.readdirSync(path2);
|
|
73
73
|
}
|
|
74
|
-
function readJsonSlow(
|
|
75
|
-
return fs.readJSONSync(
|
|
74
|
+
function readJsonSlow(path2) {
|
|
75
|
+
return fs.readJSONSync(path2);
|
|
76
76
|
}
|
|
77
77
|
function write(p, content) {
|
|
78
78
|
const dir = path.dirname(p);
|
|
@@ -84,21 +84,21 @@ function write(p, content) {
|
|
|
84
84
|
function copy(src, dest, options) {
|
|
85
85
|
fs.copySync(src, dest, options);
|
|
86
86
|
}
|
|
87
|
-
function remove(
|
|
88
|
-
if (!exist(
|
|
87
|
+
function remove(path2) {
|
|
88
|
+
if (!exist(path2)) {
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
|
-
if (fs.lstatSync(
|
|
92
|
-
return fs.rmSync(
|
|
91
|
+
if (fs.lstatSync(path2).isDirectory()) {
|
|
92
|
+
return fs.rmSync(path2, { force: true, recursive: true });
|
|
93
93
|
} else {
|
|
94
|
-
return fs.rmSync(
|
|
94
|
+
return fs.rmSync(path2, { force: true });
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
async function iterateDir(
|
|
98
|
-
if (!isDir(
|
|
97
|
+
async function iterateDir(path2, fn) {
|
|
98
|
+
if (!isDir(path2)) {
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
|
-
for (const file of fs.readdirSync(
|
|
101
|
+
for (const file of fs.readdirSync(path2)) {
|
|
102
102
|
await fn(file);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -115,7 +115,7 @@ var OptionHolder = {
|
|
|
115
115
|
keyholderMap: {},
|
|
116
116
|
templateDirNames: ["key"],
|
|
117
117
|
projectDir: "",
|
|
118
|
-
|
|
118
|
+
resourcesDir: "",
|
|
119
119
|
keyDir: "",
|
|
120
120
|
keyholderFilePath: "",
|
|
121
121
|
versionName: "",
|
|
@@ -222,14 +222,14 @@ async function setup() {
|
|
|
222
222
|
}
|
|
223
223
|
async function setupBasicOptions() {
|
|
224
224
|
OptionHolder.projectDir = isDev ? resolve2("example") : resolve2(".");
|
|
225
|
-
OptionHolder.
|
|
226
|
-
OptionHolder.keyDir = resolve2(OptionHolder.
|
|
227
|
-
OptionHolder.keyholderFilePath = resolve2(OptionHolder.
|
|
228
|
-
OptionHolder.tempDir = resolve2(OptionHolder.
|
|
225
|
+
OptionHolder.resourcesDir = resolve2(OptionHolder.projectDir, "expo-release-it");
|
|
226
|
+
OptionHolder.keyDir = resolve2(OptionHolder.resourcesDir, "key");
|
|
227
|
+
OptionHolder.keyholderFilePath = resolve2(OptionHolder.resourcesDir, "keyholder.json");
|
|
228
|
+
OptionHolder.tempDir = resolve2(OptionHolder.resourcesDir, ".temp");
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
// src/command/submit.ts
|
|
232
|
-
import
|
|
232
|
+
import chalk5 from "chalk";
|
|
233
233
|
|
|
234
234
|
// src/util/calculateElapsed.ts
|
|
235
235
|
import { padZero } from "@mj-studio/js-util";
|
|
@@ -256,18 +256,12 @@ async function iterateAllFiles(root, callback) {
|
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
// src/util/injectTemplatePlaceHolders.ts
|
|
259
|
-
import * as path2 from "node:path";
|
|
260
259
|
async function injectTemplatePlaceHolders(root) {
|
|
261
260
|
await iterateAllFiles(root, async (filePath) => {
|
|
262
|
-
const dirPath = path2.dirname(filePath);
|
|
263
261
|
let content = read(filePath);
|
|
264
262
|
for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {
|
|
265
263
|
content = content.replaceAll(`{{${key}}}`, value);
|
|
266
264
|
}
|
|
267
|
-
content = content.replaceAll(
|
|
268
|
-
"{{key_dir_relative_path}}",
|
|
269
|
-
relativePath(dirPath, OptionHolder.keyDir)
|
|
270
|
-
);
|
|
271
265
|
write(filePath, content);
|
|
272
266
|
});
|
|
273
267
|
}
|
|
@@ -298,6 +292,47 @@ var yesShell = (command, args = [], options) => {
|
|
|
298
292
|
return subProcess;
|
|
299
293
|
};
|
|
300
294
|
|
|
295
|
+
// src/util/MetadataSyncUtil.ts
|
|
296
|
+
import chalk3 from "chalk";
|
|
297
|
+
function copyIosMetadata(to) {
|
|
298
|
+
const iosDir = join2(OptionHolder.projectDir, "ios");
|
|
299
|
+
const nativeDir = join2(iosDir, "fastlane");
|
|
300
|
+
const metadataNativeDir = join2(nativeDir, "metadata");
|
|
301
|
+
const screenshotsNativeDir = join2(nativeDir, "screenshots");
|
|
302
|
+
const resourcesDir = join2(OptionHolder.resourcesDir, "metadata/ios");
|
|
303
|
+
const metadataResourcesDir = join2(resourcesDir, "metadata");
|
|
304
|
+
const screenshotsResourcesDir = join2(resourcesDir, "screenshots");
|
|
305
|
+
if (to === "resources") {
|
|
306
|
+
copy(metadataNativeDir, metadataResourcesDir);
|
|
307
|
+
copy(screenshotsNativeDir, screenshotsResourcesDir);
|
|
308
|
+
logger.done(
|
|
309
|
+
`iOS Metadata saved in ${chalk3.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`
|
|
310
|
+
);
|
|
311
|
+
} else {
|
|
312
|
+
copy(metadataResourcesDir, metadataNativeDir);
|
|
313
|
+
copy(screenshotsResourcesDir, screenshotsNativeDir);
|
|
314
|
+
logger.done(
|
|
315
|
+
`iOS Metadata copyed to ${chalk3.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function copyAndroidMetadata(to) {
|
|
320
|
+
const androidDir = join2(OptionHolder.projectDir, "android");
|
|
321
|
+
const nativeDir = join2(androidDir, "fastlane/metadata/android");
|
|
322
|
+
const resourcesDir = join2(OptionHolder.resourcesDir, "metadata/android");
|
|
323
|
+
if (to === "resouces") {
|
|
324
|
+
copy(nativeDir, resourcesDir);
|
|
325
|
+
logger.done(
|
|
326
|
+
`Android Metadata saved in ${chalk3.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`
|
|
327
|
+
);
|
|
328
|
+
} else {
|
|
329
|
+
copy(resourcesDir, nativeDir);
|
|
330
|
+
logger.done(
|
|
331
|
+
`Android Metadata copyed to ${chalk3.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
301
336
|
// src/util/setup/prepareAndroid.ts
|
|
302
337
|
async function prepareAndroid() {
|
|
303
338
|
const srcDir = resolve2(OptionHolder.cli.templateDir, "android");
|
|
@@ -321,6 +356,7 @@ async function prepareAndroid() {
|
|
|
321
356
|
);
|
|
322
357
|
await exe({ cwd: destDir })`bundle install`;
|
|
323
358
|
logger.success("Bunder Install - Done");
|
|
359
|
+
copyAndroidMetadata("native");
|
|
324
360
|
}
|
|
325
361
|
async function replaceAndroidSigningConfig(destDir) {
|
|
326
362
|
const buildGradleDirPath = resolve2(destDir, "app");
|
|
@@ -335,7 +371,7 @@ async function replaceAndroidSigningConfig(destDir) {
|
|
|
335
371
|
`
|
|
336
372
|
signingConfigs {
|
|
337
373
|
debug {
|
|
338
|
-
storeFile file('${relativePath(buildGradleDirPath, resolve2(OptionHolder.
|
|
374
|
+
storeFile file('${relativePath(buildGradleDirPath, resolve2(OptionHolder.resourcesDir, "key", "android_release_keystore.jks"))}')
|
|
339
375
|
storePassword '${android_keystore_store_password}'
|
|
340
376
|
keyAlias '${android_keystore_key_alias}'
|
|
341
377
|
keyPassword '${android_keystore_key_password}'
|
|
@@ -368,12 +404,13 @@ async function prepareIos() {
|
|
|
368
404
|
);
|
|
369
405
|
await exe({ cwd: destDir })`bundle install`;
|
|
370
406
|
logger.success("Bunder Install - Done");
|
|
407
|
+
copyIosMetadata("native");
|
|
371
408
|
}
|
|
372
409
|
|
|
373
410
|
// src/util/input/InqueryInputs.ts
|
|
374
411
|
import { select } from "@inquirer/prompts";
|
|
375
412
|
import { is } from "@mj-studio/js-util";
|
|
376
|
-
import
|
|
413
|
+
import chalk4 from "chalk";
|
|
377
414
|
var InqueryInputs = {
|
|
378
415
|
platform: async () => {
|
|
379
416
|
if (!OptionHolder.input.platform) {
|
|
@@ -437,19 +474,19 @@ function constructInquirerFormattedMessage({
|
|
|
437
474
|
referUrl,
|
|
438
475
|
name
|
|
439
476
|
}) {
|
|
440
|
-
let ret = `${
|
|
477
|
+
let ret = `${chalk4.bold(name)}`;
|
|
441
478
|
if (explanation) {
|
|
442
479
|
ret += `
|
|
443
480
|
|
|
444
|
-
${
|
|
481
|
+
${chalk4.italic.blue(explanation)}`;
|
|
445
482
|
}
|
|
446
483
|
if (example) {
|
|
447
484
|
ret += `
|
|
448
|
-
${
|
|
485
|
+
${chalk4.italic(`${chalk4.greenBright("example :")} ${example}`)}`;
|
|
449
486
|
}
|
|
450
487
|
if (referUrl) {
|
|
451
488
|
ret += `
|
|
452
|
-
${
|
|
489
|
+
${chalk4.italic(`${chalk4.greenBright("references :")} ${chalk4.underline.blue(referUrl)}`)}`;
|
|
453
490
|
}
|
|
454
491
|
if (explanation) {
|
|
455
492
|
ret += "\n";
|
|
@@ -464,11 +501,12 @@ ${chalk3.italic(`${chalk3.greenBright("references :")} ${chalk3.underline.blue(r
|
|
|
464
501
|
function getAndroidFastlaneOptions() {
|
|
465
502
|
return [
|
|
466
503
|
...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),
|
|
504
|
+
`json_key:${resolve2(OptionHolder.keyDir, "android_play_console_service_account.json")}`,
|
|
467
505
|
`version_name:${OptionHolder.versionName}`,
|
|
468
506
|
`version_code:${OptionHolder.versionCode}`,
|
|
469
507
|
`upload_metadata:${OptionHolder.input.uploadMetadata}`,
|
|
470
|
-
`aab_path:${resolve2(OptionHolder.
|
|
471
|
-
`apk_path:${resolve2(OptionHolder.
|
|
508
|
+
`aab_path:${resolve2(OptionHolder.resourcesDir, "output", "android", "aab", "app-release.aab")}`,
|
|
509
|
+
`apk_path:${resolve2(OptionHolder.resourcesDir, "output", "android", "apk", "app-release.apk")}`,
|
|
472
510
|
`skip_upload_apk:${OptionHolder.input.androidOutput !== "apk"}`,
|
|
473
511
|
`skip_upload_aab:${OptionHolder.input.androidOutput !== "aab"}`
|
|
474
512
|
];
|
|
@@ -480,8 +518,8 @@ function getIosFastlaneOptions() {
|
|
|
480
518
|
`version_code:${OptionHolder.versionCode}`,
|
|
481
519
|
`api_key_filepath:${resolve2(OptionHolder.keyDir, "ios_testflight_upload_api_key.p8")}`,
|
|
482
520
|
`upload_metadata:${OptionHolder.input.uploadMetadata}`,
|
|
483
|
-
`ipa_path:${resolve2(OptionHolder.
|
|
484
|
-
`ipa_dir:${resolve2(OptionHolder.
|
|
521
|
+
`ipa_path:${resolve2(OptionHolder.resourcesDir, "output", "ios", "app.ipa")}`,
|
|
522
|
+
`ipa_dir:${resolve2(OptionHolder.resourcesDir, "output", "ios")}`,
|
|
485
523
|
`ipa_name:app.ipa`
|
|
486
524
|
];
|
|
487
525
|
}
|
|
@@ -496,10 +534,10 @@ async function submit({ options }) {
|
|
|
496
534
|
logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);
|
|
497
535
|
if (OptionHolder.input.platform === "ios") {
|
|
498
536
|
await submitIos();
|
|
499
|
-
logger.success(`Appstore Review Submitted ${
|
|
537
|
+
logger.success(`Appstore Review Submitted ${chalk5.bold.inverse(calculateElapsed(startTime))}`);
|
|
500
538
|
} else {
|
|
501
539
|
await submitAndroid();
|
|
502
|
-
logger.success(`Playstore Review Submitted ${
|
|
540
|
+
logger.success(`Playstore Review Submitted ${chalk5.bold.inverse(calculateElapsed(startTime))}`);
|
|
503
541
|
}
|
|
504
542
|
}
|
|
505
543
|
async function promptInputs() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/logger.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/EnvUtil.ts","../../src/util/setup/setup.ts","../../src/command/submit.ts","../../src/util/calculateElapsed.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/setup/execShellScript.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/setup/prepareIos.ts","../../src/util/input/InqueryInputs.ts","../../src/util/FastlaneOption.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.1.1\",\n \"license\": \"MIT\",\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 \"@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}\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 androidOutput: 'apk' | 'aab';\n pod: 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 outputOfInitDir: 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 outputOfInitDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n","import { OptionHolder } from '../OptionHolder';\nimport { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { 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","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\n\nexport async function setup() {\n await setupBasicOptions();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.outputOfInitDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.outputOfInitDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.outputOfInitDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.outputOfInitDir, '.temp');\n}\n","import { setup } from '../util/setup/setup';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { remove, resolve } from '../util/FileUtil';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { getIosFastlaneOptions, getAndroidFastlaneOptions } from '../util/FastlaneOption';\nimport { exe } from '../util/setup/execShellScript';\n\nexport async function submit({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Submit Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.input.platform === 'ios') {\n await submitIos();\n logger.success(`Appstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await submitAndroid();\n logger.success(`Playstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n await InqueryInputs.platform();\n await InqueryInputs.uploadMetadata();\n}\n\nasync function submitAndroid() {\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await exe({\n cwd: resolve(OptionHolder.projectDir, 'android'),\n })`bundle exec fastlane sumbit ${getIosFastlaneOptions()}`;\n }\n}\nasync function submitIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await exe({\n cwd: iosDir,\n })`bundle exec fastlane submit ${getAndroidFastlaneOptions()}`;\n }\n}\n","import { padZero } from '@mj-studio/js-util';\n\nexport function calculateElapsed(t: number) {\n let seconds = Math.floor((Date.now() - t) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n return `${minutes}:${padZero(seconds)}`;\n}\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, relativePath, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport * as path from 'node:path';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n const dirPath = path.dirname(filePath);\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n // dynamic replacements\n content = content.replaceAll(\n '{{key_dir_relative_path}}',\n relativePath(dirPath, OptionHolder.keyDir),\n );\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe({ cwd: destDir })`bundle install`;\n logger.success('Bunder Install - Done');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.outputOfInitDir, 'key', 'android_release_keystore.jks'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe({ cwd: destDir })`bundle install`;\n logger.success('Bunder Install - Done');\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 Metadata(screenshot, 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};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve } from './FileUtil';\n\nexport function getAndroidFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `aab_path:${resolve(OptionHolder.outputOfInitDir, 'output', 'android', 'aab', 'app-release.aab')}`,\n `apk_path:${resolve(OptionHolder.outputOfInitDir, 'output', 'android', 'apk', 'app-release.apk')}`,\n `skip_upload_apk:${OptionHolder.input.androidOutput !== 'apk'}`,\n `skip_upload_aab:${OptionHolder.input.androidOutput !== 'aab'}`,\n ];\n}\n\nexport function getIosFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `api_key_filepath:${resolve(OptionHolder.keyDir, 'ios_testflight_upload_api_key.p8')}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `ipa_path:${resolve(OptionHolder.outputOfInitDir, 'output', 'ios', 'app.ipa')}`,\n `ipa_dir:${resolve(OptionHolder.outputOfInitDir, 'output', 'ios')}`,\n `ipa_name:app.ipa`,\n ];\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","resolve","resolve","chalk","join","path","chalk","resolve","resolve","chalk","resolve","chalk","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../package.json","../../src/util/FileUtil.ts","../../src/util/OptionHolder.ts","../../src/util/setup/hydrateKeyholderFileValues.ts","../../src/util/logger.ts","../../src/util/throwError.ts","../../src/util/setup/VersionUtil.ts","../../src/util/EnvUtil.ts","../../src/util/setup/setup.ts","../../src/command/submit.ts","../../src/util/calculateElapsed.ts","../../src/util/iterateAllFiles.ts","../../src/util/injectTemplatePlaceHolders.ts","../../src/util/spinner.ts","../../src/util/setup/execShellScript.ts","../../src/util/MetadataSyncUtil.ts","../../src/util/setup/prepareAndroid.ts","../../src/util/setup/prepareIos.ts","../../src/util/input/InqueryInputs.ts","../../src/util/FastlaneOption.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"module\": \"src/index.ts\",\n \"type\": \"module\",\n \"version\": \"0.1.2\",\n \"license\": \"MIT\",\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 \"@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}\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 androidOutput: 'apk' | 'aab';\n pod: 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 { readJsonSlow, exist } from '../FileUtil';\n\nexport async function hydrateKeyholderFileValues() {\n if (exist(OptionHolder.keyholderFilePath)) {\n Object.assign(OptionHolder.keyholderMap, readJsonSlow(OptionHolder.keyholderFilePath));\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n success: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')}`)),\n done: (...msg: any[]) => console.log(chalk.green(`✔ ${msg.join(', ')} - Done`)),\n error: (...msg: any[]) => console.log(chalk.red(`✖ ${msg.join(', ')}`)),\n warn: (...msg: any[]) => console.log(chalk.yellow(`⚠ ${msg.join(', ')}`)),\n info: (...msg: any[]) => console.log(chalk.cyan(`ℹ ${msg.join(', ')}`)),\n title: (...msg: any[]) => console.log(chalk.bold.blue(`\\n${msg.join(', ')}`)),\n dim: (...msg: any[]) => console.log(chalk.dim(msg.join(', '))),\n};\n","import { 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","export const isDev = process.env.NODE_ENV === 'development';\nexport const isWin = process.platform.startsWith('win');\n","import { hydrateKeyholderFileValues } from './hydrateKeyholderFileValues';\nimport { parseBinaryVersions } from './VersionUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { isDev } from '../EnvUtil';\nimport { resolve } from '../FileUtil';\n\nexport async function setup() {\n await setupBasicOptions();\n await hydrateKeyholderFileValues();\n await parseBinaryVersions();\n}\n\nexport async function setupBasicOptions() {\n OptionHolder.projectDir = isDev ? resolve('example') : resolve('.');\n OptionHolder.resourcesDir = resolve(OptionHolder.projectDir, 'expo-release-it');\n OptionHolder.keyDir = resolve(OptionHolder.resourcesDir, 'key');\n OptionHolder.keyholderFilePath = resolve(OptionHolder.resourcesDir, 'keyholder.json');\n OptionHolder.tempDir = resolve(OptionHolder.resourcesDir, '.temp');\n}\n","import { setup } from '../util/setup/setup';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport chalk from 'chalk';\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { prepareAndroid } from '../util/setup/prepareAndroid';\nimport { remove, resolve } from '../util/FileUtil';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { getIosFastlaneOptions, getAndroidFastlaneOptions } from '../util/FastlaneOption';\nimport { exe } from '../util/setup/execShellScript';\n\nexport async function submit({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n const startTime = Date.now();\n await setup();\n await promptInputs();\n\n logger.info('Submit Started');\n logger.info(`Version: ${OptionHolder.versionName}(${OptionHolder.versionCode})`);\n\n if (OptionHolder.input.platform === 'ios') {\n await submitIos();\n logger.success(`Appstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n } else {\n await submitAndroid();\n logger.success(`Playstore Review Submitted ${chalk.bold.inverse(calculateElapsed(startTime))}`);\n }\n}\n\nasync function promptInputs() {\n await InqueryInputs.platform();\n await InqueryInputs.uploadMetadata();\n}\n\nasync function submitAndroid() {\n await prepareAndroid();\n await fastlane();\n\n async function fastlane() {\n await exe({\n cwd: resolve(OptionHolder.projectDir, 'android'),\n })`bundle exec fastlane sumbit ${getIosFastlaneOptions()}`;\n }\n}\nasync function submitIos() {\n const iosDir = resolve(OptionHolder.projectDir, 'ios');\n await prepareIos();\n await fastlane();\n\n async function fastlane() {\n remove(resolve(iosDir, '.xcode.env.local'));\n\n await exe({\n cwd: iosDir,\n })`bundle exec fastlane submit ${getAndroidFastlaneOptions()}`;\n }\n}\n","import { padZero } from '@mj-studio/js-util';\n\nexport function calculateElapsed(t: number) {\n let seconds = Math.floor((Date.now() - t) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n return `${minutes}:${padZero(seconds)}`;\n}\n","import { readdir, isFile, isDir, join } from './FileUtil';\n\nexport async function iterateAllFiles(root: string, callback: (filePath: string) => Promise<void>) {\n await go(root);\n\n async function go(dirPath: string) {\n const paths = readdir(dirPath).map((f) => join(dirPath, f));\n\n for (const p of paths) {\n if (isFile(p)) {\n await callback(p);\n } else if (isDir(p)) {\n await go(p);\n }\n }\n }\n}\n","import { iterateAllFiles } from './iterateAllFiles';\nimport { read, write } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\n\nexport async function injectTemplatePlaceHolders(root: string) {\n await iterateAllFiles(root, async (filePath: string) => {\n let content = read(filePath);\n for (const [key, value] of Object.entries(OptionHolder.keyholderMap)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n write(filePath, content);\n });\n}\n","import { oraPromise } from 'ora';\nimport chalk from 'chalk';\n\nexport async function spinner<T>(text: string, promise: Promise<T>): Promise<T> {\n return oraPromise(promise, {\n text,\n successText: chalk.green(`${text} - Done`),\n failText: chalk.red(`${text} - Failed`),\n });\n}\n","import { execa, type Options } from 'execa';\n\nexport const exe = execa({\n stdin: 'pipe',\n stdout: 'inherit',\n stderr: 'inherit',\n shell: false,\n});\n\nexport const yesShell = <OptionsType extends Options>(\n command: string,\n args: string[] = [],\n options: OptionsType,\n) => {\n const subProcess = exe(command, args, { ...options, stdin: 'pipe' });\n subProcess.stdin?.write('y\\n');\n subProcess.stdin?.end();\n return subProcess;\n};\n","import { join, relativePath, copy } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport { logger } from './logger';\nimport chalk from 'chalk';\n\nexport function copyIosMetadata(to: 'resources' | 'native') {\n const iosDir = join(OptionHolder.projectDir, 'ios');\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n}\n\nexport function copyAndroidMetadata(to: 'resouces' | 'native') {\n const androidDir = join(OptionHolder.projectDir, 'android');\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resouces') {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n}\n","import { resolve, remove, iterateDir, copy, read, write, relativePath } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyAndroidMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareAndroid() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'android');\n const destDir = resolve(OptionHolder.projectDir, 'android');\n\n await yesShell('expo', ['prebuild', '-p', 'android', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject Templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner('Overwrite Android Release Signing Config', replaceAndroidSigningConfig(destDir));\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe({ cwd: destDir })`bundle install`;\n logger.success('Bunder Install - Done');\n\n copyAndroidMetadata('native');\n}\n\nasync function replaceAndroidSigningConfig(destDir: string) {\n const buildGradleDirPath = resolve(destDir, 'app');\n const buildGradlePath = resolve(destDir, 'app', 'build.gradle');\n const {\n android_keystore_store_password,\n android_keystore_key_alias,\n android_keystore_key_password,\n } = OptionHolder.keyholderMap;\n\n const content = read(buildGradlePath).replace(\n /signingConfigs.*?{.*?debug.*?{.*?}.*?}/s,\n `\n signingConfigs {\n debug {\n storeFile file('${relativePath(buildGradleDirPath, resolve(OptionHolder.resourcesDir, 'key', 'android_release_keystore.jks'))}')\n storePassword '${android_keystore_store_password}'\n keyAlias '${android_keystore_key_alias}'\n keyPassword '${android_keystore_key_password}'\n }\n }\n `,\n );\n write(buildGradlePath, content);\n}\n","import { remove, resolve, iterateDir, copy } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { injectTemplatePlaceHolders } from '../injectTemplatePlaceHolders';\nimport { spinner } from '../spinner';\nimport { exe, yesShell } from './execShellScript';\nimport { logger } from '../logger';\nimport { copyIosMetadata } from '../MetadataSyncUtil';\n\nexport async function prepareIos() {\n const srcDir = resolve(OptionHolder.cli.templateDir, 'ios');\n const destDir = resolve(OptionHolder.projectDir, 'ios');\n\n await yesShell('expo', ['prebuild', '-p', 'ios', '--no-install'], {\n cwd: OptionHolder.projectDir,\n });\n logger.success('Expo Prebuild - Done');\n\n await spinner(\n 'Inject templates',\n iterateDir(srcDir, async (file) => {\n const filePath = resolve(srcDir, file);\n remove(resolve(destDir, file));\n copy(filePath, resolve(destDir, file));\n }),\n );\n\n await spinner(\n 'Hydrate template placeholders',\n injectTemplatePlaceHolders(resolve(destDir, 'fastlane')),\n );\n\n await exe({ cwd: destDir })`bundle install`;\n logger.success('Bunder Install - Done');\n\n copyIosMetadata('native');\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 Metadata(screenshot, 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};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n","import { OptionHolder } from './OptionHolder';\nimport { resolve } from './FileUtil';\n\nexport function getAndroidFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `json_key:${resolve(OptionHolder.keyDir, 'android_play_console_service_account.json')}`,\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `aab_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'aab', 'app-release.aab')}`,\n `apk_path:${resolve(OptionHolder.resourcesDir, 'output', 'android', 'apk', 'app-release.apk')}`,\n `skip_upload_apk:${OptionHolder.input.androidOutput !== 'apk'}`,\n `skip_upload_aab:${OptionHolder.input.androidOutput !== 'aab'}`,\n ];\n}\n\nexport function getIosFastlaneOptions() {\n return [\n ...Object.entries(OptionHolder.keyholderMap).map(([k, v]) => `${k}:${v}`),\n `version_name:${OptionHolder.versionName}`,\n `version_code:${OptionHolder.versionCode}`,\n `api_key_filepath:${resolve(OptionHolder.keyDir, 'ios_testflight_upload_api_key.p8')}`,\n `upload_metadata:${OptionHolder.input.uploadMetadata}`,\n `ipa_path:${resolve(OptionHolder.resourcesDir, 'output', 'ios', 'app.ipa')}`,\n `ipa_dir:${resolve(OptionHolder.resourcesDir, 'output', 'ios')}`,\n `ipa_name:app.ipa`,\n ];\n}\n"],"mappings":"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","names":["join","resolve","path","path","resolve","resolve","resolve","chalk","join","chalk","chalk","join","resolve","resolve","chalk","resolve","chalk","resolve"]}
|