@todesktop/cli 1.9.6 → 1.9.8

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/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/commands/build/components/Build.tsx", "../src/components/BuildProgress.tsx", "../src/components/BuildCompleteMessage.tsx", "../src/utilities/logForCI.ts", "../src/utilities/logger.ts", "../src/utilities/useExit.ts", "../src/utilities/analytics.ts", "../src/utilities/getEnvironmentVariables.ts", "../src/utilities/firestore.ts", "../src/utilities/configStore.ts", "../src/utilities/getToDesktopPackageJson.ts", "../src/utilities/readJson.ts", "../src/utilities/getCliVersion.ts", "../src/utilities/fixMacUrl.ts", "../src/components/PlatformProgress.tsx", "../src/utilities/buildStatus.ts", "../src/components/ErrorDisplay.tsx", "../src/utilities/CliError.ts", "../src/components/MainLayout.tsx", "../src/components/CancelBuild.tsx", "../src/utilities/getCallableFirebaseFunction.ts", "../src/components/Footer.tsx", "../src/components/Header.tsx", "../src/utilities/useInput.ts", "../src/commands/build/components/Preparation.tsx", "../src/commands/build/components/ProgressBar.tsx", "../src/libs/ink-progress-bar/index.tsx", "../src/commands/build/utilities/runBuild.ts", "../src/utilities/postToFirebaseFunction.ts", "../src/utilities/projectConfig/getProjectConfig.ts", "../src/utilities/projectConfig/loadConfig.ts", "../src/utilities/projectConfig/resolveConfigPaths.ts", "../src/utilities/projectConfig/validateConfig.ts", "../src/utilities/projectConfig/addCustomKeywords.ts", "../src/utilities/projectConfig/validatePackageJSON.ts", "../src/utilities/projectConfig/schema/packageJSON.ts", "../src/utilities/projectConfig/schema/full.ts", "../src/utilities/projectConfig/computeFullProjectConfig.ts", "../src/utilities/shouldExitOnBuildFailure.ts", "../src/commands/build/utilities/getPackageJson.ts", "../src/commands/build/utilities/getVersionControlInfo.ts", "../src/commands/build/utilities/spyBuild.ts", "../src/commands/build/utilities/uploadApplicationSource.ts", "../src/commands/build/utilities/generateS3Key.ts", "../src/commands/build/utilities/uploadToS3.ts", "../src/commands/build/utilities/zip.ts", "../src/utilities/checkIfReactIsUsable.ts", "../src/components/LoginHOC.tsx", "../src/components/Login.tsx", "../src/components/TextInput.tsx", "../src/components/LoadingText.tsx", "../src/components/ErrorBoundary.tsx", "../src/commands/build/components/OngoingBuildGuard.tsx", "../src/components/CustomSelectInputIndicator.tsx", "../src/components/CustomSelectInputItem.tsx", "../src/components/ViewBuild.tsx", "../src/utilities/getLatestBuildId.ts", "../src/utilities/subscribeToFirebaseDoc.ts", "../src/utilities/subscribeToBuild.ts", "../src/utilities/findAppUserId.ts", "../src/utilities/useAnalytics.ts", "../src/commands/build/BuildCommand.tsx", "../src/components/ViewBuilds.tsx", "../src/components/Table.tsx", "../src/components/TableEnd.tsx", "../src/components/TableHead.tsx", "../src/components/TableBody.tsx", "../src/components/TableRow.tsx", "../src/utilities/getKeyDetails.ts", "../src/utilities/capitalize.ts", "../src/utilities/getBuilds.ts", "../src/utilities/getRelativeDateFromDateString.ts", "../src/components/SyntaxHighlight.tsx", "../src/commands/BuildsCommand.tsx", "../src/commands/LogoutCommand.tsx", "../src/components/BuildPicker.tsx", "../src/components/SelectTable.tsx", "../src/utilities/getBuildById.ts", "../src/utilities/getLatestReleasedBuild.ts", "../src/commands/release/components/ReleaseBuildLogic.tsx", "../src/utilities/getBuildAttributes.ts", "../src/commands/release/utilities/releaseBuild.ts", "../src/commands/release/components/ReleaseBuildView.tsx", "../src/components/BuildError.tsx", "../src/commands/release/components/ReleaseConfirmation.tsx", "../src/commands/smoke-test/utilities/build.ts", "../src/commands/release/utilities/analyzeRelease.ts", "../src/commands/release/components/DowngradeConfirmation.tsx", "../src/commands/release/components/YesNoConfirmation.tsx", "../src/commands/release/ReleaseCommand.tsx", "../src/commands/smoke-test/SmokeTestCommand.tsx", "../src/commands/smoke-test/components/Cancellation.tsx", "../src/commands/smoke-test/components/SmokeTestView.tsx", "../src/commands/smoke-test/components/ProgressBar.tsx", "../src/commands/smoke-test/components/TestProgress.tsx", "../src/commands/smoke-test/utilities/cancelSmokeTest.ts", "../src/commands/smoke-test/utilities/queueSmokeTest.ts", "../src/commands/smoke-test/utilities/waitUntilFinished.ts", "../src/commands/WhoamiCommand.tsx", "../src/utilities/exitIfCLIOutOfDate.ts", "../src/utilities/initSentry.ts", "../src/utilities/onCommand.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\nimport { InvalidArgumentError, Option, program } from \"commander\";\nimport { render } from \"ink\";\nimport { FC, createElement } from \"react\";\nimport \"source-map-support/register\";\n\nimport BuildCommand from \"./commands/build/BuildCommand\";\nimport BuildsCommand from \"./commands/BuildsCommand\";\nimport LogoutCommand from \"./commands/LogoutCommand\";\nimport ReleaseCommand from \"./commands/release/ReleaseCommand\";\nimport SmokeTestCommand from \"./commands/smoke-test/SmokeTestCommand\";\nimport WhoamiCommand from \"./commands/WhoamiCommand\";\nimport getCliVersion from \"./utilities/getCliVersion\";\nimport onCommand from \"./utilities/onCommand\";\n\nfunction parseCount(value: string): number {\n const parsedValue = Number.parseInt(value, 10);\n if (parsedValue > 0) {\n return parsedValue;\n }\n\n throw new InvalidArgumentError(\"Should be a positive number\");\n}\n\nconst configOption = new Option(\n \"--config [string]\",\n \"Path to a different configuration file. If not specified, \" +\n \"`todesktop.json` in the project root will be used\"\n).argParser((value?: string): string | undefined => {\n if (typeof value === \"string\" && value === \"\") {\n throw new InvalidArgumentError(\"Provided config path is empty\");\n }\n\n return value;\n});\n\nprogram.name(\"todekstop\").version(getCliVersion());\n\nprogram\n .command(\"build\")\n .description(\n \"Build an Electron app with native installers, code signing baked-in, \" +\n \"etc. but without releasing it (existing users won't get an \" +\n \"auto-update). For quicker builds, you can append `--code-sign=false` \" +\n \"to disable code-signing and notarization.\"\n )\n .option(\n \"--code-sign [bool]\",\n \"Whether or not code-signing and notarization should be performed. \" +\n \"Disable this for quicker builds\"\n )\n .option(\n \"--async\",\n \"Upload your app for building on our servers but exit after the upload \" +\n \"is complete. Do not wait until the app is actually built\"\n )\n .option(\n \"--webhook [string]\",\n \"Send POST request to the webhook URL after building is finished\"\n )\n .addOption(configOption)\n .action(({ async, codeSign, config, webhook }) => {\n runCommand(BuildCommand, {\n configPath: config,\n exitAfterUploading: async === true,\n onBuildFinishedWebhook: webhook,\n shouldCodeSign: codeSign !== \"false\",\n });\n });\n\nprogram\n .command(\"builds\")\n .description(\"View your builds\")\n .argument(\"[id]\", \"View a specific build by ID\")\n .option(\"--latest\", \"View the latest build\")\n .addOption(configOption)\n .option(\"--count [number]\", \"Number of builds to show per page\", parseCount)\n .addOption(\n new Option(\"--format <type>\", \"Format to output the build details in\")\n .choices([\"json\", \"table\"])\n .default(\"table\")\n )\n .option(\n \"--exit\",\n \"Disable dynamic pagination and exit the process once the build data \" +\n \"has been displayed\"\n )\n .action((id, { config, count, exit, format, latest }) => {\n runCommand(BuildsCommand, {\n configPath: config,\n count,\n exit,\n format,\n id,\n shouldViewLatest: latest,\n });\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logs you out\")\n .action(() => {\n runCommand(LogoutCommand, null, { exitIfOutOfDate: false });\n });\n\nprogram\n .command(\"release\")\n .description(\"Release a build\")\n .argument(\"[id]\", \"A specific build ID to release\")\n .option(\"--force\", \"Skips interactive confirmation step\")\n .option(\"--latest\", \"Release the latest build\")\n .addOption(configOption)\n .action((id, { config, force, latest }) => {\n runCommand(ReleaseCommand, {\n configPath: config,\n shouldConfirm: !force,\n buildId: latest ? \"latest\" : id,\n });\n });\n\nprogram\n .command(\"smoke-test\")\n .description(\"Check whether the build works and can be successfully updated\")\n .argument(\"[id]\", \"A specific build ID to test\")\n .option(\"--latest\", \"Release the latest build\")\n .addOption(configOption)\n .action((id, { config, latest }) => {\n runCommand(SmokeTestCommand, {\n configPath: config,\n buildId: latest ? \"latest\" : id,\n });\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Prints the email of the account you're signed into\")\n .action(() => {\n runCommand(WhoamiCommand);\n });\n\nconst runCommand = <T extends FC<Props>, Props extends object>(\n component: T,\n props: Props | null = null,\n { exitIfOutOfDate = true } = {}\n) => {\n onCommand({ exitIfOutOfDate });\n\n const { waitUntilExit } = render(createElement(component, props));\n\n waitUntilExit().catch((error) => {\n console.error(error.stack);\n });\n};\n\n// Don't exist with status 1 if no command specified\nconst args = [...process.argv];\nif (args.length === 2) {\n args.push(\"help\");\n}\n\nprogram.parse(args);\n", "// libs\nimport { Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\n\n// components\nimport BuildProgress from \"../../../components/BuildProgress\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport MainLayout from \"../../../components/MainLayout\";\nimport Preparation from \"./Preparation\";\n\n// utils\nimport logForCI from \"../../../utilities/logForCI\";\nimport runBuild from \"../utilities/runBuild\";\nimport type { BuildState } from \"../utilities/types\";\nimport useExit from \"../../../utilities/useExit\";\n\nexport default function Build({\n commandUsed,\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n}: {\n commandUsed: string;\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign: boolean;\n}) {\n const exit = useExit();\n const [state, setState] = useState<BuildState>({ state: \"initializing\" });\n\n useEffect(() => {\n runBuild({\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n updateState,\n }).catch((e) => {\n const error = e.response ? e.response.data : e;\n logForCI(error);\n updateState({ state: \"error\", error });\n });\n\n return () => state.onUnmount?.();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<BuildState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as BuildState)\n );\n\n if (changes.state === \"exit-after-uploading\") {\n setTimeout(() => exit(), 10);\n }\n\n if (changes.state === \"build-failed\") {\n setTimeout(() => exit(new Error(\"Build has failed\")), 10);\n }\n }\n\n switch (state.state) {\n case \"build-failed\":\n case \"building\": {\n if (!state.build) {\n return (\n <ErrorDisplay commandUsed={commandUsed} error=\"No build is set\" />\n );\n }\n\n return (\n <MainLayout\n appName={state.build.appName || state.appPkg?.name || \"\"}\n appVersion={state.build.appVersion || state.appPkg?.version || \"\"}\n build={state.build}\n commandUsed={commandUsed}\n hasBuildEverFailed={state.state === \"build-failed\"}\n >\n <BuildProgress build={state.build} onBuildFailure={() => {}} />\n </MainLayout>\n );\n }\n\n case \"error\":\n return <ErrorDisplay commandUsed={commandUsed} error={state.error} />;\n\n case \"exit-after-uploading\":\n return (\n <Text>\n App is building on ToDesktop. Exit since the --async flag is passed.\n </Text>\n );\n\n case \"initializing\":\n return <Text>Getting app info...</Text>;\n\n case \"preparing\":\n return (\n <MainLayout\n appName={state.build?.appName || state.appPkg?.name || \"\"}\n appVersion={state.build?.appVersion || state.appPkg?.version || \"\"}\n build={state.build}\n commandUsed={commandUsed}\n hasBuildEverFailed={false}\n >\n <Preparation\n progressPercentage={state.preparationProgress || 0}\n stageLabel={state.preparationStageLabel || \"Preparing\"}\n uploadedSize={state.preparationUploadedSize}\n />\n </MainLayout>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${(state as BuildState).state}`)}\n />\n );\n }\n}\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\nimport throttle from \"lodash.throttle\";\nimport BuildCompleteMessage from \"./BuildCompleteMessage\";\nimport PlatformProgress from \"./PlatformProgress\";\nimport { hasBuildKickedOff } from \"../utilities/buildStatus\";\nimport logger from \"../utilities/logger\";\nimport logForCI from \"../utilities/logForCI\";\nimport useExit from \"../utilities/useExit\";\n\nconst logForCIThrottled = throttle(logForCI, 60 * 1000, { trailing: true });\n\nconst BuildProgress = ({ build, onBuildFailure }) => {\n logger.debug(\"BuildProgress component: render\");\n const exit = useExit();\n\n const [{ hasKickedOff }, setState] = useState({\n hasKickedOff: false,\n });\n const platformsNotSkipped = [\"windows\", \"mac\", \"linux\"].filter(\n (platform) => !build[platform].shouldSkip\n );\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n hasKickedOff: hasBuildKickedOff(build),\n }));\n }, [build]);\n\n useEffect(() => {\n if (build.status === \"failed\") {\n onBuildFailure(build.errorMessage);\n } else if (build.status === \"cancelled\") {\n setTimeout(exit, 10);\n } else {\n const ciPlatformProgress = platformsNotSkipped.map(\n (platform) =>\n `${platform.charAt(0).toUpperCase() + platform.slice(1)}: ${\n build[platform].progressActivityName\n } (${build[platform].progressPercentage}%)`\n );\n logForCIThrottled(ciPlatformProgress.join(\", \"));\n }\n }, [build, exit, onBuildFailure, platformsNotSkipped]);\n\n if (build.status === \"succeeded\") {\n return <BuildCompleteMessage build={build} />;\n }\n\n if (build.status === \"cancelled\") {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>Build cancelled</Text>\n </Box>\n );\n }\n\n if (!hasKickedOff) {\n return null;\n }\n\n return (\n <>\n <Box flexDirection=\"column\">\n {platformsNotSkipped.map((platform) => (\n <Box flexDirection=\"column\" key={platform}>\n <PlatformProgress\n activityName={\n build[platform].status === \"failed\"\n ? build[platform].errorMessage\n : build[platform].progressActivityName\n }\n activityType={\n build[platform].status === \"failed\"\n ? \"error\"\n : build[platform].progressActivityType\n }\n downloadUrl={build[platform].standardDownloadUrl}\n percent={build[platform].progressPercentage}\n platform={platform}\n shouldShowReadyPrefix={\n !(build && [\"failed\", \"succeeded\"].includes(build.status))\n }\n />\n </Box>\n ))}\n </Box>\n </>\n );\n};\n\nBuildProgress.propTypes = {\n build: PropTypes.object.isRequired,\n onBuildFailure: PropTypes.func.isRequired,\n};\n\nexport default BuildProgress;\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport PropTypes from \"prop-types\";\nimport { Build } from \"@todesktop/shared\";\nimport { useEffect } from \"react\";\nimport logForCI from \"../utilities/logForCI\";\nimport useExit from \"../utilities/useExit\";\nimport fixMacUrl from \"../utilities/fixMacUrl\";\n\nconst BuildCompleteMessage = ({ build }: { build: Build }) => {\n const exit = useExit();\n let url = build.standardUniversalDownloadUrl;\n\n if (process.platform === \"darwin\" && build.mac?.standardDownloadUrl) {\n // Otherwise the download link may link to a Intel file when on Apple Silicon\n url = fixMacUrl(build.mac.standardDownloadUrl);\n }\n\n logForCI(`Build complete! ${url}`);\n\n // On build completion, exit with non-error code\n useEffect(() => {\n if (url) {\n // Just to avoid updating state after exiting the React app\n setTimeout(exit, 10);\n }\n }, [exit, url]);\n\n return (\n <Box marginBottom={1}>\n <Text>\n <Text bold>Build complete!</Text>{\" \"}\n <Link fallback={false} url={url}>\n {url || \"\"}\n </Link>\n </Text>\n </Box>\n );\n};\n\nBuildCompleteMessage.propTypes = {\n build: PropTypes.object.isRequired,\n};\n\nexport default BuildCompleteMessage;\n", "import isCi from \"is-ci\";\nimport logger from \"./logger\";\n\nexport default (...args) => {\n logger.info({ args }, \"logForCI\");\n\n if (isCi || !process.stdin.isTTY) {\n console.log(...args);\n }\n};\n", "import bunyan from \"bunyan\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as Sentry from \"@sentry/node\";\n\nlet logger: Logger;\n\ntry {\n const name = \"todesktop-cli\";\n\n let parentDirectory;\n const homePath = os.homedir();\n if (process.platform === \"darwin\") {\n parentDirectory = path.join(homePath, \"Library\", \"Logs\", name);\n } else if (process.platform === \"win32\") {\n parentDirectory = path.join(\n process.env.APPDATA || path.join(homePath, \"AppData\", \"Roaming\"),\n name,\n \"logs\"\n );\n } else {\n parentDirectory = path.join(\n process.env.XDG_CONFIG_HOME || path.join(homePath, \".config\"),\n name,\n \"logs\"\n );\n }\n\n fs.mkdirSync(parentDirectory, { recursive: true });\n\n logger = bunyan.createLogger({\n name,\n src: true,\n streams: [\n {\n level: \"debug\",\n path: path.join(parentDirectory, \"main.log\"),\n },\n ],\n });\n} catch (e) {\n // Ignore\n\n const noOp = () => {};\n logger = {\n debug: noOp,\n error: noOp,\n fatal: noOp,\n info: noOp,\n trace: noOp,\n warn: noOp,\n };\n\n try {\n Sentry.captureException(e);\n } catch (err) {\n // Ignore\n }\n}\n\nexport default logger;\n\nexport interface Logger {\n debug: LogFn;\n error: LogFn;\n fatal: LogFn;\n info: LogFn;\n trace: LogFn;\n warn: LogFn;\n}\n\nexport type LogFn = (obj: Error | object | string, ...args: unknown[]) => void;\n", "import { useApp } from \"ink\";\nimport { flush } from \"./analytics\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default () => {\n const { exit } = useApp();\n\n return (error?: Error) => {\n logger.debug({ error }, \"Exit called\");\n\n /*\n First, destroy connections.\n Why do we need to do this if we're going to call process.exit\n below anyway? Just to be safe in case a Firestore subscription\n triggers a state update after the React app is exited.\n */\n firestore.terminate().catch((e) =>\n // Ignore\n logger.error(e)\n );\n\n let timeoutId;\n Promise.race([\n // flush the analytics to make sure all outstanding events are pushed to segment\n new Promise<void>((resolve) => flush(() => resolve())),\n // If it takes longer than 1 second, resolve early to proceed with program exit\n new Promise<void>(\n (resolve) => (timeoutId = setTimeout(() => resolve(), 1000))\n ),\n ])\n .catch(() => {})\n .finally(() => {\n clearTimeout(timeoutId);\n /*\n Then, exit the React app. We don't pass the error because:\n 1. We don't want it displayed. We could give it a dummy error but\n that will output an empty line.\n 2. It doesn't exit with the correct code anyway, see\n https://github.com/vadimdemedes/pastel/issues/39.\n\n Side note: your component must not perform state updates after\n calling this, it will error.\n\n The try-catch shouldn't be needed here, but let's be safe\n */\n try {\n exit();\n } catch (e) {\n logger.error(e);\n // Ignore\n }\n\n /*\n Then exit the process.\n It should happen if all connections, etc. are destroyed. We manually\n exit with a code because:\n 1. We might not clean up properly, it could fail or take a long time.\n 2. The exit function above doesn't exit the CLI with the correct\n code anyway.\n\n If we had a way to detect when the app exits, we would use that\n and then call process.exit / destroy connections appropriately\n (https://github.com/vadimdemedes/pastel/issues/38).\n */\n setTimeout(() => process.exit(error ? 1 : 0), 10);\n });\n };\n};\n", "import os from \"os\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport Analytics from \"analytics-node\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\nimport { currentUser } from \"./firestore\";\nimport { getAuthConfig } from \"./configStore\";\nimport getCliVersion from \"./getCliVersion\";\n\nconst environmentVariables = getEnvironmentVariables();\n\nconst analytics = new Analytics(environmentVariables.SEGMENT_WRITE_KEY, {\n flushAt: 1,\n flushInterval: 1,\n});\n\nexport const ANALYTICS_EVENT = {\n CLI_COMMAND: \"CLI Command\",\n};\n\nfunction getAnalyticsBaseProperties() {\n const baseProps = {\n app: {\n cliVersion: \"\",\n },\n client: \"cli\",\n user: {\n email: \"\",\n },\n os: {\n name: \"\",\n version: \"\",\n },\n runtime: {\n name: \"Node.js\",\n version: \"\",\n },\n };\n try {\n baseProps.os = {\n name: os.platform(),\n version: os.release(),\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.user = {\n email: getAuthConfig().email as string,\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.app = {\n cliVersion: getCliVersion(),\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.runtime = {\n name: \"Node.js\",\n version: process.version,\n };\n } catch (err) {\n // nothing\n }\n\n return baseProps;\n}\n\nconst anonymousId = uuidv4();\nexport const track = (event, properties = {}, callback = () => {}) => {\n try {\n const user = currentUser();\n\n analytics.track(\n {\n event,\n userId: user ? user.uid : undefined,\n anonymousId,\n properties: {\n ...properties,\n ...getAnalyticsBaseProperties(),\n },\n },\n callback\n );\n } catch (err) {\n // nothing\n }\n};\n\nexport const identify = (id, traits = {}, callback = () => {}) => {\n try {\n analytics.identify({ userId: id, anonymousId, traits }, callback);\n } catch (err) {\n // nothing\n }\n};\n\nexport const flush = (callback = () => {}) => analytics.flush(callback);\n", "import dotenv from \"dotenv\";\nimport path from \"path\";\n\nlet hasInitialized = false;\n\nconst init = () => {\n if (hasInitialized) {\n return;\n }\n\n dotenv.config({\n path: path.resolve(__dirname, \"../.env\"),\n });\n hasInitialized = true;\n};\n\ntype EnvVars = {\n TODESKTOP_CLI_ENV: string;\n TODESKTOP_CLI_S3_BUCKET: string;\n TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE: string;\n TODESKTOP_CLI_FIREBASE_API_KEY: string;\n TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN: string;\n TODESKTOP_CLI_FIREBASE_DATABASE_URL: string;\n TODESKTOP_CLI_FIREBASE_PROJECT_ID: string;\n TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET: string;\n TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID: string;\n TODESKTOP_CLI_FIREBASE_ID: string;\n TODESKTOP_CLI_SENTRY_DSN: string;\n SEGMENT_WRITE_KEY: string;\n};\n\nexport default () => {\n init();\n return process.env as NodeJS.ProcessEnv & EnvVars;\n};\n", "import firebase from \"firebase/app\";\nimport \"firebase/firestore\";\nimport \"firebase/auth\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nconst environmentVariables = getEnvironmentVariables();\n\n// if (environmentVariables.NODE_ENV === \"development\") {\n// if (true) {\n// firebase.firestore.setLogLevel(\"debug\");\n// }\n\nconst firebaseDB = firebase.initializeApp({\n apiKey: environmentVariables.TODESKTOP_CLI_FIREBASE_API_KEY,\n authDomain: environmentVariables.TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN,\n databaseURL: environmentVariables.TODESKTOP_CLI_FIREBASE_DATABASE_URL,\n projectId: environmentVariables.TODESKTOP_CLI_FIREBASE_PROJECT_ID,\n storageBucket: environmentVariables.TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET,\n messagingSenderId:\n environmentVariables.TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID,\n appId: environmentVariables.TODESKTOP_CLI_FIREBASE_ID,\n});\n\nexport const currentUser = () => firebase.auth().currentUser;\nexport const signInWithCustomToken = async (token) => {\n return firebase.auth().signInWithCustomToken(token);\n};\n\n/**\n * onUserAuth is only triggered on sign-in. This\n * happens once signInWithCustomToken is successful.\n *\n * It technically also triggers on sign-out but there's\n * no concept of signing out of firebase with the CLI app.\n * (See logout command which just deletes a local file)\n */\nexport const onUserAuth = (handler) =>\n firebase.auth().onAuthStateChanged((user) => {\n handler(user || {});\n });\n\nexport default firebaseDB.firestore();\n", "import * as fs from \"fs\";\nimport del from \"del\";\nimport Conf from \"conf\";\nimport xdgBasedir from \"xdg-basedir\";\n\nconst config = new Conf({ configName: \"todesktop-cli\" });\n\nexport const accessTokenConfigKey = \"accessToken\";\nexport const emailConfigKey = \"email\";\nexport const jwtTokenConfigKey = \"jwtToken\";\n\nexport const setConfig = (key, value) => config.set(key, value);\nexport const getConfig = (key) => config.get(key) as string;\n\nexport const setAuthConfig = (email, accessToken, jwtToken) => {\n setConfig(emailConfigKey, email);\n setConfig(accessTokenConfigKey, accessToken);\n setConfig(jwtTokenConfigKey, jwtToken);\n};\n\nexport const getAuthConfig = () => {\n const accessToken = getConfig(accessTokenConfigKey);\n const jwtToken = getConfig(jwtTokenConfigKey);\n const email = getConfig(emailConfigKey);\n\n return { accessToken, jwtToken, email };\n};\n\nexport const deleteAuthConfig = () => {\n config.delete(emailConfigKey);\n config.delete(accessTokenConfigKey);\n config.delete(jwtTokenConfigKey);\n};\n\n// TODO - Delete by end of April: backwards compatibility for old configstore\nconst oldConfigPath = `${xdgBasedir.config}/configstore/config.json.json`;\nif (fs.existsSync(oldConfigPath)) {\n try {\n // copy config from old json file to new json file, delete old file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { email, accessToken, jwtToken } = require(oldConfigPath);\n setAuthConfig(email, accessToken, jwtToken);\n del(oldConfigPath, { force: true });\n } catch (err) {\n // if invalid json, delete file to prompt new login\n del(oldConfigPath, { force: true });\n }\n}\n", "import pkgUp from \"pkg-up\";\nimport type toDesktopPackageJson from \"../../package.json\";\nimport readJson from \"./readJson\";\n\ntype ToDesktopPackageJson = typeof toDesktopPackageJson;\n\nconst packageJson = readJson<ToDesktopPackageJson>(\n pkgUp.sync({ cwd: __dirname })\n);\n\nexport default function getToDesktopPackageJson(): ToDesktopPackageJson {\n return packageJson;\n}\n", "// This exists so it can be mocked in tests\nexport default function readJson<T>(filePath: string): T {\n return require(filePath);\n}\n", "import getToDesktopPackageJson from \"./getToDesktopPackageJson\";\n\nconst cliVersion = getToDesktopPackageJson().version;\n\nexport default () => cliVersion;\n", "/**\n * Fixes the Mac URL by adding the correct architecture to the URL.\n * @param url The URL to fix.\n * @returns The fixed URL.\n */\nexport default function fixMacUrl(url: string) {\n const baseUrl = new URL(url);\n baseUrl.pathname = `${baseUrl.pathname}/zip/${process.arch}`;\n return baseUrl.href;\n}\n", "import PropTypes from \"prop-types\";\nimport { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport fixMacUrl from \"../utilities/fixMacUrl\";\n\nconst preLabelMaxWidth = \"More info: \".length;\n\nconst getProgressPercentageLabel = (\n percentage: number,\n activityType?: \"error\"\n) => {\n let backgroundColor = \"white\";\n let color = \"black\";\n\n if (activityType === \"error\") {\n backgroundColor = \"red\";\n } else if (percentage === 100) {\n backgroundColor = \"green\";\n color = \"black\";\n }\n\n return (\n <>\n <Text backgroundColor={backgroundColor} color={color}>\n {\" \"}\n {Math.round(percentage).toString().padStart(2, \"0\")}%{\" \"}\n </Text>\n <Text> </Text>\n </>\n );\n};\n\nconst PlatformProgress = ({\n activityName,\n activityType,\n downloadUrl,\n percent,\n platform,\n shouldShowReadyPrefix,\n}) => {\n let progressIndicator;\n if (activityType === \"done\") {\n if (platform === \"mac\") {\n // Otherwise the download link may link to a Intel file when on Apple Silicon\n downloadUrl = fixMacUrl(downloadUrl);\n }\n progressIndicator = (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n {getProgressPercentageLabel(100)}\n {shouldShowReadyPrefix ? \"Ready!\" : \"\"}\n </Text>\n <Link fallback={false} url={downloadUrl}>\n {downloadUrl}\n </Link>\n </Box>\n );\n } else {\n let activityNameToDisplay = activityName.replace(\n /(?:\\r\\n|\\r|\\n)\\s*/g,\n \"\u21B5 \"\n );\n if (activityNameToDisplay.length > 64) {\n activityNameToDisplay = `${activityNameToDisplay.substr(0, 61)}...`;\n }\n\n progressIndicator = (\n <>\n <Box flexDirection={\"column\"} marginBottom={1}>\n <Text>\n {[\"preparation\", \"queue\"].includes(activityType)\n ? undefined\n : getProgressPercentageLabel(percent, activityType)}\n {activityNameToDisplay}\n {activityType === \"error\" ? \"\" : <Text>...</Text>}\n </Text>\n </Box>\n </>\n );\n }\n return (\n <Box>\n <Box width={preLabelMaxWidth}>\n <Text>{platform[0].toUpperCase() + platform.substr(1)}: </Text>\n </Box>\n {progressIndicator}\n </Box>\n );\n};\n\nPlatformProgress.propTypes = {\n activityName: PropTypes.string.isRequired,\n activityType: PropTypes.string.isRequired,\n downloadUrl: PropTypes.string,\n percent: PropTypes.number.isRequired,\n platform: PropTypes.string.isRequired,\n shouldShowReadyPrefix: PropTypes.bool,\n};\n\nexport default PlatformProgress;\n", "export const hasBuildKickedOff = (build) => {\n if (!build) {\n return false;\n }\n return build.status && build.status !== \"preparation\";\n};\n\n// NOTE: this relies on Firestore solely\nexport const isBuildCancellable = (build) =>\n hasBuildKickedOff(build) && isBuildRunning(build);\n\nexport const isBuildRunning = (build) => {\n if (!build) {\n return false;\n }\n return (\n ![\"cancelled\", \"succeeded\"].includes(build.status) &&\n [\"linux\", \"mac\", \"windows\"].some((platform) =>\n isPlatformBuildRunning(build[platform])\n )\n );\n};\n\nexport const isPlatformBuildRunning = (platformBuild) => {\n if (!platformBuild) {\n return false;\n }\n return (\n !platformBuild.shouldSkip && // <-- Noteworthy\n ![\"cancelled\", \"succeeded\"].includes(platformBuild.status) &&\n (\"failed\" !== platformBuild.status ||\n platformBuild.numberOfAttemptedBuilds < 2)\n );\n};\n", "import { Box, Text } from \"ink\";\nimport { useEffect } from \"react\";\nimport CliError from \"../utilities/CliError\";\nimport getCliVersion from \"../utilities/getCliVersion\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\n\nexport default function ErrorDisplay({\n commandUsed,\n error,\n}: {\n commandUsed?: string;\n error?: unknown;\n}) {\n const exit = useExit();\n\n const normalizedError = CliError.from(error);\n\n logger.error({ error });\n\n // After an error is set, exit\n useEffect(() => {\n if (!error) {\n return;\n }\n // Just to avoid updating state after exiting the React app\n setTimeout(() => exit(normalizedError), 10);\n }, [exit, error, normalizedError]);\n\n return (\n <>\n <Text backgroundColor=\"red\" color=\"white\">\n {\" \"}\n ERROR{\" \"}\n </Text>\n <Text>{normalizedError.message}</Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {commandUsed ? (\n <Text dimColor color=\"gray\">\n Command: {commandUsed}\n </Text>\n ) : null}\n <Text dimColor color=\"gray\">\n @todesktop/cli: {getCliVersion()}\n </Text>\n <Text dimColor color=\"gray\">\n Node: {process.version}\n </Text>\n <Text dimColor color=\"gray\">\n cwd: {process.cwd()}\n </Text>\n </Box>\n </>\n );\n}\n", "export default class CliError extends Error {\n type: CliErrorType;\n constructor(\n message: string,\n { cause, type = \"error\" }: { cause?: Error; type?: CliErrorType } = {}\n ) {\n super(message, { cause });\n this.type = type;\n }\n\n static from(e: unknown, type: CliErrorType = \"error\"): CliError {\n if (e instanceof Error) {\n return new CliError(e.message, { cause: e, type });\n } else if (typeof e === \"string\") {\n return new CliError(e, { type });\n } else {\n return new CliError(JSON.stringify(e), { type });\n }\n }\n}\n\nexport type CliErrorType = \"build-error\" | \"error\";\n", "// libs\nimport { Box, Text, useStdin } from \"ink\";\nimport isCi from \"is-ci\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { Build } from \"../types\";\n\n// components\nimport CancelBuild from \"./CancelBuild\";\nimport Footer from \"./Footer\";\nimport Header from \"./Header\";\n\n// utilities\nimport {\n hasBuildKickedOff,\n isBuildCancellable,\n} from \"../utilities/buildStatus\";\nimport logger from \"../utilities/logger\";\nimport useInput from \"../utilities/useInput\";\n\nconst MainLayout = ({\n appId,\n appName,\n appVersion,\n build,\n children,\n commandUsed,\n hasBuildEverFailed,\n}: {\n appId?: string;\n appName: string;\n appVersion?: string;\n build?: Build;\n children?: ReactNode;\n commandUsed?: string;\n hasBuildEverFailed?: boolean;\n}) => {\n logger.debug(\"MainLayout component: render\");\n const onInput = useInput();\n const { isRawModeSupported } = useStdin();\n\n const [\n { canCancelBuild, hasKickedOff, isCancellingBuild, wasCtrlCPressed },\n setState,\n ] = useState({\n canCancelBuild: null,\n hasKickedOff: false,\n isCancellingBuild: false,\n wasCtrlCPressed: false,\n });\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n hasKickedOff: hasBuildKickedOff(build),\n }));\n }, [build]);\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n canCancelBuild:\n !isCi &&\n isRawModeSupported &&\n !isCancellingBuild &&\n isBuildCancellable(build),\n }));\n }, [build, isCancellingBuild, isRawModeSupported]);\n\n onInput(\n async (input, key) => {\n if (key.escape && canCancelBuild) {\n logger.debug(\"MainLayout component: esc pressed, cancelling build\");\n\n setState((previousState) => ({\n ...previousState,\n isCancellingBuild: true,\n }));\n }\n },\n {},\n {\n onCtrlCPressed: () => {\n setState((previousState) => ({\n ...previousState,\n wasCtrlCPressed: true,\n }));\n },\n }\n );\n\n return (\n <>\n <Header build={build} name={appName} version={appVersion} />\n\n {isCancellingBuild ? (\n <Box flexDirection=\"column\" marginBottom={1}>\n <CancelBuild appId={appId} commandUsed={commandUsed} id={build.id} />\n </Box>\n ) : (\n children\n )}\n\n <Footer\n hasBuildEverFailed={hasBuildEverFailed}\n shouldShowCancelBuildInstructions={canCancelBuild && !wasCtrlCPressed}\n uiUrl={build ? build.url : null}\n />\n\n {wasCtrlCPressed && hasKickedOff ? (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"gray\">\n The build will continue in the background. To view it, run:\n </Text>\n </Box>\n <Box>\n <Text bold color=\"gray\">\n todesktop builds {build.id}\n </Text>\n </Box>\n </>\n ) : null}\n </>\n );\n};\n\nexport default MainLayout;\n", "// libs\nimport { Text } from \"ink\";\nimport { ReactNode, useEffect, useState } from \"react\";\n\n// components\nimport ErrorDisplay from \"./ErrorDisplay\";\n\n// utils\nimport getCallableFirebaseFunction from \"../utilities/getCallableFirebaseFunction\";\nimport logForCI from \"../utilities/logForCI\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\n\nconst cancelBuild = getCallableFirebaseFunction(\"cancelBuild\");\n\nconst CancelBuild = ({\n appId,\n children: postCancelContents,\n commandUsed,\n id,\n}: {\n appId: string;\n children?: ReactNode;\n commandUsed: string;\n id: string;\n}) => {\n logger.debug({ appId, buildId: id }, \"CancelBuild component: render\");\n\n const exit = useExit();\n const [\n { arbitraryMessageComponent, error, hasCompleted, hasStarted },\n setState,\n ] = useState({\n arbitraryMessageComponent: null,\n error: null,\n hasCompleted: false,\n hasStarted: false,\n });\n\n useEffect(() => {\n if (hasCompleted || hasStarted) {\n return;\n }\n\n setState((previousState) => ({ ...previousState, hasStarted: true }));\n logForCI(\"Cancelling build...\");\n cancelBuild({ appId, buildId: id })\n .then((result) => {\n logger.debug(\n { appId, buildId: id, result },\n \"CancelBuild component: cancellation request complete\"\n );\n setState((previousState) => ({ ...previousState, hasCompleted: true }));\n })\n .catch((e) => {\n logger.debug(\n { appId, buildId: id, code: e.code },\n \"CancelBuild component: cancellation request failed\"\n );\n logger.error(e);\n const stateUpdates = {\n arbitraryMessageComponent: undefined,\n error: undefined,\n hasCompleted: true,\n };\n\n if (e.code === \"internal\") {\n stateUpdates.error = e;\n } else {\n stateUpdates.arbitraryMessageComponent = (\n <Text>\n <Text color=\"red\">Cannot cancel build ({id}).</Text> {e.message}\n </Text>\n );\n }\n\n setState((prevState) => ({\n ...prevState,\n ...stateUpdates,\n }));\n });\n }, [appId, id, hasStarted, hasCompleted]);\n\n // Exit when done, unless there are custom contents to display\n useEffect(() => {\n if (hasCompleted && !postCancelContents) {\n logger.debug(\n \"CancelBuild component: exiting now that build is cancelled\"\n );\n exit();\n }\n }, [postCancelContents, exit, hasCompleted]);\n\n if (error) {\n error.message = `Failed to cancel build (${id}). ${error.message}`;\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (arbitraryMessageComponent) {\n return arbitraryMessageComponent;\n }\n\n if (hasCompleted) {\n return postCancelContents ? (\n <>{postCancelContents}</>\n ) : (\n <Text>Build cancelled</Text>\n );\n }\n\n return <Text>Cancelling build ({id})...</Text>;\n};\n\nexport default CancelBuild;\n", "import firebase from \"firebase\";\nimport \"firebase/functions\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nconst env = getEnvironmentVariables();\n\nif (env.TODESKTOP_CLI_ENV === \"development\") {\n const firebaseUrl = new URL(env.TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE);\n firebase.functions().useFunctionsEmulator(firebaseUrl.origin);\n}\n\nexport default (functionName) =>\n firebase.functions().httpsCallable(functionName);\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport PropTypes from \"prop-types\";\n\nconst Footer = ({\n hasBuildEverFailed,\n shouldShowCancelBuildInstructions,\n uiUrl,\n}) => {\n if (!uiUrl) {\n return null;\n }\n\n let buildFailedMessage;\n if (hasBuildEverFailed) {\n buildFailedMessage = <Text color=\"red\">An error has occurred. </Text>;\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\">\n <Text bold>{buildFailedMessage}See web UI for more information: </Text>\n <Text>\n <Link fallback={false} url={uiUrl}>\n {uiUrl}\n </Link>\n </Text>\n </Box>\n {shouldShowCancelBuildInstructions ? (\n <Text color=\"gray\">\n <Text bold>[esc]:</Text> cancel build\n </Text>\n ) : null}\n </Box>\n );\n};\n\nFooter.propTypes = {\n hasBuildEverFailed: PropTypes.bool,\n shouldShowCancelBuildInstructions: PropTypes.bool,\n uiUrl: PropTypes.string,\n};\n\nexport default Footer;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\nconst getText = (build, name, version) => {\n const suffix = name + (version ? ` v${version}` : \"\");\n\n if (build && [\"cancelled\", \"succeeded\", \"failed\"].includes(build.status)) {\n if (build.status === \"succeeded\") {\n return <Text>\u2705 {suffix}</Text>;\n } else if (build.status === \"failed\") {\n return <Text>\u274C {suffix}</Text>;\n } else if (build.status === \"cancelled\") {\n return (\n <Text>\n <Text bold color=\"gray\">\n X\n </Text>{\" \"}\n {suffix}\n </Text>\n );\n }\n } else {\n return <Text>{suffix}</Text>;\n }\n};\n\nconst Header = ({ build, name, version }) => (\n <Box marginBottom={1}>{getText(build, name, version)}</Box>\n);\n\nHeader.propTypes = {\n build: PropTypes.object,\n name: PropTypes.string.isRequired,\n version: PropTypes.string,\n};\n\nexport default Header;\n", "import isCi from \"is-ci\";\nimport { useInput, useStdin } from \"ink\";\nimport useExit from \"./useExit\";\n\nlet hasSubscribed = false;\nconst ctrlCSubscriptions = [];\n\nconst onStdin = (data: Buffer, exit: () => void) => {\n let input = String(data);\n let wasCtrlPressed = false;\n if (input <= \"\\u001A\" && input !== \"\\r\") {\n input = String.fromCharCode(input.charCodeAt(0) + \"a\".charCodeAt(0) - 1);\n wasCtrlPressed = true;\n }\n if (wasCtrlPressed && input === \"c\") {\n ctrlCSubscriptions.forEach((subscription) => subscription());\n setTimeout(exit, 10);\n }\n};\n\n/*\n See https://github.com/vadimdemedes/pastel/issues/38\n*/\nexport default () => {\n const exit = useExit();\n const { stdin, isRawModeSupported } = useStdin();\n\n if (isCi || !isRawModeSupported) {\n return () => () => {};\n }\n\n return (\n callback: Handler,\n useInputOptions: Options = {},\n { onCtrlCPressed = null } = {}\n ) => {\n const onStdinData = (data: Buffer) => onStdin(data, exit);\n\n if (onCtrlCPressed) {\n ctrlCSubscriptions.push(onCtrlCPressed);\n }\n\n if (!hasSubscribed) {\n hasSubscribed = true;\n\n // This is based on the Ink (useInput) source\n stdin.on(\"data\", onStdinData);\n }\n\n const cleanUpInputHook = useInput(callback, useInputOptions) as any;\n\n return () => {\n if (hasSubscribed) {\n stdin.off(\"data\", onStdinData);\n }\n cleanUpInputHook?.();\n };\n };\n};\n\ntype Handler = Parameters<typeof useInput>[0];\ntype Options = Parameters<typeof useInput>[1];\n", "import { Box, Text } from \"ink\";\nimport ProgressBar from \"./ProgressBar\";\nimport PropTypes from \"prop-types\";\n\nconst Preparation = ({ progressPercentage, stageLabel, uploadedSize }) => {\n return (\n <Box marginBottom={1}>\n <Text>{stageLabel}: </Text>\n <Box flexDirection={\"column\"}>\n <ProgressBar left={11} percent={progressPercentage} />\n {uploadedSize ? <Text>{uploadedSize}</Text> : undefined}\n </Box>\n </Box>\n );\n};\n\nPreparation.propTypes = {\n progressPercentage: PropTypes.number.isRequired,\n stageLabel: PropTypes.string.isRequired,\n uploadedSize: PropTypes.string,\n};\n\nexport default Preparation;\n", "import PropTypes from \"prop-types\";\nimport Gradient from \"ink-gradient\";\nimport Bar from \"../../../libs/ink-progress-bar\";\n\nconst ProgressBar = ({ left, right, percent }) => (\n <Gradient colors={[\"gray\", \"white\"]}>\n <Bar left={left} right={right} percent={percent} />\n </Gradient>\n);\n\nProgressBar.propTypes = {\n left: PropTypes.number,\n right: PropTypes.number,\n // 0 -> 1\n percent: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n", "/**\n * Ported from https://github.com/brigand/ink-progress-bar/blob/master/src/index.js\n * `ink-progress-bar` doesn't list react or ink as a direct dependency which messes up\n * installation for users of yarn v2+.\n */\nimport { Text } from \"ink\";\n\nconst Bar = ({\n percent = 1,\n columns = 0,\n left = 0,\n right = 0,\n character = \"\u2588\",\n rightPad = false,\n ...rest\n}) => {\n const getString = () => {\n const screen = columns || process.stdout.columns || 80;\n const space = screen - right - left;\n const max = Math.min(Math.floor(space * percent), space);\n const chars = character.repeat(max);\n\n if (!rightPad) {\n return chars;\n }\n\n return chars + \" \".repeat(space - max);\n };\n\n return <Text {...rest}>{getString()}</Text>;\n};\n\nexport default Bar;\n", "// libs\n\nimport axios from \"axios\";\nimport prettyBytes from \"pretty-bytes\";\n\n// utils\nimport { currentUser } from \"../../../utilities/firestore\";\nimport logForCI from \"../../../utilities/logForCI\";\nimport postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\nimport getProjectConfig from \"../../../utilities/projectConfig/getProjectConfig\";\nimport shouldExitOnBuildFailure from \"../../../utilities/shouldExitOnBuildFailure\";\nimport getAppPkgJson from \"./getPackageJson\";\nimport getVersionControlInfo from \"./getVersionControlInfo\";\nimport spyBuild from \"./spyBuild\";\nimport { BuildState } from \"./types\";\nimport uploadApplicationSource from \"./uploadApplicationSource\";\n\nexport default async function runBuild({\n configPath,\n exitAfterUploading,\n shouldCodeSign = true,\n onBuildFinishedWebhook,\n updateState,\n}: {\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign?: boolean;\n updateState: (state: Partial<BuildState>) => void;\n}) {\n logForCI(\"Getting application information...\");\n\n const primaryUserId = currentUser()?.uid;\n\n // This will throw if validation fails or project root can not be found:\n const { config, unprocessedConfig } = getProjectConfig(configPath);\n const appId = config.id;\n const appPkgJson = getAppPkgJson({ config });\n\n const buildObserver = spyBuild();\n buildObserver.onUpdate(({ build }) => updateState({ build }));\n\n updateState({\n appId,\n appPkg: appPkgJson,\n onUnmount: () => buildObserver.unsubscribe(),\n preparationStageLabel: \"Preparing\",\n preparationProgress: 0.02,\n state: \"preparing\",\n });\n logForCI(\"Preparing...\");\n\n // Create build in Firebase\n let buildId: string;\n try {\n const prepareResult = await postToFirebaseFunction(\"prepareNewBuild\", {\n appPkgName: appPkgJson.name,\n appPkgProductName: appPkgJson.productName,\n appVersion: appPkgJson.version,\n id: config.id,\n onBuildFinishedWebhook,\n projectConfig: unprocessedConfig,\n shouldCodeSign: shouldCodeSign !== false,\n shouldRelease: false,\n userId: primaryUserId,\n versionControlInfo: await getVersionControlInfo(config.appPath),\n });\n buildId = prepareResult.appData.meta.currentBuildProgress.id;\n\n buildObserver.subscribe({ appId, buildId, userId: prepareResult.userId });\n await buildObserver.whenFirstUpdate();\n } catch (e) {\n throw addErrorMessage(e, \"Failed while preparing new build\");\n }\n\n updateState({\n preparationProgress: 0.05,\n preparationStageLabel: \"Uploading\",\n });\n logForCI(\"Uploading...\");\n\n let sourceArchiveDetails: unknown;\n try {\n sourceArchiveDetails = await uploadApplicationSource({\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress(progress: number, uploadedSize?: number) {\n // Upload is treated as 95% of preparation\n const preparationState = {\n preparationProgress: 0.05 + (progress / 100) * 0.95,\n preparationUploadedSize: \"\",\n };\n\n if (uploadedSize) {\n preparationState.preparationUploadedSize = prettyBytes(uploadedSize);\n }\n\n updateState(preparationState);\n },\n });\n } catch (e) {\n throw addErrorMessage(e, \"Failed while uploading application source\");\n }\n\n updateState({ state: \"building\" });\n logForCI(\"Kicking off build...\");\n\n try {\n await postToFirebaseFunction(\"kickOffBuild\", {\n appId,\n appPkgName: appPkgJson.name,\n appVersion: appPkgJson.version,\n buildId,\n userId: primaryUserId,\n sourceArchiveDetails,\n nodeVersion: config.nodeVersion,\n npmVersion: config.npmVersion,\n pnpmVersion: config.pnpmVersion,\n appBuilderLibVersion: config.appBuilderLibVersion,\n });\n } catch (e) {\n throw addErrorMessage(e, \"Failed while kicking off build\");\n }\n\n if (exitAfterUploading) {\n updateState({ state: \"exit-after-uploading\" });\n return;\n }\n\n const build = await buildObserver.whenSettled();\n if (build?.status === \"failed\" && shouldExitOnBuildFailure(build)) {\n updateState({ state: \"build-failed\" });\n }\n}\n\nfunction addErrorMessage(e: unknown, message: string): Error {\n let originalMessage = \"\";\n if (axios.isAxiosError(e) && e.response?.data?.message) {\n originalMessage = e.response.data.message;\n } else if (e instanceof Error) {\n originalMessage = e.message;\n } else if (e && typeof e === \"object\") {\n originalMessage = JSON.stringify(e);\n } else {\n originalMessage = String(e);\n }\n\n const newError = new Error(`${message}; ${originalMessage}`);\n if (e instanceof Error) {\n newError.stack = e.stack;\n }\n\n return newError;\n}\n", "import axios from \"axios\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\nimport logger from \"./logger\";\n\nconst { TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE } = getEnvironmentVariables();\n\nexport default async function (functionName, body = {}, config = {}) {\n logger.debug({ functionName, body, config }, \"postToFirebaseFunction\");\n\n try {\n const response = await axios.post(\n `${TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE}${functionName}`,\n body,\n config\n );\n\n logger.debug(\n { responseData: response.data },\n \"postToFirebaseFunction: success\"\n );\n return response.data;\n } catch (e) {\n logger.error({ error: e }, \"postToFirebaseFunction: error\");\n throw e;\n }\n}\n", "import { dirname, resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport findUp from \"find-up\";\nimport { ProjectConfig } from \"../../types\";\nimport loadConfig from \"./loadConfig\";\nimport resolveConfigPaths from \"./resolveConfigPaths\";\nimport validateConfig from \"./validateConfig\";\nimport logger from \"../logger\";\nimport computeFullProjectConfig from \"./computeFullProjectConfig\";\n\nexport default function getProjectConfig(configPath?: string): {\n config: ProjectConfig;\n unprocessedConfig: ProjectConfig;\n projectRoot: string;\n} {\n // If no config path is provided, we'll try to find one\n if (!configPath) {\n logger.debug(\"No config path provided, searching for one\");\n configPath = findUp.sync(\"todesktop.json\");\n if (!configPath) {\n throw new Error(\n \"Can not find todesktop.json in this folder or any parent folders\"\n );\n }\n } else {\n configPath = resolve(process.cwd(), configPath);\n\n // If the config path is provided\n if (!existsSync(configPath)) {\n logger.error(\"Provided config path does not exist\");\n throw new Error(`Config file not found at ${configPath}`);\n }\n }\n\n const projectRoot = dirname(configPath);\n\n // This will throw if it's not valid JSON\n const partialConfig = loadConfig(configPath);\n\n // compute the full project config\n const config = computeFullProjectConfig(partialConfig, projectRoot);\n\n // This will throw if invalid\n validateConfig({ config, projectRoot });\n\n const result = resolveConfigPaths({ config, projectRoot });\n\n return { config: result, unprocessedConfig: config, projectRoot };\n}\n", "// This is its own file just so we can mock it more easily\nimport { PartialProjectConfig } from \"../../types\";\n\nexport default function loadConfig(configPath: string): PartialProjectConfig {\n return require(configPath);\n}\n", "import * as path from \"path\";\nimport { ProjectConfig } from \"../../types\";\n\nexport default function resolveConfigPaths({\n config,\n projectRoot,\n}: {\n config: ProjectConfig;\n projectRoot: string;\n}): ProjectConfig {\n const appRoot = config.appPath\n ? path.isAbsolute(config.appPath)\n ? config.appPath\n : path.join(projectRoot, config.appPath)\n : projectRoot;\n\n const transformIfExists = (value, transformer) =>\n value ? transformer(value) : undefined;\n const resolvePath = (filePath) =>\n path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n\n const result = {\n ...config,\n appPath: appRoot,\n icon: resolvePath(config.icon),\n };\n\n if (config.extraContentFiles) {\n result.extraContentFiles = transformIfExists(\n config.extraContentFiles,\n (extraContentFiles) =>\n extraContentFiles.map((extraContentFile) => ({\n ...extraContentFile,\n from: resolvePath(extraContentFile.from),\n }))\n );\n }\n\n if (config.extraResources) {\n result.extraResources = transformIfExists(\n config.extraResources,\n (extraResources) =>\n extraResources.map((extraResource) => ({\n ...extraResource,\n from: resolvePath(extraResource.from),\n }))\n );\n }\n\n if (config.linux) {\n result.linux = { ...config.linux };\n\n if (config.linux.icon) {\n result.linux.icon = resolvePath(config.linux.icon);\n }\n }\n\n if (config.mac) {\n result.mac = { ...config.mac };\n\n if (config.mac.entitlements) {\n result.mac.entitlements = resolvePath(config.mac.entitlements);\n }\n\n if (config.mac.entitlementsInherit) {\n result.mac.entitlementsInherit = resolvePath(\n config.mac.entitlementsInherit\n );\n }\n\n if (config.mac.requirements) {\n result.mac.requirements = resolvePath(config.mac.requirements);\n }\n\n if (config.mac.icon) {\n result.mac.icon = resolvePath(config.mac.icon);\n }\n }\n\n if (config.mas) {\n result.mas = { ...config.mas };\n\n if (config.mas.entitlements) {\n result.mas.entitlements = resolvePath(config.mas.entitlements);\n }\n\n if (config.mas.entitlementsInherit) {\n result.mas.entitlementsInherit = resolvePath(\n config.mas.entitlementsInherit\n );\n }\n\n if (config.mas.provisioningProfile) {\n result.mas.provisioningProfile = resolvePath(\n config.mas.provisioningProfile\n );\n }\n }\n\n if (config.dmg) {\n if (config.dmg.background) {\n result.dmg.background = resolvePath(config.dmg.background);\n }\n }\n\n if (config.windows) {\n result.windows = { ...config.windows };\n\n if (config.windows.icon) {\n result.windows.icon = resolvePath(config.windows.icon);\n }\n }\n\n return result;\n}\n", "import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport betterAjvErrors from \"better-ajv-errors\";\nimport { ProjectConfig } from \"../../types\";\nimport addCustomKeywords from \"./addCustomKeywords\";\nimport getFullSchema from \"./schema/full\";\n\nexport default function validateConfig({\n config,\n projectRoot,\n}: {\n config: ProjectConfig;\n projectRoot: string;\n}) {\n const context = { projectRoot };\n const schema = getFullSchema(context);\n\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n addCustomKeywords(ajv, context);\n const validate = ajv.compile(schema);\n\n if (!validate(config)) {\n const output = betterAjvErrors(schema, config, validate.errors, {\n indent: 2,\n });\n\n throw new Error(\n `todesktop.json invalid. \\nLearn more here: https://www.npmjs.com/package/@todesktop/cli#project-configuration-todesktopjson \\n\\n${output}`\n );\n }\n\n if (config.productName) {\n throw new Error(\n `todesktop.json invalid.\n\nThe \"productName\" property is no longer supported in todesktop.json. Please remove it and add it to your app's package.json instead.\n\nWe made this change because Electron also uses the \"productName\" if it exists in your app's package.json. If you do not add it to your package.json, your app name will default to the value of the \"name\" property in your package.json.`\n );\n }\n}\n", "/*\n See https://ajv.js.org/keywords.html\n*/\nimport Ajv, {\n FuncKeywordDefinition,\n SchemaValidateFunction,\n ValidationError,\n} from \"ajv\";\nimport emailRegex from \"email-regex\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport parseAuthor from \"parse-author\";\nimport * as semver from \"semver\";\nimport validatePackageJSON from \"./validatePackageJSON\";\nimport semverValidRange from \"semver/ranges/valid\";\n\nexport default (ajv: Ajv, context) => {\n const addKeyword = (def: FuncKeywordDefinition) => {\n const validate: SchemaValidateFunction = (schema, data) => {\n try {\n return (def.validate as SchemaValidateFunction)(schema, data);\n } catch (e) {\n if (e instanceof ValidationError) {\n validate.errors = e.errors;\n return false;\n }\n\n throw e;\n }\n };\n\n ajv.addKeyword({ ...def, validate });\n };\n\n addKeyword({\n keyword: \"validSemver\",\n type: \"string\",\n validate: (schema, data) => {\n if (!semverValidRange(data)) {\n throw new ValidationError([\n {\n keyword: \"validSemver\",\n message: `${data} must be a valid semantic version or version range`,\n },\n ]);\n }\n\n return true;\n },\n });\n\n // validate that dependencies object doesn't contain packageNames in the blacklist\n addKeyword({\n keyword: \"excludedDependencies\",\n validate: (schema, data) => {\n const matchingPackages = schema.blacklist.filter(\n (packageName) => data[packageName]\n );\n\n if (matchingPackages.length) {\n throw new ValidationError([\n {\n keyword: \"Dependency\",\n message: `${matchingPackages.join(\", \")} should not be in ${\n schema.dependencyKey\n }`,\n instancePath: `/${schema.dependencyKey}`,\n },\n ]);\n }\n\n return true;\n },\n });\n\n // TODO: Remove if isn't used\n addKeyword({\n keyword: \"email\",\n type: \"string\",\n validate: (schema, data) => {\n if (!emailRegex({ exact: true }).test(data)) {\n throw new ValidationError([\n {\n keyword: \"email\",\n message: \"invalid\",\n },\n ]);\n }\n return true;\n },\n });\n\n addKeyword({\n keyword: \"file\",\n type: \"string\",\n validate: (schema, data) => {\n const mustBeDirectory =\n schema.mustBeDirectory || schema.mustBeElectronApp;\n\n // Value is empty\n if (!data.trim().length) {\n if (schema.isOptional) {\n return true;\n }\n\n throw new ValidationError([\n {\n keyword: schema.mustBeDirectory ? \"Directory\" : \"File\",\n message: \"is empty\",\n },\n ]);\n }\n\n const filePath = path.isAbsolute(data)\n ? data\n : path.join(schema.from, data);\n\n // Isn't in project\n if (path.relative(schema.from, filePath).startsWith(\"..\")) {\n throw new ValidationError([\n {\n keyword: mustBeDirectory ? \"Directory\" : \"File\",\n message: `is not in project (${filePath})`,\n },\n ]);\n }\n\n // Extension isn't allowed\n if (\n schema.extensions &&\n !schema.extensions.includes(path.extname(filePath).substr(1))\n ) {\n throw new ValidationError([\n {\n keyword: \"File extension\",\n message: `invalid. ${path.extname(data)} Must be${\n schema.extensions > 1 ? \"one of the following:\" : \"\"\n } \"${schema.extensions.join('\", \"')}\"`,\n },\n ]);\n }\n\n // Doesn't exist\n if (!fs.existsSync(filePath)) {\n throw new ValidationError([\n {\n keyword: mustBeDirectory ? \"Directory\" : \"File\",\n message: `does not exist (${filePath})`,\n },\n ]);\n }\n\n const stats = fs.statSync(filePath);\n\n if (mustBeDirectory && stats.isFile()) {\n throw new ValidationError([\n {\n keyword: \"Directory\",\n message: `must be a directory, not a file (${filePath})`,\n },\n ]);\n } else if (schema.mustBeFile && stats.isDirectory()) {\n throw new ValidationError([\n {\n keyword: \"File\",\n message: `must be a file, not a directory (${filePath})`,\n },\n ]);\n }\n\n if (schema.mustBeElectronApp) {\n const appRoot = path.resolve(filePath);\n const pkgPath = path.join(appRoot, \"package.json\");\n\n if (!fs.existsSync(pkgPath)) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. There is no package.json at ${pkgPath}`,\n },\n ]);\n }\n\n let pkg;\n try {\n pkg = require(pkgPath);\n } catch (e) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. Invalid JSON in package.json (${pkgPath})`,\n },\n ]);\n }\n\n context.projectRoot = appRoot;\n // This throws and bubbles all the way up to the user\n validatePackageJSON(pkg, pkgPath, context);\n\n // Validate that either an index.js or valid \"main\" property exists\n const mainFilePath = pkg.main;\n if (mainFilePath) {\n const resolvedMainFilePath = path.join(appRoot, mainFilePath);\n if (!fs.existsSync(resolvedMainFilePath)) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. The \"main\" file specified in your package.json (${mainFilePath}) does not exist (${resolvedMainFilePath})`,\n },\n ]);\n }\n } else {\n if (!fs.existsSync(path.join(appRoot, \"index.js\"))) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message:\n 'invalid. There is neither a \"main\" property in your package.json nor an index.js at the root of your app',\n },\n ]);\n }\n }\n }\n\n return true;\n },\n errors: true,\n });\n\n addKeyword({\n keyword: \"npmAuthor\",\n validate: (schema, data) => {\n const dataType = typeof data;\n if (dataType === \"undefined\") {\n return true;\n } else if (dataType === \"string\") {\n const parsedAuthor = parseAuthor(data);\n if (!parsedAuthor || !parsedAuthor.email) {\n throw new ValidationError([\n {\n keyword: \"author\",\n message:\n 'invalid. If you\\'re using a string, it must look something like \"Barney Rubble <b@rubble.com>\", see https://docs.npmjs.com/files/package.json#people-fields-author-contributors',\n },\n ]);\n }\n } else if (dataType === \"object\") {\n if (typeof data.name === \"undefined\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `invalid. \"name\" property is missing.`,\n },\n ]);\n } else {\n if (typeof data.name !== \"string\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.name invalid. It must be a string`,\n },\n ]);\n }\n\n if (typeof data.email === \"undefined\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `invalid. \"email\" property is missing.`,\n },\n ]);\n } else {\n if (typeof data.email === \"string\") {\n if (!emailRegex({ exact: true }).test(data.email)) {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.email invalid. It does not look like an email.`,\n },\n ]);\n }\n } else {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.email invalid. It must be a string.`,\n },\n ]);\n }\n }\n }\n } else {\n // Neither object nor string\n throw new ValidationError([\n {\n keyword: \"author\",\n message:\n \"invalid. It must either be an object or string. See https://docs.npmjs.com/files/package.json#people-fields-author-contributors\",\n },\n ]);\n }\n\n return true;\n },\n errors: true,\n });\n\n addKeyword({\n keyword: \"semanticVersion\",\n type: \"string\",\n validate: (schema, data) => {\n const keyword =\n (schema.packageName ? `${schema.packageName} ` : \"\") + \"version\";\n\n if (!(semver.valid(data) || semver.validRange(data))) {\n throw new ValidationError([\n {\n keyword,\n message:\n \"invalid. It must be a semantic version (see https://semver.org/)\",\n },\n ]);\n }\n\n if (\n schema.mustBeExact &&\n (data.startsWith(\"~\") || data.startsWith(\"^\"))\n ) {\n throw new ValidationError([\n {\n keyword,\n message:\n \"invalid. It must be an exact version. Good: 9.0.0. Bad: ^9.0.0\",\n },\n ]);\n }\n return true;\n },\n });\n};\n", "import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport betterAjvErrors from \"better-ajv-errors\";\nimport addCustomKeywords from \"./addCustomKeywords\";\nimport getPackageJsonSchema from \"./schema/packageJSON\";\n\nexport default (pkg, pkgPath, context) => {\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n addCustomKeywords(ajv, context);\n const schema = getPackageJsonSchema(context);\n const validate = ajv.compile(schema);\n if (!validate(pkg)) {\n const output = betterAjvErrors(schema, pkg, validate.errors, {\n indent: 2,\n });\n\n const error = new Error(`package.json invalid (${pkgPath}); \\n${output}`);\n (error as any).isValidationError = true;\n // This throws and bubbles all the way up to the user\n throw error;\n }\n};\n", "export default (context) => {\n return {\n type: \"object\",\n required: [\n \"author\",\n \"dependencies\",\n \"devDependencies\",\n \"homepage\",\n \"name\",\n \"version\",\n ],\n properties: {\n author: {\n npmAuthor: {},\n },\n dependencies: {\n type: \"object\",\n required: [\"@todesktop/runtime\"],\n // custom keyword that checks package names aren't included in dependencies\n excludedDependencies: {\n dependencyKey: \"dependencies\",\n blacklist: [\"@todesktop/cli\"],\n },\n properties: {\n \"@todesktop/runtime\": {\n type: \"string\",\n },\n },\n },\n devDependencies: {\n type: \"object\",\n required: [\"electron\"],\n properties: {\n electron: {\n type: \"string\",\n semanticVersion: {\n packageName: \"electron\",\n mustBeExact: true,\n },\n },\n },\n },\n name: {\n type: \"string\",\n minLength: 1,\n },\n scripts: {\n type: \"object\",\n properties: {\n \"todesktop:beforeInstall\": {\n type: \"string\",\n file: {\n from: context.projectRoot,\n mustBeFile: true,\n },\n },\n \"todesktop:afterPack\": {\n type: \"string\",\n file: {\n from: context.projectRoot,\n mustBeFile: true,\n },\n },\n },\n },\n version: {\n type: \"string\",\n semanticVersion: {},\n },\n },\n };\n};\n", "const getItemOrArrayOfItemsSchema = (itemSchema) => {\n return {\n oneOf: [\n itemSchema,\n {\n type: \"array\",\n items: itemSchema,\n },\n ],\n };\n};\n\nexport default (context) => {\n const getIconSchema = (additionalAllowedExtensions = []) => {\n return {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"icns\", \"png\", ...additionalAllowedExtensions],\n mustBeFile: true,\n },\n minLength: 3,\n };\n };\n\n return {\n type: \"object\",\n required: [\"id\", \"icon\", \"schemaVersion\"],\n properties: {\n appBuilderLibVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n appId: { type: \"string\", minLength: 1 },\n appFiles: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n appProtocolScheme: {\n oneOf: [\n { type: \"string\", minLength: 1 },\n {\n type: \"array\",\n items: { type: \"string\", minLength: 1 },\n minItems: 1,\n },\n ],\n },\n appPath: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n isOptional: true,\n mustBeElectronApp: true,\n },\n },\n asar: {\n type: \"boolean\",\n default: true,\n },\n asarUnpack: {\n oneOf: [\n { type: \"boolean\" },\n {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n ],\n },\n buildVersion: { type: \"string\", minLength: 1 },\n copyright: { type: \"string\", minLength: 1 },\n electronMirror: {\n type: \"string\",\n format: \"uri\",\n },\n electronVersion: {\n type: \"string\",\n minLength: 1,\n },\n extraContentFiles: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"from\"],\n properties: {\n from: {\n type: \"string\",\n file: { from: context.projectRoot },\n },\n to: { type: \"string\" },\n },\n },\n },\n extraResources: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"from\"],\n properties: {\n from: {\n type: \"string\",\n file: { from: context.projectRoot },\n },\n to: { type: \"string\" },\n },\n },\n },\n fileAssociations: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"ext\"],\n properties: {\n ext: getItemOrArrayOfItemsSchema({\n type: \"string\",\n minLength: 1,\n }),\n description: {\n type: \"string\",\n minLength: 1,\n },\n name: {\n type: \"string\",\n minLength: 1,\n },\n mimeType: {\n type: \"string\",\n minLength: 1,\n },\n icon: {\n type: \"string\",\n minLength: 1,\n },\n role: {\n type: \"string\",\n minLength: 1,\n },\n isPackage: {\n type: \"boolean\",\n },\n rank: {\n type: \"string\",\n minLength: 1,\n },\n },\n },\n minItems: 1,\n },\n filesForDistribution: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n icon: getIconSchema(),\n linux: {\n type: \"object\",\n properties: {\n category: { type: \"string\", minLength: 1 },\n icon: getIconSchema(),\n noSandbox: { type: \"boolean\" },\n },\n },\n id: { type: \"string\", minLength: 1 },\n includeSubNodeModules: {\n type: \"boolean\",\n default: false,\n },\n mac: {\n type: \"object\",\n properties: {\n category: { type: \"string\", minLength: 1 },\n additionalBinariesToSign: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n entitlements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n entitlementsInherit: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n extendInfo: {\n type: \"object\",\n },\n icon: getIconSchema(),\n requirements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"txt\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n },\n },\n mas: {\n type: \"object\",\n properties: {\n entitlements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n entitlementsInherit: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n provisioningProfile: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"provisionprofile\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n type: {\n type: \"string\",\n enum: [\"development\", \"distribution\"],\n },\n x64ArchFiles: {\n type: \"string\",\n },\n },\n },\n dmg: {\n type: \"object\",\n properties: {\n background: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"tiff\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n artifactName: { type: \"string\", minLength: 1 },\n backgroundColor: { type: \"string\", minLength: 1 },\n iconSize: { type: \"number\" },\n iconTextSize: { type: \"number\" },\n title: { type: \"string\", minLength: 1 },\n contents: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n },\n },\n window: {\n type: \"object\",\n properties: {\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n },\n },\n },\n },\n nodeVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n npmVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n pnpmVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n packageManager: {\n type: \"string\",\n enum: [\"npm\", \"yarn\", \"pnpm\"],\n },\n rebuildLibrary: {\n type: \"string\",\n enum: [\"app-builder\", \"@electron/rebuild\"],\n },\n schemaVersion: { type: \"number\", minimum: 1, maximum: 1 },\n snap: {\n type: \"object\",\n properties: {\n after: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n appPartStage: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n assumes: getItemOrArrayOfItemsSchema({\n type: \"string\",\n minLength: 1,\n }),\n autoStart: {\n type: \"boolean\",\n },\n buildPackages: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n confinement: {\n type: \"string\",\n enum: [\"classic\", \"devmode\", \"strict\"],\n },\n environment: {\n type: \"object\",\n },\n grade: {\n type: \"string\",\n enum: [\"devel\", \"stable\"],\n },\n layout: {\n type: \"object\",\n },\n plugs: {\n type: \"array\",\n items: {\n anyOf: [\n {\n type: \"string\",\n minLength: 1,\n },\n {\n type: \"object\",\n },\n ],\n },\n },\n stagePackages: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n summary: {\n type: \"string\",\n maxLength: 78,\n },\n useTemplateApp: {\n type: \"boolean\",\n },\n },\n },\n uploadSizeLimit: {\n type: \"number\",\n },\n windows: {\n type: \"object\",\n properties: {\n icon: getIconSchema([\"ico\"]),\n nsisCustomBinary: {\n type: \"object\",\n properties: {\n checksum: { type: \"string\" },\n debugLogging: { type: \"boolean\" },\n url: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n nsisInclude: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"nsh\"],\n mustBeFile: true,\n },\n },\n },\n },\n },\n };\n};\n", "import { PartialProjectConfig, ProjectConfig } from \"../../types\";\nimport logger from \"../logger\";\nimport loadConfig from \"./loadConfig\";\nimport { resolve } from \"path\";\nimport merge from \"lodash.merge\";\n\nexport default function computeFullProjectConfig(\n partialConfig: PartialProjectConfig,\n projectRoot: string\n): ProjectConfig {\n if (!partialConfig.extends) {\n logger.debug(\"No extends field, returning partial config\");\n return partialConfig as ProjectConfig;\n } else {\n logger.debug(\"Extends field found, resolving\");\n const parentConfigPath = resolve(projectRoot, partialConfig.extends);\n const parentConfig = loadConfig(parentConfigPath);\n\n parentConfig.appPath = parentConfig.appPath || \".\";\n\n const parentFullConfig = computeFullProjectConfig(\n parentConfig,\n projectRoot\n );\n\n const result = merge({}, parentFullConfig, partialConfig);\n\n delete result.extends;\n return result;\n }\n}\n", "// X build has failed, should we exit? I.e. is it settled?\nexport default (build) => {\n const hasBuildSettled = [\"linux\", \"mac\", \"windows\"].every(\n (platform) =>\n build[platform].shouldSkip ||\n \"succeeded\" === build[platform].status ||\n (\"failed\" === build[platform].status &&\n build[platform].numberOfAttemptedBuilds === 2)\n );\n\n const hasSettledWithError = [\"linux\", \"mac\", \"windows\"].some(\n (platform) => \"failed\" === build[platform].status\n );\n\n return hasBuildSettled && hasSettledWithError;\n};\n", "import merge from \"lodash.merge\";\nimport path from \"path\";\nimport readJson from \"../../../utilities/readJson\";\n\nfunction deleteNullDeps(dep) {\n Object.keys(dep).forEach((key) => {\n if (dep[key] === null) {\n delete dep[key];\n }\n });\n return dep;\n}\n\n/**\n * Remove any dependencies or devDependencies that have a version of null.\n * This is useful for removing dependencies that are not to be used when building\n * in ToDesktop. For example this will remove the `electron-builder` dev dependency\n * from the package.json file when building in ToDesktop:\n * {\n * \"devDependencies\": {\n * \"electron-builder\": null\n * }\n * }\n */\nfunction removeNullDependencies(pkgJson) {\n const { dependencies, devDependencies } = pkgJson;\n\n if (dependencies) {\n pkgJson.dependencies = deleteNullDeps(dependencies);\n }\n\n if (devDependencies) {\n pkgJson.devDependencies = deleteNullDeps(devDependencies);\n }\n\n return pkgJson;\n}\n\nfunction getAppPkgJson({ config }) {\n const packageJsonFromConfig = config.packageJson || {};\n const extendsFrom = packageJsonFromConfig.extends || \"package.json\";\n const packageJsonFromFile = readJson(path.join(config.appPath, extendsFrom));\n\n return removeNullDependencies(\n merge({}, packageJsonFromFile, packageJsonFromConfig)\n );\n}\n\nexport default getAppPkgJson;\n", "import * as gitRevSync from \"git-rev-sync\";\n\nexport default async (directory) => {\n let result = {};\n\n try {\n const gitCommitHash = gitRevSync.long(directory);\n\n if (gitCommitHash) {\n result = {\n branchName: gitRevSync.branch(directory),\n commitDate: gitRevSync.date().toISOString(),\n commitId: gitCommitHash,\n commitMessage: gitRevSync.message(),\n hasUncommittedChanges: gitRevSync.isDirty(),\n repositoryRemoteUrl: gitRevSync.remoteUrl(),\n versionControlSystemName: \"git\",\n };\n }\n } catch (e) {\n // Ignore\n }\n\n return result;\n};\n", "import { Build } from \"@todesktop/shared\";\nimport EventEmitter from \"events\";\nimport type { DocSnapshot } from \"../../../types\";\nimport firestore from \"../../../utilities/firestore\";\n\nexport default function spyBuild() {\n const emitter = new EventEmitter();\n\n let unsubscribeSnapshot: (() => void) | undefined;\n let latestBuildDoc: Build | undefined;\n\n function when(predicate: (build: Build) => boolean) {\n if (latestBuildDoc && predicate(latestBuildDoc)) {\n return Promise.resolve(latestBuildDoc);\n }\n\n return new Promise<Build>((resolve, reject) => {\n emitter\n .on(\"update\", ({ build }) => {\n if (predicate(build)) {\n resolve(build);\n }\n })\n .once(\"error\", (e) => reject(e));\n });\n }\n\n return {\n onUpdate(\n callback: (data: {\n build: Build | undefined;\n snapshot: DocSnapshot<Build>;\n }) => void\n ) {\n emitter.on(\"update\", callback);\n },\n\n subscribe({\n appId,\n buildId,\n userId,\n }: {\n appId: string;\n buildId: string;\n userId: string;\n }) {\n const buildPath = `users/${userId}/applications/${appId}/builds/${buildId}`;\n unsubscribeSnapshot = firestore.doc(buildPath).onSnapshot(\n (snapshot) => {\n latestBuildDoc = snapshot.exists\n ? (snapshot.data() as Build)\n : undefined;\n emitter.emit(\"update\", {\n build: latestBuildDoc,\n snapshot: snapshot,\n });\n },\n (err) => {\n emitter.emit(\"error\", err);\n }\n );\n },\n\n unsubscribe() {\n unsubscribeSnapshot?.();\n },\n\n async whenFirstUpdate() {\n if (latestBuildDoc) {\n return Promise.resolve(latestBuildDoc);\n }\n\n return new Promise<Build>((resolve, reject) => {\n emitter\n .once(\"update\", (data) => resolve(data))\n .once(\"error\", (e) => reject(e));\n });\n },\n\n async whenSettled() {\n return when((build) => buildHasSettled(build));\n },\n };\n}\n\nfunction buildHasSettled(build: Build) {\n return ([\"linux\", \"mac\", \"windows\"] as const).every(\n (platform) =>\n build[platform]?.shouldSkip ||\n \"succeeded\" === build[platform]?.status ||\n \"cancelled\" === build[platform]?.status ||\n (\"failed\" === build[platform]?.status &&\n build[platform]?.numberOfAttemptedBuilds === 2)\n );\n}\n", "import fastGlob from \"fast-glob\";\nimport * as fs from \"fs\";\nimport { IPackageJson } from \"package-json-type\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../../../types\";\nimport generateS3Key from \"./generateS3Key\";\nimport logger from \"../../../utilities/logger\";\nimport uploadToS3 from \"./uploadToS3\";\nimport zip from \"./zip\";\n\nconst getAppFiles = async (globsInput, appPath, appPkgJson) => {\n const globs = [\"!node_modules\", \"!**/node_modules\", \"!.git\", \"!**/.git\"];\n\n if (globsInput && globsInput.length) {\n globs.push(\n ...globsInput,\n path.join(appPath, \"package.json\"),\n path.join(appPath, \"package-lock.json\"),\n path.join(appPath, \"yarn.lock\"),\n path.join(appPath, \"pnpm-lock.yaml\"),\n path.join(appPath, \"shrinkwrap.yaml\")\n );\n } else {\n globs.push(\"**\");\n }\n\n // automatically add hooks to `appFiles` if they exist\n for (const hookName of [\"todesktop:beforeInstall\", \"todesktop:afterPack\"]) {\n if (appPkgJson.scripts && appPkgJson.scripts[hookName]) {\n globs.push(path.join(appPath, appPkgJson.scripts[hookName]));\n }\n }\n\n const normalizedGlobs = globs\n .map((glob) => {\n // Make relative if it's not\n const globToUse = path.isAbsolute(glob)\n ? path.relative(appPath, glob)\n : glob;\n\n return (\n globToUse\n // Globs must always have forward slashes\n .replace(/\\\\/g, \"/\")\n // Remove trailing slash\n .replace(/\\/+$/, \"\")\n );\n })\n .filter((glob) => !glob.startsWith(\"..\") && !glob.startsWith(\"!..\"));\n\n let absolutePaths = await fastGlob(normalizedGlobs, {\n absolute: true,\n cwd: appPath,\n dot: true,\n followSymbolicLinks: false,\n onlyDirectories: false,\n onlyFiles: true,\n globstar: true,\n unique: true,\n });\n\n if (process.platform === \"win32\") {\n absolutePaths = absolutePaths.map((absolutePath) =>\n absolutePath.replace(/\\//g, path.sep)\n );\n }\n\n if (!absolutePaths || !absolutePaths.length) {\n throw new Error(\"No files found to upload\");\n } else if (\n !absolutePaths.filter((absolutePath) => absolutePath.endsWith(\".js\")).length\n ) {\n throw new Error(\n `No .js files found to upload (${absolutePaths[0]}). There's likely an issue with the appFiles option. Learn more at https://www.npmjs.com/package/@todesktop/cli#appfiles----optional-array-of-glob-patterns. If this is not the case, please contact us.`\n );\n } else {\n let mainFilePath = appPath;\n if (appPkgJson.main) {\n mainFilePath = path.join(mainFilePath, appPkgJson.main);\n }\n\n if (fs.statSync(mainFilePath).isDirectory()) {\n mainFilePath = path.join(mainFilePath, \"index.js\");\n }\n\n // Make sure the \"main\" file is included\n if (!absolutePaths.includes(mainFilePath)) {\n throw new Error(\n `The \"main\" file specified in your package.json (${\n appPkgJson.main\n ? path.relative(appPath, mainFilePath)\n : \"defaults to index.js\"\n }) is not set to be uploaded to our servers. This is likely due to how you have configured the \\`appFiles\\` option. Learn more at https://www.npmjs.com/package/@todesktop/cli#appfiles----optional-array-of-glob-patterns. If this is not the case, please contact us.`\n );\n }\n }\n\n return absolutePaths.map((absolutePath) => {\n return {\n from: absolutePath,\n to: path.join(\"app\", path.relative(appPath, absolutePath)),\n };\n });\n};\n\nexport default async function uploadApplicationSource({\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress,\n}: {\n appId: string;\n appPkgJson: IPackageJson;\n buildId: string;\n config: ProjectConfig;\n onProgress: (progress: number, uploadedSize?: number) => void;\n}) {\n logger.debug(\n {\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress,\n },\n \"uploadApplicationSource\"\n );\n // eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars\n let totalBytes = 0;\n\n const files = [\n /*\n App files (stored in app/ in the ZIP)\n */\n ...(await getAppFiles(config.appFiles, config.appPath, appPkgJson)),\n\n /*\n Optional extra content files (stored in extraContentFiles/ in the ZIP). Their\n paths within is the their relative path from the project root so\n there will be no issues with clashing filenames. We also don't\n also any file paths in our todesktop.json that are outside of the\n project directory\n */\n ...(config.extraContentFiles || []).map(({ from, to = \".\" }) => {\n return {\n from,\n to: path.join(\"extraContentFiles\", to, path.basename(from)),\n };\n }),\n\n /*\n Optional extra resources (stored in extraResources/ in the ZIP).\n Similar to extra content files above\n */\n ...(config.extraResources || []).map(({ from, to = \".\" }) => {\n return {\n from,\n to: path.join(\"extraResources\", to, path.basename(from)),\n };\n }),\n\n /*\n Icons (more may be added below)\n */\n {\n from: config.icon,\n to: path.join(\"icons\", \"appIcon\" + path.extname(config.icon)),\n },\n ];\n\n if (config.linux) {\n if (config.linux.icon) {\n files.push({\n from: config.linux.icon,\n to: path.join(\n \"icons\",\n \"appIcon-linux\" + path.extname(config.linux.icon)\n ),\n });\n }\n }\n\n if (Array.isArray(config.fileAssociations)) {\n const possibleIcons = [];\n for (const fa of config.fileAssociations) {\n if (fa.icon) {\n const icon = path.parse(fa.icon);\n // The right extension is set by electron-builder\n // https://github.com/electron-userland/electron-builder/blob/abf52eaf8dfba63eb9507c03032d8f7e2f26dd2b/packages/builder-util/src/util.ts#L320\n possibleIcons.push(\n { ext: fa.ext, icon: path.join(icon.dir, icon.name) + \".ico\" },\n { ext: fa.ext, icon: path.join(icon.dir, icon.name) + \".icns\" }\n );\n }\n }\n\n await Promise.all(\n possibleIcons.map(async ({ ext, icon }) => {\n if (await exists(icon)) {\n files.push({\n from: icon,\n to: path.join(\"icons\", \"association-\" + ext + path.extname(icon)),\n });\n }\n })\n );\n }\n\n if (config.mac) {\n if (config.mac.entitlements) {\n files.push({\n from: config.mac.entitlements,\n to: path.join(\"other\", \"mac\", \"entitlements.mac.plist\"),\n });\n }\n\n if (config.mac.entitlementsInherit) {\n files.push({\n from: config.mac.entitlementsInherit,\n to: path.join(\"other\", \"mac\", \"entitlementsInherit.mac.plist\"),\n });\n }\n\n if (config.mac.icon) {\n files.push({\n from: config.mac.icon,\n to: path.join(\"icons\", \"appIcon-mac\" + path.extname(config.mac.icon)),\n });\n }\n\n if (config.mac.requirements) {\n files.push({\n from: config.mac.requirements,\n to: path.join(\"other\", \"mac\", \"requirements.txt\"),\n });\n }\n }\n\n if (config.mas) {\n if (config.mas.entitlements) {\n files.push({\n from: config.mas.entitlements,\n to: path.join(\"other\", \"mac\", \"entitlements.mas.plist\"),\n });\n }\n\n if (config.mas.entitlementsInherit) {\n files.push({\n from: config.mas.entitlementsInherit,\n to: path.join(\"other\", \"mac\", \"entitlementsInherit.mas.plist\"),\n });\n }\n\n if (config.mas.provisioningProfile) {\n files.push({\n from: config.mas.provisioningProfile,\n to: path.join(\"other\", \"mac\", \"mas.provisionprofile\"),\n });\n }\n }\n\n if (config.dmg) {\n if (config.dmg.background) {\n files.push({\n from: config.dmg.background,\n to: path.join(\"other\", \"mac\", \"dmg-background.tiff\"),\n });\n }\n }\n\n if (config.windows) {\n if (config.windows.icon) {\n files.push({\n from: config.windows.icon,\n to: path.join(\n \"icons\",\n \"appIcon-windows\" + path.extname(config.windows.icon)\n ),\n });\n }\n\n if (config.windows.nsisInclude) {\n files.push({\n from: config.windows.nsisInclude,\n to: path.join(\"other\", \"installer.nsh\"),\n });\n }\n }\n\n return uploadToS3({\n bucket: config.bucket || undefined,\n inputStream: await zip({\n files,\n fileSizeLimit: config.uploadSizeLimit,\n onError: (e) => {\n throw e;\n },\n onProgress({ fs }) {\n totalBytes = fs.totalBytes;\n },\n appPkgJson,\n }),\n key: generateS3Key({\n appId,\n buildId,\n filenameSuffix: `${appPkgJson.name}.zip`,\n }),\n onProgress({ loaded, total }) {\n onProgress((loaded / total) * 100, loaded);\n },\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.promises.access(filePath);\n return true;\n } catch (e) {\n return false;\n }\n}\n", "export default ({ appId, buildId, filenameSuffix }) =>\n `${appId}/sourceArchives/${buildId}--${filenameSuffix}`;\n", "import superagent from \"superagent\";\nimport streamToArray from \"stream-to-array\";\nimport getEnvironmentVariables from \"../../../utilities/getEnvironmentVariables\";\nimport logger from \"../../../utilities/logger\";\nimport getCallableFirebaseFunction from \"../../../utilities/getCallableFirebaseFunction\";\n\nconst { TODESKTOP_CLI_S3_BUCKET } = getEnvironmentVariables();\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 2000; // 2 seconds\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\ntype UploadParams = {\n bucket?: string;\n inputStream: NodeJS.ReadableStream;\n key: string;\n onProgress?: (event: { loaded: number; total: number }) => void;\n};\n\ntype UploadedResponse = {\n bucket: string;\n key: string;\n url: string;\n};\n\ntype GetSignedURLResponse = {\n data: {\n signedURL: string;\n uploadURL: string;\n };\n};\n\nconst uploadToS3WithRetry = async (\n input: UploadParams,\n retries = MAX_RETRIES\n): Promise<any> => {\n try {\n return await uploadToS3(input);\n } catch (error) {\n if (retries > 0) {\n logger.warn(\n `Upload failed. Retrying... (${\n MAX_RETRIES - retries + 1\n } of ${MAX_RETRIES})`\n );\n await delay(RETRY_DELAY);\n return uploadToS3WithRetry(input, retries - 1);\n } else {\n logger.error(\"All retries exhausted. Upload failed.\");\n throw error;\n }\n }\n};\n\nconst uploadToS3 = async ({\n bucket = TODESKTOP_CLI_S3_BUCKET,\n inputStream,\n key,\n onProgress = () => {},\n}: UploadParams): Promise<UploadedResponse> => {\n const getSignedURL = getCallableFirebaseFunction(\"getSignedURL\");\n const { data }: GetSignedURLResponse = await getSignedURL({\n key,\n });\n\n const parts = await streamToArray(inputStream);\n const buffers = parts.map((part) =>\n Buffer.isBuffer(part) ? part : Buffer.from(part)\n );\n const body = Buffer.concat(buffers);\n\n return new Promise((resolve, reject) => {\n superagent\n .put(data.signedURL)\n .send(body)\n .set(\"content-type\", \"application/zip\")\n .on(\"progress\", onProgress)\n .end((err) => {\n logger.debug({ bucket, key, url: data.uploadURL }, \"uploadToS3\");\n if (err) {\n logger.error({ err }, \"uploadToS3\");\n return reject(err);\n }\n return resolve({ bucket, key, url: data.uploadURL });\n });\n });\n};\n\nexport default uploadToS3WithRetry;\n", "import archiver from \"archiver\";\nimport du from \"du\";\nimport fs from \"fs\";\nimport chalk from \"chalk\";\nimport logger from \"../../../utilities/logger\";\nimport path from \"path\";\n\nexport default async function ({\n files,\n fileSizeLimit = 20,\n onError,\n onProgress,\n appPkgJson,\n}) {\n logger.debug({ files }, \"zip\");\n const stream = archiver(\"zip\");\n\n // good practice to catch warnings (ie stat failures and other non-blocking errors)\n stream.on(\"warning\", function (err) {\n if (err.code === \"ENOENT\") {\n console.warn(err);\n logger.warn({ err }, \"zip: stream warning ENOENT\");\n } else {\n // throw error\n onError(err);\n }\n });\n\n // good practice to catch this error explicitly\n stream.on(\"error\", function (err) {\n onError(err);\n });\n\n // Grab the file size and more\n const processedFiles = await Promise.all(\n files.map(async (file) => {\n const stats = fs.lstatSync(file.from);\n const isDirectory = stats.isDirectory();\n\n return {\n ...file,\n isDirectory,\n stats,\n size: isDirectory ? await du(file.from) : stats.size,\n };\n })\n );\n\n const totalFileSize = processedFiles.reduce((sum, b) => sum + b.size, 0);\n // Does file size sum exceed limit?\n if (totalFileSize > fileSizeLimit * 1000000) {\n onError(\n new Error(\n [\n `\\n\\nYour app is larger than ${fileSizeLimit}MB. Your app is ${chalk.bold.red.underline(\n (totalFileSize / 1000000).toFixed(1) + \"MB\"\n )}.\\n`,\n `You may be including unnecessary files in your app(see the \\`appPath\\` and \\`appFiles\\` options).`,\n `If not, this limit can be raised by setting the \\`uploadSizeLimit\\` option.`,\n `Learn more at https://www.npmjs.com/package/@todesktop/cli#uploadsizelimit---optional-number`,\n ].join(\"\\n\")\n )\n );\n return stream;\n }\n\n // Add the files to the ZIP\n processedFiles.forEach(({ from, isDirectory, stats, to }) => {\n if (isDirectory) {\n stream.directory(from, to);\n } else if (appPkgJson && to === path.join(\"app\", \"package.json\")) {\n stream.append(JSON.stringify(appPkgJson), {\n name: to,\n });\n } else {\n stream.file(from, { name: to, mode: stats.mode });\n }\n });\n\n // finalize the archive (ie we are done appending files but streams have to finish yet)\n // 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand\n stream.finalize();\n\n stream.on(\"progress\", (progress) =>\n onProgress({\n ...progress,\n percentage: (progress.entries.processed / progress.entries.total) * 100,\n })\n );\n\n return stream;\n}\n", "import { useState } from \"react\";\n\n/*\n This should be called at the top of all commands to test if React\n is OK and if not, to exit cleanly.\n\n If React throws an error (e.g. when there are multiple versions of\n React in the customer's dependency tree), then we need to exit with\n a non-zero error code and not with an uncaught exception somewhere.\n\n These parameters exist only to make things more testable\n*/\nexport default ({ cons = console, proc = process } = {}) => {\n try {\n useState(null);\n } catch (e) {\n cons.error(e);\n proc.exit(1);\n }\n};\n", "import { useStdin } from \"ink\";\nimport { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport isCi from \"is-ci\";\n\n// components\nimport Login from \"./Login\";\n\n// logic\nimport { signInWithCustomToken } from \"../utilities/firestore\";\nimport { getAuthConfig, setAuthConfig } from \"../utilities/configStore\";\nimport postToFirebaseFunction from \"../utilities/postToFirebaseFunction\";\nimport getEnvironmentVariables from \"../utilities/getEnvironmentVariables\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport LoadingText from \"./LoadingText\";\n\nconst LoginHOC = ({ children, isInteractive = true }) => {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [isEffectDone, setEffectDone] = useState(false);\n const [error, setError] = useState(null);\n const { isRawModeSupported } = useStdin();\n\n const onFailure = (message, err = {}) => {\n setError({\n ...err,\n message,\n });\n };\n\n // use effect for determining if tokens exist and are valid\n useEffect(() => {\n async function isAccessTokenValid() {\n const { accessToken, email, jwtToken } = getAuthConfig();\n let userCreds = null;\n\n const { TODESKTOP_ACCESS_TOKEN, TODESKTOP_EMAIL } =\n getEnvironmentVariables();\n\n // 1. attempt log in with environment variables if present\n try {\n if (TODESKTOP_ACCESS_TOKEN && TODESKTOP_EMAIL) {\n const newJwtToken = await postToFirebaseFunction(\n \"loginWithAccessToken\",\n {\n email: TODESKTOP_EMAIL,\n accessToken: TODESKTOP_ACCESS_TOKEN,\n }\n );\n\n if (newJwtToken) {\n userCreds = await signInWithCustomToken(newJwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n // if no environment variables set and is in a CI, set alert message and exit\n } else if (!isRawModeSupported || isCi) {\n onFailure(\n \"ToDesktop environment variables not found. When automating builds with your CI provider, you need to specify environment variables for TODESKTOP_EMAIL and TODESKTOP_ACCESS_TOKEN.\"\n );\n }\n } catch (err) {\n // print error and stop the app execution if env variables attempted\n onFailure(\"Log in with environment variables failed.\", err);\n }\n\n // 2. attempt log in with jwtToken if present\n try {\n if (!userCreds && jwtToken) {\n userCreds = await signInWithCustomToken(jwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n } catch (err) {\n // do nothing, attempt login with accessToken and email\n }\n\n // 3. attempt log in with accessToken and email on disk\n try {\n if (!userCreds && accessToken && email) {\n const newJwtToken = await postToFirebaseFunction(\n \"loginWithAccessToken\",\n { email, accessToken }\n );\n\n if (newJwtToken) {\n userCreds = await signInWithCustomToken(newJwtToken);\n setAuthConfig(email, accessToken, newJwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n }\n } catch (err) {\n // do nothing: no error state and not logged in state means render login\n }\n\n setEffectDone(true);\n }\n\n isAccessTokenValid();\n }, [isRawModeSupported]);\n\n if (error && isInteractive) {\n return <ErrorDisplay error={error} />;\n }\n\n if (!isEffectDone) {\n return <LoadingText />;\n }\n\n if (!isLoggedIn && isInteractive) {\n return <Login setIsLoggedIn={setIsLoggedIn} />;\n }\n\n return <>{children}</>;\n};\n\nLoginHOC.propTypes = {\n children: PropTypes.object,\n isInteractive: PropTypes.bool,\n};\n\nexport default LoginHOC;\n", "// modules\nimport { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useState } from \"react\";\nimport { Form, Field } from \"react-final-form\";\n\n// components\nimport TextInput from \"./TextInput\";\nimport ErrorDisplay from \"./ErrorDisplay\";\n\n// logic\nimport postToFirebaseFunction from \"../utilities/postToFirebaseFunction\";\nimport { signInWithCustomToken } from \"../utilities/firestore\";\nimport { setAuthConfig } from \"../utilities/configStore\";\n\nconst loginFields = [\n {\n name: \"email\",\n label: \"Your email\",\n placeholder: \"name@email.com\",\n Input: TextInput,\n validate: (value) => {\n if (!value) return \"Required\";\n },\n },\n {\n name: \"accessToken\",\n label: \"Your access token\",\n placeholder: \"********\",\n Input: TextInput,\n validate: (value) => {\n if (!value) return \"Required\";\n },\n mask: \"*\",\n },\n];\n\nconst Login = ({ setIsLoggedIn }) => {\n const [activeField, setActiveField] = useState(0);\n const [error, setError] = useState(null);\n const [failureMessage, setFailureMessage] = useState(null);\n const [isSubmittingForm, setIsSubmittingForm] = useState(false);\n\n const onFailure = (message) => {\n setIsSubmittingForm(false);\n setFailureMessage(message);\n setActiveField(0);\n };\n\n // login handler that verifies accessToken and email with that in firebase\n const onSubmitLogin = async ({ email, accessToken }) => {\n setFailureMessage(null);\n setIsSubmittingForm(true);\n\n try {\n const jwtToken = await postToFirebaseFunction(\"loginWithAccessToken\", {\n email,\n accessToken,\n });\n\n if (jwtToken) {\n await signInWithCustomToken(jwtToken);\n setAuthConfig(email, accessToken, jwtToken);\n setIsLoggedIn(true);\n } else {\n onFailure(\"Incorrrect credentials. Try again\");\n }\n } catch (err) {\n if (err.code === 500) {\n setError(err);\n } else {\n onFailure(\n `Login unsuccessful: ${err?.response?.data?.message || err.message}`\n );\n }\n }\n };\n\n if (error) return <ErrorDisplay error={error} />;\n\n return (\n <>\n <Text>You are not currently logged in.</Text>\n <Text>Log in below:</Text>\n <Box marginBottom={1} />\n <Form onSubmit={onSubmitLogin}>\n {({ handleSubmit, validating }) => (\n <Box flexDirection=\"column\">\n {loginFields.map(\n ({ name, label, placeholder, validate, Input, mask }, index) => (\n <Field name={name} key={name} validate={validate}>\n {({ input, meta }) => (\n <Box flexDirection=\"column\">\n {activeField >= index ? (\n <Box>\n <Text bold={activeField === index}>{label}: </Text>\n {activeField === index ? (\n <Input\n {...input}\n mask={mask}\n placeholder={placeholder}\n onSubmit={() => {\n if (meta.valid && !validating) {\n setActiveField((value) => value + 1); // go to next field\n if (activeField === loginFields.length - 1) {\n // last field, so submit\n handleSubmit();\n }\n } else {\n input.onBlur(); // mark as touched to show error\n }\n }}\n />\n ) : (\n (input.value && (\n <Text>\n {name === \"accessToken\"\n ? input.value.replace(/./gi, \"*\")\n : input.value}\n </Text>\n )) ||\n (placeholder && (\n <Text color=\"gray\">{placeholder}</Text>\n ))\n )}\n {meta.invalid && meta.touched && (\n <Box marginLeft={2} marginRight={1}>\n <Text color=\"red\">\u2716</Text>\n </Box>\n )}\n {meta.error && meta.touched && (\n <Error errorMessage={meta.error} />\n )}\n </Box>\n ) : null}\n </Box>\n )}\n </Field>\n )\n )}\n </Box>\n )}\n </Form>\n\n {isSubmittingForm && (\n <Box marginTop={1}>\n <Text>Logging in...</Text>\n </Box>\n )}\n\n {failureMessage && <Error errorMessage={failureMessage} marginTop />}\n </>\n );\n};\n\nconst Error = ({ errorMessage, marginTop }) => (\n <Box marginTop={marginTop ? 1 : 0}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n);\n\nError.propTypes = {\n errorMessage: PropTypes.string.isRequired,\n marginTop: PropTypes.bool,\n};\n\nLogin.propTypes = {\n setIsLoggedIn: PropTypes.func.isRequired,\n};\n\nexport default Login;\n", "import InkTextInput from \"ink-text-input\";\nimport React from \"react\";\n\nconst TextInput = ({ onBlur, onFocus, ...props }: TextInputProps) => {\n React.useEffect(() => {\n onFocus();\n return onBlur;\n }, [onFocus, onBlur]);\n return <InkTextInput {...props} showCursor />;\n};\n\nexport default TextInput;\n\ntype InkTextInputProps = React.ComponentProps<typeof InkTextInput>;\ninterface TextInputProps extends InkTextInputProps {\n onBlur: () => void;\n onFocus: () => void;\n}\n", "import { Text, useStdout } from \"ink\";\n\nconst LoadingText = ({ text = \"Loading\" }: { text?: string }) => {\n const { stdout } = useStdout();\n const stdOutRedirected = !stdout.isTTY;\n if (stdOutRedirected) {\n // Don't write Loading text if we're not in a TTY (e.g... redirected to a file)\n return null;\n }\n\n return <Text>{text}...</Text>;\n};\n\nexport default LoadingText;\n", "import React, { ReactNode } from \"react\";\nimport * as Sentry from \"@sentry/node\";\n\nclass ErrorBoundary extends React.Component<\n { children: ReactNode },\n { error?: Error; eventId?: string }\n> {\n constructor(props) {\n super(props);\n this.state = { eventId: null, error: null };\n }\n\n static getDerivedStateFromError(error) {\n return { error };\n }\n\n componentDidCatch(error, errorInfo) {\n Sentry.withScope((scope) => {\n scope.setExtras(errorInfo);\n const eventId = Sentry.captureException(error);\n this.setState({ eventId });\n });\n }\n\n render() {\n if (this.state.error) {\n throw this.state.error;\n }\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n", "import { Box, Text, useStdin } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport PropTypes from \"prop-types\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport type { Build } from \"@todesktop/shared\";\nimport CancelBuild from \"../../../components/CancelBuild\";\nimport CustomSelectInputIndicator from \"../../../components/CustomSelectInputIndicator\";\nimport CustomSelectInputItem from \"../../../components/CustomSelectInputItem\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport ViewBuild from \"../../../components/ViewBuild\";\nimport {\n isBuildCancellable,\n isBuildRunning,\n} from \"../../../utilities/buildStatus\";\nimport firestore from \"../../../utilities/firestore\";\nimport getProjectConfig from \"../../../utilities/projectConfig/getProjectConfig\";\nimport logger from \"../../../utilities/logger\";\nimport useInput from \"../../../utilities/useInput\";\nimport useExit from \"../../../utilities/useExit\";\nimport isCi from \"is-ci\";\nimport findAppUserId from \"../../../utilities/findAppUserId\";\n\nconst OngoingBuildGuard = ({\n children,\n commandUsed,\n configPath,\n}: {\n children: ReactNode;\n commandUsed: string;\n configPath?: string;\n}) => {\n const { isRawModeSupported } = useStdin();\n const onInput = useInput();\n const exit = useExit();\n const [{ appId, builds, error, isLoading, itemChosen }, setState] = useState<{\n appId: string | null;\n builds: Build[];\n error: Error | null;\n isLoading: boolean;\n itemChosen: { value: string } | null;\n }>({\n appId: null,\n builds: [],\n error: null,\n isLoading: true,\n itemChosen: null,\n });\n\n useEffect(() => {\n if (!isLoading) {\n return;\n }\n\n (async () => {\n try {\n const applicationId = getProjectConfig(configPath).config.id;\n const { id } = await findAppUserId(applicationId);\n\n const now = new Date();\n const twentyFourHoursAgo = new Date(\n now.getTime() - 24 * 60 * 60 * 1000\n );\n\n const buildsResult = await firestore\n .doc(`users/${id}/applications/${applicationId}`)\n .collection(\"builds\")\n .where(\"createdAt\", \">=\", twentyFourHoursAgo)\n .orderBy(\"createdAt\", \"desc\")\n .limit(10)\n .get();\n\n const stateUpdates: {\n appId: string | null;\n isLoading: boolean;\n builds: Build[];\n } = {\n appId: applicationId,\n isLoading: false,\n builds: [],\n };\n\n if (!buildsResult.empty) {\n const latestBuild = buildsResult.docs[0].data() as Build;\n const isRunning =\n isBuildRunning(latestBuild) && latestBuild.status !== \"preparation\";\n logger.debug(\n { isRunning },\n \"OngoingBuildGuard component: got latest build\"\n );\n\n stateUpdates.builds = buildsResult.docs\n .map((doc) => doc.data() as Build)\n .filter((build) => {\n if (isBuildRunning(build) && build.status !== \"preparation\") {\n return true;\n }\n return false;\n });\n }\n\n setState((previousState) => ({\n ...previousState,\n ...stateUpdates,\n }));\n } catch (e) {\n setState((previousState) => ({\n ...previousState,\n error: e as Error,\n }));\n }\n })();\n }, [builds, itemChosen, isLoading, isRawModeSupported, configPath]);\n\n /*\n Because we're using <SelectInput/>, we need to explicitly handle when\n ctrl+c is pressed. `onInput` takes care of that.\n See https://github.com/vadimdemedes/pastel/issues/38\n */\n if (isRawModeSupported) {\n // Input causes an error on if stdin does not support raw mode\n onInput(() => {});\n }\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (isLoading) {\n return <Text>...</Text>;\n }\n\n if (itemChosen) {\n logger.debug({ itemChosen }, \"OngoingBuildGuard component: item chosen\");\n const build = builds.find(Boolean);\n\n if (itemChosen.value === \"view\" && build) {\n return <ViewBuild commandUsed={commandUsed} id={build.id} />;\n } else if (itemChosen.value === \"cancel\" && build && appId) {\n return (\n <CancelBuild appId={appId} commandUsed={commandUsed} id={build.id}>\n {children}\n </CancelBuild>\n );\n } else if (itemChosen.value === \"concurrent\") {\n return <>{children}</>;\n } else {\n setTimeout(exit, 10);\n }\n }\n\n if (builds.length && isCi === false && isRawModeSupported) {\n const latestBuild = builds.find(Boolean);\n const multiple = builds.length > 1;\n\n const items = [\n {\n label: `View ${multiple ? \"latest\" : \"it\"}`,\n value: \"view\",\n },\n ];\n\n if (builds.some((build) => isBuildCancellable(build))) {\n items.push({\n label: `Cancel ${multiple ? \"latest\" : \"it\"} and start a new build`,\n value: \"cancel\",\n });\n\n items.push({\n label: \"Start a concurrent build\",\n value: \"concurrent\",\n });\n }\n\n items.push({\n label: \"Exit\",\n value: \"exit\",\n });\n const handleSelect = (itemChosen: { value: string }) =>\n setState((previousState) => ({ ...previousState, itemChosen }));\n\n return (\n <>\n <Box marginBottom={1}>\n <Text bold>\n {multiple\n ? \"There are ongoing builds \"\n : \"There is an ongoing build \"}\n </Text>\n <Text>\n ({latestBuild?.appName}\n {latestBuild?.appVersion ? ` v${latestBuild.appVersion}` : \"\"})\n </Text>\n </Box>\n <SelectInput\n indicatorComponent={CustomSelectInputIndicator}\n itemComponent={CustomSelectInputItem}\n items={items}\n onSelect={handleSelect}\n />\n </>\n );\n } else {\n return <>{children}</>;\n }\n};\n\nOngoingBuildGuard.propTypes = {\n commandUsed: PropTypes.string.isRequired,\n children: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n configPath: PropTypes.string,\n};\n\nexport default OngoingBuildGuard;\n", "import { Box, Text } from \"ink\";\nimport { ComponentProps } from \"react\";\n\nexport default function CustomSelectInputIndicator({\n isSelected,\n ...props\n}: {\n isSelected?: boolean;\n} & ComponentProps<typeof Box>) {\n const selectIndicator =\n process.env.NODE_ENV === \"test\" || process.platform === \"win32\" ? \">\" : \"\u276F\";\n\n return (\n <Box marginRight={1} {...props}>\n <Text>{isSelected ? selectIndicator : \" \"}</Text>\n </Box>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport { ComponentProps } from \"react\";\n\nexport default function CustomSelectInputItem({\n isSelected,\n label,\n ...props\n}: {\n isSelected?: boolean;\n label: string;\n} & ComponentProps<typeof Box>) {\n return (\n <Text bold={isSelected} color={isSelected ? undefined : \"gray\"} {...props}>\n {label}\n </Text>\n );\n}\n", "// libs\nimport { Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\n\n// components\nimport BuildProgress from \"./BuildProgress\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport MainLayout from \"./MainLayout\";\n\n// utils\nimport getLatestBuildId from \"../utilities/getLatestBuildId\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport logForCI from \"../utilities/logForCI\";\nimport shouldExitOnBuildFailure from \"../utilities/shouldExitOnBuildFailure\";\nimport subscribeToBuild from \"../utilities/subscribeToBuild\";\nimport useExit from \"../utilities/useExit\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport LoadingText from \"./LoadingText\";\n\nconst ViewBuild = ({ commandUsed, id, configPath }) => {\n const exit = useExit();\n const [\n {\n appId,\n arbitraryMessageComponent,\n build,\n error,\n hasBuildEverFailed,\n isLoading,\n },\n setState,\n ] = useState({\n appId: null,\n arbitraryMessageComponent: null,\n build: null,\n error: null,\n hasBuildEverFailed: false,\n isLoading: true,\n });\n\n const onError = (e) => {\n const error = e.response ? e.response.data : e;\n logForCI(error);\n setState((prevState) => ({\n ...prevState,\n error,\n }));\n };\n\n useEffect(() => {\n let firebaseUnsubscribe;\n\n async function viewBuild() {\n let config;\n try {\n // This will throw if validation fails:\n config = getProjectConfig(configPath).config;\n } catch (e) {\n setState((previousState) => ({ ...previousState, error: e }));\n return;\n }\n\n const { id: userId } = await findAppUserId(config.id);\n\n const subscribe = (buildId) => {\n subscribeToBuild({\n appId: config.id,\n buildId,\n onDataReceived: (data) => {\n if (!data) {\n onError(\n new Error(\n `No such build exists (${buildId}). Please contact us if this is an error`\n )\n );\n }\n setState((prevState) => ({\n ...prevState,\n appId: config.id,\n build: data,\n isLoading: false,\n }));\n },\n userId,\n })\n .then((firebaseUnsubscribeResult) => {\n firebaseUnsubscribe = firebaseUnsubscribeResult;\n })\n .catch(onError);\n };\n\n if (id) {\n subscribe(id);\n } else {\n getLatestBuildId({ appId: config.id, userId })\n .catch(onError)\n .then((latestBuildId) => {\n if (!latestBuildId) {\n setState((previousState) => ({\n ...previousState,\n arbitraryMessageComponent: <Text>There are no builds yet</Text>,\n }));\n return;\n }\n return subscribe(latestBuildId);\n });\n }\n }\n\n viewBuild();\n\n return () => {\n if (firebaseUnsubscribe) {\n firebaseUnsubscribe();\n }\n };\n }, [id, configPath]);\n\n // Exit if the build has errored and settled\n useEffect(() => {\n if (hasBuildEverFailed && shouldExitOnBuildFailure(build)) {\n setTimeout(() => exit(new Error(\"Build has failed\")), 10);\n }\n }, [build, exit, hasBuildEverFailed]);\n\n // Exit once an arbitrary message exists\n useEffect(() => {\n if (arbitraryMessageComponent) {\n setTimeout(() => exit(new Error(\"Validation failed\")), 10);\n }\n }, [arbitraryMessageComponent, exit]);\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (arbitraryMessageComponent) {\n return arbitraryMessageComponent;\n }\n\n if (isLoading) {\n return <LoadingText />;\n }\n\n const onBuildFailure = () => {\n if (hasBuildEverFailed) {\n return;\n }\n setState((prevState) => ({\n ...prevState,\n hasBuildEverFailed: true,\n }));\n };\n\n return (\n <MainLayout\n appId={appId}\n appName={build.appName}\n appVersion={build.appVersion}\n build={build}\n commandUsed={commandUsed}\n hasBuildEverFailed={hasBuildEverFailed}\n >\n <BuildProgress build={build} onBuildFailure={onBuildFailure} />\n </MainLayout>\n );\n};\n\nViewBuild.propTypes = {\n id: (props, propName, componentName) => {\n if ([props.id, props.shouldViewLatest].filter(Boolean).length !== 1) {\n return new Error(\n `Exactly one of 'id' and 'shouldViewLatest' must be specified in '${componentName}'`\n );\n }\n\n const type = typeof props.id;\n if (![\"string\", \"undefined\"].includes(type)) {\n return new Error(\n `'id' is a '${type}', not a string, in '${componentName}'.`\n );\n }\n },\n commandUsed: PropTypes.string.isRequired,\n shouldViewLatest: (props, propName, componentName) => {\n if ([props.id, props.shouldViewLatest].filter(Boolean).length !== 1) {\n return new Error(\n `Exactly one of 'id' and 'shouldViewLatest' must be specified in '${componentName}'`\n );\n }\n\n const type = typeof props.shouldViewLatest;\n if (![\"boolean\", \"undefined\"].includes(type)) {\n return new Error(\n `'shouldViewLatest' is a '${type}', not a boolean, in '${componentName}'.`\n );\n }\n },\n configPath: PropTypes.string,\n};\n\nexport default ViewBuild;\n", "import firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getLatestBuildId({\n appId,\n userId,\n}: {\n appId: string;\n userId: string;\n}): Promise<string | undefined> {\n logger.debug({ appId }, \"getLatestBuildId\");\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n\n if (!appSnapshot.exists) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n const buildsResult = await appRef\n .collection(\"builds\")\n .orderBy(\"createdAt\", \"desc\")\n .limit(1)\n .get();\n\n return buildsResult.empty ? undefined : buildsResult.docs[0].id;\n}\n", "import type { DocData, DocSnapshot } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function subscribeToFirebaseDoc<T extends DocData>(\n key: string,\n receiver: (data: { snapshot: DocSnapshot<T>; data: T | undefined }) => void\n) {\n return new Promise<() => void>((resolve, reject) => {\n logger.debug({ key }, \"subscribeToFirebaseDoc\");\n const unsubscribe = firestore.doc(key).onSnapshot(\n (snapshot) => {\n receiver({\n snapshot: snapshot as DocSnapshot<T>,\n data: snapshot.exists ? (snapshot.data() as T) : undefined,\n });\n\n resolve(unsubscribe);\n },\n (err) => {\n reject(err);\n }\n );\n });\n}\n", "import subscribeToFirebaseDoc from \"./subscribeToFirebaseDoc\";\n\nexport default async ({ appId, buildId, onDataReceived, userId }) => {\n try {\n return await subscribeToFirebaseDoc(\n `users/${userId}/applications/${appId}/builds/${buildId}`,\n async ({ data }) => {\n onDataReceived(data);\n }\n );\n } catch (e) {\n e.message = `Failed while subscribing to build; ${e.message}`;\n throw e;\n }\n};\n", "import firestore, { currentUser } from \"./firestore\";\n\nconst getCollection = (collectionRef) => {\n return collectionRef.get().then((resp) => {\n const result = [];\n resp.forEach((doc) => result.push(doc.data()));\n return result;\n });\n};\n\nconst acceptedUsersCollection = (id) =>\n firestore.collection(`users/${id}/acceptedUsers`);\n\nconst findAppUserId = async (appId): Promise<User> => {\n const { uid, email } = currentUser();\n const acceptedUsers = await getCollection(acceptedUsersCollection(uid));\n const primaryUser = { id: uid, label: email };\n\n const users = [\n primaryUser,\n ...acceptedUsers.map((user) => ({ id: user.id, label: user.email })),\n ];\n\n for (const user of users) {\n try {\n const doc = await firestore\n .doc(`users/${user.id}/applications/${appId}`)\n .get();\n\n if (doc.exists) return user;\n } catch (err) {\n // will throw an error if user doesn't have access\n console.error(err);\n }\n }\n\n return primaryUser;\n};\n\ninterface User {\n id: string;\n label: string;\n}\n\nexport default findAppUserId;\n", "import { useEffect, useState } from \"react\";\n\nimport { onUserAuth } from \"./firestore\";\nimport { identify, track, ANALYTICS_EVENT } from \"./analytics\";\nimport logger from \"./logger\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\n\nexport const useAnalyticsCommand = (\n command,\n flags: any = {},\n properties = {}\n) => {\n const [hasAttemptedTracking, setTrackingAttempt] = useState(false);\n\n logger.info({ command, flags, properties }, \"useAnalyticsCommand\");\n\n try {\n if (flags.projectPath) {\n properties = {\n ...properties,\n ...getProjectConfig(),\n };\n }\n } catch (err) {\n // do nothing\n }\n\n useEffect(() => {\n const authUnsubscribe = onUserAuth(async (user) => {\n /**\n * Only identify if there's a user id (stops use of anon id).\n * Subsequent track callback will thus always be tied to a user.\n */\n if (user.uid) {\n identify(\n user.uid,\n {\n email: user.email,\n displayName: user.displayName,\n },\n () => {\n track(\n ANALYTICS_EVENT.CLI_COMMAND,\n {\n ...properties,\n flags,\n command,\n },\n () => setTrackingAttempt(true)\n );\n authUnsubscribe && authUnsubscribe();\n }\n );\n }\n });\n\n // if it takes longer than 5 secs to identify a user, just set the\n // tracking attempt to true so that other commands aren't waiting\n // forever to terminate (see whoami component)\n setTimeout(() => setTrackingAttempt(true), 5000);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // leave empty - this should only ever execute once (on mount)\n\n return { hasAttemptedTracking };\n};\n", "import Build from \"./components/Build\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport OngoingBuildGuard from \"./components/OngoingBuildGuard\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\n\nexport default function BuildCommand({\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n}: {\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign: boolean;\n}) {\n checkIfReactIsUsable();\n\n useAnalyticsCommand(\"build\", {\n async: exitAfterUploading,\n codeSign: shouldCodeSign,\n config: configPath,\n webhook: onBuildFinishedWebhook,\n });\n\n const commandUsed = \"todesktop build\";\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <OngoingBuildGuard configPath={configPath} commandUsed={commandUsed}>\n <Build\n commandUsed={commandUsed}\n configPath={configPath}\n exitAfterUploading={exitAfterUploading}\n onBuildFinishedWebhook={onBuildFinishedWebhook}\n shouldCodeSign={shouldCodeSign}\n />\n </OngoingBuildGuard>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport Table from \"./Table\";\nimport capitalize from \"../utilities/capitalize\";\nimport getBuilds from \"../utilities/getBuilds\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport getRelativeDateFromDateString from \"../utilities/getRelativeDateFromDateString\";\nimport logForCI from \"../utilities/logForCI\";\nimport useInput from \"../utilities/useInput\";\nimport useExit from \"../utilities/useExit\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport SyntaxHighlight from \"./SyntaxHighlight\";\nimport LoadingText from \"./LoadingText\";\n\nconst ViewBuilds = ({\n commandUsed,\n configPath,\n count,\n format,\n exit: shouldExitAfterViewingBuilds = false,\n}) => {\n const exit = useExit();\n const [\n {\n builds,\n error,\n hasMoreToLoad,\n isInitialLoadComplete,\n isLoading,\n projectConfig,\n startAfter,\n user,\n },\n setState,\n ] = useState({\n builds: [],\n error: null,\n hasMoreToLoad: true,\n isInitialLoadComplete: false,\n isLoading: false,\n projectConfig: null,\n startAfter: null,\n user: null,\n });\n\n const onInput = useInput();\n\n onInput((input, key) => {\n if (key.escape) {\n exit();\n }\n\n if (input === \" \" || key.downArrow || key.pageDown || key.return) {\n if (!isInitialLoadComplete || !hasMoreToLoad) {\n return;\n }\n\n setState((previousState) => ({\n ...previousState,\n startAfter: builds[builds.length - 1].createdAt,\n }));\n }\n });\n\n useEffect(() => {\n async function viewBuilds() {\n if (\n error ||\n isLoading ||\n (isInitialLoadComplete && (!hasMoreToLoad || !startAfter))\n ) {\n return;\n }\n\n if (![\"table\", \"json\"].includes(format)) {\n setState((previousState) => ({\n ...previousState,\n error: new Error(\n `Invalid output format \"${format}\". Valid formats are \"table\" and \"json\".`\n ),\n }));\n return;\n }\n\n setState((previousState) => ({\n ...previousState,\n isLoading: true,\n }));\n\n let config;\n try {\n // This will throw if validation fails:\n config = projectConfig || getProjectConfig(configPath).config;\n } catch (e) {\n setState((previousState) => ({ ...previousState, error: e }));\n return;\n }\n\n const pageSize = count || 5;\n const user = await findAppUserId(config.id);\n\n getBuilds({\n appId: config.id,\n limit: pageSize + 1,\n startAfter,\n userId: user.id,\n })\n .then((buildsResult) => {\n setState((previousState) => {\n const stateUpdates = {\n builds: [],\n hasMoreToLoad: buildsResult.length > pageSize,\n isInitialLoadComplete: true,\n isLoading: false,\n projectConfig: config,\n startAfter: null,\n user,\n };\n\n if (buildsResult.length) {\n stateUpdates.builds = [\n ...previousState.builds,\n ...buildsResult.slice(0, pageSize),\n ];\n }\n return {\n ...previousState,\n ...stateUpdates,\n };\n });\n })\n .catch((e) => {\n logForCI(e);\n setState((previousState) => ({\n ...previousState,\n error: e,\n isLoading: false,\n }));\n });\n }\n\n viewBuilds();\n }, [\n error,\n hasMoreToLoad,\n isInitialLoadComplete,\n isLoading,\n projectConfig,\n startAfter,\n configPath,\n format,\n count,\n ]);\n\n // Exit once all are loaded\n useEffect(() => {\n if (!hasMoreToLoad) {\n setTimeout(exit, 10);\n }\n }, [exit, hasMoreToLoad]);\n\n // Exit the process once the initial build data has been displayed if user has set the `--exit` flag\n useEffect(() => {\n if (!isLoading && isInitialLoadComplete && shouldExitAfterViewingBuilds) {\n setTimeout(exit, 10);\n }\n }, [exit, isLoading, shouldExitAfterViewingBuilds, isInitialLoadComplete]);\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (!isInitialLoadComplete) {\n return <LoadingText />;\n }\n\n if (builds.length) {\n const formatData = (builds) =>\n builds.map((build) => ({\n ID: build.id,\n Version: build.appVersion || \"n/a\",\n \"Creation date\": getRelativeDateFromDateString(build.createdAt),\n Status: capitalize(build.status),\n \"Release date\": build.releasedAt\n ? getRelativeDateFromDateString(build.releasedAt)\n : \"Unreleased\",\n Owner: user ? user.label : \"unknown\",\n }));\n\n const getCellTextProps = ({ key, props, value }) => {\n const result = { ...props };\n\n if (key === \"Status\") {\n const status = value.toLowerCase();\n if (status === \"succeeded\") {\n result.color = \"green\";\n } else if (status === \"failed\") {\n result.color = \"red\";\n } else if (status === \"cancelled\") {\n result.dimColor = true;\n }\n } else if (key === \"Version\" && value.toLowerCase() === \"n/a\") {\n result.dimColor = true;\n } else if (\n key === \"Release date\" &&\n value.toLowerCase() === \"unreleased\"\n ) {\n result.dimColor = true;\n }\n\n return result;\n };\n\n return (\n <>\n {format === \"table\" ? (\n <Table\n getCellTextProps={getCellTextProps}\n data={formatData(builds)}\n />\n ) : null}\n {format === \"json\" ? (\n <SyntaxHighlight object={removeAppBuilderLibConfig(builds)} />\n ) : null}\n {!shouldExitAfterViewingBuilds && builds.length > 0 ? (\n <Box>\n <Text color=\"gray\" dimColor>\n {isLoading\n ? \"Loading more...\"\n : hasMoreToLoad\n ? `Showing the latest ${builds.length} builds. Press space/down to load more.`\n : `Showing all (${builds.length}) builds`}\n </Text>\n </Box>\n ) : null}\n </>\n );\n } else {\n return <Text>There are no builds yet</Text>;\n }\n};\n\nconst removeAppBuilderLibConfig = (builds) => {\n // Remove the appBuilderLib config from the builds because it's difficult to display\n // and not very useful to the user.\n return builds.map((build) => {\n if (build.mac && build.mac.appBuilderLibConfig) {\n delete build.mac.appBuilderLibConfig;\n }\n if (build.windows && build.windows.appBuilderLibConfig) {\n delete build.windows.appBuilderLibConfig;\n }\n if (build.linux && build.linux.appBuilderLibConfig) {\n delete build.linux.appBuilderLibConfig;\n }\n return build;\n });\n};\n\nViewBuilds.propTypes = {\n commandUsed: PropTypes.string.isRequired,\n configPath: PropTypes.string,\n count: PropTypes.number,\n format: PropTypes.string,\n exit: PropTypes.bool,\n};\n\nexport default ViewBuilds;\n", "import { Box } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport TableEnd from \"./TableEnd\";\nimport TableHead from \"./TableHead\";\nimport TableBody from \"./TableBody\";\nimport getKeyDetails from \"../utilities/getKeyDetails\";\n\n/*\n This component prints (the array of objects given) in a table.\n The array must not be empty.\n The keys are used as headers.\n Column widths are based on the longest value (object key or value).\n It is assumed that the same keys exist in all items.\n*/\nconst Table = ({ data, getCellTextProps }) => {\n const keyDetails = getKeyDetails(data);\n\n return (\n <Box flexDirection=\"column\">\n <TableHead keyDetails={keyDetails} />\n <TableBody\n data={data}\n getCellTextProps={getCellTextProps}\n keyDetails={keyDetails}\n />\n <TableEnd keyDetails={keyDetails} />\n </Box>\n );\n};\n\nTable.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n getCellTextProps: PropTypes.func,\n};\n\nexport default Table;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\n/*\n See Table component\n*/\nconst TableEnd = ({ keyDetails, ...props }) => {\n let content = \"\u2514\";\n content += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u2534\");\n content += \"\u2518\";\n\n return (\n <Box {...props}>\n <Text>{content}</Text>\n </Box>\n );\n};\n\nTableEnd.propTypes = {\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableEnd;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { Fragment } from \"react\";\n\n/*\n See Table component\n*/\nconst TableHead = ({ keyDetails, ...props }) => {\n let topLine = \"\u250C\";\n topLine += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u252C\");\n topLine += \"\u2510\";\n\n const contentLineElements = Object.values(keyDetails).map(\n ({ key, width }, index) => {\n return (\n <Fragment key={key}>\n {index > 0 ? <Text> \u2502 </Text> : null}\n <Box width={width}>\n <Text bold>{key}</Text>\n </Box>\n </Fragment>\n );\n }\n );\n\n return (\n <Box flexDirection=\"column\" {...props}>\n <Box>\n <Text>{topLine}</Text>\n </Box>\n <Box>\n <Box>\n <Text>\u2502 </Text>\n {contentLineElements}\n <Text> \u2502</Text>\n </Box>\n </Box>\n </Box>\n );\n};\n\nTableHead.propTypes = {\n bottomLinePrefix: PropTypes.string,\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableHead;\n", "import PropTypes from \"prop-types\";\nimport TableRow from \"./TableRow\";\n\n/*\n See Table component\n*/\nconst TableBody = ({ data, getCellTextProps, keyDetails }) => {\n return (\n <>\n {data.map((rowData, index) => (\n <TableRow\n data={rowData}\n getCellTextProps={getCellTextProps}\n key={index}\n keyDetails={keyDetails}\n />\n ))}\n </>\n );\n};\n\nTableBody.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n getCellTextProps: PropTypes.func,\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableBody;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\n/*\n See Table component\n*/\nconst TableRow = ({\n data,\n getCellTextProps = ({ props }) => props,\n keyDetails,\n textProps = {},\n}: {\n data: object;\n getCellTextProps?: (...args: any[]) => any;\n keyDetails: object;\n textProps?: object;\n}) => {\n let topLine = \"\u251C\";\n topLine += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u253C\");\n topLine += \"\u2524\";\n\n const content = (\n <>\n <Text>\u2502 </Text>\n {Object.entries(data).map(([key, value], index) => {\n return (\n <Box key={key}>\n {index > 0 ? <Text> \u2502 </Text> : null}\n <Box width={keyDetails[key].width}>\n <Text\n {...getCellTextProps({\n key,\n props: textProps,\n rowData: data,\n value,\n })}\n >\n {value}\n </Text>\n </Box>\n </Box>\n );\n })}\n <Text> \u2502</Text>\n </>\n );\n\n return (\n <>\n <Box flexDirection=\"column\">\n <Text>{topLine}</Text>\n <Box>{content}</Box>\n </Box>\n </>\n );\n};\n\nTableRow.propTypes = {\n data: PropTypes.object.isRequired,\n getCellTextProps: PropTypes.func,\n keyDetails: PropTypes.object.isRequired,\n textProps: PropTypes.object,\n};\n\nexport default TableRow;\n", "// This is used to get the column widths for tables\nexport default (data) => {\n const result = {};\n Object.keys(data[0]).forEach((key) => {\n result[key] = {\n key,\n width: Math.max(\n key.length,\n data.map((item) => item[key].toString().length).sort((a, b) => b - a)[0]\n ),\n };\n });\n return result;\n};\n", "export default (input) => {\n if (typeof input !== \"string\") {\n return \"\";\n }\n return input.charAt(0).toUpperCase() + input.slice(1);\n};\n", "import { Build } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getBuilds({\n addWhereClauses = (collection) => collection,\n userId,\n appId,\n limit = 5,\n startAfter = null,\n}: {\n addWhereClauses?: (collection: CollectionReference) => Query;\n userId: string;\n appId: string;\n limit?: number;\n startAfter?: string;\n}): Promise<Build[]> {\n logger.debug({ appId, limit, startAfter }, \"getBuilds\");\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n\n if (!appSnapshot.exists) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n let query = addWhereClauses(appRef.collection(\"builds\")).orderBy(\n \"createdAt\",\n \"desc\"\n );\n\n if (startAfter) {\n query = query.startAfter(startAfter);\n }\n\n const buildsResult = await query.limit(limit).get();\n\n if (buildsResult.empty) {\n return [];\n }\n\n return buildsResult.docs.map((doc) => doc.data()) as Build[];\n}\n\ntype CollectionReference = ReturnType<typeof firestore.collection>;\ntype Query = ReturnType<CollectionReference[\"where\"]>;\n", "import * as dateFns from \"date-fns\";\n\nexport default (input) =>\n dateFns.formatDistance(new Date(input), new Date()) + \" ago\";\n", "import chalk, { ColorSupport } from \"chalk\";\nimport * as React from \"react\";\nimport { Text, useStdout } from \"ink\";\nimport util from \"util\";\n\nconst supportsColor = chalk.stderr.supportsColor as ColorSupport;\n\nconst SyntaxHighlight = ({\n object,\n colors = supportsColor?.hasBasic,\n}: {\n object: object;\n colors?: boolean;\n}) => {\n const { stdout } = useStdout();\n\n const highlightedCode = React.useMemo(() => {\n return stdout.isTTY\n ? util.inspect(object, { colors, depth: 6 })\n : JSON.stringify(object, null, 2);\n }, [colors, object, stdout.isTTY]);\n\n return <Text wrap=\"end\">{highlightedCode}</Text>;\n};\n\nexport default SyntaxHighlight;\n", "import checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport ViewBuild from \"../components/ViewBuild\";\nimport ViewBuilds from \"../components/ViewBuilds\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\n\nconst BuildsCommand = ({\n id,\n shouldViewLatest,\n configPath = null,\n count,\n format = \"table\",\n exit,\n}: {\n id?: string;\n shouldViewLatest?: boolean;\n configPath?: string;\n count?: number;\n format?: \"table\" | \"json\";\n exit?: boolean;\n}) => {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"builds\", {\n id,\n shouldViewLatest,\n configPath,\n count,\n format,\n exit,\n });\n\n const getContents = () => {\n let commandUsed = \"todesktop builds\";\n if (id) {\n commandUsed += \" <id>\";\n return (\n <ViewBuild commandUsed={commandUsed} id={id} configPath={configPath} />\n );\n } else if (shouldViewLatest) {\n commandUsed += \" --latest\";\n return (\n <ViewBuild\n commandUsed={commandUsed}\n shouldViewLatest={true}\n configPath={configPath}\n />\n );\n } else {\n return (\n <ViewBuilds\n commandUsed={commandUsed}\n configPath={configPath}\n count={count}\n format={format}\n exit={exit}\n />\n );\n }\n };\n\n return (\n <ErrorBoundary>\n <LoginHOC>{getContents()}</LoginHOC>\n </ErrorBoundary>\n );\n};\n\nexport default BuildsCommand;\n", "import { useEffect } from \"react\";\nimport { Text } from \"ink\";\n\nimport checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport { deleteAuthConfig } from \"../utilities/configStore\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\nimport useExit from \"../utilities/useExit\";\n\nconst Logout = () => {\n const exit = useExit();\n const { hasAttemptedTracking } = useAnalyticsCommand(\"logout\");\n\n checkIfReactIsUsable();\n // delete auth config deletes the credentials stored on disk\n deleteAuthConfig();\n\n // exits the program once tracking of the \"logout\" command has been attempted\n useEffect(() => {\n if (hasAttemptedTracking) {\n exit();\n }\n }, [exit, hasAttemptedTracking]);\n\n return <Text>Log out successful</Text>;\n};\n\nconst LogoutWrapper = () => {\n return (\n <ErrorBoundary>\n <LoginHOC isInteractive={false}>\n <Logout />\n </LoginHOC>\n </ErrorBoundary>\n );\n};\n\nexport default LogoutWrapper;\n", "import { Box, Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport LoadingText from \"./LoadingText\";\nimport SelectTable from \"./SelectTable\";\nimport { Build } from \"../types\";\nimport CliError from \"../utilities/CliError\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport getBuilds from \"../utilities/getBuilds\";\nimport getLatestBuildId from \"../utilities/getLatestBuildId\";\nimport getLatestReleasedBuild from \"../utilities/getLatestReleasedBuild\";\nimport getRelativeDateFromDateString from \"../utilities/getRelativeDateFromDateString\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\nimport useInput from \"../utilities/useInput\";\n\nexport default function BuildPicker({\n buildFilter,\n buildId,\n children,\n commandUsed,\n configPath,\n loadData = loadPickerData,\n noBuildsDescription = null,\n question = \"Which build would you like to test?\",\n}: {\n buildFilter?: BuildFilter;\n buildId?: string;\n children: (buildId: string) => JSX.Element;\n commandUsed: string;\n configPath?: string;\n loadData?: typeof loadPickerData;\n noBuildsDescription?: string | null | JSX.Element;\n question?: string | JSX.Element;\n}) {\n const exit = useExit();\n const onInput = useInput();\n\n const isRealIdPassed = buildId && buildId !== \"latest\";\n const [state, setState] = useState({\n selectedBuildId: isRealIdPassed ? buildId : undefined,\n state: isRealIdPassed ? \"selected\" : \"loading\",\n } as PickerState);\n\n useEffect(() => {\n loadData({\n buildFilter,\n buildId,\n configPath,\n state: state.state,\n updateState,\n }).catch(logger.error);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n onInput((_, key) => {\n if (key.escape && [\"show-builds\", \"loading\"].includes(state.state)) {\n exit();\n }\n });\n\n function updateState(changes: Partial<PickerState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as PickerState)\n );\n\n if (changes.state && [\"error\", \"no-builds\"].includes(changes.state)) {\n setTimeout(() => exit(), 10);\n }\n }\n\n function onSelect(item: { value: { ID: string } }) {\n updateState({ selectedBuildId: item.value.ID, state: \"selected\" });\n }\n\n switch (state.state) {\n case \"error\":\n return <ErrorDisplay commandUsed={commandUsed} error={state.error} />;\n\n case \"loading\":\n return <LoadingText />;\n\n case \"no-builds\":\n return (\n <Box>\n <Text>No eligible builds found </Text>\n {noBuildsDescription && <Text dimColor>{noBuildsDescription}</Text>}\n </Box>\n );\n\n case \"selected\":\n return children(state.selectedBuildId) as any;\n\n case \"show-builds\":\n return (\n <>\n <Box>\n <Text>{question}</Text>\n </Box>\n <SelectTable data={state.builds} onSelect={onSelect} />\n <Box>\n <Text dimColor>\n Showing the latest {state.builds.length} unreleased successful\n builds\n </Text>\n </Box>\n </>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${(state as PickerState).state}`)}\n />\n );\n }\n}\n\nasync function loadPickerData({\n buildFilter,\n buildId,\n configPath,\n state,\n updateState,\n}: {\n buildFilter?: BuildFilter;\n buildId?: string;\n configPath?: string;\n state: PickerState[\"state\"];\n updateState: (changes: Partial<PickerState>) => void;\n}): Promise<void> {\n if (state === \"selected\") {\n return;\n }\n\n try {\n if (buildId === \"latest\") {\n const latestBuildId = await getLatestBuild({ configPath });\n if (latestBuildId) {\n updateState({ state: \"selected\", selectedBuildId: latestBuildId });\n } else {\n updateState({ state: \"no-builds\" });\n }\n } else {\n const builds = await getBuildItems({ buildFilter, configPath });\n updateState({\n builds,\n state: builds.length > 0 ? \"show-builds\" : \"no-builds\",\n });\n }\n } catch (e) {\n updateState({ error: CliError.from(e), state: \"error\" });\n }\n}\n\nasync function getLatestBuild({\n configPath,\n}: {\n configPath?: string;\n}): Promise<string | undefined> {\n const { id: appId } = getProjectConfig(configPath).config;\n const { id: userId } = await findAppUserId(appId);\n return getLatestBuildId({ appId, userId });\n}\n\nasync function getBuildItems({\n buildFilter = () => true,\n configPath,\n}: {\n buildFilter?: BuildFilter;\n configPath?: string;\n}): Promise<BuildDisplayItem[]> {\n const { id: appId } = getProjectConfig(configPath).config;\n const { id: userId, label: userName } = await findAppUserId(appId);\n const latestReleasedBuild = await getLatestReleasedBuild({ appId, userId });\n const rawBuilds = await getBuilds({\n addWhereClauses: (query) => query.where(\"status\", \"==\", \"succeeded\"),\n appId,\n limit: 50,\n userId,\n });\n\n return rawBuilds\n .filter((build) => buildFilter({ build, latestReleasedBuild }))\n .slice(0, 5)\n .map((build) => ({\n ID: build.id,\n Version: build.appVersion || \"unknown\",\n \"Creation date\": getRelativeDateFromDateString(build.createdAt),\n Owner: userName || \"unknown\",\n }));\n}\n\nexport type PickerState =\n | { state: \"loading\"; selectedBuildId?: string }\n | { state: \"no-builds\"; builds: BuildDisplayItem[] }\n | { state: \"selected\"; selectedBuildId: string }\n | { state: \"show-builds\"; builds: BuildDisplayItem[] }\n | { state: \"error\"; error: Error };\n\ninterface BuildDisplayItem {\n \"Creation date\": string;\n ID: string;\n Owner: string;\n Version: string;\n}\n\nexport type BuildFilter = (args: {\n build: Build;\n latestReleasedBuild?: Build;\n}) => boolean;\n", "import { Box } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport PropTypes from \"prop-types\";\nimport CustomSelectInputIndicator from \"./CustomSelectInputIndicator\";\nimport TableEnd from \"./TableEnd\";\nimport TableHead from \"./TableHead\";\nimport TableRow from \"./TableRow\";\nimport getKeyDetails from \"../utilities/getKeyDetails\";\n\nconst CustomIndicator = (props) => (\n <CustomSelectInputIndicator marginTop={1} {...props} />\n);\n\n/*\n This is like if <Table/> and ink-select-input had a baby.\n Read the block comment at the top of <Table/> first.\n*/\nconst SelectTable = ({ data, onSelect }) => {\n const keyDetails = getKeyDetails(data);\n\n const getSelectItems = () => {\n return data.map((rowData, index) => {\n return {\n index,\n key: index,\n value: rowData,\n };\n });\n };\n\n const ItemComponent = ({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n label, // Make it compatible to SelectInput type, not used actually\n index,\n isSelected,\n }: {\n label: string;\n index?: number;\n isSelected?: boolean;\n }) => {\n return (\n <TableRow\n data={data[index]}\n key={index}\n keyDetails={keyDetails}\n textProps={{ bold: isSelected, color: isSelected ? undefined : \"gray\" }}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\">\n <TableHead keyDetails={keyDetails} marginLeft={2} />\n <SelectInput\n indicatorComponent={CustomIndicator}\n itemComponent={ItemComponent}\n items={getSelectItems()}\n onSelect={onSelect}\n />\n <TableEnd keyDetails={keyDetails} marginLeft={2} />\n </Box>\n );\n};\n\nSelectTable.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n onSelect: PropTypes.func,\n};\n\nexport default SelectTable;\n", "import { Build } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getBuildById({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}): Promise<Build | null> {\n logger.debug({ appId, buildId }, \"getBuildById\");\n const snapshot = await firestore\n .doc(`users/${userId}/applications/${appId}/builds/${buildId}`)\n .get();\n\n if (!snapshot.exists) {\n return null;\n }\n\n return snapshot.data() as Build;\n}\n", "import type { Build, IApp } from \"@todesktop/shared\";\nimport firestore from \"./firestore\";\nimport getBuildById from \"./getBuildById\";\n\nexport default async function getLatestReleasedBuild({\n appId,\n userId,\n}: {\n appId: string;\n userId: string;\n}): Promise<Build | undefined> {\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n const app = appSnapshot.exists ? (appSnapshot.data() as IApp) : undefined;\n\n if (!app) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n if (app.meta?.latestReleaseBuildId) {\n return (\n (await getBuildById({\n buildId: app.meta?.latestReleaseBuildId,\n appId,\n userId,\n })) || undefined\n );\n }\n\n const buildsResult = await appRef\n .collection(\"builds\")\n .orderBy(\"releasedAt\", \"desc\")\n .limit(1)\n .get();\n\n return buildsResult.empty\n ? undefined\n : (buildsResult.docs[0] as unknown as Build);\n}\n", "import { useEffect, useState } from \"react\";\nimport CliError from \"../../../utilities/CliError\";\nimport getBuildAttributes from \"../../../utilities/getBuildAttributes\";\nimport logForCI from \"../../../utilities/logForCI\";\nimport logger from \"../../../utilities/logger\";\nimport releaseBuild from \"../utilities/releaseBuild\";\nimport useExit from \"../../../utilities/useExit\";\nimport { ReleaseBuildState } from \"../utilities/types\";\nimport ReleaseBuildView from \"./ReleaseBuildView\";\n\nexport default function ReleaseBuildLogic({\n buildId,\n commandUsed,\n configPath,\n}: {\n buildId: string;\n commandUsed: string;\n configPath?: string;\n}) {\n const exit = useExit();\n const [state, setState] = useState<ReleaseBuildState>({ state: \"loading\" });\n\n useEffect(() => {\n releaseBuildWorkflow({ configPath, buildId, updateState }).catch(\n logger.error\n );\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<ReleaseBuildState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as ReleaseBuildState)\n );\n if (changes.state && [\"build-error\", \"complete\"].includes(changes.state)) {\n setTimeout(() => exit(), 10);\n }\n }\n\n return <ReleaseBuildView commandUsed={commandUsed} state={state} />;\n}\n\nasync function releaseBuildWorkflow({\n buildId,\n configPath,\n updateState,\n}: {\n buildId: string;\n configPath?: string;\n updateState: (changes: Partial<ReleaseBuildState>) => void;\n}) {\n try {\n const { appId, build } = await getBuildAttributes({\n buildId,\n configPath,\n });\n updateState({ build });\n\n updateState({ state: \"releasing\" });\n await releaseBuild({ appId, buildId });\n\n logForCI(\"Released!\");\n updateState({ state: \"complete\" });\n } catch (e) {\n const error = CliError.from(e);\n updateState({ error, state: error.type });\n }\n}\n", "import { Build } from \"@todesktop/shared\";\nimport findAppUserId from \"./findAppUserId\";\nimport getBuildById from \"./getBuildById\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\nimport { currentUser } from \"./firestore\";\n\nexport default async function getBuildAttributes({\n buildId,\n configPath,\n}: {\n buildId: string;\n configPath?: string;\n}): Promise<BuildAttributes> {\n const {\n id: appId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n } = getProjectConfig(configPath).config;\n const { id: userId } = await findAppUserId(appId);\n const { uid: contextUserId } = currentUser();\n const build = await fetchBuild({ appId, buildId, userId });\n\n return {\n appId,\n build,\n buildId,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n };\n}\n\nasync function fetchBuild({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}): Promise<Build> {\n const build = await getBuildById({ appId, buildId, userId });\n if (!build) {\n throw new Error(`No such build ${buildId} for application ${appId}`);\n }\n\n return build;\n}\n\ninterface BuildAttributes {\n appId: string;\n buildId: string;\n build: Build;\n contextUserId?: string;\n nodeVersion: string;\n npmVersion: string;\n pnpmVersion: string;\n userId: string;\n}\n", "import { functions } from \"firebase\";\nimport CliError from \"../../../utilities/CliError\";\nimport getCallableFirebaseFunction from \"../../../utilities/getCallableFirebaseFunction\";\n\nexport default async function releaseBuild({\n appId,\n buildId,\n}: {\n appId: string;\n buildId: string;\n}): Promise<void> {\n try {\n await getCallableFirebaseFunction(\"releaseBuild\")({ appId, buildId });\n } catch (e) {\n if (\n isFirebaseFunctionError(e) &&\n (e.code === \"failed-precondition\" || e.code === \"not-found\")\n ) {\n throw CliError.from(e, \"build-error\");\n } else {\n throw new CliError(\"Unexpected internal error while releasing build\");\n }\n }\n}\n\nfunction isFirebaseFunctionError(\n error: unknown\n): error is functions.HttpsError {\n return Boolean(\n typeof error === \"object\" &&\n error &&\n \"code\" in error &&\n error.code === \"string\"\n );\n}\n", "import { Text } from \"ink\";\nimport BuildError from \"../../../components/BuildError\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport { ReleaseBuildState } from \"../utilities/types\";\n\nexport default function ReleaseBuildView({\n commandUsed,\n state,\n}: {\n commandUsed?: string;\n state: ReleaseBuildState;\n}) {\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't release build\"\n message={state.error?.message || \"Internal build error\"}\n />\n );\n }\n\n case \"complete\":\n return (\n <Text bold color=\"greenBright\">\n Released!\n </Text>\n );\n\n case \"error\":\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={{ stack: state.error?.stack }}\n />\n );\n\n case \"loading\":\n return <LoadingText />;\n\n case \"releasing\":\n return <LoadingText text=\"Releasing\" />;\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${state}`)}\n />\n );\n }\n}\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport type { Build } from \"../types\";\n\nexport default function BuildError({\n build,\n description = \"Can't release\",\n message,\n}: {\n build: Build;\n description?: string;\n message: string;\n}) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"red\">\n {description} {build.appName} v{build.appVersion}\n </Text>\n\n <Box marginBottom={1} marginTop={1}>\n <Text>{message}</Text>\n </Box>\n\n <Text bold>See web UI for more information: </Text>\n <Text>\n <Link fallback={false} url={build.url}>\n {build.url}\n </Link>\n </Text>\n </Box>\n );\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\nimport BuildError from \"../../../components/BuildError\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport CliError from \"../../../utilities/CliError\";\nimport getBuildAttributes from \"../../../utilities/getBuildAttributes\";\nimport getLatestReleasedBuild from \"../../../utilities/getLatestReleasedBuild\";\nimport logger from \"../../../utilities/logger\";\nimport {\n isBuildTestable,\n makeProgress,\n} from \"../../smoke-test/utilities/build\";\nimport analyzeRelease, { AnalyzeResult } from \"../utilities/analyzeRelease\";\nimport DowngradeConfirmation from \"./DowngradeConfirmation\";\nimport YesNoConfirmation from \"./YesNoConfirmation\";\n\nexport default function ReleaseConfirmation({\n buildId,\n children,\n configPath,\n disabled = false,\n loadData = loadBuildsData,\n}: {\n buildId: string;\n configPath?: string;\n children: JSX.Element;\n disabled?: boolean;\n\n /** @internal For test */\n loadData?: typeof loadBuildsData;\n}) {\n const [state, setState] = useState<ConfirmationState>({\n state: disabled ? \"bypass\" : \"loading\",\n });\n\n useEffect(() => {\n confirmationWorkflow({\n buildId,\n configPath,\n loadData,\n state,\n updateState,\n }).catch(logger.error);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<ConfirmationState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as ConfirmationState)\n );\n }\n\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't release build\"\n message={state.error?.message || \"Internal build error\"}\n />\n );\n }\n\n case \"bypass\":\n return children;\n\n case \"confirm-downgrade\":\n return (\n <DowngradeConfirmation\n build={state.build}\n latestReleasedBuild={state.latestReleasedBuild}\n confirmDowngrade={state.onConfirm}\n />\n );\n\n case \"confirm-release\":\n if (!state.build) {\n return <ErrorDisplay error={new Error(\"state.build is empty\")} />;\n }\n\n return (\n <YesNoConfirmation\n title={\n <>\n <Text>This will release build {state.build.id} as </Text>\n <Text bold>\n {state.build.appName} v{state.build.appVersion}\n </Text>\n <Text>, are you sure?</Text>\n </>\n }\n onYes={state.onConfirm}\n />\n );\n\n case \"confirm-test\":\n return (\n <YesNoConfirmation\n title={state.confirmationText}\n onYes={state.onConfirm}\n />\n );\n\n case \"error\":\n return <ErrorDisplay error={state.error} />;\n\n case \"loading\":\n return <LoadingText />;\n\n default:\n return (\n <ErrorDisplay\n error={\n new Error(`Unknown state ${(state as ConfirmationState).state}`)\n }\n />\n );\n }\n}\n\nasync function confirmationWorkflow({\n buildId,\n configPath,\n loadData,\n updateState,\n state,\n}: {\n buildId: string;\n configPath?: string;\n loadData: typeof loadBuildsData;\n updateState: (state: Partial<ConfirmationState>) => void;\n state: ConfirmationState;\n}) {\n try {\n const { build, latestReleasedBuild } = await loadData({\n buildId,\n configPath,\n });\n updateState({ build, latestReleasedBuild });\n\n const report = analyzeRelease({ build, latestReleasedBuild });\n if (!report.isReleasable) {\n updateState({ error: new Error(report.error), state: \"build-error\" });\n return;\n }\n\n if (state.state !== \"bypass\") {\n await confirmDowngrade({ report, updateState });\n await confirmSmokeTest({ build, updateState });\n await confirmRelease({ updateState });\n }\n\n updateState({ state: \"bypass\" });\n } catch (e) {\n updateState({ state: \"error\", error: CliError.from(e) });\n }\n}\n\nasync function confirmDowngrade({\n report,\n updateState,\n}: {\n report: AnalyzeResult;\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n if (!report.isOlderThanLatest) {\n return;\n }\n\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-downgrade\" });\n\n await downgradePromise;\n}\n\nasync function confirmSmokeTest({\n build,\n updateState,\n}: {\n build: Build;\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n const confirmationText = getTestConfirmation(build);\n if (confirmationText === \"\") {\n return;\n }\n\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-test\", confirmationText });\n\n await downgradePromise;\n}\n\nasync function confirmRelease({\n updateState,\n}: {\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-release\" });\n\n await downgradePromise;\n}\n\nfunction getTestConfirmation(build: Build): string {\n const continueText = \"Are you sure you want to release?\";\n\n if (!build.todesktopRuntimeVersionSpecified || !isBuildTestable(build)) {\n return \"\";\n }\n\n if (!build.smokeTest) {\n return `Smoke test hasn't been run for this build. ${continueText}`;\n }\n\n const { total } = makeProgress(build);\n\n switch (total.state) {\n case \"error\":\n return `Smoke test failed for this build. ${continueText}`;\n case \"canceled\":\n return `Smoke test was canceled for this build. ${continueText}`;\n case \"progress\":\n return `Smoke test is currently running for this build. ${continueText}`;\n default:\n return \"\";\n }\n}\n\nasync function loadBuildsData({\n buildId,\n configPath,\n}: {\n buildId: string;\n configPath?: string;\n}): Promise<{ build: Build; latestReleasedBuild?: Build }> {\n const { appId, build, userId } = await getBuildAttributes({\n buildId,\n configPath,\n });\n\n const latestReleasedBuild = await getLatestReleasedBuild({ appId, userId });\n\n return { build, latestReleasedBuild };\n}\n\ntype ConfirmationState =\n | { state: \"loading\" }\n | { state: \"bypass\" }\n | {\n state: \"confirm-downgrade\";\n build: Build;\n latestReleasedBuild: Build;\n onConfirm: () => void;\n }\n | {\n state: \"confirm-test\";\n build: Build;\n confirmationText: string;\n onConfirm: () => void;\n }\n | {\n state: \"confirm-release\";\n build: Build;\n onConfirm: () => void;\n }\n | { state: \"error\"; error: Error }\n | { state: \"build-error\"; build: Build; error: Error };\n", "import { Build, SmokeTestProgress } from \"@todesktop/shared/src/desktopify\";\nimport semver from \"semver\";\nimport CliError from \"../../../utilities/CliError\";\n\nconst MIN_RUNTIME_VERSION = \"1.2.1-1\";\n\nexport function isBuildTestable(build: Partial<Build>): boolean {\n try {\n validateBuild(build);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function isTestRunning(build: Build): boolean {\n if (!build.smokeTest) {\n return false;\n }\n\n const { isFinished } = makeProgress(build);\n return !isFinished;\n}\n\nexport const defaultVM = {\n cpu: \"\",\n agentVersion: \"\",\n image: \"\",\n imageVersion: \"\",\n};\n\nexport function makeProgress(build: Build): CliTestProgress {\n const defaultProgress: OsTestProgress = {\n message: \"Starting\",\n progress: 0,\n state: \"progress\",\n shouldSkip: false,\n vm: defaultVM,\n };\n\n const linux: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.linux,\n shouldSkip: build.linux?.shouldSkip || false,\n };\n const mac: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.mac,\n shouldSkip: build.mac?.shouldSkip || false,\n };\n const windows: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.windows,\n shouldSkip: build.windows?.shouldSkip || false,\n };\n\n const platforms: OsTestProgress[] = [linux, mac, windows].filter(\n (p) => !p.shouldSkip && p.state !== \"skipped\"\n );\n\n const isCanceled = Boolean(build.smokeTest?.isCanceled);\n const isFinished =\n isCanceled || platforms.every((p) => p.state !== \"progress\");\n\n let totalState: TotalTestProgress[\"state\"] = \"progress\";\n if (isCanceled) {\n totalState = \"canceled\";\n } else if (platforms.every((p) => p.state === \"done\")) {\n totalState = \"done\";\n } else if (isFinished && platforms.some((p) => p.state === \"error\")) {\n totalState = \"error\";\n }\n\n return {\n isFinished,\n linux,\n mac,\n windows,\n total: {\n error: platforms\n .filter((p) => p.state === \"error\")\n .map((p) => p.message)\n .join(\"\\n\\n\"),\n state: totalState,\n },\n };\n}\n\nexport function validateBuild(build: Partial<Build>) {\n if (build.status !== \"succeeded\") {\n throw new CliError(\n `The build must be completed successfully. ` +\n `Actual build status: ${build.status}`\n );\n }\n\n if (!build.todesktopRuntimeVersionSpecified) {\n throw new CliError(\n \"The build has no todesktopRuntimeVersionSpecified set. \" +\n \"Please make sure @todesktop/runtime is installed as a dependency \" +\n \"and make a new build\"\n );\n }\n\n if (!isRuntimeVerRangeAllowed(build.todesktopRuntimeVersionSpecified)) {\n throw new CliError(\n `This build should have @todesktop/runtime version ${MIN_RUNTIME_VERSION} or later to run smoke tests.`\n );\n }\n}\n\nfunction isRuntimeVerRangeAllowed(runtimeVerRange) {\n const minRuntimeVersionForApp = semver.minVersion(runtimeVerRange, {\n loose: true,\n });\n\n return semver.gte(minRuntimeVersionForApp, MIN_RUNTIME_VERSION, {\n loose: true,\n });\n}\n\nexport interface CliTestProgress {\n isFinished: boolean;\n linux: OsTestProgress;\n mac: OsTestProgress;\n windows: OsTestProgress;\n total: TotalTestProgress;\n}\n\nexport interface OsTestProgress extends SmokeTestProgress {\n shouldSkip?: boolean;\n}\n\nexport interface TotalTestProgress {\n error: string;\n state: \"progress\" | \"done\" | \"error\" | \"canceled\";\n}\n", "import type { Build } from \"@todesktop/shared\";\nimport semver from \"semver\";\n\nexport const MIN_RUNTIME_VERSION_FOR_DOWNGRADE = \"1.4.1-1\";\n\nexport default function analyzeRelease({\n build,\n latestReleasedBuild,\n}: {\n build: Build;\n latestReleasedBuild?: Build;\n}): AnalyzeResult {\n const result: AnalyzeResult = {\n downgradeAllowed: Boolean(\n latestReleasedBuild?.todesktopRuntimeVersionUsed &&\n semver.gte(\n latestReleasedBuild.todesktopRuntimeVersionUsed,\n MIN_RUNTIME_VERSION_FOR_DOWNGRADE\n )\n ),\n error: \"\",\n isAlreadyReleased: Boolean(build.releasedAt),\n isAlreadyTheLatest: build.id === latestReleasedBuild?.id,\n isOlderThanLatest: Boolean(\n latestReleasedBuild &&\n latestReleasedBuild.appVersion &&\n build.appVersion &&\n semver.gt(latestReleasedBuild.appVersion, build.appVersion)\n ),\n isReleasable: false,\n isSucceeded: build.status === \"succeeded\",\n isTheSameVersionAsLatest: Boolean(\n build.appVersion && build.appVersion === latestReleasedBuild?.appVersion\n ),\n };\n\n if (!result.isSucceeded) {\n return {\n ...result,\n error:\n \"The build must have completed successfully. \" +\n `Actual build status: ${build.status}.`,\n };\n }\n\n if (result.isAlreadyTheLatest) {\n return {\n ...result,\n error: \"This build is already the latest released build.\",\n };\n }\n\n if (result.isTheSameVersionAsLatest) {\n return {\n ...result,\n error:\n `This build has the same version as the latest released build ` +\n `(build ID: ${latestReleasedBuild?.id}, version: ${build.appVersion}).`,\n };\n }\n\n if (!result.downgradeAllowed && result.isAlreadyReleased) {\n return { ...result, error: \"This build has already been released.\" };\n }\n\n if (\n !result.downgradeAllowed &&\n result.isOlderThanLatest &&\n latestReleasedBuild\n ) {\n return {\n ...result,\n error:\n `App version (${build.appVersion}) is not newer than latest released ` +\n `version (${latestReleasedBuild.appVersion}) ` +\n `(build ID: ${latestReleasedBuild.id}).`,\n };\n }\n\n return { ...result, isReleasable: true };\n}\n\nexport interface AnalyzeResult {\n downgradeAllowed: boolean;\n error: string;\n isAlreadyReleased: boolean;\n isAlreadyTheLatest: boolean;\n isOlderThanLatest: boolean;\n isReleasable: boolean;\n isSucceeded: boolean;\n isTheSameVersionAsLatest: boolean;\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { Box, Text } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { useState } from \"react\";\nimport { MIN_RUNTIME_VERSION_FOR_DOWNGRADE } from \"../utilities/analyzeRelease\";\n\nexport default function DowngradeConfirmation({\n build,\n latestReleasedBuild,\n confirmDowngrade,\n}: {\n build: Build;\n latestReleasedBuild: Build;\n confirmDowngrade: () => void;\n}) {\n const [confirmText, setConfirmText] = useState(\"\");\n const [showError, setShowError] = useState(false);\n\n const buildVersion = build.appVersion;\n const latestVersion = latestReleasedBuild.appVersion;\n\n function onType(text: string) {\n setShowError(false);\n setConfirmText(text);\n }\n\n function onSubmit(text: string) {\n if (text.trim() === buildVersion) {\n confirmDowngrade();\n } else {\n setShowError(true);\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box borderColor=\"red\" borderStyle=\"double\" paddingX={1}>\n <Text>\n You're trying to release the build {buildVersion}, which is older than\n the latest published version {latestVersion}. This may cause issues if\n your customers are using a version of your desktop app that contains a\n version of @todesktop/runtime that is earlier than v\n {MIN_RUNTIME_VERSION_FOR_DOWNGRADE}.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Are you sure that you wish to release this build?</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>\n To continue, type the text <Text bold>{buildVersion}</Text> below to\n confirm:\n </Text>\n </Box>\n\n <Box>\n <Box marginRight={1}>\n <Text>Confirm new version:</Text>\n </Box>\n\n <TextInput value={confirmText} onChange={onType} onSubmit={onSubmit} />\n </Box>\n\n {showError && (\n <Box>\n <Text color=\"red\">You've entered the wrong version</Text>\n </Box>\n )}\n </Box>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport CustomSelectInputIndicator from \"../../../components/CustomSelectInputIndicator\";\nimport CustomSelectInputItem from \"../../../components/CustomSelectInputItem\";\nimport useExit from \"../../../utilities/useExit\";\n\nexport default function YesNoConfirmation({\n onYes,\n title,\n footer = \"Your users will be auto-updated to this version. You can use \" +\n \"--force to bypass this confirmation in future\",\n}: {\n onYes: () => void;\n title: string | JSX.Element;\n footer?: string;\n}) {\n const exit = useExit();\n\n const items = [\n { label: \"Yes\", value: \"yes\" },\n { label: \"No\", value: \"no\" },\n ];\n\n function onSelect(item: { value: string }) {\n if (item.value === \"yes\") {\n onYes();\n } else if (item.value === \"no\") {\n setTimeout(() => exit(), 10);\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box>{typeof title === \"string\" ? <Text>{title}</Text> : title}</Box>\n\n <Box marginBottom={1} marginTop={1}>\n <SelectInput\n indicatorComponent={CustomSelectInputIndicator}\n initialIndex={1}\n itemComponent={CustomSelectInputItem}\n items={items}\n onSelect={onSelect}\n />\n </Box>\n\n <Text dimColor>{footer}</Text>\n </Box>\n );\n}\n", "import { Build } from \"@todesktop/shared\";\nimport BuildPicker from \"../../components/BuildPicker\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\nimport ReleaseBuildLogic from \"./components/ReleaseBuildLogic\";\nimport ReleaseConfirmation from \"./components/ReleaseConfirmation\";\nimport analyzeRelease from \"./utilities/analyzeRelease\";\n\nexport default function ReleaseCommand({\n buildId,\n configPath,\n shouldConfirm,\n}: {\n buildId: string;\n configPath?: string;\n shouldConfirm: boolean;\n}) {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"release\", {\n buildId,\n shouldConfirm,\n config: configPath,\n });\n\n let command = \"todesktop release\";\n if (buildId) {\n command += \" \" + (buildId === \"latest\" ? \"--latest\" : \"<id>\");\n }\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <BuildPicker\n buildFilter={isBuildReleasable}\n buildId={buildId}\n commandUsed={command}\n configPath={configPath}\n noBuildsDescription=\"(i.e. unreleased and successful)\"\n question=\"Which build would you like to release?\"\n >\n {(id) => (\n <ReleaseConfirmation\n buildId={id}\n configPath={configPath}\n disabled={!shouldConfirm}\n >\n <ReleaseBuildLogic\n buildId={id}\n commandUsed={command}\n configPath={configPath}\n />\n </ReleaseConfirmation>\n )}\n </BuildPicker>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n\nfunction isBuildReleasable(opts: {\n build: Build;\n latestReleasedBuild?: Build;\n}) {\n return analyzeRelease(opts).isReleasable;\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { useEffect, useState } from \"react\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport CliError from \"../../utilities/CliError\";\nimport getBuildAttributes from \"../../utilities/getBuildAttributes\";\nimport logger from \"../../utilities/logger\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\nimport useExit from \"../../utilities/useExit\";\nimport BuildPicker from \"../../components/BuildPicker\";\nimport Cancellation from \"./components/Cancellation\";\nimport SmokeTestView from \"./components/SmokeTestView\";\nimport {\n isBuildTestable,\n isTestRunning,\n TotalTestProgress,\n validateBuild,\n} from \"./utilities/build\";\nimport cancelSmokeTest from \"./utilities/cancelSmokeTest\";\nimport queueSmokeTest from \"./utilities/queueSmokeTest\";\nimport SmokeState from \"./utilities/SmokeState\";\n\nimport waitUntilFinished from \"./utilities/waitUntilFinished\";\n\nexport default function SmokeTestCommand({\n buildId,\n configPath,\n}: {\n buildId?: string;\n configPath?: string;\n}) {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"smoke-test\", { buildId, configPath });\n\n const command = `todesktop release ${\n buildId === \"latest\" ? \"--latest\" : \"<id>\"\n }`;\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <BuildPicker\n buildFilter={({ build }) => isBuildTestable(build)}\n buildId={buildId}\n commandUsed={command}\n configPath={configPath}\n noBuildsDescription=\"(candidates for smoke-test must be built with @todesktop/runtime@1.2.1 or later)\"\n >\n {(id) => (\n <SmokeTestContainer\n commandUsed={command}\n buildId={id}\n configPath={configPath}\n />\n )}\n </BuildPicker>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n\nfunction SmokeTestContainer({\n buildId,\n commandUsed,\n configPath,\n}: {\n buildId: string;\n commandUsed: string;\n configPath?: string;\n}) {\n const exit = useExit();\n const [state, setState] = useState<SmokeState>({\n buildId,\n state: \"loading\",\n });\n const [abortController] = useState(new AbortController());\n const abortSignal = abortController.signal;\n\n useEffect(() => {\n smokeTestWorkflow({ abortSignal, buildId, configPath, updateState }).catch(\n logger.error\n );\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<SmokeState>) {\n setState((previousState) => ({ ...previousState, ...changes }));\n if (\n changes.state &&\n [\"build-error\", \"complete\", \"progress-error\"].includes(changes.state)\n ) {\n setTimeout(() => exit(), 10);\n }\n }\n\n async function onCancel() {\n abortController.abort();\n if (state.state === \"progress\" && buildCanBeCanceled(state.build)) {\n await cancelSmokeTest(state as Required<SmokeState>);\n }\n }\n\n return (\n <Cancellation\n disabled={!isCancelable(state)}\n onCancel={onCancel}\n subject=\"smoke test\"\n >\n <SmokeTestView commandUsed={commandUsed} state={state} />\n </Cancellation>\n );\n}\n\nasync function smokeTestWorkflow({\n abortSignal,\n buildId,\n configPath,\n updateState,\n}: {\n abortSignal: AbortSignal;\n buildId: string;\n configPath?: string;\n updateState: (changes: Partial<SmokeState>) => void;\n}) {\n try {\n const {\n appId,\n build,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n } = await getBuildAttributes({\n buildId,\n configPath,\n });\n\n updateState({ appId, build, userId });\n validateBuild(build);\n\n if (!abortSignal.aborted && !isTestRunning(build)) {\n await queueSmokeTest({\n appId,\n buildId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n contextUserId,\n });\n }\n\n updateState({ state: \"progress\" });\n const { total } = await waitUntilFinished({\n appId,\n buildId,\n userId,\n onProgress: (progress) => updateState({ progress }),\n });\n\n const stateMap: Record<TotalTestProgress[\"state\"], SmokeState[\"state\"]> = {\n done: \"complete\",\n progress: \"complete\", // Not actually used, just for TS\n error: \"progress-error\",\n canceled: \"canceled\",\n };\n updateState({ state: stateMap[total.state] });\n } catch (e) {\n const error = CliError.from(e);\n updateState({ error, state: error.type });\n }\n}\n\nfunction buildCanBeCanceled(build?: Build) {\n if (build?.smokeTest?.isCanceled) {\n return false;\n }\n\n return Boolean(build?.smokeTest?.buildServerExecutionId);\n}\n\nfunction isCancelable(state: SmokeState) {\n const cancelableStates: Array<SmokeState[\"state\"]> = [\"loading\", \"progress\"];\n return cancelableStates.includes(state.state);\n}\n", "import { Box, Text } from \"ink\";\nimport { useState } from \"react\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport logger from \"../../../utilities/logger\";\nimport useExit from \"../../../utilities/useExit\";\nimport useInput from \"../../../utilities/useInput\";\n\nexport default function Cancellation({\n children,\n disabled = false,\n exitWhenCanceled = true,\n onCancel,\n renderCanceling = () => <LoadingText text={`Canceling ${subject}`} />,\n renderCanceled = () => <Text>{upperCaseFirstChar(subject)} canceled.</Text>,\n renderCancelText = () => (\n <Text color=\"gray\">\n <Text bold>[esc]:</Text> cancel {subject}\n </Text>\n ),\n renderError = (e: Error) => <ErrorDisplay error={e} />,\n subject,\n}: {\n children?: JSX.Element;\n disabled?: boolean;\n exitWhenCanceled?: boolean;\n onCancel: () => Promise<any>;\n renderCanceled?: () => JSX.Element;\n renderCanceling?: () => JSX.Element;\n renderCancelText?: () => JSX.Element;\n renderError?: (e: Error) => JSX.Element;\n subject: string;\n}) {\n const [state, setState] = useState<CancellationState>(\"normal\");\n const [error, setError] = useState<Error>();\n\n const onInput = useInput();\n const exit = useExit();\n\n onInput(async (input, key) => {\n if (key.escape) {\n cancel();\n }\n });\n\n function cancel() {\n if (disabled) {\n return;\n }\n\n logger.debug(`esc pressed, cancelling ${subject}`);\n setState(\"cancelling\");\n\n onCancel()\n .then(() => {\n setState(\"cancelled\");\n if (exitWhenCanceled) {\n setTimeout(() => exit(), 10);\n }\n })\n .catch((e) => {\n setError(e);\n setState(\"error\");\n });\n }\n\n switch (state) {\n case \"cancelled\":\n return renderCanceled();\n case \"cancelling\":\n return renderCanceling();\n case \"error\":\n return renderError(error);\n default:\n return (\n <>\n {children}\n {!disabled && <Box>{renderCancelText()}</Box>}\n </>\n );\n }\n}\n\ntype CancellationState = \"normal\" | \"cancelling\" | \"cancelled\" | \"error\";\n\nfunction upperCaseFirstChar(str: string): string {\n return str[0].toUpperCase() + str.slice(1);\n}\n", "import { Text } from \"ink\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport SmokeState from \"../utilities/SmokeState\";\nimport BuildError from \"../../../components/BuildError\";\nimport TestProgress from \"./TestProgress\";\n\nexport default function SmokeTestView({\n commandUsed = \"\",\n state,\n}: {\n commandUsed?: string;\n state: SmokeState;\n}) {\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't finish smoke test\"\n message={state.error?.message}\n />\n );\n }\n\n case \"canceled\":\n return <Text>Smoke test canceled.</Text>;\n\n case \"complete\":\n return (\n <Text bold color=\"greenBright\">\n Smoke test passed.\n </Text>\n );\n\n case \"error\":\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={{ stack: state.error?.stack }}\n />\n );\n\n case \"loading\":\n return <LoadingText text=\"Preparing smoke test\" />;\n\n case \"progress\":\n return <TestProgress progress={state.progress} />;\n\n case \"progress-error\":\n return (\n <>\n <TestProgress progress={state.progress} />\n <BuildError\n build={state.build}\n description=\"Can't finish smoke test\"\n message={state.progress?.total?.error}\n />\n </>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${state}`)}\n />\n );\n }\n}\n", "import { ForegroundColor } from \"chalk\";\nimport { Box, Text } from \"ink\";\n\nexport default function ProgressBar({\n color = \"white\",\n label,\n labelWidth = 9,\n marginBottom = 1,\n progress,\n text = \"\",\n}: {\n color?: typeof ForegroundColor;\n label: string;\n labelWidth?: number;\n marginBottom?: number;\n progress: number;\n text?: string;\n}) {\n const percentage =\n progress > 0 ? Math.round(progress).toString().padStart(2, \"0\") + \"%\" : \"\";\n\n const displayedText = (text || \"\")\n .replace(/(?:\\r\\n|\\r|\\n)\\s*/g, \"\u21B5 \")\n .replace(/(.{63}).+/, \"$1\u2026\");\n\n return (\n <Box marginBottom={marginBottom}>\n <Box width={labelWidth}>\n <Text>{label}:</Text>\n </Box>\n <Box width={6} justifyContent=\"flex-end\" marginRight={1}>\n {Boolean(percentage) && (\n <Text backgroundColor={color} color=\"black\">\n {` ${percentage} `}\n </Text>\n )}\n </Box>\n <Box>\n <Text>{displayedText}</Text>\n </Box>\n </Box>\n );\n}\n", "import { ForegroundColor } from \"chalk\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport { CliTestProgress, OsTestProgress } from \"../utilities/build\";\nimport ProgressBar from \"./ProgressBar\";\n\nexport default function TestProgress({\n progress,\n}: {\n progress?: CliTestProgress;\n}) {\n if (!progress) {\n return <LoadingText text=\"Loading test stats\" />;\n }\n\n return (\n <>\n {!progress.windows.shouldSkip && (\n <OsProgress os=\"Windows\" progress={progress.windows} />\n )}\n {!progress.mac.shouldSkip && (\n <OsProgress os=\"macOS\" progress={progress.mac} />\n )}\n {!progress.linux.shouldSkip && (\n <OsProgress os=\"Linux\" progress={progress.linux} />\n )}\n </>\n );\n}\n\nfunction OsProgress({\n os,\n progress,\n}: {\n os: string;\n progress: OsTestProgress;\n}) {\n const colors: Record<OsTestProgress[\"state\"], typeof ForegroundColor> = {\n progress: \"white\",\n error: \"red\",\n done: \"green\",\n skipped: \"yellow\", // Not used actually, just for type matching\n };\n const text = progress.message + (progress.state === \"progress\" ? \"...\" : \"\");\n\n return (\n <ProgressBar\n color={colors[progress.state]}\n label={os}\n progress={progress.progress}\n text={text}\n />\n );\n}\n", "import postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\nexport default async function cancelSmokeTest({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}) {\n await postToFirebaseFunction(\"cancelSmokeTest_HTTP\", {\n appId,\n buildId,\n userId,\n });\n}\n", "import CliError from \"../../../utilities/CliError\";\nimport logger from \"../../../utilities/logger\";\nimport postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\n\nexport default async function queueSmokeTest({\n appId,\n buildId,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n}: {\n appId: string;\n buildId: string;\n contextUserId?: string;\n nodeVersion: string;\n npmVersion: string;\n pnpmVersion: string;\n userId: string;\n}) {\n try {\n await postToFirebaseFunction(\"queueSmokeTest_HTTP\", {\n appId,\n buildId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n contextUserId,\n });\n } catch (e) {\n logger.error({ error: e });\n throw new CliError(`Unexpected internal error while testing build`);\n }\n}\n", "import { Build } from \"@todesktop/shared\";\nimport firestore from \"../../../utilities/firestore\";\nimport { makeProgress, CliTestProgress } from \"./build\";\n\nexport default async function waitUntilFinished({\n appId,\n buildId,\n onProgress,\n userId,\n}: {\n appId: string;\n buildId: string;\n onProgress: (progress: CliTestProgress) => void;\n userId: string;\n}) {\n const docPath = `users/${userId}/applications/${appId}/builds/${buildId}`;\n\n return new Promise<CliTestProgress>((resolve, reject) => {\n const unsubscribe = firestore.doc(docPath).onSnapshot(\n (snapshot) => {\n const data = snapshot.exists ? snapshot.data() : undefined;\n const progress = makeProgress(data as Build);\n\n onProgress(progress);\n\n if (progress.isFinished) {\n unsubscribe();\n resolve(progress);\n }\n },\n (err) => {\n unsubscribe();\n reject(err);\n }\n );\n });\n}\n", "import { useEffect } from \"react\";\nimport { Text } from \"ink\";\n\nimport checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport { getAuthConfig } from \"../utilities/configStore\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\nimport useExit from \"../utilities/useExit\";\n\nconst WhoAmI = () => {\n const exit = useExit();\n checkIfReactIsUsable();\n const auth = getAuthConfig();\n const { hasAttemptedTracking } = useAnalyticsCommand(\"whoami\", {}, {});\n\n // exits the program once tracking of the \"whoami\" command has been attempted\n useEffect(() => {\n if (hasAttemptedTracking) {\n exit();\n }\n }, [exit, hasAttemptedTracking]);\n\n if (!auth || !auth.email) {\n return <Text>{\"You're not signed in\"}</Text>;\n }\n return <Text>{auth.email}</Text>;\n};\n\nconst WhoAmIWrapper = () => (\n <ErrorBoundary>\n <LoginHOC isInteractive={false}>\n <WhoAmI />\n </LoginHOC>\n </ErrorBoundary>\n);\n\nexport default WhoAmIWrapper;\n", "import chalk from \"chalk\";\nimport isInstalledGlobally from \"is-installed-globally\";\nimport latestVersion from \"latest-version\";\nimport semver from \"semver\";\nimport getToDesktopPackageJson from \"./getToDesktopPackageJson\";\n\nexport default () => {\n // Ignore during tests\n if (process.env.AVA_PATH) {\n return;\n }\n\n const pkg = getToDesktopPackageJson();\n latestVersion(pkg.name).then((latest) => {\n if (semver.gt(latest, pkg.version)) {\n const commandToUpdate = chalk.greenBright(\n `npm install ${\n isInstalledGlobally ? \"--location=global\" : \"--save-dev\"\n } @todesktop/cli`\n );\n console.log(\n `Your version of @todesktop/cli is out of date.\\nRun ${commandToUpdate} to update to v${latest}.`\n );\n if (!semver.satisfies(latest, `^${pkg.version}`)) {\n console.log(`CLI is exiting because it is out out of date.`);\n process.exit(1);\n }\n }\n });\n};\n", "import * as Sentry from \"@sentry/node\";\nimport os from \"os\";\nimport pkgJson from \"../../package.json\";\nimport { getAuthConfig } from \"./configStore\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nexport default () => {\n const { TODESKTOP_CLI_SENTRY_DSN } = getEnvironmentVariables();\n if (!TODESKTOP_CLI_SENTRY_DSN) {\n // Don't initialise Sentry\n return;\n }\n Sentry.init({\n dsn: TODESKTOP_CLI_SENTRY_DSN,\n });\n Sentry.configureScope((scope) => {\n try {\n scope.setUser({ email: getAuthConfig().email as string });\n } catch (err) {\n // nothing\n }\n try {\n scope.setContext(\"os\", {\n name: os.platform(),\n version: os.release(),\n });\n } catch (err) {\n // nothing\n }\n try {\n scope.setContext(\"runtime\", {\n name: \"Node.js\",\n version: process.version,\n });\n } catch (err) {\n // nothing\n }\n try {\n scope.setContext(\"app\", {\n app_name: pkgJson.name,\n app_version: pkgJson.version,\n });\n } catch (err) {\n // nothing\n }\n try {\n const configResult = getProjectConfig();\n scope.setExtra(\"config\", configResult);\n } catch (err) {\n // nothing\n }\n });\n};\n", "import exitIfCLIOutOfDate from \"./exitIfCLIOutOfDate\";\nimport initSentry from \"./initSentry\";\n\nexport default ({ sentry = true, exitIfOutOfDate = true } = {}) => {\n if (sentry) {\n initSentry();\n }\n\n if (exitIfOutOfDate) {\n exitIfCLIOutOfDate();\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\nimport { InvalidArgumentError, Option, program } from \"commander\";\nimport { render } from \"ink\";\nimport { FC, createElement } from \"react\";\nimport \"source-map-support/register\";\n\nimport BuildCommand from \"./commands/build/BuildCommand\";\nimport BuildsCommand from \"./commands/BuildsCommand\";\nimport LogoutCommand from \"./commands/LogoutCommand\";\nimport ReleaseCommand from \"./commands/release/ReleaseCommand\";\nimport SmokeTestCommand from \"./commands/smoke-test/SmokeTestCommand\";\nimport WhoamiCommand from \"./commands/WhoamiCommand\";\nimport getCliVersion from \"./utilities/getCliVersion\";\nimport onCommand from \"./utilities/onCommand\";\n\nfunction parseCount(value: string): number {\n const parsedValue = Number.parseInt(value, 10);\n if (parsedValue > 0) {\n return parsedValue;\n }\n\n throw new InvalidArgumentError(\"Should be a positive number\");\n}\n\nconst configOption = new Option(\n \"--config [string]\",\n \"Path to a different configuration file. If not specified, \" +\n \"`todesktop.json` in the project root will be used\"\n).argParser((value?: string): string | undefined => {\n if (typeof value === \"string\" && value === \"\") {\n throw new InvalidArgumentError(\"Provided config path is empty\");\n }\n\n return value;\n});\n\nprogram.name(\"todekstop\").version(getCliVersion());\n\nprogram\n .command(\"build\")\n .description(\n \"Build an Electron app with native installers, code signing baked-in, \" +\n \"etc. but without releasing it (existing users won't get an \" +\n \"auto-update). For quicker builds, you can append `--code-sign=false` \" +\n \"to disable code-signing and notarization.\"\n )\n .option(\n \"--code-sign [bool]\",\n \"Whether or not code-signing and notarization should be performed. \" +\n \"Disable this for quicker builds\"\n )\n .option(\n \"--async\",\n \"Upload your app for building on our servers but exit after the upload \" +\n \"is complete. Do not wait until the app is actually built\"\n )\n .option(\n \"--webhook [string]\",\n \"Send POST request to the webhook URL after building is finished\"\n )\n .addOption(configOption)\n .action(({ async, codeSign, config, webhook }) => {\n runCommand(BuildCommand, {\n configPath: config,\n exitAfterUploading: async === true,\n onBuildFinishedWebhook: webhook,\n shouldCodeSign: codeSign !== \"false\",\n });\n });\n\nprogram\n .command(\"builds\")\n .description(\"View your builds\")\n .argument(\"[id]\", \"View a specific build by ID\")\n .option(\"--latest\", \"View the latest build\")\n .addOption(configOption)\n .option(\"--count [number]\", \"Number of builds to show per page\", parseCount)\n .addOption(\n new Option(\"--format <type>\", \"Format to output the build details in\")\n .choices([\"json\", \"table\"])\n .default(\"table\")\n )\n .option(\n \"--exit\",\n \"Disable dynamic pagination and exit the process once the build data \" +\n \"has been displayed\"\n )\n .action((id, { config, count, exit, format, latest }) => {\n runCommand(BuildsCommand, {\n configPath: config,\n count,\n exit,\n format,\n id,\n shouldViewLatest: latest,\n });\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logs you out\")\n .action(() => {\n runCommand(LogoutCommand, null, { exitIfOutOfDate: false });\n });\n\nprogram\n .command(\"release\")\n .description(\"Release a build\")\n .argument(\"[id]\", \"A specific build ID to release\")\n .option(\"--force\", \"Skips interactive confirmation step\")\n .option(\"--latest\", \"Release the latest build\")\n .addOption(configOption)\n .action((id, { config, force, latest }) => {\n runCommand(ReleaseCommand, {\n configPath: config,\n shouldConfirm: !force,\n buildId: latest ? \"latest\" : id,\n });\n });\n\nprogram\n .command(\"smoke-test\")\n .description(\"Check whether the build works and can be successfully updated\")\n .argument(\"[id]\", \"A specific build ID to test\")\n .option(\"--latest\", \"Release the latest build\")\n .addOption(configOption)\n .action((id, { config, latest }) => {\n runCommand(SmokeTestCommand, {\n configPath: config,\n buildId: latest ? \"latest\" : id,\n });\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Prints the email of the account you're signed into\")\n .action(() => {\n runCommand(WhoamiCommand);\n });\n\nconst runCommand = <T extends FC<Props>, Props extends object>(\n component: T,\n props: Props | null = null,\n { exitIfOutOfDate = true } = {}\n) => {\n onCommand({ exitIfOutOfDate });\n\n const { waitUntilExit } = render(createElement(component, props));\n\n waitUntilExit().catch((error) => {\n console.error(error.stack);\n });\n};\n\n// Don't exist with status 1 if no command specified\nconst args = [...process.argv];\nif (args.length === 2) {\n args.push(\"help\");\n}\n\nprogram.parse(args);\n", "// libs\nimport { Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\n\n// components\nimport BuildProgress from \"../../../components/BuildProgress\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport MainLayout from \"../../../components/MainLayout\";\nimport Preparation from \"./Preparation\";\n\n// utils\nimport logForCI from \"../../../utilities/logForCI\";\nimport runBuild from \"../utilities/runBuild\";\nimport type { BuildState } from \"../utilities/types\";\nimport useExit from \"../../../utilities/useExit\";\n\nexport default function Build({\n commandUsed,\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n}: {\n commandUsed: string;\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign: boolean;\n}) {\n const exit = useExit();\n const [state, setState] = useState<BuildState>({ state: \"initializing\" });\n\n useEffect(() => {\n runBuild({\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n updateState,\n }).catch((e) => {\n const error = e.response ? e.response.data : e;\n logForCI(error);\n updateState({ state: \"error\", error });\n });\n\n return () => state.onUnmount?.();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<BuildState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as BuildState)\n );\n\n if (changes.state === \"exit-after-uploading\") {\n setTimeout(() => exit(), 10);\n }\n\n if (changes.state === \"build-failed\") {\n setTimeout(() => exit(new Error(\"Build has failed\")), 10);\n }\n }\n\n switch (state.state) {\n case \"build-failed\":\n case \"building\": {\n if (!state.build) {\n return (\n <ErrorDisplay commandUsed={commandUsed} error=\"No build is set\" />\n );\n }\n\n return (\n <MainLayout\n appName={state.build.appName || state.appPkg?.name || \"\"}\n appVersion={state.build.appVersion || state.appPkg?.version || \"\"}\n build={state.build}\n commandUsed={commandUsed}\n hasBuildEverFailed={state.state === \"build-failed\"}\n >\n <BuildProgress build={state.build} onBuildFailure={() => {}} />\n </MainLayout>\n );\n }\n\n case \"error\":\n return <ErrorDisplay commandUsed={commandUsed} error={state.error} />;\n\n case \"exit-after-uploading\":\n return (\n <Text>\n App is building on ToDesktop. Exit since the --async flag is passed.\n </Text>\n );\n\n case \"initializing\":\n return <Text>Getting app info...</Text>;\n\n case \"preparing\":\n return (\n <MainLayout\n appName={state.build?.appName || state.appPkg?.name || \"\"}\n appVersion={state.build?.appVersion || state.appPkg?.version || \"\"}\n build={state.build}\n commandUsed={commandUsed}\n hasBuildEverFailed={false}\n >\n <Preparation\n progressPercentage={state.preparationProgress || 0}\n stageLabel={state.preparationStageLabel || \"Preparing\"}\n uploadedSize={state.preparationUploadedSize}\n />\n </MainLayout>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${(state as BuildState).state}`)}\n />\n );\n }\n}\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\nimport throttle from \"lodash.throttle\";\nimport BuildCompleteMessage from \"./BuildCompleteMessage\";\nimport PlatformProgress from \"./PlatformProgress\";\nimport { hasBuildKickedOff } from \"../utilities/buildStatus\";\nimport logger from \"../utilities/logger\";\nimport logForCI from \"../utilities/logForCI\";\nimport useExit from \"../utilities/useExit\";\n\nconst logForCIThrottled = throttle(logForCI, 60 * 1000, { trailing: true });\n\nconst BuildProgress = ({ build, onBuildFailure }) => {\n logger.debug(\"BuildProgress component: render\");\n const exit = useExit();\n\n const [{ hasKickedOff }, setState] = useState({\n hasKickedOff: false,\n });\n const platformsNotSkipped = [\"windows\", \"mac\", \"linux\"].filter(\n (platform) => !build[platform].shouldSkip\n );\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n hasKickedOff: hasBuildKickedOff(build),\n }));\n }, [build]);\n\n useEffect(() => {\n if (build.status === \"failed\") {\n onBuildFailure(build.errorMessage);\n } else if (build.status === \"cancelled\") {\n setTimeout(exit, 10);\n } else {\n const ciPlatformProgress = platformsNotSkipped.map(\n (platform) =>\n `${platform.charAt(0).toUpperCase() + platform.slice(1)}: ${\n build[platform].progressActivityName\n } (${build[platform].progressPercentage}%)`\n );\n logForCIThrottled(ciPlatformProgress.join(\", \"));\n }\n }, [build, exit, onBuildFailure, platformsNotSkipped]);\n\n if (build.status === \"succeeded\") {\n return <BuildCompleteMessage build={build} />;\n }\n\n if (build.status === \"cancelled\") {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>Build cancelled</Text>\n </Box>\n );\n }\n\n if (!hasKickedOff) {\n return null;\n }\n\n return (\n <>\n <Box flexDirection=\"column\">\n {platformsNotSkipped.map((platform) => (\n <Box flexDirection=\"column\" key={platform}>\n <PlatformProgress\n activityName={\n build[platform].status === \"failed\"\n ? build[platform].errorMessage\n : build[platform].progressActivityName\n }\n activityType={\n build[platform].status === \"failed\"\n ? \"error\"\n : build[platform].progressActivityType\n }\n downloadUrl={build[platform].standardDownloadUrl}\n percent={build[platform].progressPercentage}\n platform={platform}\n shouldShowReadyPrefix={\n !(build && [\"failed\", \"succeeded\"].includes(build.status))\n }\n />\n </Box>\n ))}\n </Box>\n </>\n );\n};\n\nBuildProgress.propTypes = {\n build: PropTypes.object.isRequired,\n onBuildFailure: PropTypes.func.isRequired,\n};\n\nexport default BuildProgress;\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport PropTypes from \"prop-types\";\nimport { Build } from \"@todesktop/shared\";\nimport { useEffect } from \"react\";\nimport logForCI from \"../utilities/logForCI\";\nimport useExit from \"../utilities/useExit\";\nimport fixMacUrl from \"../utilities/fixMacUrl\";\n\nconst BuildCompleteMessage = ({ build }: { build: Build }) => {\n const exit = useExit();\n let url = build.standardUniversalDownloadUrl;\n\n if (process.platform === \"darwin\" && build.mac?.standardDownloadUrl) {\n // Otherwise the download link may link to a Intel file when on Apple Silicon\n url = fixMacUrl(build.mac.standardDownloadUrl);\n }\n\n logForCI(`Build complete! ${url}`);\n\n // On build completion, exit with non-error code\n useEffect(() => {\n if (url) {\n // Just to avoid updating state after exiting the React app\n setTimeout(exit, 10);\n }\n }, [exit, url]);\n\n return (\n <Box marginBottom={1}>\n <Text>\n <Text bold>Build complete!</Text>{\" \"}\n <Link fallback={false} url={url}>\n {url || \"\"}\n </Link>\n </Text>\n </Box>\n );\n};\n\nBuildCompleteMessage.propTypes = {\n build: PropTypes.object.isRequired,\n};\n\nexport default BuildCompleteMessage;\n", "import isCi from \"is-ci\";\nimport logger from \"./logger\";\n\nexport default (...args) => {\n logger.info({ args }, \"logForCI\");\n\n if (isCi || !process.stdin.isTTY) {\n console.log(...args);\n }\n};\n", "import bunyan from \"bunyan\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as Sentry from \"@sentry/node\";\n\nlet logger: Logger;\n\ntry {\n const name = \"todesktop-cli\";\n\n let parentDirectory;\n const homePath = os.homedir();\n if (process.platform === \"darwin\") {\n parentDirectory = path.join(homePath, \"Library\", \"Logs\", name);\n } else if (process.platform === \"win32\") {\n parentDirectory = path.join(\n process.env.APPDATA || path.join(homePath, \"AppData\", \"Roaming\"),\n name,\n \"logs\"\n );\n } else {\n parentDirectory = path.join(\n process.env.XDG_CONFIG_HOME || path.join(homePath, \".config\"),\n name,\n \"logs\"\n );\n }\n\n fs.mkdirSync(parentDirectory, { recursive: true });\n\n logger = bunyan.createLogger({\n name,\n src: true,\n streams: [\n {\n level: \"debug\",\n path: path.join(parentDirectory, \"main.log\"),\n },\n ],\n });\n} catch (e) {\n // Ignore\n\n const noOp = () => {};\n logger = {\n debug: noOp,\n error: noOp,\n fatal: noOp,\n info: noOp,\n trace: noOp,\n warn: noOp,\n };\n\n try {\n Sentry.captureException(e);\n } catch (err) {\n // Ignore\n }\n}\n\nexport default logger;\n\nexport interface Logger {\n debug: LogFn;\n error: LogFn;\n fatal: LogFn;\n info: LogFn;\n trace: LogFn;\n warn: LogFn;\n}\n\nexport type LogFn = (obj: Error | object | string, ...args: unknown[]) => void;\n", "import { useApp } from \"ink\";\nimport { flush } from \"./analytics\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default () => {\n const { exit } = useApp();\n\n return (error?: Error) => {\n logger.debug({ error }, \"Exit called\");\n\n /*\n First, destroy connections.\n Why do we need to do this if we're going to call process.exit\n below anyway? Just to be safe in case a Firestore subscription\n triggers a state update after the React app is exited.\n */\n firestore.terminate().catch((e) =>\n // Ignore\n logger.error(e)\n );\n\n let timeoutId;\n Promise.race([\n // flush the analytics to make sure all outstanding events are pushed to segment\n new Promise<void>((resolve) => flush(() => resolve())),\n // If it takes longer than 1 second, resolve early to proceed with program exit\n new Promise<void>(\n (resolve) => (timeoutId = setTimeout(() => resolve(), 1000))\n ),\n ])\n .catch(() => {})\n .finally(() => {\n clearTimeout(timeoutId);\n /*\n Then, exit the React app. We don't pass the error because:\n 1. We don't want it displayed. We could give it a dummy error but\n that will output an empty line.\n 2. It doesn't exit with the correct code anyway, see\n https://github.com/vadimdemedes/pastel/issues/39.\n\n Side note: your component must not perform state updates after\n calling this, it will error.\n\n The try-catch shouldn't be needed here, but let's be safe\n */\n try {\n exit();\n } catch (e) {\n logger.error(e);\n // Ignore\n }\n\n /*\n Then exit the process.\n It should happen if all connections, etc. are destroyed. We manually\n exit with a code because:\n 1. We might not clean up properly, it could fail or take a long time.\n 2. The exit function above doesn't exit the CLI with the correct\n code anyway.\n\n If we had a way to detect when the app exits, we would use that\n and then call process.exit / destroy connections appropriately\n (https://github.com/vadimdemedes/pastel/issues/38).\n */\n setTimeout(() => process.exit(error ? 1 : 0), 10);\n });\n };\n};\n", "import os from \"os\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport Analytics from \"analytics-node\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\nimport { currentUser } from \"./firestore\";\nimport { getAuthConfig } from \"./configStore\";\nimport getCliVersion from \"./getCliVersion\";\n\nconst environmentVariables = getEnvironmentVariables();\n\nconst analytics = new Analytics(environmentVariables.SEGMENT_WRITE_KEY, {\n flushAt: 1,\n flushInterval: 1,\n});\n\nexport const ANALYTICS_EVENT = {\n CLI_COMMAND: \"CLI Command\",\n};\n\nfunction getAnalyticsBaseProperties() {\n const baseProps = {\n app: {\n cliVersion: \"\",\n },\n client: \"cli\",\n user: {\n email: \"\",\n },\n os: {\n name: \"\",\n version: \"\",\n },\n runtime: {\n name: \"Node.js\",\n version: \"\",\n },\n };\n try {\n baseProps.os = {\n name: os.platform(),\n version: os.release(),\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.user = {\n email: getAuthConfig().email as string,\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.app = {\n cliVersion: getCliVersion(),\n };\n } catch (err) {\n // nothing\n }\n\n try {\n baseProps.runtime = {\n name: \"Node.js\",\n version: process.version,\n };\n } catch (err) {\n // nothing\n }\n\n return baseProps;\n}\n\nconst anonymousId = uuidv4();\nexport const track = (event, properties = {}, callback = () => {}) => {\n try {\n const user = currentUser();\n\n analytics.track(\n {\n event,\n userId: user ? user.uid : undefined,\n anonymousId,\n properties: {\n ...properties,\n ...getAnalyticsBaseProperties(),\n },\n },\n callback\n );\n } catch (err) {\n // nothing\n }\n};\n\nexport const identify = (id, traits = {}, callback = () => {}) => {\n try {\n analytics.identify({ userId: id, anonymousId, traits }, callback);\n } catch (err) {\n // nothing\n }\n};\n\nexport const flush = (callback = () => {}) => analytics.flush(callback);\n", "import dotenv from \"dotenv\";\nimport path from \"path\";\n\nlet hasInitialized = false;\n\nconst init = () => {\n if (hasInitialized) {\n return;\n }\n\n dotenv.config({\n path: path.resolve(__dirname, \"../.env\"),\n });\n hasInitialized = true;\n};\n\ntype EnvVars = {\n TODESKTOP_CLI_ENV: string;\n TODESKTOP_CLI_S3_BUCKET: string;\n TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE: string;\n TODESKTOP_CLI_FIREBASE_API_KEY: string;\n TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN: string;\n TODESKTOP_CLI_FIREBASE_DATABASE_URL: string;\n TODESKTOP_CLI_FIREBASE_PROJECT_ID: string;\n TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET: string;\n TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID: string;\n TODESKTOP_CLI_FIREBASE_ID: string;\n TODESKTOP_CLI_SENTRY_DSN: string;\n SEGMENT_WRITE_KEY: string;\n};\n\nexport default () => {\n init();\n return process.env as NodeJS.ProcessEnv & EnvVars;\n};\n", "import firebase from \"firebase/app\";\nimport \"firebase/firestore\";\nimport \"firebase/auth\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nconst environmentVariables = getEnvironmentVariables();\n\n// if (environmentVariables.NODE_ENV === \"development\") {\n// if (true) {\n// firebase.firestore.setLogLevel(\"debug\");\n// }\n\nconst firebaseDB = firebase.initializeApp({\n apiKey: environmentVariables.TODESKTOP_CLI_FIREBASE_API_KEY,\n authDomain: environmentVariables.TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN,\n databaseURL: environmentVariables.TODESKTOP_CLI_FIREBASE_DATABASE_URL,\n projectId: environmentVariables.TODESKTOP_CLI_FIREBASE_PROJECT_ID,\n storageBucket: environmentVariables.TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET,\n messagingSenderId:\n environmentVariables.TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID,\n appId: environmentVariables.TODESKTOP_CLI_FIREBASE_ID,\n});\n\nexport const currentUser = () => firebase.auth().currentUser;\nexport const signInWithCustomToken = async (token) => {\n return firebase.auth().signInWithCustomToken(token);\n};\n\n/**\n * onUserAuth is only triggered on sign-in. This\n * happens once signInWithCustomToken is successful.\n *\n * It technically also triggers on sign-out but there's\n * no concept of signing out of firebase with the CLI app.\n * (See logout command which just deletes a local file)\n */\nexport const onUserAuth = (handler) =>\n firebase.auth().onAuthStateChanged((user) => {\n handler(user || {});\n });\n\nexport default firebaseDB.firestore();\n", "import * as fs from \"fs\";\nimport del from \"del\";\nimport Conf from \"conf\";\nimport xdgBasedir from \"xdg-basedir\";\n\nconst config = new Conf({ configName: \"todesktop-cli\" });\n\nexport const accessTokenConfigKey = \"accessToken\";\nexport const emailConfigKey = \"email\";\nexport const jwtTokenConfigKey = \"jwtToken\";\n\nexport const setConfig = (key, value) => config.set(key, value);\nexport const getConfig = (key) => config.get(key) as string;\n\nexport const setAuthConfig = (email, accessToken, jwtToken) => {\n setConfig(emailConfigKey, email);\n setConfig(accessTokenConfigKey, accessToken);\n setConfig(jwtTokenConfigKey, jwtToken);\n};\n\nexport const getAuthConfig = () => {\n const accessToken = getConfig(accessTokenConfigKey);\n const jwtToken = getConfig(jwtTokenConfigKey);\n const email = getConfig(emailConfigKey);\n\n return { accessToken, jwtToken, email };\n};\n\nexport const deleteAuthConfig = () => {\n config.delete(emailConfigKey);\n config.delete(accessTokenConfigKey);\n config.delete(jwtTokenConfigKey);\n};\n\n// TODO - Delete by end of April: backwards compatibility for old configstore\nconst oldConfigPath = `${xdgBasedir.config}/configstore/config.json.json`;\nif (fs.existsSync(oldConfigPath)) {\n try {\n // copy config from old json file to new json file, delete old file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { email, accessToken, jwtToken } = require(oldConfigPath);\n setAuthConfig(email, accessToken, jwtToken);\n del(oldConfigPath, { force: true });\n } catch (err) {\n // if invalid json, delete file to prompt new login\n del(oldConfigPath, { force: true });\n }\n}\n", "import pkgUp from \"pkg-up\";\nimport type toDesktopPackageJson from \"../../package.json\";\nimport readJson from \"./readJson\";\n\ntype ToDesktopPackageJson = typeof toDesktopPackageJson;\n\nconst packageJson = readJson<ToDesktopPackageJson>(\n pkgUp.sync({ cwd: __dirname })\n);\n\nexport default function getToDesktopPackageJson(): ToDesktopPackageJson {\n return packageJson;\n}\n", "// This exists so it can be mocked in tests\nexport default function readJson<T>(filePath: string): T {\n return require(filePath);\n}\n", "import getToDesktopPackageJson from \"./getToDesktopPackageJson\";\n\nconst cliVersion = getToDesktopPackageJson().version;\n\nexport default () => cliVersion;\n", "/**\n * Fixes the Mac URL by adding the correct architecture to the URL.\n * @param url The URL to fix.\n * @returns The fixed URL.\n */\nexport default function fixMacUrl(url: string) {\n const baseUrl = new URL(url);\n baseUrl.pathname = `${baseUrl.pathname}/zip/${process.arch}`;\n return baseUrl.href;\n}\n", "import PropTypes from \"prop-types\";\nimport { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport fixMacUrl from \"../utilities/fixMacUrl\";\n\nconst preLabelMaxWidth = \"More info: \".length;\n\nconst getProgressPercentageLabel = (\n percentage: number,\n activityType?: \"error\"\n) => {\n let backgroundColor = \"white\";\n let color = \"black\";\n\n if (activityType === \"error\") {\n backgroundColor = \"red\";\n } else if (percentage === 100) {\n backgroundColor = \"green\";\n color = \"black\";\n }\n\n return (\n <>\n <Text backgroundColor={backgroundColor} color={color}>\n {\" \"}\n {Math.round(percentage).toString().padStart(2, \"0\")}%{\" \"}\n </Text>\n <Text> </Text>\n </>\n );\n};\n\nconst PlatformProgress = ({\n activityName,\n activityType,\n downloadUrl,\n percent,\n platform,\n shouldShowReadyPrefix,\n}) => {\n let progressIndicator;\n if (activityType === \"done\") {\n if (platform === \"mac\") {\n // Otherwise the download link may link to a Intel file when on Apple Silicon\n downloadUrl = fixMacUrl(downloadUrl);\n }\n progressIndicator = (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n {getProgressPercentageLabel(100)}\n {shouldShowReadyPrefix ? \"Ready!\" : \"\"}\n </Text>\n <Link fallback={false} url={downloadUrl}>\n {downloadUrl}\n </Link>\n </Box>\n );\n } else {\n let activityNameToDisplay = activityName.replace(\n /(?:\\r\\n|\\r|\\n)\\s*/g,\n \"\u21B5 \"\n );\n if (activityNameToDisplay.length > 64) {\n activityNameToDisplay = `${activityNameToDisplay.substr(0, 61)}...`;\n }\n\n progressIndicator = (\n <>\n <Box flexDirection={\"column\"} marginBottom={1}>\n <Text>\n {[\"preparation\", \"queue\"].includes(activityType)\n ? undefined\n : getProgressPercentageLabel(percent, activityType)}\n {activityNameToDisplay}\n {activityType === \"error\" ? \"\" : <Text>...</Text>}\n </Text>\n </Box>\n </>\n );\n }\n return (\n <Box>\n <Box width={preLabelMaxWidth}>\n <Text>{platform[0].toUpperCase() + platform.substr(1)}: </Text>\n </Box>\n {progressIndicator}\n </Box>\n );\n};\n\nPlatformProgress.propTypes = {\n activityName: PropTypes.string.isRequired,\n activityType: PropTypes.string.isRequired,\n downloadUrl: PropTypes.string,\n percent: PropTypes.number.isRequired,\n platform: PropTypes.string.isRequired,\n shouldShowReadyPrefix: PropTypes.bool,\n};\n\nexport default PlatformProgress;\n", "export const hasBuildKickedOff = (build) => {\n if (!build) {\n return false;\n }\n return build.status && build.status !== \"preparation\";\n};\n\n// NOTE: this relies on Firestore solely\nexport const isBuildCancellable = (build) =>\n hasBuildKickedOff(build) && isBuildRunning(build);\n\nexport const isBuildRunning = (build) => {\n if (!build) {\n return false;\n }\n return (\n ![\"cancelled\", \"succeeded\"].includes(build.status) &&\n [\"linux\", \"mac\", \"windows\"].some((platform) =>\n isPlatformBuildRunning(build[platform])\n )\n );\n};\n\nexport const isPlatformBuildRunning = (platformBuild) => {\n if (!platformBuild) {\n return false;\n }\n return (\n !platformBuild.shouldSkip && // <-- Noteworthy\n ![\"cancelled\", \"succeeded\"].includes(platformBuild.status) &&\n (\"failed\" !== platformBuild.status ||\n platformBuild.numberOfAttemptedBuilds < 2)\n );\n};\n", "import { Box, Text } from \"ink\";\nimport { useEffect } from \"react\";\nimport CliError from \"../utilities/CliError\";\nimport getCliVersion from \"../utilities/getCliVersion\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\n\nexport default function ErrorDisplay({\n commandUsed,\n error,\n}: {\n commandUsed?: string;\n error?: unknown;\n}) {\n const exit = useExit();\n\n const normalizedError = CliError.from(error);\n\n logger.error({ error });\n\n // After an error is set, exit\n useEffect(() => {\n if (!error) {\n return;\n }\n // Just to avoid updating state after exiting the React app\n setTimeout(() => exit(normalizedError), 10);\n }, [exit, error, normalizedError]);\n\n return (\n <>\n <Text backgroundColor=\"red\" color=\"white\">\n {\" \"}\n ERROR{\" \"}\n </Text>\n <Text>{normalizedError.message}</Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {commandUsed ? (\n <Text dimColor color=\"gray\">\n Command: {commandUsed}\n </Text>\n ) : null}\n <Text dimColor color=\"gray\">\n @todesktop/cli: {getCliVersion()}\n </Text>\n <Text dimColor color=\"gray\">\n Node: {process.version}\n </Text>\n <Text dimColor color=\"gray\">\n cwd: {process.cwd()}\n </Text>\n </Box>\n </>\n );\n}\n", "export default class CliError extends Error {\n type: CliErrorType;\n constructor(\n message: string,\n { cause, type = \"error\" }: { cause?: Error; type?: CliErrorType } = {}\n ) {\n super(message, { cause });\n this.type = type;\n }\n\n static from(e: unknown, type: CliErrorType = \"error\"): CliError {\n if (e instanceof Error) {\n return new CliError(e.message, { cause: e, type });\n } else if (typeof e === \"string\") {\n return new CliError(e, { type });\n } else {\n return new CliError(JSON.stringify(e), { type });\n }\n }\n}\n\nexport type CliErrorType = \"build-error\" | \"error\";\n", "// libs\nimport { Box, Text, useStdin } from \"ink\";\nimport isCi from \"is-ci\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { Build } from \"../types\";\n\n// components\nimport CancelBuild from \"./CancelBuild\";\nimport Footer from \"./Footer\";\nimport Header from \"./Header\";\n\n// utilities\nimport {\n hasBuildKickedOff,\n isBuildCancellable,\n} from \"../utilities/buildStatus\";\nimport logger from \"../utilities/logger\";\nimport useInput from \"../utilities/useInput\";\n\nconst MainLayout = ({\n appId,\n appName,\n appVersion,\n build,\n children,\n commandUsed,\n hasBuildEverFailed,\n}: {\n appId?: string;\n appName: string;\n appVersion?: string;\n build?: Build;\n children?: ReactNode;\n commandUsed?: string;\n hasBuildEverFailed?: boolean;\n}) => {\n logger.debug(\"MainLayout component: render\");\n const onInput = useInput();\n const { isRawModeSupported } = useStdin();\n\n const [\n { canCancelBuild, hasKickedOff, isCancellingBuild, wasCtrlCPressed },\n setState,\n ] = useState({\n canCancelBuild: null,\n hasKickedOff: false,\n isCancellingBuild: false,\n wasCtrlCPressed: false,\n });\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n hasKickedOff: hasBuildKickedOff(build),\n }));\n }, [build]);\n\n useEffect(() => {\n setState((previousState) => ({\n ...previousState,\n canCancelBuild:\n !isCi &&\n isRawModeSupported &&\n !isCancellingBuild &&\n isBuildCancellable(build),\n }));\n }, [build, isCancellingBuild, isRawModeSupported]);\n\n onInput(\n async (input, key) => {\n if (key.escape && canCancelBuild) {\n logger.debug(\"MainLayout component: esc pressed, cancelling build\");\n\n setState((previousState) => ({\n ...previousState,\n isCancellingBuild: true,\n }));\n }\n },\n {},\n {\n onCtrlCPressed: () => {\n setState((previousState) => ({\n ...previousState,\n wasCtrlCPressed: true,\n }));\n },\n }\n );\n\n return (\n <>\n <Header build={build} name={appName} version={appVersion} />\n\n {isCancellingBuild ? (\n <Box flexDirection=\"column\" marginBottom={1}>\n <CancelBuild appId={appId} commandUsed={commandUsed} id={build.id} />\n </Box>\n ) : (\n children\n )}\n\n <Footer\n hasBuildEverFailed={hasBuildEverFailed}\n shouldShowCancelBuildInstructions={canCancelBuild && !wasCtrlCPressed}\n uiUrl={build ? build.url : null}\n />\n\n {wasCtrlCPressed && hasKickedOff ? (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"gray\">\n The build will continue in the background. To view it, run:\n </Text>\n </Box>\n <Box>\n <Text bold color=\"gray\">\n todesktop builds {build.id}\n </Text>\n </Box>\n </>\n ) : null}\n </>\n );\n};\n\nexport default MainLayout;\n", "// libs\nimport { Text } from \"ink\";\nimport { ReactNode, useEffect, useState } from \"react\";\n\n// components\nimport ErrorDisplay from \"./ErrorDisplay\";\n\n// utils\nimport getCallableFirebaseFunction from \"../utilities/getCallableFirebaseFunction\";\nimport logForCI from \"../utilities/logForCI\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\n\nconst cancelBuild = getCallableFirebaseFunction(\"cancelBuild\");\n\nconst CancelBuild = ({\n appId,\n children: postCancelContents,\n commandUsed,\n id,\n}: {\n appId: string;\n children?: ReactNode;\n commandUsed: string;\n id: string;\n}) => {\n logger.debug({ appId, buildId: id }, \"CancelBuild component: render\");\n\n const exit = useExit();\n const [\n { arbitraryMessageComponent, error, hasCompleted, hasStarted },\n setState,\n ] = useState({\n arbitraryMessageComponent: null,\n error: null,\n hasCompleted: false,\n hasStarted: false,\n });\n\n useEffect(() => {\n if (hasCompleted || hasStarted) {\n return;\n }\n\n setState((previousState) => ({ ...previousState, hasStarted: true }));\n logForCI(\"Cancelling build...\");\n cancelBuild({ appId, buildId: id })\n .then((result) => {\n logger.debug(\n { appId, buildId: id, result },\n \"CancelBuild component: cancellation request complete\"\n );\n setState((previousState) => ({ ...previousState, hasCompleted: true }));\n })\n .catch((e) => {\n logger.debug(\n { appId, buildId: id, code: e.code },\n \"CancelBuild component: cancellation request failed\"\n );\n logger.error(e);\n const stateUpdates = {\n arbitraryMessageComponent: undefined,\n error: undefined,\n hasCompleted: true,\n };\n\n if (e.code === \"internal\") {\n stateUpdates.error = e;\n } else {\n stateUpdates.arbitraryMessageComponent = (\n <Text>\n <Text color=\"red\">Cannot cancel build ({id}).</Text> {e.message}\n </Text>\n );\n }\n\n setState((prevState) => ({\n ...prevState,\n ...stateUpdates,\n }));\n });\n }, [appId, id, hasStarted, hasCompleted]);\n\n // Exit when done, unless there are custom contents to display\n useEffect(() => {\n if (hasCompleted && !postCancelContents) {\n logger.debug(\n \"CancelBuild component: exiting now that build is cancelled\"\n );\n exit();\n }\n }, [postCancelContents, exit, hasCompleted]);\n\n if (error) {\n error.message = `Failed to cancel build (${id}). ${error.message}`;\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (arbitraryMessageComponent) {\n return arbitraryMessageComponent;\n }\n\n if (hasCompleted) {\n return postCancelContents ? (\n <>{postCancelContents}</>\n ) : (\n <Text>Build cancelled</Text>\n );\n }\n\n return <Text>Cancelling build ({id})...</Text>;\n};\n\nexport default CancelBuild;\n", "import firebase from \"firebase\";\nimport \"firebase/functions\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nconst env = getEnvironmentVariables();\n\nif (env.TODESKTOP_CLI_ENV === \"development\") {\n const firebaseUrl = new URL(env.TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE);\n firebase.functions().useFunctionsEmulator(firebaseUrl.origin);\n}\n\nexport default (functionName) =>\n firebase.functions().httpsCallable(functionName);\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport PropTypes from \"prop-types\";\n\nconst Footer = ({\n hasBuildEverFailed,\n shouldShowCancelBuildInstructions,\n uiUrl,\n}) => {\n if (!uiUrl) {\n return null;\n }\n\n let buildFailedMessage;\n if (hasBuildEverFailed) {\n buildFailedMessage = <Text color=\"red\">An error has occurred. </Text>;\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\">\n <Text bold>{buildFailedMessage}See web UI for more information: </Text>\n <Text>\n <Link fallback={false} url={uiUrl}>\n {uiUrl}\n </Link>\n </Text>\n </Box>\n {shouldShowCancelBuildInstructions ? (\n <Text color=\"gray\">\n <Text bold>[esc]:</Text> cancel build\n </Text>\n ) : null}\n </Box>\n );\n};\n\nFooter.propTypes = {\n hasBuildEverFailed: PropTypes.bool,\n shouldShowCancelBuildInstructions: PropTypes.bool,\n uiUrl: PropTypes.string,\n};\n\nexport default Footer;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\nconst getText = (build, name, version) => {\n const suffix = name + (version ? ` v${version}` : \"\");\n\n if (build && [\"cancelled\", \"succeeded\", \"failed\"].includes(build.status)) {\n if (build.status === \"succeeded\") {\n return <Text>\u2705 {suffix}</Text>;\n } else if (build.status === \"failed\") {\n return <Text>\u274C {suffix}</Text>;\n } else if (build.status === \"cancelled\") {\n return (\n <Text>\n <Text bold color=\"gray\">\n X\n </Text>{\" \"}\n {suffix}\n </Text>\n );\n }\n } else {\n return <Text>{suffix}</Text>;\n }\n};\n\nconst Header = ({ build, name, version }) => (\n <Box marginBottom={1}>{getText(build, name, version)}</Box>\n);\n\nHeader.propTypes = {\n build: PropTypes.object,\n name: PropTypes.string.isRequired,\n version: PropTypes.string,\n};\n\nexport default Header;\n", "import isCi from \"is-ci\";\nimport { useInput, useStdin } from \"ink\";\nimport useExit from \"./useExit\";\n\nlet hasSubscribed = false;\nconst ctrlCSubscriptions = [];\n\nconst onStdin = (data: Buffer, exit: () => void) => {\n let input = String(data);\n let wasCtrlPressed = false;\n if (input <= \"\\u001A\" && input !== \"\\r\") {\n input = String.fromCharCode(input.charCodeAt(0) + \"a\".charCodeAt(0) - 1);\n wasCtrlPressed = true;\n }\n if (wasCtrlPressed && input === \"c\") {\n ctrlCSubscriptions.forEach((subscription) => subscription());\n setTimeout(exit, 10);\n }\n};\n\n/*\n See https://github.com/vadimdemedes/pastel/issues/38\n*/\nexport default () => {\n const exit = useExit();\n const { stdin, isRawModeSupported } = useStdin();\n\n if (isCi || !isRawModeSupported) {\n return () => () => {};\n }\n\n return (\n callback: Handler,\n useInputOptions: Options = {},\n { onCtrlCPressed = null } = {}\n ) => {\n const onStdinData = (data: Buffer) => onStdin(data, exit);\n\n if (onCtrlCPressed) {\n ctrlCSubscriptions.push(onCtrlCPressed);\n }\n\n if (!hasSubscribed) {\n hasSubscribed = true;\n\n // This is based on the Ink (useInput) source\n stdin.on(\"data\", onStdinData);\n }\n\n const cleanUpInputHook = useInput(callback, useInputOptions) as any;\n\n return () => {\n if (hasSubscribed) {\n stdin.off(\"data\", onStdinData);\n }\n cleanUpInputHook?.();\n };\n };\n};\n\ntype Handler = Parameters<typeof useInput>[0];\ntype Options = Parameters<typeof useInput>[1];\n", "import { Box, Text } from \"ink\";\nimport ProgressBar from \"./ProgressBar\";\nimport PropTypes from \"prop-types\";\n\nconst Preparation = ({ progressPercentage, stageLabel, uploadedSize }) => {\n return (\n <Box marginBottom={1}>\n <Text>{stageLabel}: </Text>\n <Box flexDirection={\"column\"}>\n <ProgressBar left={11} percent={progressPercentage} />\n {uploadedSize ? <Text>{uploadedSize}</Text> : undefined}\n </Box>\n </Box>\n );\n};\n\nPreparation.propTypes = {\n progressPercentage: PropTypes.number.isRequired,\n stageLabel: PropTypes.string.isRequired,\n uploadedSize: PropTypes.string,\n};\n\nexport default Preparation;\n", "import PropTypes from \"prop-types\";\nimport Gradient from \"ink-gradient\";\nimport Bar from \"../../../libs/ink-progress-bar\";\n\nconst ProgressBar = ({ left, right, percent }) => (\n <Gradient colors={[\"gray\", \"white\"]}>\n <Bar left={left} right={right} percent={percent} />\n </Gradient>\n);\n\nProgressBar.propTypes = {\n left: PropTypes.number,\n right: PropTypes.number,\n // 0 -> 1\n percent: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n", "/**\n * Ported from https://github.com/brigand/ink-progress-bar/blob/master/src/index.js\n * `ink-progress-bar` doesn't list react or ink as a direct dependency which messes up\n * installation for users of yarn v2+.\n */\nimport { Text } from \"ink\";\n\nconst Bar = ({\n percent = 1,\n columns = 0,\n left = 0,\n right = 0,\n character = \"\u2588\",\n rightPad = false,\n ...rest\n}) => {\n const getString = () => {\n const screen = columns || process.stdout.columns || 80;\n const space = screen - right - left;\n const max = Math.min(Math.floor(space * percent), space);\n const chars = character.repeat(max);\n\n if (!rightPad) {\n return chars;\n }\n\n return chars + \" \".repeat(space - max);\n };\n\n return <Text {...rest}>{getString()}</Text>;\n};\n\nexport default Bar;\n", "// libs\n\nimport axios from \"axios\";\nimport prettyBytes from \"pretty-bytes\";\n\n// utils\nimport { currentUser } from \"../../../utilities/firestore\";\nimport logForCI from \"../../../utilities/logForCI\";\nimport postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\nimport getProjectConfig from \"../../../utilities/projectConfig/getProjectConfig\";\nimport shouldExitOnBuildFailure from \"../../../utilities/shouldExitOnBuildFailure\";\nimport getAppPkgJson from \"./getPackageJson\";\nimport getVersionControlInfo from \"./getVersionControlInfo\";\nimport spyBuild from \"./spyBuild\";\nimport { BuildState } from \"./types\";\nimport uploadApplicationSource from \"./uploadApplicationSource\";\n\nexport default async function runBuild({\n configPath,\n exitAfterUploading,\n shouldCodeSign = true,\n onBuildFinishedWebhook,\n updateState,\n}: {\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign?: boolean;\n updateState: (state: Partial<BuildState>) => void;\n}) {\n logForCI(\"Getting application information...\");\n\n const primaryUserId = currentUser()?.uid;\n\n // This will throw if validation fails or project root can not be found:\n const { config, unprocessedConfig } = getProjectConfig(configPath);\n const appId = config.id;\n const appPkgJson = getAppPkgJson({ config });\n\n const buildObserver = spyBuild();\n buildObserver.onUpdate(({ build }) => updateState({ build }));\n\n updateState({\n appId,\n appPkg: appPkgJson,\n onUnmount: () => buildObserver.unsubscribe(),\n preparationStageLabel: \"Preparing\",\n preparationProgress: 0.02,\n state: \"preparing\",\n });\n logForCI(\"Preparing...\");\n\n // Create build in Firebase\n let buildId: string;\n try {\n const prepareResult = await postToFirebaseFunction(\"prepareNewBuild\", {\n appPkgName: appPkgJson.name,\n appPkgProductName: appPkgJson.productName,\n appVersion: appPkgJson.version,\n id: config.id,\n onBuildFinishedWebhook,\n projectConfig: unprocessedConfig,\n shouldCodeSign: shouldCodeSign !== false,\n shouldRelease: false,\n userId: primaryUserId,\n versionControlInfo: await getVersionControlInfo(config.appPath),\n idToken: await currentUser()?.getIdToken(),\n });\n buildId = prepareResult.appData.meta.currentBuildProgress.id;\n\n buildObserver.subscribe({ appId, buildId, userId: prepareResult.userId });\n await buildObserver.whenFirstUpdate();\n } catch (e) {\n throw addErrorMessage(e, \"Failed while preparing new build\");\n }\n\n updateState({\n preparationProgress: 0.05,\n preparationStageLabel: \"Uploading\",\n });\n logForCI(\"Uploading...\");\n\n let sourceArchiveDetails: unknown;\n try {\n sourceArchiveDetails = await uploadApplicationSource({\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress(progress: number, uploadedSize?: number) {\n // Upload is treated as 95% of preparation\n const preparationState = {\n preparationProgress: 0.05 + (progress / 100) * 0.95,\n preparationUploadedSize: \"\",\n };\n\n if (uploadedSize) {\n preparationState.preparationUploadedSize = prettyBytes(uploadedSize);\n }\n\n updateState(preparationState);\n },\n });\n } catch (e) {\n throw addErrorMessage(e, \"Failed while uploading application source\");\n }\n\n updateState({ state: \"building\" });\n logForCI(\"Kicking off build...\");\n\n try {\n await postToFirebaseFunction(\"kickOffBuild\", {\n appId,\n appPkgName: appPkgJson.name,\n appVersion: appPkgJson.version,\n buildId,\n userId: primaryUserId,\n sourceArchiveDetails,\n nodeVersion: config.nodeVersion,\n npmVersion: config.npmVersion,\n pnpmVersion: config.pnpmVersion,\n appBuilderLibVersion: config.appBuilderLibVersion,\n idToken: await currentUser()?.getIdToken(),\n });\n } catch (e) {\n throw addErrorMessage(e, \"Failed while kicking off build\");\n }\n\n if (exitAfterUploading) {\n updateState({ state: \"exit-after-uploading\" });\n return;\n }\n\n const build = await buildObserver.whenSettled();\n if (build?.status === \"failed\" && shouldExitOnBuildFailure(build)) {\n updateState({ state: \"build-failed\" });\n }\n}\n\nfunction addErrorMessage(e: unknown, message: string): Error {\n let originalMessage = \"\";\n if (axios.isAxiosError(e) && e.response?.data?.message) {\n originalMessage = e.response.data.message;\n } else if (e instanceof Error) {\n originalMessage = e.message;\n } else if (e && typeof e === \"object\") {\n originalMessage = JSON.stringify(e);\n } else {\n originalMessage = String(e);\n }\n\n const newError = new Error(`${message}; ${originalMessage}`);\n if (e instanceof Error) {\n newError.stack = e.stack;\n }\n\n return newError;\n}\n", "import axios from \"axios\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\nimport logger from \"./logger\";\n\nconst { TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE } = getEnvironmentVariables();\n\nexport default async function (functionName, body = {}, config = {}) {\n logger.debug({ functionName, body, config }, \"postToFirebaseFunction\");\n\n try {\n const response = await axios.post(\n `${TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE}${functionName}`,\n body,\n config\n );\n\n logger.debug(\n { responseData: response.data },\n \"postToFirebaseFunction: success\"\n );\n return response.data;\n } catch (e) {\n logger.error({ error: e }, \"postToFirebaseFunction: error\");\n throw e;\n }\n}\n", "import { dirname, resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport findUp from \"find-up\";\nimport { ProjectConfig } from \"../../types\";\nimport loadConfig from \"./loadConfig\";\nimport resolveConfigPaths from \"./resolveConfigPaths\";\nimport validateConfig from \"./validateConfig\";\nimport logger from \"../logger\";\nimport computeFullProjectConfig from \"./computeFullProjectConfig\";\n\nexport default function getProjectConfig(configPath?: string): {\n config: ProjectConfig;\n unprocessedConfig: ProjectConfig;\n projectRoot: string;\n} {\n // If no config path is provided, we'll try to find one\n if (!configPath) {\n logger.debug(\"No config path provided, searching for one\");\n configPath = findUp.sync(\"todesktop.json\");\n if (!configPath) {\n throw new Error(\n \"Can not find todesktop.json in this folder or any parent folders\"\n );\n }\n } else {\n configPath = resolve(process.cwd(), configPath);\n\n // If the config path is provided\n if (!existsSync(configPath)) {\n logger.error(\"Provided config path does not exist\");\n throw new Error(`Config file not found at ${configPath}`);\n }\n }\n\n const projectRoot = dirname(configPath);\n\n // This will throw if it's not valid JSON\n const partialConfig = loadConfig(configPath);\n\n // compute the full project config\n const config = computeFullProjectConfig(partialConfig, projectRoot);\n\n // This will throw if invalid\n validateConfig({ config, projectRoot });\n\n const result = resolveConfigPaths({ config, projectRoot });\n\n return { config: result, unprocessedConfig: config, projectRoot };\n}\n", "// This is its own file just so we can mock it more easily\nimport { PartialProjectConfig } from \"../../types\";\n\nexport default function loadConfig(configPath: string): PartialProjectConfig {\n return require(configPath);\n}\n", "import * as path from \"path\";\nimport { ProjectConfig } from \"../../types\";\n\nexport default function resolveConfigPaths({\n config,\n projectRoot,\n}: {\n config: ProjectConfig;\n projectRoot: string;\n}): ProjectConfig {\n const appRoot = config.appPath\n ? path.isAbsolute(config.appPath)\n ? config.appPath\n : path.join(projectRoot, config.appPath)\n : projectRoot;\n\n const transformIfExists = (value, transformer) =>\n value ? transformer(value) : undefined;\n const resolvePath = (filePath) =>\n path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n\n const result = {\n ...config,\n appPath: appRoot,\n icon: resolvePath(config.icon),\n };\n\n if (config.extraContentFiles) {\n result.extraContentFiles = transformIfExists(\n config.extraContentFiles,\n (extraContentFiles) =>\n extraContentFiles.map((extraContentFile) => ({\n ...extraContentFile,\n from: resolvePath(extraContentFile.from),\n }))\n );\n }\n\n if (config.extraResources) {\n result.extraResources = transformIfExists(\n config.extraResources,\n (extraResources) =>\n extraResources.map((extraResource) => ({\n ...extraResource,\n from: resolvePath(extraResource.from),\n }))\n );\n }\n\n if (config.linux) {\n result.linux = { ...config.linux };\n\n if (config.linux.icon) {\n result.linux.icon = resolvePath(config.linux.icon);\n }\n }\n\n if (config.mac) {\n result.mac = { ...config.mac };\n\n if (config.mac.entitlements) {\n result.mac.entitlements = resolvePath(config.mac.entitlements);\n }\n\n if (config.mac.entitlementsInherit) {\n result.mac.entitlementsInherit = resolvePath(\n config.mac.entitlementsInherit\n );\n }\n\n if (config.mac.requirements) {\n result.mac.requirements = resolvePath(config.mac.requirements);\n }\n\n if (config.mac.icon) {\n result.mac.icon = resolvePath(config.mac.icon);\n }\n }\n\n if (config.mas) {\n result.mas = { ...config.mas };\n\n if (config.mas.entitlements) {\n result.mas.entitlements = resolvePath(config.mas.entitlements);\n }\n\n if (config.mas.entitlementsInherit) {\n result.mas.entitlementsInherit = resolvePath(\n config.mas.entitlementsInherit\n );\n }\n\n if (config.mas.provisioningProfile) {\n result.mas.provisioningProfile = resolvePath(\n config.mas.provisioningProfile\n );\n }\n }\n\n if (config.dmg) {\n if (config.dmg.background) {\n result.dmg.background = resolvePath(config.dmg.background);\n }\n }\n\n if (config.windows) {\n result.windows = { ...config.windows };\n\n if (config.windows.icon) {\n result.windows.icon = resolvePath(config.windows.icon);\n }\n }\n\n return result;\n}\n", "import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport betterAjvErrors from \"better-ajv-errors\";\nimport { ProjectConfig } from \"../../types\";\nimport addCustomKeywords from \"./addCustomKeywords\";\nimport getFullSchema from \"./schema/full\";\n\nexport default function validateConfig({\n config,\n projectRoot,\n}: {\n config: ProjectConfig;\n projectRoot: string;\n}) {\n const context = { projectRoot };\n const schema = getFullSchema(context);\n\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n addCustomKeywords(ajv, context);\n const validate = ajv.compile(schema);\n\n if (!validate(config)) {\n const output = betterAjvErrors(schema, config, validate.errors, {\n indent: 2,\n });\n\n throw new Error(\n `todesktop.json invalid. \\nLearn more here: https://www.npmjs.com/package/@todesktop/cli#project-configuration-todesktopjson \\n\\n${output}`\n );\n }\n\n if (config.productName) {\n throw new Error(\n `todesktop.json invalid.\n\nThe \"productName\" property is no longer supported in todesktop.json. Please remove it and add it to your app's package.json instead.\n\nWe made this change because Electron also uses the \"productName\" if it exists in your app's package.json. If you do not add it to your package.json, your app name will default to the value of the \"name\" property in your package.json.`\n );\n }\n}\n", "/*\n See https://ajv.js.org/keywords.html\n*/\nimport Ajv, {\n FuncKeywordDefinition,\n SchemaValidateFunction,\n ValidationError,\n} from \"ajv\";\nimport emailRegex from \"email-regex\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport parseAuthor from \"parse-author\";\nimport * as semver from \"semver\";\nimport validatePackageJSON from \"./validatePackageJSON\";\nimport semverValidRange from \"semver/ranges/valid\";\n\nexport default (ajv: Ajv, context) => {\n const addKeyword = (def: FuncKeywordDefinition) => {\n const validate: SchemaValidateFunction = (schema, data) => {\n try {\n return (def.validate as SchemaValidateFunction)(schema, data);\n } catch (e) {\n if (e instanceof ValidationError) {\n validate.errors = e.errors;\n return false;\n }\n\n throw e;\n }\n };\n\n ajv.addKeyword({ ...def, validate });\n };\n\n addKeyword({\n keyword: \"validSemver\",\n type: \"string\",\n validate: (schema, data) => {\n if (!semverValidRange(data)) {\n throw new ValidationError([\n {\n keyword: \"validSemver\",\n message: `${data} must be a valid semantic version or version range`,\n },\n ]);\n }\n\n return true;\n },\n });\n\n // validate that dependencies object doesn't contain packageNames in the blacklist\n addKeyword({\n keyword: \"excludedDependencies\",\n validate: (schema, data) => {\n const matchingPackages = schema.blacklist.filter(\n (packageName) => data[packageName]\n );\n\n if (matchingPackages.length) {\n throw new ValidationError([\n {\n keyword: \"Dependency\",\n message: `${matchingPackages.join(\", \")} should not be in ${\n schema.dependencyKey\n }`,\n instancePath: `/${schema.dependencyKey}`,\n },\n ]);\n }\n\n return true;\n },\n });\n\n // TODO: Remove if isn't used\n addKeyword({\n keyword: \"email\",\n type: \"string\",\n validate: (schema, data) => {\n if (!emailRegex({ exact: true }).test(data)) {\n throw new ValidationError([\n {\n keyword: \"email\",\n message: \"invalid\",\n },\n ]);\n }\n return true;\n },\n });\n\n addKeyword({\n keyword: \"file\",\n type: \"string\",\n validate: (schema, data) => {\n const mustBeDirectory =\n schema.mustBeDirectory || schema.mustBeElectronApp;\n\n // Value is empty\n if (!data.trim().length) {\n if (schema.isOptional) {\n return true;\n }\n\n throw new ValidationError([\n {\n keyword: schema.mustBeDirectory ? \"Directory\" : \"File\",\n message: \"is empty\",\n },\n ]);\n }\n\n const filePath = path.isAbsolute(data)\n ? data\n : path.join(schema.from, data);\n\n // Isn't in project\n if (path.relative(schema.from, filePath).startsWith(\"..\")) {\n throw new ValidationError([\n {\n keyword: mustBeDirectory ? \"Directory\" : \"File\",\n message: `is not in project (${filePath})`,\n },\n ]);\n }\n\n // Extension isn't allowed\n if (\n schema.extensions &&\n !schema.extensions.includes(path.extname(filePath).substr(1))\n ) {\n throw new ValidationError([\n {\n keyword: \"File extension\",\n message: `invalid. ${path.extname(data)} Must be${\n schema.extensions > 1 ? \"one of the following:\" : \"\"\n } \"${schema.extensions.join('\", \"')}\"`,\n },\n ]);\n }\n\n // Doesn't exist\n if (!fs.existsSync(filePath)) {\n throw new ValidationError([\n {\n keyword: mustBeDirectory ? \"Directory\" : \"File\",\n message: `does not exist (${filePath})`,\n },\n ]);\n }\n\n const stats = fs.statSync(filePath);\n\n if (mustBeDirectory && stats.isFile()) {\n throw new ValidationError([\n {\n keyword: \"Directory\",\n message: `must be a directory, not a file (${filePath})`,\n },\n ]);\n } else if (schema.mustBeFile && stats.isDirectory()) {\n throw new ValidationError([\n {\n keyword: \"File\",\n message: `must be a file, not a directory (${filePath})`,\n },\n ]);\n }\n\n if (schema.mustBeElectronApp) {\n const appRoot = path.resolve(filePath);\n const pkgPath = path.join(appRoot, \"package.json\");\n\n if (!fs.existsSync(pkgPath)) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. There is no package.json at ${pkgPath}`,\n },\n ]);\n }\n\n let pkg;\n try {\n pkg = require(pkgPath);\n } catch (e) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. Invalid JSON in package.json (${pkgPath})`,\n },\n ]);\n }\n\n context.projectRoot = appRoot;\n // This throws and bubbles all the way up to the user\n validatePackageJSON(pkg, pkgPath, context);\n\n // Validate that either an index.js or valid \"main\" property exists\n const mainFilePath = pkg.main;\n if (mainFilePath) {\n const resolvedMainFilePath = path.join(appRoot, mainFilePath);\n if (!fs.existsSync(resolvedMainFilePath)) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message: `invalid. The \"main\" file specified in your package.json (${mainFilePath}) does not exist (${resolvedMainFilePath})`,\n },\n ]);\n }\n } else {\n if (!fs.existsSync(path.join(appRoot, \"index.js\"))) {\n throw new ValidationError([\n {\n keyword: \"App\",\n message:\n 'invalid. There is neither a \"main\" property in your package.json nor an index.js at the root of your app',\n },\n ]);\n }\n }\n }\n\n return true;\n },\n errors: true,\n });\n\n addKeyword({\n keyword: \"npmAuthor\",\n validate: (schema, data) => {\n const dataType = typeof data;\n if (dataType === \"undefined\") {\n return true;\n } else if (dataType === \"string\") {\n const parsedAuthor = parseAuthor(data);\n if (!parsedAuthor || !parsedAuthor.email) {\n throw new ValidationError([\n {\n keyword: \"author\",\n message:\n 'invalid. If you\\'re using a string, it must look something like \"Barney Rubble <b@rubble.com>\", see https://docs.npmjs.com/files/package.json#people-fields-author-contributors',\n },\n ]);\n }\n } else if (dataType === \"object\") {\n if (typeof data.name === \"undefined\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `invalid. \"name\" property is missing.`,\n },\n ]);\n } else {\n if (typeof data.name !== \"string\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.name invalid. It must be a string`,\n },\n ]);\n }\n\n if (typeof data.email === \"undefined\") {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `invalid. \"email\" property is missing.`,\n },\n ]);\n } else {\n if (typeof data.email === \"string\") {\n if (!emailRegex({ exact: true }).test(data.email)) {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.email invalid. It does not look like an email.`,\n },\n ]);\n }\n } else {\n throw new ValidationError([\n {\n keyword: \"author\",\n message: `.email invalid. It must be a string.`,\n },\n ]);\n }\n }\n }\n } else {\n // Neither object nor string\n throw new ValidationError([\n {\n keyword: \"author\",\n message:\n \"invalid. It must either be an object or string. See https://docs.npmjs.com/files/package.json#people-fields-author-contributors\",\n },\n ]);\n }\n\n return true;\n },\n errors: true,\n });\n\n addKeyword({\n keyword: \"semanticVersion\",\n type: \"string\",\n validate: (schema, data) => {\n const keyword =\n (schema.packageName ? `${schema.packageName} ` : \"\") + \"version\";\n\n if (!(semver.valid(data) || semver.validRange(data))) {\n throw new ValidationError([\n {\n keyword,\n message:\n \"invalid. It must be a semantic version (see https://semver.org/)\",\n },\n ]);\n }\n\n if (\n schema.mustBeExact &&\n (data.startsWith(\"~\") || data.startsWith(\"^\"))\n ) {\n throw new ValidationError([\n {\n keyword,\n message:\n \"invalid. It must be an exact version. Good: 9.0.0. Bad: ^9.0.0\",\n },\n ]);\n }\n return true;\n },\n });\n};\n", "import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport betterAjvErrors from \"better-ajv-errors\";\nimport addCustomKeywords from \"./addCustomKeywords\";\nimport getPackageJsonSchema from \"./schema/packageJSON\";\n\nexport default (pkg, pkgPath, context) => {\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n addCustomKeywords(ajv, context);\n const schema = getPackageJsonSchema(context);\n const validate = ajv.compile(schema);\n if (!validate(pkg)) {\n const output = betterAjvErrors(schema, pkg, validate.errors, {\n indent: 2,\n });\n\n const error = new Error(`package.json invalid (${pkgPath}); \\n${output}`);\n (error as any).isValidationError = true;\n // This throws and bubbles all the way up to the user\n throw error;\n }\n};\n", "export default (context) => {\n return {\n type: \"object\",\n required: [\n \"author\",\n \"dependencies\",\n \"devDependencies\",\n \"homepage\",\n \"name\",\n \"version\",\n ],\n properties: {\n author: {\n npmAuthor: {},\n },\n dependencies: {\n type: \"object\",\n required: [\"@todesktop/runtime\"],\n // custom keyword that checks package names aren't included in dependencies\n excludedDependencies: {\n dependencyKey: \"dependencies\",\n blacklist: [\"@todesktop/cli\"],\n },\n properties: {\n \"@todesktop/runtime\": {\n type: \"string\",\n },\n },\n },\n devDependencies: {\n type: \"object\",\n required: [\"electron\"],\n properties: {\n electron: {\n type: \"string\",\n semanticVersion: {\n packageName: \"electron\",\n mustBeExact: true,\n },\n },\n },\n },\n name: {\n type: \"string\",\n minLength: 1,\n },\n scripts: {\n type: \"object\",\n properties: {\n \"todesktop:beforeInstall\": {\n type: \"string\",\n file: {\n from: context.projectRoot,\n mustBeFile: true,\n },\n },\n \"todesktop:afterPack\": {\n type: \"string\",\n file: {\n from: context.projectRoot,\n mustBeFile: true,\n },\n },\n },\n },\n version: {\n type: \"string\",\n semanticVersion: {},\n },\n },\n };\n};\n", "const getItemOrArrayOfItemsSchema = (itemSchema) => {\n return {\n oneOf: [\n itemSchema,\n {\n type: \"array\",\n items: itemSchema,\n },\n ],\n };\n};\n\nexport default (context) => {\n const getIconSchema = (additionalAllowedExtensions = []) => {\n return {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"icns\", \"png\", ...additionalAllowedExtensions],\n mustBeFile: true,\n },\n minLength: 3,\n };\n };\n\n return {\n type: \"object\",\n required: [\"id\", \"icon\", \"schemaVersion\"],\n properties: {\n appBuilderLibVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n appId: { type: \"string\", minLength: 1 },\n appFiles: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n appProtocolScheme: {\n oneOf: [\n { type: \"string\", minLength: 1 },\n {\n type: \"array\",\n items: { type: \"string\", minLength: 1 },\n minItems: 1,\n },\n ],\n },\n appPath: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n isOptional: true,\n mustBeElectronApp: true,\n },\n },\n asar: {\n type: \"boolean\",\n default: true,\n },\n asarUnpack: {\n oneOf: [\n { type: \"boolean\" },\n {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n ],\n },\n buildVersion: { type: \"string\", minLength: 1 },\n copyright: { type: \"string\", minLength: 1 },\n electronMirror: {\n type: \"string\",\n format: \"uri\",\n },\n electronVersion: {\n type: \"string\",\n minLength: 1,\n },\n extraContentFiles: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"from\"],\n properties: {\n from: {\n type: \"string\",\n file: { from: context.projectRoot },\n },\n to: { type: \"string\" },\n },\n },\n },\n extraResources: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"from\"],\n properties: {\n from: {\n type: \"string\",\n file: { from: context.projectRoot },\n },\n to: { type: \"string\" },\n },\n },\n },\n fileAssociations: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"ext\"],\n properties: {\n ext: getItemOrArrayOfItemsSchema({\n type: \"string\",\n minLength: 1,\n }),\n description: {\n type: \"string\",\n minLength: 1,\n },\n name: {\n type: \"string\",\n minLength: 1,\n },\n mimeType: {\n type: \"string\",\n minLength: 1,\n },\n icon: {\n type: \"string\",\n minLength: 1,\n },\n role: {\n type: \"string\",\n minLength: 1,\n },\n isPackage: {\n type: \"boolean\",\n },\n rank: {\n type: \"string\",\n minLength: 1,\n },\n },\n },\n minItems: 1,\n },\n filesForDistribution: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n minItems: 1,\n },\n icon: getIconSchema(),\n linux: {\n type: \"object\",\n properties: {\n category: { type: \"string\", minLength: 1 },\n icon: getIconSchema(),\n noSandbox: { type: \"boolean\" },\n },\n },\n id: { type: \"string\", minLength: 1 },\n includeSubNodeModules: {\n type: \"boolean\",\n default: false,\n },\n mac: {\n type: \"object\",\n properties: {\n category: { type: \"string\", minLength: 1 },\n additionalBinariesToSign: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n entitlements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n entitlementsInherit: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n extendInfo: {\n type: \"object\",\n },\n icon: getIconSchema(),\n requirements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"txt\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n },\n },\n mas: {\n type: \"object\",\n properties: {\n entitlements: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n entitlementsInherit: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"plist\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n provisioningProfile: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"provisionprofile\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n type: {\n type: \"string\",\n enum: [\"development\", \"distribution\"],\n },\n x64ArchFiles: {\n type: \"string\",\n },\n },\n },\n dmg: {\n type: \"object\",\n properties: {\n background: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"tiff\"],\n mustBeFile: true,\n },\n minLength: 1,\n },\n artifactName: { type: \"string\", minLength: 1 },\n backgroundColor: { type: \"string\", minLength: 1 },\n iconSize: { type: \"number\" },\n iconTextSize: { type: \"number\" },\n title: { type: \"string\", minLength: 1 },\n contents: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n },\n },\n window: {\n type: \"object\",\n properties: {\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n },\n },\n },\n },\n nodeVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n npmVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n pnpmVersion: {\n type: \"string\",\n validSemver: {},\n minLength: 1,\n },\n packageManager: {\n type: \"string\",\n enum: [\"npm\", \"yarn\", \"pnpm\"],\n },\n rebuildLibrary: {\n type: \"string\",\n enum: [\"app-builder\", \"@electron/rebuild\"],\n },\n schemaVersion: { type: \"number\", minimum: 1, maximum: 1 },\n snap: {\n type: \"object\",\n properties: {\n after: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n appPartStage: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n assumes: getItemOrArrayOfItemsSchema({\n type: \"string\",\n minLength: 1,\n }),\n autoStart: {\n type: \"boolean\",\n },\n buildPackages: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n confinement: {\n type: \"string\",\n enum: [\"classic\", \"devmode\", \"strict\"],\n },\n environment: {\n type: \"object\",\n },\n grade: {\n type: \"string\",\n enum: [\"devel\", \"stable\"],\n },\n layout: {\n type: \"object\",\n },\n plugs: {\n type: \"array\",\n items: {\n anyOf: [\n {\n type: \"string\",\n minLength: 1,\n },\n {\n type: \"object\",\n },\n ],\n },\n },\n stagePackages: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n summary: {\n type: \"string\",\n maxLength: 78,\n },\n useTemplateApp: {\n type: \"boolean\",\n },\n },\n },\n uploadSizeLimit: {\n type: \"number\",\n },\n windows: {\n type: \"object\",\n properties: {\n icon: getIconSchema([\"ico\"]),\n nsisCustomBinary: {\n type: \"object\",\n properties: {\n checksum: { type: \"string\" },\n debugLogging: { type: \"boolean\" },\n url: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n nsisInclude: {\n type: \"string\",\n file: {\n from: context.projectRoot,\n extensions: [\"nsh\"],\n mustBeFile: true,\n },\n },\n publisherName: {\n type: \"array\",\n items: {\n type: \"string\",\n minLength: 1,\n },\n },\n },\n },\n },\n };\n};\n", "import { PartialProjectConfig, ProjectConfig } from \"../../types\";\nimport logger from \"../logger\";\nimport loadConfig from \"./loadConfig\";\nimport { resolve } from \"path\";\nimport merge from \"lodash.merge\";\n\nexport default function computeFullProjectConfig(\n partialConfig: PartialProjectConfig,\n projectRoot: string\n): ProjectConfig {\n if (!partialConfig.extends) {\n logger.debug(\"No extends field, returning partial config\");\n return partialConfig as ProjectConfig;\n } else {\n logger.debug(\"Extends field found, resolving\");\n const parentConfigPath = resolve(projectRoot, partialConfig.extends);\n const parentConfig = loadConfig(parentConfigPath);\n\n parentConfig.appPath = parentConfig.appPath || \".\";\n\n const parentFullConfig = computeFullProjectConfig(\n parentConfig,\n projectRoot\n );\n\n const result = merge({}, parentFullConfig, partialConfig);\n\n delete result.extends;\n return result;\n }\n}\n", "// X build has failed, should we exit? I.e. is it settled?\nexport default (build) => {\n const hasBuildSettled = [\"linux\", \"mac\", \"windows\"].every(\n (platform) =>\n build[platform].shouldSkip ||\n \"succeeded\" === build[platform].status ||\n (\"failed\" === build[platform].status &&\n build[platform].numberOfAttemptedBuilds === 2)\n );\n\n const hasSettledWithError = [\"linux\", \"mac\", \"windows\"].some(\n (platform) => \"failed\" === build[platform].status\n );\n\n return hasBuildSettled && hasSettledWithError;\n};\n", "import merge from \"lodash.merge\";\nimport path from \"path\";\nimport readJson from \"../../../utilities/readJson\";\n\nfunction deleteNullDeps(dep) {\n Object.keys(dep).forEach((key) => {\n if (dep[key] === null) {\n delete dep[key];\n }\n });\n return dep;\n}\n\n/**\n * Remove any dependencies or devDependencies that have a version of null.\n * This is useful for removing dependencies that are not to be used when building\n * in ToDesktop. For example this will remove the `electron-builder` dev dependency\n * from the package.json file when building in ToDesktop:\n * {\n * \"devDependencies\": {\n * \"electron-builder\": null\n * }\n * }\n */\nfunction removeNullDependencies(pkgJson) {\n const { dependencies, devDependencies } = pkgJson;\n\n if (dependencies) {\n pkgJson.dependencies = deleteNullDeps(dependencies);\n }\n\n if (devDependencies) {\n pkgJson.devDependencies = deleteNullDeps(devDependencies);\n }\n\n return pkgJson;\n}\n\nfunction getAppPkgJson({ config }) {\n const packageJsonFromConfig = config.packageJson || {};\n const extendsFrom = packageJsonFromConfig.extends || \"package.json\";\n const packageJsonFromFile = readJson(path.join(config.appPath, extendsFrom));\n\n return removeNullDependencies(\n merge({}, packageJsonFromFile, packageJsonFromConfig)\n );\n}\n\nexport default getAppPkgJson;\n", "import * as gitRevSync from \"git-rev-sync\";\n\nexport default async (directory) => {\n let result = {};\n\n try {\n const gitCommitHash = gitRevSync.long(directory);\n\n if (gitCommitHash) {\n result = {\n branchName: gitRevSync.branch(directory),\n commitDate: gitRevSync.date().toISOString(),\n commitId: gitCommitHash,\n commitMessage: gitRevSync.message(),\n hasUncommittedChanges: gitRevSync.isDirty(),\n repositoryRemoteUrl: gitRevSync.remoteUrl(),\n versionControlSystemName: \"git\",\n };\n }\n } catch (e) {\n // Ignore\n }\n\n return result;\n};\n", "import { Build } from \"@todesktop/shared\";\nimport EventEmitter from \"events\";\nimport type { DocSnapshot } from \"../../../types\";\nimport firestore from \"../../../utilities/firestore\";\n\nexport default function spyBuild() {\n const emitter = new EventEmitter();\n\n let unsubscribeSnapshot: (() => void) | undefined;\n let latestBuildDoc: Build | undefined;\n\n function when(predicate: (build: Build) => boolean) {\n if (latestBuildDoc && predicate(latestBuildDoc)) {\n return Promise.resolve(latestBuildDoc);\n }\n\n return new Promise<Build>((resolve, reject) => {\n emitter\n .on(\"update\", ({ build }) => {\n if (predicate(build)) {\n resolve(build);\n }\n })\n .once(\"error\", (e) => reject(e));\n });\n }\n\n return {\n onUpdate(\n callback: (data: {\n build: Build | undefined;\n snapshot: DocSnapshot<Build>;\n }) => void\n ) {\n emitter.on(\"update\", callback);\n },\n\n subscribe({\n appId,\n buildId,\n userId,\n }: {\n appId: string;\n buildId: string;\n userId: string;\n }) {\n const buildPath = `users/${userId}/applications/${appId}/builds/${buildId}`;\n unsubscribeSnapshot = firestore.doc(buildPath).onSnapshot(\n (snapshot) => {\n latestBuildDoc = snapshot.exists\n ? (snapshot.data() as Build)\n : undefined;\n emitter.emit(\"update\", {\n build: latestBuildDoc,\n snapshot: snapshot,\n });\n },\n (err) => {\n emitter.emit(\"error\", err);\n }\n );\n },\n\n unsubscribe() {\n unsubscribeSnapshot?.();\n },\n\n async whenFirstUpdate() {\n if (latestBuildDoc) {\n return Promise.resolve(latestBuildDoc);\n }\n\n return new Promise<Build>((resolve, reject) => {\n emitter\n .once(\"update\", (data) => resolve(data))\n .once(\"error\", (e) => reject(e));\n });\n },\n\n async whenSettled() {\n return when((build) => buildHasSettled(build));\n },\n };\n}\n\nfunction buildHasSettled(build: Build) {\n return ([\"linux\", \"mac\", \"windows\"] as const).every(\n (platform) =>\n build[platform]?.shouldSkip ||\n \"succeeded\" === build[platform]?.status ||\n \"cancelled\" === build[platform]?.status ||\n (\"failed\" === build[platform]?.status &&\n build[platform]?.numberOfAttemptedBuilds === 2)\n );\n}\n", "import fastGlob from \"fast-glob\";\nimport * as fs from \"fs\";\nimport { IPackageJson } from \"package-json-type\";\nimport * as path from \"path\";\nimport type { ProjectConfig } from \"../../../types\";\nimport generateS3Key from \"./generateS3Key\";\nimport logger from \"../../../utilities/logger\";\nimport uploadToS3 from \"./uploadToS3\";\nimport zip from \"./zip\";\n\nconst getAppFiles = async (globsInput, appPath, appPkgJson) => {\n const globs = [\"!node_modules\", \"!**/node_modules\", \"!.git\", \"!**/.git\"];\n\n if (globsInput && globsInput.length) {\n globs.push(\n ...globsInput,\n path.join(appPath, \"package.json\"),\n path.join(appPath, \"package-lock.json\"),\n path.join(appPath, \"yarn.lock\"),\n path.join(appPath, \"pnpm-lock.yaml\"),\n path.join(appPath, \"shrinkwrap.yaml\")\n );\n } else {\n globs.push(\"**\");\n }\n\n // automatically add hooks to `appFiles` if they exist\n for (const hookName of [\"todesktop:beforeInstall\", \"todesktop:afterPack\"]) {\n if (appPkgJson.scripts && appPkgJson.scripts[hookName]) {\n globs.push(path.join(appPath, appPkgJson.scripts[hookName]));\n }\n }\n\n const normalizedGlobs = globs\n .map((glob) => {\n // Make relative if it's not\n const globToUse = path.isAbsolute(glob)\n ? path.relative(appPath, glob)\n : glob;\n\n return (\n globToUse\n // Globs must always have forward slashes\n .replace(/\\\\/g, \"/\")\n // Remove trailing slash\n .replace(/\\/+$/, \"\")\n );\n })\n .filter((glob) => !glob.startsWith(\"..\") && !glob.startsWith(\"!..\"));\n\n let absolutePaths = await fastGlob(normalizedGlobs, {\n absolute: true,\n cwd: appPath,\n dot: true,\n followSymbolicLinks: false,\n onlyDirectories: false,\n onlyFiles: true,\n globstar: true,\n unique: true,\n });\n\n if (process.platform === \"win32\") {\n absolutePaths = absolutePaths.map((absolutePath) =>\n absolutePath.replace(/\\//g, path.sep)\n );\n }\n\n if (!absolutePaths || !absolutePaths.length) {\n throw new Error(\"No files found to upload\");\n } else if (\n !absolutePaths.filter((absolutePath) => absolutePath.endsWith(\".js\")).length\n ) {\n throw new Error(\n `No .js files found to upload (${absolutePaths[0]}). There's likely an issue with the appFiles option. Learn more at https://www.npmjs.com/package/@todesktop/cli#appfiles----optional-array-of-glob-patterns. If this is not the case, please contact us.`\n );\n } else {\n let mainFilePath = appPath;\n if (appPkgJson.main) {\n mainFilePath = path.join(mainFilePath, appPkgJson.main);\n }\n\n if (fs.statSync(mainFilePath).isDirectory()) {\n mainFilePath = path.join(mainFilePath, \"index.js\");\n }\n\n // Make sure the \"main\" file is included\n if (!absolutePaths.includes(mainFilePath)) {\n throw new Error(\n `The \"main\" file specified in your package.json (${\n appPkgJson.main\n ? path.relative(appPath, mainFilePath)\n : \"defaults to index.js\"\n }) is not set to be uploaded to our servers. This is likely due to how you have configured the \\`appFiles\\` option. Learn more at https://www.npmjs.com/package/@todesktop/cli#appfiles----optional-array-of-glob-patterns. If this is not the case, please contact us.`\n );\n }\n }\n\n return absolutePaths.map((absolutePath) => {\n return {\n from: absolutePath,\n to: path.join(\"app\", path.relative(appPath, absolutePath)),\n };\n });\n};\n\nexport default async function uploadApplicationSource({\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress,\n}: {\n appId: string;\n appPkgJson: IPackageJson;\n buildId: string;\n config: ProjectConfig;\n onProgress: (progress: number, uploadedSize?: number) => void;\n}) {\n logger.debug(\n {\n appId,\n appPkgJson,\n buildId,\n config,\n onProgress,\n },\n \"uploadApplicationSource\"\n );\n // eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars\n let totalBytes = 0;\n\n const files = [\n /*\n App files (stored in app/ in the ZIP)\n */\n ...(await getAppFiles(config.appFiles, config.appPath, appPkgJson)),\n\n /*\n Optional extra content files (stored in extraContentFiles/ in the ZIP). Their\n paths within is the their relative path from the project root so\n there will be no issues with clashing filenames. We also don't\n also any file paths in our todesktop.json that are outside of the\n project directory\n */\n ...(config.extraContentFiles || []).map(({ from, to = \".\" }) => {\n return {\n from,\n to: path.join(\"extraContentFiles\", to, path.basename(from)),\n };\n }),\n\n /*\n Optional extra resources (stored in extraResources/ in the ZIP).\n Similar to extra content files above\n */\n ...(config.extraResources || []).map(({ from, to = \".\" }) => {\n return {\n from,\n to: path.join(\"extraResources\", to, path.basename(from)),\n };\n }),\n\n /*\n Icons (more may be added below)\n */\n {\n from: config.icon,\n to: path.join(\"icons\", \"appIcon\" + path.extname(config.icon)),\n },\n ];\n\n if (config.linux) {\n if (config.linux.icon) {\n files.push({\n from: config.linux.icon,\n to: path.join(\n \"icons\",\n \"appIcon-linux\" + path.extname(config.linux.icon)\n ),\n });\n }\n }\n\n if (Array.isArray(config.fileAssociations)) {\n const possibleIcons = [];\n for (const fa of config.fileAssociations) {\n if (fa.icon) {\n const icon = path.parse(fa.icon);\n // The right extension is set by electron-builder\n // https://github.com/electron-userland/electron-builder/blob/abf52eaf8dfba63eb9507c03032d8f7e2f26dd2b/packages/builder-util/src/util.ts#L320\n possibleIcons.push(\n { ext: fa.ext, icon: path.join(icon.dir, icon.name) + \".ico\" },\n { ext: fa.ext, icon: path.join(icon.dir, icon.name) + \".icns\" }\n );\n }\n }\n\n await Promise.all(\n possibleIcons.map(async ({ ext, icon }) => {\n if (await exists(icon)) {\n files.push({\n from: icon,\n to: path.join(\"icons\", \"association-\" + ext + path.extname(icon)),\n });\n }\n })\n );\n }\n\n if (config.mac) {\n if (config.mac.entitlements) {\n files.push({\n from: config.mac.entitlements,\n to: path.join(\"other\", \"mac\", \"entitlements.mac.plist\"),\n });\n }\n\n if (config.mac.entitlementsInherit) {\n files.push({\n from: config.mac.entitlementsInherit,\n to: path.join(\"other\", \"mac\", \"entitlementsInherit.mac.plist\"),\n });\n }\n\n if (config.mac.icon) {\n files.push({\n from: config.mac.icon,\n to: path.join(\"icons\", \"appIcon-mac\" + path.extname(config.mac.icon)),\n });\n }\n\n if (config.mac.requirements) {\n files.push({\n from: config.mac.requirements,\n to: path.join(\"other\", \"mac\", \"requirements.txt\"),\n });\n }\n }\n\n if (config.mas) {\n if (config.mas.entitlements) {\n files.push({\n from: config.mas.entitlements,\n to: path.join(\"other\", \"mac\", \"entitlements.mas.plist\"),\n });\n }\n\n if (config.mas.entitlementsInherit) {\n files.push({\n from: config.mas.entitlementsInherit,\n to: path.join(\"other\", \"mac\", \"entitlementsInherit.mas.plist\"),\n });\n }\n\n if (config.mas.provisioningProfile) {\n files.push({\n from: config.mas.provisioningProfile,\n to: path.join(\"other\", \"mac\", \"mas.provisionprofile\"),\n });\n }\n }\n\n if (config.dmg) {\n if (config.dmg.background) {\n files.push({\n from: config.dmg.background,\n to: path.join(\"other\", \"mac\", \"dmg-background.tiff\"),\n });\n }\n }\n\n if (config.windows) {\n if (config.windows.icon) {\n files.push({\n from: config.windows.icon,\n to: path.join(\n \"icons\",\n \"appIcon-windows\" + path.extname(config.windows.icon)\n ),\n });\n }\n\n if (config.windows.nsisInclude) {\n files.push({\n from: config.windows.nsisInclude,\n to: path.join(\"other\", \"installer.nsh\"),\n });\n }\n }\n\n return uploadToS3({\n bucket: config.bucket || undefined,\n inputStream: await zip({\n files,\n fileSizeLimit: config.uploadSizeLimit,\n onError: (e) => {\n throw e;\n },\n onProgress({ fs }) {\n totalBytes = fs.totalBytes;\n },\n appPkgJson,\n }),\n key: generateS3Key({\n appId,\n buildId,\n filenameSuffix: `${appPkgJson.name?.replaceAll(\"/\", \"\")}.zip`,\n }),\n onProgress({ loaded, total }) {\n onProgress((loaded / total) * 100, loaded);\n },\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.promises.access(filePath);\n return true;\n } catch (e) {\n return false;\n }\n}\n", "export default ({ appId, buildId, filenameSuffix }) =>\n `${appId}/sourceArchives/${buildId}--${filenameSuffix}`;\n", "import superagent from \"superagent\";\nimport streamToArray from \"stream-to-array\";\nimport getEnvironmentVariables from \"../../../utilities/getEnvironmentVariables\";\nimport logger from \"../../../utilities/logger\";\nimport getCallableFirebaseFunction from \"../../../utilities/getCallableFirebaseFunction\";\n\nconst { TODESKTOP_CLI_S3_BUCKET } = getEnvironmentVariables();\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 2000; // 2 seconds\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\ntype UploadParams = {\n bucket?: string;\n inputStream: NodeJS.ReadableStream;\n key: string;\n onProgress?: (event: { loaded: number; total: number }) => void;\n};\n\ntype UploadedResponse = {\n bucket: string;\n key: string;\n url: string;\n};\n\ntype GetSignedURLResponse = {\n data: {\n signedURL: string;\n uploadURL: string;\n };\n};\n\nconst uploadToS3WithRetry = async (\n input: UploadParams,\n retries = MAX_RETRIES\n): Promise<any> => {\n try {\n return await uploadToS3(input);\n } catch (error) {\n if (retries > 0) {\n logger.warn(\n `Upload failed. Retrying... (${\n MAX_RETRIES - retries + 1\n } of ${MAX_RETRIES})`\n );\n await delay(RETRY_DELAY);\n return uploadToS3WithRetry(input, retries - 1);\n } else {\n logger.error(\"All retries exhausted. Upload failed.\");\n throw error;\n }\n }\n};\n\nconst uploadToS3 = async ({\n bucket = TODESKTOP_CLI_S3_BUCKET,\n inputStream,\n key,\n onProgress = () => {},\n}: UploadParams): Promise<UploadedResponse> => {\n const getSignedURL = getCallableFirebaseFunction(\"getSignedURL\");\n const { data }: GetSignedURLResponse = await getSignedURL({\n key,\n });\n\n const parts = await streamToArray(inputStream);\n const buffers = parts.map((part) =>\n Buffer.isBuffer(part) ? part : Buffer.from(part)\n );\n const body = Buffer.concat(buffers);\n\n return new Promise((resolve, reject) => {\n superagent\n .put(data.signedURL)\n .send(body)\n .set(\"content-type\", \"application/zip\")\n .on(\"progress\", onProgress)\n .end((err) => {\n logger.debug({ bucket, key, url: data.uploadURL }, \"uploadToS3\");\n if (err) {\n logger.error({ err }, \"uploadToS3\");\n return reject(err);\n }\n return resolve({ bucket, key, url: data.uploadURL });\n });\n });\n};\n\nexport default uploadToS3WithRetry;\n", "import archiver from \"archiver\";\nimport du from \"du\";\nimport fs from \"fs\";\nimport chalk from \"chalk\";\nimport logger from \"../../../utilities/logger\";\nimport path from \"path\";\n\nexport default async function ({\n files,\n fileSizeLimit = 20,\n onError,\n onProgress,\n appPkgJson,\n}) {\n logger.debug({ files }, \"zip\");\n const stream = archiver(\"zip\");\n\n // good practice to catch warnings (ie stat failures and other non-blocking errors)\n stream.on(\"warning\", function (err) {\n if (err.code === \"ENOENT\") {\n console.warn(err);\n logger.warn({ err }, \"zip: stream warning ENOENT\");\n } else {\n // throw error\n onError(err);\n }\n });\n\n // good practice to catch this error explicitly\n stream.on(\"error\", function (err) {\n onError(err);\n });\n\n // Grab the file size and more\n const processedFiles = await Promise.all(\n files.map(async (file) => {\n const stats = fs.lstatSync(file.from);\n const isDirectory = stats.isDirectory();\n\n return {\n ...file,\n isDirectory,\n stats,\n size: isDirectory ? await du(file.from) : stats.size,\n };\n })\n );\n\n const totalFileSize = processedFiles.reduce((sum, b) => sum + b.size, 0);\n // Does file size sum exceed limit?\n if (totalFileSize > fileSizeLimit * 1000000) {\n onError(\n new Error(\n [\n `\\n\\nYour app is larger than ${fileSizeLimit}MB. Your app is ${chalk.bold.red.underline(\n (totalFileSize / 1000000).toFixed(1) + \"MB\"\n )}.\\n`,\n `You may be including unnecessary files in your app(see the \\`appPath\\` and \\`appFiles\\` options).`,\n `If not, this limit can be raised by setting the \\`uploadSizeLimit\\` option.`,\n `Learn more at https://www.npmjs.com/package/@todesktop/cli#uploadsizelimit---optional-number`,\n ].join(\"\\n\")\n )\n );\n return stream;\n }\n\n // Add the files to the ZIP\n processedFiles.forEach(({ from, isDirectory, stats, to }) => {\n if (isDirectory) {\n stream.directory(from, to);\n } else if (appPkgJson && to === path.join(\"app\", \"package.json\")) {\n stream.append(JSON.stringify(appPkgJson), {\n name: to,\n });\n } else {\n stream.file(from, { name: to, mode: stats.mode });\n }\n });\n\n // finalize the archive (ie we are done appending files but streams have to finish yet)\n // 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand\n stream.finalize();\n\n stream.on(\"progress\", (progress) =>\n onProgress({\n ...progress,\n percentage: (progress.entries.processed / progress.entries.total) * 100,\n })\n );\n\n return stream;\n}\n", "import { useState } from \"react\";\n\n/*\n This should be called at the top of all commands to test if React\n is OK and if not, to exit cleanly.\n\n If React throws an error (e.g. when there are multiple versions of\n React in the customer's dependency tree), then we need to exit with\n a non-zero error code and not with an uncaught exception somewhere.\n\n These parameters exist only to make things more testable\n*/\nexport default ({ cons = console, proc = process } = {}) => {\n try {\n useState(null);\n } catch (e) {\n cons.error(e);\n proc.exit(1);\n }\n};\n", "import { useStdin } from \"ink\";\nimport { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport isCi from \"is-ci\";\n\n// components\nimport Login from \"./Login\";\n\n// logic\nimport { signInWithCustomToken } from \"../utilities/firestore\";\nimport { getAuthConfig, setAuthConfig } from \"../utilities/configStore\";\nimport postToFirebaseFunction from \"../utilities/postToFirebaseFunction\";\nimport getEnvironmentVariables from \"../utilities/getEnvironmentVariables\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport LoadingText from \"./LoadingText\";\n\nconst LoginHOC = ({ children, isInteractive = true }) => {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [isEffectDone, setEffectDone] = useState(false);\n const [error, setError] = useState(null);\n const { isRawModeSupported } = useStdin();\n\n const onFailure = (message, err = {}) => {\n setError({\n ...err,\n message,\n });\n };\n\n // use effect for determining if tokens exist and are valid\n useEffect(() => {\n async function isAccessTokenValid() {\n const { accessToken, email, jwtToken } = getAuthConfig();\n let userCreds = null;\n\n const { TODESKTOP_ACCESS_TOKEN, TODESKTOP_EMAIL } =\n getEnvironmentVariables();\n\n // 1. attempt log in with environment variables if present\n try {\n if (TODESKTOP_ACCESS_TOKEN && TODESKTOP_EMAIL) {\n const newJwtToken = await postToFirebaseFunction(\n \"loginWithAccessToken\",\n {\n email: TODESKTOP_EMAIL,\n accessToken: TODESKTOP_ACCESS_TOKEN,\n }\n );\n\n if (newJwtToken) {\n userCreds = await signInWithCustomToken(newJwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n // if no environment variables set and is in a CI, set alert message and exit\n } else if (!isRawModeSupported || isCi) {\n onFailure(\n \"ToDesktop environment variables not found. When automating builds with your CI provider, you need to specify environment variables for TODESKTOP_EMAIL and TODESKTOP_ACCESS_TOKEN.\"\n );\n }\n } catch (err) {\n // print error and stop the app execution if env variables attempted\n onFailure(\"Log in with environment variables failed.\", err);\n }\n\n // 2. attempt log in with jwtToken if present\n try {\n if (!userCreds && jwtToken) {\n userCreds = await signInWithCustomToken(jwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n } catch (err) {\n // do nothing, attempt login with accessToken and email\n }\n\n // 3. attempt log in with accessToken and email on disk\n try {\n if (!userCreds && accessToken && email) {\n const newJwtToken = await postToFirebaseFunction(\n \"loginWithAccessToken\",\n { email, accessToken }\n );\n\n if (newJwtToken) {\n userCreds = await signInWithCustomToken(newJwtToken);\n setAuthConfig(email, accessToken, newJwtToken);\n if (userCreds.user) setIsLoggedIn(true);\n }\n }\n } catch (err) {\n // do nothing: no error state and not logged in state means render login\n }\n\n setEffectDone(true);\n }\n\n isAccessTokenValid();\n }, [isRawModeSupported]);\n\n if (error && isInteractive) {\n return <ErrorDisplay error={error} />;\n }\n\n if (!isEffectDone) {\n return <LoadingText />;\n }\n\n if (!isLoggedIn && isInteractive) {\n return <Login setIsLoggedIn={setIsLoggedIn} />;\n }\n\n return <>{children}</>;\n};\n\nLoginHOC.propTypes = {\n children: PropTypes.object,\n isInteractive: PropTypes.bool,\n};\n\nexport default LoginHOC;\n", "// modules\nimport { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useState } from \"react\";\nimport { Form, Field } from \"react-final-form\";\n\n// components\nimport TextInput from \"./TextInput\";\nimport ErrorDisplay from \"./ErrorDisplay\";\n\n// logic\nimport postToFirebaseFunction from \"../utilities/postToFirebaseFunction\";\nimport { signInWithCustomToken } from \"../utilities/firestore\";\nimport { setAuthConfig } from \"../utilities/configStore\";\n\nconst loginFields = [\n {\n name: \"email\",\n label: \"Your email\",\n placeholder: \"name@email.com\",\n Input: TextInput,\n validate: (value) => {\n if (!value) return \"Required\";\n },\n },\n {\n name: \"accessToken\",\n label: \"Your access token\",\n placeholder: \"********\",\n Input: TextInput,\n validate: (value) => {\n if (!value) return \"Required\";\n },\n mask: \"*\",\n },\n];\n\nconst Login = ({ setIsLoggedIn }) => {\n const [activeField, setActiveField] = useState(0);\n const [error, setError] = useState(null);\n const [failureMessage, setFailureMessage] = useState(null);\n const [isSubmittingForm, setIsSubmittingForm] = useState(false);\n\n const onFailure = (message) => {\n setIsSubmittingForm(false);\n setFailureMessage(message);\n setActiveField(0);\n };\n\n // login handler that verifies accessToken and email with that in firebase\n const onSubmitLogin = async ({ email, accessToken }) => {\n setFailureMessage(null);\n setIsSubmittingForm(true);\n\n try {\n const jwtToken = await postToFirebaseFunction(\"loginWithAccessToken\", {\n email,\n accessToken,\n });\n\n if (jwtToken) {\n await signInWithCustomToken(jwtToken);\n setAuthConfig(email, accessToken, jwtToken);\n setIsLoggedIn(true);\n } else {\n onFailure(\"Incorrrect credentials. Try again\");\n }\n } catch (err) {\n if (err.code === 500) {\n setError(err);\n } else {\n onFailure(\n `Login unsuccessful: ${err?.response?.data?.message || err.message}`\n );\n }\n }\n };\n\n if (error) return <ErrorDisplay error={error} />;\n\n return (\n <>\n <Text>You are not currently logged in.</Text>\n <Text>Log in below:</Text>\n <Box marginBottom={1} />\n <Form onSubmit={onSubmitLogin}>\n {({ handleSubmit, validating }) => (\n <Box flexDirection=\"column\">\n {loginFields.map(\n ({ name, label, placeholder, validate, Input, mask }, index) => (\n <Field name={name} key={name} validate={validate}>\n {({ input, meta }) => (\n <Box flexDirection=\"column\">\n {activeField >= index ? (\n <Box>\n <Text bold={activeField === index}>{label}: </Text>\n {activeField === index ? (\n <Input\n {...input}\n mask={mask}\n placeholder={placeholder}\n onSubmit={() => {\n if (meta.valid && !validating) {\n setActiveField((value) => value + 1); // go to next field\n if (activeField === loginFields.length - 1) {\n // last field, so submit\n handleSubmit();\n }\n } else {\n input.onBlur(); // mark as touched to show error\n }\n }}\n />\n ) : (\n (input.value && (\n <Text>\n {name === \"accessToken\"\n ? input.value.replace(/./gi, \"*\")\n : input.value}\n </Text>\n )) ||\n (placeholder && (\n <Text color=\"gray\">{placeholder}</Text>\n ))\n )}\n {meta.invalid && meta.touched && (\n <Box marginLeft={2} marginRight={1}>\n <Text color=\"red\">\u2716</Text>\n </Box>\n )}\n {meta.error && meta.touched && (\n <Error errorMessage={meta.error} />\n )}\n </Box>\n ) : null}\n </Box>\n )}\n </Field>\n )\n )}\n </Box>\n )}\n </Form>\n\n {isSubmittingForm && (\n <Box marginTop={1}>\n <Text>Logging in...</Text>\n </Box>\n )}\n\n {failureMessage && <Error errorMessage={failureMessage} marginTop />}\n </>\n );\n};\n\nconst Error = ({ errorMessage, marginTop }) => (\n <Box marginTop={marginTop ? 1 : 0}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n);\n\nError.propTypes = {\n errorMessage: PropTypes.string.isRequired,\n marginTop: PropTypes.bool,\n};\n\nLogin.propTypes = {\n setIsLoggedIn: PropTypes.func.isRequired,\n};\n\nexport default Login;\n", "import InkTextInput from \"ink-text-input\";\nimport React from \"react\";\n\nconst TextInput = ({ onBlur, onFocus, ...props }: TextInputProps) => {\n React.useEffect(() => {\n onFocus();\n return onBlur;\n }, [onFocus, onBlur]);\n return <InkTextInput {...props} showCursor />;\n};\n\nexport default TextInput;\n\ntype InkTextInputProps = React.ComponentProps<typeof InkTextInput>;\ninterface TextInputProps extends InkTextInputProps {\n onBlur: () => void;\n onFocus: () => void;\n}\n", "import { Text, useStdout } from \"ink\";\n\nconst LoadingText = ({ text = \"Loading\" }: { text?: string }) => {\n const { stdout } = useStdout();\n const stdOutRedirected = !stdout.isTTY;\n if (stdOutRedirected) {\n // Don't write Loading text if we're not in a TTY (e.g... redirected to a file)\n return null;\n }\n\n return <Text>{text}...</Text>;\n};\n\nexport default LoadingText;\n", "import React, { ReactNode } from \"react\";\nimport * as Sentry from \"@sentry/node\";\n\nclass ErrorBoundary extends React.Component<\n { children: ReactNode },\n { error?: Error; eventId?: string }\n> {\n constructor(props) {\n super(props);\n this.state = { eventId: null, error: null };\n }\n\n static getDerivedStateFromError(error) {\n return { error };\n }\n\n componentDidCatch(error, errorInfo) {\n Sentry.withScope((scope) => {\n scope.setExtras(errorInfo);\n const eventId = Sentry.captureException(error);\n this.setState({ eventId });\n });\n }\n\n render() {\n if (this.state.error) {\n throw this.state.error;\n }\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n", "import { Box, Text, useStdin } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport PropTypes from \"prop-types\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport type { Build } from \"@todesktop/shared\";\nimport CancelBuild from \"../../../components/CancelBuild\";\nimport CustomSelectInputIndicator from \"../../../components/CustomSelectInputIndicator\";\nimport CustomSelectInputItem from \"../../../components/CustomSelectInputItem\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport ViewBuild from \"../../../components/ViewBuild\";\nimport {\n isBuildCancellable,\n isBuildRunning,\n} from \"../../../utilities/buildStatus\";\nimport firestore from \"../../../utilities/firestore\";\nimport getProjectConfig from \"../../../utilities/projectConfig/getProjectConfig\";\nimport logger from \"../../../utilities/logger\";\nimport useInput from \"../../../utilities/useInput\";\nimport useExit from \"../../../utilities/useExit\";\nimport isCi from \"is-ci\";\nimport findAppUserId from \"../../../utilities/findAppUserId\";\n\nconst OngoingBuildGuard = ({\n children,\n commandUsed,\n configPath,\n}: {\n children: ReactNode;\n commandUsed: string;\n configPath?: string;\n}) => {\n const { isRawModeSupported } = useStdin();\n const onInput = useInput();\n const exit = useExit();\n const [{ appId, builds, error, isLoading, itemChosen }, setState] = useState<{\n appId: string | null;\n builds: Build[];\n error: Error | null;\n isLoading: boolean;\n itemChosen: { value: string } | null;\n }>({\n appId: null,\n builds: [],\n error: null,\n isLoading: true,\n itemChosen: null,\n });\n\n useEffect(() => {\n if (!isLoading) {\n return;\n }\n\n (async () => {\n try {\n const applicationId = getProjectConfig(configPath).config.id;\n const { id } = await findAppUserId(applicationId);\n\n const now = new Date();\n const twentyFourHoursAgo = new Date(\n now.getTime() - 24 * 60 * 60 * 1000\n );\n\n const buildsResult = await firestore\n .doc(`users/${id}/applications/${applicationId}`)\n .collection(\"builds\")\n .where(\"createdAt\", \">=\", twentyFourHoursAgo)\n .orderBy(\"createdAt\", \"desc\")\n .limit(10)\n .get();\n\n const stateUpdates: {\n appId: string | null;\n isLoading: boolean;\n builds: Build[];\n } = {\n appId: applicationId,\n isLoading: false,\n builds: [],\n };\n\n if (!buildsResult.empty) {\n const latestBuild = buildsResult.docs[0].data() as Build;\n const isRunning =\n isBuildRunning(latestBuild) && latestBuild.status !== \"preparation\";\n logger.debug(\n { isRunning },\n \"OngoingBuildGuard component: got latest build\"\n );\n\n stateUpdates.builds = buildsResult.docs\n .map((doc) => doc.data() as Build)\n .filter((build) => {\n if (isBuildRunning(build) && build.status !== \"preparation\") {\n return true;\n }\n return false;\n });\n }\n\n setState((previousState) => ({\n ...previousState,\n ...stateUpdates,\n }));\n } catch (e) {\n setState((previousState) => ({\n ...previousState,\n error: e as Error,\n }));\n }\n })();\n }, [builds, itemChosen, isLoading, isRawModeSupported, configPath]);\n\n /*\n Because we're using <SelectInput/>, we need to explicitly handle when\n ctrl+c is pressed. `onInput` takes care of that.\n See https://github.com/vadimdemedes/pastel/issues/38\n */\n if (isRawModeSupported) {\n // Input causes an error on if stdin does not support raw mode\n onInput(() => {});\n }\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (isLoading) {\n return <Text>...</Text>;\n }\n\n if (itemChosen) {\n logger.debug({ itemChosen }, \"OngoingBuildGuard component: item chosen\");\n const build = builds.find(Boolean);\n\n if (itemChosen.value === \"view\" && build) {\n return <ViewBuild commandUsed={commandUsed} id={build.id} />;\n } else if (itemChosen.value === \"cancel\" && build && appId) {\n return (\n <CancelBuild appId={appId} commandUsed={commandUsed} id={build.id}>\n {children}\n </CancelBuild>\n );\n } else if (itemChosen.value === \"concurrent\") {\n return <>{children}</>;\n } else {\n setTimeout(exit, 10);\n }\n }\n\n if (builds.length && isCi === false && isRawModeSupported) {\n const latestBuild = builds.find(Boolean);\n const multiple = builds.length > 1;\n\n const items = [\n {\n label: `View ${multiple ? \"latest\" : \"it\"}`,\n value: \"view\",\n },\n ];\n\n if (builds.some((build) => isBuildCancellable(build))) {\n items.push({\n label: `Cancel ${multiple ? \"latest\" : \"it\"} and start a new build`,\n value: \"cancel\",\n });\n\n items.push({\n label: \"Start a concurrent build\",\n value: \"concurrent\",\n });\n }\n\n items.push({\n label: \"Exit\",\n value: \"exit\",\n });\n const handleSelect = (itemChosen: { value: string }) =>\n setState((previousState) => ({ ...previousState, itemChosen }));\n\n return (\n <>\n <Box marginBottom={1}>\n <Text bold>\n {multiple\n ? \"There are ongoing builds \"\n : \"There is an ongoing build \"}\n </Text>\n <Text>\n ({latestBuild?.appName}\n {latestBuild?.appVersion ? ` v${latestBuild.appVersion}` : \"\"})\n </Text>\n </Box>\n <SelectInput\n indicatorComponent={CustomSelectInputIndicator}\n itemComponent={CustomSelectInputItem}\n items={items}\n onSelect={handleSelect}\n />\n </>\n );\n } else {\n return <>{children}</>;\n }\n};\n\nOngoingBuildGuard.propTypes = {\n commandUsed: PropTypes.string.isRequired,\n children: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n configPath: PropTypes.string,\n};\n\nexport default OngoingBuildGuard;\n", "import { Box, Text } from \"ink\";\nimport { ComponentProps } from \"react\";\n\nexport default function CustomSelectInputIndicator({\n isSelected,\n ...props\n}: {\n isSelected?: boolean;\n} & ComponentProps<typeof Box>) {\n const selectIndicator =\n process.env.NODE_ENV === \"test\" || process.platform === \"win32\" ? \">\" : \"\u276F\";\n\n return (\n <Box marginRight={1} {...props}>\n <Text>{isSelected ? selectIndicator : \" \"}</Text>\n </Box>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport { ComponentProps } from \"react\";\n\nexport default function CustomSelectInputItem({\n isSelected,\n label,\n ...props\n}: {\n isSelected?: boolean;\n label: string;\n} & ComponentProps<typeof Box>) {\n return (\n <Text bold={isSelected} color={isSelected ? undefined : \"gray\"} {...props}>\n {label}\n </Text>\n );\n}\n", "// libs\nimport { Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\n\n// components\nimport BuildProgress from \"./BuildProgress\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport MainLayout from \"./MainLayout\";\n\n// utils\nimport getLatestBuildId from \"../utilities/getLatestBuildId\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport logForCI from \"../utilities/logForCI\";\nimport shouldExitOnBuildFailure from \"../utilities/shouldExitOnBuildFailure\";\nimport subscribeToBuild from \"../utilities/subscribeToBuild\";\nimport useExit from \"../utilities/useExit\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport LoadingText from \"./LoadingText\";\n\nconst ViewBuild = ({ commandUsed, id, configPath }) => {\n const exit = useExit();\n const [\n {\n appId,\n arbitraryMessageComponent,\n build,\n error,\n hasBuildEverFailed,\n isLoading,\n },\n setState,\n ] = useState({\n appId: null,\n arbitraryMessageComponent: null,\n build: null,\n error: null,\n hasBuildEverFailed: false,\n isLoading: true,\n });\n\n const onError = (e) => {\n const error = e.response ? e.response.data : e;\n logForCI(error);\n setState((prevState) => ({\n ...prevState,\n error,\n }));\n };\n\n useEffect(() => {\n let firebaseUnsubscribe;\n\n async function viewBuild() {\n let config;\n try {\n // This will throw if validation fails:\n config = getProjectConfig(configPath).config;\n } catch (e) {\n setState((previousState) => ({ ...previousState, error: e }));\n return;\n }\n\n const { id: userId } = await findAppUserId(config.id);\n\n const subscribe = (buildId) => {\n subscribeToBuild({\n appId: config.id,\n buildId,\n onDataReceived: (data) => {\n if (!data) {\n onError(\n new Error(\n `No such build exists (${buildId}). Please contact us if this is an error`\n )\n );\n }\n setState((prevState) => ({\n ...prevState,\n appId: config.id,\n build: data,\n isLoading: false,\n }));\n },\n userId,\n })\n .then((firebaseUnsubscribeResult) => {\n firebaseUnsubscribe = firebaseUnsubscribeResult;\n })\n .catch(onError);\n };\n\n if (id) {\n subscribe(id);\n } else {\n getLatestBuildId({ appId: config.id, userId })\n .catch(onError)\n .then((latestBuildId) => {\n if (!latestBuildId) {\n setState((previousState) => ({\n ...previousState,\n arbitraryMessageComponent: <Text>There are no builds yet</Text>,\n }));\n return;\n }\n return subscribe(latestBuildId);\n });\n }\n }\n\n viewBuild();\n\n return () => {\n if (firebaseUnsubscribe) {\n firebaseUnsubscribe();\n }\n };\n }, [id, configPath]);\n\n // Exit if the build has errored and settled\n useEffect(() => {\n if (hasBuildEverFailed && shouldExitOnBuildFailure(build)) {\n setTimeout(() => exit(new Error(\"Build has failed\")), 10);\n }\n }, [build, exit, hasBuildEverFailed]);\n\n // Exit once an arbitrary message exists\n useEffect(() => {\n if (arbitraryMessageComponent) {\n setTimeout(() => exit(new Error(\"Validation failed\")), 10);\n }\n }, [arbitraryMessageComponent, exit]);\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (arbitraryMessageComponent) {\n return arbitraryMessageComponent;\n }\n\n if (isLoading) {\n return <LoadingText />;\n }\n\n const onBuildFailure = () => {\n if (hasBuildEverFailed) {\n return;\n }\n setState((prevState) => ({\n ...prevState,\n hasBuildEverFailed: true,\n }));\n };\n\n return (\n <MainLayout\n appId={appId}\n appName={build.appName}\n appVersion={build.appVersion}\n build={build}\n commandUsed={commandUsed}\n hasBuildEverFailed={hasBuildEverFailed}\n >\n <BuildProgress build={build} onBuildFailure={onBuildFailure} />\n </MainLayout>\n );\n};\n\nViewBuild.propTypes = {\n id: (props, propName, componentName) => {\n if ([props.id, props.shouldViewLatest].filter(Boolean).length !== 1) {\n return new Error(\n `Exactly one of 'id' and 'shouldViewLatest' must be specified in '${componentName}'`\n );\n }\n\n const type = typeof props.id;\n if (![\"string\", \"undefined\"].includes(type)) {\n return new Error(\n `'id' is a '${type}', not a string, in '${componentName}'.`\n );\n }\n },\n commandUsed: PropTypes.string.isRequired,\n shouldViewLatest: (props, propName, componentName) => {\n if ([props.id, props.shouldViewLatest].filter(Boolean).length !== 1) {\n return new Error(\n `Exactly one of 'id' and 'shouldViewLatest' must be specified in '${componentName}'`\n );\n }\n\n const type = typeof props.shouldViewLatest;\n if (![\"boolean\", \"undefined\"].includes(type)) {\n return new Error(\n `'shouldViewLatest' is a '${type}', not a boolean, in '${componentName}'.`\n );\n }\n },\n configPath: PropTypes.string,\n};\n\nexport default ViewBuild;\n", "import firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getLatestBuildId({\n appId,\n userId,\n}: {\n appId: string;\n userId: string;\n}): Promise<string | undefined> {\n logger.debug({ appId }, \"getLatestBuildId\");\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n\n if (!appSnapshot.exists) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n const buildsResult = await appRef\n .collection(\"builds\")\n .orderBy(\"createdAt\", \"desc\")\n .limit(1)\n .get();\n\n return buildsResult.empty ? undefined : buildsResult.docs[0].id;\n}\n", "import type { DocData, DocSnapshot } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function subscribeToFirebaseDoc<T extends DocData>(\n key: string,\n receiver: (data: { snapshot: DocSnapshot<T>; data: T | undefined }) => void\n) {\n return new Promise<() => void>((resolve, reject) => {\n logger.debug({ key }, \"subscribeToFirebaseDoc\");\n const unsubscribe = firestore.doc(key).onSnapshot(\n (snapshot) => {\n receiver({\n snapshot: snapshot as DocSnapshot<T>,\n data: snapshot.exists ? (snapshot.data() as T) : undefined,\n });\n\n resolve(unsubscribe);\n },\n (err) => {\n reject(err);\n }\n );\n });\n}\n", "import subscribeToFirebaseDoc from \"./subscribeToFirebaseDoc\";\n\nexport default async ({ appId, buildId, onDataReceived, userId }) => {\n try {\n return await subscribeToFirebaseDoc(\n `users/${userId}/applications/${appId}/builds/${buildId}`,\n async ({ data }) => {\n onDataReceived(data);\n }\n );\n } catch (e) {\n e.message = `Failed while subscribing to build; ${e.message}`;\n throw e;\n }\n};\n", "import firestore, { currentUser } from \"./firestore\";\n\nconst getCollection = (collectionRef) => {\n return collectionRef.get().then((resp) => {\n const result = [];\n resp.forEach((doc) => result.push(doc.data()));\n return result;\n });\n};\n\nconst acceptedUsersCollection = (id) =>\n firestore.collection(`users/${id}/acceptedUsers`);\n\nconst findAppUserId = async (appId): Promise<User> => {\n const { uid, email } = currentUser();\n const acceptedUsers = await getCollection(acceptedUsersCollection(uid));\n const primaryUser = { id: uid, label: email };\n\n const users = [\n primaryUser,\n ...acceptedUsers.map((user) => ({ id: user.id, label: user.email })),\n ];\n\n for (const user of users) {\n try {\n const doc = await firestore\n .doc(`users/${user.id}/applications/${appId}`)\n .get();\n\n if (doc.exists) return user;\n } catch (err) {\n // will throw an error if user doesn't have access\n console.error(err);\n }\n }\n\n return primaryUser;\n};\n\ninterface User {\n id: string;\n label: string;\n}\n\nexport default findAppUserId;\n", "import { useEffect, useState } from \"react\";\n\nimport { onUserAuth } from \"./firestore\";\nimport { identify, track, ANALYTICS_EVENT } from \"./analytics\";\nimport logger from \"./logger\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\n\nexport const useAnalyticsCommand = (\n command,\n flags: any = {},\n properties = {}\n) => {\n const [hasAttemptedTracking, setTrackingAttempt] = useState(false);\n\n logger.info({ command, flags, properties }, \"useAnalyticsCommand\");\n\n try {\n if (flags.projectPath) {\n properties = {\n ...properties,\n ...getProjectConfig(),\n };\n }\n } catch (err) {\n // do nothing\n }\n\n useEffect(() => {\n const authUnsubscribe = onUserAuth(async (user) => {\n /**\n * Only identify if there's a user id (stops use of anon id).\n * Subsequent track callback will thus always be tied to a user.\n */\n if (user.uid) {\n identify(\n user.uid,\n {\n email: user.email,\n displayName: user.displayName,\n },\n () => {\n track(\n ANALYTICS_EVENT.CLI_COMMAND,\n {\n ...properties,\n flags,\n command,\n },\n () => setTrackingAttempt(true)\n );\n authUnsubscribe && authUnsubscribe();\n }\n );\n }\n });\n\n // if it takes longer than 5 secs to identify a user, just set the\n // tracking attempt to true so that other commands aren't waiting\n // forever to terminate (see whoami component)\n setTimeout(() => setTrackingAttempt(true), 5000);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // leave empty - this should only ever execute once (on mount)\n\n return { hasAttemptedTracking };\n};\n", "import Build from \"./components/Build\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport OngoingBuildGuard from \"./components/OngoingBuildGuard\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\n\nexport default function BuildCommand({\n configPath,\n exitAfterUploading,\n onBuildFinishedWebhook,\n shouldCodeSign,\n}: {\n configPath?: string;\n exitAfterUploading: boolean;\n onBuildFinishedWebhook?: string;\n shouldCodeSign: boolean;\n}) {\n checkIfReactIsUsable();\n\n useAnalyticsCommand(\"build\", {\n async: exitAfterUploading,\n codeSign: shouldCodeSign,\n config: configPath,\n webhook: onBuildFinishedWebhook,\n });\n\n const commandUsed = \"todesktop build\";\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <OngoingBuildGuard configPath={configPath} commandUsed={commandUsed}>\n <Build\n commandUsed={commandUsed}\n configPath={configPath}\n exitAfterUploading={exitAfterUploading}\n onBuildFinishedWebhook={onBuildFinishedWebhook}\n shouldCodeSign={shouldCodeSign}\n />\n </OngoingBuildGuard>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { useEffect, useState } from \"react\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport Table from \"./Table\";\nimport capitalize from \"../utilities/capitalize\";\nimport getBuilds from \"../utilities/getBuilds\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport getRelativeDateFromDateString from \"../utilities/getRelativeDateFromDateString\";\nimport logForCI from \"../utilities/logForCI\";\nimport useInput from \"../utilities/useInput\";\nimport useExit from \"../utilities/useExit\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport SyntaxHighlight from \"./SyntaxHighlight\";\nimport LoadingText from \"./LoadingText\";\n\nconst ViewBuilds = ({\n commandUsed,\n configPath,\n count,\n format,\n exit: shouldExitAfterViewingBuilds = false,\n}) => {\n const exit = useExit();\n const [\n {\n builds,\n error,\n hasMoreToLoad,\n isInitialLoadComplete,\n isLoading,\n projectConfig,\n startAfter,\n user,\n },\n setState,\n ] = useState({\n builds: [],\n error: null,\n hasMoreToLoad: true,\n isInitialLoadComplete: false,\n isLoading: false,\n projectConfig: null,\n startAfter: null,\n user: null,\n });\n\n const onInput = useInput();\n\n onInput((input, key) => {\n if (key.escape) {\n exit();\n }\n\n if (input === \" \" || key.downArrow || key.pageDown || key.return) {\n if (!isInitialLoadComplete || !hasMoreToLoad) {\n return;\n }\n\n setState((previousState) => ({\n ...previousState,\n startAfter: builds[builds.length - 1].createdAt,\n }));\n }\n });\n\n useEffect(() => {\n async function viewBuilds() {\n if (\n error ||\n isLoading ||\n (isInitialLoadComplete && (!hasMoreToLoad || !startAfter))\n ) {\n return;\n }\n\n if (![\"table\", \"json\"].includes(format)) {\n setState((previousState) => ({\n ...previousState,\n error: new Error(\n `Invalid output format \"${format}\". Valid formats are \"table\" and \"json\".`\n ),\n }));\n return;\n }\n\n setState((previousState) => ({\n ...previousState,\n isLoading: true,\n }));\n\n let config;\n try {\n // This will throw if validation fails:\n config = projectConfig || getProjectConfig(configPath).config;\n } catch (e) {\n setState((previousState) => ({ ...previousState, error: e }));\n return;\n }\n\n const pageSize = count || 5;\n const user = await findAppUserId(config.id);\n\n getBuilds({\n appId: config.id,\n limit: pageSize + 1,\n startAfter,\n userId: user.id,\n })\n .then((buildsResult) => {\n setState((previousState) => {\n const stateUpdates = {\n builds: [],\n hasMoreToLoad: buildsResult.length > pageSize,\n isInitialLoadComplete: true,\n isLoading: false,\n projectConfig: config,\n startAfter: null,\n user,\n };\n\n if (buildsResult.length) {\n stateUpdates.builds = [\n ...previousState.builds,\n ...buildsResult.slice(0, pageSize),\n ];\n }\n return {\n ...previousState,\n ...stateUpdates,\n };\n });\n })\n .catch((e) => {\n logForCI(e);\n setState((previousState) => ({\n ...previousState,\n error: e,\n isLoading: false,\n }));\n });\n }\n\n viewBuilds();\n }, [\n error,\n hasMoreToLoad,\n isInitialLoadComplete,\n isLoading,\n projectConfig,\n startAfter,\n configPath,\n format,\n count,\n ]);\n\n // Exit once all are loaded\n useEffect(() => {\n if (!hasMoreToLoad) {\n setTimeout(exit, 10);\n }\n }, [exit, hasMoreToLoad]);\n\n // Exit the process once the initial build data has been displayed if user has set the `--exit` flag\n useEffect(() => {\n if (!isLoading && isInitialLoadComplete && shouldExitAfterViewingBuilds) {\n setTimeout(exit, 10);\n }\n }, [exit, isLoading, shouldExitAfterViewingBuilds, isInitialLoadComplete]);\n\n if (error) {\n return <ErrorDisplay commandUsed={commandUsed} error={error} />;\n }\n\n if (!isInitialLoadComplete) {\n return <LoadingText />;\n }\n\n if (builds.length) {\n const formatData = (builds) =>\n builds.map((build) => ({\n ID: build.id,\n Version: build.appVersion || \"n/a\",\n \"Creation date\": getRelativeDateFromDateString(build.createdAt),\n Status: capitalize(build.status),\n \"Release date\": build.releasedAt\n ? getRelativeDateFromDateString(build.releasedAt)\n : \"Unreleased\",\n Owner: user ? user.label : \"unknown\",\n }));\n\n const getCellTextProps = ({ key, props, value }) => {\n const result = { ...props };\n\n if (key === \"Status\") {\n const status = value.toLowerCase();\n if (status === \"succeeded\") {\n result.color = \"green\";\n } else if (status === \"failed\") {\n result.color = \"red\";\n } else if (status === \"cancelled\") {\n result.dimColor = true;\n }\n } else if (key === \"Version\" && value.toLowerCase() === \"n/a\") {\n result.dimColor = true;\n } else if (\n key === \"Release date\" &&\n value.toLowerCase() === \"unreleased\"\n ) {\n result.dimColor = true;\n }\n\n return result;\n };\n\n return (\n <>\n {format === \"table\" ? (\n <Table\n getCellTextProps={getCellTextProps}\n data={formatData(builds)}\n />\n ) : null}\n {format === \"json\" ? (\n <SyntaxHighlight object={removeAppBuilderLibConfig(builds)} />\n ) : null}\n {!shouldExitAfterViewingBuilds && builds.length > 0 ? (\n <Box>\n <Text color=\"gray\" dimColor>\n {isLoading\n ? \"Loading more...\"\n : hasMoreToLoad\n ? `Showing the latest ${builds.length} builds. Press space/down to load more.`\n : `Showing all (${builds.length}) builds`}\n </Text>\n </Box>\n ) : null}\n </>\n );\n } else {\n return <Text>There are no builds yet</Text>;\n }\n};\n\nconst removeAppBuilderLibConfig = (builds) => {\n // Remove the appBuilderLib config from the builds because it's difficult to display\n // and not very useful to the user.\n return builds.map((build) => {\n if (build.mac && build.mac.appBuilderLibConfig) {\n delete build.mac.appBuilderLibConfig;\n }\n if (build.windows && build.windows.appBuilderLibConfig) {\n delete build.windows.appBuilderLibConfig;\n }\n if (build.linux && build.linux.appBuilderLibConfig) {\n delete build.linux.appBuilderLibConfig;\n }\n return build;\n });\n};\n\nViewBuilds.propTypes = {\n commandUsed: PropTypes.string.isRequired,\n configPath: PropTypes.string,\n count: PropTypes.number,\n format: PropTypes.string,\n exit: PropTypes.bool,\n};\n\nexport default ViewBuilds;\n", "import { Box } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport TableEnd from \"./TableEnd\";\nimport TableHead from \"./TableHead\";\nimport TableBody from \"./TableBody\";\nimport getKeyDetails from \"../utilities/getKeyDetails\";\n\n/*\n This component prints (the array of objects given) in a table.\n The array must not be empty.\n The keys are used as headers.\n Column widths are based on the longest value (object key or value).\n It is assumed that the same keys exist in all items.\n*/\nconst Table = ({ data, getCellTextProps }) => {\n const keyDetails = getKeyDetails(data);\n\n return (\n <Box flexDirection=\"column\">\n <TableHead keyDetails={keyDetails} />\n <TableBody\n data={data}\n getCellTextProps={getCellTextProps}\n keyDetails={keyDetails}\n />\n <TableEnd keyDetails={keyDetails} />\n </Box>\n );\n};\n\nTable.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n getCellTextProps: PropTypes.func,\n};\n\nexport default Table;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\n/*\n See Table component\n*/\nconst TableEnd = ({ keyDetails, ...props }) => {\n let content = \"\u2514\";\n content += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u2534\");\n content += \"\u2518\";\n\n return (\n <Box {...props}>\n <Text>{content}</Text>\n </Box>\n );\n};\n\nTableEnd.propTypes = {\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableEnd;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\nimport { Fragment } from \"react\";\n\n/*\n See Table component\n*/\nconst TableHead = ({ keyDetails, ...props }) => {\n let topLine = \"\u250C\";\n topLine += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u252C\");\n topLine += \"\u2510\";\n\n const contentLineElements = Object.values(keyDetails).map(\n ({ key, width }, index) => {\n return (\n <Fragment key={key}>\n {index > 0 ? <Text> \u2502 </Text> : null}\n <Box width={width}>\n <Text bold>{key}</Text>\n </Box>\n </Fragment>\n );\n }\n );\n\n return (\n <Box flexDirection=\"column\" {...props}>\n <Box>\n <Text>{topLine}</Text>\n </Box>\n <Box>\n <Box>\n <Text>\u2502 </Text>\n {contentLineElements}\n <Text> \u2502</Text>\n </Box>\n </Box>\n </Box>\n );\n};\n\nTableHead.propTypes = {\n bottomLinePrefix: PropTypes.string,\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableHead;\n", "import PropTypes from \"prop-types\";\nimport TableRow from \"./TableRow\";\n\n/*\n See Table component\n*/\nconst TableBody = ({ data, getCellTextProps, keyDetails }) => {\n return (\n <>\n {data.map((rowData, index) => (\n <TableRow\n data={rowData}\n getCellTextProps={getCellTextProps}\n key={index}\n keyDetails={keyDetails}\n />\n ))}\n </>\n );\n};\n\nTableBody.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n getCellTextProps: PropTypes.func,\n keyDetails: PropTypes.object.isRequired,\n};\n\nexport default TableBody;\n", "import { Box, Text } from \"ink\";\nimport PropTypes from \"prop-types\";\n\n/*\n See Table component\n*/\nconst TableRow = ({\n data,\n getCellTextProps = ({ props }) => props,\n keyDetails,\n textProps = {},\n}: {\n data: object;\n getCellTextProps?: (...args: any[]) => any;\n keyDetails: object;\n textProps?: object;\n}) => {\n let topLine = \"\u251C\";\n topLine += Object.values(keyDetails)\n .map(({ width }) => \"\u2500\".repeat(width + 2))\n .join(\"\u253C\");\n topLine += \"\u2524\";\n\n const content = (\n <>\n <Text>\u2502 </Text>\n {Object.entries(data).map(([key, value], index) => {\n return (\n <Box key={key}>\n {index > 0 ? <Text> \u2502 </Text> : null}\n <Box width={keyDetails[key].width}>\n <Text\n {...getCellTextProps({\n key,\n props: textProps,\n rowData: data,\n value,\n })}\n >\n {value}\n </Text>\n </Box>\n </Box>\n );\n })}\n <Text> \u2502</Text>\n </>\n );\n\n return (\n <>\n <Box flexDirection=\"column\">\n <Text>{topLine}</Text>\n <Box>{content}</Box>\n </Box>\n </>\n );\n};\n\nTableRow.propTypes = {\n data: PropTypes.object.isRequired,\n getCellTextProps: PropTypes.func,\n keyDetails: PropTypes.object.isRequired,\n textProps: PropTypes.object,\n};\n\nexport default TableRow;\n", "// This is used to get the column widths for tables\nexport default (data) => {\n const result = {};\n Object.keys(data[0]).forEach((key) => {\n result[key] = {\n key,\n width: Math.max(\n key.length,\n data.map((item) => item[key].toString().length).sort((a, b) => b - a)[0]\n ),\n };\n });\n return result;\n};\n", "export default (input) => {\n if (typeof input !== \"string\") {\n return \"\";\n }\n return input.charAt(0).toUpperCase() + input.slice(1);\n};\n", "import { Build } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getBuilds({\n addWhereClauses = (collection) => collection,\n userId,\n appId,\n limit = 5,\n startAfter = null,\n}: {\n addWhereClauses?: (collection: CollectionReference) => Query;\n userId: string;\n appId: string;\n limit?: number;\n startAfter?: string;\n}): Promise<Build[]> {\n logger.debug({ appId, limit, startAfter }, \"getBuilds\");\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n\n if (!appSnapshot.exists) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n let query = addWhereClauses(appRef.collection(\"builds\")).orderBy(\n \"createdAt\",\n \"desc\"\n );\n\n if (startAfter) {\n query = query.startAfter(startAfter);\n }\n\n const buildsResult = await query.limit(limit).get();\n\n if (buildsResult.empty) {\n return [];\n }\n\n return buildsResult.docs.map((doc) => doc.data()) as Build[];\n}\n\ntype CollectionReference = ReturnType<typeof firestore.collection>;\ntype Query = ReturnType<CollectionReference[\"where\"]>;\n", "import * as dateFns from \"date-fns\";\n\nexport default (input) =>\n dateFns.formatDistance(new Date(input), new Date()) + \" ago\";\n", "import chalk, { ColorSupport } from \"chalk\";\nimport * as React from \"react\";\nimport { Text, useStdout } from \"ink\";\nimport util from \"util\";\n\nconst supportsColor = chalk.stderr.supportsColor as ColorSupport;\n\nconst SyntaxHighlight = ({\n object,\n colors = supportsColor?.hasBasic,\n}: {\n object: object;\n colors?: boolean;\n}) => {\n const { stdout } = useStdout();\n\n const highlightedCode = React.useMemo(() => {\n return stdout.isTTY\n ? util.inspect(object, { colors, depth: 6 })\n : JSON.stringify(object, null, 2);\n }, [colors, object, stdout.isTTY]);\n\n return <Text wrap=\"end\">{highlightedCode}</Text>;\n};\n\nexport default SyntaxHighlight;\n", "import checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport ViewBuild from \"../components/ViewBuild\";\nimport ViewBuilds from \"../components/ViewBuilds\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\n\nconst BuildsCommand = ({\n id,\n shouldViewLatest,\n configPath = null,\n count,\n format = \"table\",\n exit,\n}: {\n id?: string;\n shouldViewLatest?: boolean;\n configPath?: string;\n count?: number;\n format?: \"table\" | \"json\";\n exit?: boolean;\n}) => {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"builds\", {\n id,\n shouldViewLatest,\n configPath,\n count,\n format,\n exit,\n });\n\n const getContents = () => {\n let commandUsed = \"todesktop builds\";\n if (id) {\n commandUsed += \" <id>\";\n return (\n <ViewBuild commandUsed={commandUsed} id={id} configPath={configPath} />\n );\n } else if (shouldViewLatest) {\n commandUsed += \" --latest\";\n return (\n <ViewBuild\n commandUsed={commandUsed}\n shouldViewLatest={true}\n configPath={configPath}\n />\n );\n } else {\n return (\n <ViewBuilds\n commandUsed={commandUsed}\n configPath={configPath}\n count={count}\n format={format}\n exit={exit}\n />\n );\n }\n };\n\n return (\n <ErrorBoundary>\n <LoginHOC>{getContents()}</LoginHOC>\n </ErrorBoundary>\n );\n};\n\nexport default BuildsCommand;\n", "import { useEffect } from \"react\";\nimport { Text } from \"ink\";\n\nimport checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport { deleteAuthConfig } from \"../utilities/configStore\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\nimport useExit from \"../utilities/useExit\";\n\nconst Logout = () => {\n const exit = useExit();\n const { hasAttemptedTracking } = useAnalyticsCommand(\"logout\");\n\n checkIfReactIsUsable();\n // delete auth config deletes the credentials stored on disk\n deleteAuthConfig();\n\n // exits the program once tracking of the \"logout\" command has been attempted\n useEffect(() => {\n if (hasAttemptedTracking) {\n exit();\n }\n }, [exit, hasAttemptedTracking]);\n\n return <Text>Log out successful</Text>;\n};\n\nconst LogoutWrapper = () => {\n return (\n <ErrorBoundary>\n <LoginHOC isInteractive={false}>\n <Logout />\n </LoginHOC>\n </ErrorBoundary>\n );\n};\n\nexport default LogoutWrapper;\n", "import { Box, Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\nimport ErrorDisplay from \"./ErrorDisplay\";\nimport LoadingText from \"./LoadingText\";\nimport SelectTable from \"./SelectTable\";\nimport { Build } from \"../types\";\nimport CliError from \"../utilities/CliError\";\nimport findAppUserId from \"../utilities/findAppUserId\";\nimport getBuilds from \"../utilities/getBuilds\";\nimport getLatestBuildId from \"../utilities/getLatestBuildId\";\nimport getLatestReleasedBuild from \"../utilities/getLatestReleasedBuild\";\nimport getRelativeDateFromDateString from \"../utilities/getRelativeDateFromDateString\";\nimport getProjectConfig from \"../utilities/projectConfig/getProjectConfig\";\nimport logger from \"../utilities/logger\";\nimport useExit from \"../utilities/useExit\";\nimport useInput from \"../utilities/useInput\";\n\nexport default function BuildPicker({\n buildFilter,\n buildId,\n children,\n commandUsed,\n configPath,\n loadData = loadPickerData,\n noBuildsDescription = null,\n question = \"Which build would you like to test?\",\n}: {\n buildFilter?: BuildFilter;\n buildId?: string;\n children: (buildId: string) => JSX.Element;\n commandUsed: string;\n configPath?: string;\n loadData?: typeof loadPickerData;\n noBuildsDescription?: string | null | JSX.Element;\n question?: string | JSX.Element;\n}) {\n const exit = useExit();\n const onInput = useInput();\n\n const isRealIdPassed = buildId && buildId !== \"latest\";\n const [state, setState] = useState({\n selectedBuildId: isRealIdPassed ? buildId : undefined,\n state: isRealIdPassed ? \"selected\" : \"loading\",\n } as PickerState);\n\n useEffect(() => {\n loadData({\n buildFilter,\n buildId,\n configPath,\n state: state.state,\n updateState,\n }).catch(logger.error);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n onInput((_, key) => {\n if (key.escape && [\"show-builds\", \"loading\"].includes(state.state)) {\n exit();\n }\n });\n\n function updateState(changes: Partial<PickerState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as PickerState)\n );\n\n if (changes.state && [\"error\", \"no-builds\"].includes(changes.state)) {\n setTimeout(() => exit(), 10);\n }\n }\n\n function onSelect(item: { value: { ID: string } }) {\n updateState({ selectedBuildId: item.value.ID, state: \"selected\" });\n }\n\n switch (state.state) {\n case \"error\":\n return <ErrorDisplay commandUsed={commandUsed} error={state.error} />;\n\n case \"loading\":\n return <LoadingText />;\n\n case \"no-builds\":\n return (\n <Box>\n <Text>No eligible builds found </Text>\n {noBuildsDescription && <Text dimColor>{noBuildsDescription}</Text>}\n </Box>\n );\n\n case \"selected\":\n return children(state.selectedBuildId) as any;\n\n case \"show-builds\":\n return (\n <>\n <Box>\n <Text>{question}</Text>\n </Box>\n <SelectTable data={state.builds} onSelect={onSelect} />\n <Box>\n <Text dimColor>\n Showing the latest {state.builds.length} unreleased successful\n builds\n </Text>\n </Box>\n </>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${(state as PickerState).state}`)}\n />\n );\n }\n}\n\nasync function loadPickerData({\n buildFilter,\n buildId,\n configPath,\n state,\n updateState,\n}: {\n buildFilter?: BuildFilter;\n buildId?: string;\n configPath?: string;\n state: PickerState[\"state\"];\n updateState: (changes: Partial<PickerState>) => void;\n}): Promise<void> {\n if (state === \"selected\") {\n return;\n }\n\n try {\n if (buildId === \"latest\") {\n const latestBuildId = await getLatestBuild({ configPath });\n if (latestBuildId) {\n updateState({ state: \"selected\", selectedBuildId: latestBuildId });\n } else {\n updateState({ state: \"no-builds\" });\n }\n } else {\n const builds = await getBuildItems({ buildFilter, configPath });\n updateState({\n builds,\n state: builds.length > 0 ? \"show-builds\" : \"no-builds\",\n });\n }\n } catch (e) {\n updateState({ error: CliError.from(e), state: \"error\" });\n }\n}\n\nasync function getLatestBuild({\n configPath,\n}: {\n configPath?: string;\n}): Promise<string | undefined> {\n const { id: appId } = getProjectConfig(configPath).config;\n const { id: userId } = await findAppUserId(appId);\n return getLatestBuildId({ appId, userId });\n}\n\nasync function getBuildItems({\n buildFilter = () => true,\n configPath,\n}: {\n buildFilter?: BuildFilter;\n configPath?: string;\n}): Promise<BuildDisplayItem[]> {\n const { id: appId } = getProjectConfig(configPath).config;\n const { id: userId, label: userName } = await findAppUserId(appId);\n const latestReleasedBuild = await getLatestReleasedBuild({ appId, userId });\n const rawBuilds = await getBuilds({\n addWhereClauses: (query) => query.where(\"status\", \"==\", \"succeeded\"),\n appId,\n limit: 50,\n userId,\n });\n\n return rawBuilds\n .filter((build) => buildFilter({ build, latestReleasedBuild }))\n .slice(0, 5)\n .map((build) => ({\n ID: build.id,\n Version: build.appVersion || \"unknown\",\n \"Creation date\": getRelativeDateFromDateString(build.createdAt),\n Owner: userName || \"unknown\",\n }));\n}\n\nexport type PickerState =\n | { state: \"loading\"; selectedBuildId?: string }\n | { state: \"no-builds\"; builds: BuildDisplayItem[] }\n | { state: \"selected\"; selectedBuildId: string }\n | { state: \"show-builds\"; builds: BuildDisplayItem[] }\n | { state: \"error\"; error: Error };\n\ninterface BuildDisplayItem {\n \"Creation date\": string;\n ID: string;\n Owner: string;\n Version: string;\n}\n\nexport type BuildFilter = (args: {\n build: Build;\n latestReleasedBuild?: Build;\n}) => boolean;\n", "import { Box } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport PropTypes from \"prop-types\";\nimport CustomSelectInputIndicator from \"./CustomSelectInputIndicator\";\nimport TableEnd from \"./TableEnd\";\nimport TableHead from \"./TableHead\";\nimport TableRow from \"./TableRow\";\nimport getKeyDetails from \"../utilities/getKeyDetails\";\n\nconst CustomIndicator = (props) => (\n <CustomSelectInputIndicator marginTop={1} {...props} />\n);\n\n/*\n This is like if <Table/> and ink-select-input had a baby.\n Read the block comment at the top of <Table/> first.\n*/\nconst SelectTable = ({ data, onSelect }) => {\n const keyDetails = getKeyDetails(data);\n\n const getSelectItems = () => {\n return data.map((rowData, index) => {\n return {\n index,\n key: index,\n value: rowData,\n };\n });\n };\n\n const ItemComponent = ({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n label, // Make it compatible to SelectInput type, not used actually\n index,\n isSelected,\n }: {\n label: string;\n index?: number;\n isSelected?: boolean;\n }) => {\n return (\n <TableRow\n data={data[index]}\n key={index}\n keyDetails={keyDetails}\n textProps={{ bold: isSelected, color: isSelected ? undefined : \"gray\" }}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\">\n <TableHead keyDetails={keyDetails} marginLeft={2} />\n <SelectInput\n indicatorComponent={CustomIndicator}\n itemComponent={ItemComponent}\n items={getSelectItems()}\n onSelect={onSelect}\n />\n <TableEnd keyDetails={keyDetails} marginLeft={2} />\n </Box>\n );\n};\n\nSelectTable.propTypes = {\n data: (props, propName, componentName) => {\n const type = typeof props.data;\n if (Array.isArray(\"array\")) {\n return new Error(\n `'data' prop must be an array ('${type}' given) in ${componentName} component`\n );\n }\n\n if (props.data.length === 0) {\n return new Error(\n `'data' prop must not be empty, in ${componentName} component`\n );\n }\n },\n onSelect: PropTypes.func,\n};\n\nexport default SelectTable;\n", "import { Build } from \"../types\";\nimport firestore from \"./firestore\";\nimport logger from \"./logger\";\n\nexport default async function getBuildById({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}): Promise<Build | null> {\n logger.debug({ appId, buildId }, \"getBuildById\");\n const snapshot = await firestore\n .doc(`users/${userId}/applications/${appId}/builds/${buildId}`)\n .get();\n\n if (!snapshot.exists) {\n return null;\n }\n\n return snapshot.data() as Build;\n}\n", "import type { Build, IApp } from \"@todesktop/shared\";\nimport firestore from \"./firestore\";\nimport getBuildById from \"./getBuildById\";\n\nexport default async function getLatestReleasedBuild({\n appId,\n userId,\n}: {\n appId: string;\n userId: string;\n}): Promise<Build | undefined> {\n const appRef = firestore.doc(`users/${userId}/applications/${appId}`);\n const appSnapshot = await appRef.get();\n const app = appSnapshot.exists ? (appSnapshot.data() as IApp) : undefined;\n\n if (!app) {\n throw new Error(`Application with ID of ${appId} doesn't exist.`);\n }\n\n if (app.meta?.latestReleaseBuildId) {\n return (\n (await getBuildById({\n buildId: app.meta?.latestReleaseBuildId,\n appId,\n userId,\n })) || undefined\n );\n }\n\n const buildsResult = await appRef\n .collection(\"builds\")\n .orderBy(\"releasedAt\", \"desc\")\n .limit(1)\n .get();\n\n return buildsResult.empty\n ? undefined\n : (buildsResult.docs[0] as unknown as Build);\n}\n", "import { useEffect, useState } from \"react\";\nimport CliError from \"../../../utilities/CliError\";\nimport getBuildAttributes from \"../../../utilities/getBuildAttributes\";\nimport logForCI from \"../../../utilities/logForCI\";\nimport logger from \"../../../utilities/logger\";\nimport releaseBuild from \"../utilities/releaseBuild\";\nimport useExit from \"../../../utilities/useExit\";\nimport { ReleaseBuildState } from \"../utilities/types\";\nimport ReleaseBuildView from \"./ReleaseBuildView\";\n\nexport default function ReleaseBuildLogic({\n buildId,\n commandUsed,\n configPath,\n}: {\n buildId: string;\n commandUsed: string;\n configPath?: string;\n}) {\n const exit = useExit();\n const [state, setState] = useState<ReleaseBuildState>({ state: \"loading\" });\n\n useEffect(() => {\n releaseBuildWorkflow({ configPath, buildId, updateState }).catch(\n logger.error\n );\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<ReleaseBuildState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as ReleaseBuildState)\n );\n if (changes.state && [\"build-error\", \"complete\"].includes(changes.state)) {\n setTimeout(() => exit(), 10);\n }\n }\n\n return <ReleaseBuildView commandUsed={commandUsed} state={state} />;\n}\n\nasync function releaseBuildWorkflow({\n buildId,\n configPath,\n updateState,\n}: {\n buildId: string;\n configPath?: string;\n updateState: (changes: Partial<ReleaseBuildState>) => void;\n}) {\n try {\n const { appId, build } = await getBuildAttributes({\n buildId,\n configPath,\n });\n updateState({ build });\n\n updateState({ state: \"releasing\" });\n await releaseBuild({ appId, buildId });\n\n logForCI(\"Released!\");\n updateState({ state: \"complete\" });\n } catch (e) {\n const error = CliError.from(e);\n updateState({ error, state: error.type });\n }\n}\n", "import { Build } from \"@todesktop/shared\";\nimport findAppUserId from \"./findAppUserId\";\nimport getBuildById from \"./getBuildById\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\nimport { currentUser } from \"./firestore\";\n\nexport default async function getBuildAttributes({\n buildId,\n configPath,\n}: {\n buildId: string;\n configPath?: string;\n}): Promise<BuildAttributes> {\n const {\n id: appId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n } = getProjectConfig(configPath).config;\n const { id: userId } = await findAppUserId(appId);\n const { uid: contextUserId } = currentUser();\n const build = await fetchBuild({ appId, buildId, userId });\n\n return {\n appId,\n build,\n buildId,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n };\n}\n\nasync function fetchBuild({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}): Promise<Build> {\n const build = await getBuildById({ appId, buildId, userId });\n if (!build) {\n throw new Error(`No such build ${buildId} for application ${appId}`);\n }\n\n return build;\n}\n\ninterface BuildAttributes {\n appId: string;\n buildId: string;\n build: Build;\n contextUserId?: string;\n nodeVersion: string;\n npmVersion: string;\n pnpmVersion: string;\n userId: string;\n}\n", "import { functions } from \"firebase\";\nimport CliError from \"../../../utilities/CliError\";\nimport getCallableFirebaseFunction from \"../../../utilities/getCallableFirebaseFunction\";\n\nexport default async function releaseBuild({\n appId,\n buildId,\n}: {\n appId: string;\n buildId: string;\n}): Promise<void> {\n try {\n await getCallableFirebaseFunction(\"releaseBuild\")({ appId, buildId });\n } catch (e) {\n if (\n isFirebaseFunctionError(e) &&\n (e.code === \"failed-precondition\" || e.code === \"not-found\")\n ) {\n throw CliError.from(e, \"build-error\");\n } else {\n throw new CliError(\"Unexpected internal error while releasing build\");\n }\n }\n}\n\nfunction isFirebaseFunctionError(\n error: unknown\n): error is functions.HttpsError {\n return Boolean(\n typeof error === \"object\" &&\n error &&\n \"code\" in error &&\n error.code === \"string\"\n );\n}\n", "import { Text } from \"ink\";\nimport BuildError from \"../../../components/BuildError\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport { ReleaseBuildState } from \"../utilities/types\";\n\nexport default function ReleaseBuildView({\n commandUsed,\n state,\n}: {\n commandUsed?: string;\n state: ReleaseBuildState;\n}) {\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't release build\"\n message={state.error?.message || \"Internal build error\"}\n />\n );\n }\n\n case \"complete\":\n return (\n <Text bold color=\"greenBright\">\n Released!\n </Text>\n );\n\n case \"error\":\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={{ stack: state.error?.stack }}\n />\n );\n\n case \"loading\":\n return <LoadingText />;\n\n case \"releasing\":\n return <LoadingText text=\"Releasing\" />;\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${state}`)}\n />\n );\n }\n}\n", "import { Box, Text } from \"ink\";\nimport Link from \"ink-link\";\nimport type { Build } from \"../types\";\n\nexport default function BuildError({\n build,\n description = \"Can't release\",\n message,\n}: {\n build: Build;\n description?: string;\n message: string;\n}) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"red\">\n {description} {build.appName} v{build.appVersion}\n </Text>\n\n <Box marginBottom={1} marginTop={1}>\n <Text>{message}</Text>\n </Box>\n\n <Text bold>See web UI for more information: </Text>\n <Text>\n <Link fallback={false} url={build.url}>\n {build.url}\n </Link>\n </Text>\n </Box>\n );\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { Text } from \"ink\";\nimport { useEffect, useState } from \"react\";\nimport BuildError from \"../../../components/BuildError\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport CliError from \"../../../utilities/CliError\";\nimport getBuildAttributes from \"../../../utilities/getBuildAttributes\";\nimport getLatestReleasedBuild from \"../../../utilities/getLatestReleasedBuild\";\nimport logger from \"../../../utilities/logger\";\nimport {\n isBuildTestable,\n makeProgress,\n} from \"../../smoke-test/utilities/build\";\nimport analyzeRelease, { AnalyzeResult } from \"../utilities/analyzeRelease\";\nimport DowngradeConfirmation from \"./DowngradeConfirmation\";\nimport YesNoConfirmation from \"./YesNoConfirmation\";\n\nexport default function ReleaseConfirmation({\n buildId,\n children,\n configPath,\n disabled = false,\n loadData = loadBuildsData,\n}: {\n buildId: string;\n configPath?: string;\n children: JSX.Element;\n disabled?: boolean;\n\n /** @internal For test */\n loadData?: typeof loadBuildsData;\n}) {\n const [state, setState] = useState<ConfirmationState>({\n state: disabled ? \"bypass\" : \"loading\",\n });\n\n useEffect(() => {\n confirmationWorkflow({\n buildId,\n configPath,\n loadData,\n state,\n updateState,\n }).catch(logger.error);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<ConfirmationState>) {\n setState(\n (previousState) => ({ ...previousState, ...changes } as ConfirmationState)\n );\n }\n\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't release build\"\n message={state.error?.message || \"Internal build error\"}\n />\n );\n }\n\n case \"bypass\":\n return children;\n\n case \"confirm-downgrade\":\n return (\n <DowngradeConfirmation\n build={state.build}\n latestReleasedBuild={state.latestReleasedBuild}\n confirmDowngrade={state.onConfirm}\n />\n );\n\n case \"confirm-release\":\n if (!state.build) {\n return <ErrorDisplay error={new Error(\"state.build is empty\")} />;\n }\n\n return (\n <YesNoConfirmation\n title={\n <>\n <Text>This will release build {state.build.id} as </Text>\n <Text bold>\n {state.build.appName} v{state.build.appVersion}\n </Text>\n <Text>, are you sure?</Text>\n </>\n }\n onYes={state.onConfirm}\n />\n );\n\n case \"confirm-test\":\n return (\n <YesNoConfirmation\n title={state.confirmationText}\n onYes={state.onConfirm}\n />\n );\n\n case \"error\":\n return <ErrorDisplay error={state.error} />;\n\n case \"loading\":\n return <LoadingText />;\n\n default:\n return (\n <ErrorDisplay\n error={\n new Error(`Unknown state ${(state as ConfirmationState).state}`)\n }\n />\n );\n }\n}\n\nasync function confirmationWorkflow({\n buildId,\n configPath,\n loadData,\n updateState,\n state,\n}: {\n buildId: string;\n configPath?: string;\n loadData: typeof loadBuildsData;\n updateState: (state: Partial<ConfirmationState>) => void;\n state: ConfirmationState;\n}) {\n try {\n const { build, latestReleasedBuild } = await loadData({\n buildId,\n configPath,\n });\n updateState({ build, latestReleasedBuild });\n\n const report = analyzeRelease({ build, latestReleasedBuild });\n if (!report.isReleasable) {\n updateState({ error: new Error(report.error), state: \"build-error\" });\n return;\n }\n\n if (state.state !== \"bypass\") {\n await confirmDowngrade({ report, updateState });\n await confirmSmokeTest({ build, updateState });\n await confirmRelease({ updateState });\n }\n\n updateState({ state: \"bypass\" });\n } catch (e) {\n updateState({ state: \"error\", error: CliError.from(e) });\n }\n}\n\nasync function confirmDowngrade({\n report,\n updateState,\n}: {\n report: AnalyzeResult;\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n if (!report.isOlderThanLatest) {\n return;\n }\n\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-downgrade\" });\n\n await downgradePromise;\n}\n\nasync function confirmSmokeTest({\n build,\n updateState,\n}: {\n build: Build;\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n const confirmationText = getTestConfirmation(build);\n if (confirmationText === \"\") {\n return;\n }\n\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-test\", confirmationText });\n\n await downgradePromise;\n}\n\nasync function confirmRelease({\n updateState,\n}: {\n updateState: (state: Partial<ConfirmationState>) => void;\n}) {\n let onConfirm;\n const downgradePromise = new Promise((r) => (onConfirm = r));\n\n updateState({ onConfirm, state: \"confirm-release\" });\n\n await downgradePromise;\n}\n\nfunction getTestConfirmation(build: Build): string {\n const continueText = \"Are you sure you want to release?\";\n\n if (!build.todesktopRuntimeVersionSpecified || !isBuildTestable(build)) {\n return \"\";\n }\n\n if (!build.smokeTest) {\n return `Smoke test hasn't been run for this build. ${continueText}`;\n }\n\n const { total } = makeProgress(build);\n\n switch (total.state) {\n case \"error\":\n return `Smoke test failed for this build. ${continueText}`;\n case \"canceled\":\n return `Smoke test was canceled for this build. ${continueText}`;\n case \"progress\":\n return `Smoke test is currently running for this build. ${continueText}`;\n default:\n return \"\";\n }\n}\n\nasync function loadBuildsData({\n buildId,\n configPath,\n}: {\n buildId: string;\n configPath?: string;\n}): Promise<{ build: Build; latestReleasedBuild?: Build }> {\n const { appId, build, userId } = await getBuildAttributes({\n buildId,\n configPath,\n });\n\n const latestReleasedBuild = await getLatestReleasedBuild({ appId, userId });\n\n return { build, latestReleasedBuild };\n}\n\ntype ConfirmationState =\n | { state: \"loading\" }\n | { state: \"bypass\" }\n | {\n state: \"confirm-downgrade\";\n build: Build;\n latestReleasedBuild: Build;\n onConfirm: () => void;\n }\n | {\n state: \"confirm-test\";\n build: Build;\n confirmationText: string;\n onConfirm: () => void;\n }\n | {\n state: \"confirm-release\";\n build: Build;\n onConfirm: () => void;\n }\n | { state: \"error\"; error: Error }\n | { state: \"build-error\"; build: Build; error: Error };\n", "import { Build, SmokeTestProgress } from \"@todesktop/shared/src/desktopify\";\nimport semver from \"semver\";\nimport CliError from \"../../../utilities/CliError\";\n\nconst MIN_RUNTIME_VERSION = \"1.2.1-1\";\n\nexport function isBuildTestable(build: Partial<Build>): boolean {\n try {\n validateBuild(build);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function isTestRunning(build: Build): boolean {\n if (!build.smokeTest) {\n return false;\n }\n\n const { isFinished } = makeProgress(build);\n return !isFinished;\n}\n\nexport const defaultVM = {\n cpu: \"\",\n agentVersion: \"\",\n image: \"\",\n imageVersion: \"\",\n};\n\nexport function makeProgress(build: Build): CliTestProgress {\n const defaultProgress: OsTestProgress = {\n message: \"Starting\",\n progress: 0,\n state: \"progress\",\n shouldSkip: false,\n vm: defaultVM,\n };\n\n const linux: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.linux,\n shouldSkip: build.linux?.shouldSkip || false,\n };\n const mac: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.mac,\n shouldSkip: build.mac?.shouldSkip || false,\n };\n const windows: OsTestProgress = {\n ...defaultProgress,\n ...build.smokeTest?.windows,\n shouldSkip: build.windows?.shouldSkip || false,\n };\n\n const platforms: OsTestProgress[] = [linux, mac, windows].filter(\n (p) => !p.shouldSkip && p.state !== \"skipped\"\n );\n\n const isCanceled = Boolean(build.smokeTest?.isCanceled);\n const isFinished =\n isCanceled || platforms.every((p) => p.state !== \"progress\");\n\n let totalState: TotalTestProgress[\"state\"] = \"progress\";\n if (isCanceled) {\n totalState = \"canceled\";\n } else if (platforms.every((p) => p.state === \"done\")) {\n totalState = \"done\";\n } else if (isFinished && platforms.some((p) => p.state === \"error\")) {\n totalState = \"error\";\n }\n\n return {\n isFinished,\n linux,\n mac,\n windows,\n total: {\n error: platforms\n .filter((p) => p.state === \"error\")\n .map((p) => p.message)\n .join(\"\\n\\n\"),\n state: totalState,\n },\n };\n}\n\nexport function validateBuild(build: Partial<Build>) {\n if (build.status !== \"succeeded\") {\n throw new CliError(\n `The build must be completed successfully. ` +\n `Actual build status: ${build.status}`\n );\n }\n\n if (!build.todesktopRuntimeVersionSpecified) {\n throw new CliError(\n \"The build has no todesktopRuntimeVersionSpecified set. \" +\n \"Please make sure @todesktop/runtime is installed as a dependency \" +\n \"and make a new build\"\n );\n }\n\n if (!isRuntimeVerRangeAllowed(build.todesktopRuntimeVersionSpecified)) {\n throw new CliError(\n `This build should have @todesktop/runtime version ${MIN_RUNTIME_VERSION} or later to run smoke tests.`\n );\n }\n}\n\nfunction isRuntimeVerRangeAllowed(runtimeVerRange) {\n const minRuntimeVersionForApp = semver.minVersion(runtimeVerRange, {\n loose: true,\n });\n\n return semver.gte(minRuntimeVersionForApp, MIN_RUNTIME_VERSION, {\n loose: true,\n });\n}\n\nexport interface CliTestProgress {\n isFinished: boolean;\n linux: OsTestProgress;\n mac: OsTestProgress;\n windows: OsTestProgress;\n total: TotalTestProgress;\n}\n\nexport interface OsTestProgress extends SmokeTestProgress {\n shouldSkip?: boolean;\n}\n\nexport interface TotalTestProgress {\n error: string;\n state: \"progress\" | \"done\" | \"error\" | \"canceled\";\n}\n", "import type { Build } from \"@todesktop/shared\";\nimport semver from \"semver\";\n\nexport const MIN_RUNTIME_VERSION_FOR_DOWNGRADE = \"1.4.1-1\";\n\nexport default function analyzeRelease({\n build,\n latestReleasedBuild,\n}: {\n build: Build;\n latestReleasedBuild?: Build;\n}): AnalyzeResult {\n const result: AnalyzeResult = {\n downgradeAllowed: Boolean(\n latestReleasedBuild?.todesktopRuntimeVersionUsed &&\n semver.gte(\n latestReleasedBuild.todesktopRuntimeVersionUsed,\n MIN_RUNTIME_VERSION_FOR_DOWNGRADE\n )\n ),\n error: \"\",\n isAlreadyReleased: Boolean(build.releasedAt),\n isAlreadyTheLatest: build.id === latestReleasedBuild?.id,\n isOlderThanLatest: Boolean(\n latestReleasedBuild &&\n latestReleasedBuild.appVersion &&\n build.appVersion &&\n semver.gt(latestReleasedBuild.appVersion, build.appVersion)\n ),\n isReleasable: false,\n isSucceeded: build.status === \"succeeded\",\n isTheSameVersionAsLatest: Boolean(\n build.appVersion && build.appVersion === latestReleasedBuild?.appVersion\n ),\n };\n\n if (!result.isSucceeded) {\n return {\n ...result,\n error:\n \"The build must have completed successfully. \" +\n `Actual build status: ${build.status}.`,\n };\n }\n\n if (result.isAlreadyTheLatest) {\n return {\n ...result,\n error: \"This build is already the latest released build.\",\n };\n }\n\n if (result.isTheSameVersionAsLatest) {\n return {\n ...result,\n error:\n `This build has the same version as the latest released build ` +\n `(build ID: ${latestReleasedBuild?.id}, version: ${build.appVersion}).`,\n };\n }\n\n if (!result.downgradeAllowed && result.isAlreadyReleased) {\n return { ...result, error: \"This build has already been released.\" };\n }\n\n if (\n !result.downgradeAllowed &&\n result.isOlderThanLatest &&\n latestReleasedBuild\n ) {\n return {\n ...result,\n error:\n `App version (${build.appVersion}) is not newer than latest released ` +\n `version (${latestReleasedBuild.appVersion}) ` +\n `(build ID: ${latestReleasedBuild.id}).`,\n };\n }\n\n return { ...result, isReleasable: true };\n}\n\nexport interface AnalyzeResult {\n downgradeAllowed: boolean;\n error: string;\n isAlreadyReleased: boolean;\n isAlreadyTheLatest: boolean;\n isOlderThanLatest: boolean;\n isReleasable: boolean;\n isSucceeded: boolean;\n isTheSameVersionAsLatest: boolean;\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { Box, Text } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { useState } from \"react\";\nimport { MIN_RUNTIME_VERSION_FOR_DOWNGRADE } from \"../utilities/analyzeRelease\";\n\nexport default function DowngradeConfirmation({\n build,\n latestReleasedBuild,\n confirmDowngrade,\n}: {\n build: Build;\n latestReleasedBuild: Build;\n confirmDowngrade: () => void;\n}) {\n const [confirmText, setConfirmText] = useState(\"\");\n const [showError, setShowError] = useState(false);\n\n const buildVersion = build.appVersion;\n const latestVersion = latestReleasedBuild.appVersion;\n\n function onType(text: string) {\n setShowError(false);\n setConfirmText(text);\n }\n\n function onSubmit(text: string) {\n if (text.trim() === buildVersion) {\n confirmDowngrade();\n } else {\n setShowError(true);\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box borderColor=\"red\" borderStyle=\"double\" paddingX={1}>\n <Text>\n You're trying to release the build {buildVersion}, which is older than\n the latest published version {latestVersion}. This may cause issues if\n your customers are using a version of your desktop app that contains a\n version of @todesktop/runtime that is earlier than v\n {MIN_RUNTIME_VERSION_FOR_DOWNGRADE}.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>Are you sure that you wish to release this build?</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text>\n To continue, type the text <Text bold>{buildVersion}</Text> below to\n confirm:\n </Text>\n </Box>\n\n <Box>\n <Box marginRight={1}>\n <Text>Confirm new version:</Text>\n </Box>\n\n <TextInput value={confirmText} onChange={onType} onSubmit={onSubmit} />\n </Box>\n\n {showError && (\n <Box>\n <Text color=\"red\">You've entered the wrong version</Text>\n </Box>\n )}\n </Box>\n );\n}\n", "import { Box, Text } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport CustomSelectInputIndicator from \"../../../components/CustomSelectInputIndicator\";\nimport CustomSelectInputItem from \"../../../components/CustomSelectInputItem\";\nimport useExit from \"../../../utilities/useExit\";\n\nexport default function YesNoConfirmation({\n onYes,\n title,\n footer = \"Your users will be auto-updated to this version. You can use \" +\n \"--force to bypass this confirmation in future\",\n}: {\n onYes: () => void;\n title: string | JSX.Element;\n footer?: string;\n}) {\n const exit = useExit();\n\n const items = [\n { label: \"Yes\", value: \"yes\" },\n { label: \"No\", value: \"no\" },\n ];\n\n function onSelect(item: { value: string }) {\n if (item.value === \"yes\") {\n onYes();\n } else if (item.value === \"no\") {\n setTimeout(() => exit(), 10);\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box>{typeof title === \"string\" ? <Text>{title}</Text> : title}</Box>\n\n <Box marginBottom={1} marginTop={1}>\n <SelectInput\n indicatorComponent={CustomSelectInputIndicator}\n initialIndex={1}\n itemComponent={CustomSelectInputItem}\n items={items}\n onSelect={onSelect}\n />\n </Box>\n\n <Text dimColor>{footer}</Text>\n </Box>\n );\n}\n", "import { Build } from \"@todesktop/shared\";\nimport BuildPicker from \"../../components/BuildPicker\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\nimport ReleaseBuildLogic from \"./components/ReleaseBuildLogic\";\nimport ReleaseConfirmation from \"./components/ReleaseConfirmation\";\nimport analyzeRelease from \"./utilities/analyzeRelease\";\n\nexport default function ReleaseCommand({\n buildId,\n configPath,\n shouldConfirm,\n}: {\n buildId: string;\n configPath?: string;\n shouldConfirm: boolean;\n}) {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"release\", {\n buildId,\n shouldConfirm,\n config: configPath,\n });\n\n let command = \"todesktop release\";\n if (buildId) {\n command += \" \" + (buildId === \"latest\" ? \"--latest\" : \"<id>\");\n }\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <BuildPicker\n buildFilter={isBuildReleasable}\n buildId={buildId}\n commandUsed={command}\n configPath={configPath}\n noBuildsDescription=\"(i.e. unreleased and successful)\"\n question=\"Which build would you like to release?\"\n >\n {(id) => (\n <ReleaseConfirmation\n buildId={id}\n configPath={configPath}\n disabled={!shouldConfirm}\n >\n <ReleaseBuildLogic\n buildId={id}\n commandUsed={command}\n configPath={configPath}\n />\n </ReleaseConfirmation>\n )}\n </BuildPicker>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n\nfunction isBuildReleasable(opts: {\n build: Build;\n latestReleasedBuild?: Build;\n}) {\n return analyzeRelease(opts).isReleasable;\n}\n", "import { Build } from \"@todesktop/shared\";\nimport { useEffect, useState } from \"react\";\nimport ErrorBoundary from \"../../components/ErrorBoundary\";\nimport LoginHOC from \"../../components/LoginHOC\";\nimport checkIfReactIsUsable from \"../../utilities/checkIfReactIsUsable\";\nimport CliError from \"../../utilities/CliError\";\nimport getBuildAttributes from \"../../utilities/getBuildAttributes\";\nimport logger from \"../../utilities/logger\";\nimport { useAnalyticsCommand } from \"../../utilities/useAnalytics\";\nimport useExit from \"../../utilities/useExit\";\nimport BuildPicker from \"../../components/BuildPicker\";\nimport Cancellation from \"./components/Cancellation\";\nimport SmokeTestView from \"./components/SmokeTestView\";\nimport {\n isBuildTestable,\n isTestRunning,\n TotalTestProgress,\n validateBuild,\n} from \"./utilities/build\";\nimport cancelSmokeTest from \"./utilities/cancelSmokeTest\";\nimport queueSmokeTest from \"./utilities/queueSmokeTest\";\nimport SmokeState from \"./utilities/SmokeState\";\n\nimport waitUntilFinished from \"./utilities/waitUntilFinished\";\n\nexport default function SmokeTestCommand({\n buildId,\n configPath,\n}: {\n buildId?: string;\n configPath?: string;\n}) {\n checkIfReactIsUsable();\n useAnalyticsCommand(\"smoke-test\", { buildId, configPath });\n\n const command = `todesktop release ${\n buildId === \"latest\" ? \"--latest\" : \"<id>\"\n }`;\n\n return (\n <ErrorBoundary>\n <LoginHOC>\n <BuildPicker\n buildFilter={({ build }) => isBuildTestable(build)}\n buildId={buildId}\n commandUsed={command}\n configPath={configPath}\n noBuildsDescription=\"(candidates for smoke-test must be built with @todesktop/runtime@1.2.1 or later)\"\n >\n {(id) => (\n <SmokeTestContainer\n commandUsed={command}\n buildId={id}\n configPath={configPath}\n />\n )}\n </BuildPicker>\n </LoginHOC>\n </ErrorBoundary>\n );\n}\n\nfunction SmokeTestContainer({\n buildId,\n commandUsed,\n configPath,\n}: {\n buildId: string;\n commandUsed: string;\n configPath?: string;\n}) {\n const exit = useExit();\n const [state, setState] = useState<SmokeState>({\n buildId,\n state: \"loading\",\n });\n const [abortController] = useState(new AbortController());\n const abortSignal = abortController.signal;\n\n useEffect(() => {\n smokeTestWorkflow({ abortSignal, buildId, configPath, updateState }).catch(\n logger.error\n );\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function updateState(changes: Partial<SmokeState>) {\n setState((previousState) => ({ ...previousState, ...changes }));\n if (\n changes.state &&\n [\"build-error\", \"complete\", \"progress-error\"].includes(changes.state)\n ) {\n setTimeout(() => exit(), 10);\n }\n }\n\n async function onCancel() {\n abortController.abort();\n if (state.state === \"progress\" && buildCanBeCanceled(state.build)) {\n await cancelSmokeTest(state as Required<SmokeState>);\n }\n }\n\n return (\n <Cancellation\n disabled={!isCancelable(state)}\n onCancel={onCancel}\n subject=\"smoke test\"\n >\n <SmokeTestView commandUsed={commandUsed} state={state} />\n </Cancellation>\n );\n}\n\nasync function smokeTestWorkflow({\n abortSignal,\n buildId,\n configPath,\n updateState,\n}: {\n abortSignal: AbortSignal;\n buildId: string;\n configPath?: string;\n updateState: (changes: Partial<SmokeState>) => void;\n}) {\n try {\n const {\n appId,\n build,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n } = await getBuildAttributes({\n buildId,\n configPath,\n });\n\n updateState({ appId, build, userId });\n validateBuild(build);\n\n if (!abortSignal.aborted && !isTestRunning(build)) {\n await queueSmokeTest({\n appId,\n buildId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n contextUserId,\n });\n }\n\n updateState({ state: \"progress\" });\n const { total } = await waitUntilFinished({\n appId,\n buildId,\n userId,\n onProgress: (progress) => updateState({ progress }),\n });\n\n const stateMap: Record<TotalTestProgress[\"state\"], SmokeState[\"state\"]> = {\n done: \"complete\",\n progress: \"complete\", // Not actually used, just for TS\n error: \"progress-error\",\n canceled: \"canceled\",\n };\n updateState({ state: stateMap[total.state] });\n } catch (e) {\n const error = CliError.from(e);\n updateState({ error, state: error.type });\n }\n}\n\nfunction buildCanBeCanceled(build?: Build) {\n if (build?.smokeTest?.isCanceled) {\n return false;\n }\n\n return Boolean(build?.smokeTest?.buildServerExecutionId);\n}\n\nfunction isCancelable(state: SmokeState) {\n const cancelableStates: Array<SmokeState[\"state\"]> = [\"loading\", \"progress\"];\n return cancelableStates.includes(state.state);\n}\n", "import { Box, Text } from \"ink\";\nimport { useState } from \"react\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport logger from \"../../../utilities/logger\";\nimport useExit from \"../../../utilities/useExit\";\nimport useInput from \"../../../utilities/useInput\";\n\nexport default function Cancellation({\n children,\n disabled = false,\n exitWhenCanceled = true,\n onCancel,\n renderCanceling = () => <LoadingText text={`Canceling ${subject}`} />,\n renderCanceled = () => <Text>{upperCaseFirstChar(subject)} canceled.</Text>,\n renderCancelText = () => (\n <Text color=\"gray\">\n <Text bold>[esc]:</Text> cancel {subject}\n </Text>\n ),\n renderError = (e: Error) => <ErrorDisplay error={e} />,\n subject,\n}: {\n children?: JSX.Element;\n disabled?: boolean;\n exitWhenCanceled?: boolean;\n onCancel: () => Promise<any>;\n renderCanceled?: () => JSX.Element;\n renderCanceling?: () => JSX.Element;\n renderCancelText?: () => JSX.Element;\n renderError?: (e: Error) => JSX.Element;\n subject: string;\n}) {\n const [state, setState] = useState<CancellationState>(\"normal\");\n const [error, setError] = useState<Error>();\n\n const onInput = useInput();\n const exit = useExit();\n\n onInput(async (input, key) => {\n if (key.escape) {\n cancel();\n }\n });\n\n function cancel() {\n if (disabled) {\n return;\n }\n\n logger.debug(`esc pressed, cancelling ${subject}`);\n setState(\"cancelling\");\n\n onCancel()\n .then(() => {\n setState(\"cancelled\");\n if (exitWhenCanceled) {\n setTimeout(() => exit(), 10);\n }\n })\n .catch((e) => {\n setError(e);\n setState(\"error\");\n });\n }\n\n switch (state) {\n case \"cancelled\":\n return renderCanceled();\n case \"cancelling\":\n return renderCanceling();\n case \"error\":\n return renderError(error);\n default:\n return (\n <>\n {children}\n {!disabled && <Box>{renderCancelText()}</Box>}\n </>\n );\n }\n}\n\ntype CancellationState = \"normal\" | \"cancelling\" | \"cancelled\" | \"error\";\n\nfunction upperCaseFirstChar(str: string): string {\n return str[0].toUpperCase() + str.slice(1);\n}\n", "import { Text } from \"ink\";\nimport ErrorDisplay from \"../../../components/ErrorDisplay\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport SmokeState from \"../utilities/SmokeState\";\nimport BuildError from \"../../../components/BuildError\";\nimport TestProgress from \"./TestProgress\";\n\nexport default function SmokeTestView({\n commandUsed = \"\",\n state,\n}: {\n commandUsed?: string;\n state: SmokeState;\n}) {\n switch (state.state) {\n case \"build-error\": {\n return (\n <BuildError\n build={state.build}\n description=\"Can't finish smoke test\"\n message={state.error?.message}\n />\n );\n }\n\n case \"canceled\":\n return <Text>Smoke test canceled.</Text>;\n\n case \"complete\":\n return (\n <Text bold color=\"greenBright\">\n Smoke test passed.\n </Text>\n );\n\n case \"error\":\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={{ stack: state.error?.stack }}\n />\n );\n\n case \"loading\":\n return <LoadingText text=\"Preparing smoke test\" />;\n\n case \"progress\":\n return <TestProgress progress={state.progress} />;\n\n case \"progress-error\":\n return (\n <>\n <TestProgress progress={state.progress} />\n <BuildError\n build={state.build}\n description=\"Can't finish smoke test\"\n message={state.progress?.total?.error}\n />\n </>\n );\n\n default:\n return (\n <ErrorDisplay\n commandUsed={commandUsed}\n error={new Error(`Unknown state ${state}`)}\n />\n );\n }\n}\n", "import { ForegroundColor } from \"chalk\";\nimport { Box, Text } from \"ink\";\n\nexport default function ProgressBar({\n color = \"white\",\n label,\n labelWidth = 9,\n marginBottom = 1,\n progress,\n text = \"\",\n}: {\n color?: typeof ForegroundColor;\n label: string;\n labelWidth?: number;\n marginBottom?: number;\n progress: number;\n text?: string;\n}) {\n const percentage =\n progress > 0 ? Math.round(progress).toString().padStart(2, \"0\") + \"%\" : \"\";\n\n const displayedText = (text || \"\")\n .replace(/(?:\\r\\n|\\r|\\n)\\s*/g, \"\u21B5 \")\n .replace(/(.{63}).+/, \"$1\u2026\");\n\n return (\n <Box marginBottom={marginBottom}>\n <Box width={labelWidth}>\n <Text>{label}:</Text>\n </Box>\n <Box width={6} justifyContent=\"flex-end\" marginRight={1}>\n {Boolean(percentage) && (\n <Text backgroundColor={color} color=\"black\">\n {` ${percentage} `}\n </Text>\n )}\n </Box>\n <Box>\n <Text>{displayedText}</Text>\n </Box>\n </Box>\n );\n}\n", "import { ForegroundColor } from \"chalk\";\nimport LoadingText from \"../../../components/LoadingText\";\nimport { CliTestProgress, OsTestProgress } from \"../utilities/build\";\nimport ProgressBar from \"./ProgressBar\";\n\nexport default function TestProgress({\n progress,\n}: {\n progress?: CliTestProgress;\n}) {\n if (!progress) {\n return <LoadingText text=\"Loading test stats\" />;\n }\n\n return (\n <>\n {!progress.windows.shouldSkip && (\n <OsProgress os=\"Windows\" progress={progress.windows} />\n )}\n {!progress.mac.shouldSkip && (\n <OsProgress os=\"macOS\" progress={progress.mac} />\n )}\n {!progress.linux.shouldSkip && (\n <OsProgress os=\"Linux\" progress={progress.linux} />\n )}\n </>\n );\n}\n\nfunction OsProgress({\n os,\n progress,\n}: {\n os: string;\n progress: OsTestProgress;\n}) {\n const colors: Record<OsTestProgress[\"state\"], typeof ForegroundColor> = {\n progress: \"white\",\n error: \"red\",\n done: \"green\",\n skipped: \"yellow\", // Not used actually, just for type matching\n };\n const text = progress.message + (progress.state === \"progress\" ? \"...\" : \"\");\n\n return (\n <ProgressBar\n color={colors[progress.state]}\n label={os}\n progress={progress.progress}\n text={text}\n />\n );\n}\n", "import postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\nexport default async function cancelSmokeTest({\n appId,\n buildId,\n userId,\n}: {\n appId: string;\n buildId: string;\n userId: string;\n}) {\n await postToFirebaseFunction(\"cancelSmokeTest_HTTP\", {\n appId,\n buildId,\n userId,\n });\n}\n", "import CliError from \"../../../utilities/CliError\";\nimport { currentUser } from \"../../../utilities/firestore\";\nimport logger from \"../../../utilities/logger\";\nimport postToFirebaseFunction from \"../../../utilities/postToFirebaseFunction\";\n\nexport default async function queueSmokeTest({\n appId,\n buildId,\n contextUserId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n}: {\n appId: string;\n buildId: string;\n contextUserId?: string;\n nodeVersion: string;\n npmVersion: string;\n pnpmVersion: string;\n userId: string;\n}) {\n try {\n await postToFirebaseFunction(\"queueSmokeTest_HTTP\", {\n appId,\n buildId,\n nodeVersion,\n npmVersion,\n pnpmVersion,\n userId,\n contextUserId,\n idToken: await currentUser()?.getIdToken(),\n });\n } catch (e) {\n logger.error({ error: e });\n throw new CliError(`Unexpected internal error while testing build`);\n }\n}\n", "import { Build } from \"@todesktop/shared\";\nimport firestore from \"../../../utilities/firestore\";\nimport { makeProgress, CliTestProgress } from \"./build\";\n\nexport default async function waitUntilFinished({\n appId,\n buildId,\n onProgress,\n userId,\n}: {\n appId: string;\n buildId: string;\n onProgress: (progress: CliTestProgress) => void;\n userId: string;\n}) {\n const docPath = `users/${userId}/applications/${appId}/builds/${buildId}`;\n\n return new Promise<CliTestProgress>((resolve, reject) => {\n const unsubscribe = firestore.doc(docPath).onSnapshot(\n (snapshot) => {\n const data = snapshot.exists ? snapshot.data() : undefined;\n const progress = makeProgress(data as Build);\n\n onProgress(progress);\n\n if (progress.isFinished) {\n unsubscribe();\n resolve(progress);\n }\n },\n (err) => {\n unsubscribe();\n reject(err);\n }\n );\n });\n}\n", "import { useEffect } from \"react\";\nimport { Text } from \"ink\";\n\nimport checkIfReactIsUsable from \"../utilities/checkIfReactIsUsable\";\nimport { getAuthConfig } from \"../utilities/configStore\";\nimport ErrorBoundary from \"../components/ErrorBoundary\";\nimport LoginHOC from \"../components/LoginHOC\";\nimport { useAnalyticsCommand } from \"../utilities/useAnalytics\";\nimport useExit from \"../utilities/useExit\";\n\nconst WhoAmI = () => {\n const exit = useExit();\n checkIfReactIsUsable();\n const auth = getAuthConfig();\n const { hasAttemptedTracking } = useAnalyticsCommand(\"whoami\", {}, {});\n\n // exits the program once tracking of the \"whoami\" command has been attempted\n useEffect(() => {\n if (hasAttemptedTracking) {\n exit();\n }\n }, [exit, hasAttemptedTracking]);\n\n if (!auth || !auth.email) {\n return <Text>{\"You're not signed in\"}</Text>;\n }\n return <Text>{auth.email}</Text>;\n};\n\nconst WhoAmIWrapper = () => (\n <ErrorBoundary>\n <LoginHOC isInteractive={false}>\n <WhoAmI />\n </LoginHOC>\n </ErrorBoundary>\n);\n\nexport default WhoAmIWrapper;\n", "import chalk from \"chalk\";\nimport isInstalledGlobally from \"is-installed-globally\";\nimport latestVersion from \"latest-version\";\nimport semver from \"semver\";\nimport getToDesktopPackageJson from \"./getToDesktopPackageJson\";\n\nexport default () => {\n // Ignore during tests\n if (process.env.AVA_PATH) {\n return;\n }\n\n const pkg = getToDesktopPackageJson();\n latestVersion(pkg.name).then((latest) => {\n if (semver.gt(latest, pkg.version)) {\n const commandToUpdate = chalk.greenBright(\n `npm install ${\n isInstalledGlobally ? \"--location=global\" : \"--save-dev\"\n } @todesktop/cli`\n );\n console.log(\n `Your version of @todesktop/cli is out of date.\\nRun ${commandToUpdate} to update to v${latest}.`\n );\n if (!semver.satisfies(latest, `^${pkg.version}`)) {\n console.log(`CLI is exiting because it is out out of date.`);\n process.exit(1);\n }\n }\n });\n};\n", "import * as Sentry from \"@sentry/node\";\nimport os from \"os\";\nimport pkgJson from \"../../package.json\";\nimport { getAuthConfig } from \"./configStore\";\nimport getProjectConfig from \"./projectConfig/getProjectConfig\";\nimport getEnvironmentVariables from \"./getEnvironmentVariables\";\n\nexport default () => {\n const { TODESKTOP_CLI_SENTRY_DSN } = getEnvironmentVariables();\n if (!TODESKTOP_CLI_SENTRY_DSN) {\n // Don't initialise Sentry\n return;\n }\n Sentry.init({\n dsn: TODESKTOP_CLI_SENTRY_DSN,\n });\n\n const scope = Sentry.getCurrentScope();\n try {\n scope.setUser({ email: getAuthConfig().email as string });\n } catch (err) {\n // nothing\n }\n try {\n scope.setContext(\"os\", {\n name: os.platform(),\n version: os.release(),\n });\n } catch (err) {\n // nothing\n }\n\n try {\n scope.setContext(\"runtime\", {\n name: \"Node.js\",\n version: process.version,\n });\n } catch (err) {\n // nothing\n }\n\n try {\n scope.setContext(\"app\", {\n app_name: pkgJson.name,\n app_version: pkgJson.version,\n });\n } catch (err) {\n // nothing\n }\n\n try {\n const configResult = getProjectConfig();\n scope.setExtra(\"config\", configResult);\n } catch (err) {\n // nothing\n }\n};\n", "import exitIfCLIOutOfDate from \"./exitIfCLIOutOfDate\";\nimport initSentry from \"./initSentry\";\n\nexport default ({ sentry = true, exitIfOutOfDate = true } = {}) => {\n if (sentry) {\n initSentry();\n }\n\n if (exitIfOutOfDate) {\n exitIfCLIOutOfDate();\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_ink", "import_react", "import_ink", "import_react", "import_ink", "import_prop_types", "import_react", "import_ink", "bunyan", "args", "isCi", "dotenv", "path", "firebase", "fs", "Conf", "xdgBasedir", "del", "pkgUp", "environmentVariables", "Analytics", "os", "uuidv4", "resolve", "Link", "PropTypes", "import_prop_types", "import_ink", "import_ink_link", "import_jsx_runtime", "Link", "PropTypes", "import_jsx_runtime", "throttle", "PropTypes", "import_ink", "import_react", "message", "import_jsx_runtime", "import_ink", "import_is_ci", "import_react", "import_ink", "import_react", "firebase", "import_jsx_runtime", "import_ink", "import_ink_link", "import_prop_types", "import_jsx_runtime", "Link", "PropTypes", "import_ink", "import_prop_types", "import_jsx_runtime", "PropTypes", "import_is_ci", "import_ink", "isCi", "import_jsx_runtime", "isCi", "import_ink", "import_prop_types", "import_ink", "import_jsx_runtime", "import_jsx_runtime", "Gradient", "PropTypes", "import_prop_types", "import_jsx_runtime", "PropTypes", "import_axios", "config", "axios", "import_path", "path", "config", "import_ajv", "import_ajv_formats", "import_better_ajv_errors", "import_ajv", "fs", "path", "Ajv", "addFormats", "betterAjvErrors", "semverValidRange", "emailRegex", "parseAuthor", "config", "Ajv", "addFormats", "betterAjvErrors", "import_path", "import_lodash", "merge", "findUp", "config", "import_lodash", "import_path", "config", "path", "merge", "EventEmitter", "resolve", "fs", "path", "resolve", "streamToArray", "superagent", "import_fs", "import_path", "archiver", "fs", "du", "chalk", "path", "fastGlob", "config", "fs", "config", "build", "prettyBytes", "message", "axios", "import_jsx_runtime", "_a", "import_react", "import_ink", "import_react", "import_prop_types", "import_is_ci", "import_ink", "import_prop_types", "import_react", "import_react", "import_jsx_runtime", "React", "InkTextInput", "import_jsx_runtime", "message", "Error", "PropTypes", "import_ink", "import_jsx_runtime", "import_jsx_runtime", "message", "isCi", "PropTypes", "import_react", "Sentry", "React", "import_ink", "import_prop_types", "import_react", "import_ink", "import_jsx_runtime", "import_ink", "import_jsx_runtime", "import_ink", "import_prop_types", "import_react", "resolve", "import_jsx_runtime", "error", "config", "PropTypes", "import_is_ci", "import_jsx_runtime", "isCi", "itemChosen", "SelectInput", "PropTypes", "import_react", "import_jsx_runtime", "import_ink", "import_prop_types", "import_react", "import_ink", "import_prop_types", "import_ink", "import_prop_types", "import_jsx_runtime", "PropTypes", "import_ink", "import_prop_types", "import_react", "import_jsx_runtime", "PropTypes", "import_prop_types", "import_ink", "import_prop_types", "import_jsx_runtime", "PropTypes", "import_jsx_runtime", "PropTypes", "import_jsx_runtime", "PropTypes", "import_chalk", "React", "import_ink", "import_jsx_runtime", "chalk", "util", "import_jsx_runtime", "config", "user", "builds", "PropTypes", "import_jsx_runtime", "import_react", "import_ink", "import_jsx_runtime", "import_ink", "import_react", "import_ink", "import_ink_select_input", "import_prop_types", "import_jsx_runtime", "SelectInput", "PropTypes", "import_jsx_runtime", "import_react", "import_ink", "import_ink", "import_ink_link", "import_jsx_runtime", "message", "Link", "import_jsx_runtime", "import_jsx_runtime", "import_ink", "import_react", "semver", "import_semver", "semver", "import_ink", "import_ink_text_input", "import_react", "import_jsx_runtime", "confirmDowngrade", "latestVersion", "TextInput", "import_ink", "import_ink_select_input", "import_jsx_runtime", "SelectInput", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_ink", "import_react", "import_jsx_runtime", "import_ink", "import_ink", "import_jsx_runtime", "ProgressBar", "import_jsx_runtime", "os", "ProgressBar", "import_jsx_runtime", "resolve", "import_jsx_runtime", "import_react", "import_ink", "import_jsx_runtime", "import_chalk", "import_semver", "latestVersion", "semver", "chalk", "isInstalledGlobally", "Sentry", "import_os", "os", "config"]
7
7
  }