apify-cli 1.2.2-beta.6 → 1.2.2-beta.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entrypoints/_shared.ts","../src/lib/command-framework/apify-command.ts","../src/lib/utils/cliDebugPrint.ts","../src/lib/hooks/useCLIMetadata.ts","../src/lib/outputs.ts","../src/lib/hooks/telemetry/useTelemetryState.ts","../src/lib/consts.ts","../package.json","../src/lib/utils.ts","../src/lib/files.ts","../src/lib/hooks/telemetry/useTelemetryEnabled.ts","../src/lib/hooks/telemetry/useTelemetryIdentifiers.ts","../src/lib/hooks/telemetry/trackEvent.ts","../src/lib/hooks/useCwdProject.ts","../src/lib/projects/scrapy/ScrapyProjectAnalyzer.ts","../src/lib/hooks/user-confirmations/useUserInput.ts","../src/lib/hooks/user-confirmations/_stdinCheckWrapper.ts","../src/lib/hooks/useStdin.ts","../src/lib/projects/scrapy/SpiderFileAnalyzer.ts","../src/lib/projects/scrapy/Spider.ts","../src/lib/hooks/runtimes/javascript.ts","../src/lib/hooks/runtimes/utils.ts","../src/lib/hooks/runtimes/python.ts","../src/lib/command-framework/CommandError.ts","../src/lib/command-framework/help.ts","../src/lib/command-framework/help/CommandHelp.ts","../src/lib/command-framework/help/_BaseCommandRenderer.ts","../src/lib/command-framework/help/consts.ts","../src/lib/command-framework/help/CommandWithSubcommands.ts","../src/lib/commands/read-stdin.ts","../src/lib/hooks/useCLIVersionCheck.ts","../src/lib/hooks/useLocalState.ts","../src/lib/hooks/useCommandSuggestions.ts","../src/commands/actor/calculate-memory.ts","../src/lib/command-framework/flags.ts","../src/lib/hooks/useActorConfig.ts","../src/lib/utils/inquirer/confirmImpl.ts","../src/lib/hooks/user-confirmations/useYesNoConfirm.ts","../src/commands/actor/charge.ts","../src/lib/actor.ts","../src/lib/command-framework/args.ts","../src/commands/actor/get-input.ts","../src/commands/actor/get-public-url.ts","../src/commands/actor/get-value.ts","../src/commands/actor/push-data.ts","../src/commands/actor/set-value.ts","../src/commands/actor/_index.ts","../src/commands/builds/create.ts","../src/lib/commands/resolve-actor-context.ts","../src/commands/actors/build.ts","../src/commands/actors/call.ts","../src/lib/commands/resolve-input.ts","../src/lib/commands/run-on-cloud.ts","../src/commands/actors/info.ts","../src/lib/commands/responsive-table.ts","../src/commands/actors/ls.ts","../src/lib/commands/pretty-print-status.ts","../src/commands/actors/pull.ts","../src/commands/actors/push.ts","../src/lib/secrets.ts","../src/commands/actors/rm.ts","../src/commands/actors/start.ts","../src/commands/actors/_index.ts","../src/commands/builds/info.ts","../src/lib/commands/pretty-print-bytes.ts","../src/commands/builds/log.ts","../src/commands/builds/ls.ts","../src/lib/hooks/user-confirmations/useInputConfirmation.ts","../src/commands/builds/rm.ts","../src/commands/builds/_index.ts","../src/commands/call.ts","../src/commands/cli-management/install.ts","../src/commands/cli-management/upgrade.ts","../src/lib/exec.ts","../src/lib/hooks/useCLIVersionAssets.ts","../src/commands/create.ts","../src/lib/create-utils.ts","../src/lib/hooks/user-confirmations/useSelectFromList.ts","../src/lib/input_schema.ts","../src/commands/datasets/create.ts","../src/lib/commands/storages.ts","../src/commands/datasets/get-items.ts","../src/commands/datasets/info.ts","../src/lib/commands/storage-size.ts","../src/commands/datasets/ls.ts","../src/commands/datasets/push-items.ts","../src/commands/datasets/rename.ts","../src/commands/datasets/rm.ts","../src/commands/datasets/_index.ts","../src/commands/edit-input-schema.ts","../src/commands/help.ts","../src/commands/info.ts","../src/commands/init.ts","../src/lib/projects/scrapy/wrapScrapyProject.ts","../src/commands/init-wrap-scrapy.ts","../src/commands/key-value-stores/create.ts","../src/commands/key-value-stores/delete-value.ts","../src/commands/key-value-stores/get-value.ts","../src/commands/key-value-stores/info.ts","../src/commands/key-value-stores/keys.ts","../src/commands/key-value-stores/ls.ts","../src/commands/key-value-stores/rename.ts","../src/commands/key-value-stores/rm.ts","../src/commands/key-value-stores/set-value.ts","../src/commands/key-value-stores/_index.ts","../src/commands/login.ts","../src/lib/hooks/user-confirmations/useMaskedInput.ts","../src/commands/logout.ts","../src/commands/pull.ts","../src/commands/push.ts","../src/commands/request-queues/_index.ts","../src/commands/run.ts","../src/lib/hooks/useModuleVersion.ts","../src/commands/runs/abort.ts","../src/commands/runs/info.ts","../src/commands/runs/log.ts","../src/commands/runs/ls.ts","../src/commands/runs/resurrect.ts","../src/commands/runs/rm.ts","../src/commands/runs/_index.ts","../src/commands/secrets/add.ts","../src/commands/secrets/ls.ts","../src/commands/secrets/rm.ts","../src/commands/secrets/_index.ts","../src/commands/task/run.ts","../src/commands/task/_index.ts","../src/commands/telemetry/disable.ts","../src/commands/telemetry/enable.ts","../src/commands/telemetry/_index.ts","../src/commands/validate-schema.ts","../src/commands/_register.ts"],"sourcesContent":["import process from 'node:process';\nimport { parseArgs } from 'node:util';\n\nimport chalk from 'chalk';\nimport { satisfies } from 'semver';\n\nimport type { UpgradeCommand as TypeUpgradeCommand } from '../commands/cli-management/upgrade.js';\nimport type { BuiltApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { commandRegistry, internalRunCommand } from '../lib/command-framework/apify-command.js';\nimport { CommandError } from '../lib/command-framework/CommandError.js';\nimport { renderMainHelpMenu } from '../lib/command-framework/help.js';\nimport { readStdin } from '../lib/commands/read-stdin.js';\nimport { SUPPORTED_NODEJS_VERSION } from '../lib/consts.js';\nimport { useCLIMetadata } from '../lib/hooks/useCLIMetadata.js';\nimport { shouldSkipVersionCheck } from '../lib/hooks/useCLIVersionCheck.js';\nimport { useCommandSuggestions } from '../lib/hooks/useCommandSuggestions.js';\nimport { error } from '../lib/outputs.js';\nimport { cliDebugPrint } from '../lib/utils/cliDebugPrint.js';\n\nexport const cachedStdinInput = await readStdin();\n\nconst cliMetadata = useCLIMetadata();\n\nexport const USER_AGENT = `Apify CLI/${cliMetadata.version} (https://github.com/apify/apify-cli)`;\n\nexport function processVersionCheck(cliName: string) {\n\tif (cliMetadata.installMethod === 'bundle') {\n\t\treturn;\n\t}\n\n\tif (!satisfies(process.version, SUPPORTED_NODEJS_VERSION)) {\n\t\terror({\n\t\t\tmessage: `${cliName} CLI requires Node.js version ${SUPPORTED_NODEJS_VERSION}. Your current version is ${process.version}.`,\n\t\t});\n\n\t\tprocess.exit(1);\n\t}\n}\n\nexport function printCLIVersionAndExitIfFlagUsed(parsed: TopLevelValues) {\n\tif (parsed.values.version === true && parsed.positionals.length === 0) {\n\t\tconsole.log(cliMetadata.fullVersionString);\n\t\tprocess.exit(0);\n\t}\n}\n\nexport function printHelpAndExitIfFlagUsedOrNoCommandPassed(parsed: TopLevelValues, entrypoint: string) {\n\t// If we have the flag and no other command, or if we have no command at all\n\tif ((parsed.values.help === true && parsed.positionals.length === 0) || parsed.positionals.length === 0) {\n\t\tconsole.log(renderMainHelpMenu(entrypoint));\n\t\tprocess.exit(0);\n\t}\n}\n\ntype TopLevelValues = ReturnType<\n\ttypeof parseArgs<{\n\t\tallowPositionals: true;\n\t\tstrict: false;\n\t\toptions: {\n\t\t\thelp: {\n\t\t\t\ttype: 'boolean';\n\t\t\t\tshort: string;\n\t\t\t};\n\t\t\tversion: {\n\t\t\t\ttype: 'boolean';\n\t\t\t\tshort: string;\n\t\t\t};\n\t\t};\n\t\targs: string[];\n\t}>\n>;\n\nfunction handleCommandNotFound(commandName: string): never {\n\tconst closestMatches = useCommandSuggestions(String(commandName));\n\n\tlet message = chalk.gray(`Command ${chalk.whiteBright(commandName)} not found`);\n\n\tif (closestMatches.length) {\n\t\tmessage += '\\n ';\n\t\tmessage += chalk.gray(`Did you mean: ${closestMatches.map((cmd) => chalk.whiteBright(cmd)).join(', ')}?`);\n\t}\n\n\terror({ message });\n\n\tprocess.exit(1);\n}\n\nasync function runVersionCheck(entrypoint: string, maybeCommandName?: string) {\n\t// START: VERSION CHECK //\n\n\tconst UpgradeCommand = commandRegistry.get('upgrade') as typeof TypeUpgradeCommand;\n\n\tconst checkVersionsCommandIds = [UpgradeCommand.name, ...(UpgradeCommand.aliases ?? [])];\n\n\tif (checkVersionsCommandIds.some((id) => maybeCommandName === id)) {\n\t\tcliDebugPrint('[VersionCheckMiddleware]', 'upgrade command detected, skipping version check');\n\t\t// Skip running the middleware\n\t\treturn;\n\t}\n\n\tif (shouldSkipVersionCheck()) {\n\t\tcliDebugPrint('[VersionCheckMiddleware]', 'skipping version check because APIFY_CLI_SKIP_UPDATE_CHECK is set');\n\t\t// If the user has configured the `APIFY_CLI_SKIP_UPDATE_CHECK` env variable then skip the check.\n\t\treturn;\n\t}\n\n\tawait internalRunCommand(entrypoint, UpgradeCommand, { flags_internalAutomaticCall: true });\n\t// END: VERSION CHECK //\n}\n\nexport async function runCLI(entrypoint: string) {\n\tcliDebugPrint('CLIMetadata', {\n\t\t...cliMetadata,\n\t\tfullVersionString: cliMetadata.fullVersionString,\n\t\targv: process.argv,\n\t\tcwd: process.cwd(),\n\t\texecPath: process.execPath,\n\t});\n\n\tconst startingArgs = process.argv.slice(2);\n\n\tcliDebugPrint('ProcessArgv', startingArgs);\n\n\tconst startingResult = parseArgs({\n\t\tallowPositionals: true,\n\t\tstrict: false,\n\t\toptions: {\n\t\t\thelp: {\n\t\t\t\ttype: 'boolean',\n\t\t\t\tshort: 'h',\n\t\t\t},\n\t\t\tversion: {\n\t\t\t\ttype: 'boolean',\n\t\t\t\tshort: 'v',\n\t\t\t},\n\t\t},\n\t\targs: startingArgs,\n\t});\n\n\tprintCLIVersionAndExitIfFlagUsed(startingResult);\n\tprintHelpAndExitIfFlagUsedOrNoCommandPassed(startingResult, entrypoint);\n\n\t// MIDDLEWARE START //\n\n\tawait runVersionCheck(entrypoint, startingResult.positionals[0]);\n\n\t// MIDDLEWARE END //\n\n\tcliDebugPrint('TopLevelOptions', startingResult);\n\n\tconst [commandName, maybeSubcommandName] = startingResult.positionals;\n\tlet hasSubcommand = false;\n\n\tconst baseCommand = commandRegistry.get(commandName);\n\n\tif (!baseCommand) {\n\t\treturn handleCommandNotFound(commandName);\n\t}\n\n\tlet FinalCommand: typeof BuiltApifyCommand | undefined = baseCommand;\n\n\tif (baseCommand.subcommands?.length) {\n\t\tif (!maybeSubcommandName) {\n\t\t\t// Print help message for base command (also exits the process)\n\t\t\treturn baseCommand.printHelp();\n\t\t}\n\n\t\thasSubcommand = true;\n\t\tFinalCommand = commandRegistry.get(`${commandName} ${maybeSubcommandName}`);\n\t}\n\n\tif (!FinalCommand) {\n\t\treturn handleCommandNotFound(`${commandName} ${maybeSubcommandName}`);\n\t}\n\n\t// Take in all the raw arguments as they were provided to the process, skipping the command name and subcommand name\n\t// All this tomfoolery is to ensure that if the arguments are something like [kvs, --json, ls], it'll parse correctly\n\tconst rebuiltArgs: string[] = [...startingArgs];\n\n\tconst commandNameIndex = rebuiltArgs.indexOf(commandName);\n\tcliDebugPrint('CommandNameIndex', commandNameIndex);\n\trebuiltArgs.splice(commandNameIndex, 1);\n\n\tif (hasSubcommand) {\n\t\tconst subcommandNameIndex = rebuiltArgs.indexOf(maybeSubcommandName);\n\t\tcliDebugPrint('SubcommandNameIndex', subcommandNameIndex);\n\t\trebuiltArgs.splice(subcommandNameIndex, 1);\n\t}\n\n\tcliDebugPrint('RebuiltArgs', rebuiltArgs);\n\tcliDebugPrint('CommandToRun', FinalCommand);\n\n\tconst instance = new FinalCommand(\n\t\tentrypoint,\n\t\thasSubcommand ? `${baseCommand.name} ${maybeSubcommandName}` : baseCommand.name,\n\t\tcommandName,\n\t\thasSubcommand ? maybeSubcommandName : undefined,\n\t);\n\n\t// eslint-disable-next-line dot-notation\n\tconst parserOptions = instance['_buildParseArgsOption']();\n\n\tcliDebugPrint('ParserOptionsForCommand', parserOptions);\n\n\ttry {\n\t\tconst commandResult = parseArgs({\n\t\t\t...parserOptions,\n\t\t\targs: rebuiltArgs,\n\t\t});\n\n\t\t// eslint-disable-next-line dot-notation\n\t\tawait instance['_run'](commandResult);\n\n\t\tcliDebugPrint('CommandArgsResult', commandResult);\n\t} catch (err) {\n\t\tconst commandError = CommandError.into(err, FinalCommand);\n\n\t\terror({ message: commandError.getPrettyMessage() });\n\n\t\tprocess.exit(1);\n\t}\n}\n","/* eslint-disable max-classes-per-file */\n\nimport type { parseArgs, ParseArgsConfig, ParseArgsOptionDescriptor } from 'node:util';\n\nimport type { Awaitable } from '@crawlee/types';\nimport chalk from 'chalk';\nimport indentString from 'indent-string';\nimport widestLine from 'widest-line';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { cachedStdinInput } from '../../entrypoints/_shared.js';\nimport type { TrackEventMap } from '../hooks/telemetry/trackEvent.js';\nimport { trackEvent } from '../hooks/telemetry/trackEvent.js';\nimport { useCLIMetadata } from '../hooks/useCLIMetadata.js';\nimport { ProjectLanguage, useCwdProject } from '../hooks/useCwdProject.js';\nimport { error } from '../outputs.js';\nimport type { ArgTag, TaggedArgBuilder } from './args.js';\nimport { CommandError, CommandErrorCode } from './CommandError.js';\nimport type { FlagTag, TaggedFlagBuilder } from './flags.js';\nimport { registerCommandForHelpGeneration, renderHelpForCommand, selectiveRenderHelpForCommand } from './help.js';\nimport { getMaxLineWidth } from './help/consts.js';\n\nexport enum StdinMode {\n\tRaw = 1,\n\tStringified = 2,\n}\n\ninterface ArgTagToTSType {\n\tstring: string;\n}\n\ninterface FlagTagToTSType {\n\tstring: string;\n\tboolean: boolean;\n\tinteger: number;\n}\n\ntype InferArgTypeFromArg<Builder extends TaggedArgBuilder<ArgTag, unknown>> =\n\tBuilder extends TaggedArgBuilder<infer ReturnedType, infer Required>\n\t\t? If<Required, ArgTagToTSType[ReturnedType], ArgTagToTSType[ReturnedType] | undefined>\n\t\t: unknown;\n\ntype If<T, Y, N> = T extends true ? Y : N;\ntype IfNotUnknown<T, Y, N> = T extends unknown ? Y : N;\n\ntype InferFlagTypeFromFlag<\n\tBuilder extends TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>,\n\tOptionalIfHasDefault = false,\n> = Builder extends TaggedFlagBuilder<infer ReturnedType, never, infer Required, infer HasDefault> // Handle special case where there can be no choices\n\t? If<\n\t\t\t// If we want to mark flags as optional if they have a default\n\t\t\tOptionalIfHasDefault,\n\t\t\t// If the flag actually has a default value, assert on that\n\t\t\tIfNotUnknown<\n\t\t\t\tHasDefault,\n\t\t\t\tFlagTagToTSType[ReturnedType] | undefined,\n\t\t\t\t// Otherwise fall back to required status\n\t\t\t\tIf<Required, FlagTagToTSType[ReturnedType], FlagTagToTSType[ReturnedType] | undefined>\n\t\t\t>,\n\t\t\t// fallback to required status\n\t\t\tIf<Required, FlagTagToTSType[ReturnedType], FlagTagToTSType[ReturnedType] | undefined>\n\t\t>\n\t: // Might have choices, in which case we branch based on that\n\t\tBuilder extends TaggedFlagBuilder<infer ReturnedType, infer ChoiceType, infer Required, infer HasDefault>\n\t\t? // If choices is a valid array\n\t\t\tChoiceType extends unknown[] | readonly unknown[]\n\t\t\t? // If we want optional flags to stay as optional\n\t\t\t\tIf<\n\t\t\t\t\tOptionalIfHasDefault,\n\t\t\t\t\tChoiceType[number] | undefined,\n\t\t\t\t\t// fallback to required status\n\t\t\t\t\tIf<Required, ChoiceType[number], ChoiceType[number] | undefined>\n\t\t\t\t>\n\t\t\t: If<\n\t\t\t\t\t// If we want to mark flags as optional if they have a default\n\t\t\t\t\tOptionalIfHasDefault,\n\t\t\t\t\t// If the flag actually has a default value, assert on that\n\t\t\t\t\tIfNotUnknown<\n\t\t\t\t\t\tHasDefault,\n\t\t\t\t\t\tFlagTagToTSType[ReturnedType] | undefined,\n\t\t\t\t\t\t// Fallback to required status\n\t\t\t\t\t\tIf<Required, FlagTagToTSType[ReturnedType], FlagTagToTSType[ReturnedType] | undefined>\n\t\t\t\t\t>,\n\t\t\t\t\t// fallback to required status\n\t\t\t\t\tIf<Required, FlagTagToTSType[ReturnedType], FlagTagToTSType[ReturnedType] | undefined>\n\t\t\t\t>\n\t\t: unknown;\n\n// Adapted from https://gist.github.com/kuroski/9a7ae8e5e5c9e22985364d1ddbf3389d to support kebab-case and \"string a\"\ntype CamelCase<S extends string> = S extends\n\t| `${infer P1}-${infer P2}${infer P3}`\n\t| `${infer P1}_${infer P2}${infer P3}`\n\t| `${infer P1} ${infer P2}${infer P3}`\n\t? `${P1}${Uppercase<P2>}${CamelCase<P3>}`\n\t: S;\n\ntype _InferArgsFromCommand<O extends Record<string, TaggedArgBuilder<ArgTag, unknown>>> = {\n\t[K in keyof O as CamelCase<string & K>]: InferArgTypeFromArg<O[K]>;\n};\n\ntype _InferFlagsFromCommand<\n\tO extends Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>,\n\tOptionalIfHasDefault = false,\n> = {\n\t[K in keyof O as CamelCase<string & K>]: InferFlagTypeFromFlag<O[K], OptionalIfHasDefault>;\n};\n\ntype InferArgsFromCommand<O extends Record<string, TaggedArgBuilder<ArgTag, unknown>> | undefined> = O extends undefined\n\t? Record<string, unknown>\n\t: _InferArgsFromCommand<Exclude<O, undefined>>;\n\ntype InferFlagsFromCommand<\n\tO extends Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>> | undefined,\n\tOptionalIfHasDefault = false,\n> = (O extends undefined\n\t? Record<string, unknown>\n\t: _InferFlagsFromCommand<Exclude<O, undefined>, OptionalIfHasDefault>) & {\n\tjson: boolean;\n};\n\nexport function camelCaseString(str: string): string {\n\treturn str.replace(/[-_\\s](.)/g, (_, group1) => group1.toUpperCase());\n}\n\nexport function kebabCaseString(str: string): string {\n\treturn str.replace(/[\\s_]+/g, '-');\n}\n\nexport function camelCaseToKebabCase(str: string): string {\n\treturn str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\nconst helpFlagDefinition = {\n\ttype: 'boolean',\n\tmultiple: false,\n\tshort: 'h',\n} as const satisfies ParseArgsOptionDescriptor;\n\nconst jsonFlagDefinition = {\n\ttype: 'boolean',\n\tmultiple: false,\n} as const satisfies ParseArgsOptionDescriptor;\n\nexport const commandRegistry = new Map<string, typeof BuiltApifyCommand>();\n\ntype ParseResult = ReturnType<typeof parseArgs<ReturnType<ApifyCommand['_buildParseArgsOption']>>>;\n\nconst COMMANDS_WITHIN_ACTOR = [\n\t'init',\n\t'run',\n\n\t'push',\n\t'actors push',\n\n\t'pull',\n\t'actors pull',\n\n\t'call',\n\t'actors call',\n\n\t'actors start',\n];\n\nexport abstract class ApifyCommand<T extends typeof BuiltApifyCommand = typeof BuiltApifyCommand> {\n\tstatic args?: Record<string, TaggedArgBuilder<ArgTag, unknown>> & {\n\t\tjson?: 'Do not use json as the key of an argument, as it will prevent the --json flag from working';\n\t};\n\n\tstatic flags?: Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>> & {\n\t\tjson?: 'Do not use json as the key of a flag, override the enableJsonFlag static property instead';\n\t};\n\n\tstatic subcommands?: (typeof BuiltApifyCommand)[];\n\n\tstatic enableJsonFlag = false;\n\n\tstatic name: string;\n\n\tstatic shortDescription?: string;\n\n\tstatic description?: string;\n\n\tstatic aliases?: string[];\n\n\tstatic hidden?: boolean;\n\n\tstatic hiddenAliases?: string[];\n\n\tprotected telemetryData: TrackEventMap[`cli_command_${string}`] = {} as never;\n\n\tprotected flags!: InferFlagsFromCommand<T['flags']>;\n\n\tprotected args!: InferArgsFromCommand<T['args']>;\n\n\tprotected entrypoint: string;\n\n\tprotected commandString: string;\n\n\tprotected aliasUsed: string;\n\n\tprotected subcommandAliasUsed?: string;\n\n\tprotected skipTelemetry = false;\n\n\tpublic constructor(entrypoint: string, commandString: string, aliasUsed: string, subcommandAliasUsed?: string) {\n\t\tthis.entrypoint = entrypoint;\n\t\tthis.commandString = commandString;\n\n\t\tthis.aliasUsed = aliasUsed;\n\t\tthis.subcommandAliasUsed = subcommandAliasUsed;\n\n\t\tconst metadata = useCLIMetadata();\n\n\t\tthis.telemetryData.installMethod = metadata.installMethod;\n\t\tthis.telemetryData.osArch = metadata.arch;\n\t\tthis.telemetryData.runtime = metadata.runtime.runtime;\n\t\tthis.telemetryData.runtimeVersion = metadata.runtime.version;\n\t\tthis.telemetryData.runtimeNodeVersion = metadata.runtime.nodeVersion ?? metadata.runtime.version;\n\n\t\tthis.telemetryData.commandString = commandString;\n\t\tthis.telemetryData.entrypoint = entrypoint;\n\t}\n\n\tabstract run(): Awaitable<void>;\n\n\tprotected get ctor(): typeof BuiltApifyCommand {\n\t\treturn this.constructor as typeof BuiltApifyCommand;\n\t}\n\n\tprotected pluralString(amount: number, singular: string, plural: string): string {\n\t\treturn amount === 1 ? singular : plural;\n\t}\n\n\tstatic printHelp(): never {\n\t\tconsole.log(renderHelpForCommand(this as typeof BuiltApifyCommand));\n\n\t\tprocess.exit(0);\n\t}\n\n\tprotected printHelp() {\n\t\treturn this.ctor.printHelp();\n\t}\n\n\tprivate async _run(parseResult: ParseResult) {\n\t\tconst { values: rawFlags, positionals: rawArgs, tokens: rawTokens } = parseResult;\n\n\t\tif (rawFlags.help) {\n\t\t\tthis.ctor.printHelp();\n\t\t}\n\n\t\t// Cheating a bit here with the types, but its fine\n\n\t\tthis.args = {} as any;\n\t\tthis.flags = {} as any;\n\n\t\t// If we have this set, we assume that the user wants only the flag\n\t\tif (this.ctor.enableJsonFlag) {\n\t\t\tif (typeof rawFlags.json === 'boolean') {\n\t\t\t\tthis.flags.json = rawFlags.json;\n\t\t\t} else {\n\t\t\t\tthis.flags.json = false;\n\t\t\t}\n\t\t}\n\n\t\tconst missingRequiredArgs = new Map<string, TaggedArgBuilder<ArgTag, unknown>>();\n\n\t\tif (this.ctor.args) {\n\t\t\tlet index = 0;\n\t\t\tfor (const [userArgName, builderData] of Object.entries(this.ctor.args)) {\n\t\t\t\tif (typeof builderData === 'string') {\n\t\t\t\t\tthrow new RangeError('Do not provide the string for the json arg! It is a type level assertion!');\n\t\t\t\t}\n\n\t\t\t\tconst camelCasedName = camelCaseString(userArgName);\n\n\t\t\t\tconst rawArg = rawArgs[index++];\n\n\t\t\t\tif (rawArg) {\n\t\t\t\t\tswitch (builderData.argTag) {\n\t\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthis.args[camelCasedName] = String(rawArg);\n\n\t\t\t\t\t\t\tif (rawArg === '-' && builderData.stdin) {\n\t\t\t\t\t\t\t\tthis.args[camelCasedName] = this._handleStdin(builderData.stdin);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (builderData.catchAll) {\n\t\t\t\t\t\t\t\tthis.args[camelCasedName] = rawArgs.slice(index - 1).join(' ');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (builderData.required) {\n\t\t\t\t\tmissingRequiredArgs.set(userArgName, builderData);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (missingRequiredArgs.size) {\n\t\t\tthis._printMissingRequiredArgs(missingRequiredArgs);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._parseFlags(rawFlags, rawTokens);\n\n\t\ttry {\n\t\t\tawait this.run();\n\t\t} catch (err: any) {\n\t\t\terror({ message: err.message });\n\t\t} finally {\n\t\t\t// analytics\n\t\t\tif (!this.telemetryData.actorLanguage && COMMANDS_WITHIN_ACTOR.includes(this.commandString)) {\n\t\t\t\tconst cwdProject = await useCwdProject();\n\n\t\t\t\tcwdProject.inspect((project) => {\n\t\t\t\t\tif (project.type === ProjectLanguage.JavaScript) {\n\t\t\t\t\t\tthis.telemetryData.actorLanguage = 'javascript';\n\t\t\t\t\t\tthis.telemetryData.actorRuntime = project.runtime!.runtimeShorthand || 'node';\n\t\t\t\t\t\tthis.telemetryData.actorRuntimeVersion = project.runtime!.version;\n\t\t\t\t\t} else if (project.type === ProjectLanguage.Python || project.type === ProjectLanguage.Scrapy) {\n\t\t\t\t\t\tthis.telemetryData.actorLanguage = 'python';\n\t\t\t\t\t\tthis.telemetryData.actorRuntime = 'python';\n\t\t\t\t\t\tthis.telemetryData.actorRuntimeVersion = project.runtime!.version;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.telemetryData.flagsUsed = Object.keys(this.flags);\n\n\t\t\tif (!this.skipTelemetry) {\n\t\t\t\tawait trackEvent(\n\t\t\t\t\t`cli_command_${this.commandString.replaceAll(' ', '_').toLowerCase()}` as const,\n\t\t\t\t\tthis.telemetryData,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _userFlagNameToRegisteredName(\n\t\tuserFlagName: string,\n\t\tbuilderData: TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>,\n\t) {\n\t\tconst rawBaseFlagName = kebabCaseString(camelCaseToKebabCase(userFlagName)).toLowerCase();\n\n\t\tlet baseFlagName = rawBaseFlagName;\n\n\t\tif (rawBaseFlagName.startsWith('no-')) {\n\t\t\tbaseFlagName = rawBaseFlagName.slice(3);\n\t\t}\n\n\t\tconst allMatchers = new Set<string>();\n\n\t\tfor (const alias of builderData.aliases ?? []) {\n\t\t\tallMatchers.add(kebabCaseString(camelCaseToKebabCase(alias)).toLowerCase());\n\t\t}\n\n\t\treturn { baseFlagName, rawBaseFlagName, allMatchers: [baseFlagName, ...allMatchers] };\n\t}\n\n\tprivate _commandFlagKeyToKebabCaseRegisteredName(commandFlagKey: string) {\n\t\tlet flagKey = kebabCaseString(camelCaseToKebabCase(commandFlagKey)).toLowerCase();\n\n\t\tif (flagKey.startsWith('no-')) {\n\t\t\t// node handles `no-` flags by negating the flag, so we need to handle that differently if we register a flag with a \"no-\" prefix\n\t\t\tflagKey = flagKey.slice(3);\n\t\t}\n\n\t\treturn flagKey;\n\t}\n\n\tprivate _parseFlags(rawFlags: ParseResult['values'], rawTokens: ParseResult['tokens']) {\n\t\tif (!this.ctor.flags) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst exclusiveFlagMap = new Map<string, Set<string>>();\n\n\t\tlet flagThatUsedStdin: string | undefined;\n\n\t\tfor (const [commandFlagKey, builderData] of Object.entries(this.ctor.flags)) {\n\t\t\tif (typeof builderData === 'string') {\n\t\t\t\tthrow new RangeError('Do not provide the string for the json arg! It is a type level assertion!');\n\t\t\t}\n\n\t\t\tconst { allMatchers, baseFlagName, rawBaseFlagName } = this._userFlagNameToRegisteredName(\n\t\t\t\tcommandFlagKey,\n\t\t\t\tbuilderData,\n\t\t\t);\n\n\t\t\tconst camelCasedName = camelCaseString(rawBaseFlagName);\n\n\t\t\tconst usedShortFormOfTheFlag = rawTokens.some(\n\t\t\t\t(token) => token.kind === 'option' && token.name === baseFlagName,\n\t\t\t);\n\n\t\t\tif (builderData.exclusive?.length) {\n\t\t\t\tconst existingExclusiveFlags = exclusiveFlagMap.get(baseFlagName) ?? new Set();\n\n\t\t\t\tfor (const exclusiveFlag of builderData.exclusive) {\n\t\t\t\t\texistingExclusiveFlags.add(this._commandFlagKeyToKebabCaseRegisteredName(exclusiveFlag));\n\t\t\t\t}\n\n\t\t\t\texclusiveFlagMap.set(baseFlagName, existingExclusiveFlags);\n\n\t\t\t\t// Go through each exclusive flag for this one flag and also add it\n\t\t\t\tfor (const exclusiveFlag of builderData.exclusive) {\n\t\t\t\t\tconst exclusiveFlagKebabCasedName = this._commandFlagKeyToKebabCaseRegisteredName(exclusiveFlag);\n\n\t\t\t\t\tconst exclusiveFlagExisting = exclusiveFlagMap.get(exclusiveFlagKebabCasedName) ?? new Set();\n\n\t\t\t\t\texclusiveFlagExisting.add(baseFlagName);\n\n\t\t\t\t\texclusiveFlagMap.set(exclusiveFlagKebabCasedName, exclusiveFlagExisting);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If you have a flag a, with alias b, and you pass --a and --b, it's not allowed\n\t\t\tconst matchingFlags = allMatchers.filter((matcher) => rawFlags[matcher]);\n\n\t\t\tif (matchingFlags.length > 1) {\n\t\t\t\tthrow new CommandError({\n\t\t\t\t\tcode: CommandErrorCode.APIFY_FLAG_PROVIDED_MULTIPLE_TIMES,\n\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet rawFlag = rawFlags[matchingFlags[0]];\n\n\t\t\tif (!rawFlag && builderData.required) {\n\t\t\t\tthrow new CommandError({\n\t\t\t\t\tcode: CommandErrorCode.APIFY_MISSING_FLAG,\n\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t\tmatcher: matchingFlags[0],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If you provide --a 1 --a 2, it's <currently> not allowed\n\t\t\tif (Array.isArray(rawFlag)) {\n\t\t\t\tif (rawFlag.length > 1) {\n\t\t\t\t\tthrow new CommandError({\n\t\t\t\t\t\tcode: CommandErrorCode.APIFY_FLAG_PROVIDED_MULTIPLE_TIMES,\n\t\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\trawFlag = rawFlag[0]! as string | boolean;\n\t\t\t}\n\n\t\t\t// -i='{\"foo\":\"bar\"}'\n\t\t\tif (usedShortFormOfTheFlag && typeof rawFlag === 'string' && rawFlag.startsWith('=')) {\n\t\t\t\trawFlag = rawFlag.slice(1);\n\t\t\t}\n\n\t\t\tif (typeof rawFlag !== 'undefined') {\n\t\t\t\tswitch (builderData.flagTag) {\n\t\t\t\t\tcase 'boolean': {\n\t\t\t\t\t\tthis.flags[camelCasedName] = rawBaseFlagName.startsWith('no-') ? !rawFlag : rawFlag;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'integer': {\n\t\t\t\t\t\tconst parsed = Number(rawFlag);\n\n\t\t\t\t\t\tif (Number.isNaN(parsed) || !Number.isInteger(parsed)) {\n\t\t\t\t\t\t\tthrow new CommandError({\n\t\t\t\t\t\t\t\tcode: CommandErrorCode.APIFY_INVALID_FLAG_INTEGER_VALUE,\n\t\t\t\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t\t\t\t\tvalue: String(rawFlag),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.flags[camelCasedName] = parsed;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'string':\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tthis.flags[camelCasedName] = rawFlag;\n\n\t\t\t\t\t\tif (rawFlag === '-' && builderData.stdin) {\n\t\t\t\t\t\t\tif (flagThatUsedStdin) {\n\t\t\t\t\t\t\t\tthrow new CommandError({\n\t\t\t\t\t\t\t\t\tcode: CommandErrorCode.APIFY_TOO_MANY_REQUESTERS_OF_STDIN,\n\t\t\t\t\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\t\t\t\t\tmetadata: { firstUse: flagThatUsedStdin, secondUse: baseFlagName },\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tflagThatUsedStdin = baseFlagName;\n\n\t\t\t\t\t\t\tthis.flags[camelCasedName] = this._handleStdin(builderData.stdin);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof builderData.hasDefault !== 'undefined') {\n\t\t\t\tthis.flags[camelCasedName] = builderData.hasDefault;\n\t\t\t}\n\n\t\t\t// Validate choices\n\t\t\tif (\n\t\t\t\t// We have the flag\n\t\t\t\tthis.flags[camelCasedName] &&\n\t\t\t\t// And we have a list of choices\n\t\t\t\tbuilderData.choices &&\n\t\t\t\t// And the flag is not one of the choices\n\t\t\t\t!builderData.choices.includes(this.flags[camelCasedName] as string)\n\t\t\t) {\n\t\t\t\tthrow new CommandError({\n\t\t\t\t\tcode: CommandErrorCode.APIFY_INVALID_CHOICE,\n\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t\tchoices: builderData.choices.map((choice) => chalk.white.bold(choice)).join(', '),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Re-validate required (we don't have the flag and it's either required or passed in)\n\t\t\tif (this.flags[camelCasedName] == null && (builderData.required || rawFlag != null)) {\n\t\t\t\tthrow new CommandError({\n\t\t\t\t\tcode: CommandErrorCode.APIFY_MISSING_FLAG,\n\t\t\t\t\tcommand: this.ctor,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tflag: baseFlagName,\n\t\t\t\t\t\tmatcher: matchingFlags[0],\n\t\t\t\t\t\tprovidedButReceivedNoValue: !!rawFlag,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst exclusiveErrors: [flagA: string, flagB: string][] = [];\n\n\t\tfor (const [flagA, flags] of exclusiveFlagMap) {\n\t\t\t// If the flag is not set, or is set to null, we can skip it\n\t\t\tif (rawFlags[flagA] == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const flagB of flags) {\n\t\t\t\tif (rawFlags[flagB] == null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// At this point we know both are set\n\t\t\t\tconst flagAValue = (rawFlags[flagA] as (string | boolean)[])[0];\n\t\t\t\tconst flagBValue = (rawFlags[flagB] as (string | boolean)[])[0];\n\n\t\t\t\tconst flagRepresentation = (kebabCasedFlag: string, value: unknown) => {\n\t\t\t\t\tif (typeof value === 'boolean') {\n\t\t\t\t\t\treturn value ? `--${kebabCasedFlag}` : `--no-${kebabCasedFlag}`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn `--${kebabCasedFlag}=${value}`;\n\t\t\t\t};\n\n\t\t\t\texclusiveErrors.push([flagRepresentation(flagA, flagAValue), flagRepresentation(flagB, flagBValue)]);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (exclusiveErrors.length) {\n\t\t\tthrow new CommandError({\n\t\t\t\tcode: CommandErrorCode.APIFY_FLAG_IS_EXCLUSIVE_WITH_ANOTHER_FLAG,\n\t\t\t\tcommand: this.ctor,\n\t\t\t\tmetadata: {\n\t\t\t\t\tflagPairs: exclusiveErrors,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _printMissingRequiredArgs(missingRequiredArgs: Map<string, TaggedArgBuilder<ArgTag, unknown>>) {\n\t\tconst help = selectiveRenderHelpForCommand(this.ctor, {\n\t\t\tshowUsageString: true,\n\t\t});\n\n\t\tconst widestArgNameLength = widestLine([...missingRequiredArgs.keys()].join('\\n'));\n\n\t\tconst missingArgsStrings: string[] = [];\n\n\t\tfor (const [argName, arg] of missingRequiredArgs) {\n\t\t\tconst fullString = `${argName.padEnd(widestArgNameLength)} ${arg.description}`;\n\n\t\t\tconst wrapped = wrapAnsi(fullString, getMaxLineWidth() - widestArgNameLength - 2);\n\n\t\t\tconst indented = indentString(wrapped, widestArgNameLength + 2 + 2).trim();\n\n\t\t\tmissingArgsStrings.push(` ${chalk.red('>')} ${indented}`);\n\t\t}\n\n\t\terror({\n\t\t\tmessage: [\n\t\t\t\t`Missing ${missingRequiredArgs.size} required ${this.pluralString(missingRequiredArgs.size, 'argument', 'arguments')}:`,\n\t\t\t\t...missingArgsStrings,\n\t\t\t\tchalk.gray(' See more help with --help'),\n\t\t\t\t'',\n\t\t\t\thelp,\n\t\t\t].join('\\n'),\n\t\t});\n\t}\n\n\tprivate _handleStdin(mode: StdinMode) {\n\t\tswitch (mode) {\n\t\t\tcase StdinMode.Stringified:\n\t\t\t\treturn (cachedStdinInput?.toString('utf8') ?? '').trim();\n\t\t\tdefault:\n\t\t\t\treturn cachedStdinInput;\n\t\t}\n\t}\n\n\tprotected _buildParseArgsOption() {\n\t\tconst object = {\n\t\t\tallowNegative: true,\n\t\t\tallowPositionals: true,\n\t\t\tstrict: true,\n\t\t\ttokens: true,\n\t\t\toptions: {\n\t\t\t\thelp: helpFlagDefinition,\n\t\t\t} as {\n\t\t\t\thelp: typeof helpFlagDefinition;\n\t\t\t\tjson: typeof jsonFlagDefinition;\n\t\t\t\t[k: string]: ParseArgsOptionDescriptor;\n\t\t\t},\n\t\t} satisfies ParseArgsConfig;\n\n\t\tif (this.ctor.flags) {\n\t\t\tfor (const [key, internalBuilderData] of Object.entries(this.ctor.flags)) {\n\t\t\t\tif (typeof internalBuilderData === 'string') {\n\t\t\t\t\tthrow new RangeError('Do not provide the string for the json flag! It is a type level assertion!');\n\t\t\t\t}\n\t\t\t\t// Skip the \"json\" flag, as it is set by enableJsonFlag\n\t\t\t\tif (key.toLowerCase() === 'json') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet flagKey = kebabCaseString(camelCaseToKebabCase(key)).toLowerCase();\n\n\t\t\t\t// node handles `no-` flags by negating the flag, so we need to handle that differently if we register a flag with a \"no-\" prefix\n\t\t\t\tif (flagKey.startsWith('no-')) {\n\t\t\t\t\tflagKey = flagKey.slice(3);\n\t\t\t\t}\n\n\t\t\t\tconst flagDefinitions = internalBuilderData.builder(flagKey);\n\n\t\t\t\tfor (const { flagName, option } of flagDefinitions) {\n\t\t\t\t\tobject.options![flagName] = option;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.ctor.enableJsonFlag) {\n\t\t\tobject.options!.json = jsonFlagDefinition;\n\t\t}\n\n\t\treturn object;\n\t}\n\n\tstatic registerCommand(entrypoint: string) {\n\t\tregisterCommandForHelpGeneration(entrypoint, this as typeof BuiltApifyCommand);\n\n\t\t// Register the command itself\n\t\tcommandRegistry.set(this.name, this as typeof BuiltApifyCommand);\n\n\t\t// Register all aliases\n\t\tif (this.aliases?.length) {\n\t\t\tfor (const alias of this.aliases) {\n\t\t\t\tcommandRegistry.set(alias, this as typeof BuiltApifyCommand);\n\t\t\t}\n\t\t}\n\n\t\tif (this.hiddenAliases?.length) {\n\t\t\tfor (const alias of this.hiddenAliases) {\n\t\t\t\tcommandRegistry.set(alias, this as typeof BuiltApifyCommand);\n\t\t\t}\n\t\t}\n\n\t\t// For each subcommand, register it and all its aliases\n\t\tif (this.subcommands?.length) {\n\t\t\tfor (const subcommand of this.subcommands) {\n\t\t\t\t// Base name + subcommand name\n\t\t\t\tcommandRegistry.set(`${this.name} ${subcommand.name}`, subcommand as typeof BuiltApifyCommand);\n\n\t\t\t\t// All aliases of the base command + subcommand name\n\t\t\t\tif (this.aliases?.length) {\n\t\t\t\t\tfor (const alias of this.aliases) {\n\t\t\t\t\t\tcommandRegistry.set(`${alias} ${subcommand.name}`, subcommand as typeof BuiltApifyCommand);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// All hidden aliases of the base command + subcommand name\n\t\t\t\tif (this.hiddenAliases?.length) {\n\t\t\t\t\tfor (const alias of this.hiddenAliases) {\n\t\t\t\t\t\tcommandRegistry.set(`${alias} ${subcommand.name}`, subcommand as typeof BuiltApifyCommand);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// For each subcommand, register all its aliases\n\t\t\t\tif (subcommand.aliases?.length) {\n\t\t\t\t\tfor (const subcommandAlias of subcommand.aliases) {\n\t\t\t\t\t\t// Base name + subcommand alias\n\t\t\t\t\t\tcommandRegistry.set(`${this.name} ${subcommandAlias}`, subcommand as typeof BuiltApifyCommand);\n\n\t\t\t\t\t\t// All aliases of the base command + subcommand alias\n\t\t\t\t\t\tif (this.aliases?.length) {\n\t\t\t\t\t\t\tfor (const alias of this.aliases) {\n\t\t\t\t\t\t\t\tcommandRegistry.set(\n\t\t\t\t\t\t\t\t\t`${alias} ${subcommandAlias}`,\n\t\t\t\t\t\t\t\t\tsubcommand as typeof BuiltApifyCommand,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// All hidden aliases of the base command + subcommand alias\n\t\t\t\t\t\tif (this.hiddenAliases?.length) {\n\t\t\t\t\t\t\tfor (const alias of this.hiddenAliases) {\n\t\t\t\t\t\t\t\tcommandRegistry.set(\n\t\t\t\t\t\t\t\t\t`${alias} ${subcommandAlias}`,\n\t\t\t\t\t\t\t\t\tsubcommand as typeof BuiltApifyCommand,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// For each subcommand, register all its hidden aliases\n\t\t\t\tif (subcommand.hiddenAliases?.length) {\n\t\t\t\t\tfor (const subcommandAlias of subcommand.hiddenAliases) {\n\t\t\t\t\t\t// Base name + subcommand hidden alias\n\t\t\t\t\t\tcommandRegistry.set(`${this.name} ${subcommandAlias}`, subcommand as typeof BuiltApifyCommand);\n\n\t\t\t\t\t\t// All aliases of the base command + subcommand hidden alias\n\t\t\t\t\t\tif (this.aliases?.length) {\n\t\t\t\t\t\t\tfor (const alias of this.aliases) {\n\t\t\t\t\t\t\t\tcommandRegistry.set(\n\t\t\t\t\t\t\t\t\t`${alias} ${subcommandAlias}`,\n\t\t\t\t\t\t\t\t\tsubcommand as typeof BuiltApifyCommand,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// All hidden aliases of the base command + subcommand hidden alias\n\t\t\t\t\t\tif (this.hiddenAliases?.length) {\n\t\t\t\t\t\t\tfor (const alias of this.hiddenAliases) {\n\t\t\t\t\t\t\t\tcommandRegistry.set(\n\t\t\t\t\t\t\t\t\t`${alias} ${subcommandAlias}`,\n\t\t\t\t\t\t\t\t\tsubcommand as typeof BuiltApifyCommand,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Utility type to extract only the keys that are optional\ntype ExtractOptionalFlagKeys<Cmd extends typeof BuiltApifyCommand> = {\n\t[K in keyof InferFlagsFromCommand<Cmd['flags'], true>]: [undefined] extends [\n\t\tInferFlagsFromCommand<Cmd['flags'], true>[K],\n\t]\n\t\t? K\n\t\t: never;\n}[keyof InferFlagsFromCommand<Cmd['flags'], true>];\n\ntype ExtractOptionalArgKeys<Cmd extends typeof BuiltApifyCommand> = {\n\t[K in keyof InferArgsFromCommand<Cmd['args']>]: [undefined] extends [InferArgsFromCommand<Cmd['args']>[K]]\n\t\t? K\n\t\t: never;\n}[keyof InferArgsFromCommand<Cmd['args']>];\n\n// Messy type...\ntype StaticArgsFlagsInput<Cmd extends typeof BuiltApifyCommand> = Omit<\n\t{\n\t\t// This ensures we only get the required args\n\t\t[K in Exclude<\n\t\t\tkeyof InferArgsFromCommand<Cmd['args']>,\n\t\t\tExtractOptionalArgKeys<Cmd>\n\t\t> as `args_${string & K}`]: InferArgsFromCommand<Cmd['args']>[K];\n\t},\n\t// Omit args_json as it is used only to throw an error if the user provides it\n\t'args_json'\n> &\n\tOmit<\n\t\t{\n\t\t\t// Fill in the rest of the args, this will not override what the code above does\n\t\t\t[K in keyof InferArgsFromCommand<Cmd['args']> as `args_${string & K}`]?: InferArgsFromCommand<\n\t\t\t\tCmd['args']\n\t\t\t>[K];\n\t\t},\n\t\t'args_json'\n\t> &\n\tOmit<\n\t\t{\n\t\t\t// This ensures we only ever get the required flags into this object, as `key?: type` and `key: type | undefined` are not the same (one is optionally present, the other is mandatory)\n\t\t\t[K in Exclude<\n\t\t\t\tkeyof InferFlagsFromCommand<Cmd['flags'], true>,\n\t\t\t\tExtractOptionalFlagKeys<Cmd>\n\t\t\t> as `flags_${string & K}`]: InferFlagsFromCommand<Cmd['flags'], true>[K];\n\t\t},\n\t\t// Omit flags_json as it is used only to throw an error if the user provides it\n\t\t'flags_json'\n\t> &\n\tOmit<\n\t\t{\n\t\t\t// Fill in the rest of the flags, this will not override what the code above does\n\t\t\t[K in keyof InferFlagsFromCommand<Cmd['flags'], true> as `flags_${string & K}`]?: InferFlagsFromCommand<\n\t\t\t\tCmd['flags'],\n\t\t\t\ttrue\n\t\t\t>[K];\n\t\t},\n\t\t// Omit flags_json as it is used only to throw an error if the user provides it\n\t\t'flags_json'\n\t> & {\n\t\t// Define it at the end exactly like it is\n\t\tflags_json?: boolean;\n\t};\n\nexport async function testRunCommand<Cmd extends typeof BuiltApifyCommand>(\n\tcommand: Cmd,\n\targsFlags: StaticArgsFlagsInput<Cmd>,\n) {\n\treturn internalRunCommand('test-cli', command, argsFlags);\n}\n\nexport async function internalRunCommand<Cmd extends typeof BuiltApifyCommand>(\n\tentrypoint: string,\n\tcommand: Cmd,\n\targsFlags: StaticArgsFlagsInput<Cmd>,\n) {\n\t// This is very much yolo'd in, but its purpose is for testing only\n\tconst rawObject: ParseResult = {\n\t\tpositionals: [],\n\t\tvalues: {},\n\t\ttokens: [],\n\t};\n\n\tlet positionalIndex = 0;\n\n\tfor (const [key, value] of Object.entries(argsFlags)) {\n\t\tconst [type, rawKey] = key.split('_');\n\n\t\tif (type === 'args') {\n\t\t\trawObject.positionals[positionalIndex++] = value as unknown as string;\n\t\t} else {\n\t\t\tconst yargsFlagName = kebabCaseString(camelCaseToKebabCase(rawKey)).toLowerCase();\n\n\t\t\t// We handle \"no-\" flags differently, as yargs handles them by negating the base flag name (no-prompt -> prompt=false)\n\t\t\tif (yargsFlagName.startsWith('no-')) {\n\t\t\t\trawObject.values[yargsFlagName.slice(3)] = !value;\n\t\t\t} else {\n\t\t\t\trawObject.values[yargsFlagName] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst instance = new (command as typeof BuiltApifyCommand)(entrypoint, command.name, command.name);\n\n\t// eslint-disable-next-line dot-notation\n\tinstance['skipTelemetry'] = true;\n\n\t// eslint-disable-next-line dot-notation\n\tawait instance['_run'](rawObject);\n}\n\nexport declare class BuiltApifyCommand extends ApifyCommand {\n\toverride run(): Awaitable<void>;\n}\n","import chalk from 'chalk';\n\nexport function cliDebugPrint(tag: string, ...args: unknown[]) {\n\tif (process.env.APIFY_CLI_DEBUG) {\n\t\tconsole.error(chalk.gray(`[${tag}]`), ...args);\n\t}\n}\n","import { realpathSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { warning } from '../outputs.js';\n\nexport const DEVELOPMENT_VERSION_MARKER = '0.0.0';\nexport const DEVELOPMENT_HASH_MARKER = '0000000';\n\n// These values are replaced with the actual values when building the CLI\nconst CLI_VERSION = \"1.2.2-beta.8\";\nconst CLI_HASH = \"49787d0f06e3edef05ce2607ed14314ade4498fd\";\n\nexport type InstallMethod = 'npm' | 'pnpm' | 'homebrew' | 'volta' | 'bundle' | 'bun';\n\nexport interface CLIMetadata {\n\tversion: string;\n\thash: string;\n\truntime: ReturnType<typeof getRuntimeInfo>;\n\tplatform: Exclude<typeof process.platform, 'win32'> | 'windows';\n\tarch: typeof process.arch;\n\textraRuntimeData: string;\n\tinstallMethod: InstallMethod;\n\tfullVersionString: string;\n\t/**\n\t * When set, represents the APIFY_CLI_HOME environment variable / $HOME/.apify/bin folder (when installed via bundles).\n\t */\n\tinstallPath?: string;\n\tisBeta: boolean;\n}\n\nfunction detectInstallMethod(): InstallMethod {\n\t// Will be useful once npm versions move to running from bundles (and for testing)\n\tif (process.env.APIFY_CLI_MARKED_INSTALL_METHOD) {\n\t\treturn process.env.APIFY_CLI_MARKED_INSTALL_METHOD as InstallMethod;\n\t}\n\n\t// This if check is special, and gets replaced with an always-true branch when running from bun bundles\n\tif (process.env.APIFY_CLI_BUNDLE) {\n\t\treturn 'bundle';\n\t}\n\n\tconst entrypointFilePathRaw = process.argv[1];\n\n\t// Should be impossible, but if it is\n\tif (!entrypointFilePathRaw) {\n\t\twarning({ message: `Failed to detect install method of CLI, assuming npm` });\n\t\treturn 'npm';\n\t}\n\n\tconst entrypointFilePath = realpathSync(entrypointFilePathRaw);\n\n\tif (process.env.VOLTA_HOME && entrypointFilePath.includes(process.env.VOLTA_HOME)) {\n\t\treturn 'volta';\n\t}\n\n\tif (entrypointFilePath.includes('homebrew/Cellar') || entrypointFilePath.includes('linuxbrew/Cellar')) {\n\t\treturn 'homebrew';\n\t}\n\n\tif (process.env.PNPM_HOME && entrypointFilePath.includes(process.env.PNPM_HOME)) {\n\t\treturn 'pnpm';\n\t}\n\n\tif (process.env.BUN_INSTALL && entrypointFilePath.includes(process.env.BUN_INSTALL)) {\n\t\treturn 'bun';\n\t}\n\n\treturn 'npm';\n}\n\nfunction getRuntimeInfo() {\n\tif (process.versions.bun) {\n\t\treturn {\n\t\t\truntime: 'bun',\n\t\t\tversion: process.versions.bun,\n\t\t\tnodeVersion: process.versions.node,\n\t\t};\n\t}\n\n\tif (process.versions.deno) {\n\t\treturn {\n\t\t\truntime: 'deno',\n\t\t\tversion: process.versions.deno,\n\t\t\tnodeVersion: process.versions.node,\n\t\t};\n\t}\n\n\treturn {\n\t\truntime: 'node',\n\t\tversion: process.versions.node,\n\t};\n}\n\nlet cachedMetadata: CLIMetadata | null = null;\n\nexport function useCLIMetadata(): CLIMetadata {\n\tif (cachedMetadata) {\n\t\treturn cachedMetadata;\n\t}\n\n\tconst installMethod = detectInstallMethod();\n\tconst runtime = getRuntimeInfo();\n\n\tcachedMetadata = {\n\t\tversion: CLI_VERSION,\n\t\thash: CLI_HASH,\n\t\tarch: (process.env.APIFY_BUNDLE_ARCH as typeof process.arch) ?? process.arch,\n\t\tplatform: process.platform === 'win32' ? 'windows' : process.platform,\n\t\truntime,\n\t\textraRuntimeData: runtime.nodeVersion ? `(emulating node ${runtime.nodeVersion})` : '',\n\t\tinstallMethod,\n\t\tget fullVersionString() {\n\t\t\treturn `apify-cli/${this.version} (${this.hash.slice(0, 7)}) running on ${this.platform}-${this.arch} with ${this.runtime.runtime}-${runtime.version}${this.extraRuntimeData ? ` ${this.extraRuntimeData}` : ''}, installed via ${this.installMethod}`;\n\t\t},\n\t\tget isBeta() {\n\t\t\treturn this.version.includes('beta') || this.version === DEVELOPMENT_VERSION_MARKER;\n\t\t},\n\t};\n\n\tif (installMethod === 'bundle') {\n\t\tcachedMetadata.installPath = dirname(process.execPath);\n\t}\n\n\treturn cachedMetadata;\n}\n","import chalk from 'chalk';\n\nexport interface LogOptions {\n\tstdoutOutput?: unknown[];\n\tstderrOutput?: unknown[];\n}\n\nfunction internalLog(options: LogOptions) {\n\tif (options.stdoutOutput) {\n\t\tconsole.log(...options.stdoutOutput);\n\t}\n\n\tif (options.stderrOutput) {\n\t\tconsole.error(...options.stderrOutput);\n\t}\n}\n\nexport interface SimpleLogOptions {\n\tstdout?: boolean;\n\tmessage: string;\n}\n\nexport function simpleLog(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [options.message],\n\t});\n}\n\nexport function error(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.red('Error:'), options.message],\n\t});\n}\n\nexport function warning(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.yellow.bold('Warning:'), options.message],\n\t});\n}\n\nexport function success(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.green('Success:'), options.message],\n\t});\n}\n\nexport function run(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.gray('Run:'), options.message],\n\t});\n}\n\nexport function info(options: SimpleLogOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.white('Info:'), options.message],\n\t});\n}\n\nexport interface SimpleLinkOptions extends SimpleLogOptions {\n\turl: string;\n}\n\nexport function link(options: SimpleLinkOptions) {\n\tinternalLog({\n\t\t[options.stdout ? 'stdoutOutput' : 'stderrOutput']: [chalk.blue(options.message), options.url],\n\t});\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { cryptoRandomObjectId } from '@apify/utilities';\n\nimport { TELEMETRY_FILE_PATH } from '../../consts.js';\nimport { info } from '../../outputs.js';\nimport type { AuthJSON } from '../../types.js';\nimport { getLocalUserInfo } from '../../utils.js';\n\ntype TelemetryState = TelemetryStateV0 | TelemetryStateV1;\n\ntype LatestTelemetryState = TelemetryStateV1;\n\ninterface TelemetryStateV0 {\n\tdistinctId: string;\n\tversion?: never;\n}\n\ninterface TelemetryStateV1 {\n\tversion: 1;\n\tenabled: boolean;\n\tuserId?: string | null;\n\tanonymousId: string;\n}\n\nconst telemetryWarningText = [\n\t'Apify collects telemetry data about general usage of Apify CLI to help us improve the product.',\n\t'This feature is enabled by default, and you can disable it by setting the \"APIFY_CLI_DISABLE_TELEMETRY\" environment variable to \"1\", or by running \"apify telemetry disable\".',\n\t'You can find more information about our telemetry in https://docs.apify.com/cli/docs/telemetry.',\n].join('\\n');\n\nfunction createAnonymousId() {\n\treturn `CLI:${cryptoRandomObjectId()}`;\n}\n\nasync function migrateStateV0ToV1(state: TelemetryState) {\n\tif (state.version && state.version >= 1) {\n\t\treturn false;\n\t}\n\n\tconst casted = state as TelemetryStateV0;\n\n\tconst existingAuthState = await getLocalUserInfo().catch(() => ({}) as AuthJSON);\n\n\tupdateTelemetryState({ version: 1, enabled: true } as never, (stateToUpdate) => {\n\t\tif (existingAuthState.id && casted.distinctId === existingAuthState.id) {\n\t\t\tstateToUpdate.anonymousId = createAnonymousId();\n\t\t\tstateToUpdate.userId = existingAuthState.id;\n\t\t} else {\n\t\t\tstateToUpdate.anonymousId = casted.distinctId;\n\t\t}\n\t});\n\n\treturn true;\n}\n\nexport async function useTelemetryState(): Promise<LatestTelemetryState> {\n\tconst filePath = TELEMETRY_FILE_PATH();\n\n\tconst exists = existsSync(filePath);\n\n\tif (!exists) {\n\t\tconst existingAuthState = await getLocalUserInfo().catch(() => ({}) as AuthJSON);\n\n\t\tupdateTelemetryState({\n\t\t\tversion: 1,\n\t\t\tenabled: true,\n\t\t\tanonymousId: createAnonymousId(),\n\t\t\tuserId: existingAuthState.id,\n\t\t});\n\n\t\t// First time we are tracking telemetry, so we want to notify user about it.\n\t\tinfo({ message: telemetryWarningText });\n\n\t\treturn useTelemetryState();\n\t}\n\n\tconst state = JSON.parse(readFileSync(filePath, 'utf-8')) as TelemetryState;\n\n\tif (await migrateStateV0ToV1(state)) {\n\t\treturn useTelemetryState();\n\t}\n\n\tconst casted = state as LatestTelemetryState;\n\n\treturn casted;\n}\n\nexport type StateUpdater = (state: LatestTelemetryState) => void;\n\nexport function updateTelemetryState(state: LatestTelemetryState, updater?: StateUpdater) {\n\t// Update the state in memory\n\tconst stateClone = { ...state };\n\tupdater?.(stateClone);\n\n\tconst filePath = TELEMETRY_FILE_PATH();\n\tconst dirPath = dirname(filePath);\n\n\tmkdirSync(dirPath, { recursive: true });\n\n\twriteFileSync(TELEMETRY_FILE_PATH(), JSON.stringify(stateClone, null, '\\t'));\n}\n\nexport async function updateUserId(userId: string | null) {\n\tconst state = await useTelemetryState();\n\n\tupdateTelemetryState(state, (stateToUpdate) => {\n\t\tstateToUpdate.userId = userId;\n\t});\n}\n\nexport async function updateTelemetryEnabled(enabled: boolean) {\n\tconst state = await useTelemetryState();\n\n\tupdateTelemetryState(state, (stateToUpdate) => {\n\t\tstateToUpdate.enabled = enabled;\n\t});\n}\n","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { KEY_VALUE_STORE_KEYS, META_ORIGINS } from '@apify/consts';\n\nimport pkg from '../../package.json' with { type: 'json' };\n\nexport const DEFAULT_LOCAL_STORAGE_DIR = 'storage';\n\nexport const LEGACY_LOCAL_STORAGE_DIR = 'apify_storage';\n\nexport const ACTOR_SPECIFICATION_VERSION = 1;\n\nexport const EMPTY_LOCAL_CONFIG = {\n\tactorSpecification: ACTOR_SPECIFICATION_VERSION,\n\tname: null,\n\tversion: '0.0',\n\tbuildTag: 'latest',\n\tenvironmentVariables: {},\n};\n\nexport const CHECK_VERSION_EVERY_MILLIS = 24 * 60 * 60 * 1000; // Once a day\n\nexport const GLOBAL_CONFIGS_FOLDER = () => {\n\tconst base = join(homedir(), '.apify');\n\n\tif (process.env.__APIFY_INTERNAL_TEST_AUTH_PATH__) {\n\t\treturn join(base, process.env.__APIFY_INTERNAL_TEST_AUTH_PATH__);\n\t}\n\n\treturn base;\n};\n\nexport const AUTH_FILE_PATH = () => join(GLOBAL_CONFIGS_FOLDER(), 'auth.json');\n\nexport const SECRETS_FILE_PATH = () => join(GLOBAL_CONFIGS_FOLDER(), 'secrets.json');\n\nexport const STATE_FILE_PATH = () => join(GLOBAL_CONFIGS_FOLDER(), 'state.json');\n\nexport const TELEMETRY_FILE_PATH = () => join(GLOBAL_CONFIGS_FOLDER(), 'telemetry.json');\n\nexport const DEPRECATED_LOCAL_CONFIG_NAME = 'apify.json';\n\nexport const ACTOR_SPECIFICATION_FOLDER = '.actor';\n\nexport const LOCAL_CONFIG_NAME = 'actor.json';\n\nexport const LOCAL_CONFIG_PATH = join(ACTOR_SPECIFICATION_FOLDER, LOCAL_CONFIG_NAME);\n\nexport const INPUT_FILE_REG_EXP = new RegExp(`(^${KEY_VALUE_STORE_KEYS.INPUT}(?:\\\\.[^.]+)?$)`);\n\nexport const SUPPORTED_NODEJS_VERSION = pkg.engines.node;\n\nexport const APIFY_CLIENT_DEFAULT_HEADERS = { 'X-Apify-Request-Origin': META_ORIGINS.CLI };\n\nexport const MINIMUM_SUPPORTED_PYTHON_VERSION = '3.9.0';\n\nexport const PYTHON_VENV_PATH = '.venv';\n\nexport enum CommandExitCodes {\n\tBuildFailed = 1,\n\tRunFailed = 1,\n\n\tBuildTimedOut = 2,\n\n\tBuildAborted = 3,\n\tRunAborted = 3,\n\n\tNoFilesToPush = 4,\n\n\tInvalidInput = 5,\n\tInvalidActorJson = 5,\n\n\tNotFound = 250,\n\tNotImplemented = 255,\n}\n","{\n \"name\": \"apify-cli\",\n \"version\": \"1.2.2-beta.8\",\n \"description\": \"Apify command-line interface (CLI) helps you manage the Apify cloud platform and develop, build, and deploy Apify Actors.\",\n \"exports\": \"./dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev:apify\": \"tsx ./src/entrypoints/apify.ts\",\n \"dev:actor\": \"tsx ./src/entrypoints/actor.ts\",\n \"test:all\": \"yarn test:local && yarn test:api\",\n \"test:local\": \"vitest run --testNamePattern '^((?!\\\\[api]).)*$' --exclude ./test/api\",\n \"test:api\": \"vitest run --testNamePattern '\\\\[api\\\\]'\",\n \"test:python\": \"vitest run --testNamePattern '\\\\[python\\\\]'\",\n \"test:cucumber\": \"cross-env NODE_OPTIONS=\\\"--import tsx\\\" cucumber-js\",\n \"lint\": \"eslint src test scripts features --ext .ts,.cjs,.mjs\",\n \"lint:fix\": \"eslint src test scripts features --fix --ext .ts,.cjs,.mjs\",\n \"format\": \"biome format . && prettier --check \\\"**/*.{md,yml,yaml}\\\"\",\n \"format:fix\": \"biome format --write . && prettier --write \\\"**/*.{md,yml,yaml}\\\"\",\n \"clean\": \"rimraf dist\",\n \"build\": \"yarn clean && tsc && tsup\",\n \"build-bundles\": \"bun run scripts/build-cli-bundles.ts\",\n \"prepack\": \"yarn insert-cli-metadata && yarn build && yarn update-docs\",\n \"insert-cli-metadata\": \"tsx scripts/insert-cli-metadata.ts\",\n \"update-docs\": \"tsx scripts/generate-cli-docs.ts\",\n \"postinstall\": \"node -e \\\"console.log('We have an active developer community on Discord. You can find it on https://discord.gg/crawlee-apify-801163717915574323.');\\\"\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"actor\": \"./dist/actor.js\",\n \"apify\": \"./dist/apify.js\",\n \"apify-cli\": \"./dist/apify.js\"\n },\n \"contributors\": [\n \"Jakub Drobník <jakub.drobnik@apify.com>\",\n \"Jan Curn <jan@apify.com>\",\n \"Vlad Frangu <vlad.frangu@apify.com>\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/apify/apify-cli.git\"\n },\n \"keywords\": [\n \"apify\",\n \"client\",\n \"node\",\n \"command\",\n \"line\",\n \"bash\"\n ],\n \"author\": {\n \"name\": \"Apify\",\n \"email\": \"support@apify.com\",\n \"url\": \"https://www.apify.com\"\n },\n \"license\": \"Apache-2.0\",\n \"bugs\": {\n \"url\": \"https://github.com/apify/apify-cli/issues\"\n },\n \"homepage\": \"https://github.com/apify/apify-cli#readme\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"dependencies\": {\n \"@apify/actor-memory-expression\": \"^0.1.3\",\n \"@apify/actor-templates\": \"^0.1.5\",\n \"@apify/consts\": \"^2.36.0\",\n \"@apify/input_schema\": \"^3.17.0\",\n \"@apify/utilities\": \"^2.18.0\",\n \"@crawlee/memory-storage\": \"^3.12.0\",\n \"@inquirer/core\": \"^11.0.0\",\n \"@inquirer/input\": \"^5.0.0\",\n \"@inquirer/password\": \"^5.0.0\",\n \"@inquirer/select\": \"^5.0.0\",\n \"@root/walk\": \"~1.1.0\",\n \"@sapphire/duration\": \"^1.1.2\",\n \"@sapphire/result\": \"^2.7.2\",\n \"@sapphire/timestamp\": \"^1.0.3\",\n \"@skyra/jaro-winkler\": \"^1.1.1\",\n \"adm-zip\": \"~0.5.15\",\n \"ajv\": \"~8.17.1\",\n \"apify-client\": \"^2.14.0\",\n \"archiver\": \"~7.0.1\",\n \"axios\": \"^1.11.0\",\n \"chalk\": \"~5.6.0\",\n \"cli-table3\": \"^0.6.5\",\n \"computer-name\": \"~0.1.0\",\n \"configparser\": \"~0.3.10\",\n \"cors\": \"~2.8.5\",\n \"detect-indent\": \"~7.0.1\",\n \"escape-string-regexp\": \"~5.0.0\",\n \"execa\": \"^9.5.2\",\n \"express\": \"~5.2.0\",\n \"globby\": \"~16.1.0\",\n \"handlebars\": \"~4.7.8\",\n \"indent-string\": \"^5.0.0\",\n \"is-ci\": \"~4.1.0\",\n \"istextorbinary\": \"~9.5.0\",\n \"jju\": \"~1.4.0\",\n \"js-levenshtein\": \"^1.1.6\",\n \"lodash.clonedeep\": \"^4.5.0\",\n \"mime\": \"~4.1.0\",\n \"open\": \"~11.0.0\",\n \"rimraf\": \"~6.1.0\",\n \"semver\": \"~7.7.0\",\n \"string-width\": \"^8.0.0\",\n \"strip-ansi\": \"^7.1.0\",\n \"tiged\": \"~2.12.7\",\n \"which\": \"^6.0.0\",\n \"widest-line\": \"^5.0.0\",\n \"wrap-ansi\": \"^9.0.0\"\n },\n \"devDependencies\": {\n \"@apify/eslint-config\": \"^1.0.0\",\n \"@apify/tsconfig\": \"^0.1.1\",\n \"@biomejs/biome\": \"^2.0.0\",\n \"@crawlee/types\": \"^3.11.1\",\n \"@cucumber/cucumber\": \"^12.0.0\",\n \"@types/adm-zip\": \"^0.5.5\",\n \"@types/archiver\": \"^7.0.0\",\n \"@types/bun\": \"^1.2.5\",\n \"@types/cors\": \"^2.8.17\",\n \"@types/execa\": \"^2.0.2\",\n \"@types/express\": \"^5.0.0\",\n \"@types/is-ci\": \"^3.0.4\",\n \"@types/jju\": \"^1.4.5\",\n \"@types/js-levenshtein\": \"^1\",\n \"@types/lodash.clonedeep\": \"^4\",\n \"@types/mime\": \"^4.0.0\",\n \"@types/node\": \"^24.0.0\",\n \"@types/semver\": \"^7.5.8\",\n \"@types/which\": \"^3.0.4\",\n \"@yarnpkg/core\": \"^4.1.2\",\n \"apify\": \"^3.2.4\",\n \"cross-env\": \"^10.0.0\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"lint-staged\": \"^16.0.0\",\n \"mock-stdin\": \"^1.0.0\",\n \"prettier\": \"^3.5.3\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.16.5\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.31.0\",\n \"vitest\": \"^4.0.0\"\n },\n \"volta\": {\n \"node\": \"24.13.0\",\n \"yarn\": \"4.12.0\"\n },\n \"packageManager\": \"yarn@4.12.0\",\n \"devEngines\": {\n \"runtime\": [\n {\n \"name\": \"node\",\n \"version\": \">= 20\",\n \"onFail\": \"error\"\n },\n {\n \"name\": \"bun\",\n \"version\": \">= 1.2.5\",\n \"onFail\": \"ignore\"\n }\n ],\n \"packageManager\": {\n \"name\": \"yarn\",\n \"version\": \">= 4\",\n \"onFail\": \"warn\"\n }\n },\n \"lint-staged\": {\n \"*\": \"biome format --write --no-errors-on-unmatched\",\n \"*.{mjs,js,ts}\": \"eslint --fix --ext mjs,js,ts\",\n \"*.md\": \"prettier --write\"\n },\n \"resolutions\": {\n \"tar\": \"7.5.3\"\n }\n}\n","import { createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { mkdir, readFile } from 'node:fs/promises';\nimport type { IncomingMessage } from 'node:http';\nimport { get } from 'node:https';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { finished } from 'node:stream/promises';\n\nimport { DurationFormatter as SapphireDurationFormatter, TimeTypes } from '@sapphire/duration';\nimport { Timestamp } from '@sapphire/timestamp';\nimport AdmZip from 'adm-zip';\nimport _Ajv2019 from 'ajv/dist/2019.js';\nimport { type ActorRun, ApifyClient, type ApifyClientOptions, type Build } from 'apify-client';\nimport archiver from 'archiver';\nimport { AxiosHeaders } from 'axios';\nimport escapeStringRegexp from 'escape-string-regexp';\nimport { globby } from 'globby';\nimport { getEncoding } from 'istextorbinary';\nimport { Mime } from 'mime';\nimport otherMimes from 'mime/types/other.js';\nimport standardMimes from 'mime/types/standard.js';\nimport { gte, minVersion, satisfies } from 'semver';\n\nimport {\n\tACTOR_ENV_VARS,\n\tACTOR_JOB_TERMINAL_STATUSES,\n\tACTOR_NAME,\n\tAPIFY_ENV_VARS,\n\tKEY_VALUE_STORE_KEYS,\n\tLOCAL_ACTOR_ENV_VARS,\n\tLOCAL_STORAGE_SUBDIRS,\n\tSOURCE_FILE_FORMATS,\n} from '@apify/consts';\n\nimport {\n\tAPIFY_CLIENT_DEFAULT_HEADERS,\n\tAUTH_FILE_PATH,\n\tDEFAULT_LOCAL_STORAGE_DIR,\n\tGLOBAL_CONFIGS_FOLDER,\n\tINPUT_FILE_REG_EXP,\n\tLOCAL_CONFIG_PATH,\n\tMINIMUM_SUPPORTED_PYTHON_VERSION,\n\tSUPPORTED_NODEJS_VERSION,\n} from './consts.js';\nimport { deleteFile, ensureFolderExistsSync, rimrafPromised } from './files.js';\nimport type { AuthJSON } from './types.js';\n\n// Export AJV properly: https://github.com/ajv-validator/ajv/issues/2132\n// Welcome to the state of JavaScript/TypeScript and CJS/ESM interop.\nexport const Ajv2019 = _Ajv2019 as unknown as typeof import('ajv/dist/2019.js').default;\n\nexport const httpsGet = async (url: string) => {\n\treturn new Promise<IncomingMessage>((resolve, reject) => {\n\t\tget(url, (response) => {\n\t\t\t// Handle redirects\n\t\t\tif (response.statusCode === 301 || response.statusCode === 302) {\n\t\t\t\tresolve(httpsGet(response.headers.location!));\n\t\t\t\t// Destroy the response to close the HTTP connection, otherwise this hangs for a long time with Node 19+ (due to HTTP keep-alive).\n\t\t\t\tresponse.destroy();\n\t\t\t} else {\n\t\t\t\tresolve(response);\n\t\t\t}\n\t\t}).on('error', reject);\n\t});\n};\n\nexport const getLocalStorageDir = () => {\n\tconst envVar = APIFY_ENV_VARS.LOCAL_STORAGE_DIR;\n\n\treturn process.env[envVar] || process.env.CRAWLEE_STORAGE_DIR || DEFAULT_LOCAL_STORAGE_DIR;\n};\n\nexport const getLocalKeyValueStorePath = (storeId?: string) => {\n\tconst envVar = ACTOR_ENV_VARS.DEFAULT_KEY_VALUE_STORE_ID;\n\tconst storeDir = storeId || process.env[envVar] || LOCAL_ACTOR_ENV_VARS[envVar];\n\n\treturn join(getLocalStorageDir(), LOCAL_STORAGE_SUBDIRS.keyValueStores, storeDir);\n};\n\nexport const getLocalDatasetPath = (storeId?: string) => {\n\tconst envVar = ACTOR_ENV_VARS.DEFAULT_DATASET_ID;\n\tconst storeDir = storeId || process.env[envVar] || LOCAL_ACTOR_ENV_VARS[envVar];\n\n\treturn join(getLocalStorageDir(), LOCAL_STORAGE_SUBDIRS.datasets, storeDir);\n};\n\nexport const getLocalRequestQueuePath = (storeId?: string) => {\n\tconst envVar = ACTOR_ENV_VARS.DEFAULT_REQUEST_QUEUE_ID;\n\tconst storeDir = storeId || process.env[envVar] || LOCAL_ACTOR_ENV_VARS[envVar];\n\n\treturn join(getLocalStorageDir(), LOCAL_STORAGE_SUBDIRS.requestQueues, storeDir);\n};\n\n/**\n * Returns object from auth file or empty object.\n */\nexport const getLocalUserInfo = async (): Promise<AuthJSON> => {\n\tlet result: AuthJSON = {};\n\ttry {\n\t\tconst raw = await readFile(AUTH_FILE_PATH(), 'utf-8');\n\t\tresult = JSON.parse(raw) as AuthJSON;\n\t} catch {\n\t\treturn {};\n\t}\n\n\tif (!result.username && !result.id) {\n\t\tthrow new Error('Corrupted local user info was found. Please run \"apify login\" to fix it.');\n\t}\n\n\treturn result;\n};\n\n/**\n * Gets instance of ApifyClient for user otherwise throws error\n */\nexport async function getLoggedClientOrThrow() {\n\tconst loggedClient = await getLoggedClient();\n\n\tif (!loggedClient) {\n\t\tthrow new Error('You are not logged in with your Apify account. Call \"apify login\" to fix that.');\n\t}\n\n\treturn loggedClient;\n}\n\nconst getTokenWithAuthFileFallback = (existingToken?: string) => {\n\tif (!existingToken && existsSync(GLOBAL_CONFIGS_FOLDER()) && existsSync(AUTH_FILE_PATH())) {\n\t\tconst raw = readFileSync(AUTH_FILE_PATH(), 'utf-8');\n\t\treturn JSON.parse(raw).token;\n\t}\n\n\treturn existingToken;\n};\n\n// biome-ignore format: off\ntype CJSAxiosHeaders = import('axios', { with: { 'resolution-mode': 'require' } }).AxiosRequestConfig['headers'];\n\n/**\n * Returns options for ApifyClient\n */\nexport const getApifyClientOptions = (token?: string, apiBaseUrl?: string): ApifyClientOptions => {\n\ttoken = getTokenWithAuthFileFallback(token);\n\n\treturn {\n\t\ttoken,\n\t\tbaseUrl: apiBaseUrl || process.env.APIFY_CLIENT_BASE_URL,\n\t\trequestInterceptors: [\n\t\t\t(config) => {\n\t\t\t\tconfig.headers ??= new AxiosHeaders() as CJSAxiosHeaders;\n\n\t\t\t\tfor (const [key, value] of Object.entries(APIFY_CLIENT_DEFAULT_HEADERS)) {\n\t\t\t\t\tconfig.headers![key] = value;\n\t\t\t\t}\n\n\t\t\t\treturn config;\n\t\t\t},\n\t\t],\n\t};\n};\n\n/**\n * Gets instance of ApifyClient for token or for params from global auth file.\n * NOTE: It refreshes global auth file each run\n * @param [token]\n */\nexport async function getLoggedClient(token?: string, apiBaseUrl?: string) {\n\ttoken = getTokenWithAuthFileFallback(token);\n\n\tconst apifyClient = new ApifyClient(getApifyClientOptions(token, apiBaseUrl));\n\n\tlet userInfo;\n\ttry {\n\t\tuserInfo = await apifyClient.user('me').get();\n\t} catch {\n\t\treturn null;\n\t}\n\n\t// Always refresh Auth file\n\tensureApifyDirectory(AUTH_FILE_PATH());\n\n\twriteFileSync(AUTH_FILE_PATH(), JSON.stringify({ token: apifyClient.token, ...userInfo }, null, '\\t'));\n\n\treturn apifyClient;\n}\n\nexport const getLocalConfigPath = (cwd: string) => join(cwd, LOCAL_CONFIG_PATH);\n\nexport const getJsonFileContent = <T = Record<string, unknown>>(filePath: string) => {\n\tif (!existsSync(filePath)) {\n\t\treturn;\n\t}\n\n\treturn JSON.parse(readFileSync(filePath, { encoding: 'utf-8' })) as T;\n};\n\nexport const getLocalConfig = (cwd: string) => getJsonFileContent(getLocalConfigPath(cwd));\n\nexport const setLocalConfig = async (localConfig: Record<string, unknown>, actDir?: string) => {\n\tconst fullPath = join(actDir || process.cwd(), LOCAL_CONFIG_PATH);\n\n\tawait mkdir(dirname(fullPath), { recursive: true });\n\n\twriteFileSync(fullPath, JSON.stringify(localConfig, null, '\\t'));\n};\n\nconst GITIGNORE_REQUIRED_CONTENTS = [getLocalStorageDir(), 'node_modules', '.venv'];\n\nexport const setLocalEnv = async (actDir: string) => {\n\t// Create folders for emulation Apify stores\n\tconst keyValueStorePath = getLocalKeyValueStorePath();\n\tensureFolderExistsSync(actDir, getLocalDatasetPath());\n\tensureFolderExistsSync(actDir, getLocalRequestQueuePath());\n\tensureFolderExistsSync(actDir, keyValueStorePath);\n\n\t// Create or update gitignore\n\tconst gitignorePath = join(actDir, '.gitignore');\n\tlet gitignoreContents = '';\n\tif (existsSync(gitignorePath)) {\n\t\tgitignoreContents = readFileSync(gitignorePath, { encoding: 'utf-8' });\n\t}\n\n\tconst gitignoreAdditions = [];\n\tfor (const gitignoreRequirement of GITIGNORE_REQUIRED_CONTENTS) {\n\t\tif (!RegExp(`^${escapeStringRegexp(gitignoreRequirement)}$`, 'mg').test(gitignoreContents)) {\n\t\t\tgitignoreAdditions.push(gitignoreRequirement);\n\t\t}\n\t}\n\n\tif (gitignoreAdditions.length > 0) {\n\t\tif (gitignoreContents.length > 0) {\n\t\t\tgitignoreAdditions.unshift('# Added by Apify CLI');\n\t\t\twriteFileSync(gitignorePath, `\\n${gitignoreAdditions.join('\\n')}\\n`, { flag: 'a' });\n\t\t} else {\n\t\t\twriteFileSync(gitignorePath, `${gitignoreAdditions.join('\\n')}\\n`, { flag: 'w' });\n\t\t}\n\t}\n};\n\nconst mime = new Mime(standardMimes, otherMimes).define(\n\t{\n\t\t// .tgz files don't have a MIME type defined, this fixes it\n\t\t'application/gzip': ['tgz'],\n\t\t// Default mime-type for .ts(x) files is video/mp2t. But in our usecases they're almost always TypeScript, which we want to treat as text\n\t\t'text/typescript': ['ts', 'tsx', 'mts'],\n\t},\n\ttrue,\n);\n\n// Detect whether file is binary from its MIME type, or if not available, contents\nconst getSourceFileFormat = (filePath: string, fileContent: Buffer) => {\n\t// Try to detect the MIME type from the file path\n\tconst contentType = mime.getType(filePath);\n\tif (contentType) {\n\t\tconst format =\n\t\t\tcontentType.startsWith('text/') ||\n\t\t\tcontentType.includes('javascript') ||\n\t\t\tcontentType.includes('json') ||\n\t\t\tcontentType.includes('xml') ||\n\t\t\tcontentType.includes('application/node') || // .cjs files\n\t\t\tcontentType.includes('application/toml') || // for example pyproject.toml files\n\t\t\tcontentType.includes('application/x-sh') || // .sh files\n\t\t\tcontentType.includes('application/x-httpd-php') // .php files\n\t\t\t\t? SOURCE_FILE_FORMATS.TEXT\n\t\t\t\t: SOURCE_FILE_FORMATS.BASE64;\n\n\t\treturn format;\n\t}\n\n\t// If the MIME type detection failed, try to detect the file encoding from the file content\n\tconst encoding = getEncoding(fileContent);\n\treturn encoding === 'binary' ? SOURCE_FILE_FORMATS.BASE64 : SOURCE_FILE_FORMATS.TEXT;\n};\n\nexport const createSourceFiles = async (paths: string[], cwd: string) => {\n\treturn paths.map((filePath) => {\n\t\tconst file = readFileSync(join(cwd, filePath));\n\t\tconst format = getSourceFileFormat(filePath, file);\n\t\treturn {\n\t\t\tname: filePath,\n\t\t\tformat,\n\t\t\tcontent: format === SOURCE_FILE_FORMATS.TEXT ? file.toString('utf8') : file.toString('base64'),\n\t\t};\n\t});\n};\n\n/**\n * Get Actor local files, omit files defined in .gitignore and .git folder\n * All dot files(.file) and folders(.folder/) are included.\n */\nexport const getActorLocalFilePaths = async (cwd?: string) =>\n\tglobby(['*', '**/**'], {\n\t\tignore: ['.git/**', 'apify_storage', 'node_modules', 'storage', 'crawlee_storage'],\n\t\tgitignore: true,\n\t\tdot: true,\n\t\tcwd,\n\t});\n\n/**\n * Create zip file with all Actor files specified with pathsToZip\n */\nexport const createActZip = async (zipName: string, pathsToZip: string[], cwd: string) => {\n\t// NOTE: There can be a zip from a previous unfinished operation.\n\tif (existsSync(zipName)) {\n\t\tawait deleteFile(zipName);\n\t}\n\n\tconst writeStream = createWriteStream(zipName);\n\tconst archive = archiver('zip');\n\tarchive.pipe(writeStream);\n\n\tpathsToZip.forEach((globPath) => archive.glob(globPath, { cwd }));\n\n\tawait archive.finalize();\n};\n\n/**\n * Get Actor input from local store\n */\nexport const getLocalInput = (cwd: string) => {\n\tconst defaultLocalStorePath = getLocalKeyValueStorePath();\n\n\tconst folderExists = existsSync(join(cwd, defaultLocalStorePath));\n\n\tif (!folderExists) return;\n\n\tconst files = readdirSync(join(cwd, defaultLocalStorePath));\n\tconst inputName = files.find((file) => !!file.match(INPUT_FILE_REG_EXP));\n\n\t// No input file\n\tif (!inputName) return;\n\n\tconst input = readFileSync(join(cwd, defaultLocalStorePath, inputName));\n\tconst contentType = mime.getType(inputName);\n\treturn { body: input, contentType, fileName: inputName };\n};\n\nexport const purgeDefaultQueue = async () => {\n\tconst defaultQueuesPath = getLocalRequestQueuePath();\n\tif (existsSync(getLocalStorageDir()) && existsSync(defaultQueuesPath)) {\n\t\tawait rimrafPromised(defaultQueuesPath);\n\t}\n};\n\nexport const purgeDefaultDataset = async () => {\n\tconst defaultDatasetPath = getLocalDatasetPath();\n\tif (existsSync(getLocalStorageDir()) && existsSync(defaultDatasetPath)) {\n\t\tawait rimrafPromised(defaultDatasetPath);\n\t}\n};\n\nexport const purgeDefaultKeyValueStore = async () => {\n\tconst defaultKeyValueStorePath = getLocalKeyValueStorePath();\n\tif (!existsSync(getLocalStorageDir()) || !existsSync(defaultKeyValueStorePath)) {\n\t\treturn;\n\t}\n\tconst filesToDelete = readdirSync(defaultKeyValueStorePath);\n\n\tconst deletePromises: Promise<void>[] = [];\n\tfilesToDelete.forEach((file) => {\n\t\tif (!file.match(INPUT_FILE_REG_EXP)) {\n\t\t\tdeletePromises.push(deleteFile(join(defaultKeyValueStorePath, file)));\n\t\t}\n\t});\n\n\tawait Promise.all(deletePromises);\n};\n\nexport const outputJobLog = async ({\n\tjob,\n\ttimeoutMillis,\n\tapifyClient,\n}: {\n\tjob: ActorRun | Build;\n\ttimeoutMillis?: number;\n\tapifyClient?: ApifyClient;\n}) => {\n\tconst { id: logId, status } = job;\n\tconst client = apifyClient || new ApifyClient({ baseUrl: process.env.APIFY_CLIENT_BASE_URL });\n\n\t// In case job was already done just output log\n\tif (ACTOR_JOB_TERMINAL_STATUSES.includes(status as never)) {\n\t\tif (process.env.APIFY_NO_LOGS_IN_TESTS) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst log = await client.log(logId).get();\n\t\tprocess.stderr.write(log!);\n\t\treturn;\n\t}\n\n\t// In other case stream it to stderr\n\t// eslint-disable-next-line no-async-promise-executor\n\treturn new Promise<'no-logs' | 'finished' | 'timeouts'>(async (resolve) => {\n\t\tconst stream = await client.log(logId).stream();\n\n\t\tif (!stream) {\n\t\t\tresolve('no-logs');\n\t\t\treturn;\n\t\t}\n\n\t\tlet nodeTimeout: NodeJS.Timeout | null = null;\n\n\t\tstream.on('data', (chunk) => {\n\t\t\t// In tests, writing to process.stderr directly messes with vitest's output\n\t\t\t// With that said, we still NEED to wait for this stream to end, as otherwise tests become flaky.\n\t\t\tif (process.env.APIFY_NO_LOGS_IN_TESTS) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprocess.stderr.write(chunk.toString());\n\t\t});\n\n\t\tstream.once('end', () => {\n\t\t\tresolve('finished');\n\n\t\t\tif (nodeTimeout) {\n\t\t\t\tclearTimeout(nodeTimeout);\n\t\t\t}\n\t\t});\n\n\t\tif (timeoutMillis) {\n\t\t\tnodeTimeout = setTimeout(() => {\n\t\t\t\tstream.destroy();\n\t\t\t\tresolve('timeouts');\n\t\t\t}, timeoutMillis);\n\t\t}\n\t});\n};\n\n/**\n * Returns npm command for current os\n * NOTE: For window we have to returns npm.cmd instead of npm, otherwise it doesn't work\n */\nexport const getNpmCmd = (): string => {\n\treturn /^win/.test(process.platform) ? 'npm.cmd' : 'npm';\n};\n\n/**\n * Returns true if apify storage is empty (expect INPUT.*)\n */\nexport const checkIfStorageIsEmpty = async () => {\n\tconst filesWithoutInput = await globby([\n\t\t`${getLocalStorageDir()}/**`,\n\t\t// Omit INPUT.* file\n\t\t`!${getLocalKeyValueStorePath()}/${KEY_VALUE_STORE_KEYS.INPUT}.*`,\n\t\t// Omit INPUT_CLI-* files\n\t\t`!${getLocalKeyValueStorePath()}/${KEY_VALUE_STORE_KEYS.INPUT}_CLI-*`,\n\t]);\n\n\treturn filesWithoutInput.length === 0;\n};\n\n/**\n * Validates Actor name, if finds issue throws error.\n * @param actorName\n */\nexport const validateActorName = (actorName: string) => {\n\tif (!ACTOR_NAME.REGEX.test(actorName)) {\n\t\tthrow new Error('The Actor name must be a DNS hostname-friendly string (e.g. my-newest-actor).');\n\t}\n\tif (actorName.length < ACTOR_NAME.MIN_LENGTH) {\n\t\tthrow new Error('The Actor name must be at least 3 characters long.');\n\t}\n\tif (actorName.length > ACTOR_NAME.MAX_LENGTH) {\n\t\tthrow new Error('The Actor name must be a maximum of 30 characters long.');\n\t}\n};\n\nexport const sanitizeActorName = (actorName: string) => {\n\tlet sanitizedName = actorName.replaceAll(/[^a-zA-Z0-9-]/g, '-');\n\n\tif (sanitizedName.length < ACTOR_NAME.MIN_LENGTH) {\n\t\tsanitizedName = `${sanitizedName}-apify-actor`;\n\t}\n\n\tsanitizedName = sanitizedName.replaceAll(/^-+/g, '').replaceAll(/-+$/g, '');\n\n\treturn sanitizedName.slice(0, ACTOR_NAME.MAX_LENGTH);\n};\n\nexport const isPythonVersionSupported = (installedPythonVersion: string) => {\n\treturn satisfies(installedPythonVersion, `^${MINIMUM_SUPPORTED_PYTHON_VERSION}`);\n};\n\nexport const isNodeVersionSupported = (installedNodeVersion: string) => {\n\t// SUPPORTED_NODEJS_VERSION can be a version range,\n\t// we need to get the minimum supported version from that range to be able to compare them\n\tconst minimumSupportedNodeVersion = minVersion(SUPPORTED_NODEJS_VERSION)!;\n\treturn gte(installedNodeVersion, minimumSupportedNodeVersion);\n};\n\nexport const downloadAndUnzip = async ({ url, pathTo }: { url: string; pathTo: string }) => {\n\tconst zipStream = await httpsGet(url);\n\tconst chunks: Buffer[] = [];\n\tzipStream.on('data', (chunk) => chunks.push(chunk));\n\tawait finished(zipStream);\n\tconst zip = new AdmZip(Buffer.concat(chunks));\n\tzip.extractAllTo(pathTo, true);\n};\n\n/**\n * Ensures the Apify directory exists, as well as nested folders (for tests)\n */\nexport function ensureApifyDirectory(file: string) {\n\tconst path = dirname(file);\n\n\tmkdirSync(path, { recursive: true });\n}\n\nexport const TimestampFormatter = new Timestamp('YYYY-MM-DD [at] HH:mm:ss');\n\nexport const MultilineTimestampFormatter = new Timestamp(`YYYY-MM-DD[\\n]HH:mm:ss`);\n\nexport const DateOnlyTimestampFormatter = new Timestamp('YYYY-MM-DD');\n\nexport const DurationFormatter = new SapphireDurationFormatter();\n\nexport const ShortDurationFormatter = new SapphireDurationFormatter({\n\t[TimeTypes.Day]: {\n\t\tDEFAULT: 'd',\n\t},\n\t[TimeTypes.Hour]: {\n\t\tDEFAULT: 'h',\n\t},\n\t[TimeTypes.Minute]: {\n\t\tDEFAULT: 'm',\n\t},\n\t[TimeTypes.Month]: {\n\t\tDEFAULT: 'M',\n\t},\n\t[TimeTypes.Second]: {\n\t\tDEFAULT: 's',\n\t},\n\t[TimeTypes.Week]: {\n\t\tDEFAULT: 'w',\n\t},\n\t[TimeTypes.Year]: {\n\t\tDEFAULT: 'y',\n\t},\n});\n\n/**\n * A \"polyfill\" for Object.groupBy\n */\nexport function objectGroupBy<K extends PropertyKey, T>(\n\titems: Iterable<T>,\n\tkeySelector: (item: T, index: number) => K,\n): Partial<Record<K, T[]>> {\n\tif ('groupBy' in Object) {\n\t\treturn (Object.groupBy as typeof objectGroupBy)(items, keySelector);\n\t}\n\n\tconst result: Partial<Record<K, T[]>> = {};\n\n\tlet i = 0;\n\n\tfor (const item of items) {\n\t\tconst key = keySelector(item, i++);\n\t\tif (!result[key]) {\n\t\t\tresult[key] = [];\n\t\t}\n\n\t\tresult[key].push(item);\n\t}\n\n\treturn result;\n}\n\n/**\n * A \"polyfill\" for Map.groupBy\n */\nexport function mapGroupBy<K, T>(items: Iterable<T>, keySelector: (item: T, index: number) => K): Map<K, T[]> {\n\tconst map = new Map<K, T[]>();\n\tlet index = 0;\n\n\tfor (const value of items) {\n\t\tconst key = keySelector(value, index++);\n\t\tconst list = map.get(key);\n\n\t\tif (list) {\n\t\t\tlist.push(value);\n\t\t} else {\n\t\t\tmap.set(key, [value]);\n\t\t}\n\t}\n\n\treturn map;\n}\n\nexport function printJsonToStdout(object: unknown) {\n\tconsole.log(JSON.stringify(object, null, 2));\n}\n\nexport const tildify = (path: string) => {\n\tif (path.startsWith(homedir())) {\n\t\treturn path.replace(homedir(), '~');\n\t}\n\n\treturn path;\n};\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { readFile, stat, unlink, writeFile } from 'node:fs/promises';\nimport { join, sep } from 'node:path';\n\nimport { rimraf } from 'rimraf';\n\nexport const updateLocalJson = async (\n\tjsonFilePath: string,\n\tupdateAttrs: Record<string, unknown> = {},\n\tnestedObjectAttr = null,\n) => {\n\tconst raw = await readFile(jsonFilePath, 'utf-8');\n\n\tconst currentObject = JSON.parse(raw) as Record<string, any>;\n\tlet newObject: Record<string, unknown>;\n\n\tif (nestedObjectAttr) {\n\t\tnewObject = currentObject;\n\t\tnewObject[nestedObjectAttr] = { ...currentObject[nestedObjectAttr], ...updateAttrs };\n\t} else {\n\t\tnewObject = { ...currentObject, ...updateAttrs };\n\t}\n\n\tawait writeFile(jsonFilePath, JSON.stringify(newObject, null, '\\t'));\n};\n\n/**\n * If you pass /foo/bar as rootPath and /baz/raz as folderPath then it ensures that following folders exists:\n *\n * /foo/bar/baz\n * /foo/bar/baz/raz\n *\n * If you pass only one parameter then rootPath is considered to be '.'\n */\nexport const ensureFolderExistsSync = (rootPath: string, folderPath?: string) => {\n\tif (!folderPath) {\n\t\tfolderPath = rootPath;\n\t\trootPath = '.';\n\t}\n\n\tconst parts = folderPath.split(sep);\n\tparts.reduce((currentPath, currentDir) => {\n\t\tcurrentPath = join(currentPath, currentDir);\n\n\t\tif (!existsSync(currentPath)) {\n\t\t\tmkdirSync(currentPath);\n\t\t}\n\n\t\treturn currentPath;\n\t}, rootPath);\n};\n\nexport const rimrafPromised = async (pathToBeRemoved: string | string[]) => {\n\tawait rimraf(pathToBeRemoved);\n};\n\nexport const deleteFile = async (filePath: string) => {\n\tconst res = await stat(filePath);\n\tif (res.isFile()) {\n\t\tawait unlink(filePath);\n\t}\n};\n\nexport const sumFilesSizeInBytes = async (pathToFiles: string[], cwd: string) => {\n\tconst filesStats = await Promise.all(pathToFiles.map(async (filePath) => stat(join(cwd, filePath))));\n\n\tconst filesSizeBytes = filesStats.map((stats) => stats.size).reduce((sum, fileSize) => sum + fileSize, 0);\n\n\treturn filesSizeBytes;\n};\n","import { cliDebugPrint } from '../../utils/cliDebugPrint.js';\nimport { useTelemetryState } from './useTelemetryState.js';\n\nexport async function useTelemetryEnabled() {\n\t// Env variable present and not false/0\n\tif (process.env.APIFY_CLI_DISABLE_TELEMETRY && !['false', '0'].includes(process.env.APIFY_CLI_DISABLE_TELEMETRY)) {\n\t\tcliDebugPrint('telemetry', 'disabled by env variable');\n\n\t\treturn false;\n\t}\n\n\tconst telemetryState = await useTelemetryState();\n\n\tcliDebugPrint('telemetry state', { telemetryState });\n\n\treturn telemetryState.enabled;\n}\n","import { useTelemetryState } from './useTelemetryState.js';\n\nexport interface TelemetryIdentifiers {\n\tanonymousId: string;\n\tuserId?: string | null;\n}\n\nexport async function useTelemetryIdentifiers(): Promise<TelemetryIdentifiers> {\n\tconst telemetryState = await useTelemetryState();\n\n\treturn {\n\t\tanonymousId: telemetryState.anonymousId,\n\t\tuserId: telemetryState.userId,\n\t};\n}\n","import { USER_AGENT } from '../../../entrypoints/_shared.js';\nimport { cliDebugPrint } from '../../utils/cliDebugPrint.js';\nimport type { InstallMethod } from '../useCLIMetadata.js';\nimport { useCLIMetadata } from '../useCLIMetadata.js';\nimport { useTelemetryEnabled } from './useTelemetryEnabled.js';\nimport { useTelemetryIdentifiers } from './useTelemetryIdentifiers.js';\n\nconst metadata = useCLIMetadata();\n\n// If we ever move to the EU workspace, use https://events.eu1.segmentapis.com/v1 instead\nconst SEGMENT_API_URL = 'https://api.segment.io/v1/track';\n\nconst SEGMENT_WRITE_KEY = metadata.isBeta ? 'rT67mFpIQD5qS9bJBoIYSFbZucrt2DZC' : '2uPK6yhPqjC0eNUFhaY78S26cRKyaa6t';\n\nexport interface TrackEventMap {\n\t[key: `cli_command_${string}`]: {\n\t\tinstallMethod: InstallMethod;\n\t\tosArch: typeof process.arch;\n\t\truntime: typeof metadata.runtime.runtime;\n\t\truntimeVersion: typeof metadata.runtime.version;\n\t\truntimeNodeVersion: typeof metadata.runtime.nodeVersion;\n\n\t\tcommandString: string;\n\t\tentrypoint: string;\n\n\t\tflagsUsed: string[];\n\n\t\tactorLanguage?: 'javascript' | 'python';\n\t\tactorRuntime?: string;\n\t\tactorRuntimeVersion?: string;\n\n\t\t// create command\n\t\tfromArchiveUrl?: boolean;\n\t\ttemplateId?: string;\n\t\ttemplateName?: string;\n\t\ttemplateLanguage?: string;\n\n\t\t// init command\n\t\tactorWrapper?: string;\n\t};\n}\n\nexport async function trackEvent<Event extends keyof TrackEventMap>(event: Event, eventData: TrackEventMap[Event]) {\n\tconst identifiers = await useTelemetryIdentifiers();\n\n\tconst segmentPayload = {\n\t\tanonymousId: identifiers.anonymousId,\n\t\tcontext: {\n\t\t\tapp: {\n\t\t\t\tname: 'apify-cli',\n\t\t\t\tversion: metadata.version,\n\t\t\t\tbuild: metadata.hash,\n\t\t\t},\n\t\t\tlibrary: {\n\t\t\t\tname: 'apify-cli',\n\t\t\t\tversion: metadata.version,\n\t\t\t},\n\t\t\tos: {\n\t\t\t\tname: metadata.platform,\n\t\t\t},\n\t\t\tuserAgent: USER_AGENT,\n\t\t\tchannel: 'server',\n\t\t},\n\t\tevent,\n\t\tproperties: {\n\t\t\t...eventData,\n\t\t\tapp: 'cli',\n\t\t},\n\t\ttimestamp: new Date().toISOString(),\n\t\tuserId: identifiers.userId,\n\n\t\t// write key\n\t\twriteKey: SEGMENT_WRITE_KEY,\n\t};\n\n\tcliDebugPrint('trackEvent', segmentPayload);\n\tconst telemetryEnabled = await useTelemetryEnabled();\n\n\tif (!telemetryEnabled) {\n\t\tcliDebugPrint('trackEvent', 'telemetry disabled');\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst res = await fetch(SEGMENT_API_URL, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(segmentPayload),\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tcliDebugPrint('trackEvent', 'failed to send event', await res.text());\n\t\t\treturn;\n\t\t}\n\n\t\tcliDebugPrint('trackEvent', 'event sent');\n\t} catch (error) {\n\t\tcliDebugPrint('trackEvent', 'failed to send event', error);\n\t}\n}\n","import { access, readFile } from 'node:fs/promises';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport process from 'node:process';\n\nimport { ok, type Result } from '@sapphire/result';\n\nimport { ScrapyProjectAnalyzer } from '../projects/scrapy/ScrapyProjectAnalyzer.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\nimport { useJavaScriptRuntime } from './runtimes/javascript.js';\nimport { usePythonRuntime } from './runtimes/python.js';\n\nexport enum ProjectLanguage {\n\tJavaScript = 0,\n\tPython = 1,\n\t// Special handling for Scrapy projects\n\tScrapy = 2,\n\tUnknown = 3,\n\t// TODO: eventually when we support entrypoint config in actor json\n\t// https://github.com/apify/apify-cli/issues/766\n\tStaticEntrypoint = 4,\n}\n\nexport interface Runtime {\n\texecutablePath: string;\n\tversion: string;\n\tpmName?: string;\n\tpmPath?: string | null;\n\tpmVersion?: string | null;\n\truntimeShorthand?: string;\n}\n\nexport interface Entrypoint {\n\tpath?: string;\n\tscript?: string;\n}\n\nexport interface CwdProject {\n\ttype: ProjectLanguage;\n\tentrypoint?: Entrypoint;\n\truntime?: Runtime;\n}\n\nexport interface CwdProjectError {\n\tmessage: string;\n}\n\nexport const cwdCache = new Map<string, CwdProject>();\n\nexport async function useCwdProject({\n\tcwd = process.cwd(),\n}: {\n\tcwd?: string;\n} = {}): Promise<Result<CwdProject, CwdProjectError>> {\n\tconst cached = cwdCache.get(cwd);\n\n\tif (cached) {\n\t\tcliDebugPrint('useCwdProject', { cacheHit: true, project: cached });\n\t\treturn ok(cached);\n\t}\n\n\tconst project: CwdProject = {\n\t\ttype: ProjectLanguage.Unknown,\n\t};\n\n\tconst check = async (): Promise<Result<CwdProject, CwdProjectError> | undefined> => {\n\t\tconst isScrapy = await checkScrapyProject(cwd);\n\n\t\tif (isScrapy) {\n\t\t\tproject.type = ProjectLanguage.Scrapy;\n\n\t\t\tconst runtime = await usePythonRuntime({ cwd });\n\n\t\t\tproject.runtime = runtime.unwrapOr(undefined);\n\n\t\t\tconst scrapyProject = new ScrapyProjectAnalyzer(cwd);\n\t\t\tscrapyProject.loadScrapyCfg();\n\n\t\t\tif (scrapyProject.configuration.hasKey('apify', 'mainpy_location')) {\n\t\t\t\tproject.entrypoint = {\n\t\t\t\t\tpath: scrapyProject.configuration.get('apify', 'mainpy_location')!,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// Fallback for scrapy projects that use apify, but are not \"migrated\" (like our templates)\n\t\t\t\tconst pythonFile = await checkPythonProject(cwd);\n\n\t\t\t\tif (pythonFile) {\n\t\t\t\t\tproject.entrypoint = {\n\t\t\t\t\t\tpath: pythonFile,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst isPython = await checkPythonProject(cwd);\n\n\t\tif (isPython) {\n\t\t\tproject.type = ProjectLanguage.Python;\n\n\t\t\tconst runtime = await usePythonRuntime({ cwd });\n\n\t\t\tproject.entrypoint = {\n\t\t\t\tpath: isPython,\n\t\t\t};\n\n\t\t\tproject.runtime = runtime.unwrapOr(undefined);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst isNode = await checkNodeProject(cwd);\n\n\t\tif (isNode) {\n\t\t\tproject.type = ProjectLanguage.JavaScript;\n\n\t\t\tconst runtime = await useJavaScriptRuntime();\n\n\t\t\tproject.runtime = runtime.unwrapOr(undefined);\n\n\t\t\tif (isNode.type === 'file') {\n\t\t\t\tproject.entrypoint = {\n\t\t\t\t\tpath: isNode.path,\n\t\t\t\t};\n\t\t\t} else if (isNode.type === 'script') {\n\t\t\t\tproject.entrypoint = {\n\t\t\t\t\tscript: isNode.script,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\treturn ok(project);\n\t};\n\n\tconst maybeErr = await check();\n\n\tif (maybeErr?.isErr()) {\n\t\tcliDebugPrint('useCwdProject', { cacheHit: false, error: maybeErr });\n\t\treturn maybeErr;\n\t}\n\n\tcliDebugPrint('useCwdProject', { cacheHit: false, project });\n\tcwdCache.set(cwd, project);\n\n\treturn ok(project);\n}\n\nasync function checkNodeProject(cwd: string) {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\ttry {\n\t\tconst rawString = await readFile(packageJsonPath, 'utf-8');\n\n\t\tconst pkg = JSON.parse(rawString);\n\n\t\t// Always prefer start script if it exists\n\t\tif (pkg.scripts?.start) {\n\t\t\treturn { type: 'script', script: 'start' } as const;\n\t\t}\n\n\t\t// Try to find the main entrypoint if it exists (if its a TypeScript file, the user has to deal with ensuring their runtime can run it directly)\n\t\tif (pkg.main) {\n\t\t\ttry {\n\t\t\t\tawait access(resolve(cwd, pkg.main));\n\n\t\t\t\treturn { path: resolve(cwd, pkg.main), type: 'file' } as const;\n\t\t\t} catch {\n\t\t\t\t// Ignore errors\n\t\t\t}\n\t\t}\n\n\t\t// We have a node project but we don't know what to do with it\n\t\treturn { type: 'unknown-entrypoint' } as const;\n\t} catch {\n\t\t// Ignore missing package.json and try some common files\n\t}\n\n\tconst filesToCheck = [\n\t\tjoin(cwd, 'index.js'),\n\t\tjoin(cwd, 'index.mjs'),\n\t\tjoin(cwd, 'index.cjs'),\n\t\tjoin(cwd, 'main.js'),\n\t\tjoin(cwd, 'main.mjs'),\n\t\tjoin(cwd, 'main.cjs'),\n\t\tjoin(cwd, 'src', 'index.js'),\n\t\tjoin(cwd, 'src', 'index.mjs'),\n\t\tjoin(cwd, 'src', 'index.cjs'),\n\t\tjoin(cwd, 'src', 'main.js'),\n\t\tjoin(cwd, 'src', 'main.mjs'),\n\t\tjoin(cwd, 'src', 'main.cjs'),\n\t\tjoin(cwd, 'dist', 'index.js'),\n\t\tjoin(cwd, 'dist', 'index.mjs'),\n\t\tjoin(cwd, 'dist', 'index.cjs'),\n\t\tjoin(cwd, 'dist', 'main.js'),\n\t\tjoin(cwd, 'dist', 'main.mjs'),\n\t\tjoin(cwd, 'dist', 'main.cjs'),\n\t];\n\n\tfor (const path of filesToCheck) {\n\t\ttry {\n\t\t\tawait access(path);\n\t\t\treturn { path, type: 'file' } as const;\n\t\t} catch {\n\t\t\t// Ignore errors\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function checkPythonProject(cwd: string) {\n\tconst baseName = basename(cwd);\n\n\tconst filesToCheck = [\n\t\tjoin(cwd, 'src', '__main__.py'),\n\t\tjoin(cwd, '__main__.py'),\n\t\tjoin(cwd, baseName, '__main__.py'),\n\t\tjoin(cwd, baseName.replaceAll('-', '_').replaceAll(' ', '_'), '__main__.py'),\n\t];\n\n\tfor (const path of filesToCheck) {\n\t\ttry {\n\t\t\tawait access(path);\n\n\t\t\t// By default in python, we run python3 -m <module>\n\t\t\t// For some unholy reason, python does NOT support absolute paths for this -.-\n\t\t\t// Effectively, this returns `src` from `/cwd/src/__main__.py`, et al.\n\t\t\treturn basename(dirname(path));\n\t\t} catch {\n\t\t\t// Ignore errors\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function checkScrapyProject(cwd: string) {\n\t// TODO: maybe rewrite this to a newer format 🤷\n\treturn ScrapyProjectAnalyzer.isApplicable(cwd);\n}\n","import { existsSync, readdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport ConfigParser from 'configparser';\n\nimport { useUserInput } from '../../hooks/user-confirmations/useUserInput.js';\nimport { SpiderFileAnalyzer } from './SpiderFileAnalyzer.js';\n\nexport class ScrapyProjectAnalyzer {\n\tpathname: string;\n\tconfiguration: ConfigParser = null!;\n\tsettings: { BOT_NAME: string; SPIDER_MODULES: string[] } | null = null;\n\n\tconstructor(pathname: string) {\n\t\tthis.pathname = pathname;\n\t\tthis.settings = null;\n\t\tthis.loadScrapyCfg();\n\t}\n\n\tstatic isApplicable(pathname: string) {\n\t\treturn existsSync(join(pathname, 'scrapy.cfg'));\n\t}\n\n\tasync init() {\n\t\tawait this.loadSettings();\n\t}\n\n\tloadScrapyCfg() {\n\t\tconst config = new ConfigParser();\n\t\tconst scrapyCfgPath = resolve(join(this.pathname, 'scrapy.cfg'));\n\n\t\tif (!existsSync(scrapyCfgPath)) {\n\t\t\tthrow new Error(`scrapy.cfg not found in \"${scrapyCfgPath}\".\nAre you sure there is a Scrapy project there?`);\n\t\t}\n\n\t\tconfig.read(scrapyCfgPath);\n\t\tthis.configuration = config;\n\t}\n\n\tasync loadSettings() {\n\t\tconst assumedBotName = this.configuration.get('settings', 'default')!.split('.')[0];\n\n\t\tconst botName = await useUserInput({\n\t\t\tmessage: 'Enter the Scrapy BOT_NAME (see settings.py):',\n\t\t\tdefault: assumedBotName,\n\t\t});\n\n\t\tconst spiderModules = await useUserInput({\n\t\t\tmessage: 'What folder are the Scrapy spider modules stored in? (see SPIDER_MODULES in settings.py):',\n\t\t\tdefault: `${assumedBotName}.spiders`,\n\t\t});\n\n\t\tthis.settings = {\n\t\t\tBOT_NAME: botName,\n\t\t\tSPIDER_MODULES: typeof spiderModules === 'string' ? [spiderModules] : spiderModules,\n\t\t};\n\t}\n\n\tgetName() {\n\t\treturn this.settings?.BOT_NAME;\n\t}\n\n\tgetAvailableSpiders() {\n\t\tconst spiderPaths = this.settings?.SPIDER_MODULES;\n\n\t\tif (!spiderPaths) {\n\t\t\tthrow new Error('SPIDER_MODULES path not found in settings.');\n\t\t}\n\n\t\tconst spiders = [];\n\n\t\tfor (const spiderPath of spiderPaths) {\n\t\t\tconst spidersDir = join(this.pathname, spiderPath.replaceAll('.', '/'));\n\n\t\t\tconst files = readdirSync(spidersDir, { withFileTypes: true });\n\t\t\tfor (const file of files) {\n\t\t\t\tif (file.isFile() && file.name.endsWith('.py') && file.name !== '__init__.py') {\n\t\t\t\t\tspiders.push(...new SpiderFileAnalyzer(join(spidersDir, file.name)).getSpiders());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn spiders;\n\t}\n}\n","import input from '@inquirer/input';\n\nimport { stdinCheckWrapper } from './_stdinCheckWrapper.js';\n\ninterface UseUserInputInput {\n\tmessage: string;\n\tvalidate?: (value: string) => boolean | string;\n\tdefault?: string;\n}\n\nexport const useUserInput = stdinCheckWrapper(\n\tasync ({ message, validate, default: defaultValue }: UseUserInputInput) => {\n\t\tconst result = await input({ message, validate, default: defaultValue });\n\n\t\treturn result;\n\t},\n\t{\n\t\terrorMessageForStdin: 'Please provide a valid input based on the command options.',\n\t},\n);\n","import isCI from 'is-ci';\n\nimport { useStdin } from '../useStdin.js';\n\nexport interface StdinCheckWrapperInput<ReturnedType> extends StdinCheckWrapperOptions {\n\t/**\n\t * When set, this value will be used in environments where stdin is not available.\n\t */\n\tprovidedConfirmFromStdin?: ReturnedType;\n}\n\ntype AllButFirst<T extends any[]> = T extends [any, ...infer Rest] ? Rest : never;\n\ntype NewFunctionArgs<Fn extends (...args: any[]) => any> = [\n\tParameters<Fn>[0] & StdinCheckWrapperInput<Awaited<ReturnType<Fn>>>,\n\t...AllButFirst<Parameters<Fn>>,\n];\n\nconst ConfirmFlag = 'confirm';\nconst NoConfirmFlag = `no-${ConfirmFlag}`;\n\ninterface StdinCheckWrapperOptions {\n\t/**\n\t * When set, this value will be used in environments where stdin is not available to provide a custom error message.\n\t *\n\t * It can be provided at the wrapped function level, or as a parameter to the called function.\n\t * The priority is:\n\t * - called function input if present\n\t * - wrapped function input if present\n\t * - default error message otherwise\n\t */\n\terrorMessageForStdin?: string;\n}\n\nexport function stdinCheckWrapper<Fn extends (...args: any[]) => any>(\n\tfn: Fn,\n\t{\n\t\terrorMessageForStdin = `Please use the --${ConfirmFlag}/--${NoConfirmFlag} flags to confirm the action.`,\n\t}: StdinCheckWrapperOptions = {},\n): (...args: NewFunctionArgs<Fn>) => Promise<Awaited<ReturnType<Fn>>> {\n\treturn async (input, ...rest) => {\n\t\tconst { isTTY, hasData } = await useStdin();\n\n\t\tconst casted = input as StdinCheckWrapperInput<Awaited<ReturnType<Fn>>>;\n\n\t\tif (isCI || (!isTTY && !hasData)) {\n\t\t\tif (typeof casted.providedConfirmFromStdin === 'undefined') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tcasted.errorMessageForStdin ??\n\t\t\t\t\t\terrorMessageForStdin ??\n\t\t\t\t\t\t`Please use the --${ConfirmFlag}/--${NoConfirmFlag} flags to confirm the action.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn casted.providedConfirmFromStdin;\n\t\t}\n\n\t\tconst res = await fn(input, ...rest);\n\n\t\treturn res;\n\t};\n}\n","import { constants, fstat as fstat_ } from 'node:fs';\nimport process from 'node:process';\nimport { promisify } from 'node:util';\n\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\n\nconst fstat = promisify(fstat_);\n\nexport interface StdinState {\n\tisTTY: boolean;\n\thasData: boolean;\n\twaitDelay: number;\n\tstream: typeof process.stdin;\n}\n\nlet cachedStdinState: StdinState | undefined;\n\nexport async function useStdin(): Promise<StdinState> {\n\tif (cachedStdinState) {\n\t\treturn cachedStdinState;\n\t}\n\n\tconst stdinStream = process.stdin;\n\n\t// The best showcase of what this does: https://stackoverflow.com/a/59024214\n\tconst state: StdinState = {\n\t\tisTTY: stdinStream.isTTY,\n\t\thasData: false,\n\t\twaitDelay: 0,\n\t\tstream: stdinStream,\n\t};\n\n\t// TODO: use os.guessFileDescriptorType instead once https://github.com/nodejs/node/pull/58060 lands in our supported node versions\n\n\tconst pipedIn = await fstat(0)\n\t\t.then((stat) => {\n\t\t\tcliDebugPrint('useStdin', {\n\t\t\t\tstat,\n\t\t\t\tisRegularFile: stat.isFile(),\n\t\t\t\tisDirectory: stat.isDirectory(),\n\t\t\t\tisBlockDevice: stat.isBlockDevice(),\n\t\t\t\tisCharDevice: stat.isCharacterDevice(),\n\t\t\t\tisSymbolicLink: stat.isSymbolicLink(),\n\t\t\t\tisFIFO: stat.isFIFO(),\n\t\t\t\tisSocket: stat.isSocket(),\n\t\t\t});\n\n\t\t\t// Right now, Windows always returns false for isFIFO, so we have to check for that manually\n\t\t\t// Windows might also wrongly return the mode for this, who knows!\n\t\t\t// TODO: https://github.com/nodejs/node/issues/57603\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tif ((stat.mode & constants.S_IFIFO) === constants.S_IFIFO) {\n\t\t\t\t\treturn 100;\n\t\t\t\t}\n\n\t\t\t\t// In node 18, for some reason this returns true for vitest, and thus always hangs.\n\t\t\t\tif (stat.isFile()) {\n\t\t\t\t\treturn 50;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// isFIFO -> `node a | node b`\n\t\t\t// isFile -> `node a < file`\n\t\t\t// isSocket -> child processes (I think) [but we set a timeout of 50ms to avoid hanging]\n\t\t\treturn stat.isFIFO() || stat.isFile() || (stat.isSocket() ? 50 : false);\n\t\t})\n\t\t.catch(() => false);\n\n\tcliDebugPrint('useStdin', {\n\t\thasData: state.hasData,\n\t\twaitDelay: state.waitDelay,\n\t\tisTTY: state.isTTY,\n\t\tpipedIn,\n\t\treadableEnded: stdinStream.readableEnded,\n\t});\n\n\t// The isTTY params will be true if there is no piping into stdin\n\t// pipedIn is set if someone either runs `node a | node b`, or `node a < file`\n\t// if that is the case, isTTY will be undefined (???)\n\t// readableEnded is a catch all for when the stream is closed\n\tif (!stdinStream.isTTY || (pipedIn !== false && (stdinStream.isTTY !== undefined || !stdinStream.readableEnded))) {\n\t\tstate.hasData = true;\n\t}\n\n\tif (typeof pipedIn === 'number') {\n\t\tstate.waitDelay = pipedIn;\n\t}\n\n\tcachedStdinState = state;\n\n\treturn state;\n}\n","import { readFileSync } from 'node:fs';\n\nimport { Spider } from './Spider.js';\n\nexport class SpiderFileAnalyzer {\n\tpathname: string;\n\n\tconstructor(pathname: string) {\n\t\tthis.pathname = pathname;\n\t}\n\n\tgetSpiders() {\n\t\tconst file = readFileSync(this.pathname, 'utf8');\n\n\t\tconst regex = /class\\s+(\\w+)/g;\n\t\tconst spiders = [];\n\n\t\tlet match = regex.exec(file);\n\t\twhile (match) {\n\t\t\tspiders.push(new Spider({ class_name: match[1], pathname: this.pathname }));\n\t\t\tmatch = regex.exec(file);\n\t\t}\n\n\t\treturn spiders;\n\t}\n}\n","export class Spider {\n\tname?: string;\n\tclass_name: string;\n\tstart_urls?: string;\n\tpathname: string;\n\n\tconstructor(data: SpiderData) {\n\t\tthis.name = data.name;\n\t\tthis.class_name = data.class_name;\n\t\tthis.start_urls = data.start_urls;\n\t\tthis.pathname = data.pathname;\n\t}\n}\n\nexport interface SpiderData {\n\tname?: string;\n\tclass_name: string;\n\tstart_urls?: string;\n\tpathname: string;\n}\n","import process from 'node:process';\n\nimport { none, type Option, some } from '@sapphire/result';\nimport { execa } from 'execa';\nimport which from 'which';\n\nimport { cliDebugPrint } from '../../utils/cliDebugPrint.js';\nimport type { Runtime } from '../useCwdProject.js';\nimport { normalizeExecutablePath } from './utils.js';\n\nconst cwdCache = new Map<string, Option<Runtime>>();\n\n// Runtimes, in order of preference\nconst runtimesToCheck = {\n\tnode: ['--version'],\n\tdeno: ['eval', '\"console.log(process.versions.node)\"'],\n\tbun: ['--eval', '\"console.log(process.versions.node)\"'],\n};\n\nasync function getRuntimeVersion(runtimePath: string, args: string[]) {\n\ttry {\n\t\tconst result = await execa(runtimePath, args, {\n\t\t\tshell: true,\n\t\t\twindowsHide: true,\n\t\t\tverbose: process.env.APIFY_CLI_DEBUG ? 'full' : undefined,\n\t\t});\n\n\t\t// No output -> issue or who knows\n\t\tif (!result.stdout) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn result.stdout.trim().replace(/^v/, '');\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function getNpmVersion(npmPath: string) {\n\tconst result = await execa(npmPath, ['--version'], {\n\t\tshell: true,\n\t\twindowsHide: true,\n\t\tverbose: process.env.APIFY_CLI_DEBUG ? 'full' : undefined,\n\t});\n\n\tif (!result.stdout) {\n\t\treturn null;\n\t}\n\n\treturn result.stdout.trim().replace(/^v/, '');\n}\n\nexport async function useJavaScriptRuntime(cwd = process.cwd()): Promise<Option<Runtime>> {\n\tconst cached = cwdCache.get(cwd);\n\n\tif (cached) {\n\t\tcliDebugPrint('useJavaScriptRuntime', { cacheHit: true, cwd, runtime: cached.unwrapOr(null) });\n\t\treturn cached;\n\t}\n\n\tfor (const [runtime, args] of Object.entries(runtimesToCheck) as [keyof typeof runtimesToCheck, string[]][]) {\n\t\ttry {\n\t\t\tconst runtimePath = normalizeExecutablePath(await which(runtime));\n\n\t\t\tconst version = await getRuntimeVersion(runtimePath, args);\n\n\t\t\tif (version) {\n\t\t\t\tconst res: Runtime = {\n\t\t\t\t\texecutablePath: runtimePath,\n\t\t\t\t\tversion,\n\t\t\t\t};\n\n\t\t\t\t// For npm, we also fetch the npm version\n\t\t\t\tif (runtime === 'node') {\n\t\t\t\t\tconst npmPath = normalizeExecutablePath(await which('npm').catch(() => null));\n\n\t\t\t\t\tif (npmPath) {\n\t\t\t\t\t\tres.pmPath = npmPath;\n\t\t\t\t\t\tres.pmVersion = await getNpmVersion(npmPath);\n\t\t\t\t\t\tres.pmName = 'npm';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// deno and bun support package.json scripts out of the box\n\t\t\t\telse {\n\t\t\t\t\tres.runtimeShorthand = runtime;\n\t\t\t\t\tres.pmPath = runtimePath;\n\t\t\t\t\tres.pmVersion = version;\n\t\t\t\t\tres.pmName = runtime;\n\t\t\t\t}\n\n\t\t\t\tcwdCache.set(cwd, some(res));\n\n\t\t\t\tcliDebugPrint('useJavaScriptRuntime', { cacheHit: false, cwd, runtime: cwdCache.get(cwd)?.unwrap() });\n\n\t\t\t\treturn some(res);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors\n\t\t}\n\t}\n\n\tcwdCache.set(cwd, none);\n\n\tcliDebugPrint('useJavaScriptRuntime', { cacheHit: false, cwd, runtime: null });\n\n\treturn none;\n}\n","import { stat } from 'node:fs/promises';\nimport { isAbsolute, join } from 'node:path';\n\nimport { ProjectLanguage, useCwdProject } from '../useCwdProject.js';\n\nexport function normalizeExecutablePath(path: string): string;\nexport function normalizeExecutablePath(path: string | null): string | null;\nexport function normalizeExecutablePath(path: string | null) {\n\tif (!path) {\n\t\treturn null;\n\t}\n\n\t// Already escaped\n\tif (path.startsWith('\"')) {\n\t\treturn path;\n\t}\n\n\t// Regardless of platform, if there is a space in the path, we need to escape it\n\tif (isAbsolute(path) && path.includes(' ')) {\n\t\treturn `\"${path}\"`;\n\t}\n\n\treturn path;\n}\n\nexport async function getInstallCommandSuggestion(actFolderDir: string) {\n\tlet installCommandSuggestion: string | null = null;\n\n\tconst projectInfo = await useCwdProject({ cwd: actFolderDir });\n\tawait projectInfo.inspectAsync(async (project) => {\n\t\tif (project.type === ProjectLanguage.JavaScript) {\n\t\t\tconst [hasYarnLock, hasPnpmLock, hasBunLockb, hasBunLock] = await Promise.all([\n\t\t\t\tstat(join(actFolderDir, 'yarn.lock'))\n\t\t\t\t\t.then(() => true)\n\t\t\t\t\t.catch(() => false),\n\t\t\t\tstat(join(actFolderDir, 'pnpm-lock.yaml'))\n\t\t\t\t\t.then(() => true)\n\t\t\t\t\t.catch(() => false),\n\t\t\t\tstat(join(actFolderDir, 'bun.lockb'))\n\t\t\t\t\t.then(() => true)\n\t\t\t\t\t.catch(() => false),\n\t\t\t\tstat(join(actFolderDir, 'bun.lock'))\n\t\t\t\t\t.then(() => true)\n\t\t\t\t\t.catch(() => false),\n\t\t\t]);\n\n\t\t\tconst hasAnyBunLock = hasBunLockb || hasBunLock;\n\t\t\tif (hasYarnLock) {\n\t\t\t\tinstallCommandSuggestion = 'yarn install';\n\t\t\t} else if (hasPnpmLock) {\n\t\t\t\tinstallCommandSuggestion = 'pnpm install';\n\t\t\t} else if (hasAnyBunLock) {\n\t\t\t\tinstallCommandSuggestion = 'bun install';\n\t\t\t} else if (project.runtime?.pmName === 'bun') {\n\t\t\t\tinstallCommandSuggestion = 'bun install';\n\t\t\t} else if (project.runtime?.pmName === 'deno') {\n\t\t\t\tinstallCommandSuggestion = 'deno install --node-modules-dir';\n\t\t\t} else {\n\t\t\t\tinstallCommandSuggestion = 'npm install';\n\t\t\t}\n\t\t} else if (project.type === ProjectLanguage.Python || project.type === ProjectLanguage.Scrapy) {\n\t\t\tinstallCommandSuggestion = 'python -m pip install -r requirements.txt';\n\t\t}\n\t});\n\n\treturn installCommandSuggestion;\n}\n","import { platform } from 'node:os';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nimport { none, type Option, some } from '@sapphire/result';\nimport { execa } from 'execa';\nimport which from 'which';\n\nimport { cliDebugPrint } from '../../utils/cliDebugPrint.js';\nimport type { Runtime } from '../useCwdProject.js';\nimport { normalizeExecutablePath } from './utils.js';\n\nconst cwdCache = new Map<string, Option<Runtime>>();\n\nasync function getPythonVersion(runtimePath: string) {\n\ttry {\n\t\tconst result = await execa(runtimePath, ['-c', '\"import platform; print(platform.python_version())\"'], {\n\t\t\tshell: true,\n\t\t\twindowsHide: true,\n\t\t\tverbose: process.env.APIFY_CLI_DEBUG ? 'full' : undefined,\n\t\t});\n\n\t\t// No output -> issue or who knows\n\t\tif (!result.stdout) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn result.stdout.trim();\n\t} catch {\n\t\t// const casted = ex as ExecaError;\n\n\t\treturn null;\n\t}\n}\n\nexport interface UsePythonRuntimeInput {\n\tcwd?: string;\n\tforce?: boolean;\n}\n\nexport async function usePythonRuntime({\n\tcwd = process.cwd(),\n\tforce = false,\n}: UsePythonRuntimeInput = {}): Promise<Option<Runtime>> {\n\tconst cached = cwdCache.get(cwd);\n\n\tif (cached && !force) {\n\t\tcliDebugPrint('usePythonRuntime', { cacheHit: true, cwd, runtime: cached.unwrapOr(null) });\n\t\treturn cached;\n\t}\n\n\tconst isWindows = platform() === 'win32';\n\n\tconst pathParts = isWindows ? ['Scripts', 'python.exe'] : ['bin', 'python3'];\n\n\tlet fullPythonVenvPath;\n\n\tif (process.env.VIRTUAL_ENV) {\n\t\tfullPythonVenvPath = join(process.env.VIRTUAL_ENV, ...pathParts);\n\t} else {\n\t\tfullPythonVenvPath = join(cwd, '.venv', ...pathParts);\n\t}\n\n\tfullPythonVenvPath = normalizeExecutablePath(fullPythonVenvPath);\n\n\ttry {\n\t\tconst version = await getPythonVersion(fullPythonVenvPath);\n\n\t\tif (version) {\n\t\t\tcwdCache.set(\n\t\t\t\tcwd,\n\t\t\t\tsome({\n\t\t\t\t\texecutablePath: fullPythonVenvPath,\n\t\t\t\t\tversion,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tcliDebugPrint('usePythonRuntime', { cacheHit: false, cwd, runtime: cwdCache.get(cwd)?.unwrap() });\n\n\t\t\treturn cwdCache.get(cwd)!;\n\t\t}\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\tconst fallbacks = ['python3', 'python', ...(isWindows ? ['python3.exe', 'python.exe'] : [])];\n\n\tfor (const fallback of fallbacks) {\n\t\ttry {\n\t\t\tconst fullPath = normalizeExecutablePath(await which(fallback));\n\n\t\t\tconst version = await getPythonVersion(fullPath);\n\n\t\t\tif (version) {\n\t\t\t\tcwdCache.set(\n\t\t\t\t\tcwd,\n\t\t\t\t\tsome({\n\t\t\t\t\t\texecutablePath: fullPath,\n\t\t\t\t\t\tversion,\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tcliDebugPrint('usePythonRuntime', { cacheHit: false, cwd, runtime: cwdCache.get(cwd)?.unwrap() });\n\n\t\t\t\treturn cwdCache.get(cwd)!;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Continue\n\t\t}\n\t}\n\n\tcwdCache.set(cwd, none);\n\n\tcliDebugPrint('usePythonRuntime', { cacheHit: false, cwd, runtime: null });\n\n\treturn none;\n}\n","import chalk from 'chalk';\n\nimport { cachedStdinInput } from '../../entrypoints/_shared.js';\nimport { useCLIMetadata } from '../hooks/useCLIMetadata.js';\nimport type { BuiltApifyCommand } from './apify-command.js';\nimport { selectiveRenderHelpForCommand } from './help.js';\n\nexport enum CommandErrorCode {\n\tNODEJS_ERR_PARSE_ARGS_INVALID_OPTION_VALUE,\n\tNODEJS_ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL,\n\tNODEJS_ERR_PARSE_ARGS_UNKNOWN_OPTION,\n\t/**\n\t * Used when a flag is provided multiple times\n\t */\n\tAPIFY_FLAG_PROVIDED_MULTIPLE_TIMES,\n\t/**\n\t * Used when a flag is provided with an invalid value (for example, an integer flag that cannot be parsed as an integer)\n\t */\n\tAPIFY_INVALID_FLAG_INTEGER_VALUE,\n\t/**\n\t * Used for options that have a list of choices, and the user provided one is not one of them\n\t */\n\tAPIFY_INVALID_CHOICE,\n\t/**\n\t * Used when a flag is required but not provided\n\t */\n\tAPIFY_MISSING_FLAG,\n\t/**\n\t * Used when a flag is provided, but it is exclusive with another flag\n\t */\n\tAPIFY_FLAG_IS_EXCLUSIVE_WITH_ANOTHER_FLAG,\n\t/**\n\t * Used when two flag options want to receive their value from stdin\n\t */\n\tAPIFY_TOO_MANY_REQUESTERS_OF_STDIN,\n\tAPIFY_UNKNOWN_ERROR,\n}\n\nexport interface FlagData {\n\tname: string;\n\texpectsValue: boolean;\n\tambiguousFlag?: string;\n\tambiguousMessage?: string;\n\tunknownOptionSuggestion?: string;\n\tshortForm?: boolean;\n}\n\nexport interface CommandErrorOptions {\n\tcode: CommandErrorCode;\n\tcommand: typeof BuiltApifyCommand;\n\tmessage?: string;\n\tmetadata?: CommandError['metadata'];\n}\n\nexport class CommandError extends Error {\n\tpublic readonly code: CommandErrorCode;\n\tpublic readonly command: typeof BuiltApifyCommand;\n\tpublic readonly metadata: Record<string, unknown>;\n\n\tpublic constructor({ code, message = '', metadata = {}, command }: CommandErrorOptions) {\n\t\tsuper(message || String(CommandErrorCode[code]));\n\t\tthis.code = code;\n\t\tthis.metadata = metadata;\n\t\tthis.command = command;\n\t}\n\n\tpublic extractFlagNameFromMessage(): FlagData {\n\t\tswitch (this.code) {\n\t\t\tcase CommandErrorCode.NODEJS_ERR_PARSE_ARGS_INVALID_OPTION_VALUE: {\n\t\t\t\tconst match =\n\t\t\t\t\t/'(?:-[a-z], )?-?-(?<flagName>[a-zA-Z-]+)(?: <value>)?' (?<noArg>does not take)?(?<missingArg>argument missing)?(?<ambiguous>argument is ambiguous\\.(?<ambiguousMessage>\\s*.*\\s*.*)?)?/gi.exec(\n\t\t\t\t\t\tthis.message,\n\t\t\t\t\t);\n\n\t\t\t\tif (!match) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Encountered unparsable error message from argument parser: ${this.message}.\\n\\nPlease report this issue at https://github.com/apify/apify-cli/issues`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst flagData: FlagData = {\n\t\t\t\t\tname: match.groups!.flagName,\n\t\t\t\t\texpectsValue: match.groups!.noArg === undefined,\n\t\t\t\t\tambiguousFlag: match.groups!.ambiguous ? match.groups!.ambiguous : undefined,\n\t\t\t\t\tambiguousMessage: match.groups!.ambiguousMessage\n\t\t\t\t\t\t? match.groups!.ambiguousMessage.trim()\n\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\n\t\t\t\treturn flagData;\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.NODEJS_ERR_PARSE_ARGS_UNKNOWN_OPTION: {\n\t\t\t\tconst match = /Unknown option '-(?<longForm>-)?(?<optionName>.+)'\\.(?<nodeSuggestion>.*)/gi.exec(\n\t\t\t\t\tthis.message,\n\t\t\t\t);\n\n\t\t\t\tif (!match) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Encountered unparsable error message from argument parser: ${this.message}.\\n\\nPlease report this issue at https://github.com/apify/apify-cli/issues`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tname: match.groups!.optionName,\n\t\t\t\t\texpectsValue: false,\n\t\t\t\t\tunknownOptionSuggestion: match.groups!.nodeSuggestion,\n\t\t\t\t\tshortForm: !match.groups!.longForm,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthrow new Error('Not implemented');\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getPrettyMessage(): string {\n\t\tswitch (this.code) {\n\t\t\tcase CommandErrorCode.NODEJS_ERR_PARSE_ARGS_INVALID_OPTION_VALUE: {\n\t\t\t\tconst flagData = this.extractFlagNameFromMessage();\n\n\t\t\t\treturn CommandError.buildMessageFromFlagData(flagData);\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.NODEJS_ERR_PARSE_ARGS_UNKNOWN_OPTION: {\n\t\t\t\tconst flagData = this.extractFlagNameFromMessage();\n\n\t\t\t\tconst helpMessage = selectiveRenderHelpForCommand(this.command, {\n\t\t\t\t\tshowUsageString: true,\n\t\t\t\t});\n\n\t\t\t\treturn [\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`Unknown flag provided: ${chalk.white.bold(flagData.shortForm ? `-${flagData.name}` : `--${flagData.name}`)}`,\n\t\t\t\t\t),\n\t\t\t\t\tflagData.unknownOptionSuggestion\n\t\t\t\t\t\t? chalk.gray(` ${flagData.unknownOptionSuggestion.trim()}`)\n\t\t\t\t\t\t: null,\n\t\t\t\t\t'',\n\t\t\t\t\thelpMessage,\n\t\t\t\t]\n\t\t\t\t\t.filter((v) => v !== null)\n\t\t\t\t\t.join('\\n');\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.APIFY_FLAG_PROVIDED_MULTIPLE_TIMES: {\n\t\t\t\tconst flagName = `--${this.metadata.flag}`;\n\n\t\t\t\treturn chalk.gray(`Flag ${chalk.white.bold(flagName)} can only be specified once.`);\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.APIFY_INVALID_FLAG_INTEGER_VALUE: {\n\t\t\t\tconst flagName = `--${this.metadata.flag}`;\n\t\t\t\tconst value = chalk.whiteBright(String(this.metadata.value));\n\n\t\t\t\treturn chalk.gray(\n\t\t\t\t\t`The provided value for the '${chalk.white.bold(flagName)}' flag could not be processed as an integer. Received: ${value}.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.APIFY_MISSING_FLAG: {\n\t\t\t\tconst { flag, matcher, providedButReceivedNoValue } = this.metadata as {\n\t\t\t\t\tflag: string;\n\t\t\t\t\tmatcher?: string;\n\t\t\t\t\tprovidedButReceivedNoValue?: boolean;\n\t\t\t\t};\n\n\t\t\t\tlet flagName = `'${chalk.white.bold(`--${flag}`)}'`;\n\n\t\t\t\tif (matcher) {\n\t\t\t\t\tflagName = `${flagName} (alias used: '${chalk.white.bold(`--${matcher}`)}')`;\n\t\t\t\t}\n\n\t\t\t\tif (providedButReceivedNoValue) {\n\t\t\t\t\treturn chalk.gray(\n\t\t\t\t\t\t`Flag ${flagName} was provided, but no value was received. Did you mean to pass the value as an argument or through standard input?`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn chalk.gray(`Flag ${flagName} is required, but was not provided.`);\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.APIFY_FLAG_IS_EXCLUSIVE_WITH_ANOTHER_FLAG: {\n\t\t\t\tconst { flagPairs } = this.metadata as { flagPairs: [string, string][] };\n\n\t\t\t\tconst messageParts = [chalk.gray(`The following errors occurred:`)];\n\n\t\t\t\tconst redArrow = chalk.red(' > ');\n\n\t\t\t\tfor (const [a, b] of flagPairs) {\n\t\t\t\t\tmessageParts.push(\n\t\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t\t`${redArrow}${chalk.white.bold(a)} cannot also be provided when using ${chalk.white.bold(b)}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tmessageParts.push(chalk.gray(`${redArrow}See more help with ${chalk.white.bold('--help')}`));\n\n\t\t\t\treturn messageParts.join('\\n');\n\t\t\t}\n\n\t\t\tcase CommandErrorCode.APIFY_TOO_MANY_REQUESTERS_OF_STDIN: {\n\t\t\t\tconst { firstUse, secondUse } = this.metadata as { firstUse: string; secondUse: string };\n\n\t\t\t\treturn chalk.gray(\n\t\t\t\t\t`Flag ${chalk.white.bold(`--${firstUse}`)} and ${chalk.white.bold(`--${secondUse}`)} cannot both request that their value comes from standard input at the same time.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst cliMetadata = useCLIMetadata();\n\n\t\t\t\treturn [\n\t\t\t\t\t'The CLI encountered an unhandled argument parsing error!',\n\t\t\t\t\t`Please report this issue at https://github.com/apify/apify-cli/issues, and provide the following information:`,\n\t\t\t\t\t'',\n\t\t\t\t\t`- Error code: ${this.code} (${CommandErrorCode[this.code]})`,\n\t\t\t\t\t`- Error metadata: ${JSON.stringify(this.metadata)}`,\n\t\t\t\t\t'',\n\t\t\t\t\t`- Stack:\\n${this.stack}`,\n\t\t\t\t\t'',\n\t\t\t\t\t'- Arguments (!!!only provide these as is if there is no sensitive information!!!):',\n\t\t\t\t\t` ${JSON.stringify(process.argv.slice(2))}`,\n\t\t\t\t\t'',\n\t\t\t\t\t`- CLI version: \\`${cliMetadata.fullVersionString}\\``,\n\t\t\t\t\t`- CLI debug logs (process.env.APIFY_CLI_DEBUG): ${process.env.APIFY_CLI_DEBUG ? 'Enabled' : 'Disabled'}`,\n\t\t\t\t\t`- Stdin data? ${cachedStdinInput ? 'Yes' : 'No'}`,\n\t\t\t\t].join('\\n');\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic buildMessageFromFlagData(flagData: FlagData): string {\n\t\tconst base = [`Flag ${chalk.white.bold(flagData.shortForm ? `-${flagData.name}` : `--${flagData.name}`)}`];\n\n\t\tif (flagData.ambiguousFlag) {\n\t\t\tbase.push(`is ambiguous (meaning the provided value could be interpreted as a flag too).`);\n\n\t\t\tif (flagData.ambiguousMessage) {\n\t\t\t\tbase.push(\n\t\t\t\t\t`\\n${flagData.ambiguousMessage\n\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t.map((line) => ` ${line}`)\n\t\t\t\t\t\t.join('\\n')}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbase.push(`To solve this, provide the flag like this: --${flagData.name}=<value>`);\n\t\t\t}\n\t\t} else if (flagData.expectsValue) {\n\t\t\tbase.push('expects a value');\n\t\t} else {\n\t\t\tbase.push('does not take an argument');\n\t\t}\n\n\t\treturn base.map((part) => chalk.gray(part)).join(' ');\n\t}\n\n\tstatic into(error: unknown, command: typeof BuiltApifyCommand): CommandError {\n\t\tif (error instanceof CommandError) {\n\t\t\treturn error;\n\t\t}\n\n\t\tif (error instanceof Error && 'code' in error) {\n\t\t\tconst casted = error as Error & { code: string };\n\n\t\t\tswitch (casted.code) {\n\t\t\t\tcase 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE': {\n\t\t\t\t\treturn new CommandError({\n\t\t\t\t\t\tcode: CommandErrorCode.NODEJS_ERR_PARSE_ARGS_INVALID_OPTION_VALUE,\n\t\t\t\t\t\tmessage: casted.message,\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL': {\n\t\t\t\t\treturn new CommandError({\n\t\t\t\t\t\tcode: CommandErrorCode.NODEJS_ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL,\n\t\t\t\t\t\tmessage: casted.message,\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'ERR_PARSE_ARGS_UNKNOWN_OPTION': {\n\t\t\t\t\treturn new CommandError({\n\t\t\t\t\t\tcode: CommandErrorCode.NODEJS_ERR_PARSE_ARGS_UNKNOWN_OPTION,\n\t\t\t\t\t\tmessage: casted.message,\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\treturn new CommandError({\n\t\t\t\t\t\tcode: CommandErrorCode.APIFY_UNKNOWN_ERROR,\n\t\t\t\t\t\tmessage: `Unknown error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new CommandError({\n\t\t\tcode: CommandErrorCode.APIFY_UNKNOWN_ERROR,\n\t\t\tmessage: `Unknown error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\tcommand,\n\t\t});\n\t}\n}\n","import chalk from 'chalk';\nimport indentString from 'indent-string';\nimport widestLine from 'widest-line';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { useCLIMetadata } from '../hooks/useCLIMetadata.js';\nimport { error } from '../outputs.js';\nimport { mapGroupBy } from '../utils.js';\nimport type { BuiltApifyCommand } from './apify-command.js';\nimport type { BaseCommandRenderer, SelectiveRenderOptions } from './help/_BaseCommandRenderer.js';\nimport { CommandHelp } from './help/CommandHelp.js';\nimport { CommandWithSubcommandsHelp } from './help/CommandWithSubcommands.js';\nimport { getMaxLineWidth } from './help/consts.js';\n\nconst commands = new Map<typeof BuiltApifyCommand, BaseCommandRenderer>();\n\nexport function registerCommandForHelpGeneration(entrypoint: string, command: typeof BuiltApifyCommand) {\n\tif (command.name.toLowerCase() !== command.name) {\n\t\terror({\n\t\t\tmessage: `Command name \"${command.name}\" is not correctly set up internally. Make sure you fill out the \"name\" field in the command class extension.`,\n\t\t});\n\n\t\treturn;\n\t}\n\n\tif (command.subcommands?.length) {\n\t\tcommands.set(command, new CommandWithSubcommandsHelp(entrypoint, command));\n\n\t\tfor (const subcommand of command.subcommands) {\n\t\t\tregisterCommandForHelpGeneration(`${entrypoint} ${command.name}`, subcommand);\n\t\t}\n\t} else {\n\t\tcommands.set(command, new CommandHelp(entrypoint, command));\n\t}\n}\n\nexport function renderHelpForCommand(command: typeof BuiltApifyCommand) {\n\tconst renderer = commands.get(command);\n\n\tif (!renderer) {\n\t\tthrow new Error(`No help renderer found for command ${command.name}`);\n\t}\n\n\treturn renderer.render();\n}\n\nexport function selectiveRenderHelpForCommand(command: typeof BuiltApifyCommand, options: SelectiveRenderOptions) {\n\tconst renderer = commands.get(command);\n\n\tif (!renderer) {\n\t\tthrow new Error(`No help renderer found for command ${command.name}`);\n\t}\n\n\treturn renderer.selectiveRender(options);\n}\n\nfunction sortByName(\n\titemA: [typeof BuiltApifyCommand, BaseCommandRenderer],\n\titemB: [typeof BuiltApifyCommand, BaseCommandRenderer],\n) {\n\treturn itemA[0].name.localeCompare(itemB[0].name);\n}\n\nexport function renderMainHelpMenu(entrypoint: string) {\n\tconst cliMetadata = useCLIMetadata();\n\tconst result: string[] = [];\n\n\tresult.push(\n\t\t'Apify command-line interface (CLI) helps you manage the Apify cloud platform and develop, build, and deploy Apify Actors.',\n\t\t'',\n\t);\n\n\tresult.push(chalk.bold('VERSION'));\n\tresult.push(` ${cliMetadata.fullVersionString}`);\n\tresult.push('');\n\n\tresult.push(chalk.bold('USAGE'));\n\tresult.push(` $ ${entrypoint} <command> [options]`);\n\tresult.push('');\n\n\tconst allGroupedByType = mapGroupBy(commands, ([command, helpGenerator]) => {\n\t\t// We register the help generators for all subcommands with an entrypoint that includes the root command,\n\t\t// so we need to ignore those\n\t\tif (helpGenerator.entrypoint.includes(' ')) {\n\t\t\treturn 'ignored';\n\t\t}\n\n\t\tif (command.hidden) {\n\t\t\treturn 'ignored';\n\t\t}\n\n\t\tif (helpGenerator instanceof CommandWithSubcommandsHelp) {\n\t\t\treturn 'subcommand';\n\t\t}\n\n\t\treturn 'command';\n\t});\n\n\tconst groupedSubcommands = allGroupedByType.get('subcommand')?.sort(sortByName);\n\tconst groupedCommands = allGroupedByType.get('command')?.sort(sortByName);\n\n\tif (groupedSubcommands?.length) {\n\t\tresult.push(chalk.bold('TOPICS'));\n\n\t\tconst lines: string[] = [];\n\n\t\tconst widestTopicNameLength = widestLine(groupedSubcommands.map(([subcommand]) => subcommand.name).join('\\n'));\n\n\t\tfor (const [subcommand] of groupedSubcommands) {\n\t\t\tif (subcommand.hidden) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst shortDescription = subcommand.shortDescription || subcommand.description?.split('\\n')[0] || '';\n\n\t\t\tconst fullString = `${subcommand.name.padEnd(widestTopicNameLength)} ${shortDescription}`;\n\n\t\t\tconst wrapped = wrapAnsi(fullString, getMaxLineWidth() - widestTopicNameLength - 2);\n\n\t\t\tlines.push(` ${indentString(wrapped, widestTopicNameLength + 2 + 2).trim()}`);\n\t\t}\n\n\t\tresult.push(...lines, '');\n\t}\n\n\tif (groupedCommands?.length) {\n\t\tresult.push(chalk.bold('COMMANDS'));\n\n\t\tconst lines: string[] = [];\n\n\t\tconst widestCommandNameLength = widestLine(groupedCommands.map(([command]) => command.name).join('\\n'));\n\n\t\tfor (const [command] of groupedCommands) {\n\t\t\tif (command.hidden) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst shortDescription = command.shortDescription || command.description?.split('\\n')[0] || '';\n\n\t\t\tconst fullString = `${command.name.padEnd(widestCommandNameLength)} ${shortDescription}`;\n\n\t\t\tconst wrapped = wrapAnsi(fullString, getMaxLineWidth() - widestCommandNameLength - 2);\n\n\t\t\tlines.push(` ${indentString(wrapped, widestCommandNameLength + 2 + 2).trim()}`);\n\t\t}\n\n\t\tresult.push(...lines, '');\n\t}\n\n\tresult.push(\n\t\tchalk.bold('TROUBLESHOOTING'),\n\t\t' For general support, reach out to us at https://apify.com/contact',\n\t\t'',\n\t\t' If you believe you are encountering a bug, file it at https://github.com/apify/apify-cli/issues/new',\n\t);\n\n\treturn result.join('\\n').trim();\n}\n","import chalk from 'chalk';\nimport indent from 'indent-string';\nimport width from 'string-width';\nimport stripAnsi from 'strip-ansi';\nimport widestLine from 'widest-line';\nimport wrap from 'wrap-ansi';\n\nimport type { ArgTag, TaggedArgBuilder } from '../args.js';\nimport type { FlagTag, TaggedFlagBuilder } from '../flags.js';\nimport { BaseCommandRenderer, type SelectiveRenderOptions } from './_BaseCommandRenderer.js';\nimport { getMaxLineWidth } from './consts.js';\n\n/*\nExecutes Actor remotely using your authenticated account.\n\nUSAGE\n $ apify call [ACTORID] -o [--json] [-b <value>] [-t <value>] [-m <value>] [-i <value> | --input-file <value>] [-s]\n\nARGUMENTS\n ACTORID Name or ID of the Actor to run (e.g. \"my-actor\", \"apify/hello-world\" or \"E2jjCZBezvAZnX8Rb\"). If not provided, the command runs the remote Actor specified in the '.actor/actor.json' file.\n\nFLAGS\n -b, --build=<value> Tag or number of the build to run (e.g. \"latest\" or \"1.2.34\").\n -i, --input=<value> Optional JSON input to be given to the Actor.\n -m, --memory=<value> Amount of memory allocated for the Actor run, in megabytes.\n -o, --output-dataset (required) Prints out the entire default dataset on successful run of the Actor.\n -s, --silent Prevents printing the logs of the Actor run to the console.\n -t, --timeout=<value> Timeout for the Actor run in seconds. Zero value means there is no timeout.\n --input-file=<value> Optional path to a file with JSON input to be given to the Actor. The file must be a valid JSON file. You can also specify `-` to read from standard input.\n\nDESCRIPTION\n Blah blah blah\n\nGLOBAL FLAGS\n --json Format output as json.\n\nUSAGE\n $ apify login [-t <value>] [-m console|manual]\n\nFLAGS\n -m, --method=<option> [Optional] Method of logging in to Apify\n <options: console|manual>\n -t, --token=<value> [Optional] Apify API token\n\n */\n\nexport class CommandHelp extends BaseCommandRenderer {\n\tpublic render(): string {\n\t\tconst result: string[] = [];\n\n\t\tthis.pushShortDescription(result);\n\n\t\tthis.pushUsageString(result);\n\n\t\tif (this.command.description) {\n\t\t\tthis.pushDescription(result);\n\t\t}\n\n\t\treturn result.join('\\n').trim();\n\t}\n\n\tpublic selectiveRender(options: SelectiveRenderOptions): string {\n\t\tconst result: string[] = [];\n\n\t\tif (options.showShortDescription) {\n\t\t\tthis.pushShortDescription(result);\n\t\t}\n\n\t\tif (options.showUsageString) {\n\t\t\tthis.pushUsageString(result);\n\t\t}\n\n\t\tif (options.showDescription && this.command.description) {\n\t\t\tthis.pushDescription(result);\n\t\t}\n\n\t\treturn result.join('\\n').trim();\n\t}\n\n\tprotected pushUsageString(result: string[]) {\n\t\tresult.push(chalk.bold('USAGE'));\n\n\t\tconst baseString = `$ ${this.entrypoint} ${this.command.name}`;\n\t\tconst indentLevel = 2 + width(baseString);\n\n\t\tconst finalString = [baseString];\n\n\t\tconst args = Object.entries(this.command.args ?? {}) as [string, TaggedArgBuilder<ArgTag, unknown>][];\n\n\t\tif (args.length) {\n\t\t\tfor (const [argName, arg] of args) {\n\t\t\t\tif (typeof arg === 'string') {\n\t\t\t\t\tthrow new RangeError('This is a type-check only value, do not actually use it');\n\t\t\t\t}\n\n\t\t\t\tthis.pushNewLineBeforeNewEntryIfLengthIsPastTheLimit({\n\t\t\t\t\tstate: finalString,\n\t\t\t\t\titemToAdd: arg.required ? `<${argName}>` : `[${argName}]`,\n\t\t\t\t\tindentSize: indentLevel,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst flags = Object.entries(this.command.flags ?? {}).filter(([, flag]) => {\n\t\t\tif (typeof flag === 'string') {\n\t\t\t\tthrow new RangeError('This is a type-check only value, do not actually use it');\n\t\t\t}\n\n\t\t\treturn !flag.hidden;\n\t\t});\n\n\t\tif (this.command.enableJsonFlag) {\n\t\t\tflags.push([\n\t\t\t\t'json',\n\t\t\t\t{\n\t\t\t\t\tchoices: null,\n\t\t\t\t\tflagTag: 'boolean',\n\t\t\t\t\thasDefault: false,\n\t\t\t\t\trequired: false,\n\t\t\t\t\tstdin: null as never,\n\t\t\t\t\tbuilder: null as never,\n\t\t\t\t\taliases: undefined,\n\t\t\t\t\tchar: undefined,\n\t\t\t\t\tdescription: 'Format the command output as JSON',\n\t\t\t\t\thidden: undefined,\n\t\t\t\t\texclusive: undefined,\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tconst sortedFlags = new Map(\n\t\t\tflags.sort((a, b) => {\n\t\t\t\tif (typeof a[1] === 'string') {\n\t\t\t\t\tthrow new RangeError('This is a type-check only value, do not actually use it');\n\t\t\t\t}\n\n\t\t\t\tif (typeof b[1] === 'string') {\n\t\t\t\t\tthrow new RangeError('This is a type-check only value, do not actually use it');\n\t\t\t\t}\n\n\t\t\t\tif (a[1].required && !b[1].required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (!a[1].required && b[1].required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn a[0].localeCompare(b[0]);\n\t\t\t}) as [string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>][],\n\t\t);\n\n\t\tconst flagsToIgnore = new Set<string>();\n\n\t\tif (flags.length) {\n\t\t\tfor (const [flagName, flag] of sortedFlags) {\n\t\t\t\tif (typeof flag === 'string') {\n\t\t\t\t\tthrow new RangeError('This is a type-check only value, do not actually use it');\n\t\t\t\t}\n\n\t\t\t\tif (flagsToIgnore.has(flagName)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet requiredState = flag.required;\n\t\t\t\tconst flagString = this.makeFlagString(flagName, flag);\n\n\t\t\t\tconst flagParts: string[] = [flagString];\n\n\t\t\t\tif (flag.exclusive?.length) {\n\t\t\t\t\tfor (const exclusiveFlagName of flag.exclusive) {\n\t\t\t\t\t\tflagsToIgnore.add(exclusiveFlagName);\n\n\t\t\t\t\t\tconst exclusiveFlag = sortedFlags.get(exclusiveFlagName)!;\n\n\t\t\t\t\t\tconst exclusiveFlagString = this.makeFlagString(exclusiveFlagName, exclusiveFlag);\n\n\t\t\t\t\t\tflagParts.push(exclusiveFlagString);\n\n\t\t\t\t\t\tif (exclusiveFlag.required) {\n\t\t\t\t\t\t\trequiredState = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.pushNewLineBeforeNewEntryIfLengthIsPastTheLimit({\n\t\t\t\t\tstate: finalString,\n\t\t\t\t\titemToAdd: requiredState ? flagParts.join(' | ') : `[${flagParts.join(' | ')}]`,\n\t\t\t\t\tindentSize: indentLevel,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst wrapped = wrap(finalString.join(' '), getMaxLineWidth() - indentLevel);\n\n\t\t// + 1 here is to align everything properly\n\t\tconst indented = indent(wrapped, indentLevel + 1).trim();\n\n\t\tresult.push(` ${indented}`, '');\n\n\t\tif (args.length) {\n\t\t\tthis.pushArguments(result, args);\n\t\t}\n\n\t\tif (flags.length) {\n\t\t\tthis.pushFlags(result, sortedFlags);\n\t\t}\n\t}\n\n\tprotected pushArguments(result: string[], args: [string, TaggedArgBuilder<ArgTag, unknown>][]) {\n\t\tif (!args.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tresult.push(chalk.bold('ARGUMENTS'));\n\n\t\tconst widestArgNameLength = widestLine(args.map(([argName]) => argName).join('\\n'));\n\n\t\tfor (const [argName, arg] of args) {\n\t\t\tconst fullString = `${argName.padEnd(widestArgNameLength)} ${arg.description}`;\n\n\t\t\t// -2 for the space between the name and the description\n\t\t\tconst wrapped = wrap(fullString, getMaxLineWidth() - widestArgNameLength - 2);\n\n\t\t\t// +2 for the space between the name and the description\n\t\t\t// +2 for the indent\n\t\t\tconst indented = indent(wrapped, widestArgNameLength + 2 + 2).trim();\n\n\t\t\tresult.push(` ${indented}`);\n\t\t}\n\n\t\tresult.push('');\n\t}\n\n\tprotected pushFlags(\n\t\tresult: string[],\n\t\tflags: Map<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>,\n\t) {\n\t\tif (!flags.size) {\n\t\t\treturn;\n\t\t}\n\n\t\tresult.push(chalk.bold('FLAGS'));\n\n\t\tconst linesOfFlags = new Map<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>();\n\n\t\tfor (const [flagName, flag] of flags) {\n\t\t\tconst stringParts: string[] = [];\n\n\t\t\tif (flag.char) {\n\t\t\t\tstringParts.push(`-${flag.char},`);\n\t\t\t} else {\n\t\t\t\tstringParts.push(' '.repeat(3));\n\t\t\t}\n\n\t\t\tswitch (flag.flagTag) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tstringParts.push(`--${this.kebabFlagName(flagName)}`);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string':\n\t\t\t\tcase 'integer': {\n\t\t\t\t\tconst flagValues = flag.choices ? '<option>' : '<value>';\n\n\t\t\t\t\tstringParts.push(`--${this.kebabFlagName(flagName)}=${chalk.underline(flagValues)}`);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unhandled flag tag: ${flag.flagTag}`);\n\t\t\t}\n\n\t\t\tlinesOfFlags.set(stringParts.join(' '), flag);\n\t\t}\n\n\t\tconst widestFlagNameLength = widestLine([...linesOfFlags.keys()].map(stripAnsi).join('\\n'));\n\n\t\tfor (const [flagString, flag] of linesOfFlags) {\n\t\t\tconst paddingToAdd = widestFlagNameLength - stripAnsi(flagString).length;\n\t\t\tlet fullString = `${flagString}${' '.repeat(paddingToAdd)} ${flag.description ?? ''}`;\n\n\t\t\tif (flag.choices?.length) {\n\t\t\t\tfullString += `\\n<options: ${flag.choices.join('|')}>`;\n\t\t\t}\n\n\t\t\tconst wrapped = wrap(fullString, getMaxLineWidth() - widestFlagNameLength);\n\n\t\t\tconst indented = indent(wrapped, widestFlagNameLength)\n\t\t\t\t.trim()\n\t\t\t\t.split('\\n')\n\t\t\t\t.map((line) => {\n\t\t\t\t\t// For lines that don't start with a short flag, add 4 spaces to indent them further, and align with the flags that also have a short form\n\t\t\t\t\tif (!/^-[a-z]/.test(line.trim())) {\n\t\t\t\t\t\treturn ` ${line}`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn line;\n\t\t\t\t})\n\t\t\t\t.join('\\n');\n\n\t\t\tresult.push(` ${indented}`);\n\t\t}\n\n\t\tresult.push('');\n\t}\n}\n","import chalk from 'chalk';\nimport indent from 'indent-string';\nimport width from 'string-width';\nimport wrap from 'wrap-ansi';\n\nimport { type BuiltApifyCommand, camelCaseToKebabCase, kebabCaseString } from '../apify-command.js';\nimport type { FlagTag, TaggedFlagBuilder } from '../flags.js';\nimport { getMaxLineWidth } from './consts.js';\n\nexport interface SelectiveRenderOptions {\n\tshowShortDescription?: boolean;\n\tshowDescription?: boolean;\n\tshowUsageString?: boolean;\n\tshowSubcommands?: boolean;\n}\n\nexport abstract class BaseCommandRenderer {\n\tprotected readonly command: typeof BuiltApifyCommand;\n\n\tpublic readonly entrypoint: string;\n\n\tpublic constructor(entrypoint: string, command: typeof BuiltApifyCommand) {\n\t\tthis.entrypoint = entrypoint;\n\t\tthis.command = command;\n\t}\n\n\tpublic abstract render(): string;\n\n\tpublic abstract selectiveRender(options: SelectiveRenderOptions): string;\n\n\tprotected pushShortDescription(result: string[]) {\n\t\tif (this.command.shortDescription) {\n\t\t\tresult.push(this.command.shortDescription, '');\n\t\t\t// Fallback to first line of description\n\t\t} else if (this.command.description) {\n\t\t\tresult.push(this.command.description.split('\\n')[0], '');\n\t\t}\n\t}\n\n\tprotected pushDescription(result: string[]) {\n\t\tif (!this.command.description) {\n\t\t\treturn;\n\t\t}\n\n\t\tresult.push(chalk.bold('DESCRIPTION'));\n\n\t\tconst wrapped = wrap(this.command.description, getMaxLineWidth() - 2, { trim: false });\n\n\t\tconst indented = indent(wrapped, 2);\n\n\t\tresult.push(indented);\n\t\tresult.push('');\n\t}\n\n\tprotected pushNewLineBeforeNewEntryIfLengthIsPastTheLimit({\n\t\tstate,\n\t\titemToAdd,\n\t\tindentSize,\n\t}: {\n\t\tstate: string[];\n\t\titemToAdd: string;\n\t\tindentSize: number;\n\t}) {\n\t\t// Check the _last line_ of the state, not the whole string, as otherwise we get false positives\n\t\tconst currentLength = width(state.join(' ').split('\\n').at(-1) || '') + indentSize;\n\n\t\tconst sizeOfItemToAdd = width(itemToAdd);\n\n\t\tif (currentLength + sizeOfItemToAdd > getMaxLineWidth()) {\n\t\t\tstate.push('\\n');\n\t\t}\n\n\t\tstate.push(itemToAdd);\n\t}\n\n\tprotected kebabFlagName(flagName: string) {\n\t\treturn kebabCaseString(camelCaseToKebabCase(flagName)).toLowerCase();\n\t}\n\n\tprotected makeFlagString(flagName: string, flag: TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>) {\n\t\tconst flagKey = this.kebabFlagName(flagName);\n\n\t\tconst mainFlagPart = flag.char ? `-${flag.char}` : `--${flagKey}`;\n\n\t\tswitch (flag.flagTag) {\n\t\t\tcase 'boolean': {\n\t\t\t\treturn mainFlagPart;\n\t\t\t}\n\n\t\t\tcase 'string':\n\t\t\tcase 'integer': {\n\t\t\t\tconst flagValues = flag.choices?.length ? `${flag.choices.join('|')}` : '<value>';\n\n\t\t\t\treturn `${mainFlagPart} ${flagValues}`;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthrow new RangeError(`Unhandled flag type: ${flag.flagTag}`);\n\t\t\t}\n\t\t}\n\t}\n}\n","let cachedMaxLineWidth: number | undefined;\n\nexport function getMaxLineWidth() {\n\tif (cachedMaxLineWidth) {\n\t\treturn cachedMaxLineWidth;\n\t}\n\n\tconst override = Number(process.env.APIFY_CLI_MAX_LINE_WIDTH);\n\n\tif (!Number.isNaN(override)) {\n\t\tcachedMaxLineWidth = override;\n\t} else if (!process.stdout.isTTY) {\n\t\tcachedMaxLineWidth = 80;\n\t} else {\n\t\tconst windowWidth = process.stdout.getWindowSize?.()[0] ?? -1;\n\n\t\tif (windowWidth < 1) {\n\t\t\tcachedMaxLineWidth = 80;\n\t\t} else if (windowWidth < 40) {\n\t\t\tcachedMaxLineWidth = 40;\n\t\t} else {\n\t\t\tcachedMaxLineWidth = windowWidth;\n\t\t}\n\t}\n\n\treturn cachedMaxLineWidth;\n}\n","/*\nManages secure environment variables for Actors.\n\nUSAGE\n $ apify secrets\n\nDESCRIPTION\n Manages secure environment variables for Actors.\n\n Example:\n $ apify secrets add mySecret TopSecretValue123\n\n The \"mySecret\" value can be used in an environment variable defined in '.actor/actor.json' file by adding the \"@\"\n prefix:\n\n {\n \"actorSpecification\": 1,\n \"name\": \"my_actor\",\n \"environmentVariables\": { \"SECRET_ENV_VAR\": \"@mySecret\" },\n \"version\": \"0.1\"\n }\n\n When the Actor is pushed to Apify cloud, the \"SECRET_ENV_VAR\" and its value is stored as a secret environment variable\n of the Actor.\n\nCOMMANDS\n secrets add Adds a new secret to '~/.apify' for use in Actor environment variables.\n secrets rm Permanently deletes a secret from your stored credentials.\n*/\n\nimport chalk from 'chalk';\nimport indentString from 'indent-string';\nimport widestLine from 'widest-line';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { BaseCommandRenderer, type SelectiveRenderOptions } from './_BaseCommandRenderer.js';\nimport { getMaxLineWidth } from './consts.js';\n\nexport class CommandWithSubcommandsHelp extends BaseCommandRenderer {\n\tpublic render() {\n\t\tconst result: string[] = [];\n\n\t\tthis.pushShortDescription(result);\n\n\t\tif (this.command.description) {\n\t\t\tthis.pushDescription(result);\n\t\t}\n\n\t\tthis.pushSubcommands(result);\n\n\t\treturn result.join('\\n').trim();\n\t}\n\n\tpublic selectiveRender(options: SelectiveRenderOptions): string {\n\t\tconst result: string[] = [];\n\n\t\tif (options.showShortDescription) {\n\t\t\tthis.pushShortDescription(result);\n\t\t}\n\n\t\tif (options.showDescription && this.command.description) {\n\t\t\tthis.pushDescription(result);\n\t\t}\n\n\t\tif (options.showSubcommands) {\n\t\t\tthis.pushSubcommands(result);\n\t\t}\n\n\t\treturn result.join('\\n').trim();\n\t}\n\n\tprotected pushSubcommands(result: string[]) {\n\t\tif (!this.command.subcommands?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tresult.push(chalk.bold('SUBCOMMANDS'));\n\n\t\tconst widestSubcommandNameLength = widestLine(\n\t\t\tthis.command.subcommands.map((subcommand) => `${this.command.name} ${subcommand.name}`).join('\\n'),\n\t\t);\n\n\t\tfor (const subcommand of this.command.subcommands) {\n\t\t\tconst shortDescription = subcommand.shortDescription || subcommand.description?.split('\\n')[0] || '';\n\n\t\t\tconst fullString = `${this.command.name} ${subcommand.name.padEnd(widestSubcommandNameLength - this.command.name.length - 1)} ${shortDescription}`;\n\n\t\t\tconst wrapped = wrapAnsi(fullString, getMaxLineWidth() - widestSubcommandNameLength - 2);\n\n\t\t\tconst indented = indentString(wrapped, widestSubcommandNameLength + 2 + 2).trim();\n\n\t\t\tresult.push(` ${indented}`);\n\t\t}\n\n\t\tresult.push('');\n\t}\n}\n","import { once } from 'node:events';\n\nimport { useStdin } from '../hooks/useStdin.js';\n\nexport async function readStdin() {\n\tconst dataRef = await useStdin();\n\n\tconst { hasData, waitDelay, stream } = dataRef;\n\n\tif (!hasData) {\n\t\treturn;\n\t}\n\n\tconst bufferChunks: Buffer[] = [];\n\n\tconst controller = new AbortController();\n\n\tlet timeout: NodeJS.Timeout | null = null;\n\n\tif (waitDelay) {\n\t\ttimeout = setTimeout(() => {\n\t\t\tcontroller.abort();\n\t\t}, waitDelay).unref();\n\t}\n\n\tstream.on('data', (chunk) => {\n\t\tbufferChunks.push(chunk);\n\n\t\t// If we got some data already, we can clear the timeout, as we will get more\n\t\tif (timeout) {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = null;\n\t\t}\n\t});\n\n\ttry {\n\t\tawait once(stream, 'end', { signal: controller.signal });\n\t} catch (error) {\n\t\tconst casted = error as Error;\n\n\t\tif (casted.name === 'AbortError') {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (timeout) {\n\t\tclearTimeout(timeout);\n\t}\n\n\t// Mark further uses of useStdin / readStdin as having no more data since we've read it all\n\tdataRef.hasData = false;\n\n\tconst concat = Buffer.concat(bufferChunks);\n\n\tif (concat.length) {\n\t\treturn concat;\n\t}\n\n\treturn undefined;\n}\n","import { gt } from 'semver';\n\nimport { CHECK_VERSION_EVERY_MILLIS } from '../consts.js';\nimport { warning } from '../outputs.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\nimport { useCLIMetadata } from './useCLIMetadata.js';\nimport { type LatestState, updateLocalState, useLocalState } from './useLocalState.js';\n\nconst metadata = useCLIMetadata();\n\nconst USER_AGENT = `Apify CLI/${metadata.version} (https://github.com/apify/apify-cli)`;\n\nconst sitesToCheck = ['https://1.1.1.1', 'https://8.8.8.8'];\n\nasync function isOnline(timeout = 500) {\n\tconst controller = new AbortController();\n\n\tconst timeoutId = setTimeout(() => {\n\t\tcontroller.abort();\n\t}, timeout);\n\n\tconst res = await Promise.any(\n\t\tsitesToCheck.map(async (site) =>\n\t\t\tfetch(site, {\n\t\t\t\tsignal: controller.signal,\n\t\t\t\theaders: {\n\t\t\t\t\t'User-Agent': USER_AGENT,\n\t\t\t\t},\n\t\t\t\tkeepalive: false,\n\t\t\t}),\n\t\t),\n\t).catch(() => null);\n\n\tclearTimeout(timeoutId);\n\n\tif (!res) {\n\t\tcliDebugPrint('isOnline', { state: 'timeout' });\n\n\t\treturn false;\n\t}\n\n\tif (res.ok) {\n\t\tcliDebugPrint('isOnline', {\n\t\t\tstate: 'online',\n\t\t\tsite: res.url,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tcliDebugPrint('isOnline', { state: 'offline' });\n\n\treturn false;\n}\n\nasync function getLatestVersion(state: LatestState) {\n\tconst res = await fetch('https://api.github.com/repos/apify/apify-cli/releases/latest', {\n\t\theaders: {\n\t\t\t'User-Agent': USER_AGENT,\n\t\t},\n\t});\n\n\tif (!res.ok) {\n\t\tcliDebugPrint('useCLIVersionCheck', 'Failed to fetch latest version', {\n\t\t\tstatusCode: res.status,\n\t\t\tbody: await res.text(),\n\t\t});\n\n\t\twarning({ message: 'Failed to fetch latest version of Apify CLI, using the cached version instead.' });\n\n\t\treturn null;\n\t}\n\n\tconst body = (await res.json()) as { tag_name: string };\n\n\tconst version = body.tag_name.replace(/^v/, '');\n\n\tcliDebugPrint('useCLIVersionCheck', 'Fetched latest version', { version });\n\n\tupdateLocalState(state, (stateToUpdate) => {\n\t\tstateToUpdate.versionCheck = {\n\t\t\tlastChecked: Date.now(),\n\t\t\tlastVersion: version,\n\t\t};\n\t});\n\n\treturn version;\n}\n\nexport function shouldSkipVersionCheck() {\n\tif (process.env.APIFY_CLI_SKIP_UPDATE_CHECK && !['0', 'false'].includes(process.env.APIFY_CLI_SKIP_UPDATE_CHECK)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nexport interface CLIVersionCheckResult {\n\tcurrentVersion: string;\n\tlatestVersion: string;\n\tshouldUpdate: boolean;\n\tcacheHit: boolean;\n}\n\nexport async function useCLIVersionCheck(force = false) {\n\tconst localState = useLocalState();\n\n\tconst stateIsOutdated =\n\t\t!localState.versionCheck || Date.now() - localState.versionCheck.lastChecked > CHECK_VERSION_EVERY_MILLIS;\n\n\tconst shouldFetchFromApi = force || (stateIsOutdated && (await isOnline()));\n\n\tconst latestVersion = shouldFetchFromApi\n\t\t? await getLatestVersion(localState)\n\t\t: localState.versionCheck?.lastVersion;\n\n\tif (!latestVersion) {\n\t\treturn {\n\t\t\tcurrentVersion: metadata.version,\n\t\t\tlatestVersion: 'unknown',\n\t\t\tshouldUpdate: false,\n\t\t\tcacheHit: false,\n\t\t};\n\t}\n\n\tconst shouldUpdate = gt(latestVersion, metadata.version);\n\n\treturn {\n\t\tcurrentVersion: metadata.version,\n\t\tlatestVersion,\n\t\tshouldUpdate,\n\t\tcacheHit: !shouldFetchFromApi,\n\t};\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { STATE_FILE_PATH } from '../consts.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\n\ntype LocalState = LocalStateV0 | LocalStateV1;\n\nexport type LatestState = LocalStateV1;\n\nexport interface LocalStateV0 {\n\tversion?: never;\n\tlatestNpmVersionCheckedAt?: string;\n\tlatestNpmVersion?: string;\n}\n\nexport interface LocalStateV1 {\n\tversion: 1;\n\tversionCheck?: {\n\t\tlastChecked: number;\n\t\tlastVersion?: string;\n\t};\n}\n\nfunction migrateStateV0ToV1(state: LocalState) {\n\t// No migration needed\n\tif (state.version && state.version >= 1) {\n\t\treturn false;\n\t}\n\n\tconst casted = state as LocalStateV0;\n\n\tif (casted.latestNpmVersionCheckedAt) {\n\t\tconst lastChecked = new Date(casted.latestNpmVersionCheckedAt).getTime();\n\t\tconst lastVersion = casted.latestNpmVersion;\n\n\t\tcliDebugPrint('LocalStateV0ToV1', 'Migrating state from v0 to v1', {\n\t\t\toldState: state,\n\t\t\tnewState: {\n\t\t\t\tversionCheck: {\n\t\t\t\t\tlastChecked,\n\t\t\t\t\tlastVersion,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tupdateLocalState({ version: 1 }, (stateToUpdate) => {\n\t\t\tstateToUpdate.versionCheck = {\n\t\t\t\tlastChecked,\n\t\t\t\tlastVersion,\n\t\t\t};\n\t\t});\n\t}\n\n\treturn true;\n}\n\nconst emptyState: LatestState = {\n\tversion: 1,\n};\n\nexport function useLocalState(): LatestState {\n\tconst stateFilePath = STATE_FILE_PATH();\n\n\tconst exists = existsSync(stateFilePath);\n\n\tif (!exists) {\n\t\treturn emptyState;\n\t}\n\n\tconst state = JSON.parse(readFileSync(stateFilePath, 'utf-8')) as LocalState;\n\n\tif (migrateStateV0ToV1(state)) {\n\t\treturn useLocalState();\n\t}\n\n\treturn state as LatestState;\n}\n\nexport type StateUpdater = (state: LatestState) => void;\n\nexport function updateLocalState(state: LatestState, updater: StateUpdater) {\n\t// Update the state in memory\n\tconst stateClone = { ...state };\n\tupdater(stateClone);\n\n\tconst filePath = STATE_FILE_PATH();\n\tconst dirPath = dirname(filePath);\n\n\tmkdirSync(dirPath, { recursive: true });\n\n\twriteFileSync(STATE_FILE_PATH(), JSON.stringify(stateClone, null, '\\t'));\n}\n","import { jaroWinkler } from '@skyra/jaro-winkler';\nimport levenshtein from 'js-levenshtein';\n\nimport { commandRegistry } from '../command-framework/apify-command.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\n\nexport function useCommandSuggestions(inputString: string) {\n\tconst allCommands = [...commandRegistry.entries()].sort(([a], [b]) => a.localeCompare(b));\n\n\tconst lowercasedCommandString = inputString.toLowerCase();\n\n\tconst closestMatches = allCommands\n\t\t.map(([cmdString, cmdClass]) => {\n\t\t\tconst lowercased = cmdString.toLowerCase();\n\t\t\tconst cmdStringParts = cmdString.split(' ');\n\t\t\tconst lastPart = cmdStringParts[cmdStringParts.length - 1].toLowerCase();\n\n\t\t\tconst isAlias = cmdClass.aliases?.includes(lastPart) || cmdClass.hiddenAliases?.includes(lastPart) || false;\n\n\t\t\tconst levenshteinDistance = levenshtein(lowercasedCommandString, lowercased);\n\t\t\tconst jaroWinklerDistance = jaroWinkler(lowercasedCommandString, lowercased);\n\n\t\t\tconst matches = levenshteinDistance <= 2 || jaroWinklerDistance >= 0.975;\n\n\t\t\tif (matches) {\n\t\t\t\tcliDebugPrint('useCommandSuggestions', {\n\t\t\t\t\tinputString: lowercasedCommandString,\n\t\t\t\t\tlowercased,\n\t\t\t\t\tmatches,\n\t\t\t\t\tlevenshtein: levenshteinDistance,\n\t\t\t\t\tjaroWinkler: jaroWinklerDistance,\n\t\t\t\t});\n\n\t\t\t\tif (!isAlias) {\n\t\t\t\t\treturn { string: `${lowercased}`, distance: jaroWinklerDistance };\n\t\t\t\t}\n\n\t\t\t\treturn { string: `${lowercased} (alias for ${cmdClass.name})`, distance: jaroWinklerDistance };\n\t\t\t}\n\n\t\t\treturn null;\n\t\t})\n\t\t.filter((item) => item !== null)\n\t\t.sort((a, b) => b.distance - a.distance)\n\t\t.map((item) => item.string);\n\n\treturn closestMatches;\n}\n","import { join, resolve } from 'node:path';\nimport process from 'node:process';\n\nimport { calculateRunDynamicMemory } from '@apify/actor-memory-expression';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { CommandExitCodes } from '../../lib/consts.js';\nimport { useActorConfig } from '../../lib/hooks/useActorConfig.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getJsonFileContent, getLocalKeyValueStorePath } from '../../lib/utils.js';\n\nconst DEFAULT_INPUT_PATH = join(getLocalKeyValueStorePath('default'), 'INPUT.json');\n\ninterface ActorMemoryConfig {\n\tdefaultMemoryMbytes?: string;\n\tminMemoryMbytes?: number;\n\tmaxMemoryMbytes?: number;\n}\n\n/**\n * This command can be used to test dynamic memory calculation expressions\n * defined in actor.json or provided via command-line flag.\n *\n * Dynamic memory allows Actors to adjust their memory usage based on input data\n * and run options, optimizing resource allocation and costs.\n */\nexport class ActorCalculateMemoryCommand extends ApifyCommand<typeof ActorCalculateMemoryCommand> {\n\tstatic override name = 'calculate-memory' as const;\n\n\tstatic override description =\n\t\t`Calculates the Actor’s dynamic memory usage based on a memory expression from actor.json, input data, and run options.`;\n\n\t/**\n\t * Additional run options exist (e.g., memoryMbytes, disksMbytes, etc.),\n\t * but we intentionally omit them here. These options are rarely needed and\n\t * exposing them would introduce unnecessary confusion for users.\n\t */\n\tstatic override flags = {\n\t\tinput: Flags.string({\n\t\t\tdescription: 'Path to the input JSON file used for the calculation.',\n\t\t\trequired: false,\n\t\t\tdefault: DEFAULT_INPUT_PATH,\n\t\t}),\n\t\tdefaultMemoryMbytes: Flags.string({\n\t\t\tdescription:\n\t\t\t\t'Memory-calculation expression (in MB). If omitted, the value is loaded from the actor.json file.',\n\t\t\trequired: false,\n\t\t}),\n\t\tbuild: Flags.string({\n\t\t\tdescription: 'Actor build version or build tag to evaluate the expression with.',\n\t\t\trequired: false,\n\t\t}),\n\t\ttimeoutSecs: Flags.integer({\n\t\t\tdescription: 'Maximum run timeout, in seconds.',\n\t\t\trequired: false,\n\t\t}),\n\t\tmaxItems: Flags.integer({\n\t\t\tdescription: 'Maximum number of items Actor can output.',\n\t\t\trequired: false,\n\t\t}),\n\t\tmaxTotalChargeUsd: Flags.integer({\n\t\t\tdescription: 'Maximum total charge in USD.',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { input, memoryExpression, minMemory, maxMemory, runOptions } = await this.prepareMemoryArguments();\n\n\t\tif (!memoryExpression) {\n\t\t\tthrow new Error(\n\t\t\t\t`No memory-calculation expression found. Provide it via the --default-memory-mbytes flag or define defaultMemoryMbytes in actor.json.`,\n\t\t\t);\n\t\t}\n\n\t\tconst inputPath = resolve(process.cwd(), input);\n\t\tconst inputJson = getJsonFileContent(inputPath) ?? {};\n\n\t\tinfo({ message: `Evaluating memory expression: ${memoryExpression}` });\n\n\t\ttry {\n\t\t\tconst result = await calculateRunDynamicMemory(memoryExpression, {\n\t\t\t\tinput: inputJson,\n\t\t\t\trunOptions,\n\t\t\t});\n\t\t\tconst clampedResult = Math.min(Math.max(result, minMemory), maxMemory);\n\n\t\t\tsuccess({ message: `Calculated memory: ${clampedResult} MB`, stdout: true });\n\t\t} catch (err) {\n\t\t\terror({ message: `Memory calculation failed: ${(err as Error).message}` });\n\t\t}\n\t}\n\n\t/**\n\t * Determines the memory arguments to use.\n\t * If --defaultMemoryMbytes flag is set, use it (unlimited min/max).\n\t * Otherwise, load from actor.json.\n\t */\n\tprivate async prepareMemoryArguments() {\n\t\tconst { input, defaultMemoryMbytes, ...runOptions } = this.flags;\n\n\t\tlet memoryExpression: string | undefined = defaultMemoryMbytes;\n\t\tlet minMemory = 0;\n\t\tlet maxMemory = Infinity;\n\n\t\t// If not provided via flag, try to load from actor.json\n\t\tif (!memoryExpression) {\n\t\t\t({\n\t\t\t\tdefaultMemoryMbytes: memoryExpression,\n\t\t\t\tminMemoryMbytes: minMemory = minMemory, // Fallback to minMemory(0) if undefined\n\t\t\t\tmaxMemoryMbytes: maxMemory = maxMemory, // Fallback to maxMemory(Infinity) if undefined\n\t\t\t} = await this.getExpressionFromConfig());\n\t\t}\n\n\t\treturn {\n\t\t\tmemoryExpression,\n\t\t\tminMemory,\n\t\t\tmaxMemory,\n\t\t\tinput,\n\t\t\trunOptions,\n\t\t};\n\t}\n\n\t/**\n\t * Helper to load the `defaultMemoryMbytes` expression from actor.json.\n\t */\n\tprivate async getExpressionFromConfig(): Promise<ActorMemoryConfig> {\n\t\tconst cwd = process.cwd();\n\t\tconst localConfigResult = await useActorConfig({ cwd });\n\n\t\tif (localConfigResult.isErr()) {\n\t\t\tconst { message, cause } = localConfigResult.unwrapErr();\n\n\t\t\terror({ message: `${message}${cause ? `\\n ${cause.message}` : ''}` });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\treturn {};\n\t\t}\n\n\t\tconst { config: localConfig } = localConfigResult.unwrap();\n\t\treturn {\n\t\t\tdefaultMemoryMbytes: localConfig?.defaultMemoryMbytes?.toString(),\n\t\t\tminMemoryMbytes: localConfig?.minMemoryMbytes as number | undefined,\n\t\t\tmaxMemoryMbytes: localConfig?.maxMemoryMbytes as number | undefined,\n\t\t};\n\t}\n}\n","import type { ParseArgsOptionDescriptor } from 'node:util';\n\nimport { camelCaseToKebabCase, kebabCaseString, StdinMode } from './apify-command.js';\n\nexport type FlagTag = 'string' | 'boolean' | 'integer';\n\nexport interface BaseFlagOptions {\n\trequired?: boolean;\n\tdescription?: string;\n\taliases?: readonly string[];\n\tchar?: string;\n\thidden?: boolean;\n\t/**\n\t * Maps to the `conflicts` option in yargs, ensures that if this flag is set, others in the array cannot be\n\t */\n\texclusive?: readonly string[];\n\t/**\n\t * Whether the argument should be prefilled from stdin\n\t * @default false\n\t */\n\tstdin?: StdinMode;\n}\n\nexport interface StringFlagOptions<Choices extends readonly string[] = readonly string[]> extends BaseFlagOptions {\n\tchoices?: Choices;\n\tdefault?: string;\n}\n\nexport interface BooleanFlagOptions extends BaseFlagOptions {\n\tdefault?: boolean;\n}\n\nexport interface IntegerFlagOptions extends BaseFlagOptions {\n\tchoices?: readonly number[];\n\tdefault?: number;\n}\n\ntype FlagBuilderReturn = { flagName: string; option: ParseArgsOptionDescriptor }[];\n\nexport interface TaggedFlagBuilder<\n\tTag extends FlagTag,\n\tChoicesType extends readonly string[] | null,\n\tRequired = boolean,\n\tHasDefault = false,\n> {\n\tflagTag: Tag;\n\tbuilder: (objectName: string) => FlagBuilderReturn;\n\tchoices: ChoicesType;\n\trequired: Required;\n\thasDefault: HasDefault;\n\tstdin: StdinMode;\n\n\t// Fields from the options object\n\tdescription: string | undefined;\n\taliases: readonly string[] | undefined;\n\tchar: string | undefined;\n\thidden: boolean | undefined;\n\texclusive: readonly string[] | undefined;\n}\n\nexport const Flags = {\n\tstring: stringFlag,\n\tboolean: booleanFlag,\n\tinteger: integerFlag,\n};\n\nfunction stringFlag<const Choices extends string[], const T extends StringFlagOptions<readonly string[]>>(\n\toptions: T & { choices?: Choices },\n): TaggedFlagBuilder<'string', Choices, T['default'] extends string ? true : T['required'], T['default']> {\n\treturn {\n\t\tflagTag: 'string',\n\t\tbuilder: (objectName) => {\n\t\t\tconst allAliases = new Set([...(options.aliases ?? [])]);\n\n\t\t\tallAliases.delete(objectName);\n\n\t\t\tconst returnValue: FlagBuilderReturn = [\n\t\t\t\t{\n\t\t\t\t\tflagName: objectName,\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t// We specify true here to throw a nicer error later if the user passes multiple values / future proofing\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (options.char) {\n\t\t\t\treturnValue[0].option.short = options.char;\n\t\t\t}\n\n\t\t\tfor (const alias of allAliases) {\n\t\t\t\treturnValue.push({\n\t\t\t\t\tflagName: kebabCaseString(camelCaseToKebabCase(alias)).toLowerCase(),\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn returnValue;\n\t\t},\n\t\tchoices: options.choices as Choices,\n\t\trequired: (options.required ?? false) as never,\n\t\thasDefault: options.default,\n\t\tstdin: options.stdin ?? StdinMode.Stringified,\n\n\t\tdescription: options.description,\n\t\taliases: options.aliases,\n\t\tchar: options.char,\n\t\thidden: options.hidden,\n\t\texclusive: options.exclusive,\n\t};\n}\n\nfunction booleanFlag<const T extends BooleanFlagOptions>(\n\toptions: T,\n): TaggedFlagBuilder<'boolean', never, T['default'] extends boolean ? true : T['required'], T['default']> {\n\treturn {\n\t\tflagTag: 'boolean',\n\t\tbuilder: (objectName) => {\n\t\t\tconst allAliases = new Set([...(options.aliases ?? [])]);\n\n\t\t\tallAliases.delete(objectName);\n\n\t\t\tconst returnValue: FlagBuilderReturn = [\n\t\t\t\t{\n\t\t\t\t\tflagName: objectName,\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (options.char) {\n\t\t\t\treturnValue[0].option.short = options.char;\n\t\t\t}\n\n\t\t\tfor (const alias of allAliases) {\n\t\t\t\treturnValue.push({\n\t\t\t\t\tflagName: kebabCaseString(camelCaseToKebabCase(alias)).toLowerCase(),\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn returnValue;\n\t\t},\n\t\tchoices: null as never,\n\t\trequired: (options.required ?? false) as never,\n\t\thasDefault: options.default,\n\t\tstdin: options.stdin ?? StdinMode.Raw,\n\n\t\tdescription: options.description,\n\t\taliases: options.aliases,\n\t\tchar: options.char,\n\t\thidden: options.hidden,\n\t\texclusive: options.exclusive,\n\t};\n}\n\nfunction integerFlag<const T extends IntegerFlagOptions>(\n\toptions: T,\n): TaggedFlagBuilder<'integer', never, T['default'] extends number ? true : T['required'], T['default']> {\n\treturn {\n\t\tflagTag: 'integer',\n\t\tbuilder: (objectName) => {\n\t\t\tconst allAliases = new Set([...(options.aliases ?? [])]);\n\n\t\t\tallAliases.delete(objectName);\n\n\t\t\tconst returnValue: FlagBuilderReturn = [\n\t\t\t\t{\n\t\t\t\t\tflagName: objectName,\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t// We specify true here to throw a nicer error later if the user passes multiple values / future proofing\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tif (options.char) {\n\t\t\t\treturnValue[0].option.short = options.char;\n\t\t\t}\n\n\t\t\tfor (const alias of allAliases) {\n\t\t\t\treturnValue.push({\n\t\t\t\t\tflagName: kebabCaseString(camelCaseToKebabCase(alias)).toLowerCase(),\n\t\t\t\t\toption: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn returnValue;\n\t\t},\n\t\tchoices: null as never,\n\t\trequired: (options.required ?? false) as never,\n\t\thasDefault: options.default,\n\t\tstdin: options.stdin ?? StdinMode.Raw,\n\n\t\tdescription: options.description,\n\t\taliases: options.aliases,\n\t\tchar: options.char,\n\t\thidden: options.hidden,\n\t\texclusive: options.exclusive,\n\t};\n}\n","import { mkdir, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { inspect } from 'node:util';\n\nimport { err, ok, type Result } from '@sapphire/result';\n\nimport { ACTOR_SPECIFICATION_VERSION, DEPRECATED_LOCAL_CONFIG_NAME } from '../consts.js';\nimport { error, info, warning } from '../outputs.js';\nimport { getJsonFileContent, getLocalConfigPath } from '../utils.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\nimport { useYesNoConfirm } from './user-confirmations/useYesNoConfirm.js';\n\nconst getDeprecatedLocalConfigPath = (cwd: string) => join(cwd, DEPRECATED_LOCAL_CONFIG_NAME);\n\nexport interface ActorConfigError {\n\tmessage: string;\n\tcause?: Error;\n\texists: boolean;\n\tconfig: Record<string, unknown>;\n}\n\nexport interface ActorConfigResult {\n\texists: boolean;\n\tmigrated: boolean;\n\tconfig: Record<string, unknown>;\n}\n\nexport interface ActorConfigInput {\n\tcwd?: string;\n\tmigrateConfig?: boolean;\n\twarnAboutOldConfig?: boolean;\n}\n\nexport const cwdCache = new Map<string, ActorConfigResult>();\n\nexport async function useActorConfig(\n\t{ cwd = process.cwd(), migrateConfig = true, warnAboutOldConfig = true }: ActorConfigInput = {\n\t\tcwd: process.cwd(),\n\t\tmigrateConfig: true,\n\t\twarnAboutOldConfig: true,\n\t},\n): Promise<Result<ActorConfigResult, ActorConfigError>> {\n\tconst cached = cwdCache.get(cwd);\n\n\tif (cached) {\n\t\tcliDebugPrint('useActorConfig', { cacheHit: true, config: cached });\n\t\treturn ok(cached);\n\t}\n\n\tconst newConfigPath = getLocalConfigPath(cwd);\n\tconst deprecatedConfigPath = getDeprecatedLocalConfigPath(cwd);\n\n\tlet config: Record<string, unknown> | undefined;\n\tlet deprecatedConfig: Record<string, unknown> | undefined;\n\n\ttry {\n\t\tconfig = getJsonFileContent(newConfigPath);\n\t} catch (ex) {\n\t\treturn err({\n\t\t\tmessage: `Failed to read local config at path: '${newConfigPath}':`,\n\t\t\tcause: ex as Error,\n\t\t\texists: false,\n\t\t\tconfig: {},\n\t\t});\n\t}\n\n\ttry {\n\t\tdeprecatedConfig = getJsonFileContent(deprecatedConfigPath);\n\t} catch (ex) {\n\t\treturn err({\n\t\t\tmessage: `Failed to read local config at path: '${deprecatedConfigPath}':`,\n\t\t\tcause: ex as Error,\n\t\t\texists: false,\n\t\t\tconfig: {},\n\t\t});\n\t}\n\n\t// Handle cleanup of deprecated config, we just ignore the deprecated config if both exist\n\tif (config && deprecatedConfig && warnAboutOldConfig) {\n\t\tawait handleBothConfigVersionsFound(deprecatedConfigPath);\n\t}\n\n\tif (!config && !deprecatedConfig) {\n\t\tcwdCache.set(cwd, { exists: false, migrated: false, config: {} });\n\n\t\treturn ok({ exists: false, migrated: false, config: {} });\n\t}\n\n\tlet migrated = false;\n\n\tif (!config && deprecatedConfig && migrateConfig) {\n\t\tconst migratedConfig = await handleMigrationFlow(deprecatedConfig, deprecatedConfigPath, newConfigPath);\n\n\t\tif (migratedConfig.isErr()) {\n\t\t\treturn err(migratedConfig.unwrapErr());\n\t\t}\n\n\t\tconfig = migratedConfig.unwrap();\n\t\tmigrated = true;\n\t}\n\n\tcwdCache.set(cwd, { exists: true, migrated, config: config || deprecatedConfig || {} });\n\n\tcliDebugPrint('useActorConfig', { cacheHit: false, config: cwdCache.get(cwd) });\n\n\treturn ok({ exists: true, migrated, config: config || deprecatedConfig || {} });\n}\n\nasync function handleBothConfigVersionsFound(deprecatedConfigPath: string) {\n\tconst confirmed = await useYesNoConfirm({\n\t\tmessage: `The new version of Apify CLI uses the \".actor/actor.json\" instead of the \"apify.json\" file. Since we have found both files in your Actor directory, \"apify.json\" will be renamed to \"apify.json.deprecated\". Going forward, all commands will use \".actor/actor.json\". You can read about the differences between the old and the new config at https://github.com/apify/apify-cli/blob/master/MIGRATIONS.md. Do you want to continue?`,\n\t});\n\n\t// If users refuse to migrate, 🤷\n\tif (!confirmed) {\n\t\twarning({\n\t\t\tmessage:\n\t\t\t\t'The \"apify.json\" file present in your Actor directory will be ignored, and the new \".actor/actor.json\" file will be used instead. Please, either rename or remove the old file.',\n\t\t});\n\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait rename(deprecatedConfigPath, `${deprecatedConfigPath}.deprecated`);\n\n\t\tinfo({\n\t\t\tmessage: `The \"apify.json\" file has been renamed to \"apify.json.deprecated\". The deprecated file is no longer used by the CLI or Apify Console. If you do not need it for some specific purpose, it can be safely deleted.`,\n\t\t});\n\t} catch (ex) {\n\t\tif (ex instanceof Error) {\n\t\t\terror({\n\t\t\t\tmessage: `Failed to rename the deprecated \"apify.json\" file to \"apify.json.deprecated\".\\n ${ex.message || ex}`,\n\t\t\t});\n\t\t} else {\n\t\t\terror({\n\t\t\t\tmessage: `Failed to rename the deprecated \"apify.json\" file to \"apify.json.deprecated\".\\n ${inspect(ex, { showHidden: false })}`,\n\t\t\t});\n\t\t}\n\t}\n}\n\n// Properties from apify.json file that will me migrated to Actor specs in .actor/actor.json\nconst MIGRATED_APIFY_JSON_PROPERTIES = ['name', 'version', 'buildTag'];\n\nasync function handleMigrationFlow(\n\tdeprecatedConfig: Record<string, unknown>,\n\tdeprecatedConfigPath: string,\n\tconfigPath: string,\n): Promise<Result<Record<string, unknown>, ActorConfigError>> {\n\tlet migratedConfig = { ...deprecatedConfig };\n\n\tif (typeof migratedConfig.version === 'object') {\n\t\tmigratedConfig = updateLocalConfigStructure(migratedConfig);\n\t}\n\n\tmigratedConfig = {\n\t\tactorSpecification: ACTOR_SPECIFICATION_VERSION,\n\t\tenvironmentVariables: deprecatedConfig?.env || undefined,\n\t\t...MIGRATED_APIFY_JSON_PROPERTIES.reduce(\n\t\t\t(acc, prop) => {\n\t\t\t\tacc[prop] = deprecatedConfig[prop];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, unknown>,\n\t\t),\n\t};\n\n\tconst confirmed = await useYesNoConfirm({\n\t\tmessage: `The new version of Apify CLI uses the \".actor/actor.json\" instead of the \"apify.json\" file. Your \"apify.json\" file will be automatically updated to the new format under \".actor/actor.json\". The original file will be renamed by adding the \".deprecated\" suffix. Do you want to continue?`,\n\t});\n\n\tif (!confirmed) {\n\t\treturn err({\n\t\t\tmessage:\n\t\t\t\t'Command can not run with old \"apify.json\" structure. Either let the CLI auto-update it or follow the guide on https://github.com/apify/apify-cli/blob/master/MIGRATIONS.md and update it manually.',\n\t\t\texists: true,\n\t\t\tconfig: migratedConfig,\n\t\t});\n\t}\n\n\t// If we fail to write the new config, its an error\n\n\ttry {\n\t\tawait mkdir(dirname(configPath), { recursive: true });\n\t\tawait writeFile(configPath, JSON.stringify(migratedConfig, null, '\\t'));\n\t} catch (ex) {\n\t\tconst casted = ex as Error;\n\n\t\treturn err({\n\t\t\tmessage: `Failed to write the new \"actor.json\" file to path: '${configPath}'.\\n ${casted.message || casted}`,\n\t\t\texists: true,\n\t\t\tconfig: migratedConfig,\n\t\t});\n\t}\n\n\t// but if we fail to rename the deprecated config, its a warning, cause future runs will ignore it\n\n\ttry {\n\t\tawait rename(deprecatedConfigPath, `${deprecatedConfigPath}.deprecated`);\n\t} catch (ex) {\n\t\tconst casted = ex as Error;\n\n\t\twarning({\n\t\t\tmessage: `Failed to rename the deprecated \"apify.json\" file to \"apify.json.deprecated\".\\n ${casted.message || casted}`,\n\t\t});\n\t}\n\n\tinfo({\n\t\tmessage: `The \"apify.json\" file has been migrated to \".actor/actor.json\" and the original file renamed to \"apify.json.deprecated\". The deprecated file is no longer used by the CLI or Apify Console. If you do not need it for some specific purpose, it can be safely deleted. Do not forget to commit the new file to your Git repository.`,\n\t});\n\n\treturn ok(migratedConfig);\n}\n\n/**\n * Migration for deprecated structure of apify.json to latest.\n */\n\nfunction updateLocalConfigStructure(localConfig: any) {\n\tconst updatedLocalConfig: Record<string, unknown> = {\n\t\tname: localConfig.name,\n\t\ttemplate: localConfig.template,\n\t\tversion: localConfig.version.versionNumber,\n\t\tbuildTag: localConfig.version.buildTag,\n\t\tenv: null,\n\t};\n\n\tif (localConfig.version.envVars?.length) {\n\t\tconst env = {} as Record<string, string>;\n\n\t\tlocalConfig.version.envVars.forEach((envVar: { name: string; value: string }) => {\n\t\t\tif (envVar.name && envVar.value) {\n\t\t\t\tenv[envVar.name] = envVar.value;\n\t\t\t}\n\t\t});\n\n\t\tupdatedLocalConfig.env = env;\n\t}\n\n\treturn updatedLocalConfig;\n}\n","/*\nThe following code is taken from https://github.com/SBoudrias/Inquirer.js/blob/a56b48f06447feb3881b6f670394e17c60a4189b/packages/confirm/src/index.ts\nand altered for our use case.\n\nCopyright (c) 2025 Simon Boudrias\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\nimport { createPrompt, isEnterKey, makeTheme, type Status, useKeypress, usePrefix, useState } from '@inquirer/core';\n\ninterface ConfirmOptions {\n\tmessage: string;\n\tdefault?: boolean;\n}\n\nfunction getBooleanValue(value: string, defaultValue?: boolean): boolean {\n\tlet answer = defaultValue !== false;\n\n\tif (/^(y|yes)/i.test(value)) {\n\t\tanswer = true;\n\t} else if (/^(n|no)/i.test(value)) {\n\t\tanswer = false;\n\t}\n\n\treturn answer;\n}\n\nfunction boolToString(value: boolean): string {\n\treturn value ? 'Yes' : 'No';\n}\n\nexport default createPrompt<boolean, ConfirmOptions>((config, done) => {\n\tconst transformer = boolToString;\n\tconst [status, setStatus] = useState<Status>('idle');\n\tconst [value, setValue] = useState('');\n\tconst theme = makeTheme();\n\tconst prefix = usePrefix({ status, theme });\n\n\tuseKeypress((key, rl) => {\n\t\t// Pressing enter will submit the default answer\n\t\tif (isEnterKey(key)) {\n\t\t\tconst answer = getBooleanValue(value, config.default);\n\t\t\tsetValue(transformer(answer));\n\t\t\tsetStatus('done');\n\t\t\tdone(answer);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Pressing tab will toggle the default answer (redundant, but sure)\n\t\tif (key.name === 'tab') {\n\t\t\tconst answer = boolToString(!getBooleanValue(value, config.default));\n\t\t\trl.clearLine(0); // Remove the tab character.\n\t\t\trl.write(answer);\n\t\t\tsetValue(answer);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Apify edit: if you write y or n, it is directly treated as the answer (skipping the need to press enter)\n\t\tif (key.name === 'y' || key.name === 'n') {\n\t\t\tconst answer = getBooleanValue(key.name, config.default);\n\t\t\tsetValue(transformer(answer));\n\t\t\tsetStatus('done');\n\t\t\tdone(answer);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore all other keys (including backspace)\n\t\trl.clearLine(0);\n\t\trl.write(value);\n\t\tsetValue(rl.line);\n\t});\n\n\tlet formattedValue = value;\n\tlet defaultValue = '';\n\tif (status === 'done') {\n\t\tformattedValue = theme.style.answer(value);\n\t} else {\n\t\tdefaultValue = ` ${theme.style.defaultAnswer(config.default === false ? 'y/N' : 'Y/n')}`;\n\t}\n\n\tconst message = theme.style.message(config.message, status);\n\treturn `${prefix} ${message}${defaultValue} ${formattedValue}`;\n});\n","import confirmImpl from '../../utils/inquirer/confirmImpl.js';\nimport { stdinCheckWrapper } from './_stdinCheckWrapper.js';\n\ninterface UseYesNoConfirmInput {\n\tmessage: string;\n\tdefault?: boolean;\n}\n\nexport const useYesNoConfirm = stdinCheckWrapper(async ({ message, default: defaultValue }: UseYesNoConfirmInput) => {\n\tconst result = await confirmImpl({ message, default: defaultValue });\n\n\treturn result;\n});\n","import { APIFY_ENV_VARS } from '@apify/consts';\n\nimport { getApifyTokenFromEnvOrAuthFile } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { info } from '../../lib/outputs.js';\nimport { getLoggedClient } from '../../lib/utils.js';\n\n/**\n * This command can be used to charge for a specific event in the pay-per-event Actor run.\n * - If run locally or with the --test-pay-per-event flag, it will only log the charge request, without actually charging.\n * - If run in the Actor run on Apify platform without the testing flag, it will charge the specified amount of events.\n *\n * Future TODOs:\n * - Add logic to work with the max charge USD to prevent exceeding the charging limit.\n * - Add logic to store events in the log dataset for later inspection to aid local development.\n */\nexport class ActorChargeCommand extends ApifyCommand<typeof ActorChargeCommand> {\n\tstatic override name = 'charge' as const;\n\n\tstatic override description = 'Charge for a specific event in the pay-per-event Actor run.';\n\n\tstatic override args = {\n\t\teventName: Args.string({\n\t\t\tdescription: 'Name of the event to charge for',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tstatic override flags = {\n\t\t'count': Flags.integer({\n\t\t\tdescription: 'Number of events to charge',\n\t\t\trequired: false,\n\t\t\tdefault: 1,\n\t\t}),\n\t\t'idempotency-key': Flags.string({\n\t\t\tdescription: 'Idempotency key for the charge request',\n\t\t\trequired: false,\n\t\t}),\n\t\t'test-pay-per-event': Flags.boolean({\n\t\t\tdescription: 'Test pay-per-event charging without actually charging',\n\t\t\trequired: false,\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { eventName } = this.args;\n\t\tconst { count, testPayPerEvent, idempotencyKey } = this.flags;\n\n\t\tconst isAtHome = Boolean(process.env.APIFY_IS_AT_HOME);\n\n\t\tif (!isAtHome) {\n\t\t\tinfo({\n\t\t\t\tmessage: `No platform detected: would charge ${count} events of type \"${eventName}\" with idempotency key \"${idempotencyKey ?? 'not-provided'}\".`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (testPayPerEvent) {\n\t\t\tinfo({\n\t\t\t\tmessage: `PPE test mode: would charge ${count} events of type \"${eventName}\" with idempotency key \"${idempotencyKey ?? 'not-provided'}\".`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst apifyToken = await getApifyTokenFromEnvOrAuthFile();\n\t\tconst apifyClient = await getLoggedClient(apifyToken);\n\t\tif (!apifyClient) {\n\t\t\tthrow new Error('Apify token is not set. Please set it using the environment variable APIFY_TOKEN.');\n\t\t}\n\t\tconst runId = process.env[APIFY_ENV_VARS.ACTOR_RUN_ID];\n\n\t\tif (!runId) {\n\t\t\tthrow new Error('Charge command must be executed in a running Actor. Run ID not found.');\n\t\t}\n\n\t\tconst run = await apifyClient.run(runId).get();\n\t\tif (run?.pricingInfo?.pricingModel !== 'PAY_PER_EVENT') {\n\t\t\tthrow new Error('Charge command can only be used with pay-per-event pricing model.');\n\t\t}\n\n\t\tinfo({\n\t\t\tmessage: `Charging ${count} events of type \"${eventName}\" with idempotency key \"${idempotencyKey ?? 'not-provided'}\" (runId: ${runId}).`,\n\t\t\tstdout: true,\n\t\t});\n\t\tawait apifyClient.run(runId).charge({\n\t\t\teventName,\n\t\t\tcount,\n\t\t\tidempotencyKey,\n\t\t});\n\t}\n}\n","import process from 'node:process';\nimport { pipeline } from 'node:stream/promises';\n\nimport type { MemoryStorageOptions } from '@crawlee/memory-storage';\nimport { MemoryStorage } from '@crawlee/memory-storage';\nimport type { StorageClient } from '@crawlee/types';\nimport type { ApifyClientOptions } from 'apify-client';\nimport { ApifyClient } from 'apify-client';\n\nimport { ACTOR_ENV_VARS, APIFY_ENV_VARS, KEY_VALUE_STORE_KEYS, LOCAL_ACTOR_ENV_VARS } from '@apify/consts';\n\nimport { getApifyClientOptions, getLocalStorageDir, getLocalUserInfo } from './utils.js';\n\nexport const APIFY_STORAGE_TYPES = {\n\tKEY_VALUE_STORE: 'KEY_VALUE_STORE',\n\tDATASET: 'DATASET',\n\tREQUEST_QUEUE: 'REQUEST_QUEUE',\n} as const;\n\n/**\n * Returns Apify token from environment variable or local auth file.\n * @returns Apify token\n */\nexport const getApifyTokenFromEnvOrAuthFile = async () => {\n\tconst apifyToken = process.env[APIFY_ENV_VARS.TOKEN];\n\tif (apifyToken) {\n\t\treturn apifyToken;\n\t}\n\n\tconst localUserInfo = await getLocalUserInfo();\n\tif (!localUserInfo || !localUserInfo.token) {\n\t\tthrow new Error(\n\t\t\t'Apify token is not set. Please set it using the environment variable APIFY_TOKEN or apify login command.',\n\t\t);\n\t}\n\n\treturn localUserInfo.token;\n};\n\n/**\n * Returns instance of ApifyClient or ApifyStorageLocal based on environment variables.\n * @param options - ApifyClient options\n * @param forceCloud - If true then ApifyClient will be returned.\n */\nexport const getApifyStorageClient = async (\n\toptions: MemoryStorageOptions | ApifyClientOptions = {},\n\tforceCloud = Reflect.has(process.env, APIFY_ENV_VARS.IS_AT_HOME),\n): Promise<StorageClient> => {\n\tconst storageDir = getLocalStorageDir();\n\n\tif (storageDir && !forceCloud) {\n\t\treturn new MemoryStorage({\n\t\t\tlocalDataDirectory: storageDir,\n\t\t\t...options,\n\t\t});\n\t}\n\tconst apifyToken = await getApifyTokenFromEnvOrAuthFile();\n\n\treturn new ApifyClient({\n\t\t...getApifyClientOptions(apifyToken),\n\t\t...options,\n\t});\n};\n\n/**\n * Returns default storage id based on environment variables.\n * Throws error if not set and Actor running on platform.\n * @param storeType\n */\nexport const getDefaultStorageId = (storeType: (typeof APIFY_STORAGE_TYPES)[keyof typeof APIFY_STORAGE_TYPES]) => {\n\tconst envVarName = ACTOR_ENV_VARS[`DEFAULT_${storeType}_ID`];\n\n\treturn process.env[envVarName] || LOCAL_ACTOR_ENV_VARS[envVarName];\n};\n\n/**\n * Outputs value of record into standard output of the command.\n * @param key - Record key\n */\nexport const outputRecordFromDefaultStore = async (key: string) => {\n\tconst apifyClient = await getApifyStorageClient();\n\tconst defaultStoreId = getDefaultStorageId(APIFY_STORAGE_TYPES.KEY_VALUE_STORE);\n\tconst record = await apifyClient.keyValueStore(defaultStoreId).getRecord(key, { stream: true });\n\t// If record does not exist return empty string.\n\tif (!record) return;\n\n\tawait pipeline(record.value, process.stdout, { end: false });\n};\n\nexport const outputInputFromDefaultStore = async () => {\n\treturn outputRecordFromDefaultStore(process.env[ACTOR_ENV_VARS.INPUT_KEY] || KEY_VALUE_STORE_KEYS.INPUT);\n};\n","import { StdinMode } from './apify-command.js';\n\nexport type ArgTag = 'string';\n\nexport interface BaseArgOptions {\n\trequired?: boolean;\n\tdescription?: string;\n\taliases?: readonly string[];\n\t/**\n\t * Whether the argument should be prefilled from stdin\n\t * @default false\n\t */\n\tstdin?: StdinMode;\n\t/**\n\t * Whether this argument should collect everything after it\n\t * @default false\n\t */\n\tcatchAll?: boolean;\n}\n\nexport type StringArgOptions = BaseArgOptions;\n\nexport interface TaggedArgBuilder<Tag extends ArgTag, Required = boolean> {\n\targTag: Tag;\n\trequired: Required;\n\tstdin: StdinMode;\n\n\t// Options from the object\n\tdescription: string | undefined;\n\taliases: readonly string[] | undefined;\n\tcatchAll: boolean;\n}\n\nfunction stringArg<const T extends StringArgOptions>(option: T): TaggedArgBuilder<'string', T['required']> {\n\treturn {\n\t\targTag: 'string',\n\t\trequired: option.required ?? false,\n\t\tstdin: option.stdin ?? StdinMode.Raw,\n\n\t\tdescription: option.description,\n\t\taliases: option.aliases,\n\t\tcatchAll: option.catchAll ?? false,\n\t};\n}\n\nexport const Args = {\n\tstring: stringArg,\n};\n","import { outputInputFromDefaultStore } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\n\nexport class ActorGetInputCommand extends ApifyCommand<typeof ActorGetInputCommand> {\n\tstatic override name = 'get-input' as const;\n\n\tstatic override description =\n\t\t'Gets the Actor input value from the default key-value store associated with the Actor run.';\n\n\tasync run() {\n\t\tawait outputInputFromDefaultStore();\n\t}\n}\n","import type { ApifyClient } from 'apify-client';\n\nimport { ACTOR_ENV_VARS, APIFY_ENV_VARS } from '@apify/consts';\n\nimport { getApifyStorageClient } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { CommandExitCodes } from '../../lib/consts.js';\nimport { error } from '../../lib/outputs.js';\n\nexport class ActorGetPublicUrlCommand extends ApifyCommand<typeof ActorGetPublicUrlCommand> {\n\tstatic override name = 'get-public-url' as const;\n\n\tstatic override description = 'Get an HTTP URL that allows public access to a key-value store item.';\n\n\tstatic override args = {\n\t\tkey: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Key of the record in key-value store',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { key } = this.args;\n\n\t\tif ([undefined, 'false', ''].includes(process.env[APIFY_ENV_VARS.IS_AT_HOME])) {\n\t\t\terror({ message: 'get-public-url is not yet implemented for local development' });\n\t\t\tprocess.exitCode = CommandExitCodes.NotImplemented;\n\t\t\treturn;\n\t\t}\n\t\tconst storeId = process.env[ACTOR_ENV_VARS.DEFAULT_KEY_VALUE_STORE_ID];\n\n\t\t// This should never happen, but handle it gracefully to prevent crashes.\n\t\tif (!storeId) {\n\t\t\terror({\n\t\t\t\tmessage: `Missing environment variable: ${ACTOR_ENV_VARS.DEFAULT_KEY_VALUE_STORE_ID}. Please set it before running the command.`,\n\t\t\t});\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\treturn;\n\t\t}\n\n\t\tconst apifyClient = (await getApifyStorageClient()) as ApifyClient;\n\t\tconst store = await apifyClient.keyValueStore(storeId).get();\n\n\t\tif (!store) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-Value store with ID '${storeId}' was not found. Ensure the store exists and that the correct ID is set in ${ACTOR_ENV_VARS.DEFAULT_KEY_VALUE_STORE_ID}.`,\n\t\t\t});\n\t\t\tprocess.exitCode = CommandExitCodes.NotFound;\n\t\t\treturn;\n\t\t}\n\n\t\tconst publicTarballUrl = await apifyClient.keyValueStore(storeId).getRecordPublicUrl(key);\n\n\t\tconsole.log(publicTarballUrl);\n\t}\n}\n","import { outputRecordFromDefaultStore } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\n\nexport class ActorGetValueCommand extends ApifyCommand<typeof ActorGetValueCommand> {\n\tstatic override name = 'get-value' as const;\n\n\tstatic override description = 'Gets a value from the default key-value store associated with the Actor run.';\n\n\tstatic override args = {\n\t\tkey: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Key of the record in key-value store',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { key } = this.args;\n\n\t\tawait outputRecordFromDefaultStore(key);\n\t}\n}\n","import { cachedStdinInput } from '../../entrypoints/_shared.js';\nimport { APIFY_STORAGE_TYPES, getApifyStorageClient, getDefaultStorageId } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { error } from '../../lib/outputs.js';\n\nexport class ActorPushDataCommand extends ApifyCommand<typeof ActorPushDataCommand> {\n\tstatic override name = 'push-data' as const;\n\n\tstatic override description =\n\t\t\"Saves data to Actor's run default dataset.\\n\\n\" +\n\t\t'Accept input as:\\n' +\n\t\t' - JSON argument:\\n' +\n\t\t' $ apify actor push-data {\"key\": \"value\"}\\n' +\n\t\t' - Piped stdin:\\n' +\n\t\t' $ cat ./test.json | apify actor push-data';\n\n\tstatic override args = {\n\t\titem: Args.string({\n\t\t\tdescription:\n\t\t\t\t'JSON string with one object or array of objects containing data to be stored in the default dataset.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { item: _item } = this.args;\n\n\t\tconst item = _item || cachedStdinInput;\n\n\t\tif (!item) {\n\t\t\terror({ message: 'No item was provided.' });\n\t\t\treturn;\n\t\t}\n\n\t\tconst apifyClient = await getApifyStorageClient();\n\t\tconst defaultStoreId = getDefaultStorageId(APIFY_STORAGE_TYPES.DATASET);\n\n\t\tlet parsedData: Record<string, unknown> | Record<string, unknown>[];\n\t\ttry {\n\t\t\tparsedData = JSON.parse(item.toString('utf8'));\n\t\t} catch (err) {\n\t\t\tthrow new Error(`Failed to parse data as JSON string: ${(err as Error).message}`);\n\t\t}\n\n\t\tawait apifyClient.dataset(defaultStoreId).pushItems(parsedData);\n\t}\n}\n","import { APIFY_STORAGE_TYPES, getApifyStorageClient, getDefaultStorageId } from '../../lib/actor.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\n\nexport class ActorSetValueCommand extends ApifyCommand<typeof ActorSetValueCommand> {\n\tstatic override name = 'set-value' as const;\n\n\tstatic override description =\n\t\t'Sets or removes record into the default key-value store associated with the Actor run.\\n\\n' +\n\t\t'It is possible to pass data using argument or stdin.\\n\\n' +\n\t\t'Passing data using argument:\\n' +\n\t\t'$ apify actor set-value KEY my-value\\n\\n' +\n\t\t'Passing data using stdin with pipe:\\n' +\n\t\t'$ cat ./my-text-file.txt | apify actor set-value KEY --contentType text/plain';\n\n\tstatic override args = {\n\t\tkey: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Key of the record in key-value store.',\n\t\t}),\n\t\tvalue: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Record data, which can be one of the following values:\\n' +\n\t\t\t\t'- If empty, the record in the key-value store is deleted.\\n' +\n\t\t\t\t'- If no `contentType` flag is specified, value is expected to be any JSON string value.\\n' +\n\t\t\t\t'- If options.contentType is set, value is taken as is.',\n\t\t}),\n\t};\n\n\tstatic override flags = {\n\t\tcontentType: Flags.string({\n\t\t\tchar: 'c',\n\t\t\tdescription: 'Specifies a custom MIME content type of the record. By default \"application/json\" is used.',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { key, value } = this.args;\n\t\tconst { contentType = 'application/json; charset=utf-8' } = this.flags;\n\n\t\t// NOTE: If user pass value as argument and data on stdin same time. We use the value from argument.\n\t\tconst recordValue = value || process.stdin;\n\t\tconst apifyClient = await getApifyStorageClient();\n\t\tconst storeClient = apifyClient.keyValueStore(getDefaultStorageId(APIFY_STORAGE_TYPES.KEY_VALUE_STORE));\n\n\t\tif (\n\t\t\trecordValue === undefined ||\n\t\t\trecordValue === null ||\n\t\t\trecordValue === '' ||\n\t\t\trecordValue === 'null' ||\n\t\t\trecordValue === 'undefined'\n\t\t) {\n\t\t\tawait storeClient.deleteRecord(key);\n\t\t} else {\n\t\t\tawait storeClient.setRecord({ key, value: recordValue, contentType });\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { ActorCalculateMemoryCommand } from './calculate-memory.js';\nimport { ActorChargeCommand } from './charge.js';\nimport { ActorGetInputCommand } from './get-input.js';\nimport { ActorGetPublicUrlCommand } from './get-public-url.js';\nimport { ActorGetValueCommand } from './get-value.js';\nimport { ActorPushDataCommand } from './push-data.js';\nimport { ActorSetValueCommand } from './set-value.js';\n\nexport class ActorIndexCommand extends ApifyCommand<typeof ActorIndexCommand> {\n\tstatic override name = 'actor' as const;\n\n\tstatic override description = 'Manages runtime data operations inside of a running Actor.';\n\n\tstatic override subcommands = [\n\t\t//\n\t\tActorSetValueCommand,\n\t\tActorPushDataCommand,\n\t\tActorGetValueCommand,\n\t\tActorGetPublicUrlCommand,\n\t\tActorGetInputCommand,\n\t\tActorChargeCommand,\n\t\tActorCalculateMemoryCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { resolveActorContext } from '../../lib/commands/resolve-actor-context.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport {\n\tgetLoggedClientOrThrow,\n\tobjectGroupBy,\n\toutputJobLog,\n\tprintJsonToStdout,\n\tTimestampFormatter,\n} from '../../lib/utils.js';\n\nexport class BuildsCreateCommand extends ApifyCommand<typeof BuildsCreateCommand> {\n\tstatic override name = 'create' as const;\n\n\tstatic override description = 'Creates a new build of the Actor.';\n\n\tstatic override flags = {\n\t\ttag: Flags.string({\n\t\t\tdescription: 'Build tag to be applied to the successful Actor build. By default, this is \"latest\".',\n\t\t}),\n\t\tversion: Flags.string({\n\t\t\tdescription:\n\t\t\t\t'Optional Actor Version to build. By default, this will be inferred from the tag, but this flag is required when multiple versions have the same tag.',\n\t\t\trequired: false,\n\t\t}),\n\t\tlog: Flags.boolean({\n\t\t\tdescription: 'Whether to print out the build log after the build is triggered.',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\tdescription:\n\t\t\t\t'Optional Actor ID or Name to trigger a build for. By default, it will use the Actor from the current directory.',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { tag, version, json, log } = this.flags;\n\t\tconst { actorId } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tconst ctx = await resolveActorContext({ providedActorNameOrId: actorId, client });\n\n\t\tif (!ctx.valid) {\n\t\t\terror({\n\t\t\t\tmessage: `${ctx.reason}. Please run this command in an Actor directory, or specify the Actor ID.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst actorInfo = (await client.actor(ctx.id).get())!;\n\n\t\tconst versionsByBuildTag = objectGroupBy(\n\t\t\tactorInfo.versions,\n\t\t\t(actorVersion) => actorVersion.buildTag ?? 'latest',\n\t\t);\n\n\t\tconst taggedVersions = versionsByBuildTag[tag ?? 'latest'];\n\t\tconst specificVersionExists = actorInfo.versions.find((v) => v.versionNumber === version);\n\n\t\tlet selectedVersion: string | undefined;\n\t\tlet actualTag = tag;\n\n\t\t// --version takes precedence over tagged versions (but if --tag is also specified, it will be checked again)\n\t\tif (specificVersionExists) {\n\t\t\t// The API doesn't really care if the tag you use for a version is correct or not, just that the version exists. This means you CAN have two separate versions with the same tag\n\t\t\t// but only the latest one that gets built will have the tag.\n\t\t\t// The *console* lets you pick a version to build. Multiple versions can have the same default tag, ergo what was written above.\n\t\t\t// The API *does* also let you tag any existing version with whatever you want. This is where we diverge, and follow semi-console-like behavior. Effectively, this one if check prevents you from doing\n\t\t\t// \"--version 0.1 --tag not_actually_the_tag\", even if that is technically perfectly valid. Future reader of this code, if this is not wanted, nuke the if check.\n\n\t\t\t// This ensures that a --tag and --version match the version and tag the platform knows about\n\t\t\t// but only when --tag is provided\n\t\t\tif (tag && (!taggedVersions || !taggedVersions.some((v) => v.versionNumber === version))) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: `The Actor Version \"${version}\" does not have the tag \"${tag}\".`,\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tselectedVersion = version!;\n\t\t\tactualTag = specificVersionExists.buildTag ?? 'latest';\n\t\t} else if (taggedVersions) {\n\t\t\tselectedVersion = taggedVersions[0].versionNumber!;\n\t\t\tactualTag = tag ?? 'latest';\n\n\t\t\tif (taggedVersions.length > 1) {\n\t\t\t\tif (!version) {\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `Multiple Actor versions with the tag \"${tag}\" found. Please specify the version number using the \"--version\" flag.\\n Available versions for this tag: ${taggedVersions.map((v) => chalk.yellow(v.versionNumber)).join(', ')}`,\n\t\t\t\t\t\tstdout: true,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// On second run, it will call the upper if check\n\t\t\t}\n\t\t}\n\n\t\tif (!selectedVersion) {\n\t\t\terror({\n\t\t\t\tmessage: `No Actor versions with the tag \"${tag}\" found. You can push a new version with this tag by using \"apify push --build-tag=${tag}\".`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst build = await client.actor(ctx.id).build(selectedVersion, { tag });\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(build);\n\t\t\treturn;\n\t\t}\n\n\t\tconst message: string[] = [\n\t\t\t`${chalk.yellow('Actor')}: ${actorInfo?.username ? `${actorInfo.username}/` : ''}${actorInfo?.name ?? 'unknown-actor'} (${chalk.gray(build.actId)})`,\n\t\t\t` ${chalk.yellow('Version')}: ${selectedVersion} (tagged with ${chalk.yellow(actualTag)})`,\n\t\t\t'',\n\t\t\t`${chalk.greenBright('Build Started')} (ID: ${chalk.gray(build.id)})`,\n\t\t\t` ${chalk.yellow('Build Number')}: ${build.buildNumber} (will get tagged once finished)`,\n\t\t\t` ${chalk.yellow('Started')}: ${TimestampFormatter.display(build.startedAt)}`,\n\t\t\t'',\n\t\t];\n\n\t\tconst url = `https://console.apify.com/actors/${build.actId}/builds/${build.buildNumber}`;\n\t\tconst viewMessage = `${chalk.blue('View in Apify Console')}: ${url}`;\n\n\t\tsimpleLog({\n\t\t\tmessage: message.join('\\n'),\n\t\t\tstdout: true,\n\t\t});\n\n\t\tif (log) {\n\t\t\ttry {\n\t\t\t\tawait outputJobLog({ job: build, apifyClient: client });\n\t\t\t} catch (err) {\n\t\t\t\t// This should never happen...\n\t\t\t\terror({\n\t\t\t\t\tmessage: `Failed to print log for build with ID \"${build.id}\": ${(err as Error).message}`,\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Print out an empty line\n\t\t\tsimpleLog({\n\t\t\t\tmessage: '',\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: viewMessage,\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import process from 'node:process';\n\nimport type { ApifyClient } from 'apify-client';\n\nimport { getLocalConfig, getLocalUserInfo } from '../utils.js';\n\n/**\n * Tries to resolve what actor the command ran points to. If an actor id is provided via command line, attempt to resolve it,\n * thus assuming the actor is the one the command should be ran on. If no actor id is provided, try to resolve the actor from the local\n * configuration file. If none of these are successful, return null, signaling an unknown context, and thus no way to continue.\n * @param providedActorNameOrId Actor name or id provided via command line\n */\nexport async function resolveActorContext({\n\tprovidedActorNameOrId,\n\tclient,\n}: {\n\tprovidedActorNameOrId: string | undefined;\n\tclient: ApifyClient;\n}) {\n\tconst userInfo = await getLocalUserInfo();\n\tconst usernameOrId = userInfo.username || (userInfo.id as string);\n\tconst localConfig = getLocalConfig(process.cwd()) || {};\n\n\t// Full ID\n\tif (providedActorNameOrId?.includes('/')) {\n\t\tconst actor = await client.actor(providedActorNameOrId).get();\n\t\tif (!actor) {\n\t\t\treturn {\n\t\t\t\tvalid: false as const,\n\t\t\t\treason: `Actor with ID \"${providedActorNameOrId}\" was not found`,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: true as const,\n\t\t\tuserFriendlyId: `${actor.username}/${actor.name}`,\n\t\t\tid: actor.id,\n\t\t};\n\t}\n\n\t// Try fetching Actor directly by name/id\n\tif (providedActorNameOrId) {\n\t\tconst actorById = await client.actor(providedActorNameOrId).get();\n\n\t\tif (actorById) {\n\t\t\treturn {\n\t\t\t\tvalid: true as const,\n\t\t\t\tuserFriendlyId: `${actorById.username}/${actorById.name}`,\n\t\t\t\tid: actorById.id,\n\t\t\t};\n\t\t}\n\n\t\tconst actorByName = await client.actor(`${usernameOrId}/${providedActorNameOrId.toLowerCase()}`).get();\n\n\t\tif (actorByName) {\n\t\t\treturn {\n\t\t\t\tvalid: true as const,\n\t\t\t\tuserFriendlyId: `${actorByName.username}/${actorByName.name}`,\n\t\t\t\tid: actorByName.id,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: false as const,\n\t\t\treason: `Actor with name or ID \"${providedActorNameOrId}\" was not found`,\n\t\t};\n\t}\n\n\tif (localConfig.name) {\n\t\tconst actor = await client.actor(`${usernameOrId}/${localConfig.name}`).get();\n\n\t\tif (!actor) {\n\t\t\treturn {\n\t\t\t\tvalid: false as const,\n\t\t\t\treason: `Actor with name \"${localConfig.name}\" was not found`,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: true as const,\n\t\t\tuserFriendlyId: `${actor.username}/${actor.name}`,\n\t\t\tid: actor.id,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalid: false as const,\n\t\treason: 'Unable to detect what Actor to create a build for',\n\t};\n}\n","import { OverrideClassName } from '../../lib/types.js';\nimport { BuildsCreateCommand } from '../builds/create.js';\n\nexport class ActorsBuildCommand extends OverrideClassName(BuildsCreateCommand) {\n\tstatic override name = 'build' as const;\n}\n","import process from 'node:process';\n\nimport {\n\ttype ActorRun,\n\ttype ActorStartOptions,\n\ttype ActorTaggedBuild,\n\ttype ApifyClient,\n\ttype Dataset,\n\tDownloadItemsFormat,\n} from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand, StdinMode } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { getInputOverride } from '../../lib/commands/resolve-input.js';\nimport { runActorOrTaskOnCloud, SharedRunOnCloudFlags } from '../../lib/commands/run-on-cloud.js';\nimport { CommandExitCodes, LOCAL_CONFIG_PATH } from '../../lib/consts.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport {\n\tgetLocalConfig,\n\tgetLocalUserInfo,\n\tgetLoggedClientOrThrow,\n\tprintJsonToStdout,\n\tTimestampFormatter,\n} from '../../lib/utils.js';\n\nexport class ActorsCallCommand extends ApifyCommand<typeof ActorsCallCommand> {\n\tstatic override name = 'call' as const;\n\n\tstatic override description =\n\t\t'Executes Actor remotely using your authenticated account.\\n' +\n\t\t'Reads input from local key-value store by default.';\n\n\tstatic override flags = {\n\t\t...SharedRunOnCloudFlags('Actor'),\n\t\tinput: Flags.string({\n\t\t\tchar: 'i',\n\t\t\tdescription: 'Optional JSON input to be given to the Actor.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input-file'],\n\t\t}),\n\t\t'input-file': Flags.string({\n\t\t\tchar: 'f',\n\t\t\tdescription:\n\t\t\t\t'Optional path to a file with JSON input to be given to the Actor. The file must be a valid JSON file. You can also specify `-` to read from standard input.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input'],\n\t\t}),\n\t\tsilent: Flags.boolean({\n\t\t\tchar: 's',\n\t\t\tdescription: 'Prevents printing the logs of the Actor run to the console.',\n\t\t\tdefault: false,\n\t\t}),\n\t\t'output-dataset': Flags.boolean({\n\t\t\tchar: 'o',\n\t\t\tdescription: 'Prints out the entire default dataset on successful run of the Actor.',\n\t\t}),\n\t\t// TODO: do we want to do the --stream-x flags? Can we even do them?\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Name or ID of the Actor to run (e.g. \"my-actor\", \"apify/hello-world\" or \"E2jjCZBezvAZnX8Rb\"). ' +\n\t\t\t\t`If not provided, the command runs the remote Actor specified in the '${LOCAL_CONFIG_PATH}' file.`,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst cwd = process.cwd();\n\t\tconst localConfig = getLocalConfig(cwd) || {};\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst userInfo = await getLocalUserInfo();\n\t\tconst usernameOrId = userInfo.username || (userInfo.id as string);\n\n\t\tif (this.flags.json && this.flags.outputDataset) {\n\t\t\terror({ message: 'You cannot use both the --json and --output-dataset flags when running this command.' });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst {\n\t\t\tid: actorId,\n\t\t\tuserFriendlyId,\n\t\t\tactorData,\n\t\t} = await ActorsCallCommand.resolveActorId({\n\t\t\tclient: apifyClient,\n\t\t\tlocalActorName: localConfig.name as string | undefined,\n\t\t\tusernameOrId,\n\t\t\tprovidedActorNameOrId: this.args.actorId,\n\t\t});\n\n\t\tconst runOpts: ActorStartOptions = {\n\t\t\twaitForFinish: 2, // NOTE: We need to wait some time to Apify open stream and we can create connection\n\t\t};\n\n\t\tif (this.flags.build) {\n\t\t\trunOpts.build = this.flags.build;\n\t\t}\n\n\t\tif (this.flags.timeout) {\n\t\t\trunOpts.timeout = this.flags.timeout;\n\t\t}\n\n\t\tif (this.flags.memory) {\n\t\t\trunOpts.memory = this.flags.memory;\n\t\t}\n\n\t\tconst inputOverride = await getInputOverride(cwd, this.flags.input, this.flags.inputFile);\n\n\t\t// Means we couldn't resolve input, so we should exit\n\t\tif (inputOverride === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet runStarted = false;\n\t\tlet run: ActorRun;\n\n\t\tlet url: string;\n\t\tlet datasetUrl: string;\n\n\t\tconst iterator = runActorOrTaskOnCloud(apifyClient, {\n\t\t\tactorOrTaskData: {\n\t\t\t\tid: actorId,\n\t\t\t\tuserFriendlyId,\n\t\t\t},\n\t\t\trunOptions: runOpts,\n\t\t\ttype: 'Actor',\n\t\t\tinputOverride: inputOverride?.input,\n\t\t\tsilent: this.flags.silent,\n\t\t\twaitForRunToFinish: true,\n\t\t\tprintRunLogs: true,\n\t\t});\n\n\t\tfor await (const yieldedRun of iterator) {\n\t\t\trun = yieldedRun;\n\n\t\t\tif (!runStarted) {\n\t\t\t\trunStarted = true;\n\n\t\t\t\t// A *lot* is copied from `runs info`\n\t\t\t\tif (!this.flags.silent) {\n\t\t\t\t\turl = `https://console.apify.com/actors/${actorId}/runs/${yieldedRun.id}`;\n\t\t\t\t\tdatasetUrl = `https://console.apify.com/storage/datasets/${yieldedRun.defaultDatasetId}`;\n\n\t\t\t\t\tconst message: string[] = [\n\t\t\t\t\t\t`${chalk.yellow('Started')}: ${TimestampFormatter.display(yieldedRun.startedAt)}`,\n\t\t\t\t\t];\n\n\t\t\t\t\t// container url\n\t\t\t\t\tif (yieldedRun.containerUrl) {\n\t\t\t\t\t\tmessage.push(`${chalk.yellow('Container URL')}: ${chalk.blue(yieldedRun.containerUrl)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// basic version info\n\n\t\t\t\t\tconst expectedActorVersion = run.buildNumber.split('.').slice(0, 2).join('.');\n\n\t\t\t\t\tconst actorVersion = actorData.versions.find((item) => item.versionNumber === expectedActorVersion);\n\n\t\t\t\t\tconst runVersionTaggedAs = Object.entries(\n\t\t\t\t\t\t(actorData.taggedBuilds ?? {}) as Record<string, ActorTaggedBuild>,\n\t\t\t\t\t).find(([, data]) => data.buildNumber === yieldedRun.buildNumber)?.[0];\n\n\t\t\t\t\tconst messageParts = [`${chalk.yellow('Build')}:`, chalk.cyan(run.buildNumber)];\n\n\t\t\t\t\tif (runVersionTaggedAs) {\n\t\t\t\t\t\tmessageParts.push(`(${chalk.yellow(runVersionTaggedAs)})`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmessageParts.push(`(${chalk.gray('N/A')})`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (actorVersion) {\n\t\t\t\t\t\tmessageParts.push(\n\t\t\t\t\t\t\t`| ${chalk.gray('Actor version:')} ${chalk.cyan(actorVersion.versionNumber)} (${chalk.yellow(actorVersion.buildTag)})`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tmessage.push(messageParts.join(' '));\n\n\t\t\t\t\t// timeout\n\t\t\t\t\tmessage.push(\n\t\t\t\t\t\t`${chalk.yellow('Timeout')}: ${run.options.timeoutSecs.toLocaleString('en-US')} seconds`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// memory limit\n\t\t\t\t\tmessage.push(`${chalk.yellow('Memory')}: ${run.options.memoryMbytes} MB`);\n\n\t\t\t\t\t// url\n\t\t\t\t\tmessage.push(`${chalk.blue('View on Apify Console')}: ${url}`, '');\n\n\t\t\t\t\tsimpleLog({ message: message.join('\\n'), stdout: !this.flags.json });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(run!);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.flags.silent) {\n\t\t\tsimpleLog({\n\t\t\t\tmessage: [\n\t\t\t\t\t'',\n\t\t\t\t\t`${chalk.blue('Export results')}: ${datasetUrl!}`,\n\t\t\t\t\t`${chalk.blue('View on Apify Console')}: ${url!}`,\n\t\t\t\t].join('\\n'),\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\n\t\tif (this.flags.outputDataset) {\n\t\t\tconst datasetId = run!.defaultDatasetId;\n\n\t\t\tlet info: Dataset;\n\t\t\tlet retries = 4;\n\n\t\t\t// Why is this needed? Sometimes, when fetching the dataset info right after the run ends, the object doesn't have the stats up-to-date.\n\t\t\t// But sometimes it does!\n\t\t\tdo {\n\t\t\t\tinfo = (await apifyClient.dataset(datasetId).get())!;\n\n\t\t\t\tif (info?.itemCount) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait new Promise((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, 250);\n\t\t\t\t});\n\t\t\t} while (retries--);\n\n\t\t\tconst dataset = await apifyClient.dataset(datasetId).downloadItems(DownloadItemsFormat.JSON, {\n\t\t\t\tclean: true,\n\t\t\t});\n\n\t\t\tconsole.log(dataset.toString());\n\t\t}\n\t}\n\n\tstatic async resolveActorId({\n\t\tclient,\n\t\tlocalActorName,\n\t\tusernameOrId,\n\t\tprovidedActorNameOrId,\n\t}: {\n\t\tclient: ApifyClient;\n\t\tlocalActorName: string | undefined;\n\t\tusernameOrId: string;\n\t\tprovidedActorNameOrId?: string;\n\t}) {\n\t\t// Full ID\n\t\tif (providedActorNameOrId?.includes('/')) {\n\t\t\tconst actor = await client.actor(providedActorNameOrId).get();\n\t\t\tif (!actor) {\n\t\t\t\tthrow new Error(`Cannot find Actor with ID '${providedActorNameOrId}' in your account.`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tuserFriendlyId: `${actor.username}/${actor.name}`,\n\t\t\t\tid: actor.id,\n\t\t\t\tactorData: actor,\n\t\t\t};\n\t\t}\n\n\t\t// Try fetching Actor directly by name/id\n\t\tif (providedActorNameOrId) {\n\t\t\tconst actorById = await client.actor(providedActorNameOrId).get();\n\n\t\t\tif (actorById) {\n\t\t\t\treturn {\n\t\t\t\t\tuserFriendlyId: `${actorById.username}/${actorById.name}`,\n\t\t\t\t\tid: actorById.id,\n\t\t\t\t\tactorData: actorById,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst actorByName = await client.actor(`${usernameOrId}/${providedActorNameOrId.toLowerCase()}`).get();\n\n\t\t\tif (actorByName) {\n\t\t\t\treturn {\n\t\t\t\t\tuserFriendlyId: `${actorByName.username}/${actorByName.name}`,\n\t\t\t\t\tid: actorByName.id,\n\t\t\t\t\tactorData: actorByName,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthrow new Error(`Cannot find Actor with name or ID '${providedActorNameOrId}' in your account.`);\n\t\t}\n\n\t\tif (localActorName) {\n\t\t\tconst actor = await client.actor(`${usernameOrId}/${localActorName}`).get();\n\n\t\t\tif (!actor) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot find Actor with ID '${usernameOrId}/${localActorName}' ` +\n\t\t\t\t\t\t'in your account. Call \"apify push\" to push this Actor to Apify platform.',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tuserFriendlyId: `${actor.username}/${actor.name}`,\n\t\t\t\tid: actor.id,\n\t\t\t\tactorData: actor,\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t'Please provide an Actor ID or name, or run this command from a directory with a valid Apify Actor.',\n\t\t);\n\t}\n}\n","import { access, readFile } from 'node:fs/promises';\nimport path, { resolve } from 'node:path';\nimport process from 'node:process';\n\nimport mime from 'mime';\n\nimport { cachedStdinInput } from '../../entrypoints/_shared.js';\nimport { CommandExitCodes } from '../consts.js';\nimport { error } from '../outputs.js';\nimport { getLocalInput } from '../utils.js';\n\nexport function resolveInput(cwd: string, inputOverride: Record<string, unknown> | undefined) {\n\tlet inputToUse: Record<string, unknown> | undefined;\n\tlet contentType!: string;\n\n\tif (inputOverride) {\n\t\tinputToUse = inputOverride;\n\t\tcontentType = 'application/json';\n\t} else {\n\t\tconst localInput = getLocalInput(cwd);\n\n\t\tif (localInput) {\n\t\t\tconst ext = mime.getExtension(localInput.contentType!);\n\n\t\t\tif (ext === 'json') {\n\t\t\t\tinputToUse = JSON.parse(localInput.body.toString('utf8'));\n\t\t\t\tcontentType = 'application/json';\n\t\t\t} else {\n\t\t\t\tinputToUse = localInput.body as never;\n\t\t\t\tcontentType = localInput.contentType!;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!inputToUse || !contentType) {\n\t\treturn null;\n\t}\n\n\treturn { inputToUse, contentType };\n}\n\nexport async function getInputOverride(cwd: string, inputFlag: string | undefined, inputFileFlag: string | undefined) {\n\tlet input: Record<string, unknown> | undefined;\n\tlet source: 'stdin' | 'input' | string;\n\n\tif (!inputFlag && !inputFileFlag) {\n\t\t// Try reading stdin\n\t\tconst stdin = cachedStdinInput;\n\n\t\tif (stdin) {\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(stdin.toString('utf8'));\n\n\t\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\t\terror({ message: 'The provided input is invalid. It should be an object, not an array.' });\n\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tinput = parsed;\n\t\t\t\tsource = 'stdin';\n\t\t\t} catch (err) {\n\t\t\t\terror({ message: `Cannot parse JSON input from standard input.\\n ${(err as Error).message}` });\n\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (inputFlag) {\n\t\tswitch (inputFlag[0]) {\n\t\t\tcase '-': {\n\t\t\t\terror({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t'You need to pipe something into standard input when you specify the `-` value to `--input`.',\n\t\t\t\t});\n\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst fileExists = await access(resolve(cwd, inputFlag))\n\t\t\t\t\t.then(() => true)\n\t\t\t\t\t.catch(() => false);\n\n\t\t\t\tconst inputLooksLikePath =\n\t\t\t\t\t// JSON file\n\t\t\t\t\tinputFlag.endsWith('.json') ||\n\t\t\t\t\tinputFlag.endsWith('.json5') ||\n\t\t\t\t\t// UNIX-style path access\n\t\t\t\t\t// this also matches Windows paths\n\t\t\t\t\tpath.isAbsolute(inputFlag) ||\n\t\t\t\t\tinputFlag.startsWith('./') ||\n\t\t\t\t\tinputFlag.startsWith('../') ||\n\t\t\t\t\t// Home directory access\n\t\t\t\t\tinputFlag.includes('~') ||\n\t\t\t\t\t// Windows-style path access\n\t\t\t\t\tinputFlag.startsWith('.\\\\') ||\n\t\t\t\t\tinputFlag.startsWith('..\\\\');\n\n\t\t\t\tif (fileExists || inputLooksLikePath) {\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `Providing a JSON file path in the --input flag is not supported. Use the \"--input-file=\" flag instead`,\n\t\t\t\t\t});\n\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(inputFlag);\n\n\t\t\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\t\t\terror({ message: 'The provided input is invalid. It should be an object, not an array.' });\n\t\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinput = parsed;\n\t\t\t\t\tsource = 'input';\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror({ message: `Cannot parse JSON input.\\n ${(err as Error).message}` });\n\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (inputFileFlag) {\n\t\tswitch (inputFileFlag[0]) {\n\t\t\tcase '-': {\n\t\t\t\terror({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t'You need to pipe something into standard input when you specify the `-` value to `--input-file`.',\n\t\t\t\t});\n\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst fullPath = resolve(cwd, inputFileFlag);\n\n\t\t\t\t// Try reading the file, and if that fails, try reading it as JSON\n\n\t\t\t\tlet fsError: unknown;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst fileContent = await readFile(fullPath, 'utf8');\n\t\t\t\t\tconst parsed = JSON.parse(fileContent);\n\n\t\t\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\t\t\terror({ message: 'The provided input is invalid. It should be an object, not an array.' });\n\t\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinput = parsed;\n\t\t\t\t\tsource = inputFileFlag;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfsError = err;\n\t\t\t\t}\n\n\t\t\t\tif (fsError) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(inputFileFlag);\n\n\t\t\t\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\t\t\t\terror({ message: 'The provided input is invalid. It should be an object, not an array.' });\n\t\t\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinput = parsed;\n\t\t\t\t\t\tsource = inputFileFlag;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\terror({\n\t\t\t\t\t\t\tmessage: `Cannot read input file at path \"${fullPath}\".\\n ${(fsError as Error).message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidInput;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn input ? { input, source: source! } : undefined;\n}\n","import process from 'node:process';\n\nimport type { ActorRun, ApifyClient, TaskStartOptions } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ACTOR_JOB_STATUSES } from '@apify/consts';\n\nimport { Flags } from '../command-framework/flags.js';\nimport { CommandExitCodes } from '../consts.js';\nimport { error, run as runLog, success, warning } from '../outputs.js';\nimport { outputJobLog } from '../utils.js';\nimport { resolveInput } from './resolve-input.js';\n\nconst TerminalStatuses = [\n\tACTOR_JOB_STATUSES.SUCCEEDED,\n\tACTOR_JOB_STATUSES.ABORTED,\n\tACTOR_JOB_STATUSES.FAILED,\n\tACTOR_JOB_STATUSES.TIMED_OUT,\n];\n\nexport interface RunOnCloudOptions {\n\tactorOrTaskData: {\n\t\tid: string;\n\t\tuserFriendlyId: string;\n\t\ttitle?: string;\n\t};\n\trunOptions: TaskStartOptions;\n\ttype: 'Actor' | 'Task';\n\twaitForFinishMillis?: number;\n\tinputOverride?: Record<string, unknown>;\n\tsilent?: boolean;\n\twaitForRunToFinish?: boolean;\n\tprintRunLogs?: boolean;\n}\n\nexport async function* runActorOrTaskOnCloud(apifyClient: ApifyClient, options: RunOnCloudOptions) {\n\tconst cwd = process.cwd();\n\tconst {\n\t\tactorOrTaskData,\n\t\trunOptions,\n\t\ttype,\n\t\twaitForFinishMillis,\n\t\tinputOverride,\n\t\tsilent,\n\t\twaitForRunToFinish,\n\t\tprintRunLogs,\n\t} = options;\n\n\tconst clientMethod = type === 'Actor' ? 'actor' : 'task';\n\n\t// Get input for actor\n\tconst actorInput = resolveInput(cwd, inputOverride);\n\n\tif (!silent) {\n\t\tif (type === 'Actor') {\n\t\t\trunLog({\n\t\t\t\tmessage: `Calling ${type} ${actorOrTaskData.userFriendlyId} (${chalk.gray(actorOrTaskData.id)})\\n`,\n\t\t\t});\n\t\t} else if (actorOrTaskData.title) {\n\t\t\trunLog({\n\t\t\t\tmessage: `Calling ${type} ${actorOrTaskData.title} (${actorOrTaskData.userFriendlyId}, ${chalk.gray(actorOrTaskData.id)})\\n`,\n\t\t\t});\n\t\t} else {\n\t\t\trunLog({\n\t\t\t\tmessage: `Calling ${type} ${actorOrTaskData.userFriendlyId} (${chalk.gray(actorOrTaskData.id)})\\n`,\n\t\t\t});\n\t\t}\n\t}\n\n\tlet run: ActorRun;\n\n\ttry {\n\t\tif (actorInput && type === 'Actor') {\n\t\t\t// TODO: For some reason we cannot pass json as buffer with right contentType into apify-client.\n\t\t\t// It will save malformed JSON which looks like buffer as INPUT.\n\t\t\t// We need to fix this in v1 during removing call under Actor namespace.\n\t\t\trun = await apifyClient[clientMethod](actorOrTaskData.id).start(actorInput.inputToUse, {\n\t\t\t\t...runOptions,\n\t\t\t\tcontentType: actorInput.contentType,\n\t\t\t});\n\t\t} else {\n\t\t\trun = await apifyClient[clientMethod](actorOrTaskData.id).start(undefined, runOptions);\n\t\t}\n\t} catch (err: any) {\n\t\t// TODO: Better error message in apify-client-js\n\t\tif (err.type === 'record-not-found') {\n\t\t\tthrow new Error(`${type} ${actorOrTaskData.userFriendlyId} (${actorOrTaskData.id}) not found!`);\n\t\t}\n\n\t\tthrow err;\n\t}\n\n\t// Return the started run right away\n\tyield run;\n\n\tif (!silent && printRunLogs) {\n\t\ttry {\n\t\t\tconst res = await outputJobLog({ job: run, timeoutMillis: waitForFinishMillis, apifyClient });\n\n\t\t\tif (res === 'timeouts') {\n\t\t\t\tconsole.error(`\\n${chalk.gray('Timeout for printing logs was hit, there may be future logs.')}\\n`);\n\t\t\t} else {\n\t\t\t\tconsole.error();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\twarning({ message: 'Can not get log:' });\n\t\t\tconsole.error(err);\n\t\t}\n\t}\n\n\trun = (await apifyClient.run(run.id).get())!;\n\n\tif (waitForRunToFinish) {\n\t\twhile (!TerminalStatuses.includes(run.status as never)) {\n\t\t\trun = (await apifyClient.run(run.id).get())!;\n\n\t\t\tif (TerminalStatuses.includes(run.status as never)) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Wait a second before checking again\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\tsetTimeout(resolve, 1000);\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!silent) {\n\t\tif (run.status === ACTOR_JOB_STATUSES.SUCCEEDED) {\n\t\t\tsuccess({ message: `${type} finished.` });\n\t\t} else if (run.status === ACTOR_JOB_STATUSES.RUNNING) {\n\t\t\twarning({ message: `${type} is still running!` });\n\t\t} else if (run.status === ACTOR_JOB_STATUSES.ABORTED || run.status === ACTOR_JOB_STATUSES.ABORTING) {\n\t\t\twarning({ message: `${type} was aborted!` });\n\t\t\tprocess.exitCode = CommandExitCodes.RunAborted;\n\t\t} else {\n\t\t\terror({ message: `${type} failed!` });\n\t\t\tprocess.exitCode = CommandExitCodes.RunFailed;\n\t\t}\n\t}\n\n\t// Return the finished run\n\tyield run;\n}\n\nexport const SharedRunOnCloudFlags = (type: 'Actor' | 'Task') => ({\n\tbuild: Flags.string({\n\t\tchar: 'b',\n\t\tdescription: 'Tag or number of the build to run (e.g. \"latest\" or \"1.2.34\").',\n\t\trequired: false,\n\t}),\n\ttimeout: Flags.integer({\n\t\tchar: 't',\n\t\tdescription: `Timeout for the ${type} run in seconds. Zero value means there is no timeout.`,\n\t\trequired: false,\n\t}),\n\tmemory: Flags.integer({\n\t\tchar: 'm',\n\t\tdescription: `Amount of memory allocated for the ${type} run, in megabytes.`,\n\t\trequired: false,\n\t}),\n});\n","import type { Actor, ActorTaggedBuild, Build, User } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { resolveActorContext } from '../../lib/commands/resolve-actor-context.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { DurationFormatter, getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\ninterface HydratedActorInfo extends Omit<Actor, 'taggedBuilds'> {\n\ttaggedBuilds?: Record<string, ActorTaggedBuild & { build?: Build }>;\n\tactorMaker?: User;\n}\n\ninterface PricingInfo {\n\tpricingModel: 'PRICE_PER_DATASET_ITEM' | 'FLAT_PRICE_PER_MONTH' | 'PAY_PER_EVENT' | 'FREE';\n\tpricePerUnitUsd: number;\n\tunitName: string;\n\tstartedAt: string;\n\tcreatedAt: string;\n\tapifyMarginPercentage: number;\n\tnotifiedAboutFutureChangeAt: string;\n\tnotifiedAboutChangeAt: string;\n\ttrialMinutes?: number;\n\tpricingPerEvent?: {\n\t\tactorChargeEvents: Record<string, { eventTitle: string; eventDescription: string; eventPriceUsd: number }>;\n\t};\n}\n\nconst eventTitleColumn = '\\u200b';\nconst eventPriceUsdColumn = '\\u200b\\u200b';\n\nconst payPerEventTable = new ResponsiveTable({\n\tallColumns: [eventTitleColumn, eventPriceUsdColumn],\n\tmandatoryColumns: [eventTitleColumn, eventPriceUsdColumn],\n\tcolumnAlignments: {\n\t\t[eventTitleColumn]: 'left',\n\t\t[eventPriceUsdColumn]: 'right',\n\t},\n});\n\nexport class ActorsInfoCommand extends ApifyCommand<typeof ActorsInfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Get information about an Actor.';\n\n\tstatic override flags = {\n\t\treadme: Flags.boolean({\n\t\t\tdescription: 'Return the Actor README.',\n\t\t\texclusive: ['input'],\n\t\t}),\n\t\tinput: Flags.boolean({\n\t\t\tdescription: 'Return the Actor input schema.',\n\t\t\texclusive: ['readme'],\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\tdescription: 'The ID of the Actor to return information about.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { actorId } = this.args;\n\t\tconst { readme, input, json } = this.flags;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst ctx = await resolveActorContext({ providedActorNameOrId: actorId, client });\n\n\t\tif (!ctx.valid) {\n\t\t\terror({\n\t\t\t\tmessage: `${ctx.reason}. Please specify the Actor ID.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst actorInfo = (await client.actor(ctx.id).get())! as HydratedActorInfo;\n\t\tconst actorMaker = await client.user(actorInfo.userId).get();\n\n\t\tactorInfo.actorMaker = actorMaker;\n\n\t\t// Hydrate builds\n\t\tfor (const taggedBuild of Object.values(actorInfo.taggedBuilds ?? {})) {\n\t\t\tif (!taggedBuild.buildId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst buildData = await client.build(taggedBuild.buildId).get();\n\n\t\t\ttaggedBuild.build = buildData;\n\t\t}\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(actorInfo);\n\t\t\treturn;\n\t\t}\n\n\t\tconst latest = actorInfo.taggedBuilds?.latest;\n\n\t\tif (readme) {\n\t\t\tif (!latest) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: 'No README found for this Actor.',\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!latest.build?.readme) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: 'No README found for this Actor.',\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsimpleLog({ message: latest.build.readme, stdout: true });\n\t\t}\n\n\t\tif (input) {\n\t\t\tif (!latest) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: 'No input schema found for this Actor.',\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!latest.build?.inputSchema) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: 'No input schema found for this Actor.',\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsimpleLog({ message: latest.build.inputSchema, stdout: true });\n\t\t}\n\n\t\tconst message = [\n\t\t\t`Information about Actor ${chalk.yellow(`${actorInfo.username}/${actorInfo.name}`)} (${chalk.gray(actorInfo.id)})`,\n\t\t\t'',\n\t\t];\n\n\t\tif (actorInfo.title) {\n\t\t\tmessage.push(`${chalk.yellow('Title:')} ${chalk.bold(actorInfo.title)}`);\n\t\t}\n\n\t\tif (actorInfo.description) {\n\t\t\tmessage.push(`${chalk.yellow('Description:')} ${actorInfo.description}`);\n\t\t}\n\n\t\tmessage.push(\n\t\t\t`${chalk.yellow('Created at:')} ${chalk.cyan(TimestampFormatter.display(actorInfo.createdAt))} ${chalk.gray('|')} ${chalk.yellow('Updated at:')} ${chalk.cyan(\n\t\t\t\tTimestampFormatter.display(actorInfo.modifiedAt),\n\t\t\t)}`,\n\t\t);\n\n\t\tif (actorInfo.actorMaker) {\n\t\t\tmessage.push(\n\t\t\t\t'',\n\t\t\t\t`${chalk.yellow('Made by:')} ${chalk.cyan(actorInfo.actorMaker.profile.name ?? actorInfo.actorMaker.username)}`,\n\t\t\t);\n\n\t\t\t// Missing types who?\n\t\t\tif (Reflect.get(actorInfo, 'isCritical')) {\n\t\t\t\tmessage[message.length - 1] += ` ${chalk.bgGray('Maintained by Apify')}`;\n\t\t\t}\n\t\t}\n\n\t\tif (actorInfo.isPublic) {\n\t\t\tmessage.push('', `${chalk.yellow('Actor is')} ${chalk.green('PUBLIC')}`);\n\t\t} else {\n\t\t\tmessage.push('', `${chalk.yellow('Actor is')} ${chalk.cyan('PRIVATE')}`);\n\t\t}\n\n\t\tif (actorInfo.isDeprecated) {\n\t\t\tmessage.push('', `${chalk.yellow('Actor is')} ${chalk.red('DEPRECATED')}`);\n\t\t}\n\n\t\t// Pricing info\n\t\tconst pricingInfo = Reflect.get(actorInfo, 'pricingInfos') as PricingInfo[] | undefined;\n\n\t\tif (pricingInfo?.length) {\n\t\t\t// We only print the latest pricing info\n\t\t\tconst latestPricingInfo = pricingInfo.at(-1)!;\n\n\t\t\tswitch (latestPricingInfo.pricingModel) {\n\t\t\t\tcase 'FLAT_PRICE_PER_MONTH': {\n\t\t\t\t\tmessage.push(\n\t\t\t\t\t\t`${chalk.yellow('Pricing information:')} ${chalk.bgGray(`$${latestPricingInfo.pricePerUnitUsd}/month + usage`)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (latestPricingInfo.trialMinutes) {\n\t\t\t\t\t\tconst minutesToMs = latestPricingInfo.trialMinutes * 60 * 1000;\n\t\t\t\t\t\tconst duration = DurationFormatter.format(minutesToMs);\n\n\t\t\t\t\t\tmessage.push(` ${chalk.yellow('Trial duration:')} ${chalk.bold(duration)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'PRICE_PER_DATASET_ITEM': {\n\t\t\t\t\tconst pricePerOneKItems = latestPricingInfo.pricePerUnitUsd * 1000;\n\n\t\t\t\t\tmessage.push(\n\t\t\t\t\t\t`${chalk.yellow('Pricing information:')} ${chalk.bgGray(`$${pricePerOneKItems.toFixed(2)} / 1,000 results`)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'PAY_PER_EVENT': {\n\t\t\t\t\tmessage.push(`${chalk.yellow('Pricing information:')} ${chalk.bgGray('Pay per event')}`);\n\n\t\t\t\t\tconst events = Object.values(latestPricingInfo.pricingPerEvent?.actorChargeEvents ?? {});\n\n\t\t\t\t\tfor (const eventInfo of events) {\n\t\t\t\t\t\tpayPerEventTable.pushRow({\n\t\t\t\t\t\t\t[eventTitleColumn]: eventInfo.eventTitle,\n\t\t\t\t\t\t\t[eventPriceUsdColumn]: chalk.bold(`$${eventInfo.eventPriceUsd.toFixed(2)}`),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rendered = payPerEventTable.render(CompactMode.VeryCompact);\n\t\t\t\t\tconst split = rendered.split('\\n');\n\n\t\t\t\t\t// Remove the second line\n\t\t\t\t\tsplit.splice(1, 1);\n\n\t\t\t\t\tmessage.push(split.join('\\n'));\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'FREE': {\n\t\t\t\t\tmessage.push(`${chalk.yellow('Pricing information:')} ${chalk.bgGray('Pay for usage')}`);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tmessage.push(\n\t\t\t\t\t\t`${chalk.yellow('Pricing information:')} ${chalk.bgGray(`Unknown pricing model (${chalk.yellow(latestPricingInfo.pricingModel)})`)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmessage.push(`${chalk.yellow('Pricing information:')} ${chalk.bgGray('Pay for usage')}`);\n\t\t}\n\n\t\t// TODO: do we care about this information?\n\t\tif (actorInfo.seoTitle || actorInfo.seoDescription) {\n\t\t\tmessage.push('', chalk.yellow('SEO information:'));\n\n\t\t\tif (actorInfo.seoTitle) {\n\t\t\t\tmessage.push(` ${chalk.yellow('Title:')} ${actorInfo.seoTitle}`);\n\t\t\t}\n\n\t\t\tif (actorInfo.seoDescription) {\n\t\t\t\tmessage.push(` ${chalk.yellow('Description:')} ${actorInfo.seoDescription}`);\n\t\t\t}\n\t\t}\n\n\t\tif (actorInfo.taggedBuilds) {\n\t\t\tmessage.push('', chalk.yellow('Builds:'));\n\n\t\t\t// Handle latest first\n\t\t\tconst latestBuild = actorInfo.taggedBuilds.latest;\n\n\t\t\tif (latestBuild) {\n\t\t\t\tmessage.push(\n\t\t\t\t\t` ${chalk.yellow('-')} ${chalk.cyan(latestBuild.buildNumber)} ${chalk.gray('/')} ${chalk.yellow('latest')}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfor (const [buildTag, build] of Object.entries(actorInfo.taggedBuilds)) {\n\t\t\t\tif (buildTag === 'latest') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tmessage.push(\n\t\t\t\t\t` ${chalk.yellow('-')} ${chalk.cyan(build.buildNumber)} ${chalk.gray('/')} ${chalk.yellow(buildTag)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tsimpleLog({ message: message.join('\\n'), stdout: true });\n\t}\n}\n","import Table, { type CharName } from 'cli-table3';\n\nconst compactModeChars: Partial<Record<CharName, string>> = {\n\t'mid': '',\n\t'left-mid': '',\n\t'mid-mid': '',\n\t'right-mid': '',\n\tmiddle: ' ',\n\t'top-mid': '─',\n\t'bottom-mid': '─',\n};\n\nconst compactModeCharsWithLineSeparator: Partial<Record<CharName, string>> = {\n\tmiddle: ' ',\n\t'top-mid': '─',\n\t'bottom-mid': '─',\n\ttop: '─',\n\tbottom: '─',\n\n\t'left-mid': '├',\n\tmid: '─',\n\t'mid-mid': '─',\n\t'right-mid': '┤',\n};\n\nconst noSeparators: Partial<Record<CharName, string>> = {\n\tleft: '',\n\tright: '',\n\tmid: '',\n\t'bottom-left': '',\n\t'bottom-mid': '',\n\t'bottom-right': '',\n\ttop: '',\n\t'top-left': '',\n\t'top-mid': '',\n\t'top-right': '',\n\t'left-mid': '',\n\t'mid-mid': '',\n\t'right-mid': '',\n\tbottom: '',\n\tmiddle: ' ',\n};\n\nexport enum CompactMode {\n\t/**\n\t * Print the table as is\n\t */\n\tNone = -1,\n\t/**\n\t * Minimized version of the table, with no separators between rows\n\t */\n\tVeryCompact = 0,\n\t/**\n\t * A version of the compact table that looks akin to the web console (fewer separators, but with lines between rows)\n\t */\n\tWebLikeCompact = 1,\n\t/**\n\t * Straight up no lines, just two spaces in the middle of columns\n\t */\n\tNoLines = 2,\n}\n\nconst charMap = {\n\t[CompactMode.None]: undefined,\n\t[CompactMode.VeryCompact]: compactModeChars,\n\t[CompactMode.WebLikeCompact]: compactModeCharsWithLineSeparator,\n\t[CompactMode.NoLines]: noSeparators,\n} satisfies Record<CompactMode, Partial<Record<CharName, string>> | undefined>;\n\nfunction generateHeaderColors(length: number): string[] {\n\treturn Array.from({ length }, () => 'cyan');\n}\n\nconst terminalColumns = process.stdout.columns ?? 100;\n\n/** @internal */\nexport const kSkipColumn = Symbol.for('@apify/cli:responsive-table:skip-column');\n\nexport interface ResponsiveTableOptions<AllColumns extends string> {\n\t/**\n\t * Represents all the columns the that this table should show, and their order\n\t */\n\tallColumns: AllColumns[];\n\t/**\n\t * Represents the columns that are mandatory for the user to see, even if the terminal size is less than adequate (<100).\n\t * Make sure this field includes columns that provide enough context AND that will fit in an 80-column terminal.\n\t */\n\tmandatoryColumns: NoInfer<AllColumns>[];\n\t/**\n\t * By default, all columns are left-aligned. You can specify columns that should be aligned in the middle or right\n\t */\n\tcolumnAlignments?: Partial<Record<AllColumns, 'left' | 'center' | 'right'>>;\n\t/**\n\t * An array of hidden columns, that can be used to store extra data in a table row, to then render differently in the table based on size constraints\n\t */\n\thiddenColumns?: NoInfer<AllColumns>[];\n\t/**\n\t * A set of different column and value overrides for specific columns based on size constraints\n\t */\n\tbreakpointOverrides?: {\n\t\tsmall: {\n\t\t\t[column in NoInfer<AllColumns>]?: {\n\t\t\t\tlabel?: string;\n\t\t\t\t/**\n\t\t\t\t * The actual column to fetch the value from\n\t\t\t\t */\n\t\t\t\tvalueFrom?: NoInfer<AllColumns>;\n\t\t\t};\n\t\t};\n\t};\n}\n\nexport class ResponsiveTable<AllColumns extends string> {\n\tprivate options: ResponsiveTableOptions<AllColumns>;\n\n\tprivate rows: Record<AllColumns, string | typeof kSkipColumn>[] = [];\n\n\tconstructor(options: ResponsiveTableOptions<AllColumns>) {\n\t\tthis.options = options;\n\t}\n\n\tpushRow(item: Record<AllColumns, string | typeof kSkipColumn>) {\n\t\tthis.rows.push(item);\n\t}\n\n\trender(compactMode: CompactMode): string {\n\t\tconst rawHead = ResponsiveTable.isSmallTerminal() ? this.options.mandatoryColumns : this.options.allColumns;\n\t\tconst headColors = generateHeaderColors(rawHead.length);\n\n\t\tconst compact = compactMode === CompactMode.VeryCompact || compactMode === CompactMode.NoLines;\n\t\tconst chars = charMap[compactMode];\n\n\t\tconst colAligns: ('left' | 'right' | 'center')[] = [];\n\n\t\tconst head: string[] = [];\n\t\tconst headKeys: NoInfer<AllColumns>[] = [];\n\n\t\tfor (const column of rawHead) {\n\t\t\t// Skip all hidden columns\n\t\t\tif (this.options.hiddenColumns?.includes(column)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If there's even one row that is set to have a skipped column value, skip it\n\t\t\tif (this.rows.some((row) => row[column] === kSkipColumn)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Column alignment\n\t\t\tcolAligns.push(this.options.columnAlignments?.[column] || 'left');\n\n\t\t\tif (ResponsiveTable.isSmallTerminal()) {\n\t\t\t\t// Header titles\n\t\t\t\thead.push(this.options.breakpointOverrides?.small?.[column]?.label ?? column);\n\n\t\t\t\t// Actual key to get the value from\n\t\t\t\theadKeys.push(this.options.breakpointOverrides?.small?.[column]?.valueFrom ?? column);\n\t\t\t} else {\n\t\t\t\t// Always use full values\n\t\t\t\thead.push(column);\n\t\t\t\theadKeys.push(column);\n\t\t\t}\n\t\t}\n\n\t\tconst table = new Table({\n\t\t\thead,\n\t\t\tstyle: {\n\t\t\t\thead: headColors,\n\t\t\t\tcompact,\n\t\t\t},\n\t\t\tcolAligns,\n\t\t\tchars,\n\t\t});\n\n\t\tfor (const rowData of this.rows) {\n\t\t\tconst row = headKeys.map((col) => rowData[col] as string);\n\t\t\ttable.push(row);\n\t\t}\n\n\t\treturn table.toString();\n\t}\n\n\tstatic isSmallTerminal() {\n\t\treturn terminalColumns < 100;\n\t}\n}\n","import { Time } from '@sapphire/duration';\nimport type { Actor, ActorRunListItem, ActorTaggedBuild, PaginatedList } from 'apify-client';\nimport chalk from 'chalk';\n\nimport type { ACTOR_JOB_STATUSES } from '@apify/consts';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintStatus } from '../../lib/commands/pretty-print-status.js';\nimport { CompactMode, kSkipColumn, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { info, simpleLog } from '../../lib/outputs.js';\nimport {\n\tDateOnlyTimestampFormatter,\n\tgetLoggedClientOrThrow,\n\tMultilineTimestampFormatter,\n\tprintJsonToStdout,\n\tShortDurationFormatter,\n} from '../../lib/utils.js';\n\nconst statusMap: Record<(typeof ACTOR_JOB_STATUSES)[keyof typeof ACTOR_JOB_STATUSES], string> = {\n\t'TIMED-OUT': chalk.gray('after'),\n\t'TIMING-OUT': chalk.gray('after'),\n\tABORTED: chalk.gray('after'),\n\tABORTING: chalk.gray('after'),\n\tFAILED: chalk.gray('after'),\n\tREADY: chalk.gray('for'),\n\tRUNNING: chalk.gray('for'),\n\tSUCCEEDED: chalk.gray('after'),\n};\n\nconst recentlyUsedTable = new ResponsiveTable({\n\tallColumns: ['Name', 'Runs', 'Last run started at', 'Last run status', 'Last run duration', '_Small_LastRunText'],\n\tmandatoryColumns: ['Name', 'Runs', 'Last run status', 'Last run duration'],\n\tcolumnAlignments: {\n\t\t'Runs': 'right',\n\t\t'Last run duration': 'right',\n\t\tName: 'left',\n\t\t'Last run status': 'center',\n\t},\n\thiddenColumns: ['_Small_LastRunText'],\n\tbreakpointOverrides: {\n\t\tsmall: {\n\t\t\t'Last run status': {\n\t\t\t\tlabel: 'Last run',\n\t\t\t\tvalueFrom: '_Small_LastRunText',\n\t\t\t},\n\t\t},\n\t},\n});\n\nconst myRecentlyUsedTable = new ResponsiveTable({\n\tallColumns: [\n\t\t'Name',\n\t\t'Modified at',\n\t\t'Builds',\n\t\t'Default build',\n\t\t'Runs',\n\t\t'Last run',\n\t\t'Last run status',\n\t\t'Last run duration',\n\t\t'_Small_LastRunText',\n\t],\n\tmandatoryColumns: ['Name', 'Runs', 'Last run', 'Last run duration'],\n\thiddenColumns: ['_Small_LastRunText'],\n\tcolumnAlignments: {\n\t\t'Builds': 'right',\n\t\t'Runs': 'right',\n\t\t'Last run duration': 'right',\n\t\tName: 'left',\n\t\t'Last run status': 'center',\n\t},\n\tbreakpointOverrides: {\n\t\tsmall: {\n\t\t\t'Last run': {\n\t\t\t\tlabel: 'Last run',\n\t\t\t\tvalueFrom: '_Small_LastRunText',\n\t\t\t},\n\t\t},\n\t},\n});\n\ninterface HydratedListData {\n\tid: string;\n\tcreatedAt: Date;\n\tmodifiedAt: Date;\n\tname: string;\n\tusername: string;\n\ttitle: string;\n\tstats: {\n\t\ttotalRuns: number;\n\t\tlastRunStartedAt: string | null;\n\t};\n\tactor: Actor | null;\n\tlastRun: ActorRunListItem | null;\n}\n\nexport class ActorsLsCommand extends ApifyCommand<typeof ActorsLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Prints a list of recently executed Actors or Actors you own.';\n\n\tstatic override flags = {\n\t\tmy: Flags.boolean({\n\t\t\tdescription: 'Whether to list Actors made by the logged in user.',\n\t\t\tdefault: false,\n\t\t}),\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'Number of Actors that will be skipped.',\n\t\t\tdefault: 0,\n\t\t}),\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'Number of Actors that will be listed.',\n\t\t\tdefault: 20,\n\t\t}),\n\t\tdesc: Flags.boolean({\n\t\t\tdescription: 'Sort Actors in descending order.',\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { desc, limit, offset, my, json } = this.flags;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tconst rawActorList = await client.actors().list({ limit, offset, desc, my });\n\n\t\tif (rawActorList.count === 0) {\n\t\t\tif (json) {\n\t\t\t\tprintJsonToStdout(rawActorList);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinfo({\n\t\t\t\tmessage: my ? \"You don't have any Actors yet!\" : 'There are no recent Actors used by you.',\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Fetch the last run for actors\n\t\tconst actorList: PaginatedList<HydratedListData> = {\n\t\t\t...rawActorList,\n\t\t\titems: await Promise.all(\n\t\t\t\trawActorList.items.map(async (actorData) => {\n\t\t\t\t\tconst actor = await client.actor(actorData.id).get();\n\t\t\t\t\tconst runs = await client\n\t\t\t\t\t\t.actor(actorData.id)\n\t\t\t\t\t\t.runs()\n\t\t\t\t\t\t.list({ desc: true, limit: 1 })\n\t\t\t\t\t\t// Throws an error if the returned actor changed publicity status\n\t\t\t\t\t\t.catch(\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\tcount: 0,\n\t\t\t\t\t\t\t\t\tdesc: true,\n\t\t\t\t\t\t\t\t\titems: [],\n\t\t\t\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\t\ttotal: 0,\n\t\t\t\t\t\t\t\t}) satisfies PaginatedList<ActorRunListItem>,\n\t\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...actorData,\n\t\t\t\t\t\tactor: actor ?? null,\n\t\t\t\t\t\tlastRun: (runs.items[0] ?? null) as ActorRunListItem | null,\n\t\t\t\t\t} as HydratedListData;\n\t\t\t\t}),\n\t\t\t),\n\t\t};\n\n\t\tactorList.items = my ? this.sortByModifiedAt(actorList.items) : this.sortByLastRun(actorList.items);\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(actorList);\n\t\t\treturn;\n\t\t}\n\n\t\tconst table = my ? myRecentlyUsedTable : recentlyUsedTable;\n\n\t\tconst longestActorTitleLength =\n\t\t\tactorList.items.reduce((acc, curr) => {\n\t\t\t\tconst title = `${curr.username}/${curr.name}`;\n\n\t\t\t\tif (title.length > acc) {\n\t\t\t\t\treturn title.length;\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t}, 0) +\n\t\t\t// Padding left right of the name column\n\t\t\t2 +\n\t\t\t// Runs column minimum size with padding\n\t\t\t6;\n\n\t\tfor (const item of actorList.items) {\n\t\t\tconst lastRunDisplayedTimestamp = item.stats.lastRunStartedAt\n\t\t\t\t? MultilineTimestampFormatter.display(item.stats.lastRunStartedAt)\n\t\t\t\t: '';\n\n\t\t\tconst lastRunDuration = item.lastRun\n\t\t\t\t? (() => {\n\t\t\t\t\t\tif (item.lastRun.finishedAt) {\n\t\t\t\t\t\t\treturn ShortDurationFormatter.format(\n\t\t\t\t\t\t\t\titem.lastRun.finishedAt.getTime() - item.lastRun.startedAt.getTime(),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst duration = Date.now() - item.lastRun.startedAt.getTime();\n\n\t\t\t\t\t\treturn `${ShortDurationFormatter.format(duration)}…`;\n\t\t\t\t\t})()\n\t\t\t\t: '';\n\n\t\t\tconst defaultBuild = item.actor\n\t\t\t\t? (() => {\n\t\t\t\t\t\tconst buildVersionToTag = Object.entries(\n\t\t\t\t\t\t\t(item.actor.taggedBuilds ?? {}) as Record<string, ActorTaggedBuild>,\n\t\t\t\t\t\t).find(\n\t\t\t\t\t\t\t([tag, data]) =>\n\t\t\t\t\t\t\t\tdata.buildNumber === item.actor!.defaultRunOptions.build ||\n\t\t\t\t\t\t\t\ttag === item.actor!.defaultRunOptions.build,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (buildVersionToTag) {\n\t\t\t\t\t\t\treturn `${chalk.yellow(buildVersionToTag[0])} / ${chalk.cyan(buildVersionToTag[1].buildNumber ?? item.actor.defaultRunOptions.build)}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn chalk.gray('Unknown');\n\t\t\t\t\t})()\n\t\t\t\t: chalk.gray('Unknown');\n\n\t\t\tconst runStatus = (() => {\n\t\t\t\tif (item.lastRun) {\n\t\t\t\t\tconst status = prettyPrintStatus(item.lastRun.status);\n\n\t\t\t\t\tconst stringParts = [status];\n\n\t\t\t\t\tif (lastRunDuration) {\n\t\t\t\t\t\tstringParts.push(statusMap[item.lastRun.status], chalk.cyan(lastRunDuration));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (item.lastRun.finishedAt) {\n\t\t\t\t\t\tconst diff = Date.now() - item.lastRun.finishedAt.getTime();\n\n\t\t\t\t\t\tif (diff < Time.Week) {\n\t\t\t\t\t\t\tstringParts.push('\\n', chalk.gray(`${ShortDurationFormatter.format(diff)} ago`));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstringParts.push(\n\t\t\t\t\t\t\t\t'\\n',\n\t\t\t\t\t\t\t\tchalk.gray('On', DateOnlyTimestampFormatter.display(item.lastRun.finishedAt)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn stringParts.join(' ');\n\t\t\t\t}\n\n\t\t\t\treturn '';\n\t\t\t})();\n\n\t\t\ttable.pushRow({\n\t\t\t\tName: `${item.title}\\n${chalk.gray(`${item.username}/${item.name}`)}`,\n\t\t\t\t// Completely arbitrary number, but its enough for a very specific edge case where a full actor identifier could be very long, but only on small terminals\n\t\t\t\tRuns:\n\t\t\t\t\tResponsiveTable.isSmallTerminal() && longestActorTitleLength >= 56\n\t\t\t\t\t\t? kSkipColumn\n\t\t\t\t\t\t: chalk.cyan(`${item.stats?.totalRuns ?? 0}`),\n\t\t\t\t'Last run started at': lastRunDisplayedTimestamp,\n\t\t\t\t'Last run': lastRunDisplayedTimestamp,\n\t\t\t\t'Last run status': item.lastRun ? prettyPrintStatus(item.lastRun.status) : '',\n\t\t\t\t'Modified at': MultilineTimestampFormatter.display(item.modifiedAt),\n\t\t\t\tBuilds: item.actor ? chalk.cyan(item.actor.stats.totalBuilds) : chalk.gray('Unknown'),\n\t\t\t\t'Last run duration': ResponsiveTable.isSmallTerminal() ? kSkipColumn : chalk.cyan(lastRunDuration),\n\t\t\t\t'Default build': defaultBuild,\n\t\t\t\t_Small_LastRunText: runStatus,\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: table.render(CompactMode.WebLikeCompact),\n\t\t\tstdout: true,\n\t\t});\n\t}\n\n\tprivate sortByModifiedAt(items: HydratedListData[]) {\n\t\treturn items.sort((a, b) => {\n\t\t\tconst aDate = new Date(a.modifiedAt);\n\t\t\tconst bDate = new Date(b.modifiedAt);\n\n\t\t\treturn bDate.getTime() - aDate.getTime();\n\t\t});\n\t}\n\n\tprivate sortByLastRun(items: HydratedListData[]) {\n\t\treturn items.sort((a, b) => {\n\t\t\tconst aDate = new Date(a.stats?.lastRunStartedAt ?? '1970-01-01T00:00Z');\n\t\t\tconst bDate = new Date(b.stats?.lastRunStartedAt ?? '1970-01-01T00:00Z');\n\n\t\t\treturn bDate.getTime() - aDate.getTime();\n\t\t});\n\t}\n}\n","import chalk from 'chalk';\n\nimport type { ACTOR_JOB_STATUSES, ACTOR_JOB_TERMINAL_STATUSES } from '@apify/consts';\n\n// TIMED-OUT -> Timed Out\n// ABORTED -> Aborted\nexport function prettyPrintStatus(\n\tstatus: (typeof ACTOR_JOB_STATUSES)[keyof typeof ACTOR_JOB_STATUSES] | (typeof ACTOR_JOB_TERMINAL_STATUSES)[number],\n) {\n\tswitch (status) {\n\t\tcase 'READY':\n\t\t\treturn chalk.green('Ready');\n\t\tcase 'RUNNING':\n\t\t\treturn chalk.blue('Running');\n\t\tcase 'SUCCEEDED':\n\t\t\treturn chalk.green('Succeeded');\n\t\tcase 'FAILED':\n\t\t\treturn chalk.red('Failed');\n\t\tcase 'ABORTING':\n\t\t\treturn chalk.yellow('Aborting');\n\t\tcase 'ABORTED':\n\t\t\treturn chalk.red('Aborted');\n\t\tcase 'TIMING-OUT':\n\t\t\treturn chalk.yellow('Timing Out');\n\t\tcase 'TIMED-OUT':\n\t\t\treturn chalk.red('Timed Out');\n\t\tdefault:\n\t\t\treturn chalk.gray(\n\t\t\t\t(status as string)\n\t\t\t\t\t.split('-')\n\t\t\t\t\t.map((part) => part[0].toUpperCase() + part.slice(1).toLowerCase())\n\t\t\t\t\t.join(' '),\n\t\t\t);\n\t}\n}\n","import { mkdirSync, readdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\n\nimport AdmZip from 'adm-zip';\nimport axios from 'axios';\nimport jju from 'jju';\nimport { gt } from 'semver';\nimport tiged from 'tiged';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { CommandExitCodes, LOCAL_CONFIG_PATH } from '../../lib/consts.js';\nimport { useActorConfig } from '../../lib/hooks/useActorConfig.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow } from '../../lib/utils.js';\n\nconst extractGitHubZip = async (url: string, directoryPath: string) => {\n\tconst { data } = await axios.get(url, { responseType: 'arraybuffer' });\n\n\tconst zipFile = new AdmZip(Buffer.from(data, 'binary'));\n\n\tzipFile.extractEntryTo(zipFile.getEntries()[0].entryName, directoryPath, false);\n};\n\nexport class ActorsPullCommand extends ApifyCommand<typeof ActorsPullCommand> {\n\tstatic override name = 'pull' as const;\n\n\tstatic override description =\n\t\t'Download Actor code to current directory. ' +\n\t\t'Clones Git repositories or fetches Actor files based on the source type.';\n\n\tstatic override flags = {\n\t\tversion: Flags.string({\n\t\t\tchar: 'v',\n\t\t\tdescription: 'Actor version number which will be pulled, e.g. 1.2. Default: the highest version',\n\t\t\trequired: false,\n\t\t}),\n\t\tdir: Flags.string({\n\t\t\tdescription: 'Directory where the Actor should be pulled to',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Name or ID of the Actor to run (e.g. \"apify/hello-world\" or \"E2jjCZBezvAZnX8Rb\"). ' +\n\t\t\t\t'If not provided, the command will update the Actor in the current directory based on its name in \".actor/actor.json\" file.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst cwd = process.cwd();\n\n\t\tconst actorConfigResult = await useActorConfig({ cwd });\n\n\t\tif (actorConfigResult.isErr()) {\n\t\t\terror({ message: actorConfigResult.unwrapErr().message });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\treturn;\n\t\t}\n\n\t\tconst { config: actorConfig } = actorConfigResult.unwrap();\n\n\t\tconst userInfo = await getLocalUserInfo();\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst isActorAutomaticallyDetected = !this.args.actorId;\n\t\tconst usernameOrId = userInfo.username || userInfo.id;\n\n\t\tconst actorId =\n\t\t\tthis.args?.actorId ||\n\t\t\t(actorConfig?.id as string | undefined) ||\n\t\t\t(actorConfig?.name ? `${usernameOrId}/${actorConfig.name}` : undefined);\n\n\t\tif (!actorId) throw new Error('Cannot find Actor in this directory.');\n\n\t\tlet actor;\n\t\ttry {\n\t\t\tactor = await apifyClient.actor(actorId).get();\n\t\t} catch {\n\t\t\tthrow new Error(`Cannot find Actor with ID/name '${actorId}' in your account.`);\n\t\t}\n\n\t\tif (!actor) {\n\t\t\tthrow new Error(`Cannot find Actor with ID/name '${actorId}' in your account.`);\n\t\t}\n\n\t\tconst { name, versions } = actor;\n\n\t\tconst throwMissingSourceCodeAccessError = () => {\n\t\t\tthrow new Error(`You cannot pull source code of this Actor because you do not have permission to do so.`);\n\t\t};\n\n\t\tif (!actor.versions.length) {\n\t\t\tthrow new Error(`Actor ${actorId} has no versions.`);\n\t\t}\n\n\t\tlet correctVersion = null;\n\t\tif (this.flags.version) {\n\t\t\tcorrectVersion = versions.find((version) => version.versionNumber === this.flags.version);\n\t\t\tif (!correctVersion) {\n\t\t\t\tthrow new Error(`Cannot find version ${this.flags.version} of Actor ${actorId}.`);\n\t\t\t}\n\t\t}\n\n\t\tif (!correctVersion) {\n\t\t\tcorrectVersion = versions.reduce((match, curr) => {\n\t\t\t\tif (gt(`${curr.versionNumber}.0`, `${match.versionNumber}.0`)) return curr;\n\t\t\t\treturn match;\n\t\t\t});\n\t\t}\n\n\t\tconst dirpath = isActorAutomaticallyDetected ? cwd : join(cwd, this.flags.dir ?? name);\n\t\tmkdirSync(dirpath, { recursive: true });\n\n\t\tif (!isActorAutomaticallyDetected && !(readdirSync(dirpath).length === 0)) {\n\t\t\terror({ message: `Directory ${dirpath} is not empty. Please empty it or choose another directory.` });\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (correctVersion.sourceType) {\n\t\t\tcase 'TARBALL': {\n\t\t\t\tif (!correctVersion.tarballUrl) {\n\t\t\t\t\tthrowMissingSourceCodeAccessError();\n\t\t\t\t}\n\n\t\t\t\tawait extractGitHubZip(correctVersion.tarballUrl, dirpath);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SOURCE_FILES': {\n\t\t\t\tif (!correctVersion.sourceFiles) {\n\t\t\t\t\tthrowMissingSourceCodeAccessError();\n\t\t\t\t}\n\n\t\t\t\tconst { sourceFiles } = correctVersion;\n\t\t\t\tfor (const file of sourceFiles) {\n\t\t\t\t\tconst folderPath = dirname(file.name);\n\t\t\t\t\tmkdirSync(`${dirpath}/${folderPath}`, { recursive: true });\n\n\t\t\t\t\t// @ts-expect-error TODO: is this an actual field?\n\t\t\t\t\tif (!file.folder) {\n\t\t\t\t\t\tconst fileContent =\n\t\t\t\t\t\t\tfile.format === 'BASE64' ? Buffer.from(file.content, 'base64').toString() : file.content;\n\n\t\t\t\t\t\tif (file.name === LOCAL_CONFIG_PATH) {\n\t\t\t\t\t\t\tconst actorJson = jju.parse(fileContent);\n\t\t\t\t\t\t\tactorJson.name = actor.name;\n\t\t\t\t\t\t\twriteFileSync(`${dirpath}/${file.name}`, jju.update(fileContent, actorJson));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twriteFileSync(`${dirpath}/${file.name}`, fileContent);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'GIT_REPO': {\n\t\t\t\t// e.g. https://github.com/jakubbalada/Datasety.git#master:RejstrikPolitickychStran\n\t\t\t\tif (!correctVersion.gitRepoUrl) {\n\t\t\t\t\tthrowMissingSourceCodeAccessError();\n\t\t\t\t}\n\n\t\t\t\tconst { gitRepoUrl } = correctVersion;\n\t\t\t\tconst [repoUrl, branchDirPart] = gitRepoUrl.split('#');\n\n\t\t\t\tlet branch;\n\t\t\t\tlet dir;\n\t\t\t\tif (branchDirPart) [branch, dir] = branchDirPart.split(':');\n\t\t\t\tlet branchDirRepoUrl = repoUrl;\n\t\t\t\tif (dir) branchDirRepoUrl += `/${dir}`;\n\t\t\t\tif (branch) branchDirRepoUrl += `#${branch}`;\n\n\t\t\t\tconst emitter = tiged(branchDirRepoUrl);\n\t\t\t\ttry {\n\t\t\t\t\tawait emitter.clone(dirpath);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow new Error(`Failed to pull Actor from ${gitRepoUrl}. ${(err as Error).message}`);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'GITHUB_GIST': {\n\t\t\t\tif (!correctVersion.gitHubGistUrl) {\n\t\t\t\t\tthrowMissingSourceCodeAccessError();\n\t\t\t\t}\n\n\t\t\t\tawait extractGitHubZip(`${correctVersion.gitHubGistUrl}/archive/master.zip`, dirpath);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown source type: ${correctVersion.sourceType}`);\n\t\t}\n\n\t\tsuccess({\n\t\t\tmessage: isActorAutomaticallyDetected ? `Actor ${name} updated at ${dirpath}/` : `Pulled to ${dirpath}/`,\n\t\t});\n\t}\n}\n","import { readFileSync, statSync, unlinkSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport process from 'node:process';\n\nimport type { Actor, ActorCollectionCreateOptions, ActorDefaultRunOptions } from 'apify-client';\nimport open from 'open';\n\nimport { fetchManifest } from '@apify/actor-templates';\nimport { ACTOR_JOB_STATUSES, ACTOR_SOURCE_TYPES, MAX_MULTIFILE_BYTES } from '@apify/consts';\nimport { createHmacSignature } from '@apify/utilities';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { CommandExitCodes, DEPRECATED_LOCAL_CONFIG_NAME, LOCAL_CONFIG_PATH } from '../../lib/consts.js';\nimport { sumFilesSizeInBytes } from '../../lib/files.js';\nimport { useActorConfig } from '../../lib/hooks/useActorConfig.js';\nimport { error, info, link, run, success, warning } from '../../lib/outputs.js';\nimport { transformEnvToEnvVars } from '../../lib/secrets.js';\nimport {\n\tcreateActZip,\n\tcreateSourceFiles,\n\tgetActorLocalFilePaths,\n\tgetLocalUserInfo,\n\tgetLoggedClientOrThrow,\n\toutputJobLog,\n} from '../../lib/utils.js';\n\nconst TEMP_ZIP_FILE_NAME = 'temp_file.zip';\nconst DEFAULT_RUN_OPTIONS = {\n\tbuild: 'latest',\n\tmemoryMbytes: 4096,\n\ttimeoutSecs: 3600,\n};\nconst DEFAULT_ACTOR_VERSION_NUMBER = '0.0';\n\n// It would be better to use `version-0.0` or similar,\n// or even have no default tag, but the platform complains when\n// Actor does not have a build with a `latest` tag, so until\n// that changes, we have to add it.\nconst DEFAULT_BUILD_TAG = 'latest';\n\nexport class ActorsPushCommand extends ApifyCommand<typeof ActorsPushCommand> {\n\tstatic override name = 'push' as const;\n\n\tstatic override description =\n\t\t`Deploys Actor to Apify platform using settings from '${LOCAL_CONFIG_PATH}'.\\n` +\n\t\t`Files under '${MAX_MULTIFILE_BYTES / 1024 ** 2}' MB upload as \"Multiple source files\"; ` +\n\t\t`larger projects upload as ZIP file.\\n` +\n\t\t`Use --force to override newer remote versions.`;\n\n\tstatic override flags = {\n\t\tversion: Flags.string({\n\t\t\tchar: 'v',\n\t\t\tdescription: `Actor version number to which the files should be pushed. By default, it is taken from the '${LOCAL_CONFIG_PATH}' file.`,\n\t\t\trequired: false,\n\t\t}),\n\t\t'build-tag': Flags.string({\n\t\t\tchar: 'b',\n\t\t\tdescription: `Build tag to be applied to the successful Actor build. By default, it is taken from the '${LOCAL_CONFIG_PATH}' file`,\n\t\t\trequired: false,\n\t\t}),\n\t\t'wait-for-finish': Flags.string({\n\t\t\tchar: 'w',\n\t\t\tdescription: 'Seconds for waiting to build to finish, if no value passed, it waits forever.',\n\t\t\trequired: false,\n\t\t}),\n\t\t'open': Flags.boolean({\n\t\t\tdescription: 'Whether to open the browser automatically to the Actor details page.',\n\t\t\tdefault: false,\n\t\t\trequired: false,\n\t\t}),\n\t\tforce: Flags.boolean({\n\t\t\tchar: 'f',\n\t\t\tdescription: 'Push an Actor even when the local files are older than the Actor on the platform.',\n\t\t\tdefault: false,\n\t\t\trequired: false,\n\t\t}),\n\t\tdir: Flags.string({\n\t\t\tdescription: 'Directory where the Actor is located',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Name or ID of the Actor to push (e.g. \"apify/hello-world\" or \"E2jjCZBezvAZnX8Rb\"). ' +\n\t\t\t\t`If not provided, the command will create or modify the Actor with the name specified in '${LOCAL_CONFIG_PATH}' file.`,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\t// Resolving with `.` will mean stay in the cwd folder, whereas anything else in dir will be resolved. If users pass in a full path (`/home/...`, it will correctly resolve to that)\n\t\tconst cwd = resolve(process.cwd(), this.flags.dir ?? '.');\n\n\t\t// Validate there are files before rest of the logic\n\t\tconst filePathsToPush = await getActorLocalFilePaths(cwd);\n\n\t\tif (!filePathsToPush.length) {\n\t\t\terror({ message: 'You need to call this command from a folder that has an Actor in it!' });\n\t\t\tprocess.exitCode = CommandExitCodes.NoFilesToPush;\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\t// Check that some of these files exist, cuz otherwise we cannot do much\n\t\t\t![\n\t\t\t\t// old apify project\n\t\t\t\tDEPRECATED_LOCAL_CONFIG_NAME,\n\t\t\t\t// new apify project\n\t\t\t\t'actor.json',\n\t\t\t\t'.actor/actor.json',\n\t\t\t\t// The .actor folder existing in general\n\t\t\t\t'.actor',\n\t\t\t].some((filePath) => filePathsToPush.some((fp) => fp === filePath || fp.startsWith(filePath)))\n\t\t) {\n\t\t\terror({\n\t\t\t\tmessage: [\n\t\t\t\t\t'A valid Actor could not be found in the current directory. Please make sure you are in the correct directory.',\n\t\t\t\t\t'You can also turn this directory into an Actor by running `apify init`.',\n\t\t\t\t].join('\\n'),\n\t\t\t});\n\n\t\t\tprocess.exitCode = CommandExitCodes.NoFilesToPush;\n\t\t\treturn;\n\t\t}\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst actorConfigResult = await useActorConfig({ cwd });\n\n\t\tif (actorConfigResult.isErr()) {\n\t\t\terror({ message: actorConfigResult.unwrapErr().message });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\treturn;\n\t\t}\n\n\t\tconst { config: actorConfig } = actorConfigResult.unwrap();\n\n\t\tconst userInfo = await getLocalUserInfo();\n\t\tconst isOrganizationLoggedIn = !!userInfo.organizationOwnerUserId;\n\t\tconst redirectUrlPart = isOrganizationLoggedIn ? `/organization/${userInfo.id}` : '';\n\n\t\tlet actorId: string;\n\t\tlet actor: Actor;\n\t\tlet isActorCreatedNow = false;\n\n\t\t// User can override Actor version and build tag, attributes in localConfig will remain same.\n\t\tconst version =\n\t\t\tthis.flags.version || (actorConfig?.version as string | undefined) || DEFAULT_ACTOR_VERSION_NUMBER;\n\n\t\tlet buildTag = this.flags.buildTag || (actorConfig?.buildTag as string | undefined);\n\n\t\t// We can't add the default build tag to everything. If a user creates a new\n\t\t// version, e.g. for testing, but forgets to add a tag, it would use the default\n\t\t// tag and their production runs might be affected ❌\n\t\t// TODO: revisit this when we have better build tagging system on platform.\n\t\tif (!buildTag && version === DEFAULT_ACTOR_VERSION_NUMBER) {\n\t\t\tbuildTag = DEFAULT_BUILD_TAG;\n\t\t}\n\n\t\tconst waitForFinishMillis = Number.isNaN(this.flags.waitForFinish)\n\t\t\t? undefined\n\t\t\t: Number.parseInt(this.flags.waitForFinish!, 10) * 1000;\n\n\t\t// User can override actorId of pushing Actor.\n\t\t// It causes that we push Actor to this id but attributes in localConfig will remain same.\n\t\tconst forceActorId = this.args.actorId;\n\n\t\tif (forceActorId) {\n\t\t\tactor = (await apifyClient.actor(forceActorId).get())!;\n\t\t\tif (!actor) throw new Error(`Cannot find Actor with ID '${forceActorId}' in your account.`);\n\t\t\tactorId = actor.id;\n\t\t} else {\n\t\t\tconst usernameOrId = userInfo.username || userInfo.id;\n\t\t\tactor = (await apifyClient.actor(`${usernameOrId}/${actorConfig!.name}`).get())!;\n\t\t\tif (actor) {\n\t\t\t\tactorId = actor.id;\n\t\t\t} else {\n\t\t\t\tconst { templates } = await fetchManifest();\n\t\t\t\tconst actorTemplate = templates.find((t) => t.name === actorConfig!.template);\n\t\t\t\tconst defaultRunOptions = (actorTemplate?.defaultRunOptions ||\n\t\t\t\t\tDEFAULT_RUN_OPTIONS) as ActorDefaultRunOptions;\n\t\t\t\tconst newActor: ActorCollectionCreateOptions = {\n\t\t\t\t\tname: actorConfig!.name as string,\n\t\t\t\t\ttitle: actorConfig!.title as string | undefined,\n\t\t\t\t\tdescription: actorConfig!.description as string | undefined,\n\t\t\t\t\tdefaultRunOptions,\n\t\t\t\t\tversions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tversionNumber: version,\n\t\t\t\t\t\t\tbuildTag,\n\t\t\t\t\t\t\t// TODO: export enum from apify-client\n\t\t\t\t\t\t\tsourceType: ACTOR_SOURCE_TYPES.SOURCE_FILES as never,\n\t\t\t\t\t\t\tsourceFiles: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t\tactor = await apifyClient.actors().create(newActor);\n\t\t\t\tactorId = actor.id;\n\t\t\t\tisActorCreatedNow = true;\n\t\t\t\tinfo({ message: `Created Actor with name ${actorConfig!.name} on Apify.` });\n\t\t\t}\n\t\t}\n\n\t\tconst actorClient = apifyClient.actor(actorId);\n\n\t\tinfo({ message: `Deploying Actor '${actorConfig!.name}' to Apify.` });\n\n\t\tconst filesSize = await sumFilesSizeInBytes(filePathsToPush, cwd);\n\n\t\tlet sourceType;\n\t\tlet sourceFiles;\n\t\tlet tarballUrl;\n\t\tif (filesSize < MAX_MULTIFILE_BYTES) {\n\t\t\tconst client = await actorClient.get();\n\n\t\t\tif (!isActorCreatedNow) {\n\t\t\t\t// Check when was files modified last\n\t\t\t\tconst mostRecentModifiedFileMs = filePathsToPush.reduce((modifiedMs, filePath) => {\n\t\t\t\t\tconst { mtimeMs, ctimeMs } = statSync(join(cwd, filePath));\n\n\t\t\t\t\t// Sometimes it's possible mtimeMs is some messed up value (like 2000/01/01 midnight), then we want to check created if it's newer\n\t\t\t\t\tconst fileModifiedMs = mtimeMs > ctimeMs ? mtimeMs : ctimeMs;\n\n\t\t\t\t\treturn modifiedMs > fileModifiedMs ? modifiedMs : fileModifiedMs;\n\t\t\t\t}, 0);\n\t\t\t\tconst actorModifiedMs = client?.modifiedAt.valueOf();\n\n\t\t\t\tif (\n\t\t\t\t\t!this.flags.force &&\n\t\t\t\t\tactorModifiedMs &&\n\t\t\t\t\tmostRecentModifiedFileMs < actorModifiedMs &&\n\t\t\t\t\t(actorConfig?.name || forceActorId)\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Actor with identifier \"${actorConfig?.name || forceActorId}\" is already on the platform and was modified there since modified locally.\nSkipping push. Use --force to override.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsourceFiles = await createSourceFiles(filePathsToPush, cwd);\n\t\t\tsourceType = ACTOR_SOURCE_TYPES.SOURCE_FILES;\n\t\t} else {\n\t\t\t// Create zip\n\t\t\trun({ message: 'Zipping Actor files' });\n\t\t\tawait createActZip(TEMP_ZIP_FILE_NAME, filePathsToPush, cwd);\n\n\t\t\t// Upload it to Apify.keyValueStores\n\t\t\tconst store = await apifyClient.keyValueStores().getOrCreate(`actor-${actorId}-source`);\n\t\t\tconst key = `version-${version}.zip`;\n\t\t\tconst buffer = readFileSync(TEMP_ZIP_FILE_NAME);\n\t\t\tawait apifyClient.keyValueStore(store.id).setRecord({\n\t\t\t\tkey,\n\t\t\t\t// TODO: fix this type too\n\t\t\t\tvalue: buffer as never,\n\t\t\t\tcontentType: 'application/zip',\n\t\t\t});\n\t\t\tunlinkSync(TEMP_ZIP_FILE_NAME);\n\t\t\tconst tempTarballUrl = new URL(\n\t\t\t\t`${apifyClient.baseUrl}/key-value-stores/${store.id}/records/${key}?disableRedirect=true`,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Signs the tarball URL to grant temporary access for restricted resources.\n\t\t\t * When a store is set to 'RESTRICTED', direct URLs are disabled. Instead of\n\t\t\t * appending a security token, we add a signature to the URL parameters.\n\t\t\t * https://github.com/apify/apify-core/issues/22197\n\t\t\t *\n\t\t\t * TODO: Use keyValueStore(:storeId).getRecordPublicUrl from apify-client instead once it is released.\n\t\t\t */\n\t\t\tif (store?.urlSigningSecretKey) {\n\t\t\t\tconst signature = createHmacSignature(store.urlSigningSecretKey, key);\n\t\t\t\ttempTarballUrl.searchParams.set('signature', signature);\n\t\t\t}\n\n\t\t\ttarballUrl = tempTarballUrl.toString();\n\t\t\tsourceType = ACTOR_SOURCE_TYPES.TARBALL;\n\t\t}\n\n\t\t// Update Actor version\n\t\tconst actorCurrentVersion = await actorClient.version(version).get();\n\t\tconst envVars = actorConfig!.environmentVariables\n\t\t\t? transformEnvToEnvVars(actorConfig!.environmentVariables as Record<string, string>)\n\t\t\t: undefined;\n\n\t\tif (actorCurrentVersion) {\n\t\t\tconst actorVersionModifier = { tarballUrl, sourceFiles, buildTag, sourceType, envVars };\n\t\t\t// TODO: fix this type too -.-\n\t\t\tawait actorClient.version(version).update(actorVersionModifier as never);\n\t\t\trun({ message: `Updated version ${version} for Actor ${actor.name}.` });\n\t\t} else {\n\t\t\tconst actorNewVersion = {\n\t\t\t\tversionNumber: version,\n\t\t\t\ttarballUrl,\n\t\t\t\tsourceFiles,\n\t\t\t\tbuildTag,\n\t\t\t\tsourceType,\n\t\t\t\tenvVars,\n\t\t\t};\n\n\t\t\tawait actorClient.versions().create({\n\t\t\t\t...actorNewVersion,\n\t\t\t} as never);\n\n\t\t\trun({ message: `Created version ${version} for Actor ${actor.name}.` });\n\t\t}\n\n\t\t// Build Actor on Apify and wait for build to finish\n\t\trun({ message: `Building Actor ${actor.name}` });\n\t\tlet build = await actorClient.build(version, {\n\t\t\tuseCache: true,\n\t\t\twaitForFinish: 2, // NOTE: We need to wait some time to Apify open stream and we can create connection\n\t\t});\n\n\t\ttry {\n\t\t\tawait outputJobLog({ job: build, timeoutMillis: waitForFinishMillis, apifyClient });\n\t\t} catch (err) {\n\t\t\twarning({ message: 'Can not get log:' });\n\t\t\tconsole.error(err);\n\t\t}\n\n\t\tbuild = (await apifyClient.build(build.id).get())!;\n\n\t\tlink({\n\t\t\tmessage: 'Actor build detail',\n\t\t\turl: `https://console.apify.com${redirectUrlPart}/actors/${build.actId}#/builds/${build.buildNumber}`,\n\t\t});\n\n\t\tlink({\n\t\t\tmessage: 'Actor detail',\n\t\t\turl: `https://console.apify.com${redirectUrlPart}/actors/${build.actId}`,\n\t\t});\n\n\t\tif (this.flags.open) {\n\t\t\tawait open(`https://console.apify.com${redirectUrlPart}/actors/${build.actId}`);\n\t\t}\n\n\t\tif (build.status === ACTOR_JOB_STATUSES.SUCCEEDED) {\n\t\t\tsuccess({ message: 'Actor was deployed to Apify cloud and built there.' });\n\t\t\t// @ts-expect-error FIX THESE TYPES 😢\n\t\t} else if (build.status === ACTOR_JOB_STATUSES.READY) {\n\t\t\twarning({ message: 'Build is waiting for allocation.' });\n\t\t\t// @ts-expect-error FIX THESE TYPES 😢\n\t\t} else if (build.status === ACTOR_JOB_STATUSES.RUNNING) {\n\t\t\twarning({ message: 'Build is still running.' });\n\t\t\t// @ts-expect-error FIX THESE TYPES 😢\n\t\t} else if (build.status === ACTOR_JOB_STATUSES.ABORTED || build.status === ACTOR_JOB_STATUSES.ABORTING) {\n\t\t\twarning({ message: 'Build was aborted!' });\n\t\t\tprocess.exitCode = CommandExitCodes.BuildAborted;\n\t\t\t// @ts-expect-error FIX THESE TYPES 😢\n\t\t} else if (build.status === ACTOR_JOB_STATUSES.TIMED_OUT || build.status === ACTOR_JOB_STATUSES.TIMING_OUT) {\n\t\t\twarning({ message: 'Build timed out!' });\n\t\t\tprocess.exitCode = CommandExitCodes.BuildTimedOut;\n\t\t} else {\n\t\t\terror({ message: 'Build failed!' });\n\t\t\tprocess.exitCode = CommandExitCodes.BuildFailed;\n\t\t}\n\t}\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\n\nimport { SECRETS_FILE_PATH } from './consts.js';\nimport { warning } from './outputs.js';\nimport { ensureApifyDirectory } from './utils.js';\n\nconst SECRET_KEY_PREFIX = '@';\n// TODO: Moved to shared\nconst MAX_ENV_VAR_NAME_LENGTH = 100;\nconst MAX_ENV_VAR_VALUE_LENGTH = 50000;\n\nexport const getSecretsFile = () => {\n\ttry {\n\t\treturn JSON.parse(readFileSync(SECRETS_FILE_PATH(), 'utf-8')) || {};\n\t} catch {\n\t\treturn {};\n\t}\n};\n\nconst writeSecretsFile = (secrets: Record<string, string>) => {\n\tensureApifyDirectory(SECRETS_FILE_PATH());\n\twriteFileSync(SECRETS_FILE_PATH(), JSON.stringify(secrets, null, '\\t'));\n\treturn secrets;\n};\n\nexport const addSecret = (name: string, value: string) => {\n\tconst secrets = getSecretsFile();\n\n\tif (secrets[name])\n\t\tthrow new Error(`Secret with name ${name} already exists. Call \"apify secrets rm ${name}\" to remove it.`);\n\tif (typeof name !== 'string' || name.length > MAX_ENV_VAR_NAME_LENGTH) {\n\t\tthrow new Error(`Secret name has to be string with maximum length ${MAX_ENV_VAR_NAME_LENGTH}.`);\n\t}\n\tif (typeof value !== 'string' || value.length > MAX_ENV_VAR_VALUE_LENGTH) {\n\t\tthrow new Error(`Secret value has to be string with maximum length ${MAX_ENV_VAR_VALUE_LENGTH}.`);\n\t}\n\n\tsecrets[name] = value;\n\treturn writeSecretsFile(secrets);\n};\n\nexport const removeSecret = (name: string) => {\n\tconst secrets = getSecretsFile();\n\tif (!secrets[name]) throw new Error(`Secret with name ${name} doesn't exist.`);\n\tdelete secrets[name];\n\twriteSecretsFile(secrets);\n};\n\nconst isSecretKey = (envValue: string) => {\n\treturn new RegExp(`^${SECRET_KEY_PREFIX}.{1}`).test(envValue);\n};\n\n/**\n * Replaces secure values in env with proper values from local secrets file.\n * @param env\n * @param secrets - Object with secrets, if not set, will be load from secrets file.\n */\nexport const replaceSecretsValue = (env: Record<string, string>, secrets?: Record<string, string>) => {\n\tsecrets = secrets || getSecretsFile();\n\tconst updatedEnv = {};\n\tObject.keys(env).forEach((key) => {\n\t\tif (isSecretKey(env[key])) {\n\t\t\tconst secretKey = env[key].replace(new RegExp(`^${SECRET_KEY_PREFIX}`), '');\n\t\t\tif (secrets![secretKey]) {\n\t\t\t\t// @ts-expect-error - we are replacing the value\n\t\t\t\tupdatedEnv[key] = secrets[secretKey];\n\t\t\t} else {\n\t\t\t\twarning({\n\t\t\t\t\tmessage: `Value for ${secretKey} not found in local secrets. Set it by calling \"apify secrets add ${secretKey} [SECRET_VALUE]\"`,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// @ts-expect-error - we are replacing the value\n\t\t\tupdatedEnv[key] = env[key];\n\t\t}\n\t});\n\treturn updatedEnv;\n};\n\ninterface EnvVar {\n\tname: string;\n\tvalue: string;\n\tisSecret?: boolean;\n}\n\n/**\n * Transform env to envVars format attribute, which uses Apify API\n * It replaces secrets to values from secrets file.\n * @param secrets - Object with secrets, if not set, will be load from secrets file.\n */\nexport const transformEnvToEnvVars = (env: Record<string, string>, secrets?: Record<string, string>) => {\n\tsecrets = secrets || getSecretsFile();\n\tconst envVars: EnvVar[] = [];\n\tObject.keys(env).forEach((key) => {\n\t\tif (isSecretKey(env[key])) {\n\t\t\tconst secretKey = env[key].replace(new RegExp(`^${SECRET_KEY_PREFIX}`), '');\n\t\t\tif (secrets![secretKey]) {\n\t\t\t\tenvVars.push({\n\t\t\t\t\tname: key,\n\t\t\t\t\tvalue: secrets![secretKey],\n\t\t\t\t\tisSecret: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\twarning({\n\t\t\t\t\tmessage: `Value for ${secretKey} not found in local secrets. Set it by calling \"apify secrets add ${secretKey} [SECRET_VALUE]\"`,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tenvVars.push({\n\t\t\t\tname: key,\n\t\t\t\tvalue: env[key],\n\t\t\t});\n\t\t}\n\t});\n\treturn envVars;\n};\n","import type { ApifyApiError } from 'apify-client';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class ActorsRmCommand extends ApifyCommand<typeof ActorsRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Permanently removes an Actor from your account.';\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\tdescription: 'The Actor ID to delete.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { actorId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst actor = await apifyClient.actor(actorId).get();\n\n\t\tif (!actor) {\n\t\t\terror({ message: `Actor with ID \"${actorId}\" was not found on your account.` });\n\t\t\treturn;\n\t\t}\n\n\t\tconst confirmedDelete = await useYesNoConfirm({\n\t\t\tmessage: `Are you sure you want to delete this Actor?`,\n\t\t});\n\n\t\tif (!confirmedDelete) {\n\t\t\tinfo({\n\t\t\t\tmessage: `Deletion of Actor \"${actorId}\" was canceled.`,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait apifyClient.actor(actorId).delete();\n\n\t\t\tsuccess({ message: `Actor with ID \"${actorId}\" was deleted.` });\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\t\t\terror({ message: `Failed to delete Actor \"${actorId}\".\\n ${casted.message || casted}` });\n\t\t}\n\t}\n}\n","import type { ActorRun, ActorStartOptions, ActorTaggedBuild } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand, StdinMode } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { getInputOverride } from '../../lib/commands/resolve-input.js';\nimport { runActorOrTaskOnCloud, SharedRunOnCloudFlags } from '../../lib/commands/run-on-cloud.js';\nimport { LOCAL_CONFIG_PATH } from '../../lib/consts.js';\nimport { simpleLog } from '../../lib/outputs.js';\nimport {\n\tgetLocalConfig,\n\tgetLocalUserInfo,\n\tgetLoggedClientOrThrow,\n\tprintJsonToStdout,\n\tTimestampFormatter,\n} from '../../lib/utils.js';\nimport { ActorsCallCommand } from './call.js';\n\nexport class ActorsStartCommand extends ApifyCommand<typeof ActorsStartCommand> {\n\tstatic override name = 'start' as const;\n\n\tstatic override description =\n\t\t'Starts Actor remotely and returns run details immediately.\\n' +\n\t\t'Uses authenticated account and local key-value store for input.';\n\n\tstatic override flags = {\n\t\t...SharedRunOnCloudFlags('Actor'),\n\t\tinput: Flags.string({\n\t\t\tchar: 'i',\n\t\t\tdescription: 'Optional JSON input to be given to the Actor.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input-file'],\n\t\t}),\n\t\t'input-file': Flags.string({\n\t\t\taliases: ['if'],\n\t\t\tdescription:\n\t\t\t\t'Optional path to a file with JSON input to be given to the Actor. The file must be a valid JSON file. You can also specify `-` to read from standard input.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input'],\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Name or ID of the Actor to run (e.g. \"my-actor\", \"apify/hello-world\" or \"E2jjCZBezvAZnX8Rb\"). ' +\n\t\t\t\t`If not provided, the command runs the remote Actor specified in the '${LOCAL_CONFIG_PATH}' file.`,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst cwd = process.cwd();\n\t\tconst localConfig = getLocalConfig(cwd) || {};\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst userInfo = await getLocalUserInfo();\n\t\tconst usernameOrId = userInfo.username || (userInfo.id as string);\n\n\t\tconst {\n\t\t\tid: actorId,\n\t\t\tuserFriendlyId,\n\t\t\tactorData,\n\t\t} = await ActorsCallCommand.resolveActorId({\n\t\t\tclient: apifyClient,\n\t\t\tlocalActorName: localConfig.name as string | undefined,\n\t\t\tusernameOrId,\n\t\t\tprovidedActorNameOrId: this.args.actorId,\n\t\t});\n\n\t\tconst runOpts: ActorStartOptions = {};\n\n\t\tif (this.flags.build) {\n\t\t\trunOpts.build = this.flags.build;\n\t\t}\n\n\t\tif (this.flags.timeout) {\n\t\t\trunOpts.timeout = this.flags.timeout;\n\t\t}\n\n\t\tif (this.flags.memory) {\n\t\t\trunOpts.memory = this.flags.memory;\n\t\t}\n\n\t\tconst inputOverride = await getInputOverride(cwd, this.flags.input, this.flags.inputFile);\n\n\t\tif (inputOverride === false) {\n\t\t\t// Means we couldn't resolve input, so we should exit\n\t\t\treturn;\n\t\t}\n\n\t\tconst iterator = runActorOrTaskOnCloud(apifyClient, {\n\t\t\tactorOrTaskData: {\n\t\t\t\tid: actorId,\n\t\t\t\tuserFriendlyId,\n\t\t\t},\n\t\t\trunOptions: runOpts,\n\t\t\ttype: 'Actor',\n\t\t\tinputOverride: inputOverride?.input,\n\t\t\tsilent: true,\n\t\t\twaitForRunToFinish: false,\n\t\t\tprintRunLogs: false,\n\t\t});\n\n\t\tlet run!: ActorRun;\n\n\t\tfor await (const yieldedRun of iterator) {\n\t\t\trun = yieldedRun;\n\t\t}\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(run);\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `https://console.apify.com/actors/${actorId}/runs/${run.id}`;\n\t\tconst datasetUrl = `https://console.apify.com/storage/datasets/${run.defaultDatasetId}`;\n\n\t\tconst message: string[] = [\n\t\t\t`${chalk.gray('Run:')} Calling Actor ${userFriendlyId} (${chalk.gray(actorId)})`,\n\t\t\t'',\n\t\t\t`${chalk.yellow('Started')}: ${TimestampFormatter.display(run.startedAt)}`,\n\t\t];\n\n\t\tif (run.containerUrl) {\n\t\t\t// container url\n\t\t\tmessage.push(`${chalk.yellow('Container URL')}: ${chalk.blue(run.containerUrl)}`);\n\t\t}\n\n\t\t// basic version info\n\n\t\tconst expectedActorVersion = run.buildNumber.split('.').slice(0, 2).join('.');\n\n\t\tconst actorVersion = actorData.versions.find((item) => item.versionNumber === expectedActorVersion);\n\n\t\tconst runVersionTaggedAs = Object.entries(\n\t\t\t(actorData.taggedBuilds ?? {}) as Record<string, ActorTaggedBuild>,\n\t\t).find(([, data]) => data.buildNumber === run.buildNumber)?.[0];\n\n\t\tconst messageParts = [`${chalk.yellow('Build')}:`, chalk.cyan(run.buildNumber)];\n\n\t\tif (runVersionTaggedAs) {\n\t\t\tmessageParts.push(`(${chalk.yellow(runVersionTaggedAs)})`);\n\t\t} else {\n\t\t\tmessageParts.push(`(${chalk.gray('N/A')})`);\n\t\t}\n\n\t\tif (actorVersion) {\n\t\t\tmessageParts.push(\n\t\t\t\t`| ${chalk.gray('Actor version:')} ${chalk.cyan(actorVersion.versionNumber)} (${chalk.yellow(actorVersion.buildTag)})`,\n\t\t\t);\n\t\t}\n\n\t\tmessage.push(messageParts.join(' '));\n\n\t\t// timeout\n\t\tmessage.push(`${chalk.yellow('Timeout')}: ${run.options.timeoutSecs.toLocaleString('en-US')} seconds`);\n\n\t\t// memory limit\n\t\tmessage.push(`${chalk.yellow('Memory')}: ${run.options.memoryMbytes} MB`);\n\n\t\t// url\n\t\tmessage.push(\n\t\t\t'',\n\t\t\t`${chalk.blue('Export results')}: ${datasetUrl!}`,\n\t\t\t`${chalk.blue('View on Apify Console')}: ${url}`,\n\t\t);\n\n\t\tsimpleLog({\n\t\t\tmessage: message.join('\\n'),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { ActorsBuildCommand } from './build.js';\nimport { ActorsCallCommand } from './call.js';\nimport { ActorsInfoCommand } from './info.js';\nimport { ActorsLsCommand } from './ls.js';\nimport { ActorsPullCommand } from './pull.js';\nimport { ActorsPushCommand } from './push.js';\nimport { ActorsRmCommand } from './rm.js';\nimport { ActorsStartCommand } from './start.js';\n\nexport class ActorsIndexCommand extends ApifyCommand<typeof ActorsIndexCommand> {\n\tstatic override name = 'actors' as const;\n\n\tstatic override description = 'Manages Actor creation, deployment, and execution on the Apify platform.';\n\n\tstatic override subcommands = [\n\t\t//\n\t\tActorsStartCommand,\n\t\tActorsRmCommand,\n\t\tActorsPushCommand,\n\t\tActorsPullCommand,\n\t\tActorsLsCommand,\n\t\tActorsInfoCommand,\n\t\tActorsCallCommand,\n\t\tActorsBuildCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { prettyPrintStatus } from '../../lib/commands/pretty-print-status.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { DurationFormatter, getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\nexport class BuildsInfoCommand extends ApifyCommand<typeof BuildsInfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Prints information about a specific build.';\n\n\tstatic override args = {\n\t\tbuildId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The build ID to get information about.',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { buildId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst build = await apifyClient.build(buildId).get();\n\n\t\tif (!build) {\n\t\t\terror({ message: `Build with ID \"${buildId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\t// JSON output -> return the object (which is handled by oclif)\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(build);\n\t\t\treturn;\n\t\t}\n\n\t\tconst actor = await apifyClient.actor(build.actId).get();\n\n\t\tlet buildTag: string | undefined;\n\n\t\tif (actor?.taggedBuilds) {\n\t\t\tfor (const [tag, buildData] of Object.entries(actor.taggedBuilds)) {\n\t\t\t\tif (buildData.buildId === build.id) {\n\t\t\t\t\tbuildTag = tag;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// TODO: untyped field, https://github.com/apify/apify-client-js/issues/526\n\t\tconst exitCode = Reflect.get(build, 'exitCode') as number | undefined;\n\n\t\tconst fullActorName = actor?.username ? `${actor.username}/${actor.name}` : (actor?.name ?? 'unknown-actor');\n\t\tconst versionTaggedAs = buildTag ? ` (tagged as ${chalk.yellow(buildTag)})` : '';\n\t\tconst exitCodeStatus = typeof exitCode !== 'undefined' ? ` (exit code: ${chalk.gray(exitCode)})` : '';\n\n\t\tconst message: string[] = [\n\t\t\t//\n\t\t\t`${chalk.yellow('Actor')}: ${fullActorName} (${chalk.gray(build.actId)})`,\n\t\t\t'',\n\t\t\t`${chalk.yellow('Build Information')} (ID: ${chalk.gray(build.id)})`,\n\t\t\t` ${chalk.yellow('Build Number')}: ${build.buildNumber}${versionTaggedAs}`,\n\t\t\t` ${chalk.yellow('Status')}: ${prettyPrintStatus(build.status)}${exitCodeStatus}`,\n\t\t\t` ${chalk.yellow('Started')}: ${TimestampFormatter.display(build.startedAt)}`,\n\t\t];\n\n\t\tif (build.finishedAt) {\n\t\t\tmessage.push(\n\t\t\t\t` ${chalk.yellow('Finished')}: ${TimestampFormatter.display(build.finishedAt)} (took ${chalk.gray(DurationFormatter.format(build.stats?.durationMillis ?? 0))})`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst diff = Date.now() - build.startedAt.getTime();\n\t\t\tmessage.push(\n\t\t\t\t` ${chalk.yellow('Finished')}: ${chalk.gray(`Running for ${DurationFormatter.format(diff)}`)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (build.stats?.computeUnits) {\n\t\t\t// Platform shows 3 decimal places, so shall we\n\t\t\tmessage.push(` ${chalk.yellow('Compute Units')}: ${build.stats.computeUnits.toFixed(3)}`);\n\t\t}\n\n\t\t// TODO: untyped field, https://github.com/apify/apify-client-js/issues/526\n\t\tconst dockerImageSize = Reflect.get(build.stats ?? {}, 'imageSizeBytes') as number | undefined;\n\n\t\tif (dockerImageSize) {\n\t\t\tmessage.push(` ${chalk.yellow('Docker Image Size')}: ${prettyPrintBytes({ bytes: dockerImageSize })}`);\n\t\t}\n\n\t\tmessage.push(` ${chalk.yellow('Origin')}: ${build.meta.origin ?? 'UNKNOWN'}`);\n\n\t\tmessage.push('');\n\n\t\tconst url = `https://console.apify.com/actors/${build.actId}/builds/${build.buildNumber}`;\n\n\t\tmessage.push(`${chalk.blue('View in Apify Console')}: ${url}`);\n\n\t\tsimpleLog({ message: message.join('\\n'), stdout: true });\n\t}\n}\n","const noColor = (val: string) => val;\n\nexport function prettyPrintBytes({\n\tbytes,\n\tshortBytes = false,\n\tcolorFunc = noColor,\n\tprecision = 2,\n}: {\n\tbytes: number;\n\tshortBytes?: boolean;\n\tcolorFunc?: (val: string) => string;\n\tprecision?: number;\n}): string {\n\tconst sizes = [shortBytes ? 'B' : 'Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n\tif (bytes === 0) {\n\t\tif (shortBytes) {\n\t\t\treturn `${(0).toPrecision(precision)} B`;\n\t\t}\n\n\t\treturn `${(0).toPrecision(precision)} Byte`;\n\t}\n\n\tconst i = Math.floor(Math.log(bytes) / Math.log(1000));\n\n\treturn `${(bytes / 1000 ** i).toFixed(precision)} ${colorFunc(sizes[i])}`;\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { error, info } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, outputJobLog } from '../../lib/utils.js';\n\nexport class BuildsLogCommand extends ApifyCommand<typeof BuildsLogCommand> {\n\tstatic override name = 'log' as const;\n\n\tstatic override description = 'Prints the log of a specific build.';\n\n\tstatic override args = {\n\t\tbuildId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The build ID to get the log from.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { buildId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst build = await apifyClient.build(buildId).get();\n\n\t\tif (!build) {\n\t\t\terror({ message: `Build with ID \"${buildId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\tinfo({ message: `Log for build with ID \"${buildId}\":\\n` });\n\n\t\ttry {\n\t\t\tawait outputJobLog({ job: build, apifyClient });\n\t\t} catch (err) {\n\t\t\t// This should never happen...\n\t\t\terror({\n\t\t\t\tmessage: `Failed to get log for build with ID \"${buildId}\": ${(err as Error).message}`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { BuildCollectionClientListItem } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintStatus } from '../../lib/commands/pretty-print-status.js';\nimport { resolveActorContext } from '../../lib/commands/resolve-actor-context.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, objectGroupBy, printJsonToStdout, ShortDurationFormatter } from '../../lib/utils.js';\n\nconst tableFactory = () =>\n\tnew ResponsiveTable({\n\t\tallColumns: ['Number', 'ID', 'Status', 'Took'],\n\t\tmandatoryColumns: ['Number', 'ID', 'Status', 'Took'],\n\t\tcolumnAlignments: {\n\t\t\t'Took': 'right',\n\t\t},\n\t});\n\nexport class BuildsLsCommand extends ApifyCommand<typeof BuildsLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Lists all builds of the Actor.';\n\n\tstatic override flags = {\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'Number of builds that will be skipped.',\n\t\t\tdefault: 0,\n\t\t}),\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'Number of builds that will be listed.',\n\t\t\tdefault: 10,\n\t\t}),\n\t\tdesc: Flags.boolean({\n\t\t\tdescription: 'Sort builds in descending order.',\n\t\t\tdefault: false,\n\t\t}),\n\t\tcompact: Flags.boolean({\n\t\t\tdescription: 'Display a compact table.',\n\t\t\tdefault: false,\n\t\t\tchar: 'c',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\tdescription:\n\t\t\t\t'Optional Actor ID or Name to list runs for. By default, it will use the Actor from the current directory.',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { desc, limit, offset, compact, json } = this.flags;\n\t\tconst { actorId } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\t// TODO: technically speaking, we don't *need* an actor id to list builds. But it makes more sense to have a table of builds for a specific actor.\n\t\tconst ctx = await resolveActorContext({ providedActorNameOrId: actorId, client });\n\n\t\tif (!ctx.valid) {\n\t\t\terror({\n\t\t\t\tmessage: `${ctx.reason}. Please run this command in an Actor directory, or specify the Actor ID.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst allBuilds = await client.actor(ctx.id).builds().list({ desc, limit, offset });\n\t\tconst actorInfo = (await client.actor(ctx.id).get())!;\n\n\t\tconst buildsByActorVersion = objectGroupBy(allBuilds.items, (item) => {\n\t\t\tconst versionNumber = Reflect.get(item, 'buildNumber') as string;\n\n\t\t\tconst [major, minor] = versionNumber.split('.');\n\n\t\t\treturn `${major}.${minor}`;\n\t\t});\n\n\t\tconst buildTagToActorVersion = Object.entries(actorInfo.taggedBuilds ?? {}).reduce(\n\t\t\t(acc, [tag, data]) => {\n\t\t\t\tacc[data.buildNumber!] = tag;\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, string>,\n\t\t);\n\n\t\tif (json) {\n\t\t\t// Hydrate the builds with their tags\n\t\t\tfor (const build of allBuilds.items) {\n\t\t\t\t// TODO: untyped field, https://github.com/apify/apify-client-js/issues/526\n\t\t\t\tconst buildNumber = Reflect.get(build, 'buildNumber') as string;\n\n\t\t\t\tconst hasTag = buildTagToActorVersion[buildNumber];\n\n\t\t\t\tif (hasTag) {\n\t\t\t\t\tReflect.set(build, 'buildTag', hasTag);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprintJsonToStdout(allBuilds);\n\t\t\treturn;\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: `${chalk.reset('Showing')} ${chalk.yellow(allBuilds.items.length)} out of ${chalk.yellow(allBuilds.total)} builds for Actor ${chalk.yellow(ctx.userFriendlyId)} (${chalk.gray(ctx.id)})\\n`,\n\t\t\tstdout: true,\n\t\t});\n\n\t\tconst sortedActorVersions = Object.entries(buildsByActorVersion).sort((a, b) => a[0].localeCompare(b[0]));\n\n\t\tfor (const [actorVersion, buildsForVersion] of sortedActorVersions) {\n\t\t\tif (!buildsForVersion?.length) {\n\t\t\t\tsimpleLog({\n\t\t\t\t\tmessage: `No builds for version ${actorVersion}`,\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst latestBuildTag = actorInfo.versions.find((v) => v.versionNumber === actorVersion)?.buildTag;\n\t\t\tconst table = this.generateTableForActorVersion({\n\t\t\t\tbuildsForVersion,\n\t\t\t\tbuildTagToActorVersion,\n\t\t\t});\n\n\t\t\tconst latestBuildTagMessage = latestBuildTag\n\t\t\t\t? ` (latest build gets tagged with ${chalk.yellow(latestBuildTag)})`\n\t\t\t\t: '';\n\n\t\t\tconst message = [\n\t\t\t\tchalk.reset(`Builds for Actor Version ${chalk.yellow(actorVersion)}${latestBuildTagMessage}`),\n\t\t\t\ttable.render(compact ? CompactMode.VeryCompact : CompactMode.None),\n\t\t\t\t'',\n\t\t\t];\n\n\t\t\tsimpleLog({\n\t\t\t\tmessage: message.join('\\n'),\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate generateTableForActorVersion({\n\t\tbuildsForVersion,\n\t\tbuildTagToActorVersion,\n\t}: {\n\t\tbuildsForVersion: BuildCollectionClientListItem[];\n\t\tbuildTagToActorVersion: Record<string, string>;\n\t}) {\n\t\tconst table = tableFactory();\n\n\t\tfor (const build of buildsForVersion) {\n\t\t\t// TODO: untyped field, https://github.com/apify/apify-client-js/issues/526\n\t\t\tconst buildNumber = Reflect.get(build, 'buildNumber') as string;\n\n\t\t\tconst hasTag = buildTagToActorVersion[buildNumber]\n\t\t\t\t? ` (${chalk.yellow(buildTagToActorVersion[buildNumber])})`\n\t\t\t\t: '';\n\n\t\t\tlet finishedAt: string;\n\n\t\t\tif (build.finishedAt) {\n\t\t\t\tconst diff = build.finishedAt.getTime() - build.startedAt.getTime();\n\n\t\t\t\tfinishedAt = chalk.gray(`${ShortDurationFormatter.format(diff, undefined, { left: '' })}`);\n\t\t\t} else {\n\t\t\t\tconst diff = Date.now() - build.startedAt.getTime();\n\t\t\t\tfinishedAt = chalk.gray(`Running for ${ShortDurationFormatter.format(diff, undefined, { left: '' })}`);\n\t\t\t}\n\n\t\t\ttable.pushRow({\n\t\t\t\tNumber: `${buildNumber}${hasTag}`,\n\t\t\t\tID: chalk.gray(build.id),\n\t\t\t\tStatus: prettyPrintStatus(build.status),\n\t\t\t\tTook: finishedAt,\n\t\t\t});\n\t\t}\n\n\t\treturn table;\n\t}\n}\n","import input from '@inquirer/input';\n\nimport { stdinCheckWrapper } from './_stdinCheckWrapper.js';\n\ninterface UseInputConfirmationInput {\n\tmessage: string;\n\texpectedValue: string;\n\tfailureMessage?: string;\n}\n\nexport const useInputConfirmation = stdinCheckWrapper(\n\tasync ({ message, expectedValue, failureMessage }: UseInputConfirmationInput) => {\n\t\tconst result = await input({\n\t\t\tmessage,\n\t\t\tvalidate(value) {\n\t\t\t\tif (value === expectedValue) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn failureMessage ?? 'That is not the correct input!';\n\t\t\t},\n\t\t});\n\n\t\treturn result;\n\t},\n);\n","import type { ActorTaggedBuild, ApifyApiError } from 'apify-client';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { useInputConfirmation } from '../../lib/hooks/user-confirmations/useInputConfirmation.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class BuildsRmCommand extends ApifyCommand<typeof BuildsRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Permanently removes an Actor build from the Apify platform.';\n\n\tstatic override args = {\n\t\tbuildId: Args.string({\n\t\t\tdescription: 'The build ID to delete.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { buildId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst build = await apifyClient.build(buildId).get();\n\n\t\tif (!build) {\n\t\t\terror({ message: `Build with ID \"${buildId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst actor = await apifyClient.actor(build.actId).get();\n\n\t\tlet confirmationPrompt: string | undefined;\n\n\t\tif (actor?.taggedBuilds) {\n\t\t\t// If this build is tagged in the actor, console asks you to write the tag.\n\t\t\tfor (const [tag, buildData] of Object.entries(actor.taggedBuilds) as [string, ActorTaggedBuild][]) {\n\t\t\t\tif (buildId === buildData.buildId) {\n\t\t\t\t\tconfirmationPrompt = tag;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If the build is tagged, console asks you to confirm by typing in the tag. Otherwise, it asks you to confirm with a yes/no question.\n\t\tconst confirmed = await (confirmationPrompt ? useInputConfirmation : useYesNoConfirm)({\n\t\t\tmessage: `Are you sure you want to delete this Actor Build?${confirmationPrompt ? ` If so, please type in \"${confirmationPrompt}\":` : ''}`,\n\t\t\texpectedValue: confirmationPrompt ?? '',\n\t\t\tfailureMessage: 'Your provided value does not match the build tag.',\n\t\t});\n\n\t\tif (!confirmed) {\n\t\t\tinfo({\n\t\t\t\tmessage: `Deletion of build \"${buildId}\" was canceled.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait apifyClient.build(buildId).delete();\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `Build with ID \"${buildId}\" was deleted.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\t\t\terror({ message: `Failed to delete build \"${buildId}\".\\n ${casted.message || casted}`, stdout: true });\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { BuildsCreateCommand } from './create.js';\nimport { BuildsInfoCommand } from './info.js';\nimport { BuildsLogCommand } from './log.js';\nimport { BuildsLsCommand } from './ls.js';\nimport { BuildsRmCommand } from './rm.js';\n\nexport class BuildsIndexCommand extends ApifyCommand<typeof BuildsIndexCommand> {\n\tstatic override name = 'builds' as const;\n\n\tstatic override description = 'Manages Actor build processes and versioning.';\n\n\tstatic override subcommands = [\n\t\t//\n\t\tBuildsRmCommand,\n\t\tBuildsLsCommand,\n\t\tBuildsLogCommand,\n\t\tBuildsInfoCommand,\n\t\tBuildsCreateCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import { ActorsCallCommand } from './actors/call.js';\n\nexport class TopLevelCallCommand extends ActorsCallCommand {\n\tstatic override name = 'call' as const;\n}\n","import assert from 'node:assert';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, symlink, unlink, writeFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { useCLIMetadata } from '../../lib/hooks/useCLIMetadata.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { info, simpleLog, success, warning } from '../../lib/outputs.js';\nimport { tildify } from '../../lib/utils.js';\nimport { cliDebugPrint } from '../../lib/utils/cliDebugPrint.js';\n\nconst pathToInstallMarker = (installPath: string) => join(installPath, '.install-marker');\n\nexport class InstallCommand extends ApifyCommand<typeof InstallCommand> {\n\tstatic override name = 'install' as const;\n\n\tstatic override description = 'Finalizes the first-time setup of Apify and Actor CLI.';\n\n\tstatic override hidden = true;\n\n\tasync run() {\n\t\tconst { installMethod, installPath, version } = useCLIMetadata();\n\n\t\tif (installMethod !== 'bundle') {\n\t\t\tinfo({ message: `Apify and Actor CLI are already fully configured! 👍` });\n\t\t\treturn;\n\t\t}\n\n\t\tassert(installPath, 'When CLI is installed via bundles, the install path must be set');\n\n\t\tconst installMarkerPath = pathToInstallMarker(installPath);\n\n\t\tif (existsSync(installMarkerPath)) {\n\t\t\tinfo({ message: `Apify and Actor CLI are already fully configured! 👍` });\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.symlinkToLocalBin(installPath);\n\n\t\tawait this.promptAddToShell();\n\n\t\tawait writeFile(installMarkerPath, version);\n\n\t\tcliDebugPrint('[install] install marker written to', installMarkerPath);\n\n\t\tsimpleLog({ message: '' });\n\t\tsuccess({ message: 'To get started, run:' });\n\t\tsimpleLog({ message: chalk.white.bold(' apify --help\\n actor --help') });\n\t}\n\n\tprivate async symlinkToLocalBin(installPath: string) {\n\t\tconst userHomeDirectory = process.env.HOME;\n\n\t\tcliDebugPrint('[install] user home directory', userHomeDirectory);\n\n\t\tif (!userHomeDirectory) {\n\t\t\tcliDebugPrint('[install] user home directory not found');\n\n\t\t\twarning({ message: chalk.gray(`User home directory not found, cannot symlink to ~/.local/bin`) });\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst localBinDirectory = join(userHomeDirectory, '.local', 'bin');\n\n\t\t// Make sure the directory exists\n\t\tif (!existsSync(localBinDirectory)) {\n\t\t\tawait mkdir(localBinDirectory, { recursive: true });\n\t\t}\n\n\t\tconst fileNames = ['apify', 'actor', 'apify-cli'];\n\n\t\tfor (const file of fileNames) {\n\t\t\tconst originalPath = join(installPath, file);\n\n\t\t\tif (!existsSync(originalPath)) {\n\t\t\t\tcliDebugPrint('[install] file not found for symlinking', file, originalPath);\n\n\t\t\t\twarning({ message: chalk.gray(`Bundle not found for symlinking: ${file}`) });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst symlinkPath = join(localBinDirectory, file);\n\n\t\t\tawait unlink(symlinkPath).catch(() => {\n\t\t\t\t// Ignore errors\n\t\t\t});\n\n\t\t\tawait symlink(originalPath, symlinkPath);\n\n\t\t\tcliDebugPrint('[install] symlink created for item', file, symlinkPath);\n\t\t}\n\n\t\tinfo({ message: chalk.gray(`Symlinked apify, actor, and apify-cli to ${localBinDirectory}`) });\n\t}\n\n\tprivate async promptAddToShell() {\n\t\tconst installDir = process.env.PROVIDED_INSTALL_DIR;\n\n\t\tif (!installDir) {\n\t\t\twarning({ message: chalk.gray(`Install directory not found, cannot add to shell`) });\n\t\t\treturn;\n\t\t}\n\n\t\tconst binDir = process.env.FINAL_BIN_DIR!;\n\n\t\tsimpleLog({ message: '' });\n\n\t\tconst allowedToAutomaticallyDo = await useYesNoConfirm({\n\t\t\tmessage:\n\t\t\t\t'Should the CLI handle adding itself to your shell automatically? (If you say no, you will receive the lines to add to your shell config file)',\n\t\t\t// For now, no stdin -> always false\n\t\t\tprovidedConfirmFromStdin: false,\n\t\t});\n\n\t\tconst shell = basename(process.env.SHELL ?? 'sh');\n\t\tconst quotedInstallDir = `\"${installDir.replaceAll('\"', '\\\\\"')}\"`;\n\n\t\tconst linesToAdd = [];\n\t\tlet configFile = '';\n\n\t\tswitch (shell) {\n\t\t\tcase 'bash': {\n\t\t\t\tlinesToAdd.push(`export APIFY_CLI_INSTALL=${quotedInstallDir}`);\n\t\t\t\tlinesToAdd.push(`export PATH=\"$APIFY_CLI_INSTALL/bin:$PATH\"`);\n\n\t\t\t\tconst configFiles = [join(process.env.HOME!, '.bashrc'), join(process.env.HOME!, '.bash_profile')];\n\n\t\t\t\tif (process.env.XDG_CONFIG_HOME) {\n\t\t\t\t\tconfigFiles.push(\n\t\t\t\t\t\tjoin(process.env.XDG_CONFIG_HOME, '.bashrc'),\n\t\t\t\t\t\tjoin(process.env.XDG_CONFIG_HOME, '.bash_profile'),\n\t\t\t\t\t\tjoin(process.env.XDG_CONFIG_HOME, 'bashrc'),\n\t\t\t\t\t\tjoin(process.env.XDG_CONFIG_HOME, 'bash_profile'),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Find the first likely match for the config file [because bash loves having a lot of alternatives]\n\t\t\t\tfor (const maybeConfigFile of configFiles) {\n\t\t\t\t\tif (existsSync(maybeConfigFile)) {\n\t\t\t\t\t\tconfigFile = maybeConfigFile;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'zsh':\n\t\t\t\tlinesToAdd.push(`export APIFY_CLI_INSTALL=${quotedInstallDir}`);\n\t\t\t\tlinesToAdd.push(`export PATH=\"$APIFY_CLI_INSTALL/bin:$PATH\"`);\n\n\t\t\t\tconfigFile = join(process.env.HOME!, '.zshrc');\n\n\t\t\t\tbreak;\n\t\t\tcase 'fish': {\n\t\t\t\tlinesToAdd.push(`set --export APIFY_CLI_INSTALL ${quotedInstallDir}`);\n\t\t\t\tlinesToAdd.push(`set --export PATH ${binDir} $PATH`);\n\n\t\t\t\tconfigFile = join(process.env.HOME!, '.config', 'fish', 'config.fish');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tlinesToAdd.push(`export APIFY_CLI_INSTALL=${quotedInstallDir}`);\n\t\t\t\tlinesToAdd.push(`export PATH=\"$APIFY_CLI_INSTALL/bin:$PATH\"`);\n\n\t\t\t\t// We don't use a path as we don't know the shell\n\t\t\t\tconfigFile = '~/.bashrc';\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsimpleLog({ message: '' });\n\n\t\tif (allowedToAutomaticallyDo && configFile) {\n\t\t\tconst oldContent = await readFile(configFile, 'utf-8');\n\n\t\t\tconst newContent = `${oldContent}\\n\\n# apify cli\\n${linesToAdd.join('\\n')}`;\n\n\t\t\tawait writeFile(configFile, newContent);\n\n\t\t\tinfo({ message: chalk.gray(`Added \"${tildify(binDir)}\" to $PATH in ${tildify(configFile)}`) });\n\t\t} else {\n\t\t\tinfo({\n\t\t\t\tmessage: [\n\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t`Manually add the following lines to your shell config file (${tildify(configFile)} or similar):`,\n\t\t\t\t\t),\n\t\t\t\t\t...linesToAdd.map((line) => chalk.white.bold(` ${line}`)),\n\t\t\t\t].join('\\n'),\n\t\t\t});\n\t\t}\n\t}\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { lstat, readdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport chalk from 'chalk';\nimport { gte } from 'semver';\n\nimport { USER_AGENT } from '../../entrypoints/_shared.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { execWithLog } from '../../lib/exec.js';\nimport { DEVELOPMENT_VERSION_MARKER, type InstallMethod, useCLIMetadata } from '../../lib/hooks/useCLIMetadata.js';\nimport type { Asset } from '../../lib/hooks/useCLIVersionAssets.js';\nimport { useCLIVersionAssets } from '../../lib/hooks/useCLIVersionAssets.js';\nimport { useCLIVersionCheck } from '../../lib/hooks/useCLIVersionCheck.js';\nimport { error, info, simpleLog, success, warning } from '../../lib/outputs.js';\nimport { cliDebugPrint } from '../../lib/utils/cliDebugPrint.js';\n\nconst UPDATE_COMMANDS: Record<InstallMethod, (version: string, entrypoint: string) => string[]> = {\n\tbundle: (_, entrypoint) => [`${entrypoint}`, 'upgrade'],\n\tnpm: (version) => ['npm', 'install', '-g', `apify-cli@${version}`],\n\tpnpm: (version) => ['pnpm', 'install', '-g', `apify-cli@${version}`],\n\tbun: (version) => ['bun', 'install', '-g', `apify-cli@${version}`],\n\thomebrew: () => ['brew', 'upgrade', 'apify-cli'],\n\tvolta: (version) => ['volta', 'install', `apify-cli@${version}`],\n};\n\n// TODO: update this once we bump the CLI version and release it with this command available\nconst MINIMUM_VERSION_FOR_UPGRADE_COMMAND = '1.0.1';\n\n/**\n * The link to the upgrade script needed for windows when upgrading CLI bundles (as a fallback for when the script is missing)\n * Unix-based systems do not require a similar script as they allow the executing process to override itself\n * (so we can replace the binary while it is running)\n */\nconst WINDOWS_UPGRADE_SCRIPT_URL = 'https://raw.githubusercontent.com/apify/apify-cli/main/scripts/install/upgrade.ps1';\n\nexport class UpgradeCommand extends ApifyCommand<typeof UpgradeCommand> {\n\tstatic override name = 'upgrade' as const;\n\n\tstatic override description = 'Checks that installed Apify CLI version is up to date.';\n\n\tstatic override hidden = true;\n\n\tstatic override aliases = ['cv', 'check-version'];\n\n\tstatic override flags = {\n\t\tforce: Flags.boolean({\n\t\t\tdescription:\n\t\t\t\t'[DEPRECATED] This flag is now ignored, as running the command manually will always check for the latest version.',\n\t\t\trequired: false,\n\t\t\tchar: 'f',\n\t\t}),\n\t\tversion: Flags.string({\n\t\t\tdescription: 'The version of the CLI to upgrade to. If not provided, the latest version will be used.',\n\t\t\trequired: false,\n\t\t}),\n\t\t'internal-automatic-call': Flags.boolean({\n\t\t\tdescription: 'Whether the command was called automatically by the CLI for a version check.',\n\t\t\thidden: true,\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tprivate get cliName() {\n\t\treturn this.entrypoint === 'apify' ? 'Apify CLI' : 'Actor CLI';\n\t}\n\n\tasync run() {\n\t\tif (this.flags.version) {\n\t\t\tawait this.handleInstallSpecificVersion(this.flags.version);\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = await useCLIVersionCheck(!this.flags.internalAutomaticCall);\n\t\tconst { installMethod } = useCLIMetadata();\n\n\t\tif (!result.shouldUpdate || result.currentVersion === DEVELOPMENT_VERSION_MARKER) {\n\t\t\tcliDebugPrint('[upgrade] no update needed', {\n\t\t\t\tshouldUpdate: result.shouldUpdate,\n\t\t\t\tcurrentVersion: result.currentVersion,\n\t\t\t});\n\n\t\t\t// Always print, unless the command was called automatically by the CLI for a version check\n\t\t\tif (!this.flags.internalAutomaticCall) {\n\t\t\t\tinfo({ message: `${this.cliName} is up to date 👍 \\n` });\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the flag is not set, a user manually called the command, so we should upgrade the CLI\n\t\tif (!this.flags.internalAutomaticCall) {\n\t\t\tawait this.handleInstallSpecificVersion('latest');\n\t\t\treturn;\n\t\t}\n\n\t\tconst updateCommand = UPDATE_COMMANDS[installMethod]('latest', this.entrypoint).join(' ');\n\n\t\tsimpleLog({ message: '' });\n\n\t\tconst message = [\n\t\t\t`You are using an old version of ${this.cliName}. We strongly recommend you always use the latest available version.`,\n\t\t\t` ↪ Run ${chalk.bgWhite(chalk.black(updateCommand))} to update! 👍 \\n`,\n\t\t].join('\\n');\n\n\t\twarning({ message });\n\t}\n\n\tasync handleInstallSpecificVersion(version: string) {\n\t\t// Technically, we could allow downgrades to older versions, but then users would lose the upgrade command 🤷\n\t\tif (version !== 'latest' && !gte(version, MINIMUM_VERSION_FOR_UPGRADE_COMMAND)) {\n\t\t\terror({\n\t\t\t\tmessage: `The minimum version of the CLI you can manually downgrade/upgrade to is ${MINIMUM_VERSION_FOR_UPGRADE_COMMAND}.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst versionData = await useCLIVersionAssets(version);\n\n\t\tif (!versionData) {\n\t\t\terror({ message: `The provided version does not exist. Please check the version number and try again.` });\n\t\t\treturn;\n\t\t}\n\n\t\tconst { assets, version: versionWithoutV } = versionData;\n\n\t\t// Check again, in case `latest` returns an older version for whatever reason\n\t\tif (!gte(versionWithoutV, MINIMUM_VERSION_FOR_UPGRADE_COMMAND)) {\n\t\t\terror({\n\t\t\t\tmessage: `The minimum version of the CLI you can manually downgrade/upgrade to is ${MINIMUM_VERSION_FOR_UPGRADE_COMMAND}.`,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst metadata = useCLIMetadata();\n\n\t\tif (metadata.installMethod === 'bundle') {\n\t\t\tif (!assets.length) {\n\t\t\t\terror({\n\t\t\t\t\tmessage: [\n\t\t\t\t\t\t'Failed to find the assets for your system and the provided version. Please open an issue on https://github.com/apify/apify-cli/issues/new and provide the following information:',\n\t\t\t\t\t\t`- The version you are trying to upgrade to: ${versionWithoutV}`,\n\t\t\t\t\t\t`- The system you are running on: ${metadata.platform} ${metadata.arch}`,\n\t\t\t\t\t].join('\\n'),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst bundleDirectory = dirname(process.execPath);\n\n\t\t\tcliDebugPrint('[upgrade] bundleDirectory', bundleDirectory);\n\n\t\t\tconst directoryEntries = await readdir(bundleDirectory);\n\n\t\t\tif (!directoryEntries.some((entry) => entry.startsWith('apify') || entry.startsWith('actor'))) {\n\t\t\t\tcliDebugPrint('[upgrade] directoryEntries', directoryEntries);\n\n\t\t\t\terror({\n\t\t\t\t\tmessage: [\n\t\t\t\t\t\t`Failed to find the currently installed ${this.cliName} bundle. Please open an issue on https://github.com/apify/apify-cli/issues/new and provide the following information:`,\n\t\t\t\t\t\t`- The version you are trying to upgrade to: ${versionWithoutV}`,\n\t\t\t\t\t\t`- The system you are running on: ${metadata.platform} ${metadata.arch}`,\n\t\t\t\t\t\t`- The directory where the ${this.cliName} bundle is installed: ${bundleDirectory}`,\n\t\t\t\t\t].join('\\n'),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (metadata.platform === 'windows') {\n\t\t\t\treturn this.startUpgradeProcess(bundleDirectory, versionWithoutV, assets);\n\t\t\t}\n\n\t\t\tawait this.handleUnixUpgrade(bundleDirectory, versionWithoutV, assets);\n\n\t\t\tthis.successMessage(versionWithoutV);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst updateCommand = UPDATE_COMMANDS[metadata.installMethod](version, this.entrypoint);\n\n\t\tif (process.env.APIFY_CLI_DEBUG) {\n\t\t\tinfo({ message: `Would run command: ${updateCommand.join(' ')}` });\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait execWithLog({ cmd: updateCommand[0], args: updateCommand.slice(1) });\n\n\t\t\tthis.successMessage(versionWithoutV);\n\t\t} catch {\n\t\t\terror({\n\t\t\t\tmessage: `Failed to upgrade the CLI. Please run the following command manually: ${updateCommand.join(' ')}`,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate successMessage(version: string) {\n\t\tsuccess({ message: `Successfully upgraded to ${version} 👍` });\n\t}\n\n\tprivate async startUpgradeProcess(bundleDirectory: string, version: string, assets: Asset[]) {\n\t\t// Assert that we have the upgrade script, and download if it is missing\n\t\tawait this.upsertUpgradeScript(bundleDirectory);\n\n\t\t// Start the child process with it, and exit the cli\n\t\tconst args = [\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-File',\n\t\t\t`\"${join(bundleDirectory, 'upgrade.ps1')}\"`,\n\t\t\t'-ProcessId',\n\t\t\tprocess.pid.toString(),\n\t\t\t'-InstallLocation',\n\t\t\t`\"${bundleDirectory}\"`,\n\t\t\t'-Version',\n\t\t\t`\"${version}\"`,\n\t\t];\n\n\t\tconst urls = assets.map((asset) => asset.browser_download_url).join(',');\n\n\t\targs.push('-AllUrls', `\"${urls}\"`);\n\n\t\tcliDebugPrint('[upgrade] starting upgrade process with args', args);\n\n\t\tinfo({ message: `Starting upgrade process...` });\n\n\t\tconst upgradeProcess = spawn('powershell.exe', args, {\n\t\t\tdetached: true,\n\t\t\tshell: true,\n\t\t\tstdio: 'inherit',\n\t\t\twindowsHide: false,\n\t\t\twindowsVerbatimArguments: true,\n\t\t});\n\n\t\tupgradeProcess.on('spawn', () => {\n\t\t\tcliDebugPrint('[upgrade] upgrade process spawned');\n\n\t\t\tupgradeProcess.unref();\n\t\t\t// CLI exits, but the upgrade process continues in the background\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\tupgradeProcess.on('error', (err) => {\n\t\t\terror({ message: `Failed to start the upgrade process: ${err.message}` });\n\t\t});\n\t}\n\n\tprivate async upsertUpgradeScript(bundleDirectory: string) {\n\t\tconst filePath = join(bundleDirectory, 'upgrade.ps1');\n\n\t\tif (existsSync(filePath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst metadata = useCLIMetadata();\n\n\t\tconst res = await fetch(WINDOWS_UPGRADE_SCRIPT_URL, { headers: { 'User-Agent': USER_AGENT } });\n\n\t\tif (!res.ok) {\n\t\t\terror({\n\t\t\t\tmessage: [\n\t\t\t\t\t`Failed to fetch the upgrade script. Please open an issue on https://github.com/apify/apify-cli/issues/new and provide the following information:`,\n\t\t\t\t\t`- The system you are running on: ${metadata.platform} ${metadata.arch}`,\n\t\t\t\t\t`- The URL of the asset that failed to fetch: ${WINDOWS_UPGRADE_SCRIPT_URL}`,\n\t\t\t\t\t`- The status code of the response: ${res.status}`,\n\t\t\t\t].join('\\n'),\n\t\t\t});\n\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst buffer = await res.arrayBuffer();\n\n\t\tawait writeFile(filePath, Buffer.from(buffer));\n\n\t\tcliDebugPrint('[upgrade] downloaded upgrade script to', filePath);\n\t}\n\n\tprivate async handleUnixUpgrade(bundleDirectory: string, version: string, assets: Asset[]) {\n\t\tconst metadata = useCLIMetadata();\n\n\t\tfor (const asset of assets) {\n\t\t\tconst cliName = asset.name.split('-')[0];\n\t\t\tconst filePath = join(bundleDirectory, cliName);\n\n\t\t\tinfo({ message: `Downloading \\`${cliName}\\` binary of the Apify CLI...` });\n\n\t\t\tconst res = await fetch(asset.browser_download_url, { headers: { 'User-Agent': USER_AGENT } });\n\n\t\t\tif (!res.ok) {\n\t\t\t\tconst body = await res.text();\n\n\t\t\t\tcliDebugPrint('[upgrade] failed to fetch asset', { asset, status: res.status, body });\n\n\t\t\t\terror({\n\t\t\t\t\tmessage: [\n\t\t\t\t\t\t`Failed to fetch the ${cliName} bundle. Please open an issue on https://github.com/apify/apify-cli/issues/new and provide the following information:`,\n\t\t\t\t\t\t`- The version you are trying to upgrade to: ${version}`,\n\t\t\t\t\t\t`- The system you are running on: ${metadata.platform} ${metadata.arch}`,\n\t\t\t\t\t\t`- The URL of the asset that failed to fetch: ${asset.browser_download_url}`,\n\t\t\t\t\t\t`- The status code of the response: ${res.status}`,\n\t\t\t\t\t\t`- The body of the response: ${body}`,\n\t\t\t\t\t].join('\\n'),\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (process.env.APIFY_CLI_DEBUG && !process.env.APIFY_CLI_FORCE) {\n\t\t\t\tinfo({ message: `Would write asset ${cliName} to ${filePath}` });\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinfo({ message: chalk.gray(`Writing ${cliName} to ${filePath}...`) });\n\n\t\t\tconst buffer = await res.arrayBuffer();\n\n\t\t\ttry {\n\t\t\t\tconst originalFilePerms = await lstat(filePath)\n\t\t\t\t\t.then((stat) => stat.mode)\n\t\t\t\t\t// Default to rwx for current user and rx for group and others\n\t\t\t\t\t.catch(() => 0o755);\n\n\t\t\t\tawait writeFile(filePath, Buffer.from(buffer), {\n\t\t\t\t\t// Make the file executable again on unix systems, by always making the current user have rwx\n\t\t\t\t\t// eslint-disable-next-line no-bitwise -- intentionally using bitwise operators\n\t\t\t\t\tmode: originalFilePerms | 0o700,\n\t\t\t\t});\n\n\t\t\t\tcliDebugPrint(`[upgrade ${cliName}] wrote asset to`, filePath);\n\t\t\t} catch (err: any) {\n\t\t\t\tcliDebugPrint('[upgrade] failed to write asset', { error: err });\n\n\t\t\t\terror({\n\t\t\t\t\tmessage: [\n\t\t\t\t\t\t`Failed to write the ${cliName} bundle. Please open an issue on https://github.com/apify/apify-cli/issues/new and provide the following information:`,\n\t\t\t\t\t\t`- The version you are trying to upgrade to: ${version}`,\n\t\t\t\t\t\t`- The system you are running on: ${metadata.platform} ${metadata.arch}`,\n\t\t\t\t\t\t`- The URL of the asset that failed to fetch: ${asset.browser_download_url}`,\n\t\t\t\t\t\t`- The error: ${err.message}`,\n\t\t\t\t\t].join('\\n'),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Result } from '@sapphire/result';\nimport { execa, type ExecaError, type Options } from 'execa';\n\nimport { normalizeExecutablePath } from './hooks/runtimes/utils.js';\nimport { error, run } from './outputs.js';\nimport { cliDebugPrint } from './utils/cliDebugPrint.js';\n\nconst spawnPromised = async (cmd: string, args: string[], opts: Options) => {\n\tconst escapedCommand = normalizeExecutablePath(cmd);\n\n\tcliDebugPrint('spawnPromised', { escapedCommand, args, opts });\n\n\tconst childProcess = execa(escapedCommand, args, {\n\t\tshell: true,\n\t\twindowsHide: true,\n\t\tenv: opts.env,\n\t\tcwd: opts.cwd,\n\t\t// Pipe means it gets collected by the parent process, inherit means it gets collected by the parent process and printed out to the console\n\t\tstdout: process.env.APIFY_NO_LOGS_IN_TESTS ? ['pipe'] : ['pipe', 'inherit'],\n\t\tstderr: process.env.APIFY_NO_LOGS_IN_TESTS ? ['pipe'] : ['pipe', 'inherit'],\n\t\tverbose: process.env.APIFY_CLI_DEBUG ? 'full' : undefined,\n\t});\n\n\treturn Result.fromAsync(\n\t\tchildProcess.catch((execaError: ExecaError) => {\n\t\t\tthrow new Error(`${cmd} exited with code ${execaError.exitCode}`, { cause: execaError });\n\t\t}),\n\t) as Promise<Result<Awaited<typeof childProcess>, Error & { cause: ExecaError }>>;\n};\n\nexport interface ExecWithLogOptions {\n\tcmd: string;\n\targs?: string[];\n\topts?: Options;\n\toverrideCommand?: string;\n}\n\nexport async function execWithLog({ cmd, args = [], opts = {}, overrideCommand }: ExecWithLogOptions) {\n\trun({ message: `${overrideCommand || cmd} ${args.join(' ')}` });\n\tconst result = await spawnPromised(cmd, args, opts);\n\n\tif (result.isErr()) {\n\t\tconst err = result.unwrapErr();\n\t\terror({ message: err.message });\n\n\t\tif (err.cause) {\n\t\t\tthrow err.cause;\n\t\t}\n\t}\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport { USER_AGENT } from '../../entrypoints/_shared.js';\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\nimport { useCLIMetadata } from './useCLIMetadata.js';\n\nconst metadata = useCLIMetadata();\n\nfunction isInstalledOnMusl() {\n\tif (metadata.platform === 'linux') {\n\t\treturn existsSync('/etc/alpine-release');\n\t}\n\n\treturn false;\n}\n\nfunction isInstalledOnBaseline() {\n\tif (metadata.platform === 'darwin' && metadata.arch === 'x64') {\n\t\tconst sysctlResult = execSync('sysctl -a', { encoding: 'utf-8' });\n\n\t\treturn !sysctlResult.includes('AVX2');\n\t}\n\n\tif (metadata.platform === 'linux' && metadata.arch === 'x64') {\n\t\tconst procCpuInfo = readFileSync('/proc/cpuinfo', 'utf-8');\n\n\t\treturn !procCpuInfo.includes('avx2');\n\t}\n\n\tif (metadata.platform === 'windows') {\n\t\t// Windows ARM64 always needs baseline\n\t\tif (metadata.arch === 'arm64') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Get AVX2 support like the install script does\n\t\tconst isBaseline = execSync(\n\t\t\t\"pwsh -c \\\"!(Add-Type -MemberDefinition '[DllImport(\\\\\\\"kernel32.dll\\\\\\\")] public static extern bool IsProcessorFeaturePresent(int ProcessorFeature);' -Name 'Kernel32' -Namespace 'Win32' -PassThru)::IsProcessorFeaturePresent(40)\\\"\",\n\t\t\t{\n\t\t\t\tencoding: 'utf-8',\n\t\t\t\twindowsHide: true,\n\t\t\t},\n\t\t);\n\n\t\treturn isBaseline.trim().toLowerCase() === 'true';\n\t}\n\n\treturn false;\n}\n\nexport interface Asset {\n\tname: string;\n\tbrowser_download_url: string;\n}\n\n/**\n * Fetches the assets for a given version of the CLI, matching the os and arch of the current machine.\n *\n * @param version - The version of the CLI to fetch the assets for.\n * @returns The assets for the given version of the CLI.\n */\nexport async function useCLIVersionAssets(version: string) {\n\tconst versionWithoutV = version.replace(/^v(\\d+)/, '$1');\n\n\tconst tag = versionWithoutV === 'latest' ? 'latest' : `tags/v${versionWithoutV}`;\n\n\tconst release = await fetch(`https://api.github.com/repos/apify/apify-cli/releases/${tag}`, {\n\t\theaders: {\n\t\t\t'User-Agent': USER_AGENT,\n\t\t},\n\t});\n\n\tif (!release.ok) {\n\t\tcliDebugPrint('useCLIVersionAssets', 'Failed to fetch release', {\n\t\t\tstatusCode: release.status,\n\t\t\tbody: await release.text(),\n\t\t\tversion,\n\t\t\ttag,\n\t\t});\n\n\t\treturn null;\n\t}\n\n\tconst body = (await release.json()) as {\n\t\tassets: { name: string; browser_download_url: string }[];\n\t\ttag_name: string;\n\t};\n\n\tconst requiresMusl = isInstalledOnMusl();\n\tconst requiresBaseline = isInstalledOnBaseline();\n\n\tconst assets = body.assets.filter((asset) => {\n\t\tconst [\n\t\t\t//\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\t_cliEntrypoint,\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\t_version,\n\t\t\tassetOs,\n\t\t\tassetArch,\n\t\t\tassetBaselineOrMusl,\n\t\t\tassetBaseline,\n\t\t] = asset.name.replace(versionWithoutV, 'version').replace('.exe', '').split('-');\n\n\t\tif (assetOs !== metadata.platform) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (assetArch !== metadata.arch) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (requiresMusl) {\n\t\t\treturn assetBaselineOrMusl === 'musl';\n\t\t}\n\n\t\tif (requiresBaseline) {\n\t\t\treturn assetBaseline === 'baseline' || assetBaselineOrMusl === 'baseline';\n\t\t}\n\n\t\treturn !assetBaselineOrMusl && !assetBaseline;\n\t});\n\n\tcliDebugPrint('useCLIVersionAssets', 'Fetched release', {\n\t\tversion: body.tag_name,\n\t\tfilteredAssets: assets,\n\t});\n\n\treturn {\n\t\tassets,\n\t\tversion: body.tag_name.replace(/^v(\\d+)/, '$1'),\n\t};\n}\n","import { mkdir, readdir, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nimport { gte, minVersion } from 'semver';\n\nimport { fetchManifest, manifestUrl } from '@apify/actor-templates';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { Flags } from '../lib/command-framework/flags.js';\nimport {\n\tEMPTY_LOCAL_CONFIG,\n\tLOCAL_CONFIG_PATH,\n\tMINIMUM_SUPPORTED_PYTHON_VERSION,\n\tPYTHON_VENV_PATH,\n\tSUPPORTED_NODEJS_VERSION,\n} from '../lib/consts.js';\nimport {\n\tenhanceReadmeWithLocalSuffix,\n\tensureValidActorName,\n\tformatCreateSuccessMessage,\n\tgetTemplateDefinition,\n} from '../lib/create-utils.js';\nimport { execWithLog } from '../lib/exec.js';\nimport { updateLocalJson } from '../lib/files.js';\nimport { usePythonRuntime } from '../lib/hooks/runtimes/python.js';\nimport { getInstallCommandSuggestion } from '../lib/hooks/runtimes/utils.js';\nimport { ProjectLanguage, useCwdProject } from '../lib/hooks/useCwdProject.js';\nimport { createPrefilledInputFileFromInputSchema } from '../lib/input_schema.js';\nimport { error, info, simpleLog, success, warning } from '../lib/outputs.js';\nimport {\n\tdownloadAndUnzip,\n\tgetJsonFileContent,\n\tisNodeVersionSupported,\n\tisPythonVersionSupported,\n\tsetLocalConfig,\n\tsetLocalEnv,\n} from '../lib/utils.js';\n\nexport class CreateCommand extends ApifyCommand<typeof CreateCommand> {\n\tstatic override name = 'create' as const;\n\n\tstatic override description =\n\t\t'Creates an Actor project from a template in a new directory. The command automatically initializes a git repository in the newly created Actor directory.';\n\n\tstatic override flags = {\n\t\ttemplate: Flags.string({\n\t\t\tchar: 't',\n\t\t\tdescription: `Template for the Actor. If not provided, the command will prompt for it. Visit ${manifestUrl} to find available template names.`,\n\t\t\trequired: false,\n\t\t}),\n\t\t'skip-dependency-install': Flags.boolean({\n\t\t\tdescription: 'Skip installing Actor dependencies.',\n\t\t\trequired: false,\n\t\t}),\n\t\t'template-archive-url': Flags.string({\n\t\t\tdescription: 'Actor template archive url. Useful for developing new templates.',\n\t\t\trequired: false,\n\t\t\thidden: true,\n\t\t}),\n\t\t'omit-optional-deps': Flags.boolean({\n\t\t\taliases: ['no-optional'],\n\t\t\tdescription: 'Skip installing optional dependencies.',\n\t\t\trequired: false,\n\t\t}),\n\t\t'skip-git-init': Flags.boolean({\n\t\t\tdescription: 'Skip initializing a git repository in the Actor directory.',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorName: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription: 'Name of the Actor and its directory',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tlet { actorName } = this.args;\n\t\tconst { template: templateName, skipDependencyInstall, skipGitInit } = this.flags;\n\n\t\t// --template-archive-url is an internal, undocumented flag that's used\n\t\t// for testing of templates that are not yet published in the manifest\n\t\tlet { templateArchiveUrl } = this.flags;\n\t\tlet skipOptionalDeps = false;\n\n\t\t// Start fetching manifest immediately to prevent\n\t\t// annoying delays that sometimes happen on CLI startup.\n\t\tconst manifestPromise = fetchManifest().catch((err) => {\n\t\t\treturn new Error(`Could not fetch template list from server. Cause: ${err?.message}`);\n\t\t});\n\n\t\tactorName = await ensureValidActorName(actorName);\n\n\t\tconst cwd = process.cwd();\n\t\tlet actFolderDir = join(cwd, actorName);\n\n\t\twhile (true) {\n\t\t\tconst folderExists = await stat(actFolderDir).catch(() => null);\n\t\t\tconst folderHasFiles =\n\t\t\t\tfolderExists &&\n\t\t\t\t(await readdir(actFolderDir)\n\t\t\t\t\t.then((files) => files.length > 0)\n\t\t\t\t\t.catch(() => false));\n\n\t\t\tif (folderExists?.isDirectory() && folderHasFiles) {\n\t\t\t\terror({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Cannot create new Actor, directory '${actorName}' already exists. Please provide a different name.` +\n\t\t\t\t\t\t' You can use \"apify init\" to create a local Actor environment inside an existing directory.',\n\t\t\t\t});\n\n\t\t\t\tactorName = await ensureValidActorName();\n\t\t\t\tactFolderDir = join(cwd, actorName);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Create Actor directory structure\n\t\t\tif (!folderExists) {\n\t\t\t\tawait mkdir(actFolderDir, { recursive: true });\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tlet messages = null;\n\n\t\tthis.telemetryData.fromArchiveUrl = !!templateArchiveUrl;\n\n\t\tif (!templateArchiveUrl) {\n\t\t\tconst templateDefinition = await getTemplateDefinition(templateName, manifestPromise);\n\t\t\t({ archiveUrl: templateArchiveUrl, messages } = templateDefinition);\n\t\t\tthis.telemetryData.templateId = templateDefinition.id;\n\t\t\tthis.telemetryData.templateName = templateDefinition.name;\n\t\t\tthis.telemetryData.templateLanguage = templateDefinition.category;\n\n\t\t\t// This \"exists\"\n\t\t\tif ('skipOptionalDeps' in templateDefinition) {\n\t\t\t\tskipOptionalDeps = templateDefinition.skipOptionalDeps as boolean;\n\t\t\t}\n\t\t}\n\n\t\t// Set this _after_ the template is resolved, so that the flag takes precedence\n\t\tif (this.flags.omitOptionalDeps) {\n\t\t\tskipOptionalDeps = true;\n\t\t}\n\n\t\tawait downloadAndUnzip({ url: templateArchiveUrl, pathTo: actFolderDir });\n\n\t\t// There may be .actor/actor.json file in used template - let's try to load it and change the name prop value to actorName\n\t\tconst localConfig = getJsonFileContent(join(actFolderDir, LOCAL_CONFIG_PATH));\n\t\tawait setLocalConfig(Object.assign(localConfig || EMPTY_LOCAL_CONFIG, { name: actorName }), actFolderDir);\n\t\tawait setLocalEnv(actFolderDir);\n\n\t\t// Create prefilled INPUT.json file from the input schema prefills\n\t\tawait createPrefilledInputFileFromInputSchema(actFolderDir);\n\n\t\tconst packageJsonPath = join(actFolderDir, 'package.json');\n\t\tconst readmePath = join(actFolderDir, 'README.md');\n\n\t\t// Add localReadmeSuffix which is fetched from manifest to README.md\n\t\t// The suffix contains local development instructions\n\t\tawait enhanceReadmeWithLocalSuffix(readmePath, manifestPromise);\n\n\t\tlet dependenciesInstalled = false;\n\t\tif (!skipDependencyInstall) {\n\t\t\tconst cwdProjectResult = await useCwdProject({ cwd: actFolderDir });\n\n\t\t\tawait cwdProjectResult.inspectAsync(async (project) => {\n\t\t\t\tconst minimumSupportedNodeVersion = minVersion(SUPPORTED_NODEJS_VERSION);\n\n\t\t\t\tif (!project.runtime) {\n\t\t\t\t\tswitch (project.type) {\n\t\t\t\t\t\tcase ProjectLanguage.JavaScript: {\n\t\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t`No Node.js detected! Please install Node.js ${minimumSupportedNodeVersion} or higher` +\n\t\t\t\t\t\t\t\t\t' to be able to run Node.js Actors locally.',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase ProjectLanguage.Scrapy:\n\t\t\t\t\t\tcase ProjectLanguage.Python: {\n\t\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\t\tmessage: `No Python detected! Please install Python ${MINIMUM_SUPPORTED_PYTHON_VERSION} or higher to be able to run Python Actors locally.`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Do nothing\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet { runtime } = project;\n\n\t\t\t\tswitch (project.type) {\n\t\t\t\t\tcase ProjectLanguage.JavaScript: {\n\t\t\t\t\t\tif (!isNodeVersionSupported(runtime.version)) {\n\t\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t`You are running Node.js version ${runtime.version}, which is no longer supported. ` +\n\t\t\t\t\t\t\t\t\t`Please upgrade to Node.js version ${minimumSupportedNodeVersion} or later.`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the Actor is a Node.js Actor (has package.json), run `npm install`\n\t\t\t\t\t\tawait updateLocalJson(packageJsonPath, { name: actorName });\n\n\t\t\t\t\t\t// Run npm install in Actor dir.\n\t\t\t\t\t\t// For efficiency, don't install Puppeteer for templates that don't use it\n\t\t\t\t\t\tconst cmdArgs = ['install'];\n\n\t\t\t\t\t\tif (skipOptionalDeps) {\n\t\t\t\t\t\t\tswitch (runtime.pmName) {\n\t\t\t\t\t\t\t\tcase 'npm': {\n\t\t\t\t\t\t\t\t\tif (gte(runtime.pmVersion!, '7.0.0')) {\n\t\t\t\t\t\t\t\t\t\tcmdArgs.push('--omit=optional');\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tcmdArgs.push('--no-optional');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase 'bun': {\n\t\t\t\t\t\t\t\t\tcmdArgs.push('--omit=optional');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase 'deno': {\n\t\t\t\t\t\t\t\t\t// We want to make deno use the node_modules dir\n\t\t\t\t\t\t\t\t\tcmdArgs.push('--node-modules-dir');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t// Do nothing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.pmPath!,\n\t\t\t\t\t\t\targs: cmdArgs,\n\t\t\t\t\t\t\topts: { cwd: actFolderDir },\n\t\t\t\t\t\t\toverrideCommand: runtime.pmName,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tdependenciesInstalled = true;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase ProjectLanguage.Python:\n\t\t\t\t\tcase ProjectLanguage.Scrapy: {\n\t\t\t\t\t\tif (!isPythonVersionSupported(runtime.version)) {\n\t\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\t\tmessage: `Python Actors require Python 3.9 or higher, but you have Python ${runtime.version}!`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\t\tmessage: 'Please install Python 3.9 or higher to be able to run Python Actors locally.',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst venvPath = join(actFolderDir, '.venv');\n\t\t\t\t\t\tinfo({ message: `Python version ${runtime.version} detected.` });\n\t\t\t\t\t\tinfo({\n\t\t\t\t\t\t\tmessage: `Creating a virtual environment in \"${venvPath}\" and installing dependencies from \"requirements.txt\"...`,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!process.env.VIRTUAL_ENV) {\n\t\t\t\t\t\t\t// If Python is not running in a virtual environment, create a new one\n\t\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\t\targs: ['-m', 'venv', '--prompt', '.', PYTHON_VENV_PATH],\n\t\t\t\t\t\t\t\topts: { cwd: actFolderDir },\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// regenerate the `pythonCommand` after we create the virtual environment\n\t\t\t\t\t\t\truntime = (await usePythonRuntime({ cwd: actFolderDir, force: true })).unwrap();\n\t\t\t\t\t\t\tproject.runtime = runtime;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\targs: [\n\t\t\t\t\t\t\t\t'-m',\n\t\t\t\t\t\t\t\t'pip',\n\t\t\t\t\t\t\t\t'install',\n\t\t\t\t\t\t\t\t'--no-cache-dir',\n\t\t\t\t\t\t\t\t'--no-warn-script-location',\n\t\t\t\t\t\t\t\t'--upgrade',\n\t\t\t\t\t\t\t\t'pip',\n\t\t\t\t\t\t\t\t'setuptools',\n\t\t\t\t\t\t\t\t'wheel',\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\topts: { cwd: actFolderDir },\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\targs: [\n\t\t\t\t\t\t\t\t'-m',\n\t\t\t\t\t\t\t\t'pip',\n\t\t\t\t\t\t\t\t'install',\n\t\t\t\t\t\t\t\t'--no-cache-dir',\n\t\t\t\t\t\t\t\t'--no-warn-script-location',\n\t\t\t\t\t\t\t\t'-r',\n\t\t\t\t\t\t\t\t'requirements.txt',\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\topts: { cwd: actFolderDir },\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tdependenciesInstalled = true;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t// Do nothing\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Initialize git repository before reporting success, but store result for later\n\t\tlet gitInitResult: { success: boolean; error?: Error } = { success: true };\n\t\tconst cwdHasGit = await stat(join(cwd, '.git')).catch(() => null);\n\n\t\tif (!skipGitInit && !cwdHasGit) {\n\t\t\ttry {\n\t\t\t\tawait execWithLog({\n\t\t\t\t\tcmd: 'git',\n\t\t\t\t\targs: ['init'],\n\t\t\t\t\topts: { cwd: actFolderDir },\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tgitInitResult = { success: false, error: err as Error };\n\t\t\t}\n\t\t}\n\n\t\t// Suggest install command if dependencies were not installed\n\t\tconst installCommandSuggestion = !dependenciesInstalled\n\t\t\t? await getInstallCommandSuggestion(actFolderDir)\n\t\t\t: null;\n\n\t\t// Success message with extra empty line\n\t\tsimpleLog({ message: '' });\n\t\tsuccess({\n\t\t\tmessage: formatCreateSuccessMessage({\n\t\t\t\tactorName,\n\t\t\t\tdependenciesInstalled,\n\t\t\t\tpostCreate: messages?.postCreate ?? null,\n\t\t\t\tgitRepositoryInitialized: !skipGitInit && !cwdHasGit && gitInitResult.success,\n\t\t\t\tinstallCommandSuggestion,\n\t\t\t}),\n\t\t});\n\n\t\t// Report git initialization result only if it failed (success already included in success message)\n\t\tif (!skipGitInit && !cwdHasGit && !gitInitResult.success) {\n\t\t\t// Git init is not critical, so we just warn if it fails\n\t\t\twarning({ message: `Failed to initialize git repository: ${gitInitResult.error!.message}` });\n\t\t\twarning({ message: 'You can manually run \"git init\" in the Actor directory if needed.' });\n\t\t}\n\t}\n}\n","import { createWriteStream } from 'node:fs';\nimport { pipeline } from 'node:stream/promises';\n\nimport { Separator } from '@inquirer/core';\n\nimport type { Manifest, Template } from '@apify/actor-templates';\n\nimport type { ChoicesType } from './hooks/user-confirmations/useSelectFromList.js';\nimport { useSelectFromList } from './hooks/user-confirmations/useSelectFromList.js';\nimport { useUserInput } from './hooks/user-confirmations/useUserInput.js';\nimport { warning } from './outputs.js';\nimport { httpsGet, validateActorName } from './utils.js';\n\nconst PROGRAMMING_LANGUAGES = ['JavaScript', 'TypeScript', 'Python'];\n\nexport async function ensureValidActorName(maybeActorName?: string) {\n\tif (maybeActorName) {\n\t\tvalidateActorName(maybeActorName);\n\t\treturn maybeActorName;\n\t}\n\n\treturn promptActorName();\n}\n\n// TODO: this isn't even used anymore\nexport async function getTemplateDefinition(\n\tmaybeTemplateName: string | undefined,\n\tmanifestPromise: Promise<Manifest | Error>,\n) {\n\tconst manifest = await manifestPromise;\n\t// If the fetch failed earlier, the resolve value of\n\t// the promise will be the error from fetching the manifest.\n\tif (manifest instanceof Error) throw manifest;\n\n\tif (maybeTemplateName) {\n\t\tconst templateDefinition = manifest.templates.find((t) => t.name === maybeTemplateName);\n\t\tif (!templateDefinition) {\n\t\t\tthrow new Error(`Could not find the selected template: ${maybeTemplateName} in the list of templates.`);\n\t\t}\n\t\treturn templateDefinition;\n\t}\n\n\treturn executePrompts(manifest);\n}\n\n// TODO: this isn't even used anymore\n/**\n * Fetch local readme suffix from the manifest and append it to the readme.\n */\nexport async function enhanceReadmeWithLocalSuffix(readmePath: string, manifestPromise: Promise<Manifest | Error>) {\n\tconst manifest = await manifestPromise;\n\t// If the fetch failed earlier, the resolve value of\n\t// the promise will be the error from fetching the manifest.\n\tif (manifest instanceof Error) throw manifest;\n\n\ttry {\n\t\tconst suffixStream = await httpsGet(manifest.localReadmeSuffixUrl!);\n\t\tconst readmeStream = createWriteStream(readmePath, { flags: 'a' });\n\t\treadmeStream.write('\\n\\n');\n\t\tawait pipeline(suffixStream, readmeStream);\n\t} catch (err) {\n\t\twarning({\n\t\t\tmessage: `Could not append local development instructions to README.md. Cause: ${(err as Error).message}`,\n\t\t});\n\t}\n}\n\nexport function formatCreateSuccessMessage(params: {\n\tactorName: string;\n\tdependenciesInstalled: boolean;\n\tpostCreate?: string | null;\n\tgitRepositoryInitialized?: boolean;\n\tinstallCommandSuggestion?: string | null;\n}) {\n\tconst { actorName, dependenciesInstalled, postCreate, gitRepositoryInitialized, installCommandSuggestion } = params;\n\n\tlet message = `✅ Actor '${actorName}' created successfully!`;\n\n\tif (dependenciesInstalled) {\n\t\tmessage += `\\n\\nNext steps:\\n\\ncd '${actorName}'\\napify run`;\n\t} else {\n\t\tconst installLine = installCommandSuggestion || 'install dependencies with your package manager';\n\t\tmessage += `\\n\\nNext steps:\\n\\ncd '${actorName}'\\n${installLine}\\napify run`;\n\t}\n\n\tmessage += `\\n\\n💡 Tip: Use 'apify push' to deploy your Actor to the Apify platform\\n📖 Docs: https://docs.apify.com/platform/actors/development`;\n\n\tif (gitRepositoryInitialized) {\n\t\tmessage += `\\n🌱 Git repository initialized in '${actorName}'. You can now commit and push your Actor to Git.`;\n\t}\n\n\tif (postCreate) {\n\t\tmessage += `\\n\\n${postCreate}`;\n\t}\n\n\treturn message;\n}\n\n/**\n * Inquirer does not have a native way to \"go back\" between prompts.\n */\nasync function executePrompts(manifest: Manifest) {\n\tconst programmingLanguage = await promptProgrammingLanguage();\n\n\twhile (true) {\n\t\tconst templateDefinition = await promptTemplateDefinition(manifest, programmingLanguage);\n\t\tif (templateDefinition) {\n\t\t\tconst shouldInstall = await promptTemplateInstallation();\n\t\t\tif (shouldInstall) {\n\t\t\t\treturn templateDefinition;\n\t\t\t}\n\t\t} else {\n\t\t\treturn executePrompts(manifest);\n\t\t}\n\t}\n}\n\nasync function promptActorName() {\n\tconst answer = await useUserInput({\n\t\tmessage: 'Name of your new Actor:',\n\t\tvalidate: (promptText) => {\n\t\t\ttry {\n\t\t\t\tvalidateActorName(promptText);\n\t\t\t} catch (err) {\n\t\t\t\treturn (err as Error).message;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t});\n\n\treturn answer;\n}\n\nasync function promptProgrammingLanguage() {\n\tconst language = await useSelectFromList<string>({\n\t\tmessage: 'Choose the programming language of your new Actor:',\n\t\tchoices: PROGRAMMING_LANGUAGES,\n\t\tloop: false,\n\t\tdefault: PROGRAMMING_LANGUAGES[0],\n\t});\n\n\treturn language;\n}\n\nasync function promptTemplateDefinition(manifest: Manifest, programmingLanguage: string): Promise<Template | false> {\n\tconst choices: ChoicesType<Template | false> = [\n\t\t...manifest.templates\n\t\t\t.filter((t) => {\n\t\t\t\treturn t.category.toLowerCase() === programmingLanguage.toLowerCase();\n\t\t\t})\n\t\t\t.map((t) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: t.label,\n\t\t\t\t\tvalue: t,\n\t\t\t\t};\n\t\t\t}),\n\n\t\tnew Separator(),\n\n\t\t{\n\t\t\tname: 'Go back',\n\t\t\tvalue: false,\n\t\t},\n\t];\n\n\tconst templateDefinition = await useSelectFromList({\n\t\tmessage: 'Choose a template for your new Actor. You can check more information at https://apify.com/templates.',\n\t\tdefault: choices[0],\n\t\tchoices,\n\t\tloop: false,\n\t\tpageSize: 8,\n\t});\n\n\treturn templateDefinition;\n}\n\nasync function promptTemplateInstallation() {\n\tconst choices: ChoicesType<boolean> = [\n\t\t{ name: `Install dependencies`, value: true },\n\t\tnew Separator(),\n\t\t{ name: 'Go back', value: false },\n\t];\n\n\tconst answer = await useSelectFromList<boolean>({\n\t\tmessage: 'Almost done! Last step is to install dependencies.',\n\t\tdefault: choices[0],\n\t\tchoices,\n\t\tloop: false,\n\t});\n\n\treturn answer;\n}\n","import select from '@inquirer/select';\n\nimport { stdinCheckWrapper } from './_stdinCheckWrapper.js';\n\nexport type ChoicesType<T = unknown> = Parameters<typeof select<T>>[0]['choices'];\n\ninterface UseSelectFromListInput<T> {\n\tmessage: string;\n\tchoices: ChoicesType<T>;\n\tpageSize?: number;\n\tloop?: boolean;\n\tdefault?: unknown;\n}\n\nexport const useSelectFromList = stdinCheckWrapper(\n\tasync ({ message, choices, pageSize, loop, default: defaultValue }: UseSelectFromListInput<unknown>) => {\n\t\tconst result = await select({ message, choices, pageSize, loop, default: defaultValue });\n\n\t\treturn result;\n\t},\n) as <T>(input: UseSelectFromListInput<T>) => Promise<T>;\n","import { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nimport deepClone from 'lodash.clonedeep';\n\nimport { KEY_VALUE_STORE_KEYS } from '@apify/consts';\nimport { validateInputSchema } from '@apify/input_schema';\n\nimport { ACTOR_SPECIFICATION_FOLDER } from './consts.js';\nimport { warning } from './outputs.js';\nimport { Ajv2019, getJsonFileContent, getLocalConfig, getLocalKeyValueStorePath } from './utils.js';\n\nconst DEFAULT_INPUT_SCHEMA_PATHS = [\n\t'.actor/INPUT_SCHEMA.json',\n\t'./INPUT_SCHEMA.json',\n\t'.actor/input_schema.json',\n\t'./input_schema.json',\n];\n\n/**\n * Return the input schema from the default location.\n *\n * When the input schema does not exist, null is returned for schema.\n * In such a case, path would be set to the location\n * where the input schema would be expected to be found (and e.g. can be created there).\n */\nexport const readInputSchema = async (\n\t{ forcePath, cwd }: { forcePath?: string; cwd: string } = { cwd: process.cwd() },\n) => {\n\tif (forcePath) {\n\t\treturn {\n\t\t\tinputSchema: getJsonFileContent(forcePath),\n\t\t\tinputSchemaPath: forcePath,\n\t\t};\n\t}\n\n\tconst localConfig = getLocalConfig(cwd);\n\n\tif (typeof localConfig?.input === 'object') {\n\t\treturn {\n\t\t\tinputSchema: localConfig.input as Record<string, unknown>,\n\t\t\tinputSchemaPath: null,\n\t\t};\n\t}\n\n\tif (typeof localConfig?.input === 'string') {\n\t\tconst fullPath = join(cwd, ACTOR_SPECIFICATION_FOLDER, localConfig.input);\n\t\treturn {\n\t\t\tinputSchema: getJsonFileContent(fullPath),\n\t\t\tinputSchemaPath: fullPath,\n\t\t};\n\t}\n\n\tfor (const path of DEFAULT_INPUT_SCHEMA_PATHS) {\n\t\tconst fullPath = join(cwd, path);\n\t\tif (existsSync(fullPath)) {\n\t\t\treturn {\n\t\t\t\tinputSchema: getJsonFileContent(fullPath),\n\t\t\t\tinputSchemaPath: fullPath,\n\t\t\t};\n\t\t}\n\t}\n\n\t// If not input schema has been found so far, return the first default path\n\t// where the input schema would be expected.\n\treturn {\n\t\tinputSchema: null,\n\t\tinputSchemaPath: join(cwd, DEFAULT_INPUT_SCHEMA_PATHS[0]),\n\t};\n};\n\n/**\n * Goes to the Actor directory and creates INPUT.json file from the input schema prefills.\n\n */\nexport const createPrefilledInputFileFromInputSchema = async (actorFolderDir: string) => {\n\tlet inputFile = {};\n\ttry {\n\t\tconst { inputSchema } = await readInputSchema({ cwd: actorFolderDir });\n\n\t\tif (inputSchema) {\n\t\t\t/**\n\t\t\t * TODO: The logic is copied from @apify-packages/actor -> getPrefillFromInputSchema\n\t\t\t * It is not possible to install the package here because it is private\n\t\t\t * We should move it to @apify/input_schema and use it from there.\n\t\t\t */\n\t\t\tconst validator = new Ajv2019({ strict: false });\n\t\t\tvalidateInputSchema(validator, inputSchema);\n\n\t\t\t// inputFile = _.mapObject(inputSchema.properties as any, (fieldSchema) =>\n\t\t\t// \tfieldSchema.type === 'boolean' || fieldSchema.editor === 'hidden'\n\t\t\t// \t\t? fieldSchema.default\n\t\t\t// \t\t: fieldSchema.prefill,\n\t\t\t// );\n\t\t\tinputFile = Object.entries(inputSchema.properties as any).reduce(\n\t\t\t\t(acc, [key, fieldSchema]: [string, any]) => {\n\t\t\t\t\tacc[key] =\n\t\t\t\t\t\tfieldSchema.type === 'boolean' || fieldSchema.editor === 'hidden'\n\t\t\t\t\t\t\t? fieldSchema.default\n\t\t\t\t\t\t\t: fieldSchema.prefill;\n\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, any>,\n\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\twarning({\n\t\t\tmessage: `Could not create default input based on input schema, creating empty input instead. Cause: ${\n\t\t\t\t(err as Error).message\n\t\t\t}`,\n\t\t});\n\t} finally {\n\t\tconst keyValueStorePath = getLocalKeyValueStorePath();\n\t\tconst inputJsonPath = join(actorFolderDir, keyValueStorePath, `${KEY_VALUE_STORE_KEYS.INPUT}.json`);\n\t\twriteFileSync(inputJsonPath, JSON.stringify(inputFile, null, '\\t'));\n\t}\n};\n\nexport const getDefaultsFromInputSchema = (inputSchema: any) => {\n\tconst defaults: Record<string, unknown> = {};\n\n\tfor (const [key, fieldSchema] of Object.entries<any>(inputSchema.properties)) {\n\t\tif (fieldSchema.default !== undefined) {\n\t\t\tdefaults[key] = fieldSchema.default;\n\t\t}\n\t}\n\n\treturn defaults;\n};\n\n// Lots of code copied from @apify-packages/actor, this really should be moved to the shared input_schema package\nexport const getAjvValidator = (inputSchema: any, ajvInstance: import('ajv').Ajv) => {\n\tconst copyOfSchema = deepClone(inputSchema);\n\tcopyOfSchema.required = [];\n\n\tfor (const [inputSchemaFieldKey, inputSchemaField] of Object.entries<any>(inputSchema.properties)) {\n\t\t// `required` field doesn't need to be present in input schema\n\t\tconst isRequired = inputSchema.required?.includes(inputSchemaFieldKey);\n\t\tconst hasDefault = inputSchemaField.default !== undefined;\n\n\t\tif (isRequired && !hasDefault) {\n\t\t\t// If field is required but has default, we act like it's optional because we always have value to use\n\t\t\tcopyOfSchema.required.push(inputSchemaFieldKey);\n\t\t\tif (inputSchemaField.type === 'array') {\n\t\t\t\t// If array is required, it has to have at least 1 item.\n\t\t\t\tinputSchemaField.minItems = Math.max(1, inputSchemaField.minItems || 0);\n\t\t\t}\n\t\t}\n\t}\n\n\tdelete copyOfSchema.$schema;\n\n\treturn ajvInstance.compile(copyOfSchema);\n};\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetDataset } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout } from '../../lib/utils.js';\n\nexport class DatasetsCreateCommand extends ApifyCommand<typeof DatasetsCreateCommand> {\n\tstatic override name = 'create' as const;\n\n\tstatic override description = 'Creates a new dataset for storing structured data on your account.';\n\n\tstatic override args = {\n\t\tdatasetName: Args.string({\n\t\t\tdescription: 'Optional name for the Dataset',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { datasetName } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tif (datasetName) {\n\t\t\tconst existing = await tryToGetDataset(client, datasetName);\n\n\t\t\tif (existing) {\n\t\t\t\terror({ message: 'A Dataset with this name already exists!' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst newDataset = await client.datasets().getOrCreate(datasetName);\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(newDataset);\n\t\t\treturn;\n\t\t}\n\n\t\tsuccess({\n\t\t\tmessage: `Dataset with ID ${chalk.yellow(newDataset.id)}${datasetName ? ` (called ${chalk.yellow(datasetName)})` : ''} was created.`,\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import type { ApifyClient, Dataset, DatasetClient, KeyValueStore, KeyValueStoreClient } from 'apify-client';\n\nimport { getLocalUserInfo } from '../utils.js';\n\ntype ReturnTypeForStorage<T extends 'dataset' | 'keyValueStore'> = T extends 'dataset'\n\t? {\n\t\t\tdataset: Dataset;\n\t\t\tdatasetClient: DatasetClient;\n\t\t}\n\t: { keyValueStore: KeyValueStore; keyValueStoreClient: KeyValueStoreClient };\n\nasync function tryToGetStorage<T extends 'dataset' | 'keyValueStore'>(\n\tclient: ApifyClient,\n\tid: string,\n\tstorageType: T,\n): Promise<ReturnTypeForStorage<T> | null> {\n\tconst byIdOrName = await client[storageType](id)\n\t\t.get()\n\t\t.catch(() => undefined);\n\n\tif (byIdOrName) {\n\t\treturn {\n\t\t\t[storageType]: byIdOrName,\n\t\t\t[`${storageType}Client`]: client[storageType](byIdOrName.id),\n\t\t} as ReturnTypeForStorage<T>;\n\t}\n\n\tconst info = await getLocalUserInfo();\n\n\tconst byName = await client[storageType](`${info.username!}/${id}`)\n\t\t.get()\n\t\t.catch(() => undefined);\n\n\tif (byName) {\n\t\treturn {\n\t\t\t[storageType]: byName,\n\t\t\t[`${storageType}Client`]: client[storageType](byName.id),\n\t\t} as ReturnTypeForStorage<T>;\n\t}\n\n\treturn null;\n}\n\nexport async function tryToGetDataset(\n\tclient: ApifyClient,\n\tdatasetId: string,\n): Promise<{ dataset: Dataset; datasetClient: DatasetClient } | null> {\n\treturn tryToGetStorage(client, datasetId, 'dataset');\n}\n\nexport async function tryToGetKeyValueStore(\n\tclient: ApifyClient,\n\tkeyValueStoreId: string,\n): Promise<{ keyValueStore: KeyValueStore; keyValueStoreClient: KeyValueStoreClient } | null> {\n\treturn tryToGetStorage(client, keyValueStoreId, 'keyValueStore');\n}\n","import { type ApifyClient, type Dataset, type DatasetClient, DownloadItemsFormat } from 'apify-client';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow } from '../../lib/utils.js';\n\nconst downloadFormatToContentType: Record<DownloadItemsFormat, string> = {\n\t[DownloadItemsFormat.JSON]: 'application/json',\n\t[DownloadItemsFormat.JSONL]: 'application/jsonl',\n\t[DownloadItemsFormat.CSV]: 'text/csv',\n\t[DownloadItemsFormat.HTML]: 'text/html',\n\t[DownloadItemsFormat.RSS]: 'application/rss+xml',\n\t[DownloadItemsFormat.XML]: 'application/xml',\n\t[DownloadItemsFormat.XLSX]: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n};\n\nexport class DatasetsGetItems extends ApifyCommand<typeof DatasetsGetItems> {\n\tstatic override name = 'get-items' as const;\n\n\tstatic override description = 'Retrieves dataset items in specified format (JSON, CSV, etc).';\n\n\tstatic override flags = {\n\t\tlimit: Flags.integer({\n\t\t\tdescription:\n\t\t\t\t'The amount of elements to get from the dataset. By default, it will return all available items.',\n\t\t}),\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'The offset in the dataset where to start getting items.',\n\t\t}),\n\t\tformat: Flags.string({\n\t\t\tdescription: \"The format of the returned output. By default, it is set to 'json'\",\n\t\t\tchoices: Object.keys(downloadFormatToContentType) as DownloadItemsFormat[],\n\t\t\tdefault: DownloadItemsFormat.JSON,\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tdatasetId: Args.string({\n\t\t\tdescription: 'The ID of the Dataset to export the items for',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { limit, offset, format } = this.flags;\n\t\tconst { datasetId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeDataset = await this.tryToGetDataset(apifyClient, datasetId);\n\n\t\tif (!maybeDataset) {\n\t\t\terror({ message: `Dataset with ID \"${datasetId}\" not found.` });\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { datasetClient } = maybeDataset;\n\n\t\t// Write something already to stdout\n\t\tprocess.stdout.write('');\n\n\t\tconst result = await datasetClient.downloadItems(format, {\n\t\t\tlimit,\n\t\t\toffset,\n\t\t});\n\n\t\tconst contentType = downloadFormatToContentType[format] ?? 'application/octet-stream';\n\n\t\tsimpleLog({ message: contentType });\n\n\t\tprocess.stdout.write(result);\n\t\tprocess.stdout.write('\\n');\n\t}\n\n\tprivate async tryToGetDataset(\n\t\tclient: ApifyClient,\n\t\tdatasetId: string,\n\t): Promise<{ dataset: Dataset | undefined; datasetClient: DatasetClient } | null> {\n\t\tconst byIdOrName = await client\n\t\t\t.dataset(datasetId)\n\t\t\t.get()\n\t\t\t.catch(() => undefined);\n\n\t\tif (byIdOrName) {\n\t\t\treturn {\n\t\t\t\tdataset: byIdOrName,\n\t\t\t\tdatasetClient: client.dataset(byIdOrName.id),\n\t\t\t};\n\t\t}\n\n\t\tconst info = await getLocalUserInfo();\n\n\t\tconst byName = await client\n\t\t\t.dataset(`${info.username!}/${datasetId}`)\n\t\t\t.get()\n\t\t\t.catch(() => undefined);\n\n\t\tif (byName) {\n\t\t\treturn {\n\t\t\t\tdataset: byName,\n\t\t\t\tdatasetClient: client.dataset(byName.id),\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n}\n","import type { Task } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { getUserPlanPricing } from '../../lib/commands/storage-size.js';\nimport { tryToGetDataset } from '../../lib/commands/storages.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\nconst consoleLikeTable = new ResponsiveTable({\n\tallColumns: ['Row1', 'Row2'],\n\tmandatoryColumns: ['Row1', 'Row2'],\n});\n\nexport class DatasetsInfoCommand extends ApifyCommand<typeof DatasetsInfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Prints information about a specific dataset.';\n\n\tstatic override args = {\n\t\tstoreId: Args.string({\n\t\t\tdescription: 'The dataset store ID to print information about.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { storeId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetDataset(apifyClient, storeId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${storeId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { dataset: info } = maybeStore;\n\n\t\tconst [user, actor, run] = await Promise.all([\n\t\t\tapifyClient\n\t\t\t\t.user(info.userId)\n\t\t\t\t.get()\n\t\t\t\t.then((u) => u!),\n\t\t\tinfo.actId ? apifyClient.actor(info.actId).get() : Promise.resolve(undefined),\n\t\t\tinfo.actRunId ? apifyClient.run(info.actRunId).get() : Promise.resolve(undefined),\n\t\t]);\n\n\t\tlet task: Task | undefined;\n\n\t\tif (run?.actorTaskId) {\n\t\t\ttask = await apifyClient\n\t\t\t\t.task(run.actorTaskId)\n\t\t\t\t.get()\n\t\t\t\t.catch(() => undefined);\n\t\t}\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout({\n\t\t\t\t...info,\n\t\t\t\tuser,\n\t\t\t\tactor: actor || null,\n\t\t\t\trun: run || null,\n\t\t\t\ttask: task || null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst fullSizeInBytes = info.stats?.storageBytes || 0;\n\t\tconst readCount = info.stats?.readCount || 0;\n\t\tconst writeCount = info.stats?.writeCount || 0;\n\t\tconst cleanCount = (info.cleanItemCount || 0).toLocaleString('en-US');\n\t\tconst totalCount = (info.itemCount || 0).toLocaleString('en-US');\n\n\t\tconst operationsParts = [\n\t\t\t`${chalk.bold(readCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(readCount, 'read', 'reads'))}`,\n\t\t\t`${chalk.bold(writeCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(writeCount, 'write', 'writes'))}`,\n\t\t];\n\n\t\tlet row3 = `Items: ${chalk.bold(cleanCount)} ${chalk.gray('clean')} / ${chalk.bold(totalCount)} ${chalk.gray('total')}\\nOperations: ${operationsParts.join(' / ')}`;\n\n\t\tif (user.plan) {\n\t\t\tconst pricing = getUserPlanPricing(user.plan);\n\n\t\t\tif (pricing) {\n\t\t\t\tconst storeCostPerHour =\n\t\t\t\t\tpricing.KEY_VALUE_STORE_TIMED_STORAGE_GBYTE_HOURS * (fullSizeInBytes / 1000 ** 3);\n\t\t\t\tconst storeCostPerMonth = storeCostPerHour * 24 * 30;\n\n\t\t\t\tconst usdAmountString =\n\t\t\t\t\tstoreCostPerMonth > 1 ? `$${storeCostPerMonth.toFixed(2)}` : `$${storeCostPerHour.toFixed(3)}`;\n\n\t\t\t\trow3 += `\\nStorage size: ${prettyPrintBytes({ bytes: fullSizeInBytes, shortBytes: true, precision: 1 })} / ${chalk.gray(`${usdAmountString} per month`)}`;\n\t\t\t}\n\t\t} else {\n\t\t\trow3 += `\\nStorage size: ${prettyPrintBytes({ bytes: fullSizeInBytes, shortBytes: true, precision: 1 })}`;\n\t\t}\n\n\t\tconst row1 = [\n\t\t\t`Dataset ID: ${chalk.bgGray(info.id)}`,\n\t\t\t`Name: ${info.name ? chalk.bgGray(info.name) : chalk.bold(chalk.italic('Unnamed'))}`,\n\t\t\t`Created: ${chalk.bold(TimestampFormatter.display(info.createdAt))}`,\n\t\t\t`Modified: ${chalk.bold(TimestampFormatter.display(info.modifiedAt))}`,\n\t\t].join('\\n');\n\n\t\tlet runInfo = chalk.bold('—');\n\n\t\tif (info.actRunId) {\n\t\t\tif (run) {\n\t\t\t\trunInfo = chalk.bgBlue(run.id);\n\t\t\t} else {\n\t\t\t\trunInfo = chalk.italic(chalk.gray('Run removed'));\n\t\t\t}\n\t\t}\n\n\t\tlet actorInfo = chalk.bold('—');\n\n\t\tif (actor) {\n\t\t\tactorInfo = chalk.blue(actor.title || actor.name);\n\t\t}\n\n\t\tlet taskInfo = chalk.bold('—');\n\n\t\tif (task) {\n\t\t\ttaskInfo = chalk.blue(task.title || task.name);\n\t\t}\n\n\t\tconst row2 = [`Run: ${runInfo}`, `Actor: ${actorInfo}`, `Task: ${taskInfo}`].join('\\n');\n\n\t\tconsoleLikeTable.pushRow({\n\t\t\tRow1: row1,\n\t\t\tRow2: row2,\n\t\t});\n\n\t\tconst rendered = consoleLikeTable.render(CompactMode.NoLines);\n\n\t\tconst rows = rendered.split('\\n').map((row) => row.trim());\n\n\t\t// Remove the first row\n\t\trows.shift();\n\n\t\tconst message = [\n\t\t\t`${chalk.bold(info.name || chalk.italic('Unnamed'))}`,\n\t\t\t`${chalk.gray(info.name ? `${user.username}/${info.name}` : info.id)} ${chalk.gray('Owned by')} ${chalk.blue(user.username)}`,\n\t\t\t'',\n\t\t\trows.join('\\n'),\n\t\t\t'',\n\t\t\trow3,\n\t\t].join('\\n');\n\n\t\tsimpleLog({ message, stdout: true });\n\t}\n}\n","import type { UserPlan } from 'apify-client';\n\nexport function getUserPlanPricing(userPlan: UserPlan) {\n\tconst planPricing = Reflect.get(userPlan, 'planPricing');\n\n\tif (!planPricing) {\n\t\treturn null;\n\t}\n\n\treturn Reflect.get(planPricing, 'chargeableServiceUnitPricesUsd') as {\n\t\tDATASET_TIMED_STORAGE_GBYTE_HOURS: number;\n\t\tKEY_VALUE_STORE_TIMED_STORAGE_GBYTE_HOURS: number;\n\t} | null;\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { info, simpleLog } from '../../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\nconst table = new ResponsiveTable({\n\tallColumns: ['Dataset ID', 'Name', 'Items', 'Size', 'Created', 'Modified'],\n\tmandatoryColumns: ['Dataset ID', 'Name', 'Items', 'Size'],\n\tcolumnAlignments: {\n\t\tItems: 'right',\n\t},\n});\n\nexport class DatasetsLsCommand extends ApifyCommand<typeof DatasetsLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Prints all datasets on your account.';\n\n\tstatic override flags = {\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'Number of datasets that will be skipped.',\n\t\t\tdefault: 0,\n\t\t}),\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'Number of datasets that will be listed.',\n\t\t\tdefault: 20,\n\t\t}),\n\t\tdesc: Flags.boolean({\n\t\t\tdescription: 'Sorts datasets in descending order.',\n\t\t\tdefault: false,\n\t\t}),\n\t\tunnamed: Flags.boolean({\n\t\t\tdescription: \"Lists datasets that don't have a name set.\",\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { desc, offset, limit, json, unnamed } = this.flags;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst user = await getLocalUserInfo();\n\n\t\tconst rawDatasetList = await client.datasets().list({ desc, offset, limit, unnamed });\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(rawDatasetList);\n\t\t\treturn;\n\t\t}\n\n\t\tif (rawDatasetList.count === 0) {\n\t\t\tinfo({\n\t\t\t\tmessage: \"You don't have any Datasets on your account\",\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const dataset of rawDatasetList.items) {\n\t\t\t// TODO: update apify-client types\n\t\t\tconst size = Reflect.get(dataset.stats, 's3StorageBytes') as number | undefined;\n\n\t\t\ttable.pushRow({\n\t\t\t\t'Dataset ID': dataset.id,\n\t\t\t\tCreated: TimestampFormatter.display(dataset.createdAt),\n\t\t\t\tItems: `${dataset.itemCount}`,\n\t\t\t\tModified: TimestampFormatter.display(dataset.modifiedAt),\n\t\t\t\tName: dataset.name ? `${user.username!}/${dataset.name}` : '',\n\t\t\t\tSize:\n\t\t\t\t\ttypeof size === 'number'\n\t\t\t\t\t\t? prettyPrintBytes({ bytes: size, shortBytes: true, colorFunc: chalk.gray, precision: 0 })\n\t\t\t\t\t\t: chalk.gray('N/A'),\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: table.render(CompactMode.WebLikeCompact),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { cachedStdinInput } from '../../entrypoints/_shared.js';\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetDataset } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class DatasetsPushDataCommand extends ApifyCommand<typeof DatasetsPushDataCommand> {\n\tstatic override name = 'push-items' as const;\n\n\tstatic override description = 'Adds data items to specified dataset. Accepts single object or array of objects.';\n\n\tstatic override args = {\n\t\tnameOrId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The dataset ID or name to push the objects to',\n\t\t\tignoreStdin: true,\n\t\t}),\n\t\titem: Args.string({\n\t\t\tdescription: 'The object or array of objects to be pushed.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { nameOrId, item: _item } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst existingDataset = await tryToGetDataset(client, nameOrId);\n\n\t\tif (!existingDataset) {\n\t\t\terror({\n\t\t\t\tmessage: `Dataset with ID or name \"${nameOrId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { datasetClient, dataset } = existingDataset;\n\n\t\tlet parsedData: Record<string, unknown> | Record<string, unknown>[];\n\n\t\tconst item = _item || cachedStdinInput;\n\n\t\tif (!item) {\n\t\t\terror({ message: 'No items were provided.' });\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tparsedData = JSON.parse(item.toString('utf8'));\n\t\t} catch (err) {\n\t\t\terror({\n\t\t\t\tmessage: `Failed to parse data as JSON string: ${(err as Error).message}`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (Array.isArray(parsedData) && parsedData.length === 0) {\n\t\t\terror({\n\t\t\t\tmessage: 'No items were provided.',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst idMessage = dataset.name\n\t\t\t? `Dataset named ${chalk.yellow(dataset.name)} (${chalk.gray('ID:')} ${chalk.yellow(dataset.id)})`\n\t\t\t: `Dataset with ID ${chalk.yellow(dataset.id)}`;\n\n\t\ttry {\n\t\t\tawait datasetClient.pushItems(parsedData);\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `${this.pluralString(Array.isArray(parsedData) ? parsedData.length : 1, 'Object', 'Objects')} pushed to ${idMessage} successfully.`,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to push items into ${idMessage}\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { tryToGetDataset } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class DatasetsRenameCommand extends ApifyCommand<typeof DatasetsRenameCommand> {\n\tstatic override name = 'rename' as const;\n\n\tstatic override description = 'Change dataset name or removes name with --unname flag.';\n\n\tstatic override flags = {\n\t\tunname: Flags.boolean({\n\t\t\tdescription: 'Removes the unique name of the dataset.',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tnameOrId: Args.string({\n\t\t\tdescription: 'The dataset ID or name to delete.',\n\t\t\trequired: true,\n\t\t}),\n\t\tnewName: Args.string({\n\t\t\tdescription: 'The new name for the dataset.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { unname } = this.flags;\n\t\tconst { newName, nameOrId } = this.args;\n\n\t\tif (!newName && !unname) {\n\t\t\terror({ message: 'You must provide either a new name or the --unname flag.' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (newName && unname) {\n\t\t\terror({\n\t\t\t\tmessage: 'You cannot provide a new name and the --unname flag.',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst existingDataset = await tryToGetDataset(client, nameOrId);\n\n\t\tif (!existingDataset) {\n\t\t\terror({\n\t\t\t\tmessage: `Dataset with ID or name \"${nameOrId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, name } = existingDataset.dataset;\n\n\t\tconst successMessage = (() => {\n\t\t\tif (!name) {\n\t\t\t\treturn `The name of the dataset with ID ${chalk.yellow(id)} has been set to: ${chalk.yellow(newName)}`;\n\t\t\t}\n\n\t\t\tif (unname) {\n\t\t\t\treturn `The name of the dataset with ID ${chalk.yellow(id)} has been removed (was ${chalk.yellow(name)} previously).`;\n\t\t\t}\n\n\t\t\treturn `The name of the dataset with ID ${chalk.yellow(id)} was changed from ${chalk.yellow(name)} to ${chalk.yellow(newName)}.`;\n\t\t})();\n\n\t\ttry {\n\t\t\tawait existingDataset.datasetClient.update({ name: unname ? (null as never) : newName! });\n\n\t\t\tsuccess({\n\t\t\t\tmessage: successMessage,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to rename dataset with ID ${chalk.yellow(id)}\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetDataset } from '../../lib/commands/storages.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class DatasetsRmCommand extends ApifyCommand<typeof DatasetsRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Permanently removes a dataset.';\n\n\tstatic override args = {\n\t\tdatasetNameOrId: Args.string({\n\t\t\tdescription: 'The dataset ID or name to delete',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { datasetNameOrId } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tconst existingDataset = await tryToGetDataset(client, datasetNameOrId);\n\n\t\tif (!existingDataset) {\n\t\t\terror({\n\t\t\t\tmessage: `Dataset with ID or name \"${datasetNameOrId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst confirmed = await useYesNoConfirm({\n\t\t\tmessage: `Are you sure you want to delete this Dataset?`,\n\t\t});\n\n\t\tif (!confirmed) {\n\t\t\tinfo({ message: 'Dataset deletion has been aborted.' });\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, name } = existingDataset.dataset;\n\n\t\ttry {\n\t\t\tawait existingDataset.datasetClient.delete();\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `Dataset with ID ${chalk.yellow(id)}${name ? ` (called ${chalk.yellow(name)})` : ''} has been deleted.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to delete dataset with ID ${chalk.yellow(id)}\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { DatasetsCreateCommand } from './create.js';\nimport { DatasetsGetItems } from './get-items.js';\nimport { DatasetsInfoCommand } from './info.js';\nimport { DatasetsLsCommand } from './ls.js';\nimport { DatasetsPushDataCommand } from './push-items.js';\nimport { DatasetsRenameCommand } from './rename.js';\nimport { DatasetsRmCommand } from './rm.js';\n\nexport class DatasetsIndexCommand extends ApifyCommand<typeof DatasetsIndexCommand> {\n\tstatic override name = 'datasets' as const;\n\n\tstatic override description = 'Manages structured data storage and retrieval.';\n\n\tstatic override subcommands = [\n\t\tDatasetsCreateCommand,\n\t\tDatasetsGetItems,\n\t\tDatasetsLsCommand,\n\t\tDatasetsInfoCommand,\n\t\tDatasetsRmCommand,\n\t\tDatasetsRenameCommand,\n\t\tDatasetsPushDataCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport type { Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { dirname } from 'node:path';\n\nimport cors from 'cors';\nimport detectIndent from 'detect-indent';\nimport express from 'express';\nimport open from 'open';\n\nimport { cryptoRandomObjectId } from '@apify/utilities';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { LOCAL_CONFIG_PATH } from '../lib/consts.js';\nimport { readInputSchema } from '../lib/input_schema.js';\nimport { error, info, success, warning } from '../lib/outputs.js';\n\nconst INPUT_SCHEMA_EDITOR_BASE_URL = 'https://apify.github.io/input-schema-editor-react/';\nconst INPUT_SCHEMA_EDITOR_ORIGIN = new URL(INPUT_SCHEMA_EDITOR_BASE_URL).origin;\n\n// Not really checked right now, but it might come useful if we ever need to do some breaking changes\nconst API_VERSION = 'v1';\n\nexport class EditInputSchemaCommand extends ApifyCommand<typeof EditInputSchemaCommand> {\n\tstatic override name = 'edit-input-schema' as const;\n\n\tstatic override description =\n\t\t'Lets you edit your input schema that would be used on the platform in a visual input schema editor.';\n\n\tstatic override args = {\n\t\tpath: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription:\n\t\t\t\t'Optional path to your INPUT_SCHEMA.json file. If not provided default platform location for input schema is used.',\n\t\t}),\n\t};\n\n\tstatic override hidden = true;\n\n\tstatic override aliases = ['eis'];\n\n\tasync run() {\n\t\t// This call fails if no input schema is found on any of the default locations\n\t\tconst { inputSchema: existingSchema, inputSchemaPath } = await readInputSchema({\n\t\t\tforcePath: this.args.path,\n\t\t\tcwd: process.cwd(),\n\t\t});\n\n\t\tif (existingSchema && !inputSchemaPath) {\n\t\t\t// If path is not returned, it means the input schema must be directly embedded as object in actor.json\n\t\t\t// TODO - allow editing input schema embedded in actor.json\n\t\t\tthrow new Error(\n\t\t\t\t`Editing an input schema directly embedded in '${LOCAL_CONFIG_PATH}' is not yet supported.`,\n\t\t\t);\n\t\t}\n\n\t\twarning({ message: 'This command is still experimental and might break at any time. Use at your own risk.\\n' });\n\t\tinfo({ message: `Editing input schema at \"${inputSchemaPath}\"...` });\n\n\t\tlet server: Server;\n\t\tconst app = express();\n\n\t\t// To send requests from browser to localhost, CORS has to be configured properly\n\t\tapp.use(\n\t\t\tcors({\n\t\t\t\torigin: INPUT_SCHEMA_EDITOR_ORIGIN,\n\t\t\t\tallowedHeaders: ['Content-Type', 'Authorization'],\n\t\t\t}),\n\t\t);\n\n\t\t// Turn off keepalive, otherwise closing the server when command is finished is lagging\n\t\tapp.use((_, res, next) => {\n\t\t\tres.set('Connection', 'close');\n\t\t\tnext();\n\t\t});\n\n\t\tapp.use(express.json());\n\n\t\t// Basic authorization via a random token, which is passed to the input schema editor,\n\t\t// and that sends it back via the `token` query param, or `Authorization` header\n\t\tconst authToken = cryptoRandomObjectId();\n\t\tapp.use((req, res, next) => {\n\t\t\tlet { token } = req.query;\n\t\t\tif (!token) {\n\t\t\t\tconst authorizationHeader = req.get('Authorization');\n\t\t\t\tif (authorizationHeader) {\n\t\t\t\t\tconst [schema, tokenFromHeader, ...extra] = authorizationHeader.trim().split(/\\s+/);\n\t\t\t\t\tif (schema.toLowerCase() === 'bearer' && tokenFromHeader && extra.length === 0) {\n\t\t\t\t\t\ttoken = tokenFromHeader;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (token !== authToken) {\n\t\t\t\tres.status(401);\n\t\t\t\tres.send('Authorization failed');\n\t\t\t} else {\n\t\t\t\tnext();\n\t\t\t}\n\t\t});\n\n\t\tconst apiRouter = express.Router();\n\t\tapp.use(`/api/${API_VERSION}`, apiRouter);\n\n\t\t// We detect the format of the input schema JSON, so that updating it does not cause too many changes\n\t\tlet jsonIndentation = ' ';\n\t\tlet appendFinalNewline = true;\n\n\t\tapiRouter.get('/input-schema', (_, res) => {\n\t\t\tlet inputSchemaStr;\n\t\t\ttry {\n\t\t\t\tinputSchemaStr = existsSync(inputSchemaPath)\n\t\t\t\t\t? readFileSync(inputSchemaPath, { encoding: 'utf-8' })\n\t\t\t\t\t: '{}\\n';\n\t\t\t\tif (inputSchemaStr.length > 3) {\n\t\t\t\t\tjsonIndentation = detectIndent(inputSchemaStr).indent || jsonIndentation;\n\t\t\t\t}\n\t\t\t\tif (inputSchemaStr) {\n\t\t\t\t\tappendFinalNewline = inputSchemaStr[inputSchemaStr.length - 1] === '\\n';\n\t\t\t\t}\n\t\t\t\tif (existsSync(inputSchemaPath)) {\n\t\t\t\t\tinfo({ message: `Input schema loaded from \"${inputSchemaPath}\"` });\n\t\t\t\t} else {\n\t\t\t\t\tinfo({ message: `Empty input schema initialized.` });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage = `Reading input schema from disk failed with: ${(err as Error).message}`;\n\t\t\t\terror({ message: errorMessage });\n\t\t\t\tres.status(500);\n\t\t\t\tres.send(errorMessage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet inputSchemaObj;\n\t\t\ttry {\n\t\t\t\tinputSchemaObj = JSON.parse(inputSchemaStr || '{}');\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage = `Parsing input schema failed with error: ${(err as Error).message}`;\n\t\t\t\terror({ message: errorMessage });\n\t\t\t\tres.status(500);\n\t\t\t\tres.send(errorMessage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tres.send(inputSchemaObj);\n\t\t\tinfo({ message: 'Input schema sent to editor.' });\n\t\t});\n\n\t\tapiRouter.post('/input-schema', (req, res) => {\n\t\t\ttry {\n\t\t\t\tinfo({ message: 'Got input schema from editor...' });\n\t\t\t\tconst inputSchemaObj = req.body;\n\t\t\t\tlet inputSchemaStr = JSON.stringify(inputSchemaObj, null, jsonIndentation);\n\t\t\t\tif (appendFinalNewline) inputSchemaStr += '\\n';\n\n\t\t\t\tconst inputSchemaDir = dirname(inputSchemaPath);\n\t\t\t\tif (!existsSync(inputSchemaDir)) {\n\t\t\t\t\tmkdirSync(inputSchemaDir, { recursive: true });\n\t\t\t\t}\n\n\t\t\t\twriteFileSync(inputSchemaPath, inputSchemaStr, { encoding: 'utf-8', flag: 'w+' });\n\t\t\t\tres.end();\n\t\t\t\tinfo({ message: 'Input schema saved to disk.' });\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage = `Saving input schema failed with error: ${(err as Error).message}`;\n\t\t\t\terror({ message: errorMessage });\n\t\t\t\tres.status(500);\n\t\t\t\tres.send(errorMessage);\n\t\t\t}\n\t\t});\n\n\t\tapiRouter.post('/exit', (req, res) => {\n\t\t\tif (req.body.isWindowClosed) {\n\t\t\t\tinfo({ message: 'Editor closed, finishing...' });\n\t\t\t} else {\n\t\t\t\tinfo({ message: 'Editing finished, you can close the editor.' });\n\t\t\t}\n\t\t\tres.end();\n\t\t\tserver.close(() => success({ message: 'Done.' }));\n\t\t});\n\n\t\t// Listening on port 0 will assign a random available port\n\t\tserver = app.listen(0);\n\t\tconst { port } = server.address() as AddressInfo;\n\t\tinfo({ message: `Listening for messages from input schema editor on port ${port}...` });\n\n\t\tconst editorUrl = `${INPUT_SCHEMA_EDITOR_BASE_URL}?localCliPort=${port}&localCliToken=${authToken}&localCliApiVersion=${API_VERSION}`;\n\t\tinfo({ message: `Opening input schema editor at \"${editorUrl}\"...` });\n\t\tawait open(editorUrl);\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand, commandRegistry } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { renderHelpForCommand, renderMainHelpMenu } from '../lib/command-framework/help.js';\nimport { useCommandSuggestions } from '../lib/hooks/useCommandSuggestions.js';\nimport { error } from '../lib/outputs.js';\n\nexport class HelpCommand extends ApifyCommand<typeof HelpCommand> {\n\tstatic override name = 'help' as const;\n\n\tstatic override description = 'Prints out help about a command, or all available commands.';\n\n\tstatic override hidden = true;\n\n\tstatic override args = {\n\t\tcommandString: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription: 'The command to get help for.',\n\t\t\tcatchAll: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { commandString } = this.args;\n\n\t\tif (!commandString || commandString.toLowerCase().startsWith('help')) {\n\t\t\tconst helpMenu = renderMainHelpMenu(this.entrypoint);\n\n\t\t\tconsole.log(helpMenu);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst lowercasedCommandString = commandString.toLowerCase();\n\n\t\tconst command = commandRegistry.get(lowercasedCommandString);\n\n\t\tif (!command) {\n\t\t\tconst closestMatches = useCommandSuggestions(lowercasedCommandString);\n\n\t\t\tlet message = chalk.gray(`Command ${chalk.whiteBright(commandString)} not found`);\n\n\t\t\tif (closestMatches.length) {\n\t\t\t\tmessage += '\\n ';\n\t\t\t\tmessage += chalk.gray(\n\t\t\t\t\t`Did you mean: ${closestMatches.map((cmd) => chalk.whiteBright(cmd)).join(', ')}?`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\terror({\n\t\t\t\tmessage,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst helpMenu = renderHelpForCommand(command);\n\n\t\tconsole.log(helpMenu);\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow } from '../lib/utils.js';\n\nexport class InfoCommand extends ApifyCommand<typeof InfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Prints details about your currently authenticated Apify account.';\n\n\tasync run() {\n\t\tawait getLoggedClientOrThrow();\n\t\tconst info = await getLocalUserInfo();\n\n\t\tif (info) {\n\t\t\tconst niceInfo = {\n\t\t\t\tusername: info.username,\n\t\t\t\tuserId: info.id,\n\t\t\t} as const;\n\n\t\t\tfor (const key of Object.keys(niceInfo) as (keyof typeof niceInfo)[]) {\n\t\t\t\tconsole.log(`${chalk.gray(key)}: ${chalk.bold(niceInfo[key])}`);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { basename } from 'node:path';\nimport process from 'node:process';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { Flags } from '../lib/command-framework/flags.js';\nimport { CommandExitCodes, DEFAULT_LOCAL_STORAGE_DIR, EMPTY_LOCAL_CONFIG, LOCAL_CONFIG_PATH } from '../lib/consts.js';\nimport { useActorConfig } from '../lib/hooks/useActorConfig.js';\nimport { ProjectLanguage, useCwdProject } from '../lib/hooks/useCwdProject.js';\nimport { useUserInput } from '../lib/hooks/user-confirmations/useUserInput.js';\nimport { useYesNoConfirm } from '../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { createPrefilledInputFileFromInputSchema } from '../lib/input_schema.js';\nimport { error, info, success, warning } from '../lib/outputs.js';\nimport { wrapScrapyProject } from '../lib/projects/scrapy/wrapScrapyProject.js';\nimport { setLocalConfig, setLocalEnv, validateActorName } from '../lib/utils.js';\n\nexport class InitCommand extends ApifyCommand<typeof InitCommand> {\n\tstatic override name = 'init' as const;\n\n\tstatic override description =\n\t\t`Sets up an Actor project in your current directory by creating actor.json and storage files.\\n` +\n\t\t`If the directory contains a Scrapy project in Python, the command automatically creates wrappers so that you can run your scrapers without changes.\\n` +\n\t\t`Creates the '${LOCAL_CONFIG_PATH}' file and the '${DEFAULT_LOCAL_STORAGE_DIR}' directory in the current directory, but does not touch any other existing files or directories.\\n\\n` +\n\t\t`WARNING: Overwrites existing '${DEFAULT_LOCAL_STORAGE_DIR}' directory.`;\n\n\tstatic override args = {\n\t\tactorName: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription: 'Name of the Actor. If not provided, you will be prompted for it.',\n\t\t}),\n\t};\n\n\tstatic override flags = {\n\t\tyes: Flags.boolean({\n\t\t\tchar: 'y',\n\t\t\tdescription:\n\t\t\t\t'Automatic yes to prompts; assume \"yes\" as answer to all prompts. Note that in some cases, the command may still ask for confirmation.',\n\t\t\trequired: false,\n\t\t}),\n\t\tdockerfile: Flags.string({\n\t\t\tdescription: 'Path to a Dockerfile to use for the Actor (e.g., \"./Dockerfile\" or \"./docker/Dockerfile\").',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tlet { actorName } = this.args;\n\t\tconst cwd = process.cwd();\n\n\t\tconst projectResult = await useCwdProject();\n\n\t\t// TODO: use direct .unwrap() once we migrate to yargs\n\t\tif (projectResult.isErr()) {\n\t\t\terror({ message: projectResult.unwrapErr().message });\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst project = projectResult.unwrap();\n\n\t\tif (project.type === ProjectLanguage.Scrapy) {\n\t\t\tinfo({ message: 'The current directory looks like a Scrapy project. Using automatic project wrapping.' });\n\t\t\tthis.telemetryData.actorWrapper = 'scrapy';\n\n\t\t\treturn wrapScrapyProject({ projectPath: cwd });\n\t\t}\n\n\t\tif (!this.flags.yes && project.type === ProjectLanguage.Unknown) {\n\t\t\twarning({ message: 'The current directory does not look like a Node.js or Python project.' });\n\n\t\t\tconst confirmed = await useYesNoConfirm({\n\t\t\t\tmessage: 'Do you want to continue?',\n\t\t\t\tprovidedConfirmFromStdin: this.flags.yes,\n\t\t\t});\n\n\t\t\tif (!confirmed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst actorConfig = await useActorConfig({ cwd });\n\n\t\tif (actorConfig.isOkAnd((cfg) => cfg.exists && !cfg.migrated)) {\n\t\t\twarning({\n\t\t\t\tmessage: `Skipping creation of '${LOCAL_CONFIG_PATH}', the file already exists in the current directory.`,\n\t\t\t});\n\t\t} else {\n\t\t\tif (actorConfig.isErr()) {\n\t\t\t\terror({ message: actorConfig.unwrapErr().message });\n\t\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!actorName) {\n\t\t\t\tlet response = actorConfig.isOkAnd((cfg) => cfg.exists)\n\t\t\t\t\t? (actorConfig.unwrap().config.name as string)\n\t\t\t\t\t: null;\n\n\t\t\t\t// TODO: see if we can use promptActorName instead\n\t\t\t\twhile (!response) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst answer = await useUserInput({\n\t\t\t\t\t\t\tmessage: 'Actor name:',\n\t\t\t\t\t\t\tdefault: basename(cwd),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tvalidateActorName(answer);\n\n\t\t\t\t\t\tresponse = answer;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror({ message: (err as Error).message });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tactorName = response;\n\t\t\t}\n\n\t\t\t// Migrate apify.json to .actor/actor.json\n\t\t\tconst localConfig = {\n\t\t\t\t...EMPTY_LOCAL_CONFIG,\n\t\t\t\t...actorConfig.unwrap().config,\n\t\t\t};\n\t\t\tconst configToWrite: Record<string, unknown> = {\n\t\t\t\t...localConfig,\n\t\t\t\tname: actorName,\n\t\t\t};\n\n\t\t\t// Add dockerfile field if provided\n\t\t\tif (this.flags.dockerfile) {\n\t\t\t\tconfigToWrite.dockerfile = this.flags.dockerfile;\n\t\t\t}\n\n\t\t\tawait setLocalConfig(configToWrite, cwd);\n\t\t}\n\n\t\tawait setLocalEnv(cwd);\n\n\t\t// Create prefilled INPUT.json file from the input schema prefills\n\t\tawait createPrefilledInputFileFromInputSchema(cwd);\n\n\t\tsuccess({ message: 'The Actor has been initialized in the current directory.' });\n\t}\n}\n","import {\n\tappendFileSync,\n\tcopyFileSync,\n\tcreateWriteStream,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trmSync,\n\twriteFileSync,\n} from 'node:fs';\nimport { basename, join, relative, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport rootWalk from '@root/walk';\nimport ConfigParser from 'configparser';\nimport Handlebars from 'handlebars';\n\nimport { fetchManifest, wrapperManifestUrl } from '@apify/actor-templates';\n\nimport { useSelectFromList } from '../../hooks/user-confirmations/useSelectFromList.js';\nimport { info, success } from '../../outputs.js';\nimport { downloadAndUnzip, sanitizeActorName } from '../../utils.js';\nimport { ScrapyProjectAnalyzer } from './ScrapyProjectAnalyzer.js';\n\n/**\n * Files that should be concatenated instead of copied (and overwritten).\n */\nconst concatenableFiles = ['.dockerignore', '.gitignore'];\n\nconst templatePath = fileURLToPath(new URL('./templates/python-scrapy', import.meta.url));\n\nasync function merge(\n\tfromPath: string,\n\ttoPath: string,\n\toptions: { bindings: Record<string, string> } = { bindings: {} },\n) {\n\tawait rootWalk.walk(fromPath, async (_err, pathname, dirent) => {\n\t\tif (pathname === fromPath) return;\n\t\tconst relPath = relative(fromPath, pathname);\n\t\tconst toRelPath = relPath\n\t\t\t.split(sep)\n\t\t\t.map((part) => {\n\t\t\t\tif (part.startsWith('{') && part.endsWith('}')) {\n\t\t\t\t\tpart = part.replace('{', '').replace('}', '');\n\t\t\t\t\tconst binding = options.bindings[part];\n\t\t\t\t\tif (!binding) {\n\t\t\t\t\t\tthrow new Error(`Binding for ${part} not found.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn binding;\n\t\t\t\t}\n\t\t\t\treturn part;\n\t\t\t})\n\t\t\t.join(sep);\n\n\t\tconst targetPath = join(toPath, toRelPath);\n\n\t\tif (dirent.isDirectory()) {\n\t\t\tif (!existsSync(targetPath)) {\n\t\t\t\tmkdirSync(targetPath);\n\t\t\t}\n\n\t\t\treturn merge(pathname, targetPath);\n\t\t}\n\n\t\tif (relPath.includes('.template')) {\n\t\t\twriteFileSync(\n\t\t\t\tjoin(toPath, toRelPath.replace('.template', '')),\n\t\t\t\tHandlebars.compile(readFileSync(pathname, 'utf8'))(options.bindings),\n\t\t\t);\n\t\t} else if (existsSync(targetPath) && concatenableFiles.includes(basename(toRelPath))) {\n\t\t\tappendFileSync(targetPath, readFileSync(pathname));\n\t\t} else {\n\t\t\tcopyFileSync(pathname, targetPath);\n\t\t}\n\t});\n}\n\nexport async function wrapScrapyProject({ projectPath }: { projectPath?: string }) {\n\tif (!projectPath) {\n\t\tprojectPath = '.';\n\t}\n\n\tconst analyzer = new ScrapyProjectAnalyzer(projectPath);\n\n\tif (analyzer.configuration.hasSection('apify')) {\n\t\tthrow new Error(\n\t\t\t`The Scrapy project configuration already contains Apify settings. Are you sure you didn't already wrap this project?`,\n\t\t);\n\t}\n\n\tawait analyzer.init();\n\n\tconst spiderIndex = await useSelectFromList({\n\t\tmessage: 'Pick the Scrapy spider you want to wrap:',\n\t\tchoices: analyzer.getAvailableSpiders().map((spider, i) => ({\n\t\t\tname: `${spider.class_name} (${spider.pathname})`,\n\t\t\tvalue: i,\n\t\t})),\n\t});\n\n\tfunction translatePathToRelativeModuleName(pathname: string) {\n\t\tconst relPath = relative(projectPath!, pathname);\n\n\t\treturn `.${relPath.split(sep).slice(1).join('.').replace('.py', '')}`;\n\t}\n\n\tconst templateBindings = {\n\t\tbotName: sanitizeActorName(analyzer.settings!.BOT_NAME),\n\t\tscrapy_settings_module: analyzer.configuration.get('settings', 'default')!,\n\t\tapify_module_path: `${analyzer.settings!.BOT_NAME}.apify`,\n\t\tspider_class_name: analyzer.getAvailableSpiders()[spiderIndex].class_name,\n\t\tspider_module_name: `${translatePathToRelativeModuleName(\n\t\t\tanalyzer.getAvailableSpiders()[spiderIndex].pathname,\n\t\t)}`,\n\t\tprojectFolder: analyzer.settings!.BOT_NAME,\n\t};\n\n\tconst manifest = await fetchManifest(wrapperManifestUrl);\n\n\tinfo({ message: 'Downloading the latest Scrapy wrapper template...' });\n\n\tconst { archiveUrl } = manifest.templates.find(({ id }) => id === 'python-scrapy')!;\n\n\tif (existsSync(templatePath)) rmSync(templatePath, { recursive: true });\n\n\tawait downloadAndUnzip({\n\t\turl: archiveUrl,\n\t\tpathTo: templatePath,\n\t});\n\n\tinfo({ message: 'Wrapping the Scrapy project...' });\n\n\tawait merge(templatePath, projectPath, {\n\t\tbindings: templateBindings,\n\t});\n\n\tconst apifyConf = new ConfigParser();\n\tapifyConf.addSection('apify');\n\tapifyConf.set('apify', 'mainpy_location', analyzer.settings!.BOT_NAME);\n\n\tconst s = createWriteStream(join(projectPath, 'scrapy.cfg'), { flags: 'a' });\n\n\tawait new Promise<void>((r) => {\n\t\ts.on('open', (fd) => {\n\t\t\ts.write('\\n', () => {\n\t\t\t\tapifyConf.write(fd);\n\t\t\t\tr();\n\t\t\t});\n\t\t});\n\t});\n\n\tsuccess({ message: 'The Scrapy project has been wrapped successfully.' });\n}\n","import { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { info } from '../lib/outputs.js';\nimport { wrapScrapyProject } from '../lib/projects/scrapy/wrapScrapyProject.js';\n\nexport class WrapScrapyCommand extends ApifyCommand<typeof WrapScrapyCommand> {\n\tstatic override name = 'init-wrap-scrapy' as const;\n\n\tstatic override description = `Wraps your existing Scrapy project to work like an Apify Actor.\n\nIt adds the following features:\n- Automatic retry of failed requests\n- Automatic proxy rotation\n- Automatic user agent rotation\n...\n`;\n\n\tstatic override args = {\n\t\tpath: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription: 'Optional path to your scrapy project. If not provided, the current directory is used.',\n\t\t}),\n\t};\n\n\tstatic override hidden = true;\n\n\tasync run() {\n\t\tawait wrapScrapyProject({ projectPath: this.args.path });\n\n\t\tinfo({ message: 'Scrapy project wrapped successfully.' });\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout } from '../../lib/utils.js';\n\nexport class KeyValueStoresCreateCommand extends ApifyCommand<typeof KeyValueStoresCreateCommand> {\n\tstatic override name = 'create' as const;\n\n\tstatic override description = 'Creates a new key-value store on your account.';\n\n\tstatic override args = {\n\t\t'key-value store name': Args.string({\n\t\t\tdescription: 'Optional name for the key-value store',\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { keyValueStoreName } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tif (keyValueStoreName) {\n\t\t\tconst existing = await tryToGetKeyValueStore(client, keyValueStoreName);\n\n\t\t\tif (existing) {\n\t\t\t\terror({ message: 'Cannot create a key-value store with the same name!' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst newStore = await client.keyValueStores().getOrCreate(keyValueStoreName);\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(newStore);\n\t\t\treturn;\n\t\t}\n\n\t\tsuccess({\n\t\t\tmessage: `Key-value store with ID ${chalk.yellow(newStore.id)}${keyValueStoreName ? ` (called ${chalk.yellow(keyValueStoreName)})` : ''} was created.`,\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class KeyValueStoresDeleteValueCommand extends ApifyCommand<typeof KeyValueStoresDeleteValueCommand> {\n\tstatic override name = 'delete-value' as const;\n\n\tstatic override description = 'Delete a value from a key-value store.';\n\n\tstatic override args = {\n\t\t'store id': Args.string({\n\t\t\tdescription: 'The key-value store ID to delete the value from.',\n\t\t\trequired: true,\n\t\t}),\n\t\titemKey: Args.string({\n\t\t\tdescription: 'The key of the item in the key-value store.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { storeId, itemKey } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetKeyValueStore(apifyClient, storeId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${storeId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keyValueStoreClient: client } = maybeStore;\n\n\t\tconst existing = await client.getRecord(itemKey);\n\n\t\tif (!existing) {\n\t\t\terror({\n\t\t\t\tmessage: `Item with key \"${itemKey}\" not found in the key-value store.`,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst confirm = await useYesNoConfirm({\n\t\t\tmessage: `Are you sure you want to delete this record?`,\n\t\t});\n\n\t\tif (!confirm) {\n\t\t\tinfo({ message: 'Key-value store record deletion aborted.', stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait client.deleteRecord(itemKey);\n\t\t\tinfo({\n\t\t\t\tmessage: `Record with key \"${chalk.yellow(itemKey)}\" deleted from the key-value store.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to delete record with key \"${itemKey}\" from the key-value store.\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class KeyValueStoresGetValueCommand extends ApifyCommand<typeof KeyValueStoresGetValueCommand> {\n\tstatic override name = 'get-value' as const;\n\n\tstatic override description =\n\t\t'Retrieves stored value for specified key. Use --only-content-type to check MIME type.';\n\n\tstatic override flags = {\n\t\t'only-content-type': Flags.boolean({\n\t\t\tdescription: 'Only return the content type of the specified key',\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tkeyValueStoreId: Args.string({\n\t\t\tdescription: 'The key-value store ID to get the value from.',\n\t\t\trequired: true,\n\t\t}),\n\t\titemKey: Args.string({\n\t\t\tdescription: 'The key of the item in the key-value store.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { onlyContentType } = this.flags;\n\t\tconst { keyValueStoreId, itemKey } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetKeyValueStore(apifyClient, keyValueStoreId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({ message: `Key-value store with ID \"${keyValueStoreId}\" not found.` });\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keyValueStoreClient: storeClient } = maybeStore;\n\n\t\tconst itemRecord = await storeClient.getRecord(itemKey, { stream: true });\n\n\t\tif (!itemRecord) {\n\t\t\terror({ message: `Item with key \"${itemKey}\" not found in the key-value store.` });\n\t\t\treturn;\n\t\t}\n\n\t\t// Print out the content-type on stderr (default to octet-stream for unknown content types)\n\t\tsimpleLog({ message: itemRecord.contentType ?? 'application/octet-stream' });\n\n\t\tif (onlyContentType) {\n\t\t\t// Close the stream as otherwise the process hangs\n\t\t\titemRecord.value.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to pretty-print JSON\n\t\tif (itemRecord.contentType?.includes('application/json')) {\n\t\t\tconst { value: stream } = itemRecord;\n\n\t\t\tconst chunks: Buffer[] = [];\n\n\t\t\tfor await (const chunk of stream) {\n\t\t\t\tchunks.push(chunk);\n\t\t\t}\n\n\t\t\tconst concatenated = Buffer.concat(chunks).toString();\n\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(concatenated);\n\t\t\t\tsimpleLog({ message: JSON.stringify(parsed, null, 2), stdout: true });\n\t\t\t} catch {\n\t\t\t\t// Print out as is directly to stdout\n\t\t\t\tsimpleLog({ message: concatenated, stdout: true });\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// pipe the output to stdout\n\t\titemRecord.value.pipe(process.stdout);\n\t}\n}\n","import type { Task } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { getUserPlanPricing } from '../../lib/commands/storage-size.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\nconst consoleLikeTable = new ResponsiveTable({\n\tallColumns: ['Row1', 'Row2'],\n\tmandatoryColumns: ['Row1', 'Row2'],\n});\n\nexport class KeyValueStoresInfoCommand extends ApifyCommand<typeof KeyValueStoresInfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Shows information about a key-value store.';\n\n\tstatic override args = {\n\t\tstoreId: Args.string({\n\t\t\tdescription: 'The key-value store ID to print information about.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { storeId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetKeyValueStore(apifyClient, storeId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${storeId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keyValueStore: info } = maybeStore;\n\n\t\tconst [user, actor, run] = await Promise.all([\n\t\t\tapifyClient\n\t\t\t\t.user(info.userId)\n\t\t\t\t.get()\n\t\t\t\t.then((u) => u!),\n\t\t\tinfo.actId ? apifyClient.actor(info.actId).get() : Promise.resolve(undefined),\n\t\t\tinfo.actRunId ? apifyClient.run(info.actRunId).get() : Promise.resolve(undefined),\n\t\t]);\n\n\t\tlet task: Task | undefined;\n\n\t\tif (run?.actorTaskId) {\n\t\t\ttask = await apifyClient\n\t\t\t\t.task(run.actorTaskId)\n\t\t\t\t.get()\n\t\t\t\t.catch(() => undefined);\n\t\t}\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout({\n\t\t\t\t...info,\n\t\t\t\tuser,\n\t\t\t\tactor: actor || null,\n\t\t\t\trun: run || null,\n\t\t\t\ttask: task || null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst fullSizeInBytes = info.stats?.storageBytes || 0;\n\t\tconst readCount = info.stats?.readCount || 0;\n\t\tconst writeCount = info.stats?.writeCount || 0;\n\t\tconst deleteCount = info.stats?.deleteCount || 0;\n\t\tconst listCount = info.stats?.listCount || 0;\n\n\t\tconst operationsParts = [\n\t\t\t`${chalk.bold(readCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(readCount, 'read', 'reads'))}`,\n\t\t\t`${chalk.bold(writeCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(writeCount, 'write', 'writes'))}`,\n\t\t\t`${chalk.bold(deleteCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(deleteCount, 'delete', 'deletes'))}`,\n\t\t\t`${chalk.bold(listCount.toLocaleString('en-US'))} ${chalk.gray(this.pluralString(listCount, 'list', 'lists'))}`,\n\t\t];\n\n\t\tlet row3 = `Operations: ${operationsParts.join(' / ')}`;\n\n\t\tif (user.plan) {\n\t\t\tconst pricing = getUserPlanPricing(user.plan);\n\n\t\t\tif (pricing) {\n\t\t\t\tconst storeCostPerHour =\n\t\t\t\t\tpricing.KEY_VALUE_STORE_TIMED_STORAGE_GBYTE_HOURS * (fullSizeInBytes / 1000 ** 3);\n\t\t\t\tconst storeCostPerMonth = storeCostPerHour * 24 * 30;\n\n\t\t\t\tconst usdAmountString =\n\t\t\t\t\tstoreCostPerMonth > 1 ? `$${storeCostPerMonth.toFixed(2)}` : `$${storeCostPerHour.toFixed(3)}`;\n\n\t\t\t\trow3 += `\\nStorage size: ${prettyPrintBytes({ bytes: fullSizeInBytes, shortBytes: true, precision: 1 })} / ${chalk.gray(`${usdAmountString} per month`)}`;\n\t\t\t}\n\t\t} else {\n\t\t\trow3 += `\\nStorage size: ${prettyPrintBytes({ bytes: fullSizeInBytes, shortBytes: true, precision: 1 })} / ${chalk.gray('$unknown per month')}`;\n\t\t}\n\n\t\tconst row1 = [\n\t\t\t`Store ID: ${chalk.bgGray(info.id)}`,\n\t\t\t`Name: ${info.name ? chalk.bgGray(info.name) : chalk.bold(chalk.italic('Unnamed'))}`,\n\t\t\t`Created: ${chalk.bold(TimestampFormatter.display(info.createdAt))}`,\n\t\t\t`Modified: ${chalk.bold(TimestampFormatter.display(info.modifiedAt))}`,\n\t\t].join('\\n');\n\n\t\tlet runInfo = chalk.bold('—');\n\n\t\tif (info.actRunId) {\n\t\t\tif (run) {\n\t\t\t\trunInfo = chalk.bgBlue(run.id);\n\t\t\t} else {\n\t\t\t\trunInfo = chalk.italic(chalk.gray('Run removed'));\n\t\t\t}\n\t\t}\n\n\t\tlet actorInfo = chalk.bold('—');\n\n\t\tif (actor) {\n\t\t\tactorInfo = chalk.blue(actor.title || actor.name);\n\t\t}\n\n\t\tlet taskInfo = chalk.bold('—');\n\n\t\tif (task) {\n\t\t\ttaskInfo = chalk.blue(task.title || task.name);\n\t\t}\n\n\t\tconst row2 = [`Run: ${runInfo}`, `Actor: ${actorInfo}`, `Task: ${taskInfo}`].join('\\n');\n\n\t\tconsoleLikeTable.pushRow({\n\t\t\tRow1: row1,\n\t\t\tRow2: row2,\n\t\t});\n\n\t\tconst rendered = consoleLikeTable.render(CompactMode.NoLines);\n\n\t\tconst rows = rendered.split('\\n').map((row) => row.trim());\n\n\t\t// Remove the first row\n\t\trows.shift();\n\n\t\tconst message = [\n\t\t\t`${chalk.bold(info.name || chalk.italic('Unnamed'))}`,\n\t\t\t`${chalk.gray(info.name ? `${user.username}/${info.name}` : info.id)} ${chalk.gray('Owned by')} ${chalk.blue(user.username)}`,\n\t\t\t'',\n\t\t\trows.join('\\n'),\n\t\t\t'',\n\t\t\trow3,\n\t\t].join('\\n');\n\n\t\tsimpleLog({ message, stdout: true });\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout } from '../../lib/utils.js';\n\nconst table = new ResponsiveTable({\n\tallColumns: ['Key', 'Size'],\n\tmandatoryColumns: ['Key', 'Size'],\n});\n\nexport class KeyValueStoresKeysCommand extends ApifyCommand<typeof KeyValueStoresKeysCommand> {\n\tstatic override name = 'keys' as const;\n\n\tstatic override description = 'Lists all keys in a key-value store.';\n\n\tstatic override flags = {\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'The maximum number of keys to return.',\n\t\t\tdefault: 20,\n\t\t}),\n\t\t'exclusive-start-key': Flags.string({\n\t\t\tdescription: 'The key to start the list from.',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tstoreId: Args.string({\n\t\t\tdescription: 'The key-value store ID to list keys for.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { storeId } = this.args;\n\t\tconst { limit, exclusiveStartKey } = this.flags;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetKeyValueStore(apifyClient, storeId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${storeId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keyValueStoreClient: client } = maybeStore;\n\n\t\tconst keys = await client.listKeys({ limit, exclusiveStartKey });\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout(keys);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const keyData of keys.items) {\n\t\t\ttable.pushRow({\n\t\t\t\tKey: keyData.key,\n\t\t\t\tSize: prettyPrintBytes({ bytes: keyData.size, shortBytes: true, precision: 0 }),\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: table.render(CompactMode.WebLikeCompact),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { info, simpleLog } from '../../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow, printJsonToStdout, TimestampFormatter } from '../../lib/utils.js';\n\nconst table = new ResponsiveTable({\n\tallColumns: ['Store ID', 'Name', 'Size', 'Created', 'Modified'],\n\tmandatoryColumns: ['Store ID', 'Name', 'Size'],\n});\n\nexport class KeyValueStoresLsCommand extends ApifyCommand<typeof KeyValueStoresLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Lists all key-value stores on your account.';\n\n\tstatic override flags = {\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'Number of key-value stores that will be skipped.',\n\t\t\tdefault: 0,\n\t\t}),\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'Number of key-value stores that will be listed.',\n\t\t\tdefault: 20,\n\t\t}),\n\t\tdesc: Flags.boolean({\n\t\t\tdescription: 'Sorts key-value stores in descending order.',\n\t\t\tdefault: false,\n\t\t}),\n\t\tunnamed: Flags.boolean({\n\t\t\tdescription: \"Lists key-value stores that don't have a name set.\",\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { desc, offset, limit, json, unnamed } = this.flags;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst user = await getLocalUserInfo();\n\n\t\tconst rawKvsList = await client.keyValueStores().list({ desc, offset, limit, unnamed });\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(rawKvsList);\n\t\t\treturn;\n\t\t}\n\n\t\tif (rawKvsList.count === 0) {\n\t\t\tinfo({\n\t\t\t\tmessage: \"You don't have any key-value stores on your account\",\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const store of rawKvsList.items) {\n\t\t\t// TODO: update apify-client types\n\t\t\tconst statsObject = Reflect.get(store, 'stats') as { s3StorageBytes?: number };\n\t\t\tconst size = statsObject.s3StorageBytes;\n\n\t\t\ttable.pushRow({\n\t\t\t\t'Store ID': store.id,\n\t\t\t\tCreated: TimestampFormatter.display(store.createdAt),\n\t\t\t\tModified: TimestampFormatter.display(store.modifiedAt),\n\t\t\t\tName: store.name ? `${user.username!}/${store.name}` : '',\n\t\t\t\tSize:\n\t\t\t\t\ttypeof size === 'number'\n\t\t\t\t\t\t? prettyPrintBytes({ bytes: size, shortBytes: true, colorFunc: chalk.gray, precision: 0 })\n\t\t\t\t\t\t: chalk.gray('N/A'),\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: table.render(CompactMode.WebLikeCompact),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class KeyValueStoresRenameCommand extends ApifyCommand<typeof KeyValueStoresRenameCommand> {\n\tstatic override name = 'rename' as const;\n\n\tstatic override description = 'Renames a key-value store, or removes its unique name.';\n\n\tstatic override flags = {\n\t\tunname: Flags.boolean({\n\t\t\tdescription: 'Removes the unique name of the key-value store',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tkeyValueStoreNameOrId: Args.string({\n\t\t\tdescription: 'The key-value store ID or name to delete',\n\t\t\trequired: true,\n\t\t}),\n\t\tnewName: Args.string({\n\t\t\tdescription: 'The new name for the key-value store',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { unname } = this.flags;\n\t\tconst { newName, keyValueStoreNameOrId } = this.args;\n\n\t\tif (!newName && !unname) {\n\t\t\terror({ message: 'You must provide either a new name or the --unname flag.' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (newName && unname) {\n\t\t\terror({\n\t\t\t\tmessage: 'You cannot provide a new name and the --unname flag.',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst client = await getLoggedClientOrThrow();\n\t\tconst existingDataset = await tryToGetKeyValueStore(client, keyValueStoreNameOrId);\n\n\t\tif (!existingDataset) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${keyValueStoreNameOrId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, name } = existingDataset.keyValueStore;\n\n\t\tconst successMessage = (() => {\n\t\t\tif (!name) {\n\t\t\t\treturn `The name of the key-value store with ID ${chalk.yellow(id)} has been set to: ${chalk.yellow(newName)}`;\n\t\t\t}\n\n\t\t\tif (unname) {\n\t\t\t\treturn `The name of the key-value store with ID ${chalk.yellow(id)} has been removed (was ${chalk.yellow(name)} previously).`;\n\t\t\t}\n\n\t\t\treturn `The name of the key-value store with ID ${chalk.yellow(id)} was changed from ${chalk.yellow(name)} to ${chalk.yellow(newName)}.`;\n\t\t})();\n\n\t\ttry {\n\t\t\tawait existingDataset.keyValueStoreClient.update({ name: unname ? (null as never) : newName! });\n\n\t\t\tsuccess({\n\t\t\t\tmessage: successMessage,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to rename key-value store with ID ${chalk.yellow(id)}\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class KeyValueStoresRmCommand extends ApifyCommand<typeof KeyValueStoresRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Permanently removes a key-value store.';\n\n\tstatic override args = {\n\t\tkeyValueStoreNameOrId: Args.string({\n\t\t\tdescription: 'The key-value store ID or name to delete',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { keyValueStoreNameOrId } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\tconst existingKvs = await tryToGetKeyValueStore(client, keyValueStoreNameOrId);\n\n\t\tif (!existingKvs) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${keyValueStoreNameOrId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst confirmed = await useYesNoConfirm({\n\t\t\tmessage: `Are you sure you want to delete this Key-value store?`,\n\t\t});\n\n\t\tif (!confirmed) {\n\t\t\tinfo({ message: 'Key-value store deletion has been aborted.' });\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, name } = existingKvs.keyValueStore;\n\n\t\ttry {\n\t\t\tawait existingKvs.keyValueStoreClient.delete();\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `Key-value store with ID ${chalk.yellow(id)}${name ? ` (called ${chalk.yellow(name)})` : ''} has been deleted.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to delete key-value store with ID ${chalk.yellow(id)}\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { tryToGetKeyValueStore } from '../../lib/commands/storages.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class KeyValueStoresSetValueCommand extends ApifyCommand<typeof KeyValueStoresSetValueCommand> {\n\tstatic override name = 'set-value' as const;\n\n\tstatic override description = 'Stores value with specified key. Set content-type with --content-type flag.';\n\n\tstatic override flags = {\n\t\t'content-type': Flags.string({\n\t\t\tdescription: 'The MIME content type of the value. By default, \"application/json\" is assumed.',\n\t\t\tdefault: 'application/json',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tstoreId: Args.string({\n\t\t\tdescription: 'The key-value store ID to set the value in.',\n\t\t\trequired: true,\n\t\t}),\n\t\titemKey: Args.string({\n\t\t\tdescription: 'The key of the item in the key-value store.',\n\t\t\trequired: true,\n\t\t}),\n\t\tvalue: Args.string({\n\t\t\tdescription: 'The value to set.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { storeId, itemKey, value } = this.args;\n\t\tconst { contentType } = this.flags;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst maybeStore = await tryToGetKeyValueStore(apifyClient, storeId);\n\n\t\tif (!maybeStore) {\n\t\t\terror({\n\t\t\t\tmessage: `Key-value store with ID or name \"${storeId}\" not found.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keyValueStoreClient: client } = maybeStore;\n\n\t\ttry {\n\t\t\t// TODO: again, the types need to be fixed -w-\n\t\t\tawait client.setRecord({ key: itemKey, value: (value || process.stdin) as string, contentType });\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `Value with key \"${itemKey}\" set in the key-value store.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to set value with key \"${itemKey}\" in the key-value store.\\n ${casted.message || casted}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { KeyValueStoresCreateCommand } from './create.js';\nimport { KeyValueStoresDeleteValueCommand } from './delete-value.js';\nimport { KeyValueStoresGetValueCommand } from './get-value.js';\nimport { KeyValueStoresInfoCommand } from './info.js';\nimport { KeyValueStoresKeysCommand } from './keys.js';\nimport { KeyValueStoresLsCommand } from './ls.js';\nimport { KeyValueStoresRenameCommand } from './rename.js';\nimport { KeyValueStoresRmCommand } from './rm.js';\nimport { KeyValueStoresSetValueCommand } from './set-value.js';\n\nexport class KeyValueStoresIndexCommand extends ApifyCommand<typeof KeyValueStoresIndexCommand> {\n\tstatic override name = 'key-value-stores' as const;\n\n\tstatic override description = 'Manages persistent key-value storage.\\n\\nAlias: kvs';\n\n\tstatic override hiddenAliases = ['kvs'];\n\n\tstatic override subcommands = [\n\t\tKeyValueStoresCreateCommand,\n\t\tKeyValueStoresDeleteValueCommand,\n\t\tKeyValueStoresGetValueCommand,\n\t\tKeyValueStoresInfoCommand,\n\t\tKeyValueStoresKeysCommand,\n\t\tKeyValueStoresLsCommand,\n\t\tKeyValueStoresRenameCommand,\n\t\tKeyValueStoresRmCommand,\n\t\tKeyValueStoresSetValueCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import type { Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\n\nimport chalk from 'chalk';\nimport computerName from 'computer-name';\nimport cors from 'cors';\nimport express from 'express';\nimport open from 'open';\n\nimport { cryptoRandomObjectId } from '@apify/utilities';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Flags } from '../lib/command-framework/flags.js';\nimport { AUTH_FILE_PATH } from '../lib/consts.js';\nimport { updateUserId } from '../lib/hooks/telemetry/useTelemetryState.js';\nimport { useMaskedInput } from '../lib/hooks/user-confirmations/useMaskedInput.js';\nimport { useSelectFromList } from '../lib/hooks/user-confirmations/useSelectFromList.js';\nimport { error, info, success } from '../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClient, tildify } from '../lib/utils.js';\n\nconst CONSOLE_BASE_URL = 'https://console.apify.com/settings/integrations';\n// const CONSOLE_BASE_URL = 'http://localhost:3000/settings/integrations';\nconst CONSOLE_URL_ORIGIN = new URL(CONSOLE_BASE_URL).origin;\n\nconst API_BASE_URL = CONSOLE_BASE_URL.includes('localhost') ? 'http://localhost:3333' : undefined;\n\n// Not really checked right now, but it might come useful if we ever need to do some breaking changes\nconst API_VERSION = 'v1';\n\nconst tryToLogin = async (token: string) => {\n\tconst isUserLogged = await getLoggedClient(token, API_BASE_URL);\n\tconst userInfo = await getLocalUserInfo();\n\n\tif (isUserLogged) {\n\t\tawait updateUserId(userInfo.id!);\n\n\t\tsuccess({\n\t\t\tmessage: `You are logged in to Apify as ${userInfo.username || userInfo.id}. ${chalk.gray(`Your token is stored at ${AUTH_FILE_PATH()}.`)}`,\n\t\t});\n\t} else {\n\t\terror({\n\t\t\tmessage: 'Login to Apify failed, the provided API token is not valid.',\n\t\t});\n\t}\n\treturn isUserLogged;\n};\n\nexport class LoginCommand extends ApifyCommand<typeof LoginCommand> {\n\tstatic override name = 'login' as const;\n\n\tstatic override description =\n\t\t`Authenticates your Apify account and saves credentials to '${tildify(AUTH_FILE_PATH())}'.\\n` +\n\t\t`All other commands use these stored credentials.\\n\\n` +\n\t\t`Run 'apify logout' to remove authentication.`;\n\n\tstatic override flags = {\n\t\ttoken: Flags.string({\n\t\t\tchar: 't',\n\t\t\tdescription: 'Apify API token',\n\t\t\trequired: false,\n\t\t}),\n\t\tmethod: Flags.string({\n\t\t\tchar: 'm',\n\t\t\tdescription: 'Method of logging in to Apify',\n\t\t\tchoices: ['console', 'manual'],\n\t\t\trequired: false,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { token, method } = this.flags;\n\n\t\tif (token) {\n\t\t\tawait tryToLogin(token);\n\t\t\treturn;\n\t\t}\n\n\t\tlet selectedMethod = method;\n\n\t\tif (!method) {\n\t\t\tconst answer = await useSelectFromList({\n\t\t\t\tmessage: 'Choose how you want to log in to Apify',\n\t\t\t\tchoices: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: 'console',\n\t\t\t\t\t\tname: 'Through Apify Console in your default browser',\n\t\t\t\t\t\tshort: 'Through Apify Console',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: 'manual',\n\t\t\t\t\t\tname: 'Enter API token manually',\n\t\t\t\t\t\tshort: 'Manually',\n\t\t\t\t\t},\n\t\t\t\t] as const,\n\t\t\t\tloop: true,\n\t\t\t});\n\n\t\t\tselectedMethod = answer;\n\t\t}\n\n\t\tif (selectedMethod === 'console') {\n\t\t\tlet server: Server;\n\t\t\tconst app = express();\n\n\t\t\t// To send requests from browser to localhost, CORS has to be configured properly\n\t\t\tapp.use(\n\t\t\t\tcors({\n\t\t\t\t\torigin: CONSOLE_URL_ORIGIN,\n\t\t\t\t\tallowedHeaders: ['Content-Type', 'Authorization'],\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Turn off keepalive, otherwise closing the server when command is finished is lagging\n\t\t\tapp.use((_, res, next) => {\n\t\t\t\tres.set('Connection', 'close');\n\t\t\t\tnext();\n\t\t\t});\n\n\t\t\tapp.use(express.json());\n\n\t\t\t// Basic authorization via a random token, which is passed to the Apify Console,\n\t\t\t// and that sends it back via the `token` query param, or `Authorization` header\n\t\t\tconst authToken = cryptoRandomObjectId();\n\t\t\tapp.use((req, res, next) => {\n\t\t\t\tlet { token: serverToken } = req.query;\n\t\t\t\tif (!serverToken) {\n\t\t\t\t\tconst authorizationHeader = req.get('Authorization');\n\t\t\t\t\tif (authorizationHeader) {\n\t\t\t\t\t\tconst [schema, tokenFromHeader, ...extra] = authorizationHeader.trim().split(/\\s+/);\n\t\t\t\t\t\tif (schema.toLowerCase() === 'bearer' && tokenFromHeader && extra.length === 0) {\n\t\t\t\t\t\t\tserverToken = tokenFromHeader;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (serverToken !== authToken) {\n\t\t\t\t\tres.status(401);\n\t\t\t\t\tres.send('Authorization failed');\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst apiRouter = express.Router();\n\t\t\tapp.use(`/api/${API_VERSION}`, apiRouter);\n\n\t\t\tapiRouter.post('/login-token', async (req, res) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (req.body.apiToken) {\n\t\t\t\t\t\tawait tryToLogin(req.body.apiToken);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Request did not contain API token');\n\t\t\t\t\t}\n\t\t\t\t\tres.end();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst errorMessage = `Login to Apify failed with error: ${(err as Error).message}`;\n\t\t\t\t\terror({ message: errorMessage });\n\t\t\t\t\tres.status(500);\n\t\t\t\t\tres.send(errorMessage);\n\t\t\t\t}\n\t\t\t\tserver.close();\n\t\t\t});\n\n\t\t\tapiRouter.post('/exit', (req, res) => {\n\t\t\t\tif (req.body.isWindowClosed) {\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: 'Login to Apify failed, the console window was closed.',\n\t\t\t\t\t});\n\t\t\t\t} else if (req.body.actionCanceled) {\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: 'Login to Apify failed, the action was canceled in the Apify Console.',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\terror({ message: 'Login to Apify failed.' });\n\t\t\t\t}\n\n\t\t\t\tres.end();\n\t\t\t\tserver.close();\n\t\t\t});\n\n\t\t\t// Listening on port 0 will assign a random available port\n\t\t\tserver = app.listen(0);\n\t\t\tconst { port } = server.address() as AddressInfo;\n\n\t\t\tconst consoleUrl = new URL(CONSOLE_BASE_URL);\n\t\t\tconsoleUrl.searchParams.set('localCliCommand', 'login');\n\t\t\tconsoleUrl.searchParams.set('localCliPort', `${port}`);\n\t\t\tconsoleUrl.searchParams.set('localCliToken', authToken);\n\t\t\tconsoleUrl.searchParams.set('localCliApiVersion', API_VERSION);\n\t\t\ttry {\n\t\t\t\tconsoleUrl.searchParams.set('localCliComputerName', encodeURIComponent(computerName()));\n\t\t\t} catch {\n\t\t\t\t// Ignore errors from fetching computer name as it's not critical\n\t\t\t}\n\n\t\t\tinfo({ message: `Opening Apify Console at \"${consoleUrl.href}\"...` });\n\t\t\tawait open(consoleUrl.href);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t'Enter your Apify API token. You can find it at https://console.apify.com/settings/integrations',\n\t\t\t);\n\n\t\t\tconst tokenAnswer = await useMaskedInput({ message: 'token:' });\n\t\t\tawait tryToLogin(tokenAnswer);\n\t\t}\n\t}\n}\n","import password from '@inquirer/password';\n\nimport { stdinCheckWrapper } from './_stdinCheckWrapper.js';\n\ninterface UseMaskedInputInput {\n\tmessage: string;\n\tmask?: boolean | string;\n}\n\nexport const useMaskedInput = stdinCheckWrapper(async ({ message, mask }: UseMaskedInputInput) => {\n\tconst result = await password({ message, mask: mask ?? '*' });\n\n\treturn result;\n});\n","import { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { AUTH_FILE_PATH } from '../lib/consts.js';\nimport { rimrafPromised } from '../lib/files.js';\nimport { updateUserId } from '../lib/hooks/telemetry/useTelemetryState.js';\nimport { success } from '../lib/outputs.js';\nimport { tildify } from '../lib/utils.js';\n\nexport class LogoutCommand extends ApifyCommand<typeof LogoutCommand> {\n\tstatic override name = 'logout' as const;\n\n\tstatic override description =\n\t\t`Removes authentication by deleting your API token and account information from '${tildify(AUTH_FILE_PATH())}'.\\n` +\n\t\t`Run 'apify login' to authenticate again.`;\n\n\tasync run() {\n\t\tawait rimrafPromised(AUTH_FILE_PATH());\n\n\t\tawait updateUserId(null);\n\n\t\tsuccess({ message: 'You are logged out from your Apify account.' });\n\t}\n}\n","import { ActorsPullCommand } from './actors/pull.js';\n\nexport class TopLevelPullCommand extends ActorsPullCommand {\n\tstatic override name = 'pull' as const;\n}\n","import { ActorsPushCommand } from './actors/push.js';\n\nexport class ToplevelPushCommand extends ActorsPushCommand {\n\tstatic override name = 'push' as const;\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\n\nexport class RequestQueuesIndexCommand extends ApifyCommand<typeof RequestQueuesIndexCommand> {\n\tstatic override name = 'request-queues' as const;\n\n\tstatic override description = 'Manages URL queues for web scraping and automation tasks.';\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import { existsSync, renameSync } from 'node:fs';\nimport { mkdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\n\nimport type { ExecaError } from 'execa';\nimport mime from 'mime';\nimport { minVersion } from 'semver';\n\nimport { APIFY_ENV_VARS } from '@apify/consts';\nimport { validateInputSchema, validateInputUsingValidator } from '@apify/input_schema';\n\nimport { ApifyCommand, StdinMode } from '../lib/command-framework/apify-command.js';\nimport { Flags } from '../lib/command-framework/flags.js';\nimport { getInputOverride } from '../lib/commands/resolve-input.js';\nimport {\n\tCommandExitCodes,\n\tDEFAULT_LOCAL_STORAGE_DIR,\n\tLEGACY_LOCAL_STORAGE_DIR,\n\tMINIMUM_SUPPORTED_PYTHON_VERSION,\n\tSUPPORTED_NODEJS_VERSION,\n} from '../lib/consts.js';\nimport { execWithLog } from '../lib/exec.js';\nimport { deleteFile } from '../lib/files.js';\nimport { useActorConfig } from '../lib/hooks/useActorConfig.js';\nimport { ProjectLanguage, useCwdProject } from '../lib/hooks/useCwdProject.js';\nimport { useModuleVersion } from '../lib/hooks/useModuleVersion.js';\nimport { getAjvValidator, getDefaultsFromInputSchema, readInputSchema } from '../lib/input_schema.js';\nimport { error, info, warning } from '../lib/outputs.js';\nimport { replaceSecretsValue } from '../lib/secrets.js';\nimport {\n\tAjv2019,\n\tcheckIfStorageIsEmpty,\n\tgetLocalInput,\n\tgetLocalKeyValueStorePath,\n\tgetLocalStorageDir,\n\tgetLocalUserInfo,\n\tisNodeVersionSupported,\n\tisPythonVersionSupported,\n\tpurgeDefaultDataset,\n\tpurgeDefaultKeyValueStore,\n\tpurgeDefaultQueue,\n} from '../lib/utils.js';\n\nenum RunType {\n\tDirectFile = 0,\n\tModule = 1,\n\tScript = 2,\n}\n\nexport class RunCommand extends ApifyCommand<typeof RunCommand> {\n\tstatic override name = 'run' as const;\n\n\tstatic override description =\n\t\t`Executes Actor locally with simulated Apify environment variables.\\n` +\n\t\t`Stores data in local '${DEFAULT_LOCAL_STORAGE_DIR}' directory.\\n\\n` +\n\t\t`NOTE: For Node.js Actors, customize behavior by modifying the 'start' script in package.json file.`;\n\n\tstatic override flags = {\n\t\tpurge: Flags.boolean({\n\t\t\tchar: 'p',\n\t\t\tdescription:\n\t\t\t\t'Whether to purge the default request queue, dataset and key-value store before the run starts.\\nFor crawlee projects, this is the default behavior, and the flag is optional.\\nUse `--no-purge` to keep the storage folder intact.',\n\t\t\trequired: false,\n\t\t\tdefault: true,\n\t\t\texclusive: ['resurrect'],\n\t\t}),\n\t\tresurrect: Flags.boolean({\n\t\t\tdescription:\n\t\t\t\t'Whether to keep the default request queue, dataset and key-value store before the run starts.',\n\t\t\trequired: false,\n\t\t\tdefault: false,\n\t\t\texclusive: ['purge'],\n\t\t}),\n\t\tentrypoint: Flags.string({\n\t\t\tdescription: [\n\t\t\t\t'Optional entrypoint for running with injected environment variables.',\n\t\t\t\t'\\n',\n\t\t\t\t'For Python, it is the module name, or a path to a file.',\n\t\t\t\t'\\n',\n\t\t\t\t'For Node.js, it is the npm script name, or a path to a JS/MJS file.',\n\t\t\t\t'You can also pass in a directory name, provided that directory contains an \"index.js\" file.',\n\t\t\t].join(' '),\n\t\t\trequired: false,\n\t\t}),\n\t\tinput: Flags.string({\n\t\t\tchar: 'i',\n\t\t\tdescription: 'Optional JSON input to be given to the Actor.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input-file'],\n\t\t}),\n\t\t'input-file': Flags.string({\n\t\t\taliases: ['if'],\n\t\t\tdescription:\n\t\t\t\t'Optional path to a file with JSON input to be given to the Actor. The file must be a valid JSON file. You can also specify `-` to read from standard input.',\n\t\t\trequired: false,\n\t\t\tstdin: StdinMode.Stringified,\n\t\t\texclusive: ['input'],\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst cwd = process.cwd();\n\n\t\tconst { proxy, id: userId, token } = await getLocalUserInfo();\n\n\t\tconst localConfigResult = await useActorConfig({ cwd });\n\n\t\tif (localConfigResult.isErr()) {\n\t\t\tconst { message, cause } = localConfigResult.unwrapErr();\n\n\t\t\terror({ message: `${message}${cause ? `\\n ${cause.message}` : ''}` });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\treturn;\n\t\t}\n\n\t\tconst { config: localConfig } = localConfigResult.unwrap();\n\n\t\tconst actualStoragePath = getLocalStorageDir();\n\n\t\tconst projectRuntimeResult = await useCwdProject({ cwd });\n\n\t\tif (projectRuntimeResult.isErr()) {\n\t\t\terror({ message: projectRuntimeResult.unwrapErr().message });\n\t\t\tprocess.exitCode = CommandExitCodes.InvalidActorJson;\n\t\t\treturn;\n\t\t}\n\n\t\tconst project = projectRuntimeResult.unwrap();\n\t\tconst { type, entrypoint: cwdEntrypoint, runtime } = project;\n\n\t\tif (type === ProjectLanguage.Unknown) {\n\t\t\tthrow new Error(\n\t\t\t\t'Actor is of an unknown format.' +\n\t\t\t\t\t` Make sure your project is supported by Apify CLI (either a package.json file is present, or a Python entrypoint could be found) or you are in a migrated Scrapy project.`,\n\t\t\t);\n\t\t}\n\n\t\tif (!runtime) {\n\t\t\tswitch (type) {\n\t\t\t\tcase ProjectLanguage.JavaScript:\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `No Node.js detected! Please install Node.js ${SUPPORTED_NODEJS_VERSION} (or higher) to be able to run Node.js Actors locally.`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase ProjectLanguage.Scrapy:\n\t\t\t\tcase ProjectLanguage.Python:\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `No Python detected! Please install Python ${MINIMUM_SUPPORTED_PYTHON_VERSION} (or higher) to be able to run Python Actors locally.`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `No runtime detected! Make sure you have Python ${MINIMUM_SUPPORTED_PYTHON_VERSION} (or higher) or Node.js ${SUPPORTED_NODEJS_VERSION} (or higher) installed.`,\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet runType: RunType;\n\t\tlet entrypoint: string;\n\n\t\tif (this.flags.entrypoint) {\n\t\t\tentrypoint = this.flags.entrypoint;\n\n\t\t\tconst entrypointPath = join(cwd, this.flags.entrypoint);\n\n\t\t\tconst entrypointStat = await stat(entrypointPath).catch(() => null);\n\n\t\t\tif (entrypointStat?.isDirectory()) {\n\t\t\t\t// Directory -> We just try to run it as a module (in python, it needs to have a main.py file, in node.js, an index.(m)js file)\n\t\t\t\trunType = RunType.Module;\n\t\t\t}\n\t\t\t// File -> ./src/file for example (running custom scripts)\n\t\t\telse if (entrypointStat?.isFile()) {\n\t\t\t\trunType = RunType.DirectFile;\n\t\t\t}\n\t\t\t// If it's not a file, or a directory, we just let it be a script\n\t\t\telse {\n\t\t\t\trunType = RunType.Script;\n\t\t\t}\n\t\t} else if (cwdEntrypoint?.script) {\n\t\t\trunType = RunType.Script;\n\t\t\tentrypoint = cwdEntrypoint.script;\n\t\t} else if (cwdEntrypoint?.path) {\n\t\t\trunType = type !== ProjectLanguage.JavaScript ? RunType.Module : RunType.DirectFile;\n\t\t\tentrypoint = cwdEntrypoint.path;\n\t\t} else {\n\t\t\terror({\n\t\t\t\tmessage: `No entrypoint detected! Please provide an entrypoint using the --entrypoint flag, or make sure your project has an entrypoint.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (existsSync(LEGACY_LOCAL_STORAGE_DIR) && !existsSync(actualStoragePath)) {\n\t\t\trenameSync(LEGACY_LOCAL_STORAGE_DIR, actualStoragePath);\n\t\t\twarning({\n\t\t\t\tmessage:\n\t\t\t\t\t`The legacy 'apify_storage' directory was renamed to '${actualStoragePath}' to align it with Apify SDK v3.` +\n\t\t\t\t\t' Contents were left intact.',\n\t\t\t});\n\t\t}\n\n\t\tconst crawleeVersion = await useModuleVersion({\n\t\t\tmoduleName: 'crawlee',\n\t\t\tproject,\n\t\t});\n\n\t\tlet CRAWLEE_PURGE_ON_START = '0';\n\n\t\t// Mark resurrect as a special case of --no-purge\n\t\tif (this.flags.resurrect) {\n\t\t\tthis.flags.purge = false;\n\t\t}\n\n\t\t// Purge stores\n\t\tif (this.flags.purge) {\n\t\t\tCRAWLEE_PURGE_ON_START = '1';\n\n\t\t\tif (crawleeVersion.isNone()) {\n\t\t\t\tawait Promise.all([purgeDefaultQueue(), purgeDefaultKeyValueStore(), purgeDefaultDataset()]);\n\t\t\t\tinfo({ message: 'All default local stores were purged.' });\n\t\t\t}\n\t\t}\n\n\t\tif (!this.flags.purge) {\n\t\t\tconst isStorageEmpty = await checkIfStorageIsEmpty();\n\n\t\t\tif (!isStorageEmpty && !this.flags.resurrect) {\n\t\t\t\twarning({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t'The storage directory contains a previous state, the Actor will continue where it left off. ' +\n\t\t\t\t\t\t'To start from the initial state, use --purge parameter to clean the storage directory.',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Select correct input and validate it\n\t\tconst inputOverride = await getInputOverride(cwd, this.flags.input, this.flags.inputFile);\n\n\t\t// Means we couldn't resolve input, so we should exit\n\t\tif (inputOverride === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst storedInputResults = await this.validateAndStoreInput(inputOverride);\n\n\t\t// Attach env vars from local config files\n\t\tconst localEnvVars: Record<string, string> = {\n\t\t\t[APIFY_ENV_VARS.LOCAL_STORAGE_DIR]: actualStoragePath,\n\t\t\tCRAWLEE_STORAGE_DIR: actualStoragePath,\n\t\t\tCRAWLEE_PURGE_ON_START,\n\t\t};\n\n\t\tif (proxy && proxy.password) localEnvVars[APIFY_ENV_VARS.PROXY_PASSWORD] = proxy.password;\n\t\tif (userId) localEnvVars[APIFY_ENV_VARS.USER_ID] = userId;\n\t\tif (token) localEnvVars[APIFY_ENV_VARS.TOKEN] = token;\n\t\tif (localConfig!.environmentVariables) {\n\t\t\tconst updatedEnv = replaceSecretsValue(localConfig!.environmentVariables as Record<string, string>);\n\t\t\tObject.assign(localEnvVars, updatedEnv);\n\t\t}\n\n\t\t// NOTE: User can overwrite env vars\n\t\tconst env = Object.assign(localEnvVars, process.env);\n\n\t\tif (!userId) {\n\t\t\twarning({\n\t\t\t\tmessage:\n\t\t\t\t\t'You are not logged in with your Apify Account. Some features like Apify Proxy will not work. Call \"apify login\" to fix that.',\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tswitch (type) {\n\t\t\t\tcase ProjectLanguage.JavaScript: {\n\t\t\t\t\tconst minimumSupportedNodeVersion = minVersion(SUPPORTED_NODEJS_VERSION);\n\n\t\t\t\t\tif (isNodeVersionSupported(runtime.version)) {\n\t\t\t\t\t\t// --max-http-header-size=80000\n\t\t\t\t\t\t// Increases default size of headers. The original limit was 80kb, but from node 10+ they decided to lower it to 8kb.\n\t\t\t\t\t\t// However they did not think about all the sites there with large headers,\n\t\t\t\t\t\t// so we put back the old limit of 80kb, which seems to work just fine.\n\t\t\t\t\t\tenv.NODE_OPTIONS = env.NODE_OPTIONS\n\t\t\t\t\t\t\t? `${env.NODE_OPTIONS} --max-http-header-size=80000`\n\t\t\t\t\t\t\t: '--max-http-header-size=80000';\n\t\t\t\t\t} else {\n\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`You are running Node.js version ${runtime.version}, which is no longer supported. ` +\n\t\t\t\t\t\t\t\t`Please upgrade to Node.js version ${minimumSupportedNodeVersion} or later.`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (runType === RunType.DirectFile || runType === RunType.Module) {\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\targs: [entrypoint],\n\t\t\t\t\t\t\topts: { env, cwd },\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Assert the package.json content for scripts\n\t\t\t\t\t\tconst packageJson = await readFile(join(cwd, 'package.json'), 'utf8').catch(() => '{}');\n\t\t\t\t\t\tconst packageJsonObj = JSON.parse(packageJson);\n\n\t\t\t\t\t\tif (!packageJsonObj.scripts) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t'No scripts were found in package.json. Please set it up for your project. ' +\n\t\t\t\t\t\t\t\t\t'For more information about that call \"apify help run\".',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!packageJsonObj.scripts[entrypoint]) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`The script \"${entrypoint}\" was not found in package.json. Please set it up for your project. ` +\n\t\t\t\t\t\t\t\t\t'For more information about that call \"apify help run\".',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!runtime.pmPath) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t'No npm executable found! Please make sure your Node.js runtime has npm installed if you want to run package.json scripts locally.',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.pmPath,\n\t\t\t\t\t\t\targs: ['run', entrypoint],\n\t\t\t\t\t\t\topts: { env, cwd },\n\t\t\t\t\t\t\toverrideCommand: runtime.pmName,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase ProjectLanguage.Python:\n\t\t\t\tcase ProjectLanguage.Scrapy: {\n\t\t\t\t\tif (!isPythonVersionSupported(runtime.version)) {\n\t\t\t\t\t\terror({\n\t\t\t\t\t\t\tmessage: `Python Actors require Python 3.9 or higher, but you have Python ${runtime.version}!`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\terror({\n\t\t\t\t\t\t\tmessage: 'Please install Python 3.9 or higher to be able to run Python Actors locally.',\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (runType === RunType.Module) {\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\targs: ['-m', entrypoint],\n\t\t\t\t\t\t\topts: { env, cwd },\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait execWithLog({\n\t\t\t\t\t\t\tcmd: runtime.executablePath,\n\t\t\t\t\t\t\targs: [entrypoint],\n\t\t\t\t\t\t\topts: { env, cwd },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\terror({\n\t\t\t\t\t\tmessage: `Failed to detect the language of your project. Please report this issue to the Apify team with your project structure over at https://github.com/apify/apify-cli/issues`,\n\t\t\t\t\t});\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst { stderr } = err as ExecaError;\n\n\t\t\tif (stderr) {\n\t\t\t\t// TODO: maybe throw in helpful tips for debugging issues (missing scripts, trying to start a ts file with old node, etc)\n\t\t\t}\n\t\t} finally {\n\t\t\tif (storedInputResults) {\n\t\t\t\tif (storedInputResults.existingInput) {\n\t\t\t\t\t// Check if the input file was modified since we modified it. If it was, we abort the re-overwrite and warn the user\n\t\t\t\t\tconst stats = await stat(storedInputResults.inputFilePath);\n\n\t\t\t\t\tconst mtime = Math.trunc(stats.mtimeMs);\n\n\t\t\t\t\t// If its in a 5ms range, we assume the file was modified (realistically impossible)\n\t\t\t\t\tif (mtime - storedInputResults.writtenAt >= 5) {\n\t\t\t\t\t\twarning({\n\t\t\t\t\t\t\tmessage: `The \"${storedInputResults.inputFilePath}\" file was overwritten during the run. The CLI will not undo the setting of missing default fields from your input schema.`,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// eslint-disable-next-line no-unsafe-finally -- we do not return anything in the commands anyways\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Overwrite with the original input\n\t\t\t\t\tawait writeFile(storedInputResults.inputFilePath, storedInputResults.existingInput.body);\n\t\t\t\t} else {\n\t\t\t\t\t// No file -> we made it -> we delete it\n\t\t\t\t\tawait deleteFile(storedInputResults.inputFilePath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Ensures the input that the actor will be ran with locally matches the input schema (and prefills default values if missing)\n\t * @param inputOverride Optional input received through command flags\n\t */\n\tprivate async validateAndStoreInput(inputOverride?: { input: Record<string, unknown>; source: string }) {\n\t\tconst { inputSchema } = await readInputSchema({ cwd: process.cwd() });\n\n\t\tif (!inputSchema) {\n\t\t\tif (!inputOverride) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// We cannot validate input schema if it is not found -> default to no validation and overriding if flags are given\n\t\t\tconst existingInput = getLocalInput(process.cwd());\n\n\t\t\t// Prepare the file path for where we'll temporarily store the validated input\n\t\t\tconst inputFilePath = join(\n\t\t\t\tprocess.cwd(),\n\t\t\t\tgetLocalKeyValueStorePath(),\n\t\t\t\texistingInput?.fileName ?? 'INPUT.json',\n\t\t\t);\n\n\t\t\tawait mkdir(dirname(inputFilePath), { recursive: true });\n\t\t\tawait writeFile(inputFilePath, JSON.stringify(inputOverride.input, null, 2));\n\n\t\t\treturn {\n\t\t\t\texistingInput,\n\t\t\t\tinputFilePath,\n\t\t\t\twrittenAt: Date.now(),\n\t\t\t};\n\t\t}\n\n\t\t// Step 1: validate the input schema\n\t\tconst validator = new Ajv2019({ strict: false, unicodeRegExp: false });\n\t\tvalidateInputSchema(validator, inputSchema); // This one throws an error in a case of invalid schema.\n\n\t\tconst defaults = getDefaultsFromInputSchema(inputSchema);\n\t\tconst compiledInputSchema = getAjvValidator(inputSchema, validator);\n\n\t\t// Step 2: try to fetch the existing INPUT from the local storage\n\t\tconst existingInput = getLocalInput(process.cwd());\n\n\t\t// Prepare the file path for where we'll temporarily store the validated input\n\t\tconst inputFilePath = join(process.cwd(), getLocalKeyValueStorePath(), existingInput?.fileName ?? 'INPUT.json');\n\n\t\tlet errorHeader: string;\n\n\t\tswitch (inputOverride?.source) {\n\t\t\tcase 'stdin':\n\t\t\t\terrorHeader =\n\t\t\t\t\t'The input provided through standard input is invalid. Please fix the following errors:\\n';\n\t\t\t\tbreak;\n\t\t\tcase 'input':\n\t\t\t\terrorHeader =\n\t\t\t\t\t'The input provided through the --input flag is invalid. Please fix the following errors:\\n';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (inputOverride) {\n\t\t\t\t\terrorHeader = `The input provided through the ${inputOverride.source} file is invalid. Please fix the following errors:\\n`;\n\t\t\t\t} else {\n\t\t\t\t\terrorHeader = 'The input in your storage is invalid. Please fix the following errors:\\n';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Step 2. If there is an input override, we validate it and store it\n\t\tif (inputOverride) {\n\t\t\tconst fullInputOverride = {\n\t\t\t\t...defaults,\n\t\t\t\t...inputOverride.input,\n\t\t\t};\n\n\t\t\tconst errors = validateInputUsingValidator(compiledInputSchema, inputSchema, fullInputOverride);\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${errorHeader}${errors\n\t\t\t\t\t\t.map((e) => ` - ${e.message.replace('Field input.', 'Field ')}`)\n\t\t\t\t\t\t.join('\\n')}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait mkdir(dirname(inputFilePath), { recursive: true });\n\t\t\tawait writeFile(inputFilePath, JSON.stringify(fullInputOverride, null, 2));\n\n\t\t\treturn {\n\t\t\t\texistingInput,\n\t\t\t\tinputFilePath,\n\t\t\t\twrittenAt: Date.now(),\n\t\t\t};\n\t\t}\n\n\t\tif (!existingInput) {\n\t\t\tawait mkdir(dirname(inputFilePath), { recursive: true });\n\t\t\t// No input -> use defaults for this run\n\t\t\tawait writeFile(inputFilePath, JSON.stringify(defaults, null, 2));\n\n\t\t\treturn {\n\t\t\t\texistingInput,\n\t\t\t\tinputFilePath,\n\t\t\t\twrittenAt: Date.now(),\n\t\t\t};\n\t\t}\n\n\t\tif (mime.getExtension(existingInput.contentType!) === 'json') {\n\t\t\t// Step 4: validate the input\n\t\t\tconst inputJson = JSON.parse(existingInput.body.toString('utf-8'));\n\n\t\t\tif (Array.isArray(inputJson)) {\n\t\t\t\tthrow new Error('The input in your storage is invalid. It should be an object, not an array.');\n\t\t\t}\n\n\t\t\tconst fullInput = {\n\t\t\t\t...defaults,\n\t\t\t\t...inputJson,\n\t\t\t};\n\n\t\t\tconst errors = validateInputUsingValidator(compiledInputSchema, inputSchema, fullInput);\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${errorHeader}${errors\n\t\t\t\t\t\t.map((e) => ` - ${e.message.replace('Field input.', 'Field ')}`)\n\t\t\t\t\t\t.join('\\n')}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Step 4: store the input\n\t\t\tawait mkdir(dirname(inputFilePath), { recursive: true });\n\t\t\tawait writeFile(inputFilePath, JSON.stringify(fullInput, null, 2));\n\n\t\t\treturn {\n\t\t\t\texistingInput,\n\t\t\t\tinputFilePath,\n\t\t\t\twrittenAt: Date.now(),\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n}\n","import { none, type Option, some } from '@sapphire/result';\nimport { execa } from 'execa';\n\nimport { cliDebugPrint } from '../utils/cliDebugPrint.js';\nimport { type CwdProject, ProjectLanguage } from './useCwdProject.js';\n\nexport interface UseModuleVersionInput {\n\tmoduleName: string;\n\tproject: CwdProject;\n}\n\nconst jsScript = (mod: string) =>\n\t`\n(async () => {\n\tconst [nodeModule, process, path, fs] = await Promise.all([\n\t\timport('node:module'),\n\t\timport('node:process'),\n\t\timport('node:path'),\n\t\timport('node:fs/promises'),\n\t]);\n\n\t/* we fake a script file here because otherwise node AND deno will fail to resolve modules, but bun works -.- */\n\tconst dirname = path.join(process.cwd(), '__apify_cli_fetch_module_version__.js');\n\n\tconst _require = nodeModule.createRequire(dirname);\n\n\ttry {\n\t\tconst modulePath = _require.resolve('${mod}');\n\t\tconst moduleDir = path.dirname(modulePath);\n\n\t\tconst packageJson = await fs.readFile(path.join(moduleDir, 'package.json'), 'utf8').catch(() => null);\n\n\t\tif (!packageJson) {\n\t\t\tconsole.log('n/a');\n\t\t\treturn;\n\t\t}\n\n\t\tconst packageJsonObj = JSON.parse(packageJson);\n\t\tconsole.log(packageJsonObj.version);\n\t} catch {\n\t\tconsole.log('n/a');\n\t}\n})();\n`\n\t\t.replaceAll('\\n', ' ')\n\t\t.replaceAll('\\t', ' ');\n\nconst pyScript = (mod: string) => `\ntry:\n\timport ${mod}\n\tprint(${mod}.__version__)\nexcept:\n\tprint('n/a')\n`;\n\nconst moduleVersionScripts: Record<string, (mod: string) => string[]> = {\n\tnode(mod) {\n\t\tconst script = jsScript(mod);\n\n\t\treturn ['-e', `\"${script}\"`];\n\t},\n\tdeno(mod) {\n\t\tconst script = jsScript(mod);\n\n\t\treturn ['eval', `\"${script}\"`];\n\t},\n\tbun(mod) {\n\t\tconst script = jsScript(mod);\n\n\t\treturn ['--eval', `\"${script}\"`];\n\t},\n\tpython(mod) {\n\t\tconst script = pyScript(mod);\n\n\t\treturn ['-c', `\"${script}\"`];\n\t},\n};\n\nexport async function useModuleVersion({ moduleName, project }: UseModuleVersionInput): Promise<Option<string>> {\n\tif (!project.runtime) {\n\t\tcliDebugPrint('useModuleVersion', { status: 'no_runtime_found', project, moduleName });\n\t\treturn none;\n\t}\n\n\tlet moduleVersionScriptKey: string;\n\n\tif (project.type === ProjectLanguage.JavaScript) {\n\t\tmoduleVersionScriptKey = project.runtime.runtimeShorthand || 'node';\n\t} else if (project.type === ProjectLanguage.Python || project.type === ProjectLanguage.Scrapy) {\n\t\tmoduleVersionScriptKey = 'python';\n\t} else {\n\t\tcliDebugPrint('useModuleVersion', { status: 'unsupported_project_type', project, moduleName });\n\t\treturn none;\n\t}\n\n\tconst args = moduleVersionScripts[moduleVersionScriptKey]?.(moduleName);\n\n\tif (!args) {\n\t\tcliDebugPrint('useModuleVersion', { status: 'no_version_script_found', project, moduleName });\n\t\treturn none;\n\t}\n\n\ttry {\n\t\tconst result = await execa(project.runtime.executablePath, args, {\n\t\t\tshell: true,\n\t\t\twindowsHide: true,\n\t\t\tverbose: process.env.APIFY_CLI_DEBUG ? 'full' : undefined,\n\t\t});\n\n\t\tif (result.stdout.trim() === 'n/a') {\n\t\t\tcliDebugPrint('useModuleVersion', { status: 'no_version_found', project, moduleName });\n\t\t\treturn none;\n\t\t}\n\n\t\tcliDebugPrint('useModuleVersion', { status: 'success', project, moduleName, version: result.stdout.trim() });\n\n\t\treturn some(result.stdout.trim());\n\t} catch (ex) {\n\t\tcliDebugPrint('useModuleVersion', { status: 'failed_to_run_version_script', project, moduleName, error: ex });\n\t\treturn none;\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\n\nimport { ACTOR_JOB_STATUSES } from '@apify/consts';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout } from '../../lib/utils.js';\n\nconst runningStatuses = [ACTOR_JOB_STATUSES.READY, ACTOR_JOB_STATUSES.RUNNING];\n\nconst abortingStatuses = [ACTOR_JOB_STATUSES.ABORTING, ACTOR_JOB_STATUSES.TIMING_OUT];\n\nexport class RunsAbortCommand extends ApifyCommand<typeof RunsAbortCommand> {\n\tstatic override name = 'abort' as const;\n\n\tstatic override description = 'Aborts an Actor run.';\n\n\tstatic override args = {\n\t\trunId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The run ID to abort.',\n\t\t}),\n\t};\n\n\tstatic override flags = {\n\t\tforce: Flags.boolean({\n\t\t\tdescription: 'Whether to force the run to abort immediately, instead of gracefully.',\n\t\t\tdefault: false,\n\t\t\tchar: 'f',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { runId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst run = await apifyClient.run(runId).get();\n\n\t\tif (!run) {\n\t\t\terror({ message: `Run with ID \"${runId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!runningStatuses.includes(run.status as never)) {\n\t\t\tif (abortingStatuses.includes(run.status as never)) {\n\t\t\t\terror({ message: `Run with ID \"${runId}\" is already aborting.`, stdout: true });\n\t\t\t} else {\n\t\t\t\terror({ message: `Run with ID \"${runId}\" is already aborted.`, stdout: true });\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await apifyClient.run(runId).abort({ gracefully: !this.flags.force });\n\n\t\t\tif (this.flags.json) {\n\t\t\t\tprintJsonToStdout(result);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.flags.force) {\n\t\t\t\tsuccess({ message: `Triggered the immediate abort of run \"${runId}\".`, stdout: true });\n\t\t\t} else {\n\t\t\t\tsuccess({\n\t\t\t\t\tmessage: `Triggered the abort of run \"${runId}\", it should finish aborting in up to 30 seconds.`,\n\t\t\t\t\tstdout: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to abort run \"${runId}\".\\n ${casted.message || casted}`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ActorRun, ActorRunUsage, ActorTaggedBuild } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintBytes } from '../../lib/commands/pretty-print-bytes.js';\nimport { prettyPrintStatus } from '../../lib/commands/pretty-print-status.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport {\n\tgetLoggedClientOrThrow,\n\tprintJsonToStdout,\n\tShortDurationFormatter,\n\tTimestampFormatter,\n} from '../../lib/utils.js';\n\nconst usageTable = new ResponsiveTable({\n\tallColumns: ['', 'Unit', 'USD Amount'],\n\tmandatoryColumns: ['', 'Unit', 'USD Amount'],\n\tcolumnAlignments: {\n\t\tUnit: 'right',\n\t\t'USD Amount': 'right',\n\t},\n});\n\nconst usageMapping: Record<string, keyof ActorRunUsage> = {\n\t'Actor compute units': 'ACTOR_COMPUTE_UNITS',\n\t'Dataset reads': 'DATASET_READS',\n\t'Dataset writes': 'DATASET_WRITES',\n\t'Key-value store reads': 'KEY_VALUE_STORE_READS',\n\t'Key-value store writes': 'KEY_VALUE_STORE_WRITES',\n\t'Key-value store lists': 'KEY_VALUE_STORE_LISTS',\n\t'Request queue reads': 'REQUEST_QUEUE_READS',\n\t'Request queue writes': 'REQUEST_QUEUE_WRITES',\n\t'Data transfer internal': 'DATA_TRANSFER_INTERNAL_GBYTES',\n\t'Data transfer external': 'DATA_TRANSFER_EXTERNAL_GBYTES',\n\t'Proxy residential data transfer': 'PROXY_RESIDENTIAL_TRANSFER_GBYTES',\n\t'Proxy SERPs': 'PROXY_SERPS',\n};\n\nexport class RunsInfoCommand extends ApifyCommand<typeof RunsInfoCommand> {\n\tstatic override name = 'info' as const;\n\n\tstatic override description = 'Prints information about an Actor run.';\n\n\tstatic override args = {\n\t\trunId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The run ID to print information about.',\n\t\t}),\n\t};\n\n\tstatic override flags = {\n\t\tverbose: Flags.boolean({\n\t\t\tchar: 'v',\n\t\t\tdescription: 'Prints more in-depth information about the Actor run.',\n\t\t\tdefault: false,\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { runId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst run = await apifyClient.run(runId).get();\n\n\t\tif (!run) {\n\t\t\terror({ message: `Run with ID \"${runId}\" was not found on your account.` });\n\t\t\treturn;\n\t\t}\n\n\t\t// Not ideal but we need to fetch the actor, build and task after fetching the run\n\t\tconst [actor, build, task, defaultDataset, defaultRequestQueue] = await Promise.all([\n\t\t\tapifyClient.actor(run.actId).get(),\n\t\t\tapifyClient.build(run.buildId).get(),\n\t\t\trun.actorTaskId ? apifyClient.task(run.actorTaskId).get() : Promise.resolve(undefined),\n\t\t\tapifyClient.dataset(run.defaultDatasetId).get(),\n\t\t\tapifyClient.requestQueue(run.defaultRequestQueueId).get(),\n\t\t]);\n\n\t\tif (this.flags.json) {\n\t\t\tprintJsonToStdout({\n\t\t\t\t...run,\n\t\t\t\tactor,\n\t\t\t\tbuild,\n\t\t\t\ttask,\n\t\t\t\tdefaultDataset,\n\t\t\t\tdefaultRequestQueue,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addDetailedUsage(run);\n\n\t\tconst fullActorName = actor?.username ? `${actor.username}/${actor.name}` : (actor?.name ?? 'unknown-actor');\n\n\t\tconst message: string[] = [`${chalk.yellow('Actor')}: ${fullActorName} (${chalk.grey(run.actId)})`];\n\n\t\t// Handle task\n\t\tif (task) {\n\t\t\tmessage.push(`└─ ${chalk.yellow('Task')}: ${task.title ?? task.name} (${chalk.gray(run.actorTaskId)})`, '');\n\t\t} else if (run.actorTaskId) {\n\t\t\tmessage.push(`└─ ${chalk.yellow('Task')}: unknown-task (${chalk.gray(run.actorTaskId)})`, '');\n\t\t} else {\n\t\t\tmessage.push('');\n\t\t}\n\n\t\t// basic info (results, requests, usage, started, duration, container url, origin, start date, etc)\n\n\t\t// status\n\t\tconst exitCodeStatus = ` (exit code: ${chalk.gray(run.exitCode !== null ? run.exitCode : 'N/A')})`;\n\t\tmessage.push(`${chalk.yellow('Status')}: ${prettyPrintStatus(run.status)}${exitCodeStatus}`);\n\n\t\tif (run.statusMessage) {\n\t\t\tmessage.push(`└─ ${chalk.yellow('Status Message:')} ${run.statusMessage}`);\n\t\t}\n\n\t\t// results\n\t\tconst resultCount = defaultDataset?.itemCount ?? 0;\n\t\tmessage.push(`${chalk.yellow('Results')}: ${chalk.cyan(resultCount.toLocaleString('en-US'))}`);\n\n\t\t// requests\n\t\tif (defaultRequestQueue) {\n\t\t\tmessage.push(\n\t\t\t\t`${chalk.yellow('Requests')}: ${chalk.cyan(defaultRequestQueue.handledRequestCount.toLocaleString('en-US'))} out of ${chalk.cyan(defaultRequestQueue.totalRequestCount.toLocaleString('en-US'))} handled`,\n\t\t\t);\n\t\t} else {\n\t\t\tmessage.push(`${chalk.yellow('Requests')}: ${chalk.gray('unknown handled')}`);\n\t\t}\n\n\t\t// usage\n\t\tconst renderedTip = this.flags.verbose\n\t\t\t? ''\n\t\t\t: chalk.gray(` (run with ${chalk.yellow('--verbose')} for a detailed breakdown)`);\n\n\t\tif (run.usageTotalUsd) {\n\t\t\tmessage.push(`${chalk.yellow('Usage')}: ${chalk.cyan(this.formatUsd(run.usageTotalUsd))}${renderedTip}`);\n\t\t} else {\n\t\t\t// If we somehow don't know this... oof\n\t\t\tmessage.push(`${chalk.yellow('Usage')}: $${chalk.gray('0.000')}${renderedTip}`);\n\t\t}\n\n\t\t// Verbose breakdown of costs\n\t\tif (this.flags.verbose) {\n\t\t\t// Always shown as compact because it looks much better\n\t\t\tmessage.push(usageTable.render(CompactMode.VeryCompact));\n\t\t}\n\n\t\t// Separator\n\t\tmessage.push('');\n\n\t\t// time\n\t\tmessage.push(`${chalk.yellow('Started')}: ${TimestampFormatter.display(run.startedAt)}`);\n\n\t\tif (run.finishedAt) {\n\t\t\tmessage.push(\n\t\t\t\t`${chalk.yellow('Finished')}: ${TimestampFormatter.display(run.finishedAt)} (took ${chalk.gray(ShortDurationFormatter.format(run.stats.durationMillis))})`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst diff = Date.now() - run.startedAt.getTime();\n\t\t\tmessage.push(\n\t\t\t\t`${chalk.yellow('Finished')}: ${chalk.gray(`Running for ${ShortDurationFormatter.format(diff)}`)}`,\n\t\t\t);\n\t\t}\n\n\t\t// Separator\n\t\tmessage.push('');\n\n\t\t// resurrect, container url, origin, and run options (build, timeout, memory)\n\t\tif (run.stats.resurrectCount) {\n\t\t\tmessage.push(\n\t\t\t\t`${chalk.yellow('Resurrected')}: Yes, ${chalk.cyan(run.stats.resurrectCount.toLocaleString('en-US'))} ${this.pluralString(run.stats.resurrectCount, 'time', 'times')}`,\n\t\t\t);\n\t\t} else {\n\t\t\tmessage.push(`${chalk.yellow('Resurrected')}: No`);\n\t\t}\n\n\t\t// container\n\t\tif (run.containerUrl) {\n\t\t\tmessage.push(`${chalk.yellow('Container URL')}: ${chalk.blue(run.containerUrl)}`);\n\t\t}\n\n\t\t// origin\n\t\tmessage.push(`${chalk.yellow('Origin')}: ${run.meta.origin}`);\n\n\t\t// build\n\t\tif (actor) {\n\t\t\t// Compute detailed view\n\t\t\tconst expectedActorVersion = run.buildNumber.split('.').slice(0, 2).join('.');\n\n\t\t\tconst actorVersion = actor.versions.find((item) => item.versionNumber === expectedActorVersion);\n\n\t\t\tconst runVersionTaggedAs = Object.entries(\n\t\t\t\t(actor.taggedBuilds ?? {}) as Record<string, ActorTaggedBuild>,\n\t\t\t).find(([, data]) => data.buildNumber === run.buildNumber)?.[0];\n\n\t\t\tconst messageParts = [`${chalk.yellow('Build')}:`, chalk.cyan(run.buildNumber)];\n\n\t\t\tif (runVersionTaggedAs) {\n\t\t\t\tmessageParts.push(`(${chalk.yellow(runVersionTaggedAs)})`);\n\t\t\t} else {\n\t\t\t\tmessageParts.push(`(${chalk.gray('N/A')})`);\n\t\t\t}\n\n\t\t\tif (actorVersion) {\n\t\t\t\tmessageParts.push(\n\t\t\t\t\t`| ${chalk.gray('Actor version:')} ${chalk.cyan(actorVersion.versionNumber)} (${chalk.yellow(actorVersion.buildTag)})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tmessage.push(messageParts.join(' '));\n\t\t} else {\n\t\t\tmessage.push(`${chalk.yellow('Build')}: ${chalk.cyan(run.buildNumber)}`);\n\t\t}\n\n\t\t// timeout\n\t\tmessage.push(`${chalk.yellow('Timeout')}: ${run.options.timeoutSecs.toLocaleString('en-US')} seconds`);\n\n\t\t// memory limit\n\t\tmessage.push(`${chalk.yellow('Memory')}: ${run.options.memoryMbytes} MB`);\n\n\t\t// Separator\n\t\tmessage.push('');\n\n\t\t// CPU avg/max\n\n\t\tmessage.push(\n\t\t\t`${chalk.yellow('CPU')}: ${chalk.gray('Average:')} ${run.stats.cpuAvgUsage.toFixed(2)}% | ${chalk.gray('Maximum:')} ${run.stats.cpuMaxUsage.toFixed(2)}%`,\n\t\t);\n\n\t\t// memory avg/max\n\n\t\tmessage.push(\n\t\t\t`${chalk.yellow('Memory')}: ${chalk.gray('Average:')} ${prettyPrintBytes({ bytes: run.stats.memAvgBytes, shortBytes: true })} | ${chalk.gray('Maximum:')} ${prettyPrintBytes({ bytes: run.stats.memMaxBytes, shortBytes: true })}`,\n\t\t);\n\n\t\t// url\n\n\t\tmessage.push('');\n\n\t\tconst url = `https://console.apify.com/actors/${run.actId}/runs/${run.id}`;\n\t\tconst datasetUrl = `https://console.apify.com/storage/datasets/${run.defaultDatasetId}`;\n\t\tconst keyValueStoreUrl = `https://console.apify.com/storage/key-value-stores/${run.defaultKeyValueStoreId}`;\n\n\t\tmessage.push(`${chalk.blue('Export results')}: ${datasetUrl}`);\n\t\tmessage.push(`${chalk.blue('View saved items')}: ${keyValueStoreUrl}`);\n\t\tmessage.push(`${chalk.blue('View in Apify Console')}: ${url}`);\n\n\t\tsimpleLog({ message: message.join('\\n'), stdout: true });\n\t}\n\n\tprivate addDetailedUsage(run: ActorRun) {\n\t\tconst { usage, usageUsd } = run;\n\n\t\tif (!usage || !usageUsd) {\n\t\t\tfor (const userFriendlyString of Object.keys(usageMapping)) {\n\t\t\t\tusageTable.pushRow({\n\t\t\t\t\t'': userFriendlyString,\n\t\t\t\t\t'Unit': 'N/A',\n\t\t\t\t\t'USD Amount': 'N/A',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [userFriendlyString, property] of Object.entries(usageMapping)) {\n\t\t\tconst usageNumber = usage[property] ?? 0;\n\t\t\tconst usdAmount = usageUsd[property] ?? 0;\n\n\t\t\tswitch (property) {\n\t\t\t\tcase 'ACTOR_COMPUTE_UNITS': {\n\t\t\t\t\tusageTable.pushRow({\n\t\t\t\t\t\t'': userFriendlyString,\n\t\t\t\t\t\tUnit: usageNumber.toFixed(4),\n\t\t\t\t\t\t'USD Amount': this.formatUsd(usdAmount),\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'DATA_TRANSFER_INTERNAL_GBYTES':\n\t\t\t\tcase 'DATA_TRANSFER_EXTERNAL_GBYTES':\n\t\t\t\tcase 'PROXY_RESIDENTIAL_TRANSFER_GBYTES': {\n\t\t\t\t\tusageTable.pushRow({\n\t\t\t\t\t\t'': userFriendlyString,\n\t\t\t\t\t\t// Convert from GB to B (more verbose than console)\n\t\t\t\t\t\tUnit: prettyPrintBytes({ bytes: usageNumber * 1024 * 1024 * 1024, shortBytes: true }),\n\t\t\t\t\t\t'USD Amount': this.formatUsd(usdAmount),\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tusageTable.pushRow({\n\t\t\t\t\t\t'': userFriendlyString,\n\t\t\t\t\t\tUnit: usageNumber.toLocaleString('en-US'),\n\t\t\t\t\t\t'USD Amount': this.formatUsd(usdAmount),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate formatUsd(val: number) {\n\t\treturn `$${val.toFixed(3)}`;\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { error, info } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, outputJobLog } from '../../lib/utils.js';\n\nexport class RunsLogCommand extends ApifyCommand<typeof RunsLogCommand> {\n\tstatic override name = 'log' as const;\n\n\tstatic override description = 'Prints the log of a specific run.';\n\n\tstatic override args = {\n\t\trunId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The run ID to get the log from.',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { runId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst run = await apifyClient.run(runId).get();\n\n\t\tif (!run) {\n\t\t\terror({ message: `Run with ID \"${runId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\tinfo({ message: `Log for run with ID \"${runId}\":\\n`, stdout: true });\n\n\t\ttry {\n\t\t\tawait outputJobLog({ job: run, apifyClient });\n\t\t} catch (err) {\n\t\t\t// This should never happen...\n\t\t\terror({ message: `Failed to get log for run with ID \"${runId}\": ${(err as Error).message}` });\n\t\t}\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { Flags } from '../../lib/command-framework/flags.js';\nimport { prettyPrintStatus } from '../../lib/commands/pretty-print-status.js';\nimport { resolveActorContext } from '../../lib/commands/resolve-actor-context.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { error, simpleLog } from '../../lib/outputs.js';\nimport {\n\tgetLoggedClientOrThrow,\n\tMultilineTimestampFormatter,\n\tprintJsonToStdout,\n\tShortDurationFormatter,\n} from '../../lib/utils.js';\n\nconst table = new ResponsiveTable({\n\tallColumns: ['ID', 'Status', 'Results', 'Usage', 'Started At', 'Took', 'Build No.', 'Origin'],\n\tmandatoryColumns: ['ID', 'Status', 'Results', 'Usage', 'Started At', 'Took'],\n\tcolumnAlignments: {\n\t\tResults: 'right',\n\t\tUsage: 'right',\n\t\tTook: 'right',\n\t\t'Build No.': 'right',\n\t},\n});\n\nexport class RunsLsCommand extends ApifyCommand<typeof RunsLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Lists all runs of the Actor.';\n\n\tstatic override flags = {\n\t\toffset: Flags.integer({\n\t\t\tdescription: 'Number of runs that will be skipped.',\n\t\t\tdefault: 0,\n\t\t}),\n\t\tlimit: Flags.integer({\n\t\t\tdescription: 'Number of runs that will be listed.',\n\t\t\tdefault: 10,\n\t\t}),\n\t\tdesc: Flags.boolean({\n\t\t\tdescription: 'Sort runs in descending order.',\n\t\t\tdefault: false,\n\t\t}),\n\t\tcompact: Flags.boolean({\n\t\t\tdescription: 'Display a compact table.',\n\t\t\tdefault: false,\n\t\t\tchar: 'c',\n\t\t}),\n\t};\n\n\tstatic override args = {\n\t\tactorId: Args.string({\n\t\t\tdescription:\n\t\t\t\t'Optional Actor ID or Name to list runs for. By default, it will use the Actor from the current directory.',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { desc, limit, offset, compact, json } = this.flags;\n\t\tconst { actorId } = this.args;\n\n\t\tconst client = await getLoggedClientOrThrow();\n\n\t\t// Should we allow users to list any runs, not just actor-specific runs? Right now it works like `builds ls`, requiring an actor\n\t\tconst ctx = await resolveActorContext({ providedActorNameOrId: actorId, client });\n\n\t\tif (!ctx.valid) {\n\t\t\terror({\n\t\t\t\tmessage: `${ctx.reason}. Please run this command in an Actor directory, or specify the Actor ID.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst allRuns = await client.actor(ctx.id).runs().list({ desc, limit, offset });\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout(allRuns);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!allRuns.items.length) {\n\t\t\tsimpleLog({\n\t\t\t\tmessage: 'There are no recent runs found for this Actor.',\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = [\n\t\t\t`${chalk.reset('Showing')} ${chalk.yellow(allRuns.items.length)} out of ${chalk.yellow(allRuns.total)} runs for Actor ${chalk.yellow(ctx.userFriendlyId)} (${chalk.gray(ctx.id)})`,\n\t\t];\n\n\t\tconst datasetInfos = new Map(\n\t\t\tawait Promise.all(\n\t\t\t\tallRuns.items.map(async (run) =>\n\t\t\t\t\tclient\n\t\t\t\t\t\t.dataset(run.defaultDatasetId)\n\t\t\t\t\t\t.get()\n\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t(data) => [run.id, chalk.yellow(data?.itemCount ?? 0)] as const,\n\t\t\t\t\t\t\t() => [run.id, chalk.gray('N/A')] as const,\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\tfor (const run of allRuns.items) {\n\t\t\tlet tookString: string;\n\n\t\t\tif (run.finishedAt) {\n\t\t\t\tconst diff = run.finishedAt.getTime() - run.startedAt.getTime();\n\n\t\t\t\ttookString = chalk.gray(`${ShortDurationFormatter.format(diff, undefined, { left: '' })}`);\n\t\t\t} else {\n\t\t\t\tconst diff = Date.now() - run.startedAt.getTime();\n\n\t\t\t\ttookString = chalk.gray(`Running for ${ShortDurationFormatter.format(diff, undefined, { left: '' })}`);\n\t\t\t}\n\n\t\t\ttable.pushRow({\n\t\t\t\tID: chalk.gray(run.id),\n\t\t\t\tStatus: prettyPrintStatus(run.status),\n\t\t\t\tResults: datasetInfos.get(run.id) || chalk.gray('N/A'),\n\t\t\t\tUsage: chalk.cyan(`$${(run.usageTotalUsd ?? 0).toFixed(3)}`),\n\t\t\t\t'Started At': MultilineTimestampFormatter.display(run.startedAt),\n\t\t\t\tTook: tookString,\n\t\t\t\t'Build No.': run.buildNumber,\n\t\t\t\tOrigin: run.meta.origin ?? 'UNKNOWN',\n\t\t\t});\n\t\t}\n\n\t\tmessage.push(table.render(compact ? CompactMode.VeryCompact : CompactMode.WebLikeCompact));\n\n\t\tsimpleLog({\n\t\t\tmessage: message.join('\\n'),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\n\nimport { ACTOR_JOB_STATUSES } from '@apify/consts';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { error, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow, printJsonToStdout } from '../../lib/utils.js';\n\nconst resurrectStatuses = [\n\tACTOR_JOB_STATUSES.SUCCEEDED,\n\tACTOR_JOB_STATUSES.FAILED,\n\tACTOR_JOB_STATUSES.ABORTED,\n\tACTOR_JOB_STATUSES.TIMED_OUT,\n];\n\nexport class RunsResurrectCommand extends ApifyCommand<typeof RunsResurrectCommand> {\n\tstatic override name = 'resurrect' as const;\n\n\tstatic override description = 'Resurrects an aborted or finished Actor Run.';\n\n\tstatic override args = {\n\t\trunId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'The run ID to resurrect.',\n\t\t}),\n\t};\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { runId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst run = await apifyClient.run(runId).get();\n\n\t\tif (!run) {\n\t\t\terror({ message: `Run with ID \"${runId}\" was not found on your account.`, stdout: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!resurrectStatuses.includes(run.status as never)) {\n\t\t\terror({\n\t\t\t\tmessage: `Run with ID \"${runId}\" cannot be resurrected, as it is still running or in the process of aborting.`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await apifyClient.run(runId).resurrect();\n\n\t\t\tif (this.flags.json) {\n\t\t\t\tprintJsonToStdout(result);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsuccess({ message: `Run with ID \"${runId}\" was resurrected successfully.`, stdout: true });\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\n\t\t\terror({\n\t\t\t\tmessage: `Failed to resurrect run \"${runId}\".\\n ${casted.message || casted}`,\n\t\t\t\tstdout: true,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { ApifyApiError } from 'apify-client';\n\nimport { ACTOR_JOB_STATUSES } from '@apify/consts';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { useYesNoConfirm } from '../../lib/hooks/user-confirmations/useYesNoConfirm.js';\nimport { error, info, success } from '../../lib/outputs.js';\nimport { getLoggedClientOrThrow } from '../../lib/utils.js';\n\nconst deletableStatuses = [\n\tACTOR_JOB_STATUSES.SUCCEEDED,\n\tACTOR_JOB_STATUSES.FAILED,\n\tACTOR_JOB_STATUSES.ABORTED,\n\tACTOR_JOB_STATUSES.TIMED_OUT,\n];\n\nexport class RunsRmCommand extends ApifyCommand<typeof RunsRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Deletes an Actor Run.';\n\n\tstatic override args = {\n\t\trunId: Args.string({\n\t\t\tdescription: 'The run ID to delete.',\n\t\t\trequired: true,\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { runId } = this.args;\n\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\n\t\tconst run = await apifyClient.run(runId).get();\n\n\t\tif (!run) {\n\t\t\terror({ message: `Run with ID \"${runId}\" was not found on your account.` });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!deletableStatuses.includes(run.status as never)) {\n\t\t\terror({\n\t\t\t\tmessage: `Run with ID \"${runId}\" cannot be deleted, as it is still running or in the process of aborting.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst confirmedDelete = await useYesNoConfirm({\n\t\t\tmessage: `Are you sure you want to delete this Actor Run?`,\n\t\t});\n\n\t\tif (!confirmedDelete) {\n\t\t\tinfo({\n\t\t\t\tmessage: `Deletion of run \"${runId}\" was canceled.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait apifyClient.run(runId).delete();\n\n\t\t\tsuccess({\n\t\t\t\tmessage: `Run with ID \"${runId}\" was deleted.`,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst casted = err as ApifyApiError;\n\t\t\terror({ message: `Failed to delete run \"${runId}\".\\n ${casted.message || casted}` });\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { RunsAbortCommand } from './abort.js';\nimport { RunsInfoCommand } from './info.js';\nimport { RunsLogCommand } from './log.js';\nimport { RunsLsCommand } from './ls.js';\nimport { RunsResurrectCommand } from './resurrect.js';\nimport { RunsRmCommand } from './rm.js';\n\nexport class RunsIndexCommand extends ApifyCommand<typeof RunsIndexCommand> {\n\tstatic override name = 'runs' as const;\n\n\tstatic override description = 'Manages Actor run operations ';\n\n\tstatic override subcommands = [\n\t\tRunsAbortCommand,\n\t\tRunsInfoCommand,\n\t\tRunsLogCommand,\n\t\tRunsLsCommand,\n\t\tRunsResurrectCommand,\n\t\tRunsRmCommand,\n\t];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { addSecret } from '../../lib/secrets.js';\n\nexport class SecretsAddCommand extends ApifyCommand<typeof SecretsAddCommand> {\n\tstatic override name = 'add' as const;\n\n\tstatic override description = `Adds a new secret to '~/.apify' for use in Actor environment variables.`;\n\n\tstatic override args = {\n\t\tname: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Name of the secret',\n\t\t}),\n\t\tvalue: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Value of the secret',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { name, value } = this.args;\n\n\t\taddSecret(name, value);\n\t}\n}\n","import chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { CompactMode, ResponsiveTable } from '../../lib/commands/responsive-table.js';\nimport { info, simpleLog } from '../../lib/outputs.js';\nimport { getSecretsFile } from '../../lib/secrets.js';\nimport { printJsonToStdout } from '../../lib/utils.js';\n\nconst table = new ResponsiveTable({\n\tallColumns: ['Secret Name'],\n\tmandatoryColumns: ['Secret Name'],\n\tcolumnAlignments: {\n\t\t'Secret Name': 'left',\n\t},\n});\n\nexport class SecretsLsCommand extends ApifyCommand<typeof SecretsLsCommand> {\n\tstatic override name = 'ls' as const;\n\n\tstatic override description = 'Lists all secret keys stored in your local configuration.';\n\n\tstatic override enableJsonFlag = true;\n\n\tasync run() {\n\t\tconst { json } = this.flags;\n\n\t\tconst secrets = getSecretsFile();\n\t\tconst secretKeys = Object.keys(secrets);\n\n\t\tif (json) {\n\t\t\tprintJsonToStdout({ keys: secretKeys });\n\t\t\treturn;\n\t\t}\n\n\t\tif (secretKeys.length === 0) {\n\t\t\tinfo({\n\t\t\t\tmessage: \"You don't have any secrets stored locally. Use 'apify secrets add' to add a secret.\",\n\t\t\t\tstdout: true,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const key of secretKeys) {\n\t\t\ttable.pushRow({\n\t\t\t\t'Secret Name': chalk.cyan(key),\n\t\t\t});\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: table.render(CompactMode.WebLikeCompact),\n\t\t\tstdout: true,\n\t\t});\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { removeSecret } from '../../lib/secrets.js';\n\nexport class SecretsRmCommand extends ApifyCommand<typeof SecretsRmCommand> {\n\tstatic override name = 'rm' as const;\n\n\tstatic override description = 'Permanently deletes a secret from your stored credentials.';\n\n\tstatic override args = {\n\t\tname: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Name of the secret',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst { name } = this.args;\n\n\t\tremoveSecret(name);\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { LOCAL_CONFIG_PATH } from '../../lib/consts.js';\nimport { SecretsAddCommand } from './add.js';\nimport { SecretsLsCommand } from './ls.js';\nimport { SecretsRmCommand } from './rm.js';\n\nexport class SecretsIndexCommand extends ApifyCommand<typeof SecretsIndexCommand> {\n\tstatic override name = 'secrets' as const;\n\n\tstatic override description =\n\t\t`Manages secure environment variables for Actors.\\n\\n` +\n\t\t`Example:\\n` +\n\t\t`$ apify secrets add mySecret TopSecretValue123\\n\\n` +\n\t\t`The \"mySecret\" value can be used in an environment variable defined in '${LOCAL_CONFIG_PATH}' file by adding the \"@\" prefix:\\n\\n` +\n\t\t`{\\n` +\n\t\t` \"actorSpecification\": 1,\\n` +\n\t\t` \"name\": \"my_actor\",\\n` +\n\t\t` \"environmentVariables\": { \"SECRET_ENV_VAR\": \"@mySecret\" },\\n` +\n\t\t` \"version\": \"0.1\"\\n` +\n\t\t`}\\n\\n` +\n\t\t`When the Actor is pushed to Apify cloud, the \"SECRET_ENV_VAR\" and its value is stored as a secret environment variable of the Actor.`;\n\n\tstatic override subcommands = [SecretsAddCommand, SecretsLsCommand, SecretsRmCommand];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import type { ApifyClient, TaskStartOptions } from 'apify-client';\nimport chalk from 'chalk';\n\nimport { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { Args } from '../../lib/command-framework/args.js';\nimport { runActorOrTaskOnCloud, SharedRunOnCloudFlags } from '../../lib/commands/run-on-cloud.js';\nimport { simpleLog } from '../../lib/outputs.js';\nimport { getLocalUserInfo, getLoggedClientOrThrow } from '../../lib/utils.js';\n\nexport class TaskRunCommand extends ApifyCommand<typeof TaskRunCommand> {\n\tstatic override name = 'run' as const;\n\n\tstatic override description =\n\t\t'Executes predefined Actor task remotely using local key-value store for input.\\n' +\n\t\t'Customize with --memory and --timeout flags.\\n';\n\n\tstatic override flags = SharedRunOnCloudFlags('Task');\n\n\tstatic override args = {\n\t\ttaskId: Args.string({\n\t\t\trequired: true,\n\t\t\tdescription: 'Name or ID of the Task to run (e.g. \"my-task\" or \"E2jjCZBezvAZnX8Rb\").',\n\t\t}),\n\t};\n\n\tasync run() {\n\t\tconst apifyClient = await getLoggedClientOrThrow();\n\t\tconst userInfo = await getLocalUserInfo();\n\t\tconst usernameOrId = userInfo.username || (userInfo.id as string);\n\n\t\tconst { id: taskId, userFriendlyId, title } = await this.resolveTaskId(apifyClient, usernameOrId);\n\n\t\tconst runOpts: TaskStartOptions = {\n\t\t\twaitForFinish: 2, // NOTE: We need to wait some time to Apify open stream and we can create connection\n\t\t};\n\n\t\tif (this.flags.build) {\n\t\t\trunOpts.build = this.flags.build;\n\t\t}\n\n\t\tif (this.flags.timeout) {\n\t\t\trunOpts.timeout = this.flags.timeout;\n\t\t}\n\n\t\tif (this.flags.memory) {\n\t\t\trunOpts.memory = this.flags.memory;\n\t\t}\n\n\t\tlet url: string;\n\t\tlet datasetUrl: string;\n\n\t\tconst iterator = runActorOrTaskOnCloud(apifyClient, {\n\t\t\tactorOrTaskData: {\n\t\t\t\tid: taskId,\n\t\t\t\tuserFriendlyId,\n\t\t\t\ttitle,\n\t\t\t},\n\t\t\trunOptions: runOpts,\n\t\t\ttype: 'Task',\n\t\t\tprintRunLogs: true,\n\t\t});\n\n\t\tfor await (const yieldedRun of iterator) {\n\t\t\turl = `https://console.apify.com/actors/${yieldedRun.actId}/runs/${yieldedRun.id}`;\n\t\t\tdatasetUrl = `https://console.apify.com/storage/datasets/${yieldedRun.defaultDatasetId}`;\n\t\t}\n\n\t\tsimpleLog({\n\t\t\tmessage: [\n\t\t\t\t'',\n\t\t\t\t`${chalk.blue('Export results')}: ${datasetUrl!}`,\n\t\t\t\t`${chalk.blue('View on Apify Console')}: ${url!}`,\n\t\t\t].join('\\n'),\n\t\t\tstdout: true,\n\t\t});\n\t}\n\n\tprivate async resolveTaskId(client: ApifyClient, usernameOrId: string) {\n\t\tconst { taskId } = this.args;\n\n\t\t// Full ID\n\t\tif (taskId?.includes('/')) {\n\t\t\tconst task = await client.task(taskId).get();\n\t\t\tif (!task) {\n\t\t\t\tthrow new Error(`Cannot find Task with ID '${taskId}' in your account.`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: task.id,\n\t\t\t\tuserFriendlyId: `${usernameOrId}/${task.name}`,\n\t\t\t\ttitle: task.title,\n\t\t\t\ttask,\n\t\t\t};\n\t\t}\n\n\t\t// Try fetching task directly by name\n\t\tif (taskId) {\n\t\t\tconst task = await client.task(`${usernameOrId}/${taskId.toLowerCase()}`).get();\n\n\t\t\tif (!task) {\n\t\t\t\tthrow new Error(`Cannot find Task with name '${taskId}' in your account.`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: task.id,\n\t\t\t\tuserFriendlyId: `${usernameOrId}/${task.name}`,\n\t\t\t\ttitle: task.title,\n\t\t\t\ttask,\n\t\t\t};\n\t\t}\n\n\t\tthrow new Error('Please provide a valid Task ID or name.');\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { TaskRunCommand } from './run.js';\n\nexport class TasksIndexCommand extends ApifyCommand<typeof TasksIndexCommand> {\n\tstatic override name = 'task' as const;\n\n\tstatic override description = 'Manages scheduled and predefined Actor configurations.';\n\n\tstatic override subcommands = [TaskRunCommand];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { updateTelemetryEnabled, useTelemetryState } from '../../lib/hooks/telemetry/useTelemetryState.js';\nimport { info, success } from '../../lib/outputs.js';\n\nexport class TelemetryDisableCommand extends ApifyCommand<typeof TelemetryDisableCommand> {\n\tstatic override name = 'disable' as const;\n\n\tstatic override description = 'Disables telemetry.';\n\n\tasync run() {\n\t\tconst currentState = await useTelemetryState();\n\n\t\tif (currentState.enabled) {\n\t\t\tawait updateTelemetryEnabled(false);\n\n\t\t\tsuccess({ message: 'Telemetry disabled.' });\n\t\t} else {\n\t\t\tinfo({ message: 'Telemetry is already disabled.' });\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { updateTelemetryEnabled, useTelemetryState } from '../../lib/hooks/telemetry/useTelemetryState.js';\nimport { info, success } from '../../lib/outputs.js';\n\nexport class TelemetryEnableCommand extends ApifyCommand<typeof TelemetryEnableCommand> {\n\tstatic override name = 'enable' as const;\n\n\tstatic override description = 'Enables telemetry.';\n\n\tasync run() {\n\t\tconst currentState = await useTelemetryState();\n\n\t\tif (currentState.enabled) {\n\t\t\tinfo({ message: 'Telemetry is already enabled.' });\n\t\t} else {\n\t\t\tawait updateTelemetryEnabled(true);\n\n\t\t\tsuccess({ message: 'Telemetry enabled.' });\n\t\t}\n\t}\n}\n","import { ApifyCommand } from '../../lib/command-framework/apify-command.js';\nimport { TelemetryDisableCommand } from './disable.js';\nimport { TelemetryEnableCommand } from './enable.js';\n\nexport class TelemetryIndexCommand extends ApifyCommand<typeof TelemetryIndexCommand> {\n\tstatic override name = 'telemetry' as const;\n\n\tstatic override description =\n\t\t'Manages telemetry settings. We use this data to improve the CLI and the Apify platform.\\nRead more: https://docs.apify.com/cli/docs/telemetry';\n\n\tstatic override subcommands = [TelemetryEnableCommand, TelemetryDisableCommand];\n\n\tasync run() {\n\t\tthis.printHelp();\n\t}\n}\n","import process from 'node:process';\n\nimport { validateInputSchema } from '@apify/input_schema';\n\nimport { ApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { Args } from '../lib/command-framework/args.js';\nimport { LOCAL_CONFIG_PATH } from '../lib/consts.js';\nimport { readInputSchema } from '../lib/input_schema.js';\nimport { info, success } from '../lib/outputs.js';\nimport { Ajv2019 } from '../lib/utils.js';\n\nexport class ValidateInputSchemaCommand extends ApifyCommand<typeof ValidateInputSchemaCommand> {\n\tstatic override name = 'validate-schema' as const;\n\n\tstatic override description = `Validates Actor input schema from one of these locations (in priority order):\n 1. Object in '${LOCAL_CONFIG_PATH}' under \"input\" key\n 2. JSON file path in '${LOCAL_CONFIG_PATH}' \"input\" key\n 3. .actor/INPUT_SCHEMA.json\n 4. INPUT_SCHEMA.json\n\nOptionally specify custom schema path to validate.`;\n\n\tstatic override args = {\n\t\tpath: Args.string({\n\t\t\trequired: false,\n\t\t\tdescription: 'Optional path to your INPUT_SCHEMA.json file. If not provided ./INPUT_SCHEMA.json is used.',\n\t\t}),\n\t};\n\n\tstatic override hiddenAliases = ['vis'];\n\n\tasync run() {\n\t\tconst { inputSchema, inputSchemaPath } = await readInputSchema({\n\t\t\tforcePath: this.args.path,\n\t\t\tcwd: process.cwd(),\n\t\t});\n\n\t\tif (!inputSchema) {\n\t\t\tthrow new Error(`Input schema has not been found at ${inputSchemaPath}.`);\n\t\t}\n\n\t\tif (inputSchemaPath) {\n\t\t\tinfo({ message: `Validating input schema stored at ${inputSchemaPath}` });\n\t\t} else {\n\t\t\tinfo({ message: `Validating input schema embedded in '${LOCAL_CONFIG_PATH}'` });\n\t\t}\n\n\t\tconst validator = new Ajv2019({ strict: false });\n\t\tvalidateInputSchema(validator, inputSchema); // This one throws an error in a case of invalid schema.\n\t\tsuccess({ message: 'Input schema is valid.' });\n\t}\n}\n","import type { BuiltApifyCommand } from '../lib/command-framework/apify-command.js';\nimport { ActorIndexCommand } from './actor/_index.js';\nimport { ActorCalculateMemoryCommand } from './actor/calculate-memory.js';\nimport { ActorChargeCommand } from './actor/charge.js';\nimport { ActorGetInputCommand } from './actor/get-input.js';\nimport { ActorGetPublicUrlCommand } from './actor/get-public-url.js';\nimport { ActorGetValueCommand } from './actor/get-value.js';\nimport { ActorPushDataCommand } from './actor/push-data.js';\nimport { ActorSetValueCommand } from './actor/set-value.js';\nimport { ActorsIndexCommand } from './actors/_index.js';\nimport { BuildsIndexCommand } from './builds/_index.js';\nimport { TopLevelCallCommand } from './call.js';\nimport { InstallCommand } from './cli-management/install.js';\nimport { UpgradeCommand } from './cli-management/upgrade.js';\nimport { CreateCommand } from './create.js';\nimport { DatasetsIndexCommand } from './datasets/_index.js';\nimport { EditInputSchemaCommand } from './edit-input-schema.js';\nimport { HelpCommand } from './help.js';\nimport { InfoCommand } from './info.js';\nimport { InitCommand } from './init.js';\nimport { WrapScrapyCommand } from './init-wrap-scrapy.js';\nimport { KeyValueStoresIndexCommand } from './key-value-stores/_index.js';\nimport { LoginCommand } from './login.js';\nimport { LogoutCommand } from './logout.js';\nimport { TopLevelPullCommand } from './pull.js';\nimport { ToplevelPushCommand } from './push.js';\nimport { RequestQueuesIndexCommand } from './request-queues/_index.js';\nimport { RunCommand } from './run.js';\nimport { RunsIndexCommand } from './runs/_index.js';\nimport { SecretsIndexCommand } from './secrets/_index.js';\nimport { TasksIndexCommand } from './task/_index.js';\nimport { TelemetryIndexCommand } from './telemetry/_index.js';\nimport { ValidateInputSchemaCommand } from './validate-schema.js';\n\nexport const apifyCommands = [\n\t// namespaces\n\tActorIndexCommand,\n\tActorsIndexCommand,\n\tBuildsIndexCommand,\n\tDatasetsIndexCommand,\n\tKeyValueStoresIndexCommand,\n\tRequestQueuesIndexCommand,\n\tRunsIndexCommand,\n\tSecretsIndexCommand,\n\tTasksIndexCommand,\n\tTelemetryIndexCommand,\n\n\t// top-level\n\tTopLevelCallCommand,\n\tUpgradeCommand,\n\tInstallCommand,\n\tCreateCommand,\n\tEditInputSchemaCommand,\n\tInfoCommand,\n\tWrapScrapyCommand,\n\tInitCommand,\n\tLoginCommand,\n\tLogoutCommand,\n\tTopLevelPullCommand,\n\tToplevelPushCommand,\n\tRunCommand,\n\tValidateInputSchemaCommand,\n\tHelpCommand,\n\n\t// test commands\n\t// (await import('./_testCommands/_FlagTests.js')).FlagTest,\n] as const satisfies (typeof BuiltApifyCommand)[];\n\nexport const actorCommands = [\n\t//\n\tActorSetValueCommand,\n\tActorPushDataCommand,\n\tActorGetValueCommand,\n\tActorGetPublicUrlCommand,\n\tActorGetInputCommand,\n\tActorChargeCommand,\n\tActorCalculateMemoryCommand,\n\n\t// top-level\n\tHelpCommand,\n\tUpgradeCommand,\n\tInstallCommand,\n\n\t// namespaces\n\tTelemetryIndexCommand,\n] as const satisfies (typeof BuiltApifyCommand)[];\n"],"mappings":"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","names":["process","parseArgs","chalk","satisfies","chalk","indentString","widestLine","wrapAnsi","chalk","cliDebugPrint","tag","args","chalk","__name","realpathSync","dirname","chalk","internalLog","options","__name","simpleLog","error","chalk","warning","success","run","info","link","DEVELOPMENT_VERSION_MARKER","CLI_VERSION","CLI_HASH","detectInstallMethod","entrypointFilePathRaw","warning","entrypointFilePath","realpathSync","__name","getRuntimeInfo","cachedMetadata","useCLIMetadata","installMethod","runtime","DEVELOPMENT_VERSION_MARKER","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","cryptoRandomObjectId","homedir","join","KEY_VALUE_STORE_KEYS","META_ORIGINS","package_default","DEFAULT_LOCAL_STORAGE_DIR","LEGACY_LOCAL_STORAGE_DIR","ACTOR_SPECIFICATION_VERSION","EMPTY_LOCAL_CONFIG","CHECK_VERSION_EVERY_MILLIS","GLOBAL_CONFIGS_FOLDER","__name","base","join","homedir","AUTH_FILE_PATH","SECRETS_FILE_PATH","STATE_FILE_PATH","TELEMETRY_FILE_PATH","DEPRECATED_LOCAL_CONFIG_NAME","ACTOR_SPECIFICATION_FOLDER","LOCAL_CONFIG_NAME","LOCAL_CONFIG_PATH","INPUT_FILE_REG_EXP","KEY_VALUE_STORE_KEYS","SUPPORTED_NODEJS_VERSION","package_default","APIFY_CLIENT_DEFAULT_HEADERS","META_ORIGINS","MINIMUM_SUPPORTED_PYTHON_VERSION","PYTHON_VENV_PATH","createWriteStream","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","mkdir","readFile","get","homedir","dirname","join","process","finished","SapphireDurationFormatter","TimeTypes","Timestamp","AdmZip","_Ajv2019","ApifyClient","archiver","AxiosHeaders","escapeStringRegexp","globby","getEncoding","Mime","otherMimes","standardMimes","gte","minVersion","satisfies","ACTOR_ENV_VARS","ACTOR_JOB_TERMINAL_STATUSES","ACTOR_NAME","APIFY_ENV_VARS","KEY_VALUE_STORE_KEYS","LOCAL_ACTOR_ENV_VARS","LOCAL_STORAGE_SUBDIRS","SOURCE_FILE_FORMATS","existsSync","mkdirSync","readFile","stat","unlink","writeFile","join","sep","rimraf","updateLocalJson","__name","jsonFilePath","updateAttrs","nestedObjectAttr","raw","readFile","currentObject","newObject","writeFile","ensureFolderExistsSync","rootPath","folderPath","sep","currentPath","currentDir","join","existsSync","mkdirSync","rimrafPromised","pathToBeRemoved","rimraf","deleteFile","filePath","stat","unlink","sumFilesSizeInBytes","pathToFiles","cwd","stats","sum","fileSize","Ajv2019","_Ajv2019","httpsGet","__name","url","resolve","reject","get","response","getLocalStorageDir","envVar","APIFY_ENV_VARS","process","DEFAULT_LOCAL_STORAGE_DIR","getLocalKeyValueStorePath","storeId","ACTOR_ENV_VARS","storeDir","LOCAL_ACTOR_ENV_VARS","join","LOCAL_STORAGE_SUBDIRS","getLocalDatasetPath","getLocalRequestQueuePath","getLocalUserInfo","result","raw","readFile","AUTH_FILE_PATH","getLoggedClientOrThrow","loggedClient","getLoggedClient","getTokenWithAuthFileFallback","existingToken","existsSync","GLOBAL_CONFIGS_FOLDER","readFileSync","getApifyClientOptions","token","apiBaseUrl","config","AxiosHeaders","key","value","APIFY_CLIENT_DEFAULT_HEADERS","apifyClient","ApifyClient","userInfo","ensureApifyDirectory","writeFileSync","getLocalConfigPath","cwd","LOCAL_CONFIG_PATH","getJsonFileContent","filePath","getLocalConfig","setLocalConfig","localConfig","actDir","fullPath","mkdir","dirname","GITIGNORE_REQUIRED_CONTENTS","setLocalEnv","keyValueStorePath","ensureFolderExistsSync","gitignorePath","gitignoreContents","gitignoreAdditions","gitignoreRequirement","escapeStringRegexp","mime","Mime","standardMimes","otherMimes","getSourceFileFormat","fileContent","contentType","SOURCE_FILE_FORMATS","getEncoding","createSourceFiles","paths","file","format","getActorLocalFilePaths","globby","createActZip","zipName","pathsToZip","deleteFile","writeStream","createWriteStream","archive","archiver","globPath","getLocalInput","defaultLocalStorePath","inputName","readdirSync","INPUT_FILE_REG_EXP","input","purgeDefaultQueue","defaultQueuesPath","rimrafPromised","purgeDefaultDataset","defaultDatasetPath","purgeDefaultKeyValueStore","defaultKeyValueStorePath","filesToDelete","deletePromises","outputJobLog","job","timeoutMillis","logId","status","client","ACTOR_JOB_TERMINAL_STATUSES","log","stream","nodeTimeout","chunk","checkIfStorageIsEmpty","__name","globby","getLocalStorageDir","getLocalKeyValueStorePath","KEY_VALUE_STORE_KEYS","validateActorName","actorName","ACTOR_NAME","sanitizeActorName","sanitizedName","isPythonVersionSupported","installedPythonVersion","satisfies","MINIMUM_SUPPORTED_PYTHON_VERSION","isNodeVersionSupported","installedNodeVersion","minimumSupportedNodeVersion","minVersion","SUPPORTED_NODEJS_VERSION","gte","downloadAndUnzip","url","pathTo","zipStream","httpsGet","chunks","chunk","finished","AdmZip","ensureApifyDirectory","file","path","dirname","mkdirSync","TimestampFormatter","Timestamp","MultilineTimestampFormatter","DateOnlyTimestampFormatter","DurationFormatter","SapphireDurationFormatter","ShortDurationFormatter","TimeTypes","objectGroupBy","items","keySelector","result","i","item","key","mapGroupBy","map","index","value","list","printJsonToStdout","object","tildify","homedir","telemetryWarningText","createAnonymousId","cryptoRandomObjectId","__name","migrateStateV0ToV1","state","casted","existingAuthState","getLocalUserInfo","updateTelemetryState","stateToUpdate","useTelemetryState","filePath","TELEMETRY_FILE_PATH","existsSync","info","readFileSync","updater","stateClone","dirPath","dirname","mkdirSync","writeFileSync","updateUserId","userId","updateTelemetryEnabled","enabled","useTelemetryEnabled","cliDebugPrint","telemetryState","useTelemetryState","__name","useTelemetryIdentifiers","telemetryState","useTelemetryState","__name","metadata","useCLIMetadata","SEGMENT_API_URL","SEGMENT_WRITE_KEY","trackEvent","event","eventData","identifiers","useTelemetryIdentifiers","segmentPayload","USER_AGENT","cliDebugPrint","useTelemetryEnabled","res","error","__name","access","readFile","basename","dirname","join","resolve","process","ok","existsSync","readdirSync","join","resolve","ConfigParser","input","isCI","constants","fstat_","process","promisify","fstat","promisify","fstat_","cachedStdinState","useStdin","stdinStream","process","state","pipedIn","stat","cliDebugPrint","constants","__name","ConfirmFlag","NoConfirmFlag","stdinCheckWrapper","fn","errorMessageForStdin","input","rest","isTTY","hasData","useStdin","casted","isCI","__name","useUserInput","stdinCheckWrapper","message","validate","defaultValue","input","readFileSync","Spider","__name","data","SpiderFileAnalyzer","__name","pathname","file","readFileSync","regex","spiders","match","Spider","ScrapyProjectAnalyzer","__name","pathname","existsSync","join","config","ConfigParser","scrapyCfgPath","resolve","assumedBotName","botName","useUserInput","spiderModules","spiderPaths","spiders","spiderPath","spidersDir","files","readdirSync","file","SpiderFileAnalyzer","process","none","some","execa","which","stat","isAbsolute","join","normalizeExecutablePath","path","isAbsolute","__name","getInstallCommandSuggestion","actFolderDir","installCommandSuggestion","useCwdProject","project","hasYarnLock","hasPnpmLock","hasBunLockb","hasBunLock","stat","join","cwdCache","runtimesToCheck","getRuntimeVersion","runtimePath","args","result","execa","process","__name","getNpmVersion","npmPath","useJavaScriptRuntime","cwd","cached","cliDebugPrint","runtime","normalizeExecutablePath","which","version","res","some","none","platform","join","process","none","some","execa","which","cwdCache","getPythonVersion","runtimePath","result","execa","process","__name","usePythonRuntime","cwd","force","cached","cliDebugPrint","isWindows","platform","pathParts","fullPythonVenvPath","join","normalizeExecutablePath","version","some","fallbacks","fallback","fullPath","which","none","cwdCache","useCwdProject","cwd","process","cached","cliDebugPrint","ok","project","maybeErr","__name","checkScrapyProject","runtime","usePythonRuntime","scrapyProject","ScrapyProjectAnalyzer","pythonFile","checkPythonProject","isPython","isNode","checkNodeProject","useJavaScriptRuntime","packageJsonPath","join","rawString","readFile","pkg","access","resolve","filesToCheck","path","baseName","basename","dirname","chalk","chalk","indentString","widestLine","wrapAnsi","chalk","indent","width","stripAnsi","widestLine","wrap","chalk","indent","width","wrap","cachedMaxLineWidth","getMaxLineWidth","override","windowWidth","__name","BaseCommandRenderer","__name","entrypoint","command","result","chalk","wrapped","wrap","getMaxLineWidth","indented","indent","state","itemToAdd","indentSize","currentLength","width","sizeOfItemToAdd","flagName","kebabCaseString","camelCaseToKebabCase","flag","flagKey","mainFlagPart","flagValues","CommandHelp","BaseCommandRenderer","__name","result","options","chalk","baseString","indentLevel","width","finalString","args","argName","arg","flags","flag","sortedFlags","a","b","flagsToIgnore","flagName","requiredState","flagParts","exclusiveFlagName","exclusiveFlag","exclusiveFlagString","wrapped","wrap","getMaxLineWidth","indented","indent","widestArgNameLength","widestLine","fullString","linesOfFlags","stringParts","flagValues","widestFlagNameLength","stripAnsi","flagString","paddingToAdd","line","chalk","indentString","widestLine","wrapAnsi","CommandWithSubcommandsHelp","BaseCommandRenderer","__name","result","options","chalk","widestSubcommandNameLength","widestLine","subcommand","shortDescription","fullString","wrapped","wrapAnsi","getMaxLineWidth","indented","indentString","commands","registerCommandForHelpGeneration","entrypoint","command","error","CommandWithSubcommandsHelp","subcommand","CommandHelp","__name","renderHelpForCommand","renderer","selectiveRenderHelpForCommand","options","sortByName","itemA","itemB","renderMainHelpMenu","cliMetadata","useCLIMetadata","result","chalk","allGroupedByType","mapGroupBy","helpGenerator","groupedSubcommands","groupedCommands","lines","widestTopicNameLength","widestLine","shortDescription","fullString","wrapped","wrapAnsi","getMaxLineWidth","indentString","widestCommandNameLength","CommandErrorCode","CommandError","_CommandError","__name","code","message","metadata","command","match","flagData","helpMessage","selectiveRenderHelpForCommand","chalk","v","flagName","value","flag","matcher","providedButReceivedNoValue","flagPairs","messageParts","redArrow","a","b","firstUse","secondUse","cliMetadata","useCLIMetadata","cachedStdinInput","base","line","part","error","casted","camelCaseString","str","_","group1","__name","kebabCaseString","camelCaseToKebabCase","helpFlagDefinition","jsonFlagDefinition","commandRegistry","COMMANDS_WITHIN_ACTOR","ApifyCommand","entrypoint","commandString","aliasUsed","subcommandAliasUsed","metadata","useCLIMetadata","amount","singular","plural","renderHelpForCommand","parseResult","rawFlags","rawArgs","rawTokens","missingRequiredArgs","index","userArgName","builderData","camelCasedName","rawArg","err","error","useCwdProject","project","trackEvent","userFlagName","rawBaseFlagName","baseFlagName","allMatchers","alias","commandFlagKey","flagKey","exclusiveFlagMap","flagThatUsedStdin","usedShortFormOfTheFlag","token","existingExclusiveFlags","exclusiveFlag","exclusiveFlagKebabCasedName","exclusiveFlagExisting","matchingFlags","matcher","CommandError","rawFlag","parsed","choice","chalk","exclusiveErrors","flagA","flags","flagB","flagAValue","flagBValue","flagRepresentation","kebabCasedFlag","value","help","selectiveRenderHelpForCommand","widestArgNameLength","widestLine","missingArgsStrings","argName","arg","fullString","wrapped","wrapAnsi","getMaxLineWidth","indented","indentString","mode","cachedStdinInput","object","key","internalBuilderData","flagDefinitions","flagName","option","registerCommandForHelpGeneration","subcommand","subcommandAlias","internalRunCommand","entrypoint","command","argsFlags","rawObject","positionalIndex","key","value","type","rawKey","yargsFlagName","kebabCaseString","camelCaseToKebabCase","instance","__name","once","readStdin","dataRef","useStdin","hasData","waitDelay","stream","bufferChunks","controller","timeout","chunk","once","error","concat","__name","gt","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","migrateStateV0ToV1","state","casted","lastChecked","lastVersion","cliDebugPrint","updateLocalState","stateToUpdate","__name","emptyState","useLocalState","stateFilePath","STATE_FILE_PATH","existsSync","readFileSync","updater","stateClone","filePath","dirPath","dirname","mkdirSync","writeFileSync","metadata","useCLIMetadata","USER_AGENT","sitesToCheck","isOnline","timeout","controller","timeoutId","res","site","cliDebugPrint","__name","getLatestVersion","state","warning","version","updateLocalState","stateToUpdate","shouldSkipVersionCheck","useCLIVersionCheck","force","localState","useLocalState","stateIsOutdated","CHECK_VERSION_EVERY_MILLIS","shouldFetchFromApi","latestVersion","shouldUpdate","gt","jaroWinkler","levenshtein","useCommandSuggestions","inputString","allCommands","commandRegistry","a","b","lowercasedCommandString","cmdString","cmdClass","lowercased","cmdStringParts","lastPart","isAlias","levenshteinDistance","levenshtein","jaroWinklerDistance","jaroWinkler","matches","cliDebugPrint","item","__name","cachedStdinInput","readStdin","cliMetadata","useCLIMetadata","USER_AGENT","processVersionCheck","cliName","satisfies","process","SUPPORTED_NODEJS_VERSION","error","__name","printCLIVersionAndExitIfFlagUsed","parsed","printHelpAndExitIfFlagUsedOrNoCommandPassed","entrypoint","renderMainHelpMenu","handleCommandNotFound","commandName","closestMatches","useCommandSuggestions","message","chalk","cmd","runVersionCheck","maybeCommandName","UpgradeCommand","commandRegistry","id","cliDebugPrint","shouldSkipVersionCheck","internalRunCommand","runCLI","startingArgs","startingResult","parseArgs","maybeSubcommandName","hasSubcommand","baseCommand","FinalCommand","rebuiltArgs","commandNameIndex","subcommandNameIndex","instance","parserOptions","commandResult","err","commandError","CommandError","join","resolve","process","calculateRunDynamicMemory","Flags","stringFlag","booleanFlag","integerFlag","options","__name","objectName","allAliases","returnValue","alias","kebabCaseString","camelCaseToKebabCase","mkdir","rename","writeFile","dirname","join","process","inspect","err","ok","createPrompt","isEnterKey","makeTheme","useKeypress","usePrefix","useState","getBooleanValue","value","defaultValue","answer","__name","boolToString","confirmImpl_default","createPrompt","config","done","transformer","status","setStatus","useState","setValue","theme","makeTheme","prefix","usePrefix","useKeypress","key","rl","isEnterKey","formattedValue","message","useYesNoConfirm","stdinCheckWrapper","message","defaultValue","confirmImpl_default","getDeprecatedLocalConfigPath","__name","cwd","join","DEPRECATED_LOCAL_CONFIG_NAME","cwdCache","useActorConfig","process","migrateConfig","warnAboutOldConfig","cached","cliDebugPrint","ok","newConfigPath","getLocalConfigPath","deprecatedConfigPath","config","deprecatedConfig","getJsonFileContent","ex","err","handleBothConfigVersionsFound","migrated","migratedConfig","handleMigrationFlow","useYesNoConfirm","warning","rename","info","error","inspect","MIGRATED_APIFY_JSON_PROPERTIES","configPath","updateLocalConfigStructure","ACTOR_SPECIFICATION_VERSION","acc","prop","mkdir","dirname","writeFile","casted","localConfig","updatedLocalConfig","env","envVar","DEFAULT_INPUT_PATH","join","getLocalKeyValueStorePath","ActorCalculateMemoryCommand","ApifyCommand","Flags","input","memoryExpression","minMemory","maxMemory","runOptions","inputPath","resolve","process","inputJson","getJsonFileContent","info","result","calculateRunDynamicMemory","clampedResult","success","err","error","defaultMemoryMbytes","cwd","localConfigResult","useActorConfig","message","cause","localConfig","APIFY_ENV_VARS","process","pipeline","MemoryStorage","ApifyClient","ACTOR_ENV_VARS","APIFY_ENV_VARS","KEY_VALUE_STORE_KEYS","LOCAL_ACTOR_ENV_VARS","APIFY_STORAGE_TYPES","getApifyTokenFromEnvOrAuthFile","__name","apifyToken","process","APIFY_ENV_VARS","localUserInfo","getLocalUserInfo","getApifyStorageClient","options","forceCloud","storageDir","getLocalStorageDir","MemoryStorage","ApifyClient","getApifyClientOptions","getDefaultStorageId","storeType","envVarName","ACTOR_ENV_VARS","LOCAL_ACTOR_ENV_VARS","outputRecordFromDefaultStore","key","apifyClient","defaultStoreId","record","pipeline","outputInputFromDefaultStore","KEY_VALUE_STORE_KEYS","stringArg","option","__name","Args","ActorChargeCommand","ApifyCommand","Args","Flags","eventName","count","testPayPerEvent","idempotencyKey","info","apifyToken","getApifyTokenFromEnvOrAuthFile","apifyClient","getLoggedClient","runId","APIFY_ENV_VARS","ActorGetInputCommand","ApifyCommand","outputInputFromDefaultStore","ACTOR_ENV_VARS","APIFY_ENV_VARS","ActorGetPublicUrlCommand","ApifyCommand","Args","key","APIFY_ENV_VARS","error","storeId","ACTOR_ENV_VARS","apifyClient","getApifyStorageClient","publicTarballUrl","ActorGetValueCommand","ApifyCommand","Args","key","outputRecordFromDefaultStore","ActorPushDataCommand","ApifyCommand","Args","_item","item","cachedStdinInput","error","apifyClient","getApifyStorageClient","defaultStoreId","getDefaultStorageId","APIFY_STORAGE_TYPES","parsedData","err","ActorSetValueCommand","ApifyCommand","Args","Flags","key","value","contentType","recordValue","storeClient","getApifyStorageClient","getDefaultStorageId","APIFY_STORAGE_TYPES","ActorIndexCommand","ApifyCommand","ActorSetValueCommand","ActorPushDataCommand","ActorGetValueCommand","ActorGetPublicUrlCommand","ActorGetInputCommand","ActorChargeCommand","ActorCalculateMemoryCommand","chalk","process","resolveActorContext","providedActorNameOrId","client","userInfo","getLocalUserInfo","usernameOrId","localConfig","getLocalConfig","process","actor","actorById","actorByName","__name","BuildsCreateCommand","ApifyCommand","Flags","Args","tag","version","json","log","actorId","client","getLoggedClientOrThrow","ctx","resolveActorContext","error","actorInfo","taggedVersions","objectGroupBy","actorVersion","specificVersionExists","v","selectedVersion","actualTag","chalk","build","printJsonToStdout","message","TimestampFormatter","url","viewMessage","simpleLog","outputJobLog","err","ActorsBuildCommand","BuildsCreateCommand","process","DownloadItemsFormat","chalk","access","readFile","path","resolve","process","mime","resolveInput","cwd","inputOverride","inputToUse","contentType","localInput","getLocalInput","mime","__name","getInputOverride","inputFlag","inputFileFlag","input","source","stdin","cachedStdinInput","parsed","error","process","err","fileExists","access","resolve","inputLooksLikePath","path","fullPath","fsError","fileContent","readFile","process","chalk","ACTOR_JOB_STATUSES","TerminalStatuses","ACTOR_JOB_STATUSES","runActorOrTaskOnCloud","apifyClient","options","cwd","process","actorOrTaskData","runOptions","type","waitForFinishMillis","inputOverride","silent","waitForRunToFinish","printRunLogs","clientMethod","actorInput","resolveInput","run","chalk","err","outputJobLog","warning","resolve","success","error","__name","SharedRunOnCloudFlags","Flags","ActorsCallCommand","_ActorsCallCommand","ApifyCommand","SharedRunOnCloudFlags","Flags","Args","LOCAL_CONFIG_PATH","cwd","process","localConfig","getLocalConfig","apifyClient","getLoggedClientOrThrow","userInfo","getLocalUserInfo","usernameOrId","error","actorId","userFriendlyId","actorData","runOpts","inputOverride","getInputOverride","runStarted","run","url","datasetUrl","iterator","runActorOrTaskOnCloud","yieldedRun","message","chalk","TimestampFormatter","expectedActorVersion","actorVersion","item","runVersionTaggedAs","data","messageParts","simpleLog","printJsonToStdout","datasetId","info","retries","resolve","dataset","DownloadItemsFormat","client","localActorName","providedActorNameOrId","actor","actorById","actorByName","chalk","Table","compactModeChars","compactModeCharsWithLineSeparator","noSeparators","charMap","compactModeChars","compactModeCharsWithLineSeparator","noSeparators","generateHeaderColors","length","__name","terminalColumns","kSkipColumn","ResponsiveTable","_ResponsiveTable","options","item","compactMode","rawHead","headColors","compact","chars","colAligns","head","headKeys","column","row","table","Table","rowData","col","eventTitleColumn","eventPriceUsdColumn","payPerEventTable","ResponsiveTable","ActorsInfoCommand","ApifyCommand","Flags","Args","actorId","readme","input","json","client","getLoggedClientOrThrow","ctx","resolveActorContext","error","actorInfo","actorMaker","taggedBuild","buildData","printJsonToStdout","latest","simpleLog","message","chalk","TimestampFormatter","pricingInfo","latestPricingInfo","minutesToMs","duration","DurationFormatter","pricePerOneKItems","events","eventInfo","split","latestBuild","buildTag","build","Time","chalk","chalk","prettyPrintStatus","status","chalk","part","__name","statusMap","chalk","recentlyUsedTable","ResponsiveTable","myRecentlyUsedTable","ActorsLsCommand","ApifyCommand","Flags","desc","limit","offset","my","json","client","getLoggedClientOrThrow","rawActorList","printJsonToStdout","info","actorList","actorData","actor","runs","table","longestActorTitleLength","acc","curr","title","item","lastRunDisplayedTimestamp","MultilineTimestampFormatter","lastRunDuration","ShortDurationFormatter","duration","defaultBuild","buildVersionToTag","tag","data","runStatus","stringParts","prettyPrintStatus","diff","Time","DateOnlyTimestampFormatter","kSkipColumn","simpleLog","items","a","b","aDate","mkdirSync","readdirSync","writeFileSync","dirname","join","process","AdmZip","axios","jju","gt","tiged","extractGitHubZip","__name","url","directoryPath","data","axios","zipFile","AdmZip","ActorsPullCommand","ApifyCommand","Flags","Args","cwd","process","actorConfigResult","useActorConfig","error","actorConfig","userInfo","getLocalUserInfo","apifyClient","getLoggedClientOrThrow","isActorAutomaticallyDetected","usernameOrId","actorId","actor","name","versions","throwMissingSourceCodeAccessError","correctVersion","version","match","curr","gt","dirpath","join","mkdirSync","readdirSync","sourceFiles","file","folderPath","dirname","fileContent","LOCAL_CONFIG_PATH","actorJson","jju","writeFileSync","gitRepoUrl","repoUrl","branchDirPart","branch","dir","branchDirRepoUrl","emitter","tiged","err","success","readFileSync","statSync","unlinkSync","join","resolve","process","open","fetchManifest","ACTOR_JOB_STATUSES","ACTOR_SOURCE_TYPES","MAX_MULTIFILE_BYTES","createHmacSignature","readFileSync","writeFileSync","SECRET_KEY_PREFIX","MAX_ENV_VAR_NAME_LENGTH","MAX_ENV_VAR_VALUE_LENGTH","getSecretsFile","__name","readFileSync","SECRETS_FILE_PATH","writeSecretsFile","secrets","ensureApifyDirectory","writeFileSync","addSecret","name","value","removeSecret","isSecretKey","envValue","replaceSecretsValue","env","updatedEnv","key","secretKey","warning","transformEnvToEnvVars","envVars","TEMP_ZIP_FILE_NAME","DEFAULT_RUN_OPTIONS","DEFAULT_ACTOR_VERSION_NUMBER","DEFAULT_BUILD_TAG","ActorsPushCommand","ApifyCommand","LOCAL_CONFIG_PATH","MAX_MULTIFILE_BYTES","Flags","Args","cwd","resolve","process","filePathsToPush","getActorLocalFilePaths","error","DEPRECATED_LOCAL_CONFIG_NAME","filePath","fp","apifyClient","getLoggedClientOrThrow","actorConfigResult","useActorConfig","actorConfig","userInfo","getLocalUserInfo","redirectUrlPart","actorId","actor","isActorCreatedNow","version","buildTag","waitForFinishMillis","forceActorId","usernameOrId","templates","fetchManifest","defaultRunOptions","t","newActor","ACTOR_SOURCE_TYPES","info","actorClient","filesSize","sumFilesSizeInBytes","sourceType","sourceFiles","tarballUrl","client","mostRecentModifiedFileMs","modifiedMs","mtimeMs","ctimeMs","statSync","join","fileModifiedMs","actorModifiedMs","createSourceFiles","run","createActZip","store","key","buffer","readFileSync","unlinkSync","tempTarballUrl","signature","createHmacSignature","actorCurrentVersion","envVars","transformEnvToEnvVars","actorVersionModifier","actorNewVersion","build","outputJobLog","err","warning","link","open","ACTOR_JOB_STATUSES","success","ActorsRmCommand","ApifyCommand","Args","actorId","apifyClient","getLoggedClientOrThrow","error","useYesNoConfirm","info","success","err","casted","chalk","ActorsStartCommand","ApifyCommand","SharedRunOnCloudFlags","Flags","Args","LOCAL_CONFIG_PATH","cwd","localConfig","getLocalConfig","apifyClient","getLoggedClientOrThrow","userInfo","getLocalUserInfo","usernameOrId","actorId","userFriendlyId","actorData","ActorsCallCommand","runOpts","inputOverride","getInputOverride","iterator","runActorOrTaskOnCloud","run","yieldedRun","printJsonToStdout","url","datasetUrl","message","chalk","TimestampFormatter","expectedActorVersion","actorVersion","item","runVersionTaggedAs","data","messageParts","simpleLog","ActorsIndexCommand","ApifyCommand","ActorsStartCommand","ActorsRmCommand","ActorsPushCommand","ActorsPullCommand","ActorsLsCommand","ActorsInfoCommand","ActorsCallCommand","ActorsBuildCommand","chalk","noColor","__name","val","prettyPrintBytes","bytes","shortBytes","colorFunc","precision","sizes","BuildsInfoCommand","ApifyCommand","Args","buildId","apifyClient","getLoggedClientOrThrow","build","error","printJsonToStdout","actor","buildTag","tag","buildData","exitCode","fullActorName","versionTaggedAs","chalk","exitCodeStatus","message","prettyPrintStatus","TimestampFormatter","DurationFormatter","diff","dockerImageSize","prettyPrintBytes","url","simpleLog","BuildsLogCommand","ApifyCommand","Args","buildId","apifyClient","getLoggedClientOrThrow","build","error","info","outputJobLog","err","chalk","tableFactory","__name","ResponsiveTable","BuildsLsCommand","ApifyCommand","Flags","Args","desc","limit","offset","compact","json","actorId","client","getLoggedClientOrThrow","ctx","resolveActorContext","error","allBuilds","actorInfo","buildsByActorVersion","objectGroupBy","item","versionNumber","major","minor","buildTagToActorVersion","acc","tag","data","build","buildNumber","hasTag","printJsonToStdout","simpleLog","chalk","sortedActorVersions","a","actorVersion","buildsForVersion","latestBuildTag","v","table","latestBuildTagMessage","message","finishedAt","diff","ShortDurationFormatter","prettyPrintStatus","input","useInputConfirmation","stdinCheckWrapper","message","expectedValue","failureMessage","input","value","BuildsRmCommand","ApifyCommand","Args","buildId","apifyClient","getLoggedClientOrThrow","build","error","actor","confirmationPrompt","tag","buildData","useInputConfirmation","useYesNoConfirm","info","success","err","casted","BuildsIndexCommand","ApifyCommand","BuildsRmCommand","BuildsLsCommand","BuildsLogCommand","BuildsInfoCommand","BuildsCreateCommand","TopLevelCallCommand","ActorsCallCommand","assert","existsSync","mkdir","readFile","symlink","unlink","writeFile","basename","join","chalk","pathToInstallMarker","__name","installPath","join","InstallCommand","ApifyCommand","installMethod","version","useCLIMetadata","info","assert","installMarkerPath","existsSync","writeFile","cliDebugPrint","simpleLog","success","chalk","userHomeDirectory","warning","localBinDirectory","mkdir","fileNames","file","originalPath","symlinkPath","unlink","symlink","installDir","binDir","allowedToAutomaticallyDo","useYesNoConfirm","shell","basename","quotedInstallDir","linesToAdd","configFile","configFiles","maybeConfigFile","newContent","readFile","tildify","line","spawn","existsSync","lstat","readdir","writeFile","dirname","join","chalk","gte","Result","execa","spawnPromised","__name","cmd","args","opts","escapedCommand","normalizeExecutablePath","cliDebugPrint","childProcess","execa","Result","execaError","execWithLog","overrideCommand","run","result","err","error","execSync","existsSync","readFileSync","metadata","useCLIMetadata","isInstalledOnMusl","existsSync","__name","isInstalledOnBaseline","execSync","readFileSync","useCLIVersionAssets","version","versionWithoutV","tag","release","USER_AGENT","cliDebugPrint","body","requiresMusl","requiresBaseline","assets","asset","_cliEntrypoint","_version","assetOs","assetArch","assetBaselineOrMusl","assetBaseline","UPDATE_COMMANDS","__name","_","entrypoint","version","MINIMUM_VERSION_FOR_UPGRADE_COMMAND","WINDOWS_UPGRADE_SCRIPT_URL","UpgradeCommand","ApifyCommand","Flags","result","useCLIVersionCheck","installMethod","useCLIMetadata","DEVELOPMENT_VERSION_MARKER","cliDebugPrint","info","updateCommand","simpleLog","message","chalk","warning","gte","error","versionData","useCLIVersionAssets","assets","versionWithoutV","metadata","bundleDirectory","dirname","directoryEntries","readdir","entry","execWithLog","success","args","join","urls","asset","upgradeProcess","spawn","err","filePath","existsSync","res","USER_AGENT","buffer","writeFile","cliName","body","originalFilePerms","lstat","stat","mkdir","readdir","stat","join","process","gte","minVersion","fetchManifest","manifestUrl","createWriteStream","pipeline","Separator","select","useSelectFromList","stdinCheckWrapper","message","choices","pageSize","loop","defaultValue","select","PROGRAMMING_LANGUAGES","ensureValidActorName","maybeActorName","validateActorName","promptActorName","__name","getTemplateDefinition","maybeTemplateName","manifestPromise","manifest","templateDefinition","t","executePrompts","enhanceReadmeWithLocalSuffix","readmePath","suffixStream","httpsGet","readmeStream","createWriteStream","pipeline","err","warning","formatCreateSuccessMessage","params","actorName","dependenciesInstalled","postCreate","gitRepositoryInitialized","installCommandSuggestion","message","programmingLanguage","promptProgrammingLanguage","promptTemplateDefinition","promptTemplateInstallation","useUserInput","promptText","useSelectFromList","choices","Separator","existsSync","writeFileSync","join","process","deepClone","KEY_VALUE_STORE_KEYS","validateInputSchema","DEFAULT_INPUT_SCHEMA_PATHS","readInputSchema","__name","forcePath","cwd","process","getJsonFileContent","localConfig","getLocalConfig","fullPath","join","ACTOR_SPECIFICATION_FOLDER","path","existsSync","createPrefilledInputFileFromInputSchema","actorFolderDir","inputFile","inputSchema","validator","Ajv2019","validateInputSchema","acc","key","fieldSchema","err","warning","keyValueStorePath","getLocalKeyValueStorePath","inputJsonPath","KEY_VALUE_STORE_KEYS","writeFileSync","getDefaultsFromInputSchema","defaults","getAjvValidator","ajvInstance","copyOfSchema","deepClone","inputSchemaFieldKey","inputSchemaField","isRequired","hasDefault","CreateCommand","ApifyCommand","Flags","manifestUrl","Args","actorName","templateName","skipDependencyInstall","skipGitInit","templateArchiveUrl","skipOptionalDeps","manifestPromise","fetchManifest","err","ensureValidActorName","cwd","process","actFolderDir","join","folderExists","stat","folderHasFiles","readdir","files","error","mkdir","messages","templateDefinition","getTemplateDefinition","downloadAndUnzip","localConfig","getJsonFileContent","LOCAL_CONFIG_PATH","setLocalConfig","EMPTY_LOCAL_CONFIG","setLocalEnv","createPrefilledInputFileFromInputSchema","packageJsonPath","readmePath","enhanceReadmeWithLocalSuffix","dependenciesInstalled","useCwdProject","project","minimumSupportedNodeVersion","minVersion","SUPPORTED_NODEJS_VERSION","warning","MINIMUM_SUPPORTED_PYTHON_VERSION","runtime","isNodeVersionSupported","updateLocalJson","cmdArgs","gte","execWithLog","isPythonVersionSupported","venvPath","info","PYTHON_VENV_PATH","usePythonRuntime","gitInitResult","cwdHasGit","installCommandSuggestion","getInstallCommandSuggestion","simpleLog","success","formatCreateSuccessMessage","chalk","tryToGetStorage","client","id","storageType","byIdOrName","info","getLocalUserInfo","byName","__name","tryToGetDataset","datasetId","tryToGetKeyValueStore","keyValueStoreId","DatasetsCreateCommand","ApifyCommand","Args","datasetName","client","getLoggedClientOrThrow","tryToGetDataset","error","newDataset","printJsonToStdout","success","chalk","DownloadItemsFormat","downloadFormatToContentType","DownloadItemsFormat","DatasetsGetItems","ApifyCommand","Flags","Args","limit","offset","format","datasetId","apifyClient","getLoggedClientOrThrow","maybeDataset","error","datasetClient","result","contentType","simpleLog","client","byIdOrName","info","getLocalUserInfo","byName","chalk","getUserPlanPricing","userPlan","planPricing","__name","consoleLikeTable","ResponsiveTable","DatasetsInfoCommand","ApifyCommand","Args","storeId","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetDataset","error","info","user","actor","run","u","task","printJsonToStdout","fullSizeInBytes","readCount","writeCount","cleanCount","totalCount","operationsParts","chalk","row3","pricing","getUserPlanPricing","storeCostPerHour","storeCostPerMonth","usdAmountString","prettyPrintBytes","row1","TimestampFormatter","runInfo","actorInfo","taskInfo","row2","rows","row","message","simpleLog","chalk","table","ResponsiveTable","DatasetsLsCommand","ApifyCommand","Flags","desc","offset","limit","json","unnamed","client","getLoggedClientOrThrow","user","getLocalUserInfo","rawDatasetList","printJsonToStdout","info","dataset","size","TimestampFormatter","prettyPrintBytes","chalk","simpleLog","chalk","DatasetsPushDataCommand","ApifyCommand","Args","nameOrId","_item","client","getLoggedClientOrThrow","existingDataset","tryToGetDataset","error","datasetClient","dataset","parsedData","item","cachedStdinInput","err","idMessage","chalk","success","casted","chalk","DatasetsRenameCommand","ApifyCommand","Flags","Args","unname","newName","nameOrId","error","client","getLoggedClientOrThrow","existingDataset","tryToGetDataset","id","name","successMessage","chalk","success","err","casted","chalk","DatasetsRmCommand","ApifyCommand","Args","datasetNameOrId","client","getLoggedClientOrThrow","existingDataset","tryToGetDataset","error","useYesNoConfirm","info","id","name","success","chalk","err","casted","DatasetsIndexCommand","ApifyCommand","DatasetsCreateCommand","DatasetsGetItems","DatasetsLsCommand","DatasetsInfoCommand","DatasetsRmCommand","DatasetsRenameCommand","DatasetsPushDataCommand","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","cors","detectIndent","express","open","cryptoRandomObjectId","INPUT_SCHEMA_EDITOR_BASE_URL","INPUT_SCHEMA_EDITOR_ORIGIN","API_VERSION","EditInputSchemaCommand","ApifyCommand","Args","existingSchema","inputSchemaPath","readInputSchema","LOCAL_CONFIG_PATH","warning","info","server","app","express","cors","_","res","next","authToken","cryptoRandomObjectId","req","token","authorizationHeader","schema","tokenFromHeader","extra","apiRouter","jsonIndentation","appendFinalNewline","inputSchemaStr","existsSync","readFileSync","detectIndent","err","errorMessage","error","inputSchemaObj","inputSchemaDir","dirname","mkdirSync","writeFileSync","success","port","editorUrl","open","chalk","HelpCommand","ApifyCommand","Args","commandString","helpMenu","renderMainHelpMenu","lowercasedCommandString","command","commandRegistry","closestMatches","useCommandSuggestions","message","chalk","cmd","error","renderHelpForCommand","chalk","InfoCommand","ApifyCommand","getLoggedClientOrThrow","info","getLocalUserInfo","niceInfo","key","chalk","basename","process","appendFileSync","copyFileSync","createWriteStream","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","basename","join","relative","sep","fileURLToPath","rootWalk","ConfigParser","Handlebars","fetchManifest","wrapperManifestUrl","concatenableFiles","templatePath","fileURLToPath","merge","fromPath","toPath","options","rootWalk","_err","pathname","dirent","relPath","relative","toRelPath","sep","part","binding","targetPath","join","existsSync","mkdirSync","writeFileSync","Handlebars","readFileSync","basename","appendFileSync","copyFileSync","__name","wrapScrapyProject","projectPath","analyzer","ScrapyProjectAnalyzer","spiderIndex","useSelectFromList","spider","i","translatePathToRelativeModuleName","templateBindings","sanitizeActorName","manifest","fetchManifest","wrapperManifestUrl","info","archiveUrl","id","rmSync","downloadAndUnzip","apifyConf","ConfigParser","s","createWriteStream","r","fd","success","InitCommand","ApifyCommand","LOCAL_CONFIG_PATH","DEFAULT_LOCAL_STORAGE_DIR","Args","Flags","actorName","cwd","process","projectResult","useCwdProject","error","project","info","wrapScrapyProject","warning","useYesNoConfirm","actorConfig","useActorConfig","cfg","response","answer","useUserInput","basename","validateActorName","err","configToWrite","EMPTY_LOCAL_CONFIG","setLocalConfig","setLocalEnv","createPrefilledInputFileFromInputSchema","success","WrapScrapyCommand","ApifyCommand","Args","wrapScrapyProject","info","chalk","KeyValueStoresCreateCommand","ApifyCommand","Args","keyValueStoreName","client","getLoggedClientOrThrow","tryToGetKeyValueStore","error","newStore","printJsonToStdout","success","chalk","chalk","KeyValueStoresDeleteValueCommand","ApifyCommand","Args","storeId","itemKey","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetKeyValueStore","error","client","useYesNoConfirm","info","chalk","err","casted","KeyValueStoresGetValueCommand","ApifyCommand","Flags","Args","onlyContentType","keyValueStoreId","itemKey","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetKeyValueStore","error","storeClient","itemRecord","simpleLog","stream","chunks","chunk","concatenated","parsed","chalk","consoleLikeTable","ResponsiveTable","KeyValueStoresInfoCommand","ApifyCommand","Args","storeId","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetKeyValueStore","error","info","user","actor","run","u","task","printJsonToStdout","fullSizeInBytes","readCount","writeCount","deleteCount","listCount","row3","chalk","pricing","getUserPlanPricing","storeCostPerHour","storeCostPerMonth","usdAmountString","prettyPrintBytes","row1","TimestampFormatter","runInfo","actorInfo","taskInfo","row2","rows","row","message","simpleLog","table","ResponsiveTable","KeyValueStoresKeysCommand","ApifyCommand","Flags","Args","storeId","limit","exclusiveStartKey","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetKeyValueStore","error","client","keys","printJsonToStdout","keyData","prettyPrintBytes","simpleLog","chalk","table","ResponsiveTable","KeyValueStoresLsCommand","ApifyCommand","Flags","desc","offset","limit","json","unnamed","client","getLoggedClientOrThrow","user","getLocalUserInfo","rawKvsList","printJsonToStdout","info","store","size","TimestampFormatter","prettyPrintBytes","chalk","simpleLog","chalk","KeyValueStoresRenameCommand","ApifyCommand","Flags","Args","unname","newName","keyValueStoreNameOrId","error","client","getLoggedClientOrThrow","existingDataset","tryToGetKeyValueStore","id","name","successMessage","chalk","success","err","casted","chalk","KeyValueStoresRmCommand","ApifyCommand","Args","keyValueStoreNameOrId","client","getLoggedClientOrThrow","existingKvs","tryToGetKeyValueStore","error","useYesNoConfirm","info","id","name","success","chalk","err","casted","KeyValueStoresSetValueCommand","ApifyCommand","Flags","Args","storeId","itemKey","value","contentType","apifyClient","getLoggedClientOrThrow","maybeStore","tryToGetKeyValueStore","error","client","success","err","casted","KeyValueStoresIndexCommand","ApifyCommand","KeyValueStoresCreateCommand","KeyValueStoresDeleteValueCommand","KeyValueStoresGetValueCommand","KeyValueStoresInfoCommand","KeyValueStoresKeysCommand","KeyValueStoresLsCommand","KeyValueStoresRenameCommand","KeyValueStoresRmCommand","KeyValueStoresSetValueCommand","chalk","computerName","cors","express","open","cryptoRandomObjectId","password","useMaskedInput","stdinCheckWrapper","message","mask","password","CONSOLE_BASE_URL","CONSOLE_URL_ORIGIN","API_BASE_URL","API_VERSION","tryToLogin","__name","token","isUserLogged","getLoggedClient","userInfo","getLocalUserInfo","updateUserId","success","chalk","AUTH_FILE_PATH","error","LoginCommand","ApifyCommand","tildify","Flags","method","selectedMethod","useSelectFromList","server","app","express","cors","_","res","next","authToken","cryptoRandomObjectId","req","serverToken","authorizationHeader","schema","tokenFromHeader","extra","apiRouter","err","errorMessage","port","consoleUrl","computerName","info","open","tokenAnswer","useMaskedInput","LogoutCommand","ApifyCommand","tildify","AUTH_FILE_PATH","rimrafPromised","updateUserId","success","TopLevelPullCommand","ActorsPullCommand","ToplevelPushCommand","ActorsPushCommand","RequestQueuesIndexCommand","ApifyCommand","existsSync","renameSync","mkdir","readFile","stat","writeFile","dirname","join","process","mime","minVersion","APIFY_ENV_VARS","validateInputSchema","validateInputUsingValidator","none","some","execa","jsScript","__name","mod","pyScript","moduleVersionScripts","useModuleVersion","moduleName","project","cliDebugPrint","none","moduleVersionScriptKey","args","result","execa","some","ex","RunCommand","ApifyCommand","DEFAULT_LOCAL_STORAGE_DIR","Flags","cwd","process","proxy","userId","token","getLocalUserInfo","localConfigResult","useActorConfig","message","cause","error","localConfig","actualStoragePath","getLocalStorageDir","projectRuntimeResult","useCwdProject","project","type","cwdEntrypoint","runtime","SUPPORTED_NODEJS_VERSION","MINIMUM_SUPPORTED_PYTHON_VERSION","runType","entrypoint","entrypointPath","join","entrypointStat","stat","existsSync","LEGACY_LOCAL_STORAGE_DIR","renameSync","warning","crawleeVersion","useModuleVersion","CRAWLEE_PURGE_ON_START","purgeDefaultQueue","purgeDefaultKeyValueStore","purgeDefaultDataset","info","checkIfStorageIsEmpty","inputOverride","getInputOverride","storedInputResults","localEnvVars","APIFY_ENV_VARS","updatedEnv","replaceSecretsValue","env","minimumSupportedNodeVersion","minVersion","isNodeVersionSupported","execWithLog","packageJson","readFile","packageJsonObj","isPythonVersionSupported","err","stderr","stats","writeFile","deleteFile","inputSchema","readInputSchema","existingInput","getLocalInput","inputFilePath","getLocalKeyValueStorePath","mkdir","dirname","validator","Ajv2019","validateInputSchema","defaults","getDefaultsFromInputSchema","compiledInputSchema","getAjvValidator","errorHeader","fullInputOverride","errors","validateInputUsingValidator","e","mime","inputJson","fullInput","ACTOR_JOB_STATUSES","runningStatuses","ACTOR_JOB_STATUSES","abortingStatuses","RunsAbortCommand","ApifyCommand","Args","Flags","runId","apifyClient","getLoggedClientOrThrow","run","error","result","printJsonToStdout","success","err","casted","chalk","usageTable","ResponsiveTable","usageMapping","RunsInfoCommand","ApifyCommand","Args","Flags","runId","apifyClient","getLoggedClientOrThrow","run","error","actor","build","task","defaultDataset","defaultRequestQueue","printJsonToStdout","fullActorName","message","chalk","exitCodeStatus","prettyPrintStatus","resultCount","renderedTip","TimestampFormatter","ShortDurationFormatter","diff","expectedActorVersion","actorVersion","item","runVersionTaggedAs","data","messageParts","prettyPrintBytes","url","datasetUrl","keyValueStoreUrl","simpleLog","usage","usageUsd","userFriendlyString","property","usageNumber","usdAmount","val","RunsLogCommand","ApifyCommand","Args","runId","apifyClient","getLoggedClientOrThrow","run","error","info","outputJobLog","err","chalk","table","ResponsiveTable","RunsLsCommand","ApifyCommand","Flags","Args","desc","limit","offset","compact","json","actorId","client","getLoggedClientOrThrow","ctx","resolveActorContext","error","allRuns","printJsonToStdout","simpleLog","message","chalk","datasetInfos","run","data","tookString","diff","ShortDurationFormatter","prettyPrintStatus","MultilineTimestampFormatter","ACTOR_JOB_STATUSES","resurrectStatuses","ACTOR_JOB_STATUSES","RunsResurrectCommand","ApifyCommand","Args","runId","apifyClient","getLoggedClientOrThrow","run","error","result","printJsonToStdout","success","err","casted","ACTOR_JOB_STATUSES","deletableStatuses","ACTOR_JOB_STATUSES","RunsRmCommand","ApifyCommand","Args","runId","apifyClient","getLoggedClientOrThrow","run","error","useYesNoConfirm","info","success","err","casted","RunsIndexCommand","ApifyCommand","RunsAbortCommand","RunsInfoCommand","RunsLogCommand","RunsLsCommand","RunsResurrectCommand","RunsRmCommand","SecretsAddCommand","ApifyCommand","Args","name","value","addSecret","chalk","table","ResponsiveTable","SecretsLsCommand","ApifyCommand","json","secrets","getSecretsFile","secretKeys","printJsonToStdout","info","key","chalk","simpleLog","SecretsRmCommand","ApifyCommand","Args","name","removeSecret","SecretsIndexCommand","ApifyCommand","LOCAL_CONFIG_PATH","SecretsAddCommand","SecretsLsCommand","SecretsRmCommand","chalk","TaskRunCommand","ApifyCommand","SharedRunOnCloudFlags","Args","apifyClient","getLoggedClientOrThrow","userInfo","getLocalUserInfo","usernameOrId","taskId","userFriendlyId","title","runOpts","url","datasetUrl","iterator","runActorOrTaskOnCloud","yieldedRun","simpleLog","chalk","client","task","TasksIndexCommand","ApifyCommand","TaskRunCommand","TelemetryDisableCommand","ApifyCommand","useTelemetryState","updateTelemetryEnabled","success","info","TelemetryEnableCommand","ApifyCommand","useTelemetryState","info","updateTelemetryEnabled","success","TelemetryIndexCommand","ApifyCommand","TelemetryEnableCommand","TelemetryDisableCommand","process","validateInputSchema","ValidateInputSchemaCommand","ApifyCommand","LOCAL_CONFIG_PATH","Args","inputSchema","inputSchemaPath","readInputSchema","process","info","validator","Ajv2019","validateInputSchema","success","apifyCommands","ActorIndexCommand","ActorsIndexCommand","BuildsIndexCommand","DatasetsIndexCommand","KeyValueStoresIndexCommand","RequestQueuesIndexCommand","RunsIndexCommand","SecretsIndexCommand","TasksIndexCommand","TelemetryIndexCommand","TopLevelCallCommand","UpgradeCommand","InstallCommand","CreateCommand","EditInputSchemaCommand","InfoCommand","WrapScrapyCommand","InitCommand","LoginCommand","LogoutCommand","TopLevelPullCommand","ToplevelPushCommand","RunCommand","ValidateInputSchemaCommand","HelpCommand","actorCommands","ActorSetValueCommand","ActorPushDataCommand","ActorGetValueCommand","ActorGetPublicUrlCommand","ActorGetInputCommand","ActorChargeCommand","ActorCalculateMemoryCommand"]}