expo-release-it 1.0.1 → 1.0.2
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/build/{CredentialVault-dRFh9J19.js → CredentialVault-f3Q-GQiW.js} +3 -3
- package/build/{CredentialVault-dRFh9J19.js.map → CredentialVault-f3Q-GQiW.js.map} +1 -1
- package/build/{FastlaneOption-BmbTdRFX.js → FastlaneOption-DTV-RPG_.js} +3 -3
- package/build/{FastlaneOption-BmbTdRFX.js.map → FastlaneOption-DTV-RPG_.js.map} +1 -1
- package/build/{InqueryInputs-DC-uZQGJ.js → InqueryInputs-CQCIPjvq.js} +2 -2
- package/build/{InqueryInputs-DC-uZQGJ.js.map → InqueryInputs-CQCIPjvq.js.map} +1 -1
- package/build/{MetadataSyncUtil-DL8wei5I.js → MetadataSyncUtil-DSi5YMM1.js} +3 -3
- package/build/{MetadataSyncUtil-DL8wei5I.js.map → MetadataSyncUtil-DSi5YMM1.js.map} +1 -1
- package/build/{NativeEnvironment-CSSqKt4G.js → NativeEnvironment-oSy4DL9W.js} +4 -4
- package/build/{NativeEnvironment-CSSqKt4G.js.map → NativeEnvironment-oSy4DL9W.js.map} +1 -1
- package/build/{OptionHolder-CETgJidz.js → OptionHolder-Ci01mA57.js} +2 -2
- package/build/{OptionHolder-CETgJidz.js.map → OptionHolder-Ci01mA57.js.map} +1 -1
- package/build/{RubyEnvironment-D07WuLyt.js → RubyEnvironment-BUsGpWfG.js} +5 -5
- package/build/{RubyEnvironment-D07WuLyt.js.map → RubyEnvironment-BUsGpWfG.js.map} +1 -1
- package/build/{VersionUtil-DY_lgbBq.js → VersionUtil-DJcMTY2B.js} +3 -3
- package/build/{VersionUtil-DY_lgbBq.js.map → VersionUtil-DJcMTY2B.js.map} +1 -1
- package/build/{build-BlJ8ttI8.js → build-Dl9olKkk.js} +12 -12
- package/build/{build-BlJ8ttI8.js.map → build-Dl9olKkk.js.map} +1 -1
- package/build/{bump-CJfojbNh.js → bump-DKVq38lK.js} +8 -8
- package/build/{bump-CJfojbNh.js.map → bump-DKVq38lK.js.map} +1 -1
- package/build/command/build.js +17 -17
- package/build/command/bump.js +10 -10
- package/build/command/init.js +9 -9
- package/build/command/pull.js +14 -14
- package/build/command/submit.js +14 -14
- package/build/command/upload.js +14 -14
- package/build/{execShellScript-C76sWy2u.js → execShellScript-B6HHcv77.js} +3 -3
- package/build/{execShellScript-C76sWy2u.js.map → execShellScript-B6HHcv77.js.map} +1 -1
- package/build/{generateAppStoreConnectApiKeyFile-BsrnIeTT.js → generateAppStoreConnectApiKeyFile-JftlEOVB.js} +3 -3
- package/build/{generateAppStoreConnectApiKeyFile-BsrnIeTT.js.map → generateAppStoreConnectApiKeyFile-JftlEOVB.js.map} +1 -1
- package/build/index.js +23 -23
- package/build/{init-DdNLSJTQ.js → init-BElBKnwN.js} +6 -6
- package/build/{init-DdNLSJTQ.js.map → init-BElBKnwN.js.map} +1 -1
- package/build/{logger-DzRyyX4i.js → logger-BY1_5Qm4.js} +2 -2
- package/build/{logger-DzRyyX4i.js.map → logger-BY1_5Qm4.js.map} +1 -1
- package/build/{parseConfigFile-Bz59F3bt.js → parseConfigFile-N2627e-u.js} +2 -2
- package/build/{parseConfigFile-Bz59F3bt.js.map → parseConfigFile-N2627e-u.js.map} +1 -1
- package/build/{prepareAndroid-DXJ29rCp.js → prepareAndroid-BV53rhQ3.js} +3 -3
- package/build/{prepareAndroid-DXJ29rCp.js.map → prepareAndroid-BV53rhQ3.js.map} +1 -1
- package/build/{prepareFastlane-akP0u0fl.js → prepareFastlane-7Zg3N5Fy.js} +4 -4
- package/build/{prepareFastlane-akP0u0fl.js.map → prepareFastlane-7Zg3N5Fy.js.map} +1 -1
- package/build/{prepareIos-CVI_Azja.js → prepareIos-Cigqnhe8.js} +3 -3
- package/build/{prepareIos-CVI_Azja.js.map → prepareIos-Cigqnhe8.js.map} +1 -1
- package/build/{pull-DimLyvZB.js → pull-B1FwsQ16.js} +8 -8
- package/build/{pull-DimLyvZB.js.map → pull-B1FwsQ16.js.map} +1 -1
- package/build/{setup-CZvmOOKR.js → setup-ChAxYljZ.js} +5 -5
- package/build/{setup-CZvmOOKR.js.map → setup-ChAxYljZ.js.map} +1 -1
- package/build/{submit-DHRAs83M.js → submit-CPQB-EF-.js} +7 -7
- package/build/{submit-DHRAs83M.js.map → submit-CPQB-EF-.js.map} +1 -1
- package/build/{throwError-C3OkeVgt.js → throwError-CagLBtkh.js} +2 -2
- package/build/{throwError-C3OkeVgt.js.map → throwError-CagLBtkh.js.map} +1 -1
- package/build/{upload-Di-m5Olv.js → upload-BwMMiyA5.js} +7 -7
- package/build/{upload-Di-m5Olv.js.map → upload-BwMMiyA5.js.map} +1 -1
- package/build/util/CredentialVault.js +3 -3
- package/build/util/FastlaneOption.js +4 -4
- package/build/util/MetadataSyncUtil.js +3 -3
- package/build/util/OptionHolder.js +1 -1
- package/build/util/generateAppStoreConnectApiKeyFile.js +4 -4
- package/build/util/injectTemplatePlaceHolders.js +1 -1
- package/build/util/input/InqueryInputs.js +2 -2
- package/build/util/logger.js +2 -2
- package/build/util/parseConfigFile.js +2 -2
- package/build/util/setup/NativeEnvironment.js +5 -5
- package/build/util/setup/RubyEnvironment.js +5 -5
- package/build/util/setup/VersionUtil.js +4 -4
- package/build/util/setup/execShellScript.js +4 -4
- package/build/util/setup/prepareAndroid.js +4 -4
- package/build/util/setup/prepareFastlane.js +7 -7
- package/build/util/setup/prepareIos.js +4 -4
- package/build/util/setup/setup.js +7 -7
- package/build/util/throwError.js +3 -3
- package/package.json +1 -1
- package/template/ios/fastlane/Fastfile +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
2
|
-
import { logger, registerSecrets } from "./logger-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
|
+
import { logger, registerSecrets } from "./logger-BY1_5Qm4.js";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from "node:crypto";
|
|
5
5
|
import { appendFileSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, renameSync, rmSync, rmdirSync, writeFileSync } from "node:fs";
|
|
@@ -294,4 +294,4 @@ function terminateCredentials() {
|
|
|
294
294
|
|
|
295
295
|
//#endregion
|
|
296
296
|
export { appStoreApiFilename, cleanupCredentials, credentialFilenames, credentialKeyPath, credentialProcessEnvironment, credentialVaultFilename, encryptionKeyEnvironment, getEncryptionKey, loadRuntimeCredentials, readCredentialFile, readCredentialVault, readLegacyCredentials, warnPlaintextCredentials, writeCredentialTemporaryFile, writeCredentialVault };
|
|
297
|
-
//# sourceMappingURL=CredentialVault-
|
|
297
|
+
//# sourceMappingURL=CredentialVault-f3Q-GQiW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialVault-dRFh9J19.js","names":["activeFiles: Record<string, string> | undefined","temporaryDirectory: string | undefined","value: unknown","length?: number","key: string","derived: Buffer | undefined","envelope: unknown","data: CredentialData","originals: string[]","keyholder: unknown","directory: string","file: string","encoded: string","entries: string[]","environment: NodeJS.ProcessEnv","name: string","contents: Buffer"],"sources":["../src/util/CredentialVault.ts"],"sourcesContent":["import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport {\n appendFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmdirSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport * as util from 'node:util';\n\nimport { logger, registerSecrets } from './logger';\nimport { OptionHolder } from './OptionHolder';\n\nexport const encryptionKeyEnvironment = 'EXPO_RELEASE_IT_ENCRYPTION_KEY';\nexport const credentialVaultFilename = 'credentials.enc.json';\nexport const appStoreApiFilename = 'app_store_connect_api.json';\nexport const credentialFilenames = {\n androidKeystore: 'android_release.keystore',\n androidServiceAccount: 'android_play_console_service_account.json',\n iosApiKey: 'ios_app_store_connect_api_key.p8',\n};\nconst fileMode = 0o600;\nconst directoryMode = 0o700;\nconst algorithm = 'aes-256-gcm';\nconst formatVersion = 1;\nconst authenticationTagLength = 16;\nconst saltLength = 16;\nconst ivLength = 12;\nconst keyLength = 32;\nconst minimumKeyLength = 16;\nconst scryptOptions = { N: 131072, r: 8, p: 1, maxmem: 256 * 1024 * 1024 };\nconst associatedData = Buffer.from('expo-release-it:credentials:v1');\nconst decryptionError = `Cannot decrypt credentials. Check ${encryptionKeyEnvironment}; the encrypted file may also be damaged.`;\n\ntype CredentialData = {\n keyholder: Record<string, string>;\n files: Record<string, string>;\n};\nlet activeFiles: Record<string, string> | undefined;\nlet temporaryDirectory: string | undefined;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isRecord(value) && Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction decodeBase64(value: unknown, length?: number) {\n if (typeof value !== 'string') throw new Error(decryptionError);\n const bytes = Buffer.from(value, 'base64');\n if (bytes.toString('base64') !== value || (length !== undefined && bytes.length !== length))\n throw new Error(decryptionError);\n return bytes;\n}\n\nfunction validateData(value: unknown): CredentialData {\n if (!isRecord(value) || !isStringRecord(value.keyholder) || !isStringRecord(value.files))\n throw new Error('Invalid credential data.');\n for (const [name, contents] of Object.entries(value.files)) {\n if (\n !name ||\n isAbsolute(name) ||\n name.split(/[\\\\/]/).some((part) => !part || part === '..' || part === '.')\n )\n throw new Error('Invalid credential filename.');\n decodeBase64(contents);\n }\n return { keyholder: value.keyholder, files: value.files };\n}\n\nexport function warnPlaintextCredentials() {\n const found =\n existsSync(OptionHolder.keyholderFilePath) ||\n (existsSync(OptionHolder.keyDir) && readdirSync(OptionHolder.keyDir).length > 0) ||\n existsSync(join(OptionHolder.tempDir, appStoreApiFilename));\n if (found)\n logger.warn(\n 'Legacy plaintext credentials found in keyholder.json, key/, or .temp/app_store_connect_api.json. They will be encrypted when release credentials are loaded; init can also migrate them.',\n );\n return found;\n}\n\nexport function getEncryptionKey() {\n let key = process.env[encryptionKeyEnvironment];\n const envFile = resolve(OptionHolder.projectDir, OptionHolder.input.envFile ?? '.env');\n if (key === undefined && (OptionHolder.input.envFile || existsSync(envFile))) {\n if (typeof util.parseEnv !== 'function')\n throw new Error(\n `Reading .env files requires Node.js 20.12 or newer. Alternatively set ${encryptionKeyEnvironment} in the process environment.`,\n );\n try {\n const values = util.parseEnv(readFileSync(envFile, 'utf8'));\n if (\n encryptionKeyEnvironment in values &&\n typeof values[encryptionKeyEnvironment] === 'string'\n )\n key = values[encryptionKeyEnvironment];\n } catch {\n throw new Error(\n 'Cannot read the encryption-key env file. Check --env-file and file permissions.',\n );\n }\n }\n if (key !== undefined) registerSecrets([key]);\n if (key === undefined || key.length < minimumKeyLength)\n throw new Error(\n `${encryptionKeyEnvironment} is required for every command. Set a key of at least ${minimumKeyLength} characters in the process environment or an env file before running this command. Use --env-file to select another file.`,\n );\n return key;\n}\n\nexport function readCredentialVault(\n key: string,\n file = join(OptionHolder.resourcesDir, credentialVaultFilename),\n) {\n let derived: Buffer | undefined;\n try {\n if (!lstatSync(file).isFile()) throw new Error(decryptionError);\n const envelope: unknown = JSON.parse(readFileSync(file, 'utf8'));\n if (\n !isRecord(envelope) ||\n envelope.version !== formatVersion ||\n envelope.algorithm !== algorithm\n )\n throw new Error(decryptionError);\n const salt = decodeBase64(envelope.salt, saltLength);\n const iv = decodeBase64(envelope.iv, ivLength);\n const tag = decodeBase64(envelope.tag, authenticationTagLength);\n const ciphertext = decodeBase64(envelope.ciphertext);\n derived = scryptSync(key, salt, keyLength, scryptOptions);\n const decipher = createDecipheriv(algorithm, derived, iv, {\n authTagLength: authenticationTagLength,\n });\n decipher.setAAD(associatedData);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n try {\n return validateData(JSON.parse(plaintext.toString('utf8')));\n } finally {\n plaintext.fill(0);\n }\n } catch {\n throw new Error(decryptionError);\n } finally {\n derived?.fill(0);\n }\n}\n\nexport function readLegacyCredentials() {\n const data: CredentialData = { keyholder: {}, files: {} };\n const originals: string[] = [];\n if (existsSync(OptionHolder.keyholderFilePath)) {\n const contents = readPlaintext(OptionHolder.keyholderFilePath);\n try {\n const keyholder: unknown = JSON.parse(contents.toString('utf8'));\n if (!isStringRecord(keyholder)) throw new Error();\n data.keyholder = keyholder;\n } catch {\n throw new Error('Cannot read legacy keyholder.json. Expected an object with string values.');\n }\n originals.push(OptionHolder.keyholderFilePath);\n registerSecrets(Object.values(data.keyholder));\n }\n if (existsSync(OptionHolder.keyDir)) visit(OptionHolder.keyDir);\n const legacyApiFile = join(OptionHolder.tempDir, appStoreApiFilename);\n if (existsSync(legacyApiFile)) {\n const name = `legacy/${appStoreApiFilename}`;\n const contents = readPlaintext(legacyApiFile);\n data.files[name] = contents.toString('base64');\n originals.push(legacyApiFile);\n }\n return { data, originals };\n\n function visit(directory: string) {\n if (!lstatSync(directory).isDirectory())\n throw new Error('Credential directories must not be symbolic links.');\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) visit(path);\n else {\n const contents = readPlaintext(path);\n data.files[relative(OptionHolder.keyDir, path).split(sep).join('/')] =\n contents.toString('base64');\n originals.push(path);\n }\n }\n }\n}\n\nfunction readPlaintext(file: string) {\n if (!lstatSync(file).isFile())\n throw new Error('Credential inputs must be regular files, not symbolic links.');\n return readFileSync(file);\n}\n\nexport function writeCredentialVault(data: CredentialData, key: string, originals: string[] = []) {\n const salt = randomBytes(saltLength);\n const iv = randomBytes(ivLength);\n const derived = scryptSync(key, salt, keyLength, scryptOptions);\n const plaintext = Buffer.from(JSON.stringify(data));\n let encoded: string;\n try {\n const cipher = createCipheriv(algorithm, derived, iv, {\n authTagLength: authenticationTagLength,\n });\n cipher.setAAD(associatedData);\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n encoded = JSON.stringify({\n version: formatVersion,\n algorithm,\n salt: salt.toString('base64'),\n iv: iv.toString('base64'),\n tag: cipher.getAuthTag().toString('base64'),\n ciphertext: ciphertext.toString('base64'),\n });\n } finally {\n derived.fill(0);\n plaintext.fill(0);\n }\n mkdirSync(OptionHolder.resourcesDir, { recursive: true, mode: directoryMode });\n const pending = join(\n OptionHolder.resourcesDir,\n `.credentials-${randomBytes(8).toString('hex')}.tmp`,\n );\n try {\n writeFileSync(pending, encoded, { flag: 'wx', mode: fileMode });\n if (JSON.stringify(readCredentialVault(key, pending)) !== JSON.stringify(data))\n throw new Error('Encrypted credential verification failed. Plaintext files were retained.');\n renameSync(pending, join(OptionHolder.resourcesDir, credentialVaultFilename));\n protectSecretPaths();\n for (const original of originals) rmSync(original);\n if (existsSync(OptionHolder.keyDir)) removeEmptyDirectories(OptionHolder.keyDir);\n } finally {\n rmSync(pending, { force: true });\n }\n}\n\nfunction removeEmptyDirectories(directory: string) {\n for (const entry of readdirSync(directory, { withFileTypes: true }))\n if (entry.isDirectory()) removeEmptyDirectories(join(directory, entry.name));\n if (readdirSync(directory).length === 0) rmdirSync(directory);\n}\n\nfunction protectSecretPaths() {\n appendIgnores(join(OptionHolder.resourcesDir, '.gitignore'), [\n '/keyholder.json',\n '/key/',\n '/.ruby/',\n '/.temp/',\n ]);\n const envFile = relative(\n OptionHolder.projectDir,\n resolve(OptionHolder.projectDir, OptionHolder.input.envFile ?? '.env'),\n );\n if (envFile && !envFile.startsWith(`..${sep}`) && !isAbsolute(envFile))\n appendIgnores(join(OptionHolder.projectDir, '.gitignore'), [\n `/${envFile.split(sep).join('/')}`,\n ]);\n\n function appendIgnores(file: string, entries: string[]) {\n if (existsSync(file) && !lstatSync(file).isFile())\n throw new Error('Cannot protect secret paths: .gitignore must be a regular file.');\n const previous = existsSync(file) ? readFileSync(file, 'utf8') : '';\n const missing = entries.filter((entry) => !previous.split(/\\r?\\n/).includes(entry));\n if (missing.length)\n appendFileSync(\n file,\n `${previous && !previous.endsWith('\\n') ? '\\n' : ''}${missing.join('\\n')}\\n`,\n { mode: fileMode },\n );\n }\n}\n\nexport function loadRuntimeCredentials(key: string) {\n const hasPlaintext = warnPlaintextCredentials();\n const hasVault = existsSync(join(OptionHolder.resourcesDir, credentialVaultFilename));\n if (!hasVault && !hasPlaintext)\n throw new Error('Encrypted credentials are missing. Run expo-release-it init.');\n let data: CredentialData = hasVault ? readCredentialVault(key) : { keyholder: {}, files: {} };\n if (hasPlaintext) {\n const legacy = readLegacyCredentials();\n data = {\n keyholder: { ...data.keyholder, ...legacy.data.keyholder },\n files: { ...data.files, ...legacy.data.files },\n };\n writeCredentialVault(data, key, legacy.originals);\n logger.info('Plaintext credentials migrated to encrypted storage.');\n }\n Object.assign(OptionHolder.keyholderMap, data.keyholder);\n activeFiles = data.files;\n registerSecrets(Object.values(data.keyholder));\n}\n\nexport function credentialProcessEnvironment(environment: NodeJS.ProcessEnv = process.env) {\n return { ...environment, [encryptionKeyEnvironment]: '' };\n}\n\nexport function credentialKeyPath(name: string) {\n return writeCredentialTemporaryFile(name, readCredentialFile(name));\n}\n\nexport function readCredentialFile(name: string) {\n const contents = activeFiles?.[name];\n if (contents === undefined)\n throw new Error(`Credential file ${name} is missing. Import it with init.`);\n const decoded = Buffer.from(contents, 'base64');\n registerSecrets([decoded.toString('utf8')]);\n return decoded;\n}\n\nexport function writeCredentialTemporaryFile(name: string, contents: Buffer) {\n if (!temporaryDirectory) {\n temporaryDirectory = mkdtempSync(join(tmpdir(), 'expo-release-it-credentials-'));\n process.once('exit', cleanupCredentials);\n process.once('SIGINT', interruptCredentials);\n process.once('SIGTERM', terminateCredentials);\n }\n const file = join(temporaryDirectory, name);\n mkdirSync(dirname(file), { recursive: true, mode: directoryMode });\n writeFileSync(file, contents, { mode: fileMode });\n registerSecrets([contents.toString('utf8')]);\n contents.fill(0);\n return file;\n}\n\nexport function cleanupCredentials() {\n if (temporaryDirectory) rmSync(temporaryDirectory, { recursive: true, force: true });\n temporaryDirectory = undefined;\n activeFiles = undefined;\n process.off('exit', cleanupCredentials);\n process.off('SIGINT', interruptCredentials);\n process.off('SIGTERM', terminateCredentials);\n}\n\nfunction interruptCredentials() {\n cleanupCredentials();\n process.exit(130);\n}\n\nfunction terminateCredentials() {\n cleanupCredentials();\n process.exit(143);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CredentialVault-f3Q-GQiW.js","names":["activeFiles: Record<string, string> | undefined","temporaryDirectory: string | undefined","value: unknown","length?: number","key: string","derived: Buffer | undefined","envelope: unknown","data: CredentialData","originals: string[]","keyholder: unknown","directory: string","file: string","encoded: string","entries: string[]","environment: NodeJS.ProcessEnv","name: string","contents: Buffer"],"sources":["../src/util/CredentialVault.ts"],"sourcesContent":["import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport {\n appendFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmdirSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport * as util from 'node:util';\n\nimport { logger, registerSecrets } from './logger';\nimport { OptionHolder } from './OptionHolder';\n\nexport const encryptionKeyEnvironment = 'EXPO_RELEASE_IT_ENCRYPTION_KEY';\nexport const credentialVaultFilename = 'credentials.enc.json';\nexport const appStoreApiFilename = 'app_store_connect_api.json';\nexport const credentialFilenames = {\n androidKeystore: 'android_release.keystore',\n androidServiceAccount: 'android_play_console_service_account.json',\n iosApiKey: 'ios_app_store_connect_api_key.p8',\n};\nconst fileMode = 0o600;\nconst directoryMode = 0o700;\nconst algorithm = 'aes-256-gcm';\nconst formatVersion = 1;\nconst authenticationTagLength = 16;\nconst saltLength = 16;\nconst ivLength = 12;\nconst keyLength = 32;\nconst minimumKeyLength = 16;\nconst scryptOptions = { N: 131072, r: 8, p: 1, maxmem: 256 * 1024 * 1024 };\nconst associatedData = Buffer.from('expo-release-it:credentials:v1');\nconst decryptionError = `Cannot decrypt credentials. Check ${encryptionKeyEnvironment}; the encrypted file may also be damaged.`;\n\ntype CredentialData = {\n keyholder: Record<string, string>;\n files: Record<string, string>;\n};\nlet activeFiles: Record<string, string> | undefined;\nlet temporaryDirectory: string | undefined;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isRecord(value) && Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction decodeBase64(value: unknown, length?: number) {\n if (typeof value !== 'string') throw new Error(decryptionError);\n const bytes = Buffer.from(value, 'base64');\n if (bytes.toString('base64') !== value || (length !== undefined && bytes.length !== length))\n throw new Error(decryptionError);\n return bytes;\n}\n\nfunction validateData(value: unknown): CredentialData {\n if (!isRecord(value) || !isStringRecord(value.keyholder) || !isStringRecord(value.files))\n throw new Error('Invalid credential data.');\n for (const [name, contents] of Object.entries(value.files)) {\n if (\n !name ||\n isAbsolute(name) ||\n name.split(/[\\\\/]/).some((part) => !part || part === '..' || part === '.')\n )\n throw new Error('Invalid credential filename.');\n decodeBase64(contents);\n }\n return { keyholder: value.keyholder, files: value.files };\n}\n\nexport function warnPlaintextCredentials() {\n const found =\n existsSync(OptionHolder.keyholderFilePath) ||\n (existsSync(OptionHolder.keyDir) && readdirSync(OptionHolder.keyDir).length > 0) ||\n existsSync(join(OptionHolder.tempDir, appStoreApiFilename));\n if (found)\n logger.warn(\n 'Legacy plaintext credentials found in keyholder.json, key/, or .temp/app_store_connect_api.json. They will be encrypted when release credentials are loaded; init can also migrate them.',\n );\n return found;\n}\n\nexport function getEncryptionKey() {\n let key = process.env[encryptionKeyEnvironment];\n const envFile = resolve(OptionHolder.projectDir, OptionHolder.input.envFile ?? '.env');\n if (key === undefined && (OptionHolder.input.envFile || existsSync(envFile))) {\n if (typeof util.parseEnv !== 'function')\n throw new Error(\n `Reading .env files requires Node.js 20.12 or newer. Alternatively set ${encryptionKeyEnvironment} in the process environment.`,\n );\n try {\n const values = util.parseEnv(readFileSync(envFile, 'utf8'));\n if (\n encryptionKeyEnvironment in values &&\n typeof values[encryptionKeyEnvironment] === 'string'\n )\n key = values[encryptionKeyEnvironment];\n } catch {\n throw new Error(\n 'Cannot read the encryption-key env file. Check --env-file and file permissions.',\n );\n }\n }\n if (key !== undefined) registerSecrets([key]);\n if (key === undefined || key.length < minimumKeyLength)\n throw new Error(\n `${encryptionKeyEnvironment} is required for every command. Set a key of at least ${minimumKeyLength} characters in the process environment or an env file before running this command. Use --env-file to select another file.`,\n );\n return key;\n}\n\nexport function readCredentialVault(\n key: string,\n file = join(OptionHolder.resourcesDir, credentialVaultFilename),\n) {\n let derived: Buffer | undefined;\n try {\n if (!lstatSync(file).isFile()) throw new Error(decryptionError);\n const envelope: unknown = JSON.parse(readFileSync(file, 'utf8'));\n if (\n !isRecord(envelope) ||\n envelope.version !== formatVersion ||\n envelope.algorithm !== algorithm\n )\n throw new Error(decryptionError);\n const salt = decodeBase64(envelope.salt, saltLength);\n const iv = decodeBase64(envelope.iv, ivLength);\n const tag = decodeBase64(envelope.tag, authenticationTagLength);\n const ciphertext = decodeBase64(envelope.ciphertext);\n derived = scryptSync(key, salt, keyLength, scryptOptions);\n const decipher = createDecipheriv(algorithm, derived, iv, {\n authTagLength: authenticationTagLength,\n });\n decipher.setAAD(associatedData);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n try {\n return validateData(JSON.parse(plaintext.toString('utf8')));\n } finally {\n plaintext.fill(0);\n }\n } catch {\n throw new Error(decryptionError);\n } finally {\n derived?.fill(0);\n }\n}\n\nexport function readLegacyCredentials() {\n const data: CredentialData = { keyholder: {}, files: {} };\n const originals: string[] = [];\n if (existsSync(OptionHolder.keyholderFilePath)) {\n const contents = readPlaintext(OptionHolder.keyholderFilePath);\n try {\n const keyholder: unknown = JSON.parse(contents.toString('utf8'));\n if (!isStringRecord(keyholder)) throw new Error();\n data.keyholder = keyholder;\n } catch {\n throw new Error('Cannot read legacy keyholder.json. Expected an object with string values.');\n }\n originals.push(OptionHolder.keyholderFilePath);\n registerSecrets(Object.values(data.keyholder));\n }\n if (existsSync(OptionHolder.keyDir)) visit(OptionHolder.keyDir);\n const legacyApiFile = join(OptionHolder.tempDir, appStoreApiFilename);\n if (existsSync(legacyApiFile)) {\n const name = `legacy/${appStoreApiFilename}`;\n const contents = readPlaintext(legacyApiFile);\n data.files[name] = contents.toString('base64');\n originals.push(legacyApiFile);\n }\n return { data, originals };\n\n function visit(directory: string) {\n if (!lstatSync(directory).isDirectory())\n throw new Error('Credential directories must not be symbolic links.');\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) visit(path);\n else {\n const contents = readPlaintext(path);\n data.files[relative(OptionHolder.keyDir, path).split(sep).join('/')] =\n contents.toString('base64');\n originals.push(path);\n }\n }\n }\n}\n\nfunction readPlaintext(file: string) {\n if (!lstatSync(file).isFile())\n throw new Error('Credential inputs must be regular files, not symbolic links.');\n return readFileSync(file);\n}\n\nexport function writeCredentialVault(data: CredentialData, key: string, originals: string[] = []) {\n const salt = randomBytes(saltLength);\n const iv = randomBytes(ivLength);\n const derived = scryptSync(key, salt, keyLength, scryptOptions);\n const plaintext = Buffer.from(JSON.stringify(data));\n let encoded: string;\n try {\n const cipher = createCipheriv(algorithm, derived, iv, {\n authTagLength: authenticationTagLength,\n });\n cipher.setAAD(associatedData);\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n encoded = JSON.stringify({\n version: formatVersion,\n algorithm,\n salt: salt.toString('base64'),\n iv: iv.toString('base64'),\n tag: cipher.getAuthTag().toString('base64'),\n ciphertext: ciphertext.toString('base64'),\n });\n } finally {\n derived.fill(0);\n plaintext.fill(0);\n }\n mkdirSync(OptionHolder.resourcesDir, { recursive: true, mode: directoryMode });\n const pending = join(\n OptionHolder.resourcesDir,\n `.credentials-${randomBytes(8).toString('hex')}.tmp`,\n );\n try {\n writeFileSync(pending, encoded, { flag: 'wx', mode: fileMode });\n if (JSON.stringify(readCredentialVault(key, pending)) !== JSON.stringify(data))\n throw new Error('Encrypted credential verification failed. Plaintext files were retained.');\n renameSync(pending, join(OptionHolder.resourcesDir, credentialVaultFilename));\n protectSecretPaths();\n for (const original of originals) rmSync(original);\n if (existsSync(OptionHolder.keyDir)) removeEmptyDirectories(OptionHolder.keyDir);\n } finally {\n rmSync(pending, { force: true });\n }\n}\n\nfunction removeEmptyDirectories(directory: string) {\n for (const entry of readdirSync(directory, { withFileTypes: true }))\n if (entry.isDirectory()) removeEmptyDirectories(join(directory, entry.name));\n if (readdirSync(directory).length === 0) rmdirSync(directory);\n}\n\nfunction protectSecretPaths() {\n appendIgnores(join(OptionHolder.resourcesDir, '.gitignore'), [\n '/keyholder.json',\n '/key/',\n '/.ruby/',\n '/.temp/',\n ]);\n const envFile = relative(\n OptionHolder.projectDir,\n resolve(OptionHolder.projectDir, OptionHolder.input.envFile ?? '.env'),\n );\n if (envFile && !envFile.startsWith(`..${sep}`) && !isAbsolute(envFile))\n appendIgnores(join(OptionHolder.projectDir, '.gitignore'), [\n `/${envFile.split(sep).join('/')}`,\n ]);\n\n function appendIgnores(file: string, entries: string[]) {\n if (existsSync(file) && !lstatSync(file).isFile())\n throw new Error('Cannot protect secret paths: .gitignore must be a regular file.');\n const previous = existsSync(file) ? readFileSync(file, 'utf8') : '';\n const missing = entries.filter((entry) => !previous.split(/\\r?\\n/).includes(entry));\n if (missing.length)\n appendFileSync(\n file,\n `${previous && !previous.endsWith('\\n') ? '\\n' : ''}${missing.join('\\n')}\\n`,\n { mode: fileMode },\n );\n }\n}\n\nexport function loadRuntimeCredentials(key: string) {\n const hasPlaintext = warnPlaintextCredentials();\n const hasVault = existsSync(join(OptionHolder.resourcesDir, credentialVaultFilename));\n if (!hasVault && !hasPlaintext)\n throw new Error('Encrypted credentials are missing. Run expo-release-it init.');\n let data: CredentialData = hasVault ? readCredentialVault(key) : { keyholder: {}, files: {} };\n if (hasPlaintext) {\n const legacy = readLegacyCredentials();\n data = {\n keyholder: { ...data.keyholder, ...legacy.data.keyholder },\n files: { ...data.files, ...legacy.data.files },\n };\n writeCredentialVault(data, key, legacy.originals);\n logger.info('Plaintext credentials migrated to encrypted storage.');\n }\n Object.assign(OptionHolder.keyholderMap, data.keyholder);\n activeFiles = data.files;\n registerSecrets(Object.values(data.keyholder));\n}\n\nexport function credentialProcessEnvironment(environment: NodeJS.ProcessEnv = process.env) {\n return { ...environment, [encryptionKeyEnvironment]: '' };\n}\n\nexport function credentialKeyPath(name: string) {\n return writeCredentialTemporaryFile(name, readCredentialFile(name));\n}\n\nexport function readCredentialFile(name: string) {\n const contents = activeFiles?.[name];\n if (contents === undefined)\n throw new Error(`Credential file ${name} is missing. Import it with init.`);\n const decoded = Buffer.from(contents, 'base64');\n registerSecrets([decoded.toString('utf8')]);\n return decoded;\n}\n\nexport function writeCredentialTemporaryFile(name: string, contents: Buffer) {\n if (!temporaryDirectory) {\n temporaryDirectory = mkdtempSync(join(tmpdir(), 'expo-release-it-credentials-'));\n process.once('exit', cleanupCredentials);\n process.once('SIGINT', interruptCredentials);\n process.once('SIGTERM', terminateCredentials);\n }\n const file = join(temporaryDirectory, name);\n mkdirSync(dirname(file), { recursive: true, mode: directoryMode });\n writeFileSync(file, contents, { mode: fileMode });\n registerSecrets([contents.toString('utf8')]);\n contents.fill(0);\n return file;\n}\n\nexport function cleanupCredentials() {\n if (temporaryDirectory) rmSync(temporaryDirectory, { recursive: true, force: true });\n temporaryDirectory = undefined;\n activeFiles = undefined;\n process.off('exit', cleanupCredentials);\n process.off('SIGINT', interruptCredentials);\n process.off('SIGTERM', terminateCredentials);\n}\n\nfunction interruptCredentials() {\n cleanupCredentials();\n process.exit(130);\n}\n\nfunction terminateCredentials() {\n cleanupCredentials();\n process.exit(143);\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import { resolve } from "./FileUtil-Dq8PORna.js";
|
|
3
|
-
import { credentialFilenames, credentialKeyPath } from "./CredentialVault-
|
|
3
|
+
import { credentialFilenames, credentialKeyPath } from "./CredentialVault-f3Q-GQiW.js";
|
|
4
4
|
|
|
5
5
|
//#region src/util/FastlaneOption.ts
|
|
6
6
|
async function runFastlane(ruby, lane) {
|
|
@@ -48,4 +48,4 @@ async function runFastlane(ruby, lane) {
|
|
|
48
48
|
|
|
49
49
|
//#endregion
|
|
50
50
|
export { runFastlane };
|
|
51
|
-
//# sourceMappingURL=FastlaneOption-
|
|
51
|
+
//# sourceMappingURL=FastlaneOption-DTV-RPG_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FastlaneOption-
|
|
1
|
+
{"version":3,"file":"FastlaneOption-DTV-RPG_.js","names":["ruby: RubyEnvironment","lane: 'build' | 'upload' | 'submit'"],"sources":["../src/util/FastlaneOption.ts"],"sourcesContent":["import { credentialFilenames, credentialKeyPath } from './CredentialVault';\nimport { resolve } from './FileUtil';\nimport { OptionHolder } from './OptionHolder';\nimport type { RubyEnvironment } from './setup/RubyEnvironment';\n\nexport async function runFastlane(ruby: RubyEnvironment, lane: 'build' | 'upload' | 'submit') {\n const { keyholderMap: keys, input, resourcesDir } = OptionHolder;\n const options = {\n version_name: OptionHolder.versionName,\n version_code: OptionHolder.versionCode,\n upload_metadata: input.uploadMetadata,\n upload_screenshot: input.uploadScreenshot,\n ...(input.platform === 'ios'\n ? {\n ios_app_identifier: keys.ios_app_identifier,\n ios_developer_team_id: keys.ios_developer_team_id,\n ios_match_git_url: keys.ios_match_git_url,\n ios_app_store_connect_api_key_id: keys.ios_app_store_connect_api_key_id,\n ios_app_store_connect_api_key_issuer_id: keys.ios_app_store_connect_api_key_issuer_id,\n api_key_filepath:\n input.sign === false ? undefined : credentialKeyPath(credentialFilenames.iosApiKey),\n project: input.iosProject,\n target: input.iosTarget,\n scheme: input.iosScheme,\n workspace: input.iosWorkspace,\n no_sign: input.sign === false,\n ipa_path: resolve(resourcesDir, 'output', 'ios', 'app.ipa'),\n ipa_dir: resolve(resourcesDir, 'output', 'ios'),\n ipa_name: 'app.ipa',\n archive_path: resolve(resourcesDir, 'output', 'ios', 'app.xcarchive'),\n }\n : {\n android_package_name: keys.android_package_name,\n json_key: credentialKeyPath(credentialFilenames.androidServiceAccount),\n aab_path: resolve(resourcesDir, 'output', 'android', 'aab', 'app-release.aab'),\n apk_path: resolve(resourcesDir, 'output', 'android', 'apk', 'app-release.apk'),\n skip_upload_apk: input.androidOutput !== 'apk',\n skip_upload_aab: input.androidOutput !== 'aab',\n }),\n };\n await ruby.bundle(['exec', 'fastlane', input.platform, lane], {\n env: {\n EXPO_RELEASE_IT_OPTIONS: JSON.stringify(options),\n MATCH_PASSWORD:\n lane === 'build' && input.sign !== false ? (keys.ios_match_password ?? '') : '',\n },\n });\n}\n"],"mappings":";;;;;AAKA,eAAsB,YAAYA,MAAuBC,MAAqC;CAC5F,MAAM,EAAE,cAAc,MAAM,OAAO,cAAc,GAAG;CACpD,MAAM,UAAU;EACd,cAAc,aAAa;EAC3B,cAAc,aAAa;EAC3B,iBAAiB,MAAM;EACvB,mBAAmB,MAAM;EACzB,GAAI,MAAM,aAAa,QACnB;GACE,oBAAoB,KAAK;GACzB,uBAAuB,KAAK;GAC5B,mBAAmB,KAAK;GACxB,kCAAkC,KAAK;GACvC,yCAAyC,KAAK;GAC9C,kBACE,MAAM,SAAS,iBAAoB,kBAAkB,oBAAoB,UAAU;GACrF,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,WAAW,MAAM;GACjB,SAAS,MAAM,SAAS;GACxB,UAAU,QAAQ,cAAc,UAAU,OAAO,UAAU;GAC3D,SAAS,QAAQ,cAAc,UAAU,MAAM;GAC/C,UAAU;GACV,cAAc,QAAQ,cAAc,UAAU,OAAO,gBAAgB;EACtE,IACD;GACE,sBAAsB,KAAK;GAC3B,UAAU,kBAAkB,oBAAoB,sBAAsB;GACtE,UAAU,QAAQ,cAAc,UAAU,WAAW,OAAO,kBAAkB;GAC9E,UAAU,QAAQ,cAAc,UAAU,WAAW,OAAO,kBAAkB;GAC9E,iBAAiB,MAAM,kBAAkB;GACzC,iBAAiB,MAAM,kBAAkB;EAC1C;CACN;AACD,OAAM,KAAK,OAAO;EAAC;EAAQ;EAAY,MAAM;EAAU;CAAK,GAAE,EAC5D,KAAK;EACH,yBAAyB,KAAK,UAAU,QAAQ;EAChD,gBACE,SAAS,WAAW,MAAM,SAAS,QAAS,KAAK,sBAAsB,KAAM;CAChF,EACF,EAAC;AACH"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { is } from "@mj-studio/js-util";
|
|
4
4
|
import { select } from "@inquirer/prompts";
|
|
@@ -95,4 +95,4 @@ function constructInquirerFormattedMessage({ example, explanation, referUrl, nam
|
|
|
95
95
|
|
|
96
96
|
//#endregion
|
|
97
97
|
export { InqueryInputs, constructInquirerFormattedMessage };
|
|
98
|
-
//# sourceMappingURL=InqueryInputs-
|
|
98
|
+
//# sourceMappingURL=InqueryInputs-CQCIPjvq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InqueryInputs-
|
|
1
|
+
{"version":3,"file":"InqueryInputs-CQCIPjvq.js","names":[],"sources":["../src/util/input/InqueryInputs.ts"],"sourcesContent":["import { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport chalk from 'chalk';\n\nimport { OptionHolder } from '../OptionHolder';\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 androidBuildOutput: async () => {\n if (OptionHolder.input.platform === 'android') {\n if (!OptionHolder.input.androidOutput) {\n OptionHolder.input.androidOutput = await select({\n message: constructInquirerFormattedMessage({\n name: 'Android output artifact type',\n }),\n choices: [\n { name: 'aab', value: 'aab', description: 'Build as App bundle' },\n { name: 'apk', value: 'apk', description: 'Build as APK' },\n ],\n });\n }\n }\n },\n uploadMetadata: async () => {\n if (!is.boolean(OptionHolder.input.uploadMetadata)) {\n OptionHolder.input.uploadMetadata = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Text Metadata(title, description, ...)',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n uploadScreenshot: async () => {\n if (!is.boolean(OptionHolder.input.uploadScreenshot)) {\n OptionHolder.input.uploadScreenshot = await select({\n message: constructInquirerFormattedMessage({\n name: 'Upload Screenshots & Images',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Upload' },\n { name: 'no', value: false, description: \"Don't Upload\" },\n ],\n });\n }\n },\n useLiveVersionIos: async () => {\n if (\n !is.boolean(OptionHolder.input.useLiveVersionIos) &&\n OptionHolder.input.platform === 'ios'\n ) {\n OptionHolder.input.useLiveVersionIos = await select({\n message: constructInquirerFormattedMessage({\n name: 'Download metadatas from live version rather than draft',\n }),\n choices: [\n { name: 'yes', value: true, description: 'Download from live version' },\n { name: 'no', value: false, description: 'Download from draft' },\n ],\n });\n }\n },\n};\n\nexport function constructInquirerFormattedMessage({\n example,\n explanation,\n referUrl,\n name,\n}: {\n name: string;\n explanation?: string;\n example?: string;\n referUrl?: string;\n}) {\n let ret = `${chalk.bold(name)}`;\n if (explanation) {\n ret += `\\n\\n${chalk.italic.blue(explanation)}`;\n }\n if (example) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('example :')} ${example}`)}`;\n }\n if (referUrl) {\n ret += `\\n${chalk.italic(`${chalk.greenBright('references :')} ${chalk.underline.blue(referUrl)}`)}`;\n }\n\n if (explanation) {\n ret += '\\n';\n if (example || referUrl) {\n ret += '\\n';\n }\n }\n\n return ret;\n}\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB;CAC3B,UAAU,YAAY;AACpB,OAAK,aAAa,MAAM,SACtB,cAAa,MAAM,WAAW,MAAM,OAAO;GACzC,SAAS,kCAAkC;IACzC,MAAM;IACN,aAAa;GACd,EAAC;GACF,SAAS,CACP;IAAE,MAAM;IAAO,OAAO;IAAO,aAAa;GAAe,GACzD;IAAE,MAAM;IAAW,OAAO;IAAW,aAAa;GAAmB,CACtE;EACF,EAAC;CAEL;CACD,oBAAoB,YAAY;AAC9B,MAAI,aAAa,MAAM,aAAa,WAClC;QAAK,aAAa,MAAM,cACtB,cAAa,MAAM,gBAAgB,MAAM,OAAO;IAC9C,SAAS,kCAAkC,EACzC,MAAM,+BACP,EAAC;IACF,SAAS,CACP;KAAE,MAAM;KAAO,OAAO;KAAO,aAAa;IAAuB,GACjE;KAAE,MAAM;KAAO,OAAO;KAAO,aAAa;IAAgB,CAC3D;GACF,EAAC;EACH;CAEJ;CACD,gBAAgB,YAAY;AAC1B,OAAK,GAAG,QAAQ,aAAa,MAAM,eAAe,CAChD,cAAa,MAAM,iBAAiB,MAAM,OAAO;GAC/C,SAAS,kCAAkC,EACzC,MAAM,gDACP,EAAC;GACF,SAAS,CACP;IAAE,MAAM;IAAO,OAAO;IAAM,aAAa;GAAU,GACnD;IAAE,MAAM;IAAM,OAAO;IAAO,aAAa;GAAgB,CAC1D;EACF,EAAC;CAEL;CACD,kBAAkB,YAAY;AAC5B,OAAK,GAAG,QAAQ,aAAa,MAAM,iBAAiB,CAClD,cAAa,MAAM,mBAAmB,MAAM,OAAO;GACjD,SAAS,kCAAkC,EACzC,MAAM,8BACP,EAAC;GACF,SAAS,CACP;IAAE,MAAM;IAAO,OAAO;IAAM,aAAa;GAAU,GACnD;IAAE,MAAM;IAAM,OAAO;IAAO,aAAa;GAAgB,CAC1D;EACF,EAAC;CAEL;CACD,mBAAmB,YAAY;AAC7B,OACG,GAAG,QAAQ,aAAa,MAAM,kBAAkB,IACjD,aAAa,MAAM,aAAa,MAEhC,cAAa,MAAM,oBAAoB,MAAM,OAAO;GAClD,SAAS,kCAAkC,EACzC,MAAM,yDACP,EAAC;GACF,SAAS,CACP;IAAE,MAAM;IAAO,OAAO;IAAM,aAAa;GAA8B,GACvE;IAAE,MAAM;IAAM,OAAO;IAAO,aAAa;GAAuB,CACjE;EACF,EAAC;CAEL;AACF;AAED,SAAgB,kCAAkC,EAChD,SACA,aACA,UACA,MAMD,EAAE;CACD,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC;AAC9B,KAAI,YACF,SAAQ,MAAM,MAAM,OAAO,KAAK,YAAY,CAAC;AAE/C,KAAI,QACF,SAAQ,IAAI,MAAM,QAAQ,EAAE,MAAM,YAAY,eAAe,CAAC,GAAG,QAAQ,EAAE,CAAC;AAE9E,KAAI,SACF,SAAQ,IAAI,MAAM,QAAQ,EAAE,MAAM,YAAY,eAAe,CAAC,GAAG,MAAM,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;AAGrG,KAAI,aAAa;AACf,SAAO;AACP,MAAI,WAAW,SACb,QAAO;CAEV;AAED,QAAO;AACR"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import { copy, exist, join, relativePath } from "./FileUtil-Dq8PORna.js";
|
|
3
|
-
import { logger } from "./logger-
|
|
3
|
+
import { logger } from "./logger-BY1_5Qm4.js";
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
|
|
6
6
|
//#region src/util/MetadataSyncUtil.ts
|
|
@@ -39,4 +39,4 @@ function copyAndroidMetadata(to, workspace) {
|
|
|
39
39
|
|
|
40
40
|
//#endregion
|
|
41
41
|
export { copyAndroidMetadata, copyIosMetadata };
|
|
42
|
-
//# sourceMappingURL=MetadataSyncUtil-
|
|
42
|
+
//# sourceMappingURL=MetadataSyncUtil-DSi5YMM1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataSyncUtil-
|
|
1
|
+
{"version":3,"file":"MetadataSyncUtil-DSi5YMM1.js","names":["to: 'resources' | 'workspace'","workspace: string"],"sources":["../src/util/MetadataSyncUtil.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { copy, exist, join, relativePath } from './FileUtil';\nimport { logger } from './logger';\nimport { OptionHolder } from './OptionHolder';\n\nexport function copyIosMetadata(to: 'resources' | 'workspace', workspace: string) {\n const iosDir = workspace;\n\n const nativeDir = join(iosDir, 'fastlane');\n const metadataNativeDir = join(nativeDir, 'metadata');\n const screenshotsNativeDir = join(nativeDir, 'screenshots');\n\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/ios');\n const metadataResourcesDir = join(resourcesDir, 'metadata');\n const screenshotsResourcesDir = join(resourcesDir, 'screenshots');\n\n if (to === 'resources') {\n if (exist(metadataNativeDir) && exist(screenshotsNativeDir)) {\n copy(metadataNativeDir, metadataResourcesDir);\n copy(screenshotsNativeDir, screenshotsResourcesDir);\n\n logger.done(\n `iOS Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(metadataResourcesDir) && exist(screenshotsResourcesDir)) {\n copy(metadataResourcesDir, metadataNativeDir);\n copy(screenshotsResourcesDir, screenshotsNativeDir);\n\n logger.done(\n `iOS Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `iOS Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n\nexport function copyAndroidMetadata(to: 'resources' | 'workspace', workspace: string) {\n const androidDir = workspace;\n\n const nativeDir = join(androidDir, 'fastlane/metadata/android');\n const resourcesDir = join(OptionHolder.resourcesDir, 'metadata/android');\n\n if (to === 'resources') {\n if (exist(nativeDir)) {\n copy(nativeDir, resourcesDir);\n logger.done(\n `Android Metadata saved in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}. You can edit inside contents.`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n }\n } else {\n if (exist(resourcesDir)) {\n copy(resourcesDir, nativeDir);\n logger.done(\n `Android Metadata copyed to ${chalk.inverse(relativePath(OptionHolder.projectDir, nativeDir))}`,\n );\n } else {\n logger.warn(\n `Android Metadata not found in ${chalk.inverse(relativePath(OptionHolder.projectDir, resourcesDir))}`,\n );\n }\n }\n}\n"],"mappings":";;;;;;AAMA,SAAgB,gBAAgBA,IAA+BC,WAAmB;CAChF,MAAM,SAAS;CAEf,MAAM,YAAY,KAAK,QAAQ,WAAW;CAC1C,MAAM,oBAAoB,KAAK,WAAW,WAAW;CACrD,MAAM,uBAAuB,KAAK,WAAW,cAAc;CAE3D,MAAM,eAAe,KAAK,aAAa,cAAc,eAAe;CACpE,MAAM,uBAAuB,KAAK,cAAc,WAAW;CAC3D,MAAM,0BAA0B,KAAK,cAAc,cAAc;AAEjE,KAAI,OAAO,YACT,KAAI,MAAM,kBAAkB,IAAI,MAAM,qBAAqB,EAAE;AAC3D,OAAK,mBAAmB,qBAAqB;AAC7C,OAAK,sBAAsB,wBAAwB;AAEnD,SAAO,MACJ,wBAAwB,MAAM,QAAQ,aAAa,aAAa,YAAY,aAAa,CAAC,CAAC,iCAC7F;CACF,MACC,QAAO,MACJ,4BAA4B,MAAM,QAAQ,aAAa,aAAa,YAAY,UAAU,CAAC,CAAC,EAC9F;UAGC,MAAM,qBAAqB,IAAI,MAAM,wBAAwB,EAAE;AACjE,OAAK,sBAAsB,kBAAkB;AAC7C,OAAK,yBAAyB,qBAAqB;AAEnD,SAAO,MACJ,yBAAyB,MAAM,QAAQ,aAAa,aAAa,YAAY,UAAU,CAAC,CAAC,EAC3F;CACF,MACC,QAAO,MACJ,4BAA4B,MAAM,QAAQ,aAAa,aAAa,YAAY,aAAa,CAAC,CAAC,EACjG;AAGN;AAED,SAAgB,oBAAoBD,IAA+BC,WAAmB;CACpF,MAAM,aAAa;CAEnB,MAAM,YAAY,KAAK,YAAY,4BAA4B;CAC/D,MAAM,eAAe,KAAK,aAAa,cAAc,mBAAmB;AAExE,KAAI,OAAO,YACT,KAAI,MAAM,UAAU,EAAE;AACpB,OAAK,WAAW,aAAa;AAC7B,SAAO,MACJ,4BAA4B,MAAM,QAAQ,aAAa,aAAa,YAAY,aAAa,CAAC,CAAC,iCACjG;CACF,MACC,QAAO,MACJ,gCAAgC,MAAM,QAAQ,aAAa,aAAa,YAAY,UAAU,CAAC,CAAC,EAClG;UAGC,MAAM,aAAa,EAAE;AACvB,OAAK,cAAc,UAAU;AAC7B,SAAO,MACJ,6BAA6B,MAAM,QAAQ,aAAa,aAAa,YAAY,UAAU,CAAC,CAAC,EAC/F;CACF,MACC,QAAO,MACJ,gCAAgC,MAAM,QAAQ,aAAa,aAAa,YAAY,aAAa,CAAC,CAAC,EACrG;AAGN"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import { exist, readJsonSlow, resolve } from "./FileUtil-Dq8PORna.js";
|
|
3
|
-
import { logger } from "./logger-
|
|
4
|
-
import { exe } from "./execShellScript-
|
|
3
|
+
import { logger } from "./logger-BY1_5Qm4.js";
|
|
4
|
+
import { exe } from "./execShellScript-B6HHcv77.js";
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
6
|
import { dirname } from "node:path";
|
|
7
7
|
import semver from "semver";
|
|
@@ -47,4 +47,4 @@ async function inspectNativeEnvironment() {
|
|
|
47
47
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { inspectNativeEnvironment };
|
|
50
|
-
//# sourceMappingURL=NativeEnvironment-
|
|
50
|
+
//# sourceMappingURL=NativeEnvironment-oSy4DL9W.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeEnvironment-
|
|
1
|
+
{"version":3,"file":"NativeEnvironment-oSy4DL9W.js","names":["expoPackage: string","nativePackage: string"],"sources":["../src/util/setup/NativeEnvironment.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { dirname } from 'node:path';\n\nimport semver from 'semver';\n\nimport { exist, readJsonSlow, resolve } from '../FileUtil';\nimport { logger } from '../logger';\nimport { OptionHolder } from '../OptionHolder';\nimport { exe } from './execShellScript';\n\nexport async function inspectNativeEnvironment() {\n const platform = OptionHolder.input.platform;\n if (platform === 'ios' && process.platform !== 'darwin') {\n throw new Error('Local iOS builds require macOS and Xcode.');\n }\n const require = createRequire(resolve(OptionHolder.projectDir, 'package.json'));\n let expoPackage: string;\n let nativePackage: string;\n try {\n expoPackage = require.resolve('expo/package.json');\n nativePackage = require.resolve('react-native/package.json');\n } catch {\n throw new Error(\n 'Install Expo and React Native in the target project before building. CNG projects with Expo SDK 52 or newer are supported.',\n );\n }\n const native = readJsonSlow(nativePackage) as { engines?: { node?: string } };\n if (native.engines?.node && !semver.satisfies(process.version, native.engines.node)) {\n throw new Error(\n `Node ${process.version} at ${process.execPath} does not meet this React Native version's requirement: ${native.engines.node}. Activate a compatible Node before rerunning.`,\n );\n }\n const expoCli = resolve(dirname(expoPackage), 'bin', 'cli');\n if (!exist(expoCli)) throw new Error(`Project-local Expo CLI not found: ${expoCli}`);\n await exe(platform === 'ios' ? 'xcodebuild' : 'java', ['-version'], {\n cwd: OptionHolder.projectDir,\n });\n logger.info(`Node ${process.version}: ${process.execPath}; Expo CLI: ${expoCli}`);\n const env = {\n CI: '1',\n PATH: `${dirname(process.execPath)}:${process.env.PATH ?? ''}`,\n };\n return async function prebuild() {\n await exe(\n process.execPath,\n [expoCli, 'prebuild', '--clean', '--platform', platform, '--no-install'],\n {\n cwd: OptionHolder.projectDir,\n env,\n },\n );\n logger.done('Expo CNG prebuild');\n };\n}\n"],"mappings":";;;;;;;;;AAUA,eAAsB,2BAA2B;CAC/C,MAAM,WAAW,aAAa,MAAM;AACpC,KAAI,aAAa,SAAS,QAAQ,aAAa,SAC7C,OAAM,IAAI,MAAM;CAElB,MAAM,UAAU,cAAc,QAAQ,aAAa,YAAY,eAAe,CAAC;CAC/E,IAAIA;CACJ,IAAIC;AACJ,KAAI;AACF,gBAAc,QAAQ,QAAQ,oBAAoB;AAClD,kBAAgB,QAAQ,QAAQ,4BAA4B;CAC7D,QAAO;AACN,QAAM,IAAI,MACR;CAEH;CACD,MAAM,SAAS,aAAa,cAAc;AAC1C,KAAI,OAAO,SAAS,SAAS,OAAO,UAAU,QAAQ,SAAS,OAAO,QAAQ,KAAK,CACjF,OAAM,IAAI,OACP,OAAO,QAAQ,QAAQ,MAAM,QAAQ,SAAS,0DAA0D,OAAO,QAAQ,KAAK;CAGjI,MAAM,UAAU,QAAQ,QAAQ,YAAY,EAAE,OAAO,MAAM;AAC3D,MAAK,MAAM,QAAQ,CAAE,OAAM,IAAI,OAAO,oCAAoC,QAAQ;AAClF,OAAM,IAAI,aAAa,QAAQ,eAAe,QAAQ,CAAC,UAAW,GAAE,EAClE,KAAK,aAAa,WACnB,EAAC;AACF,QAAO,MAAM,OAAO,QAAQ,QAAQ,IAAI,QAAQ,SAAS,cAAc,QAAQ,EAAE;CACjF,MAAM,MAAM;EACV,IAAI;EACJ,OAAO,EAAE,QAAQ,QAAQ,SAAS,CAAC,GAAG,QAAQ,IAAI,QAAQ,GAAG;CAC9D;AACD,QAAO,eAAe,WAAW;AAC/B,QAAM,IACJ,QAAQ,UACR;GAAC;GAAS;GAAY;GAAW;GAAc;GAAU;EAAe,GACxE;GACE,KAAK,aAAa;GAClB;EACD,EACF;AACD,SAAO,KAAK,oBAAoB;CACjC;AACF"}
|
|
@@ -3,7 +3,7 @@ import { fileURLToPath } from "url";
|
|
|
3
3
|
|
|
4
4
|
//#region package.json
|
|
5
5
|
var name = "expo-release-it";
|
|
6
|
-
var version = "1.0.
|
|
6
|
+
var version = "1.0.2";
|
|
7
7
|
var homepage = "https://expo-release-it.mjstudio.net/";
|
|
8
8
|
var license = "MIT";
|
|
9
9
|
var repository = "https://github.com/mym0404/expo-release-it";
|
|
@@ -101,4 +101,4 @@ const OptionHolder = {
|
|
|
101
101
|
|
|
102
102
|
//#endregion
|
|
103
103
|
export { OptionHolder };
|
|
104
|
-
//# sourceMappingURL=OptionHolder-
|
|
104
|
+
//# sourceMappingURL=OptionHolder-Ci01mA57.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptionHolder-
|
|
1
|
+
{"version":3,"file":"OptionHolder-Ci01mA57.js","names":["OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n sign?: boolean;\n iosProject?: string;\n iosTarget?: string;\n iosScheme?: string;\n iosWorkspace?: string;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n envFile?: string;\n git: {\n commit?: boolean;\n commitMessage?: string;\n tag?: boolean;\n tagName?: string;\n push?: boolean;\n };\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_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 // 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}","pkgJson"],"sources":["../package.json","../src/util/OptionHolder.ts"],"sourcesContent":["{\n \"name\": \"expo-release-it\",\n \"version\": \"1.0.2\",\n \"homepage\": \"https://expo-release-it.mjstudio.net/\",\n \"license\": \"MIT\",\n \"repository\": \"https://github.com/mym0404/expo-release-it\",\n \"bin\": \"./bin/expo-release-it.mjs\",\n \"files\": [\n \"build\",\n \"package.json\",\n \"bin\",\n \"template\",\n \"expo-release-it.schema.json\"\n ],\n \"type\": \"module\",\n \"module\": \"src/index.ts\",\n \"scripts\": {\n \"build\": \"pnpm build:json-schema-type && tsdown --silent\",\n \"build:json-schema-type\": \"json2ts --input expo-release-it.schema.json --output src/type/ExpoReleaseItConfiguration.d.ts && oxfmt --write src/type/ExpoReleaseItConfiguration.d.ts\",\n \"dev\": \"pnpm build && NODE_ENV=development node bin/expo-release-it.mjs\",\n \"release\": \"pnpm build && pnpm run t && changeset publish\",\n \"t\": \"lefthook run check\",\n \"lint\": \"oxlint --deny-warnings .\",\n \"lint:fix\": \"oxlint --fix .\",\n \"format\": \"oxfmt --write .\",\n \"format:check\": \"oxfmt --check .\",\n \"changeset\": \"changeset\",\n \"version-packages\": \"changeset version && pnpm install --lockfile-only --ignore-scripts\",\n \"test:e2e\": \"node test/e2e.mjs\",\n \"test:ruby\": \"node test/ruby.mjs\"\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 \"semver\": \"^7.7.1\",\n \"url\": \"^0.11.4\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^3.0.3\",\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/semver\": \"^7.7.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"lefthook\": \"^1.11.11\",\n \"oxfmt\": \"0.75.0\",\n \"oxlint\": \"1.90.0\",\n \"tiny-glob\": \"^0.2.9\",\n \"tsdown\": \"^0.12.7\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"^3.1.2\"\n },\n \"commitlint\": {\n \"extends\": [\n \"@commitlint/config-conventional\"\n ]\n },\n \"packageManager\": \"pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39\"\n}\n","import { fileURLToPath } from 'url';\n\nimport pkgJson from '../../package.json';\nimport { resolve } from './FileUtil';\n\n/**\n * CLI Comprehensive options\n * Each values can be empty by command and timing.\n */\nexport const OptionHolder: {\n // cli specific options\n cli: {\n // cli version\n version: string;\n // cli project root directory\n rootDir: string;\n // cli template source directory\n templateDir: string;\n };\n input: {\n platform: 'android' | 'ios';\n uploadMetadata: boolean;\n uploadScreenshot: boolean;\n androidOutput: 'apk' | 'aab';\n sign?: boolean;\n iosProject?: string;\n iosTarget?: string;\n iosScheme?: string;\n iosWorkspace?: string;\n useLiveVersionIos: boolean;\n semverIncrement: 'major' | 'minor' | 'patch';\n config?: string;\n envFile?: string;\n git: {\n commit?: boolean;\n commitMessage?: string;\n tag?: boolean;\n tagName?: string;\n push?: boolean;\n };\n };\n keyholderMap: {\n ios_app_identifier: string;\n ios_developer_team_id: string;\n ios_match_git_url: string;\n ios_app_store_connect_api_key_id: string;\n ios_app_store_connect_api_key_issuer_id: string;\n ios_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 // dest project root directory\n projectDir: string;\n // dest project output of init command direcotry\n resourcesDir: string;\n keyDir: string;\n keyholderFilePath: string;\n tempDir: string;\n versionName: string;\n versionCode: string;\n} = {\n cli: {\n version: pkgJson.version,\n rootDir: resolve(fileURLToPath(import.meta.url), '../..'),\n templateDir: resolve(fileURLToPath(import.meta.url), '../../template'),\n },\n input: {\n git: {},\n } as any,\n keyholderMap: {} as any,\n projectDir: '',\n resourcesDir: '',\n keyDir: '',\n keyholderFilePath: '',\n versionName: '',\n versionCode: '',\n tempDir: '',\n};\n"],"mappings":";;;;WACU;cACG;eACC;cACD;iBACG;UACP;YACE;CACP;CACA;CACA;CACA;CACA;AACD;WACO;aACE;cACC;CACT,SAAS;CACT,0BAA0B;CAC1B,OAAO;CACP,WAAW;CACX,KAAK;CACL,QAAQ;CACR,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,aAAa;AACd;mBACe;CACd,qBAAqB;CACrB,sBAAsB;CACtB,SAAS;CACT,aAAa;CACb,SAAS;CACT,YAAY;CACZ,OAAO;CACP,UAAU;CACV,OAAO;AACR;sBACkB;CACjB,mBAAmB;CACnB,mCAAmC;CACnC,mBAAmB;CACnB,iBAAiB;CACjB,6BAA6B;CAC7B,YAAY;CACZ,SAAS;CACT,UAAU;CACV,aAAa;CACb,UAAU;CACV,cAAc;CACd,UAAU;AACX;iBACa,EACZ,WAAW,CACT,iCACD,EACF;qBACiB;sBA7DpB;;;;;;;;;;;;;;;AA8DC;;;;;;;;ACrDD,MAAaA,eAsDT;CACF,KAAK;EACH,SAASC,gBAAQ;EACjB,SAAS,QAAQ,cAAc,OAAO,KAAK,IAAI,EAAE,QAAQ;EACzD,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,EAAE,iBAAiB;CACvE;CACD,OAAO,EACL,KAAK,CAAE,EACR;CACD,cAAc,CAAE;CAChB,YAAY;CACZ,cAAc;CACd,QAAQ;CACR,mBAAmB;CACnB,aAAa;CACb,aAAa;CACb,SAAS;AACV"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import { copy, read, resolve, write } from "./FileUtil-Dq8PORna.js";
|
|
3
|
-
import { logger, redact } from "./logger-
|
|
4
|
-
import { credentialProcessEnvironment } from "./CredentialVault-
|
|
5
|
-
import { printRedactedOutput } from "./execShellScript-
|
|
3
|
+
import { logger, redact } from "./logger-BY1_5Qm4.js";
|
|
4
|
+
import { credentialProcessEnvironment } from "./CredentialVault-f3Q-GQiW.js";
|
|
5
|
+
import { printRedactedOutput } from "./execShellScript-B6HHcv77.js";
|
|
6
6
|
import { execa } from "execa";
|
|
7
7
|
import { dirname } from "node:path";
|
|
8
8
|
import semver from "semver";
|
|
@@ -111,4 +111,4 @@ async function inspectRubyEnvironment({ needsPods = false } = {}) {
|
|
|
111
111
|
|
|
112
112
|
//#endregion
|
|
113
113
|
export { inspectRubyEnvironment, rubyProcessEnvironment, rubyRequirement };
|
|
114
|
-
//# sourceMappingURL=RubyEnvironment-
|
|
114
|
+
//# sourceMappingURL=RubyEnvironment-BUsGpWfG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RubyEnvironment-
|
|
1
|
+
{"version":3,"file":"RubyEnvironment-BUsGpWfG.js","names":["ruby: { ruby: string; version: string; engine: string; platform: string; bundle?: string }","args: string[]","options: { cwd?: string; env?: Record<string, string>; capture?: boolean }"],"sources":["../src/util/setup/RubyEnvironment.ts"],"sourcesContent":["import { dirname } from 'node:path';\n\nimport { execa } from 'execa';\nimport semver from 'semver';\n\nimport { credentialProcessEnvironment } from '../CredentialVault';\nimport { copy, read, resolve, write } from '../FileUtil';\nimport { logger, redact } from '../logger';\nimport { OptionHolder } from '../OptionHolder';\nimport { printRedactedOutput } from './execShellScript';\n\nexport const rubyRequirement = '>=3.3.0 <4.1.0';\nconst gemfileName = 'Gemfile';\nconst lockfileName = 'Gemfile.lock';\nconst bundleLauncher =\n 'version = ARGV.shift; gem \"bundler\", version; load Gem.bin_path(\"bundler\", \"bundle\", version)';\n\nexport function rubyProcessEnvironment() {\n return Object.fromEntries(\n Object.entries(credentialProcessEnvironment()).filter(\n ([key]) => !key.startsWith('BUNDLE_') && !['RUBYOPT', 'RUBYLIB'].includes(key),\n ),\n );\n}\n\nexport async function inspectRubyEnvironment({ needsPods = false } = {}) {\n const sourceDir = resolve(OptionHolder.cli.templateDir, 'ruby');\n const lockfile = read(resolve(sourceDir, lockfileName));\n const bundlerVersion = /BUNDLED WITH\\s+([\\d.]+)/.exec(lockfile)?.[1] ?? '';\n if (!bundlerVersion) throw new Error('The packaged Gemfile.lock has no Bundler version.');\n\n const env = rubyProcessEnvironment();\n const probe = await execa(\n 'ruby',\n [\n '-rjson',\n '-rrbconfig',\n '-e',\n 'v = ARGV.first; s = Gem::Specification.find_all_by_name(\"bundler\", v).first; puts JSON.generate(ruby: RbConfig.ruby, version: RUBY_VERSION, engine: RUBY_ENGINE, platform: Gem::Platform.local.to_s, bundle: s && Gem.bin_path(\"bundler\", \"bundle\", v))',\n bundlerVersion,\n ],\n { cwd: OptionHolder.projectDir, env, extendEnv: false, reject: false },\n );\n if (probe.failed) {\n throw new Error(\n `Ruby from PATH could not be inspected. Required: MRI Ruby ${rubyRequirement} and Bundler ${bundlerVersion}. Activate your prepared Ruby environment, then rerun.`,\n );\n }\n const ruby: { ruby: string; version: string; engine: string; platform: string; bundle?: string } =\n JSON.parse(probe.stdout);\n logger.info(`Ruby ${ruby.version}: ${ruby.ruby}`);\n if (ruby.engine !== 'ruby' || !semver.satisfies(ruby.version, rubyRequirement)) {\n throw new Error(\n `Found ${ruby.engine} ${ruby.version} at ${ruby.ruby}. Required: MRI Ruby ${rubyRequirement}. Activate Ruby 3.3 (recommended), then rerun. Ruby is never installed automatically.`,\n );\n }\n if (!ruby.bundle) {\n throw new Error(\n `Ruby ${ruby.version} at ${ruby.ruby} needs Bundler ${bundlerVersion}. In that Ruby environment run: gem install bundler -v ${bundlerVersion} --no-document. Then rerun the original command. Other Bundler versions can remain installed.`,\n );\n }\n const version = await execa(ruby.ruby, ['-e', bundleLauncher, bundlerVersion, '--version'], {\n cwd: OptionHolder.projectDir,\n env,\n extendEnv: false,\n reject: false,\n });\n if (version.failed || version.stdout.trim() !== `Bundler version ${bundlerVersion}`) {\n throw new Error(\n `Bundler ${bundlerVersion} could not run with ${ruby.ruby}. Reinstall that Bundler in the selected Ruby environment.`,\n );\n }\n logger.info(`Bundler ${bundlerVersion}: ${ruby.bundle}`);\n\n const directory = resolve(OptionHolder.resourcesDir, '.ruby');\n const workspace = resolve(directory, OptionHolder.input.platform);\n const bundleEnv = {\n ...env,\n PATH: `${dirname(ruby.ruby)}:${dirname(process.execPath)}:${env.PATH ?? ''}`,\n BUNDLE_IGNORE_CONFIG: '1',\n BUNDLE_GEMFILE: resolve(directory, gemfileName),\n BUNDLE_PATH: resolve(directory, 'vendor', `${ruby.engine}-${ruby.version}-${ruby.platform}`),\n BUNDLE_APP_CONFIG: resolve(directory, '.bundle'),\n BUNDLE_USER_HOME: resolve(directory, '.bundle'),\n BUNDLE_FROZEN: 'true',\n BUNDLE_DISABLE_SHARED_GEMS: 'true',\n BUNDLE_WITHOUT: needsPods ? '' : 'ios',\n FASTLANE_SKIP_UPDATE_CHECK: '1',\n FASTLANE_HIDE_CHANGELOG: '1',\n FASTLANE_OPT_OUT_USAGE: '1',\n };\n\n async function bundle(\n args: string[],\n options: { cwd?: string; env?: Record<string, string>; capture?: boolean } = {},\n ) {\n const child = execa(ruby.ruby, ['-e', bundleLauncher, bundlerVersion, ...args], {\n cwd: options.cwd ?? workspace,\n env: { ...bundleEnv, ...options.env },\n extendEnv: false,\n all: true,\n reject: false,\n });\n if (!options.capture && child.all) await printRedactedOutput(child.all);\n const result = await child;\n if (result.failed) {\n if (options.capture) logger.error(redact(result.all ?? ''));\n throw new Error(\n `Ruby command failed (exit ${result.exitCode ?? 'unknown'}) using Ruby ${ruby.version}, Bundler ${bundlerVersion}, and ${bundleEnv.BUNDLE_GEMFILE}.`,\n );\n }\n return { stdout: result.stdout };\n }\n\n async function install() {\n copy(resolve(sourceDir, gemfileName), bundleEnv.BUNDLE_GEMFILE);\n copy(resolve(sourceDir, lockfileName), resolve(directory, lockfileName));\n write(resolve(directory, '.gitignore'), '*\\n');\n await bundle(['install'], { cwd: directory });\n }\n\n return {\n bundle,\n install,\n directory,\n workspace,\n executable: ruby.ruby,\n version: ruby.version,\n bundlerVersion,\n };\n}\n\nexport type RubyEnvironment = Awaited<ReturnType<typeof inspectRubyEnvironment>>;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
2
|
import { read, readJsonSlow, readdir, resolve, write, writeJson } from "./FileUtil-Dq8PORna.js";
|
|
3
|
-
import { throwError } from "./throwError-
|
|
3
|
+
import { throwError } from "./throwError-CagLBtkh.js";
|
|
4
4
|
import { padZero } from "@mj-studio/js-util";
|
|
5
5
|
import semver from "semver";
|
|
6
6
|
|
|
@@ -98,4 +98,4 @@ function generateVersionCodeTiedWithVersionName(versionName) {
|
|
|
98
98
|
|
|
99
99
|
//#endregion
|
|
100
100
|
export { checkVersionCodeIsTiedWithVersionName, generateVersionCodeTiedWithVersionName, injectBinaryVersions, parseBinaryVersions };
|
|
101
|
-
//# sourceMappingURL=VersionUtil-
|
|
101
|
+
//# sourceMappingURL=VersionUtil-DJcMTY2B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionUtil-
|
|
1
|
+
{"version":3,"file":"VersionUtil-DJcMTY2B.js","names":["filename: string","versionName: string","versionCode: string"],"sources":["../src/util/setup/VersionUtil.ts"],"sourcesContent":["import { padZero } from '@mj-studio/js-util';\nimport semver from 'semver';\n\nimport { read, readdir, readJsonSlow, resolve, write, writeJson } from '../FileUtil';\nimport { OptionHolder } from '../OptionHolder';\nimport { throwError } from '../throwError';\n\nconst versionNameRegex = () => /const\\s+VERSION_NAME\\s*?=\\s*?['\"]([\\d.]*?)['\"]\\s*?;?/;\nconst versionCodeRegex = () => /const\\s+VERSION_CODE\\s*?=\\s*?(\\d+)\\s*?;?/;\n\nexport async function parseBinaryVersions() {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await parseFromJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await parseFromJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function parseFromJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const content = read(filePath);\n\n const VERSION_NAME = versionNameRegex().exec(content)?.[1];\n const VERSION_CODE = versionCodeRegex().exec(content)?.[1];\n\n if (!VERSION_NAME) {\n throwError('cannot parse version name');\n }\n if (!VERSION_CODE) {\n throwError('cannot parse version code');\n }\n\n if (!semver.valid(VERSION_NAME)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = VERSION_NAME;\n OptionHolder.versionCode = VERSION_CODE;\n }\n\n async function parseFromJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n const versionName = `${json.expo?.version}`;\n const iosVersionCode = `${json.expo?.ios?.buildNumber}`;\n const androidVersionCode = `${json.expo?.android?.versionCode}`;\n\n if (!/\\d+/.test(iosVersionCode)) {\n throwError('app.json expo.ios.buildNumber is not an integer');\n }\n\n if (!/\\d+/.test(androidVersionCode)) {\n throwError('app.json expo.android.versionCode is not an integer');\n }\n\n if (iosVersionCode !== androidVersionCode) {\n throwError('app.json expo.ios.buildNumber is not equal with expo.android.versionCode');\n }\n\n if (!semver.valid(versionName)) {\n throwError('VERSION_NAME is not a valid semver format');\n }\n\n OptionHolder.versionName = versionName;\n OptionHolder.versionCode = iosVersionCode;\n }\n}\n\nexport async function injectBinaryVersions({\n versionCode,\n versionName,\n}: {\n versionName: string;\n versionCode: string;\n}) {\n const files = readdir(OptionHolder.projectDir);\n\n const jsConfigFiles = ['app.config.ts', 'app.config.js', 'app.config.cjs', 'app.config.mjs'];\n const jsonConfigFile = 'app.json';\n\n for (const jsConfigFile of jsConfigFiles) {\n if (files.includes(jsConfigFile)) {\n await injectToJsConfigFile(jsConfigFile);\n return;\n }\n }\n\n if (files.includes(jsonConfigFile)) {\n await injectToJsonConfigFile(jsonConfigFile);\n return;\n }\n\n throwError('expo config file not found');\n\n async function injectToJsConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n let content = read(filePath);\n\n content = content.replace(versionNameRegex(), `const VERSION_NAME = '${versionName}';`);\n content = content.replace(versionCodeRegex(), `const VERSION_CODE = ${versionCode};`);\n\n write(filePath, content);\n }\n\n async function injectToJsonConfigFile(filename: string) {\n const filePath = resolve(OptionHolder.projectDir, filename);\n const json = readJsonSlow(filePath);\n\n json.expo.version = versionName;\n json.expo.ios.buildNumber = versionCode;\n json.expo.android.versionCode = +versionCode;\n\n writeJson(filePath, json);\n }\n}\n\nexport function checkVersionCodeIsTiedWithVersionName(\n versionName: string,\n versionCode: string,\n): boolean {\n if (!semver.valid(versionName)) return false;\n return generateVersionCodeTiedWithVersionName(versionName) === versionCode;\n}\n\nexport function generateVersionCodeTiedWithVersionName(versionName: string) {\n if (!semver.valid(versionName))\n throwError(\n 'Version Name is not a valid semver format when running `generateVersionCodeTiedWithVersionName`',\n );\n const major = semver.major(versionName);\n const minor = semver.minor(versionName);\n const patch = semver.patch(versionName);\n\n return `${major}${padZero(minor, 3)}${padZero(patch, 3)}`;\n}\n"],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { calculateElapsed } from "./calculateElapsed-DORWymX3.js";
|
|
2
|
-
import { OptionHolder } from "./OptionHolder-
|
|
2
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
3
3
|
import { copy, exist, relativePath, remove, resolve } from "./FileUtil-Dq8PORna.js";
|
|
4
|
-
import { logger } from "./logger-
|
|
5
|
-
import { runFastlane } from "./FastlaneOption-
|
|
6
|
-
import { InqueryInputs } from "./InqueryInputs-
|
|
7
|
-
import { exe } from "./execShellScript-
|
|
8
|
-
import { inspectNativeEnvironment } from "./NativeEnvironment-
|
|
9
|
-
import { androidSigningEnvironment, prepareAndroid } from "./prepareAndroid-
|
|
10
|
-
import { inspectRubyEnvironment } from "./RubyEnvironment-
|
|
11
|
-
import { prepareFastlane } from "./prepareFastlane-
|
|
12
|
-
import { prepareIos } from "./prepareIos-
|
|
13
|
-
import { setup } from "./setup-
|
|
4
|
+
import { logger } from "./logger-BY1_5Qm4.js";
|
|
5
|
+
import { runFastlane } from "./FastlaneOption-DTV-RPG_.js";
|
|
6
|
+
import { InqueryInputs } from "./InqueryInputs-CQCIPjvq.js";
|
|
7
|
+
import { exe } from "./execShellScript-B6HHcv77.js";
|
|
8
|
+
import { inspectNativeEnvironment } from "./NativeEnvironment-oSy4DL9W.js";
|
|
9
|
+
import { androidSigningEnvironment, prepareAndroid } from "./prepareAndroid-BV53rhQ3.js";
|
|
10
|
+
import { inspectRubyEnvironment } from "./RubyEnvironment-BUsGpWfG.js";
|
|
11
|
+
import { prepareFastlane } from "./prepareFastlane-7Zg3N5Fy.js";
|
|
12
|
+
import { prepareIos } from "./prepareIos-Cigqnhe8.js";
|
|
13
|
+
import { setup } from "./setup-ChAxYljZ.js";
|
|
14
14
|
import { dirname } from "node:path";
|
|
15
15
|
import chalk from "chalk";
|
|
16
16
|
|
|
@@ -60,4 +60,4 @@ async function build({ options }) {
|
|
|
60
60
|
|
|
61
61
|
//#endregion
|
|
62
62
|
export { build };
|
|
63
|
-
//# sourceMappingURL=build-
|
|
63
|
+
//# sourceMappingURL=build-Dl9olKkk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-
|
|
1
|
+
{"version":3,"file":"build-Dl9olKkk.js","names":["artifact: string"],"sources":["../src/command/build.ts"],"sourcesContent":["import { dirname } from 'node:path';\n\nimport chalk from 'chalk';\n\nimport { calculateElapsed } from '../util/calculateElapsed';\nimport { runFastlane } from '../util/FastlaneOption';\nimport { copy, exist, relativePath, remove, resolve } from '../util/FileUtil';\nimport { InqueryInputs } from '../util/input/InqueryInputs';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport { exe } from '../util/setup/execShellScript';\nimport { inspectNativeEnvironment } from '../util/setup/NativeEnvironment';\nimport { androidSigningEnvironment, prepareAndroid } from '../util/setup/prepareAndroid';\nimport { prepareFastlane } from '../util/setup/prepareFastlane';\nimport { prepareIos } from '../util/setup/prepareIos';\nimport { inspectRubyEnvironment } from '../util/setup/RubyEnvironment';\nimport { setup } from '../util/setup/setup';\n\nexport async function build({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n const startTime = Date.now();\n await setup({ credentials: OptionHolder.input.sign !== false });\n await InqueryInputs.platform();\n await InqueryInputs.androidBuildOutput();\n const isIos = OptionHolder.input.platform === 'ios';\n if (!isIos && OptionHolder.input.sign === false)\n throw new Error(\n '--no-sign is only supported for iOS. Android release builds require a signing key.',\n );\n const ruby = await inspectRubyEnvironment({ needsPods: isIos });\n const prebuild = await inspectNativeEnvironment();\n await prepareFastlane(ruby);\n let artifact: string;\n if (isIos) {\n await prepareIos({ ruby, prebuild });\n await runFastlane(ruby, 'build');\n artifact = resolve(\n OptionHolder.resourcesDir,\n 'output',\n 'ios',\n OptionHolder.input.sign === false ? 'app.xcarchive' : 'app.ipa',\n );\n } else {\n await prepareAndroid(prebuild);\n const isAab = OptionHolder.input.androidOutput === 'aab';\n await exe('./gradlew', [isAab ? 'app:bundleRelease' : 'app:assembleRelease'], {\n cwd: resolve(OptionHolder.projectDir, 'android'),\n env: {\n ...androidSigningEnvironment(),\n PATH: `${dirname(process.execPath)}:${process.env.PATH ?? ''}`,\n },\n });\n // aab: app/build/outputs/bundle/release/app-release.aab\n // apk: app/build/outputs/apk/release/app-release.apk\n const output = isAab ? 'aab' : 'apk';\n const outputDir = resolve(OptionHolder.resourcesDir, 'output', 'android', output);\n const buildOutput = resolve(\n OptionHolder.projectDir,\n 'android',\n 'app',\n 'build',\n 'outputs',\n isAab ? 'bundle' : 'apk',\n 'release',\n );\n const binary = resolve(buildOutput, `app-release.${output}`);\n if (!exist(binary)) throw new Error(`Release build output is missing: ${binary}`);\n remove(outputDir);\n copy(buildOutput, outputDir);\n artifact = resolve(outputDir, `app-release.${output}`);\n }\n if (!exist(artifact)) throw new Error(`Expected build artifact was not generated: ${artifact}`);\n logger.success(`artifact generated: ${relativePath(OptionHolder.projectDir, artifact)}`);\n logger.success(\n `${isIos ? 'iOS' : 'Android'} Build ${chalk.bold.inverse(calculateElapsed(startTime))}`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,eAAsB,MAAM,EAAE,SAA2B,EAAE;AACzD,QAAO,OAAO,aAAa,OAAO,QAAQ;CAC1C,MAAM,YAAY,KAAK,KAAK;AAC5B,OAAM,MAAM,EAAE,aAAa,aAAa,MAAM,SAAS,MAAO,EAAC;AAC/D,OAAM,cAAc,UAAU;AAC9B,OAAM,cAAc,oBAAoB;CACxC,MAAM,QAAQ,aAAa,MAAM,aAAa;AAC9C,MAAK,SAAS,aAAa,MAAM,SAAS,MACxC,OAAM,IAAI,MACR;CAEJ,MAAM,OAAO,MAAM,uBAAuB,EAAE,WAAW,MAAO,EAAC;CAC/D,MAAM,WAAW,MAAM,0BAA0B;AACjD,OAAM,gBAAgB,KAAK;CAC3B,IAAIA;AACJ,KAAI,OAAO;AACT,QAAM,WAAW;GAAE;GAAM;EAAU,EAAC;AACpC,QAAM,YAAY,MAAM,QAAQ;AAChC,aAAW,QACT,aAAa,cACb,UACA,OACA,aAAa,MAAM,SAAS,QAAQ,kBAAkB,UACvD;CACF,OAAM;AACL,QAAM,eAAe,SAAS;EAC9B,MAAM,QAAQ,aAAa,MAAM,kBAAkB;AACnD,QAAM,IAAI,aAAa,CAAC,QAAQ,sBAAsB,qBAAsB,GAAE;GAC5E,KAAK,QAAQ,aAAa,YAAY,UAAU;GAChD,KAAK;IACH,GAAG,2BAA2B;IAC9B,OAAO,EAAE,QAAQ,QAAQ,SAAS,CAAC,GAAG,QAAQ,IAAI,QAAQ,GAAG;GAC9D;EACF,EAAC;EAGF,MAAM,SAAS,QAAQ,QAAQ;EAC/B,MAAM,YAAY,QAAQ,aAAa,cAAc,UAAU,WAAW,OAAO;EACjF,MAAM,cAAc,QAClB,aAAa,YACb,WACA,OACA,SACA,WACA,QAAQ,WAAW,OACnB,UACD;EACD,MAAM,SAAS,QAAQ,cAAc,cAAc,OAAO,EAAE;AAC5D,OAAK,MAAM,OAAO,CAAE,OAAM,IAAI,OAAO,mCAAmC,OAAO;AAC/E,SAAO,UAAU;AACjB,OAAK,aAAa,UAAU;AAC5B,aAAW,QAAQ,YAAY,cAAc,OAAO,EAAE;CACvD;AACD,MAAK,MAAM,SAAS,CAAE,OAAM,IAAI,OAAO,6CAA6C,SAAS;AAC7F,QAAO,SAAS,sBAAsB,aAAa,aAAa,YAAY,SAAS,CAAC,EAAE;AACxF,QAAO,SACJ,EAAE,QAAQ,QAAQ,UAAU,SAAS,MAAM,KAAK,QAAQ,iBAAiB,UAAU,CAAC,CAAC,EACvF;AACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { OptionHolder } from "./OptionHolder-
|
|
2
|
-
import { logger } from "./logger-
|
|
3
|
-
import { constructInquirerFormattedMessage } from "./InqueryInputs-
|
|
4
|
-
import { exe } from "./execShellScript-
|
|
1
|
+
import { OptionHolder } from "./OptionHolder-Ci01mA57.js";
|
|
2
|
+
import { logger } from "./logger-BY1_5Qm4.js";
|
|
3
|
+
import { constructInquirerFormattedMessage } from "./InqueryInputs-CQCIPjvq.js";
|
|
4
|
+
import { exe } from "./execShellScript-B6HHcv77.js";
|
|
5
5
|
import { isDev } from "./EnvUtil-bT6jh2Up.js";
|
|
6
|
-
import { throwError } from "./throwError-
|
|
7
|
-
import { checkVersionCodeIsTiedWithVersionName, generateVersionCodeTiedWithVersionName, injectBinaryVersions } from "./VersionUtil-
|
|
8
|
-
import { setup } from "./setup-
|
|
6
|
+
import { throwError } from "./throwError-CagLBtkh.js";
|
|
7
|
+
import { checkVersionCodeIsTiedWithVersionName, generateVersionCodeTiedWithVersionName, injectBinaryVersions } from "./VersionUtil-DJcMTY2B.js";
|
|
8
|
+
import { setup } from "./setup-ChAxYljZ.js";
|
|
9
9
|
import { is } from "@mj-studio/js-util";
|
|
10
10
|
import { select } from "@inquirer/prompts";
|
|
11
11
|
import semver from "semver";
|
|
@@ -119,4 +119,4 @@ async function promptTagAndPush({ nextVersionCode, nextVersionName }) {
|
|
|
119
119
|
|
|
120
120
|
//#endregion
|
|
121
121
|
export { bump };
|
|
122
|
-
//# sourceMappingURL=bump-
|
|
122
|
+
//# sourceMappingURL=bump-DKVq38lK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bump-
|
|
1
|
+
{"version":3,"file":"bump-DKVq38lK.js","names":[],"sources":["../src/command/bump.ts"],"sourcesContent":["import { select } from '@inquirer/prompts';\nimport { is } from '@mj-studio/js-util';\nimport semver from 'semver';\n\nimport { isDev } from '../util/EnvUtil';\nimport { constructInquirerFormattedMessage } from '../util/input/InqueryInputs';\nimport { logger } from '../util/logger';\nimport { OptionHolder } from '../util/OptionHolder';\nimport { exe } from '../util/setup/execShellScript';\nimport { setup } from '../util/setup/setup';\nimport {\n checkVersionCodeIsTiedWithVersionName,\n generateVersionCodeTiedWithVersionName,\n injectBinaryVersions,\n} from '../util/setup/VersionUtil';\nimport { throwError } from '../util/throwError';\n\nexport async function bump({ options }: { options: any }) {\n Object.assign(OptionHolder.input, options);\n await setup({ credentials: false });\n await preCheck();\n\n const nextVersionName = semver.inc(OptionHolder.versionName, OptionHolder.input.semverIncrement)!;\n const nextVersionCode = (() => {\n if (checkVersionCodeIsTiedWithVersionName(OptionHolder.versionName, OptionHolder.versionCode)) {\n return generateVersionCodeTiedWithVersionName(nextVersionName);\n } else {\n logger.warn(\n 'version name is not tied with version code like (1.3.5=1003005). Version code is just incremented by 1.',\n );\n return `${Number(OptionHolder.versionCode) + 1}`;\n }\n })();\n\n logger.info(`Next Version: ${nextVersionName}(${nextVersionCode})`);\n\n await injectBinaryVersions({ versionName: nextVersionName, versionCode: nextVersionCode });\n logger.success('Binary versions have been bumped in expo config file');\n\n await processCommit({ nextVersionName, nextVersionCode });\n if (OptionHolder.input.git.commit) {\n await promptTagAndPush({ nextVersionName, nextVersionCode });\n }\n}\n\nasync function preCheck() {\n if (isDev) return;\n try {\n let hasChange = false;\n try {\n await exe('git', ['diff', '--quiet', 'HEAD']);\n } catch {\n hasChange = true;\n }\n if (hasChange) {\n throwError('Workspace is not clean. Before bump version, you should commit all changes.');\n }\n } catch (e) {\n throwError('Precheck Failed', e);\n }\n}\n\nasync function processCommit({\n nextVersionCode,\n nextVersionName,\n}: {\n nextVersionName: string;\n nextVersionCode: string;\n}) {\n if (!is.boolean(OptionHolder.input.git.commit)) {\n OptionHolder.input.git.commit = await select({\n message: constructInquirerFormattedMessage({ name: 'Commit?' }),\n choices: [\n { name: 'yes', value: true },\n { name: 'no', value: false },\n ],\n });\n }\n if (!is.notEmptyString(OptionHolder.input.git.commitMessage)) {\n OptionHolder.input.git.commitMessage = 'chore: release $(version) 🚀';\n }\n\n if (OptionHolder.input.git.commit) {\n await exe('git', ['add', '--all']);\n await exe('git', [\n 'commit',\n '-m',\n OptionHolder.input.git.commitMessage!.replaceAll(\n '$(version)',\n `${nextVersionName}(${nextVersionCode})`,\n ),\n ]);\n }\n}\n\nasync function promptTagAndPush({\n nextVersionCode,\n nextVersionName,\n}: {\n nextVersionName: string;\n nextVersionCode: string;\n}) {\n if (!is.boolean(OptionHolder.input.git.tag)) {\n OptionHolder.input.git.tag = await select({\n message: constructInquirerFormattedMessage({ name: 'Tag?' }),\n choices: [\n { name: 'yes', value: true },\n { name: 'no', value: false },\n ],\n });\n }\n if (!is.notEmptyString(OptionHolder.input.git.tagName)) {\n OptionHolder.input.git.tagName = 'v$(version)';\n }\n\n const tagName = OptionHolder.input.git.tagName!.replaceAll(\n '$(version)',\n `${nextVersionName}(${nextVersionCode})`,\n );\n\n if (OptionHolder.input.git.tag) {\n await exe('git', ['tag', '-a', tagName, '-m', tagName]);\n }\n\n if (!is.boolean(OptionHolder.input.git.push)) {\n OptionHolder.input.git.push = await select({\n message: constructInquirerFormattedMessage({ name: 'Push?' }),\n choices: [\n { name: 'yes', value: true },\n { name: 'no', value: false },\n ],\n });\n }\n\n if (OptionHolder.input.git.push) {\n if (OptionHolder.input.git.tag) {\n await exe('git', ['push', 'origin', tagName]);\n }\n await exe('git', ['push']);\n }\n}\n"],"mappings":"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"}
|