shopify-cli 1.1.1 → 1.4.0
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.
- checksums.yaml +4 -4
- data/.github/CONTRIBUTING.md +1 -1
- data/.gitignore +0 -1
- data/.rubocop.yml +6 -2
- data/.rubocop_todo.yml +20 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +1 -2
- data/Gemfile.lock +11 -11
- data/RELEASING.md +22 -10
- data/docs/core/index.md +16 -0
- data/lib/project_types/extension/cli.rb +6 -1
- data/lib/project_types/extension/commands/register.rb +1 -1
- data/lib/project_types/extension/features/argo/admin.rb +20 -0
- data/lib/project_types/extension/features/argo/base.rb +129 -0
- data/lib/project_types/extension/features/argo/checkout.rb +20 -0
- data/lib/project_types/extension/features/argo_config.rb +60 -0
- data/lib/project_types/extension/messages/messages.rb +11 -2
- data/lib/project_types/extension/models/type.rb +4 -0
- data/lib/project_types/extension/models/types/checkout_post_purchase.rb +6 -3
- data/lib/project_types/extension/models/types/product_subscription.rb +24 -0
- data/lib/project_types/node/commands/create.rb +6 -1
- data/lib/project_types/node/commands/serve.rb +5 -5
- data/lib/project_types/node/messages/messages.rb +4 -1
- data/lib/project_types/rails/commands/create.rb +10 -2
- data/lib/project_types/rails/commands/serve.rb +5 -5
- data/lib/project_types/rails/messages/messages.rb +5 -1
- data/lib/project_types/script/config/extension_points.yml +8 -8
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +36 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +7 -0
- data/lib/project_types/script/messages/messages.rb +12 -37
- data/lib/project_types/script/ui/error_handler.rb +13 -5
- data/lib/shopify-cli/api.rb +5 -9
- data/lib/shopify-cli/commands/config.rb +33 -1
- data/lib/shopify-cli/commands/system.rb +9 -0
- data/lib/shopify-cli/context.rb +40 -0
- data/lib/shopify-cli/core/entry_point.rb +3 -0
- data/lib/shopify-cli/git.rb +1 -1
- data/lib/shopify-cli/http_request.rb +15 -0
- data/lib/shopify-cli/js_system.rb +22 -5
- data/lib/shopify-cli/messages/messages.rb +39 -11
- data/lib/shopify-cli/project.rb +3 -3
- data/lib/shopify-cli/shopifolk.rb +67 -0
- data/lib/shopify-cli/tunnel.rb +1 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +1 -0
- metadata +10 -4
- data/lib/project_types/extension/features/argo.rb +0 -48
- data/lib/project_types/extension/models/types/subscription_management.rb +0 -20
| @@ -95,6 +95,15 @@ module Extension | |
| 95 95 | 
             
                          node_not_installed: 'Node must be installed to create this extension.',
         | 
| 96 96 | 
             
                          version_too_low: 'Your node version %s does not meet the minimum required version %s',
         | 
| 97 97 | 
             
                        },
         | 
| 98 | 
            +
                        argo_missing_renderer_package_error: '%s Install the missing package and try again.',
         | 
| 99 | 
            +
                        argo_renderer_package_invalid_version_error: <<~MESSAGE,
         | 
| 100 | 
            +
                          The renderer package version is not a valid SemVer Version (http://semver.org)
         | 
| 101 | 
            +
                        MESSAGE
         | 
| 102 | 
            +
                        yarn_install_error: "Something went wrong while running 'yarn install'. %s.",
         | 
| 103 | 
            +
                        yarn_run_script_error: 'Something went wrong while running script. %s.',
         | 
| 104 | 
            +
                      },
         | 
| 105 | 
            +
                      config: {
         | 
| 106 | 
            +
                        unpermitted_keys: '`%s` contains the following unpermitted keys: %s',
         | 
| 98 107 | 
             
                      },
         | 
| 99 108 | 
             
                    },
         | 
| 100 109 | 
             
                  },
         | 
| @@ -109,8 +118,8 @@ module Extension | |
| 109 118 | 
             
                }
         | 
| 110 119 |  | 
| 111 120 | 
             
                TYPES = {
         | 
| 112 | 
            -
                   | 
| 113 | 
            -
                    name: 'Subscription | 
| 121 | 
            +
                  product_subscription: {
         | 
| 122 | 
            +
                    name: 'Product Subscription',
         | 
| 114 123 | 
             
                    tagline: '(limit 1 per app)',
         | 
| 115 124 | 
             
                    overrides: {
         | 
| 116 125 | 
             
                      register: {
         | 
| @@ -6,13 +6,16 @@ module Extension | |
| 6 6 | 
             
                module Types
         | 
| 7 7 | 
             
                  class CheckoutPostPurchase < Models::Type
         | 
| 8 8 | 
             
                    IDENTIFIER = 'CHECKOUT_POST_PURCHASE'
         | 
| 9 | 
            -
             | 
| 9 | 
            +
                    PERMITTED_CONFIG_KEYS = [:metafields]
         | 
| 10 10 | 
             
                    def create(directory_name, context)
         | 
| 11 | 
            -
                      Features::Argo. | 
| 11 | 
            +
                      Features::Argo::Checkout.new.create(directory_name, IDENTIFIER, context)
         | 
| 12 12 | 
             
                    end
         | 
| 13 13 |  | 
| 14 14 | 
             
                    def config(context)
         | 
| 15 | 
            -
                       | 
| 15 | 
            +
                      {
         | 
| 16 | 
            +
                        **Features::ArgoConfig.parse_yaml(context, PERMITTED_CONFIG_KEYS),
         | 
| 17 | 
            +
                        **Features::Argo::Checkout.new.config(context),
         | 
| 18 | 
            +
                      }
         | 
| 16 19 | 
             
                    end
         | 
| 17 20 | 
             
                  end
         | 
| 18 21 | 
             
                end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            require 'base64'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Extension
         | 
| 5 | 
            +
              module Models
         | 
| 6 | 
            +
                module Types
         | 
| 7 | 
            +
                  class ProductSubscription < Models::Type
         | 
| 8 | 
            +
                    IDENTIFIER = 'PRODUCT_SUBSCRIPTION'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    def graphql_identifier
         | 
| 11 | 
            +
                      'SUBSCRIPTION_MANAGEMENT'
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def create(directory_name, context)
         | 
| 15 | 
            +
                      Features::Argo::Admin.new.create(directory_name, IDENTIFIER, context)
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def config(context)
         | 
| 19 | 
            +
                      Features::Argo::Admin.new.config(context)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -40,7 +40,7 @@ module Node | |
| 40 40 | 
             
                      scopes: 'write_products,write_customers,write_draft_orders',
         | 
| 41 41 | 
             
                    ).write(@ctx)
         | 
| 42 42 |  | 
| 43 | 
            -
                    partners_url = " | 
| 43 | 
            +
                    partners_url = "#{partners_endpoint}/#{form.organization_id}/apps/#{api_client['id']}"
         | 
| 44 44 |  | 
| 45 45 | 
             
                    @ctx.puts(@ctx.message('node.create.info.created', form.title, partners_url))
         | 
| 46 46 | 
             
                    @ctx.puts(@ctx.message('node.create.info.serve', form.name, ShopifyCli::TOOL_NAME))
         | 
| @@ -112,6 +112,11 @@ module Node | |
| 112 112 | 
             
                      @ctx.debug(e)
         | 
| 113 113 | 
             
                    end
         | 
| 114 114 | 
             
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  def partners_endpoint
         | 
| 117 | 
            +
                    return 'https://partners.myshopify.io' if @ctx.getenv(ShopifyCli::PartnersAPI::LOCAL_DEBUG)
         | 
| 118 | 
            +
                    'https://partners.shopify.com'
         | 
| 119 | 
            +
                  end
         | 
| 115 120 | 
             
                end
         | 
| 116 121 | 
             
              end
         | 
| 117 122 | 
             
            end
         | 
| @@ -20,12 +20,12 @@ module Node | |
| 20 20 | 
             
                      url: url,
         | 
| 21 21 | 
             
                      callback_url: "/auth/callback",
         | 
| 22 22 | 
             
                    )
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                       | 
| 26 | 
            -
             | 
| 27 | 
            -
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    if project.env.shop
         | 
| 25 | 
            +
                      project_url = "#{project.env.host}/auth?shop=#{project.env.shop}"
         | 
| 26 | 
            +
                      @ctx.puts("\n" + @ctx.message('node.serve.open_info', project_url) + "\n")
         | 
| 28 27 | 
             
                    end
         | 
| 28 | 
            +
             | 
| 29 29 | 
             
                    CLI::UI::Frame.open(@ctx.message('node.serve.running_server')) do
         | 
| 30 30 | 
             
                      env = project.env.to_h
         | 
| 31 31 | 
             
                      env['PORT'] = ShopifyCli::Tunnel::PORT.to_s
         | 
| @@ -202,7 +202,10 @@ module Node | |
| 202 202 | 
             
                        host_must_be_https: "HOST must be a HTTPS url.",
         | 
| 203 203 | 
             
                      },
         | 
| 204 204 |  | 
| 205 | 
            -
                      open_info:  | 
| 205 | 
            +
                      open_info: <<~MESSAGE,
         | 
| 206 | 
            +
                        {{*}} To install and start using your app, open this URL in your browser:
         | 
| 207 | 
            +
                        {{green:%s}}
         | 
| 208 | 
            +
                      MESSAGE
         | 
| 206 209 | 
             
                      running_server: "Running server...",
         | 
| 207 210 | 
             
                    },
         | 
| 208 211 |  | 
| @@ -55,7 +55,7 @@ module Rails | |
| 55 55 | 
             
                      scopes: 'write_products,write_customers,write_draft_orders',
         | 
| 56 56 | 
             
                    ).write(@ctx)
         | 
| 57 57 |  | 
| 58 | 
            -
                    partners_url = " | 
| 58 | 
            +
                    partners_url = "#{partners_endpoint}/#{form.organization_id}/apps/#{api_client['id']}"
         | 
| 59 59 |  | 
| 60 60 | 
             
                    @ctx.puts(@ctx.message('rails.create.info.created', form.title, partners_url))
         | 
| 61 61 | 
             
                    @ctx.puts(@ctx.message('rails.create.info.serve', form.name, ShopifyCli::TOOL_NAME))
         | 
| @@ -114,6 +114,9 @@ module Rails | |
| 114 114 | 
             
                    @ctx.abort(@ctx.message('rails.create.error.install_failure', 'bundler ~>2.0')) unless
         | 
| 115 115 | 
             
                      install_gem('bundler', '~>2.0')
         | 
| 116 116 |  | 
| 117 | 
            +
                    full_path = File.join(@ctx.root, name)
         | 
| 118 | 
            +
                    @ctx.abort(@ctx.message('rails.create.error.dir_exists', name)) if Dir.exist?(full_path)
         | 
| 119 | 
            +
             | 
| 117 120 | 
             
                    CLI::UI::Frame.open(@ctx.message('rails.create.generating_app', name)) do
         | 
| 118 121 | 
             
                      new_command = %w(rails new)
         | 
| 119 122 | 
             
                      new_command += DEFAULT_RAILS_FLAGS
         | 
| @@ -124,7 +127,7 @@ module Rails | |
| 124 127 | 
             
                      syscall(new_command)
         | 
| 125 128 | 
             
                    end
         | 
| 126 129 |  | 
| 127 | 
            -
                    @ctx.root =  | 
| 130 | 
            +
                    @ctx.root = full_path
         | 
| 128 131 |  | 
| 129 132 | 
             
                    File.open(File.join(@ctx.root, '.gitignore'), 'a') { |f| f.write('.env') }
         | 
| 130 133 |  | 
| @@ -169,6 +172,11 @@ module Rails | |
| 169 172 | 
             
                  def install_gem(name, version = nil)
         | 
| 170 173 | 
             
                    Gem.install(@ctx, name, version)
         | 
| 171 174 | 
             
                  end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                  def partners_endpoint
         | 
| 177 | 
            +
                    return 'https://partners.myshopify.io' if @ctx.getenv(ShopifyCli::PartnersAPI::LOCAL_DEBUG)
         | 
| 178 | 
            +
                    'https://partners.shopify.com'
         | 
| 179 | 
            +
                  end
         | 
| 172 180 | 
             
                end
         | 
| 173 181 | 
             
              end
         | 
| 174 182 | 
             
            end
         | 
| @@ -20,12 +20,12 @@ module Rails | |
| 20 20 | 
             
                      url: url,
         | 
| 21 21 | 
             
                      callback_url: "/auth/shopify/callback",
         | 
| 22 22 | 
             
                    )
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                       | 
| 26 | 
            -
             | 
| 27 | 
            -
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    if project.env.shop
         | 
| 25 | 
            +
                      project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
         | 
| 26 | 
            +
                      @ctx.puts("\n" + @ctx.message('rails.serve.open_info', project_url) + "\n")
         | 
| 28 27 | 
             
                    end
         | 
| 28 | 
            +
             | 
| 29 29 | 
             
                    CLI::UI::Frame.open(@ctx.message('rails.serve.running_server')) do
         | 
| 30 30 | 
             
                      env = ShopifyCli::Project.current.env.to_h
         | 
| 31 31 | 
             
                      env.delete('HOST')
         | 
| @@ -36,6 +36,7 @@ module Rails | |
| 36 36 | 
             
                        See {{underline:https://github.com/Shopify/shopify-app-cli/blob/master/docs/installing-ruby.md}}
         | 
| 37 37 | 
             
                        for our recommended method of installing ruby.
         | 
| 38 38 | 
             
                        MSG
         | 
| 39 | 
            +
                        dir_exists: "Project directory %s already exists. Please use a different name.",
         | 
| 39 40 | 
             
                        install_failure: "Error installing %s gem",
         | 
| 40 41 | 
             
                        node_required: "node is required to create a rails project. Download at https://nodejs.org/en/download.",
         | 
| 41 42 | 
             
                        node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
         | 
| @@ -219,7 +220,10 @@ module Rails | |
| 219 220 | 
             
                        host_must_be_https: "{{red:HOST must be a HTTPS url.}}",
         | 
| 220 221 | 
             
                      },
         | 
| 221 222 |  | 
| 222 | 
            -
                      open_info:  | 
| 223 | 
            +
                      open_info: <<~MESSAGE,
         | 
| 224 | 
            +
                        {{*}} To install and start using your app, open this URL in your browser:
         | 
| 225 | 
            +
                        {{green:%s}}
         | 
| 226 | 
            +
                      MESSAGE
         | 
| 223 227 | 
             
                      running_server: "Running server...",
         | 
| 224 228 | 
             
                    },
         | 
| 225 229 |  | 
| @@ -1,24 +1,24 @@ | |
| 1 1 | 
             
            discount:
         | 
| 2 2 | 
             
              assemblyscript:
         | 
| 3 3 | 
             
                package: "@shopify/extension-point-as-discount"
         | 
| 4 | 
            -
                version: "^0. | 
| 5 | 
            -
                sdk-version: "^ | 
| 4 | 
            +
                version: "^0.3.0"
         | 
| 5 | 
            +
                sdk-version: "^7.0.0"
         | 
| 6 6 | 
             
                toolchain-version: "^1.1.0"
         | 
| 7 7 | 
             
            unit_limit_per_order:
         | 
| 8 8 | 
             
              assemblyscript:
         | 
| 9 9 | 
             
                package: "@shopify/extension-point-as-unit-limit-per-order"
         | 
| 10 | 
            -
                version: "^0. | 
| 11 | 
            -
                sdk-version: "^ | 
| 10 | 
            +
                version: "^0.2.0"
         | 
| 11 | 
            +
                sdk-version: "^7.0.0"
         | 
| 12 12 | 
             
                toolchain-version: "^1.1.0"
         | 
| 13 13 | 
             
            payment_filter:
         | 
| 14 14 | 
             
              assemblyscript:
         | 
| 15 15 | 
             
                package: "@shopify/extension-point-as-payment-filter"
         | 
| 16 | 
            -
                version: "^0. | 
| 17 | 
            -
                sdk-version: "^ | 
| 16 | 
            +
                version: "^0.5.0"
         | 
| 17 | 
            +
                sdk-version: "^7.0.0"
         | 
| 18 18 | 
             
                toolchain-version: "^1.1.0"
         | 
| 19 19 | 
             
            shipping_filter:
         | 
| 20 20 | 
             
              assemblyscript:
         | 
| 21 21 | 
             
                package: "@shopify/extension-point-as-shipping-filter"
         | 
| 22 | 
            -
                version: "^0. | 
| 23 | 
            -
                sdk-version: "^ | 
| 22 | 
            +
                version: "^0.3.0"
         | 
| 23 | 
            +
                sdk-version: "^7.0.0"
         | 
| 24 24 | 
             
                toolchain-version: "^1.1.0"
         | 
| @@ -86,8 +86,8 @@ module Script | |
| 86 86 | 
             
                            "@shopify/scripts-toolchain-as": "#{extension_point.sdks[:ts].toolchain_version}",
         | 
| 87 87 | 
             
                            "#{extension_point.sdks[:ts].package}": "#{extension_point.sdks[:ts].version}",
         | 
| 88 88 | 
             
                            "@as-pect/cli": "4.0.0",
         | 
| 89 | 
            -
                            "as-wasi": "^0.2. | 
| 90 | 
            -
                            "assemblyscript": "^0. | 
| 89 | 
            +
                            "as-wasi": "^0.2.1",
         | 
| 90 | 
            +
                            "assemblyscript": "^0.14.0"
         | 
| 91 91 | 
             
                          },
         | 
| 92 92 | 
             
                          "scripts": {
         | 
| 93 93 | 
             
                            "test": "asp --config test/as-pect.config.js --summary --verbose"
         | 
| @@ -34,7 +34,9 @@ module Script | |
| 34 34 |  | 
| 35 35 | 
             
                    def dependencies_installed?
         | 
| 36 36 | 
             
                      # Assuming if node_modules folder exist at root of script folder, all deps are installed
         | 
| 37 | 
            -
                      ctx.dir_exist?("node_modules")
         | 
| 37 | 
            +
                      return false unless ctx.dir_exist?("node_modules")
         | 
| 38 | 
            +
                      check_if_ep_dependencies_up_to_date!
         | 
| 39 | 
            +
                      true
         | 
| 38 40 | 
             
                    end
         | 
| 39 41 |  | 
| 40 42 | 
             
                    private
         | 
| @@ -58,6 +60,39 @@ module Script | |
| 58 60 | 
             
                    def bytecode
         | 
| 59 61 | 
             
                      File.read(format(BYTECODE_FILE, name: script_name))
         | 
| 60 62 | 
             
                    end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    def check_if_ep_dependencies_up_to_date!
         | 
| 65 | 
            +
                      return true if ENV['SHOPIFY_CLI_SCRIPTS_IGNORE_OUTDATED']
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                      # ignore exit code since it will not be 0 unless every package is up to date which they probably won't be
         | 
| 68 | 
            +
                      out, _ = ctx.capture2e("npm", "outdated", "--json", "--depth", "0")
         | 
| 69 | 
            +
                      parsed_outdated_check = JSON.parse(out)
         | 
| 70 | 
            +
                      outdated_ep_packages = parsed_outdated_check
         | 
| 71 | 
            +
                        .select { |package_name, _| package_name.start_with?('@shopify/extension-point-as-') }
         | 
| 72 | 
            +
                        .select { |_, version_info| !package_is_up_to_date?(version_info) }
         | 
| 73 | 
            +
                        .keys
         | 
| 74 | 
            +
                      raise Errors::PackagesOutdatedError.new(outdated_ep_packages),
         | 
| 75 | 
            +
                        "NPM packages out of date: #{outdated_ep_packages.join(', ')}" unless outdated_ep_packages.empty?
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    def package_is_up_to_date?(version_info)
         | 
| 79 | 
            +
                      require 'semantic/semantic'
         | 
| 80 | 
            +
                      current_version = version_info['current']
         | 
| 81 | 
            +
                      latest_version = version_info['latest']
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                      # making an assumption that the script developer knows what they're doing if they're not referencing a
         | 
| 84 | 
            +
                      # semver version
         | 
| 85 | 
            +
                      begin
         | 
| 86 | 
            +
                        current_version = ::Semantic::Version.new(current_version)
         | 
| 87 | 
            +
                        latest_version = ::Semantic::Version.new(latest_version)
         | 
| 88 | 
            +
                      rescue ArgumentError
         | 
| 89 | 
            +
                        return true
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                      return false if current_version.major < latest_version.major
         | 
| 93 | 
            +
                      return false if latest_version.major == 0 && current_version.minor < latest_version.minor
         | 
| 94 | 
            +
                      true
         | 
| 95 | 
            +
                    end
         | 
| 61 96 | 
             
                  end
         | 
| 62 97 | 
             
                end
         | 
| 63 98 | 
             
              end
         | 
| @@ -34,6 +34,13 @@ module Script | |
| 34 34 | 
             
                    class ShopScriptConflictError < ScriptProjectError; end
         | 
| 35 35 | 
             
                    class ShopScriptUndefinedError < ScriptProjectError; end
         | 
| 36 36 | 
             
                    class TaskRunnerNotFoundError < ScriptProjectError; end
         | 
| 37 | 
            +
                    class PackagesOutdatedError < ScriptProjectError
         | 
| 38 | 
            +
                      attr_reader :outdated_packages
         | 
| 39 | 
            +
                      def initialize(outdated_packages)
         | 
| 40 | 
            +
                        super("EP packages are outdated and need to be updated: #{outdated_packages.join(', ')}")
         | 
| 41 | 
            +
                        @outdated_packages = outdated_packages
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                    end
         | 
| 37 44 | 
             
                  end
         | 
| 38 45 | 
             
                end
         | 
| 39 46 | 
             
              end
         | 
| @@ -29,7 +29,7 @@ module Script | |
| 29 29 | 
             
                      no_existing_orgs_cause: "You don't have any partner organizations.",
         | 
| 30 30 | 
             
                      no_existing_orgs_help: "Please visit https://partners.shopify.com/ to create a partners account.",
         | 
| 31 31 |  | 
| 32 | 
            -
                      no_existing_stores_cause: "You don't have any  | 
| 32 | 
            +
                      no_existing_stores_cause: "You don't have any stores.",
         | 
| 33 33 | 
             
                      no_existing_stores_help: "Visit https://partners.shopify.com/%{organization_id}/stores/ to create one.",
         | 
| 34 34 |  | 
| 35 35 | 
             
                      project_exists_cause: "Directory with the same name as the script already exists.",
         | 
| @@ -43,11 +43,9 @@ module Script | |
| 43 43 |  | 
| 44 44 | 
             
                      script_not_found_cause: "Couldn't find script %s for extension point %s",
         | 
| 45 45 |  | 
| 46 | 
            -
                      app_not_installed_cause: "App not installed on  | 
| 46 | 
            +
                      app_not_installed_cause: "App not installed on store.",
         | 
| 47 47 |  | 
| 48 | 
            -
                      app_script_not_pushed_help: " | 
| 49 | 
            -
             | 
| 50 | 
            -
                      app_script_undefined_help: "Push script to app.",
         | 
| 48 | 
            +
                      app_script_not_pushed_help: "Script isn't on the app. Run {{command:shopify push}}, and then try again.",
         | 
| 51 49 |  | 
| 52 50 | 
             
                      build_error_cause: "Something went wrong while building the script.",
         | 
| 53 51 | 
             
                      build_error_help: "Correct the errors and try again.",
         | 
| @@ -70,7 +68,10 @@ module Script | |
| 70 68 | 
             
                                                  "on this extension point.",
         | 
| 71 69 | 
             
                      shop_script_conflict_help: "Disable that script or uninstall that app and try again.",
         | 
| 72 70 |  | 
| 73 | 
            -
                      shop_script_undefined_cause: "Script is already turned off in  | 
| 71 | 
            +
                      shop_script_undefined_cause: "Script is already turned off in store.",
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                      packages_outdated_cause: "The following npm packages are out of date: %s.",
         | 
| 74 | 
            +
                      packages_outdated_help: "Update them by running {{cyan:npm install --save-dev %s}}.",
         | 
| 74 75 | 
             
                    },
         | 
| 75 76 |  | 
| 76 77 | 
             
                    create: {
         | 
| @@ -100,7 +101,7 @@ module Script | |
| 100 101 | 
             
                      HELP
         | 
| 101 102 |  | 
| 102 103 | 
             
                      error: {
         | 
| 103 | 
            -
                        operation_failed: " | 
| 104 | 
            +
                        operation_failed: "Couldn't push script to app.",
         | 
| 104 105 | 
             
                      },
         | 
| 105 106 |  | 
| 106 107 | 
             
                      script_pushed: "{{v}} Script pushed to app (API key: %{api_key}).",
         | 
| @@ -108,21 +109,20 @@ module Script | |
| 108 109 |  | 
| 109 110 | 
             
                    disable: {
         | 
| 110 111 | 
             
                      help: <<~HELP,
         | 
| 111 | 
            -
                      Turn off script in  | 
| 112 | 
            +
                      Turn off script in store.
         | 
| 112 113 | 
             
                        Usage: {{command:%s disable}}
         | 
| 113 114 | 
             
                      HELP
         | 
| 114 115 |  | 
| 115 116 | 
             
                      error: {
         | 
| 116 117 | 
             
                        operation_failed: "Can't disable script.",
         | 
| 117 | 
            -
                        not_pushed_to_app: "Can't disable the script because it hasn't been pushed to the app.",
         | 
| 118 118 | 
             
                      },
         | 
| 119 119 |  | 
| 120 | 
            -
                      script_disabled: "{{v}} Script disabled. Script is turned off in  | 
| 120 | 
            +
                      script_disabled: "{{v}} Script disabled. Script is turned off in store.",
         | 
| 121 121 | 
             
                    },
         | 
| 122 122 |  | 
| 123 123 | 
             
                    enable: {
         | 
| 124 124 | 
             
                      help: <<~HELP,
         | 
| 125 | 
            -
                      Turn on script in  | 
| 125 | 
            +
                      Turn on script in store.
         | 
| 126 126 | 
             
                        Usage: {{command:%s enable}}
         | 
| 127 127 | 
             
                        Options:
         | 
| 128 128 | 
             
                          {{command:--config_props='name1:value1, name2:value2'}} Optional. Define the configuration of your script by passing individual name and value pairs. If used with --config_file, then matching values in --config_props will override those set in the file.
         | 
| @@ -135,11 +135,10 @@ module Script | |
| 135 135 |  | 
| 136 136 | 
             
                      error: {
         | 
| 137 137 | 
             
                        operation_failed: "Can't enable script.",
         | 
| 138 | 
            -
                        not_pushed_to_app: "Can't enable the script because it hasn't been pushed to the app.",
         | 
| 139 138 | 
             
                      },
         | 
| 140 139 |  | 
| 141 140 | 
             
                      script_enabled: "{{v}} Script enabled. %{type} script %{title} in app (API key: %{api_key}) "\
         | 
| 142 | 
            -
                                      "is turned on in  | 
| 141 | 
            +
                                      "is turned on in store {{green:%{shop_domain}}}",
         | 
| 143 142 | 
             
                    },
         | 
| 144 143 |  | 
| 145 144 | 
             
                    project_deps: {
         | 
| @@ -149,35 +148,11 @@ module Script | |
| 149 148 | 
             
                      installed: "Missing dependencies installed",
         | 
| 150 149 | 
             
                    },
         | 
| 151 150 |  | 
| 152 | 
            -
                    test: {
         | 
| 153 | 
            -
                      help: <<~HELP,
         | 
| 154 | 
            -
                      Runs unit tests on your script.
         | 
| 155 | 
            -
                        Usage: {{command:%s test}}
         | 
| 156 | 
            -
                      HELP
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                      error: {
         | 
| 159 | 
            -
                        operation_failed: "Tests didn't run or they ran with failures.",
         | 
| 160 | 
            -
                      },
         | 
| 161 | 
            -
             | 
| 162 | 
            -
                      running: "Running tests",
         | 
| 163 | 
            -
                      success: "{{v}} Tests finished.",
         | 
| 164 | 
            -
                    },
         | 
| 165 | 
            -
             | 
| 166 151 | 
             
                    forms: {
         | 
| 167 152 | 
             
                      create: {
         | 
| 168 153 | 
             
                        select_extension_point: "Which extension point do you want to use?",
         | 
| 169 154 | 
             
                        script_name: "Script Name",
         | 
| 170 155 | 
             
                      },
         | 
| 171 | 
            -
                      script_form: {
         | 
| 172 | 
            -
                        ask_app_api_key_default: "Which app do you want this script to belong to?",
         | 
| 173 | 
            -
                        ask_shop_domain_default: "Select a development store",
         | 
| 174 | 
            -
                        fetching_organizations: "Fetching partner organizations",
         | 
| 175 | 
            -
                        fetched_organizations: "Fetched partner organizations",
         | 
| 176 | 
            -
                        select_organization: "Select partner organization.",
         | 
| 177 | 
            -
                        using_app: "Using app {{green:%{title} (%{api_key})}}.",
         | 
| 178 | 
            -
                        using_development_store: "Using development store {{green:%{domain}}}",
         | 
| 179 | 
            -
                        using_organization: "Partner organization {{green:%s}}.",
         | 
| 180 | 
            -
                      },
         | 
| 181 156 | 
             
                    },
         | 
| 182 157 |  | 
| 183 158 | 
             
                    application: {
         | 
| @@ -96,14 +96,11 @@ module Script | |
| 96 96 | 
             
                      {
         | 
| 97 97 | 
             
                        cause_of_error: ShopifyCli::Context.message('script.error.app_not_installed_cause'),
         | 
| 98 98 | 
             
                      }
         | 
| 99 | 
            -
                    when Layers::Infrastructure::Errors::AppScriptNotPushedError
         | 
| 99 | 
            +
                    when Layers::Infrastructure::Errors::AppScriptNotPushedError,
         | 
| 100 | 
            +
                      Layers::Infrastructure::Errors::AppScriptUndefinedError
         | 
| 100 101 | 
             
                      {
         | 
| 101 102 | 
             
                        cause_of_error: ShopifyCli::Context.message('script.error.app_script_not_pushed_help'),
         | 
| 102 103 | 
             
                      }
         | 
| 103 | 
            -
                    when Layers::Infrastructure::Errors::AppScriptUndefinedError
         | 
| 104 | 
            -
                      {
         | 
| 105 | 
            -
                        help_suggestion: ShopifyCli::Context.message('script.error.app_script_undefined_help'),
         | 
| 106 | 
            -
                      }
         | 
| 107 104 | 
             
                    when Layers::Infrastructure::Errors::BuildError
         | 
| 108 105 | 
             
                      {
         | 
| 109 106 | 
             
                        cause_of_error: ShopifyCli::Context.message('script.error.build_error_cause'),
         | 
| @@ -142,6 +139,17 @@ module Script | |
| 142 139 | 
             
                      {
         | 
| 143 140 | 
             
                        cause_of_error: ShopifyCli::Context.message('script.error.shop_script_undefined_cause'),
         | 
| 144 141 | 
             
                      }
         | 
| 142 | 
            +
                    when Layers::Infrastructure::Errors::PackagesOutdatedError
         | 
| 143 | 
            +
                      {
         | 
| 144 | 
            +
                        cause_of_error: ShopifyCli::Context.message(
         | 
| 145 | 
            +
                          'script.error.packages_outdated_cause',
         | 
| 146 | 
            +
                          e.outdated_packages.join(', ')
         | 
| 147 | 
            +
                        ),
         | 
| 148 | 
            +
                        help_suggestion: ShopifyCli::Context.message(
         | 
| 149 | 
            +
                          'script.error.packages_outdated_help',
         | 
| 150 | 
            +
                          e.outdated_packages.collect { |package| "#{package}@latest" }.join(' ')
         | 
| 151 | 
            +
                        ),
         | 
| 152 | 
            +
                      }
         | 
| 145 153 | 
             
                    end
         | 
| 146 154 | 
             
                  end
         | 
| 147 155 | 
             
                end
         |