# frozen_string_literal: true module Script module Layers module Application class PushScript class << self def call(ctx:, force:, project:) script_project_repo = Infrastructure::ScriptProjectRepository.new(ctx: ctx) script_project = script_project_repo.get script_project.env = project.env task_runner = Infrastructure::Languages::TaskRunner .for(ctx, script_project.language, script_project.script_name) extension_point = ExtensionPoints.get(type: script_project.extension_point_type) library_name = extension_point.libraries.for(script_project.language)&.package raise Infrastructure::Errors::LanguageLibraryForAPINotFoundError.new( language: script_project.language, api: script_project.extension_point_type ) unless library_name library = { language: script_project.language, version: task_runner.library_version(library_name), } ProjectDependencies.install(ctx: ctx, task_runner: task_runner) BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project, library: library) UI::PrintingSpinner.spin(ctx, ctx.message("script.application.pushing")) do |p_ctx, spinner| package = Infrastructure::PushPackageRepository.new(ctx: p_ctx).get_push_package( script_project: script_project, metadata: task_runner.metadata, library: library, ) script_service = Infrastructure::ServiceLocator.script_service( ctx: p_ctx, api_key: script_project.api_key ) module_upload_url = Infrastructure::ScriptUploader.new(script_service).upload(package.script_content) uuid = script_service.set_app_script( uuid: package.uuid, extension_point_type: package.extension_point_type, force: force, metadata: package.metadata, script_config: package.script_config, module_upload_url: module_upload_url, library: package.library, input_query: script_project.input_query, ) if ShopifyCLI::Environment.interactive? script_project_repo.update_env(uuid: uuid) end spinner.update_title(p_ctx.message("script.application.pushed")) end end end end end end end