shopify-cli 2.2.1 → 2.5.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/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE.md +0 -4
- data/.github/workflows/shopify.yml +104 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +14 -14
- data/.rubocop_todo.yml +3 -3
- data/CHANGELOG.md +23 -0
- data/CONTRIBUTING.md +23 -0
- data/Dockerfile +19 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +50 -13
- data/RELEASING.md +1 -1
- data/Rakefile +84 -18
- data/bin/shopify +3 -3
- data/dev.yml +11 -1
- data/ext/shopify-extensions/extconf.rb +21 -0
- data/ext/shopify-extensions/shopify_extensions.rb +152 -0
- data/ext/shopify-extensions/version +1 -0
- data/lib/project_types/extension/cli.rb +17 -3
- data/lib/project_types/extension/commands/build.rb +31 -3
- data/lib/project_types/extension/commands/check.rb +2 -2
- data/lib/project_types/extension/commands/connect.rb +1 -1
- data/lib/project_types/extension/commands/create.rb +59 -16
- data/lib/project_types/extension/commands/extension_command.rb +1 -1
- data/lib/project_types/extension/commands/info.rb +1 -1
- data/lib/project_types/extension/commands/push.rb +1 -1
- data/lib/project_types/extension/commands/register.rb +2 -2
- data/lib/project_types/extension/commands/serve.rb +5 -5
- data/lib/project_types/extension/commands/tunnel.rb +6 -6
- data/lib/project_types/extension/extension_project.rb +4 -4
- data/lib/project_types/extension/features/argo.rb +2 -2
- data/lib/project_types/extension/features/argo_config.rb +5 -5
- data/lib/project_types/extension/features/argo_serve.rb +20 -6
- data/lib/project_types/extension/features/argo_setup.rb +1 -1
- data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
- data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
- data/lib/project_types/extension/forms/connect.rb +2 -2
- data/lib/project_types/extension/forms/create.rb +6 -3
- data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
- data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
- data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
- data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
- data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
- data/lib/project_types/extension/messages/message_loading.rb +2 -2
- data/lib/project_types/extension/messages/messages.rb +3 -0
- data/lib/project_types/extension/models/development_server.rb +74 -0
- data/lib/project_types/extension/models/development_server_requirements.rb +36 -0
- data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
- data/lib/project_types/extension/models/server_config/base.rb +31 -0
- data/lib/project_types/extension/models/server_config/development.rb +23 -0
- data/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
- data/lib/project_types/extension/models/server_config/development_renderer.rb +30 -0
- data/lib/project_types/extension/models/server_config/extension.rb +35 -0
- data/lib/project_types/extension/models/server_config/root.rb +18 -0
- data/lib/project_types/extension/models/server_config/user.rb +10 -0
- data/lib/project_types/extension/models/specification.rb +1 -1
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
- data/lib/project_types/extension/models/specification_handlers/default.rb +10 -2
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
- data/lib/project_types/extension/models/specifications.rb +4 -4
- data/lib/project_types/extension/tasks/choose_next_available_port.rb +2 -2
- data/lib/project_types/extension/tasks/configure_features.rb +1 -1
- data/lib/project_types/extension/tasks/configure_options.rb +1 -1
- data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
- data/lib/project_types/extension/tasks/create_extension.rb +2 -2
- data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
- data/lib/project_types/extension/tasks/find_npm_packages.rb +3 -3
- data/lib/project_types/extension/tasks/get_app.rb +2 -2
- data/lib/project_types/extension/tasks/get_apps.rb +2 -2
- data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
- data/lib/project_types/extension/tasks/get_product.rb +2 -2
- data/lib/project_types/extension/tasks/run_extension_command.rb +65 -0
- data/lib/project_types/extension/tasks/update_draft.rb +2 -2
- data/lib/project_types/node/cli.rb +3 -3
- data/lib/project_types/node/commands/connect.rb +4 -4
- data/lib/project_types/node/commands/create.rb +10 -14
- data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
- data/lib/project_types/node/commands/deploy.rb +3 -3
- data/lib/project_types/node/commands/generate.rb +2 -2
- data/lib/project_types/node/commands/open.rb +3 -3
- data/lib/project_types/node/commands/serve.rb +7 -7
- data/lib/project_types/node/commands/tunnel.rb +6 -6
- data/lib/project_types/node/forms/create.rb +3 -3
- data/lib/project_types/php/cli.rb +27 -0
- data/lib/project_types/php/commands/connect.rb +19 -0
- data/lib/project_types/php/commands/create.rb +143 -0
- data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
- data/lib/project_types/php/commands/deploy.rb +32 -0
- data/lib/project_types/php/commands/open.rb +16 -0
- data/lib/project_types/php/commands/serve.rb +51 -0
- data/lib/project_types/php/commands/tunnel.rb +37 -0
- data/lib/project_types/php/forms/create.rb +45 -0
- data/lib/project_types/php/messages/messages.rb +191 -0
- data/lib/project_types/rails/cli.rb +3 -3
- data/lib/project_types/rails/commands/connect.rb +4 -4
- data/lib/project_types/rails/commands/create.rb +12 -16
- data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
- data/lib/project_types/rails/commands/deploy.rb +3 -3
- data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
- data/lib/project_types/rails/commands/generate.rb +3 -3
- data/lib/project_types/rails/commands/open.rb +3 -3
- data/lib/project_types/rails/commands/serve.rb +8 -8
- data/lib/project_types/rails/commands/tunnel.rb +6 -6
- data/lib/project_types/rails/forms/create.rb +3 -3
- data/lib/project_types/rails/gem.rb +1 -1
- data/lib/project_types/rails/ruby.rb +1 -1
- data/lib/project_types/script/cli.rb +12 -3
- data/lib/project_types/script/commands/create.rb +2 -2
- data/lib/project_types/script/commands/push.rb +2 -2
- data/lib/project_types/script/forms/create.rb +1 -1
- data/lib/project_types/script/graphql/app_script_set.graphql +40 -0
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -44
- data/lib/project_types/script/graphql/module_upload_url_generate.graphql +9 -0
- data/lib/project_types/script/layers/application/extension_points.rb +2 -2
- data/lib/project_types/script/layers/application/push_script.rb +13 -1
- data/lib/project_types/script/layers/domain/push_package.rb +1 -14
- data/lib/project_types/script/layers/domain/script_project.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +55 -0
- data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
- data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +2 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -2
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +5 -5
- data/lib/project_types/script/layers/infrastructure/script_service.rb +28 -97
- data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
- data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
- data/lib/project_types/script/messages/messages.rb +3 -0
- data/lib/project_types/script/tasks/ensure_env.rb +7 -7
- data/lib/project_types/script/ui/error_handler.rb +79 -74
- data/lib/project_types/script/ui/printing_spinner.rb +1 -1
- data/lib/project_types/theme/cli.rb +3 -3
- data/lib/project_types/theme/commands/check.rb +3 -3
- data/lib/project_types/theme/commands/delete.rb +7 -7
- data/lib/project_types/theme/commands/init.rb +3 -3
- data/lib/project_types/theme/commands/language_server.rb +2 -2
- data/lib/project_types/theme/commands/package.rb +2 -2
- data/lib/project_types/theme/commands/publish.rb +5 -5
- data/lib/project_types/theme/commands/pull.rb +15 -9
- data/lib/project_types/theme/commands/push.rb +18 -12
- data/lib/project_types/theme/commands/serve.rb +4 -4
- data/lib/project_types/theme/forms/confirm_store.rb +1 -1
- data/lib/project_types/theme/forms/select.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
- data/lib/{shopify-cli → shopify_cli}/api.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
- data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
- data/lib/shopify_cli/commands/logout.rb +39 -0
- data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
- data/lib/shopify_cli/commands/populate.rb +23 -0
- data/lib/shopify_cli/commands/store.rb +15 -0
- data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
- data/lib/shopify_cli/commands/version.rb +15 -0
- data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
- data/lib/shopify_cli/commands.rb +34 -0
- data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
- data/lib/shopify_cli/constants.rb +26 -0
- data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
- data/lib/{shopify-cli → shopify_cli}/core/executor.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
- data/lib/shopify_cli/core.rb +8 -0
- data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
- data/lib/shopify_cli/environment.rb +60 -0
- data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/git.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
- data/lib/shopify_cli/helpers.rb +5 -0
- data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
- data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +24 -31
- data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
- data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
- data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +17 -1
- data/lib/{shopify-cli → shopify_cli}/method_object.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/partners_api.rb +16 -40
- data/lib/shopify_cli/php_deps.rb +102 -0
- data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +23 -21
- data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
- data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
- data/lib/shopify_cli/resources.rb +5 -0
- data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
- data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
- data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +5 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +5 -6
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +15 -3
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
- data/lib/shopify_cli/theme/development_theme.rb +83 -0
- data/lib/{shopify-cli → shopify_cli}/theme/file.rb +12 -4
- data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +8 -1
- data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +7 -7
- data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
- data/lib/shopify_cli/version.rb +3 -0
- data/lib/shopify_cli.rb +52 -49
- data/shopify-cli.gemspec +5 -5
- metadata +130 -95
- data/.github/workflows/build.yml +0 -28
- data/lib/shopify-cli/commands/logout.rb +0 -39
- data/lib/shopify-cli/commands/populate.rb +0 -23
- data/lib/shopify-cli/commands/store.rb +0 -15
- data/lib/shopify-cli/commands/version.rb +0 -15
- data/lib/shopify-cli/commands.rb +0 -34
- data/lib/shopify-cli/core.rb +0 -8
- data/lib/shopify-cli/helpers.rb +0 -5
- data/lib/shopify-cli/resources.rb +0 -5
- data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
- data/lib/shopify-cli/theme/development_theme.rb +0 -69
- data/lib/shopify-cli/version.rb +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
class Heroku
|
|
3
3
|
DOWNLOAD_URLS = {
|
|
4
4
|
linux: "https://cli-assets.heroku.com/heroku-linux-x64.tar.gz",
|
|
@@ -36,7 +36,7 @@ module ShopifyCli
|
|
|
36
36
|
def download
|
|
37
37
|
return if installed?
|
|
38
38
|
|
|
39
|
-
result = @ctx.system("curl", "-o", download_path, DOWNLOAD_URLS[@ctx.os], chdir:
|
|
39
|
+
result = @ctx.system("curl", "-o", download_path, DOWNLOAD_URLS[@ctx.os], chdir: ShopifyCLI.cache_dir)
|
|
40
40
|
@ctx.abort(@ctx.message("core.heroku.error.download")) unless result.success?
|
|
41
41
|
@ctx.abort(@ctx.message("core.heroku.error.download")) unless File.exist?(download_path)
|
|
42
42
|
end
|
|
@@ -47,7 +47,7 @@ module ShopifyCli
|
|
|
47
47
|
result = if @ctx.windows?
|
|
48
48
|
@ctx.system("\"#{download_path}\"")
|
|
49
49
|
else
|
|
50
|
-
@ctx.system("tar", "-xf", download_path, chdir:
|
|
50
|
+
@ctx.system("tar", "-xf", download_path, chdir: ShopifyCLI.cache_dir)
|
|
51
51
|
end
|
|
52
52
|
@ctx.abort(@ctx.message("core.heroku.error.install")) unless result.success?
|
|
53
53
|
|
|
@@ -67,23 +67,33 @@ module ShopifyCli
|
|
|
67
67
|
nil
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
def get_config(config)
|
|
71
|
+
output, status = @ctx.capture2e(heroku_command, "config:get", config.to_s)
|
|
72
|
+
return output.strip if status.success?
|
|
73
|
+
nil
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
-
def
|
|
77
|
-
|
|
76
|
+
def set_config(config, value)
|
|
77
|
+
result = @ctx.system(heroku_command, "config:set", "#{config}=#{value}")
|
|
78
|
+
|
|
79
|
+
msg = @ctx.message("core.heroku.error.set_config", config, value)
|
|
80
|
+
@ctx.abort(msg) unless result.success?
|
|
78
81
|
end
|
|
79
82
|
|
|
80
|
-
def
|
|
81
|
-
|
|
82
|
-
|
|
83
|
+
def add_buildpacks(buildpacks)
|
|
84
|
+
result = @ctx.system(heroku_command, "buildpacks:clear")
|
|
85
|
+
msg = @ctx.message("core.heroku.error.add_buildpacks")
|
|
86
|
+
@ctx.abort(msg) unless result.success?
|
|
87
|
+
|
|
88
|
+
buildpacks.each do |buildpack|
|
|
89
|
+
result = @ctx.system(heroku_command, "buildpacks:add", buildpack)
|
|
90
|
+
msg = @ctx.message("core.heroku.error.add_buildpacks")
|
|
91
|
+
@ctx.abort(msg) unless result.success?
|
|
92
|
+
end
|
|
83
93
|
end
|
|
84
94
|
|
|
85
95
|
def heroku_command
|
|
86
|
-
local_path = File.join(
|
|
96
|
+
local_path = File.join(ShopifyCLI.cache_dir, "heroku", "bin", "heroku").to_s
|
|
87
97
|
if File.exist?(local_path)
|
|
88
98
|
local_path
|
|
89
99
|
elsif @ctx.windows?
|
|
@@ -103,6 +113,21 @@ module ShopifyCli
|
|
|
103
113
|
end
|
|
104
114
|
end
|
|
105
115
|
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
def download_filename
|
|
119
|
+
URI.parse(DOWNLOAD_URLS[@ctx.os]).path.split("/").last
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def download_path
|
|
123
|
+
File.join(ShopifyCLI.cache_dir, download_filename)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def git_remote
|
|
127
|
+
output, status = @ctx.capture2e("git", "remote", "get-url", "heroku")
|
|
128
|
+
status.success? ? output : nil
|
|
129
|
+
end
|
|
130
|
+
|
|
106
131
|
def installed?
|
|
107
132
|
_output, status = @ctx.capture2e(heroku_command, "--version")
|
|
108
133
|
status.success?
|
|
@@ -8,16 +8,15 @@ require "shopify_cli"
|
|
|
8
8
|
require "uri"
|
|
9
9
|
require "webrick"
|
|
10
10
|
|
|
11
|
-
module
|
|
11
|
+
module ShopifyCLI
|
|
12
12
|
class IdentityAuth
|
|
13
13
|
include SmartProperties
|
|
14
14
|
|
|
15
|
-
autoload :Servlet, "
|
|
15
|
+
autoload :Servlet, "shopify_cli/identity_auth/servlet"
|
|
16
16
|
|
|
17
17
|
class Error < StandardError; end
|
|
18
18
|
class Timeout < StandardError; end
|
|
19
19
|
LocalRequest = Struct.new(:method, :path, :query, :protocol)
|
|
20
|
-
LOCAL_DEBUG = "SHOPIFY_APP_CLI_LOCAL_PARTNERS"
|
|
21
20
|
|
|
22
21
|
DEFAULT_PORT = 3456
|
|
23
22
|
REDIRECT_HOST = "http://127.0.0.1:#{DEFAULT_PORT}"
|
|
@@ -50,7 +49,7 @@ module ShopifyCli
|
|
|
50
49
|
]
|
|
51
50
|
|
|
52
51
|
property! :ctx
|
|
53
|
-
property :store, default: -> {
|
|
52
|
+
property :store, default: -> { ShopifyCLI::DB.new }
|
|
54
53
|
property :state_token, accepts: String, default: SecureRandom.hex(30)
|
|
55
54
|
property :code_verifier, accepts: String, default: SecureRandom.hex(30)
|
|
56
55
|
|
|
@@ -71,7 +70,7 @@ module ShopifyCli
|
|
|
71
70
|
|
|
72
71
|
def reauthenticate
|
|
73
72
|
return if refresh_exchange_tokens || refresh_access_tokens
|
|
74
|
-
ctx.abort(ctx.message("core.identity_auth.error.reauthenticate",
|
|
73
|
+
ctx.abort(ctx.message("core.identity_auth.error.reauthenticate", ShopifyCLI::TOOL_NAME))
|
|
75
74
|
end
|
|
76
75
|
|
|
77
76
|
def code_challenge
|
|
@@ -94,8 +93,8 @@ module ShopifyCli
|
|
|
94
93
|
end
|
|
95
94
|
|
|
96
95
|
def self.delete_tokens_and_keys
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
ShopifyCLI::DB.del(*IDENTITY_ACCESS_TOKENS)
|
|
97
|
+
ShopifyCLI::DB.del(*EXCHANGE_TOKENS)
|
|
99
98
|
end
|
|
100
99
|
|
|
101
100
|
private
|
|
@@ -213,7 +212,7 @@ module ShopifyCli
|
|
|
213
212
|
https = Net::HTTP.new(uri.host, uri.port)
|
|
214
213
|
https.use_ssl = true
|
|
215
214
|
request = Net::HTTP::Post.new(uri.path)
|
|
216
|
-
request["User-Agent"] = "Shopify CLI #{::
|
|
215
|
+
request["User-Agent"] = "Shopify CLI #{::ShopifyCLI::VERSION}"
|
|
217
216
|
request.body = URI.encode_www_form(params)
|
|
218
217
|
res = https.request(request)
|
|
219
218
|
unless res.is_a?(Net::HTTPSuccess)
|
|
@@ -236,12 +235,17 @@ module ShopifyCli
|
|
|
236
235
|
end
|
|
237
236
|
|
|
238
237
|
def auth_url
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
if Environment.use_local_partners_instance?
|
|
239
|
+
"https://identity.myshopify.io/oauth"
|
|
240
|
+
elsif Environment.use_spin_partners_instance?
|
|
241
|
+
"https://identity.#{Environment.spin_url}/oauth"
|
|
242
|
+
else
|
|
243
|
+
"https://accounts.shopify.com/oauth"
|
|
244
|
+
end
|
|
241
245
|
end
|
|
242
246
|
|
|
243
247
|
def client_id_for_application(application_name)
|
|
244
|
-
client_ids = if
|
|
248
|
+
client_ids = if Environment.use_local_partners_instance? || Environment.use_spin_partners_instance?
|
|
245
249
|
DEV_APPLICATION_CLIENT_IDS
|
|
246
250
|
else
|
|
247
251
|
APPLICATION_CLIENT_IDS
|
|
@@ -252,31 +256,20 @@ module ShopifyCli
|
|
|
252
256
|
|
|
253
257
|
def scopes(additional_scopes = [])
|
|
254
258
|
(["openid"] + additional_scopes).tap do |result|
|
|
255
|
-
result << "employee" if
|
|
259
|
+
result << "employee" if ShopifyCLI::Shopifolk.acting_as_shopify_organization?
|
|
256
260
|
end.join(" ")
|
|
257
261
|
end
|
|
258
262
|
|
|
259
263
|
def client_id
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
response["client_id"]
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
def local_identity_running?
|
|
274
|
-
Net::HTTP.start("identity.myshopify.io", 443, use_ssl: true, open_timeout: 1, read_timeout: 10) do |http|
|
|
275
|
-
req = Net::HTTP::Get.new(URI.join("https://identity.myshopify.io", "/services/ping"))
|
|
276
|
-
http.request(req).is_a?(Net::HTTPSuccess)
|
|
264
|
+
if Environment.use_local_partners_instance? || Environment.use_spin_partners_instance?
|
|
265
|
+
Constants::Identity::CLIENT_ID_DEV
|
|
266
|
+
else
|
|
267
|
+
# In the future we might want to use Identity's dynamic
|
|
268
|
+
# registration. To migrate to a dynamic client ID we
|
|
269
|
+
# need to refactor some code that relies on a static
|
|
270
|
+
# value for the client
|
|
271
|
+
Constants::Identity::CLIENT_ID
|
|
277
272
|
end
|
|
278
|
-
rescue Timeout::Error, Errno::EHOSTUNREACH, Errno::EHOSTDOWN, Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED
|
|
279
|
-
false
|
|
280
273
|
end
|
|
281
274
|
end
|
|
282
275
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
##
|
|
5
|
-
#
|
|
5
|
+
# ShopifyCLI::JsDeps ensures that all JavaScript dependencies are installed for projects.
|
|
6
6
|
#
|
|
7
7
|
class JsDeps
|
|
8
8
|
include SmartProperties
|
|
9
9
|
|
|
10
|
-
property! :ctx, accepts:
|
|
10
|
+
property! :ctx, accepts: ShopifyCLI::Context
|
|
11
11
|
property! :system, accepts: JsSystem, default: -> { JsSystem.new(ctx: ctx) }
|
|
12
12
|
|
|
13
13
|
##
|
|
14
|
-
# Proxy to instance method
|
|
14
|
+
# Proxy to instance method ShopifyCLI::JsDeps.new.install.
|
|
15
15
|
#
|
|
16
16
|
# #### Parameters
|
|
17
17
|
# - `ctx`: running context from your command
|
|
@@ -19,7 +19,7 @@ module ShopifyCli
|
|
|
19
19
|
#
|
|
20
20
|
# #### Example
|
|
21
21
|
#
|
|
22
|
-
#
|
|
22
|
+
# ShopifyCLI::JsDeps.install(ctx)
|
|
23
23
|
#
|
|
24
24
|
def self.install(ctx, verbose = false)
|
|
25
25
|
new(ctx: ctx).install(verbose)
|
|
@@ -34,7 +34,7 @@ module ShopifyCli
|
|
|
34
34
|
# #### Example
|
|
35
35
|
#
|
|
36
36
|
# # context is the running context for the command
|
|
37
|
-
#
|
|
37
|
+
# ShopifyCLI::JsDeps.new(context).install(true)
|
|
38
38
|
#
|
|
39
39
|
def install(verbose = false)
|
|
40
40
|
title = ctx.message("core.js_deps.installing", @system.package_manager)
|
|
@@ -104,7 +104,7 @@ module ShopifyCli
|
|
|
104
104
|
ctx.message("core.js_deps.error.invalid_package", File.read(File.join(path, "package.json"))),
|
|
105
105
|
error: true
|
|
106
106
|
)
|
|
107
|
-
raise
|
|
107
|
+
raise ShopifyCLI::AbortSilent
|
|
108
108
|
end
|
|
109
109
|
end
|
|
110
110
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
##
|
|
5
|
-
#
|
|
5
|
+
# ShopifyCLI::JsSystem allows conditional system calls of npm or yarn commands.
|
|
6
6
|
#
|
|
7
7
|
class JsSystem
|
|
8
8
|
include SmartProperties
|
|
@@ -12,21 +12,21 @@ module ShopifyCli
|
|
|
12
12
|
|
|
13
13
|
class << self
|
|
14
14
|
##
|
|
15
|
-
# Proxy to instance method `
|
|
15
|
+
# Proxy to instance method `ShopifyCLI::JsSystem.new.yarn?`
|
|
16
16
|
#
|
|
17
17
|
# #### Parameters
|
|
18
18
|
# - `ctx`: running context from your command
|
|
19
19
|
#
|
|
20
20
|
# #### Example
|
|
21
21
|
#
|
|
22
|
-
#
|
|
22
|
+
# ShopifyCLI::JsSystem.yarn?(ctx)
|
|
23
23
|
#
|
|
24
24
|
def yarn?(ctx)
|
|
25
25
|
JsSystem.new(ctx: ctx).yarn?
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
##
|
|
29
|
-
# Proxy to instance method `
|
|
29
|
+
# Proxy to instance method `ShopifyCLI::JsSystem.new.call`
|
|
30
30
|
#
|
|
31
31
|
# #### Parameters
|
|
32
32
|
# - `ctx`: running context from your command
|
|
@@ -35,21 +35,21 @@ module ShopifyCli
|
|
|
35
35
|
#
|
|
36
36
|
# #### Example
|
|
37
37
|
#
|
|
38
|
-
#
|
|
38
|
+
# ShopifyCLI::JsSystem.call(ctx, yarn: ['install', '--silent'], npm: ['install', '--no-audit'])
|
|
39
39
|
#
|
|
40
40
|
def call(ctx, yarn:, npm:, capture_response: false)
|
|
41
41
|
JsSystem.new(ctx: ctx).call(yarn: yarn, npm: npm, capture_response: capture_response)
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
property :ctx, accepts:
|
|
45
|
+
property :ctx, accepts: ShopifyCLI::Context
|
|
46
46
|
|
|
47
47
|
##
|
|
48
48
|
# Returns the name of the JS package manager being used
|
|
49
49
|
#
|
|
50
50
|
# #### Example
|
|
51
51
|
#
|
|
52
|
-
#
|
|
52
|
+
# ShopifyCLI::JsSystem.new(ctx: ctx).package_manager
|
|
53
53
|
#
|
|
54
54
|
def package_manager
|
|
55
55
|
yarn? ? YARN_CORE_COMMAND : NPM_CORE_COMMAND
|
|
@@ -60,7 +60,7 @@ module ShopifyCli
|
|
|
60
60
|
#
|
|
61
61
|
# #### Example
|
|
62
62
|
#
|
|
63
|
-
#
|
|
63
|
+
# ShopifyCLI::JsSystem.new(ctx: ctx).yarn?
|
|
64
64
|
#
|
|
65
65
|
def yarn?
|
|
66
66
|
@has_yarn ||= begin
|
|
@@ -80,7 +80,7 @@ module ShopifyCli
|
|
|
80
80
|
#
|
|
81
81
|
# #### Example
|
|
82
82
|
#
|
|
83
|
-
#
|
|
83
|
+
# ShopifyCLI::JsSystem.new(ctx: ctx).call(
|
|
84
84
|
# yarn: ['install', '--silent'],
|
|
85
85
|
# npm: ['install', '--no-audit'],
|
|
86
86
|
# capture_response: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "delegate"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
##
|
|
5
5
|
# `LazyDelegator` defers initialization of its underlying delegatee until the
|
|
6
6
|
# latter is accessed for the first time due to a method call that the
|
|
@@ -16,7 +16,7 @@ module ShopifyCli
|
|
|
16
16
|
# LazyDelegator lends itself to being subclassed in scenarios where some
|
|
17
17
|
# facts are known and others are costly to compute:
|
|
18
18
|
#
|
|
19
|
-
# class LazySpecificationHandler <
|
|
19
|
+
# class LazySpecificationHandler < ShopifyCLI::LazyDelegator
|
|
20
20
|
# attr_reader :identifier
|
|
21
21
|
#
|
|
22
22
|
# def initialize(identifier, &initializer)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Messages
|
|
5
5
|
MESSAGES = {
|
|
6
6
|
apps: {
|
|
@@ -92,6 +92,8 @@ module ShopifyCli
|
|
|
92
92
|
download: "Heroku CLI could not be downloaded",
|
|
93
93
|
install: "Could not install Heroku CLI",
|
|
94
94
|
could_not_select_app: "Heroku app {{green:%s}} could not be selected",
|
|
95
|
+
set_config: "Failed to set config %s to %s in Heroku app",
|
|
96
|
+
add_buildpacks: "Failed to add buildpacks in Heroku app",
|
|
95
97
|
},
|
|
96
98
|
},
|
|
97
99
|
|
|
@@ -188,6 +190,20 @@ module ShopifyCli
|
|
|
188
190
|
},
|
|
189
191
|
},
|
|
190
192
|
|
|
193
|
+
php_deps: {
|
|
194
|
+
error: {
|
|
195
|
+
missing_package: "Expected to have a file at: %s",
|
|
196
|
+
invalid_package: "{{info:%s}} was not valid JSON. Fix this then try again",
|
|
197
|
+
install: "Failed to install %s packages",
|
|
198
|
+
install_spinner_error: "Unable to install all %d dependencies",
|
|
199
|
+
install_error: "An error occurred while installing dependencies",
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
installing: "Installing Composer dependencies…",
|
|
203
|
+
installed: "Dependencies installed",
|
|
204
|
+
installed_count: "%d dependencies installed",
|
|
205
|
+
},
|
|
206
|
+
|
|
191
207
|
api: {
|
|
192
208
|
error: {
|
|
193
209
|
failed_auth: "Failed to authenticate with Shopify. Please try again later.",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
##
|
|
3
3
|
# The `MethodObject` mixin can be included in any class that implements `call`
|
|
4
4
|
# to ensure that
|
|
5
5
|
#
|
|
6
|
-
# * `call` will always return a `
|
|
6
|
+
# * `call` will always return a `ShopifyCLI::Result` by prepending a module
|
|
7
7
|
# that takes care of the result wrapping and
|
|
8
8
|
# * a `to_proc` method that allows instances of this class to be passed as a
|
|
9
9
|
# block.
|
|
@@ -42,8 +42,8 @@ module ShopifyCli
|
|
|
42
42
|
# constructed using the `&` operator,
|
|
43
43
|
# * error handling is deferred until the result is unwrapped.
|
|
44
44
|
#
|
|
45
|
-
# Please see the section for `
|
|
46
|
-
# `
|
|
45
|
+
# Please see the section for `ShopifyCLI::Result`,
|
|
46
|
+
# `ShopifyCLI::Result::Success`, and `ShopifyCLI::Result::Failure` for more
|
|
47
47
|
# information on the API of result objects.
|
|
48
48
|
#
|
|
49
49
|
module MethodObject
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
class Packager
|
|
3
|
-
PACKAGING_DIR = File.join(
|
|
4
|
-
BUILDS_DIR = File.join(PACKAGING_DIR, "builds",
|
|
3
|
+
PACKAGING_DIR = File.join(ShopifyCLI::ROOT, "packaging")
|
|
4
|
+
BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCLI::VERSION)
|
|
5
5
|
|
|
6
6
|
def initialize
|
|
7
7
|
FileUtils.mkdir_p(BUILDS_DIR)
|
|
@@ -24,7 +24,7 @@ module ShopifyCli
|
|
|
24
24
|
file_path = File.join(debian_dir, file)
|
|
25
25
|
|
|
26
26
|
file_contents = File.read(File.join(root_dir, "#{file}.base"))
|
|
27
|
-
file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION",
|
|
27
|
+
file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
|
|
28
28
|
File.open(file_path, "w", 0775) { |f| f.write(file_contents) }
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -33,7 +33,7 @@ module ShopifyCli
|
|
|
33
33
|
raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli")
|
|
34
34
|
|
|
35
35
|
output_path = File.join(root_dir, "shopify-cli.deb")
|
|
36
|
-
final_path = File.join(BUILDS_DIR, "shopify-cli-#{
|
|
36
|
+
final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCLI::VERSION}.deb")
|
|
37
37
|
|
|
38
38
|
puts "Moving generated package: \n From: #{output_path}\n To: #{final_path}\n\n"
|
|
39
39
|
FileUtils.mv(output_path, final_path)
|
|
@@ -53,7 +53,7 @@ module ShopifyCli
|
|
|
53
53
|
File.delete(spec_path) if File.exist?(spec_path)
|
|
54
54
|
|
|
55
55
|
spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base"))
|
|
56
|
-
spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION",
|
|
56
|
+
spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
|
|
57
57
|
File.write(spec_path, spec_contents)
|
|
58
58
|
|
|
59
59
|
puts "Building package…"
|
|
@@ -76,12 +76,12 @@ module ShopifyCli
|
|
|
76
76
|
File.delete(build_path) if File.exist?(build_path)
|
|
77
77
|
|
|
78
78
|
spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb"))
|
|
79
|
-
spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION",
|
|
79
|
+
spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
|
|
80
80
|
|
|
81
81
|
puts "Grabbing sha256 checksum from Rubygems.org"
|
|
82
82
|
require "digest/sha2"
|
|
83
83
|
require "open-uri"
|
|
84
|
-
gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{
|
|
84
|
+
gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCLI::VERSION}.gem") do |io|
|
|
85
85
|
Digest::SHA256.new.hexdigest(io.read)
|
|
86
86
|
end
|
|
87
87
|
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
##
|
|
5
|
-
#
|
|
5
|
+
# ShopifyCLI::PartnersAPI provides easy access to the partners dashboard CLI
|
|
6
6
|
# schema.
|
|
7
7
|
#
|
|
8
8
|
class PartnersAPI < API
|
|
9
|
-
autoload :Organizations, "
|
|
10
|
-
|
|
11
|
-
# Defines the environment variable that this API looks for to operate on local
|
|
12
|
-
# services. If you set this environment variable in your shell then the partners
|
|
13
|
-
# API will operate on your local instance
|
|
14
|
-
#
|
|
15
|
-
# #### Example
|
|
16
|
-
#
|
|
17
|
-
# SHOPIFY_APP_CLI_LOCAL_PARTNERS=1 shopify create
|
|
18
|
-
#
|
|
19
|
-
LOCAL_DEBUG = "SHOPIFY_APP_CLI_LOCAL_PARTNERS"
|
|
9
|
+
autoload :Organizations, "shopify_cli/partners_api/organizations"
|
|
20
10
|
|
|
21
11
|
class << self
|
|
22
12
|
##
|
|
@@ -31,10 +21,10 @@ module ShopifyCli
|
|
|
31
21
|
#
|
|
32
22
|
# #### Raises
|
|
33
23
|
#
|
|
34
|
-
# * http 404 will raise a
|
|
35
|
-
# * http 400..499 will raise a
|
|
36
|
-
# * http 500..599 will raise a
|
|
37
|
-
# * All other codes will raise
|
|
24
|
+
# * http 404 will raise a ShopifyCLI::API::APIRequestNotFoundError
|
|
25
|
+
# * http 400..499 will raise a ShopifyCLI::API::APIRequestClientError
|
|
26
|
+
# * http 500..599 will raise a ShopifyCLI::API::APIRequestServerError
|
|
27
|
+
# * All other codes will raise ShopifyCLI::API::APIRequestUnexpectedError
|
|
38
28
|
#
|
|
39
29
|
# #### Returns
|
|
40
30
|
#
|
|
@@ -42,13 +32,13 @@ module ShopifyCli
|
|
|
42
32
|
#
|
|
43
33
|
# #### Example
|
|
44
34
|
#
|
|
45
|
-
#
|
|
35
|
+
# ShopifyCLI::PartnersAPI.query(@ctx, 'all_organizations')
|
|
46
36
|
#
|
|
47
37
|
def query(ctx, query_name, **variables)
|
|
48
38
|
CLI::Kit::Util.begin do
|
|
49
39
|
api_client(ctx).query(query_name, variables: variables)
|
|
50
40
|
end.retry_after(API::APIRequestUnauthorizedError, retries: 1) do
|
|
51
|
-
|
|
41
|
+
ShopifyCLI::IdentityAuth.new(ctx: ctx).reauthenticate
|
|
52
42
|
end
|
|
53
43
|
rescue API::APIRequestUnauthorizedError => e
|
|
54
44
|
if (request_info = auth_failure_info(ctx, e))
|
|
@@ -56,14 +46,14 @@ module ShopifyCli
|
|
|
56
46
|
end
|
|
57
47
|
ctx.abort(ctx.message("core.api.error.failed_auth"))
|
|
58
48
|
rescue API::APIRequestNotFoundError
|
|
59
|
-
ctx.puts(ctx.message("core.partners_api.error.account_not_found",
|
|
49
|
+
ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCLI::TOOL_NAME))
|
|
60
50
|
end
|
|
61
51
|
|
|
62
|
-
def partners_url_for(organization_id, api_client_id
|
|
63
|
-
if
|
|
52
|
+
def partners_url_for(organization_id, api_client_id)
|
|
53
|
+
if ShopifyCLI::Shopifolk.acting_as_shopify_organization?
|
|
64
54
|
organization_id = "internal"
|
|
65
55
|
end
|
|
66
|
-
"
|
|
56
|
+
"https://#{Environment.partners_domain}/#{organization_id}/apps/#{api_client_id}"
|
|
67
57
|
end
|
|
68
58
|
|
|
69
59
|
private
|
|
@@ -72,29 +62,15 @@ module ShopifyCli
|
|
|
72
62
|
new(
|
|
73
63
|
ctx: ctx,
|
|
74
64
|
token: access_token(ctx),
|
|
75
|
-
url: "
|
|
65
|
+
url: "https://#{Environment.partners_domain}/api/cli/graphql",
|
|
76
66
|
)
|
|
77
67
|
end
|
|
78
68
|
|
|
79
69
|
def access_token(ctx)
|
|
80
|
-
|
|
70
|
+
ShopifyCLI::DB.get(:partners_exchange_token) do
|
|
81
71
|
IdentityAuth.new(ctx: ctx).authenticate
|
|
82
|
-
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def endpoint
|
|
87
|
-
return "https://partners.shopify.com" if ENV[LOCAL_DEBUG].nil?
|
|
88
|
-
"https://partners.myshopify.io/"
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def partners_endpoint(local_debug)
|
|
92
|
-
domain = if local_debug
|
|
93
|
-
"partners.myshopify.io"
|
|
94
|
-
else
|
|
95
|
-
"partners.shopify.com"
|
|
72
|
+
ShopifyCLI::DB.get(:partners_exchange_token)
|
|
96
73
|
end
|
|
97
|
-
"https://#{domain}"
|
|
98
74
|
end
|
|
99
75
|
|
|
100
76
|
def auth_failure_info(ctx, error)
|