shopify-cli 0.9.1 → 1.0.2
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 +3 -0
- data/CHANGELOG.md +24 -2
- data/RELEASING.md +4 -4
- data/docs/_config.yml +3 -0
- data/docs/_data/nav.yml +9 -0
- data/docs/getting-started/index.md +5 -40
- data/docs/getting-started/install/index.md +75 -0
- data/docs/getting-started/migrate/index.md +96 -0
- data/docs/getting-started/uninstall/index.md +37 -0
- data/docs/getting-started/upgrade/index.md +37 -0
- data/docs/index.md +5 -6
- data/lib/project_types/extension/cli.rb +2 -1
- data/lib/project_types/extension/commands/tunnel.rb +1 -1
- data/lib/project_types/extension/forms/register.rb +2 -3
- data/lib/project_types/extension/graphql/get_app_by_api_key.graphql +9 -0
- data/lib/project_types/extension/tasks/converters/app_converter.rb +27 -0
- data/lib/project_types/extension/tasks/get_app.rb +22 -0
- data/lib/project_types/extension/tasks/get_apps.rb +1 -6
- data/lib/project_types/node/forms/create.rb +3 -54
- data/lib/project_types/node/messages/messages.rb +3 -14
- data/lib/project_types/rails/forms/create.rb +3 -52
- data/lib/project_types/rails/messages/messages.rb +2 -13
- data/lib/project_types/script/cli.rb +5 -5
- data/lib/project_types/script/commands/create.rb +5 -4
- data/lib/project_types/script/commands/push.rb +1 -0
- data/lib/project_types/script/config/extension_points.yml +3 -3
- data/lib/project_types/script/errors.rb +1 -0
- data/lib/project_types/script/forms/create.rb +8 -4
- data/lib/project_types/script/layers/application/build_script.rb +7 -10
- data/lib/project_types/script/layers/application/create_script.rb +16 -14
- data/lib/project_types/script/layers/application/project_dependencies.rb +3 -9
- data/lib/project_types/script/layers/application/push_script.rb +13 -11
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +106 -0
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +64 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/project_creator.rb +23 -0
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +6 -3
- data/lib/project_types/script/layers/infrastructure/script_repository.rb +8 -38
- data/lib/project_types/script/layers/infrastructure/task_runner.rb +18 -0
- data/lib/project_types/script/messages/messages.rb +5 -6
- data/lib/project_types/script/script_project.rb +22 -9
- data/lib/project_types/script/templates/ts/as-pect.d.ts +1 -0
- data/lib/project_types/script/ui/error_handler.rb +5 -0
- data/lib/shopify-cli/admin_api.rb +1 -2
- data/lib/shopify-cli/admin_api/populate_resource_command.rb +10 -1
- data/lib/shopify-cli/admin_api/schema.rb +11 -1
- data/lib/shopify-cli/api.rb +2 -0
- data/lib/shopify-cli/context.rb +60 -0
- data/lib/shopify-cli/core/entry_point.rb +6 -0
- data/lib/shopify-cli/core/finalize.rb +13 -0
- data/lib/shopify-cli/git.rb +14 -10
- data/lib/shopify-cli/messages/messages.rb +22 -2
- data/lib/shopify-cli/tasks.rb +1 -0
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +77 -0
- data/lib/shopify-cli/tunnel.rb +33 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/vendor/deps/cli-ui/REVISION +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui.rb +52 -11
- data/vendor/deps/cli-ui/lib/cli/ui/color.rb +11 -7
- data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +34 -21
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +107 -149
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +99 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +119 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +158 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +112 -0
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +9 -15
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +47 -0
- data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +9 -7
- data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +39 -14
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +62 -44
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +7 -2
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +23 -3
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +34 -10
- data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +12 -7
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +26 -16
- data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +3 -3
- data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +75 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +27 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +61 -0
- metadata +24 -9
- data/lib/project_types/extension/features/tunnel_url.rb +0 -20
- data/lib/project_types/script/layers/infrastructure/assemblyscript_dependency_manager.rb +0 -73
- data/lib/project_types/script/layers/infrastructure/assemblyscript_wasm_builder.rb +0 -39
- data/lib/project_types/script/layers/infrastructure/dependency_manager.rb +0 -36
- data/lib/project_types/script/layers/infrastructure/script_builder.rb +0 -34
- data/lib/project_types/script/layers/infrastructure/test_suite_repository.rb +0 -59
- data/vendor/deps/cli-ui/lib/cli/ui/box.rb +0 -15
|
@@ -18,8 +18,12 @@ module Script
|
|
|
18
18
|
invalid_context_cause: "Your .shopify-cli.yml file is not correct.",
|
|
19
19
|
invalid_context_help: "See https://help.shopify.com",
|
|
20
20
|
|
|
21
|
+
invalid_script_name_cause: "Invalid script name.",
|
|
22
|
+
invalid_script_name_help: "Replace or remove unsupported characters. Valid characters "\
|
|
23
|
+
"are numbers, letters, hyphens, or underscores.",
|
|
24
|
+
|
|
21
25
|
no_existing_apps_cause: "You don't have any apps.",
|
|
22
|
-
no_existing_apps_help: "Please create an app with {{command:shopify create}} or"\
|
|
26
|
+
no_existing_apps_help: "Please create an app with {{command:shopify create}} or "\
|
|
23
27
|
"visit https://partners.shopify.com/.",
|
|
24
28
|
|
|
25
29
|
no_existing_orgs_cause: "You don't have any partner organizations.",
|
|
@@ -169,11 +173,6 @@ module Script
|
|
|
169
173
|
create: {
|
|
170
174
|
select_extension_point: "Which extension point do you want to use?",
|
|
171
175
|
script_name: "Script Name",
|
|
172
|
-
|
|
173
|
-
error: {
|
|
174
|
-
invalid_name: "Invalid script name: replace or remove unsupported characters. Valid "\
|
|
175
|
-
"characters are numbers, letters, spaces, hyphens, or underscores.",
|
|
176
|
-
},
|
|
177
176
|
},
|
|
178
177
|
script_form: {
|
|
179
178
|
ask_app_api_key_default: "Which app do you want this script to belong to?",
|
|
@@ -3,14 +3,28 @@
|
|
|
3
3
|
module Script
|
|
4
4
|
class ScriptProject < ShopifyCli::Project
|
|
5
5
|
SUPPORTED_LANGUAGES = %w(ts)
|
|
6
|
+
SOURCE_DIR = "src"
|
|
6
7
|
|
|
7
8
|
attr_reader :extension_point_type, :script_name, :language
|
|
8
9
|
|
|
9
|
-
def initialize(
|
|
10
|
-
super
|
|
10
|
+
def initialize(*args)
|
|
11
|
+
super
|
|
11
12
|
@extension_point_type = lookup_config('extension_point_type')
|
|
12
13
|
@script_name = lookup_config('script_name')
|
|
13
14
|
@language = 'ts'
|
|
15
|
+
ShopifyCli::Core::Monorail.metadata = {
|
|
16
|
+
"script_name" => @script_name,
|
|
17
|
+
"extension_point_type" => @extension_point_type,
|
|
18
|
+
"language" => @language,
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def source_file
|
|
23
|
+
"#{SOURCE_DIR}/#{file_name}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def file_name
|
|
27
|
+
"script.#{language}"
|
|
14
28
|
end
|
|
15
29
|
|
|
16
30
|
private
|
|
@@ -21,16 +35,15 @@ module Script
|
|
|
21
35
|
end
|
|
22
36
|
|
|
23
37
|
class << self
|
|
24
|
-
def create(dir)
|
|
25
|
-
raise Errors::ScriptProjectAlreadyExistsError, dir if
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Dir.chdir(dir)
|
|
38
|
+
def create(ctx, dir)
|
|
39
|
+
raise Errors::ScriptProjectAlreadyExistsError, dir if ctx.dir_exist?(dir)
|
|
40
|
+
ctx.mkdir_p(dir)
|
|
41
|
+
ctx.chdir(dir)
|
|
29
42
|
end
|
|
30
43
|
|
|
31
44
|
def cleanup(ctx:, script_name:, root_dir:)
|
|
32
|
-
|
|
33
|
-
ctx.rm_r("#{root_dir}/#{script_name}") if
|
|
45
|
+
ctx.chdir(root_dir)
|
|
46
|
+
ctx.rm_r("#{root_dir}/#{script_name}") if ctx.dir_exist?("#{root_dir}/#{script_name}")
|
|
34
47
|
end
|
|
35
48
|
end
|
|
36
49
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="@as-pect/assembly/types/as-pect" />
|
|
@@ -44,6 +44,11 @@ module Script
|
|
|
44
44
|
cause_of_error: ShopifyCli::Context.message('script.error.invalid_context_cause'),
|
|
45
45
|
help_suggestion: ShopifyCli::Context.message('script.error.invalid_context_help'),
|
|
46
46
|
}
|
|
47
|
+
when Errors::InvalidScriptNameError
|
|
48
|
+
{
|
|
49
|
+
cause_of_error: ShopifyCli::Context.message('script.error.invalid_script_name_cause'),
|
|
50
|
+
help_suggestion: ShopifyCli::Context.message('script.error.invalid_script_name_help'),
|
|
51
|
+
}
|
|
47
52
|
when Errors::NoExistingAppsError
|
|
48
53
|
{
|
|
49
54
|
cause_of_error: ShopifyCli::Context.message('script.error.no_existing_apps_cause'),
|
|
@@ -37,8 +37,7 @@ module ShopifyCli
|
|
|
37
37
|
#
|
|
38
38
|
# ShopifyCli::AdminAPI.query(@ctx, 'all_organizations')
|
|
39
39
|
#
|
|
40
|
-
def query(ctx, query_name, api_version: nil,
|
|
41
|
-
shop ||= Project.current.env.shop
|
|
40
|
+
def query(ctx, query_name, shop:, api_version: nil, **variables)
|
|
42
41
|
authenticated_req(ctx, shop) do
|
|
43
42
|
api_client(ctx, api_version, shop).query(query_name, variables: variables)
|
|
44
43
|
end
|
|
@@ -41,6 +41,8 @@ module ShopifyCli
|
|
|
41
41
|
return @ctx.puts(output)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
@shop ||= Project.current.env.shop || get_shop(@ctx)
|
|
45
|
+
|
|
44
46
|
if @silent
|
|
45
47
|
spin_group = CLI::UI::SpinGroup.new
|
|
46
48
|
spin_group.add(@ctx.message('core.populate.populating', @count, camel_case_resource_type)) do |spinner|
|
|
@@ -114,7 +116,7 @@ module ShopifyCli
|
|
|
114
116
|
|
|
115
117
|
def run_mutation(data)
|
|
116
118
|
kwargs = { input: data }
|
|
117
|
-
kwargs[:shop] = @shop
|
|
119
|
+
kwargs[:shop] = @shop
|
|
118
120
|
resp = AdminAPI.query(
|
|
119
121
|
@ctx, "create_#{snake_case_resource_type}", kwargs
|
|
120
122
|
)
|
|
@@ -145,6 +147,13 @@ module ShopifyCli
|
|
|
145
147
|
|
|
146
148
|
private
|
|
147
149
|
|
|
150
|
+
def get_shop(ctx)
|
|
151
|
+
res = ShopifyCli::Tasks::SelectOrgAndShop.call(ctx)
|
|
152
|
+
domain = res[:shop_domain]
|
|
153
|
+
Project.current.env.update(ctx, :shop, domain)
|
|
154
|
+
domain
|
|
155
|
+
end
|
|
156
|
+
|
|
148
157
|
def camel_case_resource_type
|
|
149
158
|
@camel_case_resource_type ||= self.class.to_s.split('::').last
|
|
150
159
|
end
|
|
@@ -5,7 +5,8 @@ module ShopifyCli
|
|
|
5
5
|
class Schema < Hash
|
|
6
6
|
def self.get(ctx)
|
|
7
7
|
unless ShopifyCli::DB.exists?(:shopify_admin_schema)
|
|
8
|
-
|
|
8
|
+
shop = Project.current.env.shop || get_shop(@ctx)
|
|
9
|
+
schema = AdminAPI.query(ctx, 'admin_introspection', shop: shop)
|
|
9
10
|
ShopifyCli::DB.set(shopify_admin_schema: JSON.dump(schema))
|
|
10
11
|
end
|
|
11
12
|
# This is ruby magic for making a new hash with another hash.
|
|
@@ -27,6 +28,15 @@ module ShopifyCli
|
|
|
27
28
|
object["name"]
|
|
28
29
|
end
|
|
29
30
|
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def get_shop(ctx)
|
|
35
|
+
res = ShopifyCli::Tasks::SelectOrgAndShop.call(ctx)
|
|
36
|
+
domain = res[:shop_domain]
|
|
37
|
+
Project.current.env.update(ctx, :shop, domain)
|
|
38
|
+
domain
|
|
39
|
+
end
|
|
30
40
|
end
|
|
31
41
|
end
|
|
32
42
|
end
|
data/lib/shopify-cli/api.rb
CHANGED
data/lib/shopify-cli/context.rb
CHANGED
|
@@ -131,6 +131,56 @@ module ShopifyCli
|
|
|
131
131
|
File.write(ctx_path(fname), content)
|
|
132
132
|
end
|
|
133
133
|
|
|
134
|
+
# will change directories and update the root, the filepath is relative to the command root unless absolute
|
|
135
|
+
#
|
|
136
|
+
# #### Parameters
|
|
137
|
+
# * `path` - the file path to a directory, relative to the context root to remove from the FS
|
|
138
|
+
#
|
|
139
|
+
def chdir(path)
|
|
140
|
+
Dir.chdir(ctx_path(path))
|
|
141
|
+
self.root = ctx_path(path)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# checks if a directory exists, the filepath is relative to the command root unless absolute
|
|
145
|
+
#
|
|
146
|
+
# #### Parameters
|
|
147
|
+
# * `path` - the file path to a directory, relative to the context root to remove from the FS
|
|
148
|
+
#
|
|
149
|
+
def dir_exist?(path)
|
|
150
|
+
Dir.exist?(ctx_path(path))
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# checks if a file exists, the filepath is relative to the command root unless absolute
|
|
154
|
+
#
|
|
155
|
+
# #### Parameters
|
|
156
|
+
# * `path` - the file path to a file, relative to the context root to remove from the FS
|
|
157
|
+
#
|
|
158
|
+
def file_exist?(path)
|
|
159
|
+
File.exist?(ctx_path(path))
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# will recursively copy a directory from the FS, the filepath is relative to the command
|
|
163
|
+
# root unless absolute
|
|
164
|
+
#
|
|
165
|
+
# #### Parameters
|
|
166
|
+
# * `from` - the path of the original file
|
|
167
|
+
# * `to` - the destination path
|
|
168
|
+
#
|
|
169
|
+
def cp_r(from, to)
|
|
170
|
+
FileUtils.cp_r(ctx_path(from), ctx_path(to))
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# will copy a directory from the FS, the filepath is relative to the command
|
|
174
|
+
# root unless absolute
|
|
175
|
+
#
|
|
176
|
+
# #### Parameters
|
|
177
|
+
# * `from` - the path of the original file
|
|
178
|
+
# * `to` - the destination path
|
|
179
|
+
#
|
|
180
|
+
def cp(from, to)
|
|
181
|
+
FileUtils.cp(ctx_path(from), ctx_path(to))
|
|
182
|
+
end
|
|
183
|
+
|
|
134
184
|
# will rename a file from one place to another, relative to the command root
|
|
135
185
|
# unless the path is absolute.
|
|
136
186
|
#
|
|
@@ -162,6 +212,16 @@ module ShopifyCli
|
|
|
162
212
|
FileUtils.rm_r(ctx_path(fname))
|
|
163
213
|
end
|
|
164
214
|
|
|
215
|
+
# will force remove a directory from the FS, the filepath is relative to the command
|
|
216
|
+
# root unless absolute
|
|
217
|
+
#
|
|
218
|
+
# #### Parameters
|
|
219
|
+
# * `fname` - the file path to a directory, relative to the context root to remove from the FS
|
|
220
|
+
#
|
|
221
|
+
def rm_rf(fname)
|
|
222
|
+
FileUtils.rm_rf(ctx_path(fname))
|
|
223
|
+
end
|
|
224
|
+
|
|
165
225
|
# will create a directory, recursively if it does not exist. So if you create
|
|
166
226
|
# a directory `foo/bar/dun`, this will also create the directories `foo` and
|
|
167
227
|
# `foo/bar` if they do not exist. The path will be made relative to the command
|
|
@@ -11,6 +11,12 @@ module ShopifyCli
|
|
|
11
11
|
IO.open(9) { is_shell_shim = true }
|
|
12
12
|
rescue Errno::EBADF
|
|
13
13
|
# This is expected if the descriptor doesn't exist
|
|
14
|
+
rescue ArgumentError => e
|
|
15
|
+
# This can happen on RVM, because it can use fd 9 itself and block access to it. That only happens if the fd
|
|
16
|
+
# did not exist beforehand, so that means there was no fd 9 before Ruby started.
|
|
17
|
+
unless e.message == 'The given fd is not accessible because RubyVM reserves it'
|
|
18
|
+
raise e
|
|
19
|
+
end
|
|
14
20
|
end
|
|
15
21
|
|
|
16
22
|
if !ctx.testing? && is_shell_shim
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module ShopifyCli
|
|
2
|
+
module Core
|
|
3
|
+
# This class is just a dummy to make sure that we don't trigger warnings on the first time the updated code runs.
|
|
4
|
+
# The old code would try to call the Finalizer after it is done updating, which would then trigger an autoload of
|
|
5
|
+
# this class and fail.
|
|
6
|
+
module Finalize
|
|
7
|
+
class << self
|
|
8
|
+
def deliver!
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/shopify-cli/git.rb
CHANGED
|
@@ -46,10 +46,10 @@ module ShopifyCli
|
|
|
46
46
|
if Dir.exist?(dest)
|
|
47
47
|
ctx.abort(ctx.message('core.git.error.directory_exists'))
|
|
48
48
|
else
|
|
49
|
-
|
|
49
|
+
success_message = ctx.message('core.git.cloned', dest)
|
|
50
|
+
CLI::UI::Frame.open(ctx.message('core.git.cloning', repository, dest), success_text: success_message) do
|
|
50
51
|
clone_progress('clone', '--single-branch', repository, dest, ctx: ctx)
|
|
51
52
|
end
|
|
52
|
-
ctx.done(ctx.message('core.git.cloned', dest))
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -121,19 +121,23 @@ module ShopifyCli
|
|
|
121
121
|
def clone_progress(*git_command, ctx:)
|
|
122
122
|
CLI::UI::Progress.progress do |bar|
|
|
123
123
|
msg = []
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
require 'open3'
|
|
125
|
+
|
|
126
|
+
success = Open3.popen3('git', *git_command, '--progress') do |_stdin, _stdout, stderr, thread|
|
|
127
|
+
while (line = stderr.gets)
|
|
128
|
+
next unless line.strip.start_with?('Receiving objects:')
|
|
129
|
+
percent = (line.match(/Receiving objects:\s+(\d+)/)[1].to_f / 100).round(2)
|
|
127
130
|
bar.tick(set_percent: percent)
|
|
128
131
|
next
|
|
129
132
|
end
|
|
130
|
-
|
|
133
|
+
|
|
134
|
+
msg << stderr
|
|
135
|
+
thread.value
|
|
131
136
|
end.success?
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
end
|
|
137
|
+
|
|
138
|
+
ctx.abort(msg.join("\n")) unless success
|
|
135
139
|
bar.tick(set_percent: 1.0)
|
|
136
|
-
|
|
140
|
+
success
|
|
137
141
|
end
|
|
138
142
|
end
|
|
139
143
|
end
|
|
@@ -60,8 +60,8 @@ module ShopifyCli
|
|
|
60
60
|
no_commits_made: "No git commits have been made. Please make at least one commit.",
|
|
61
61
|
},
|
|
62
62
|
|
|
63
|
-
cloning: "Cloning into %s...",
|
|
64
|
-
cloned: "Cloned into %s",
|
|
63
|
+
cloning: "Cloning %s into %s...",
|
|
64
|
+
cloned: "{{v}} Cloned into %s",
|
|
65
65
|
},
|
|
66
66
|
|
|
67
67
|
help: {
|
|
@@ -154,6 +154,12 @@ module ShopifyCli
|
|
|
154
154
|
},
|
|
155
155
|
},
|
|
156
156
|
|
|
157
|
+
api: {
|
|
158
|
+
error: {
|
|
159
|
+
internal_server_error: '{{red:{{x}} An unexpected error occurred on Shopify.}}',
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
|
|
157
163
|
populate: {
|
|
158
164
|
options: {
|
|
159
165
|
header: "{{bold:{{cyan:%s}} options:}}",
|
|
@@ -245,6 +251,20 @@ module ShopifyCli
|
|
|
245
251
|
"{{x}} error: For authentication issues, run {{command:%s logout}} to clear invalid credentials",
|
|
246
252
|
update_prompt: "Do you want to update your application url?",
|
|
247
253
|
},
|
|
254
|
+
select_org_and_shop: {
|
|
255
|
+
authentication_issue: "For authentication issues, run {{command:%s logout}} to clear invalid credentials",
|
|
256
|
+
create_store: "Visit {{underline:https://partners.shopify.com/%s/stores}} to create one",
|
|
257
|
+
development_store: "Using development store {{green:%s}}",
|
|
258
|
+
development_store_select: "Select a development store",
|
|
259
|
+
error: {
|
|
260
|
+
no_development_stores: "{{x}} No Development Stores available.",
|
|
261
|
+
no_organizations: "No partner organizations available.",
|
|
262
|
+
organization_not_found: "Cannot find a partner organization with that ID",
|
|
263
|
+
partners_notice: "Please visit https://partners.shopify.com/ to create a partners account",
|
|
264
|
+
},
|
|
265
|
+
organization: "Partner organization {{green:%s (%s)}}",
|
|
266
|
+
organization_select: "Select partner organization",
|
|
267
|
+
},
|
|
248
268
|
},
|
|
249
269
|
|
|
250
270
|
tunnel: {
|
data/lib/shopify-cli/tasks.rb
CHANGED
|
@@ -27,6 +27,7 @@ module ShopifyCli
|
|
|
27
27
|
register :EnsureEnv, :ensure_env, 'shopify-cli/tasks/ensure_env'
|
|
28
28
|
register :EnsureLoopbackURL, :ensure_loopback_url, 'shopify-cli/tasks/ensure_loopback_url'
|
|
29
29
|
register :EnsureDevStore, :ensure_dev_store, 'shopify-cli/tasks/ensure_dev_store'
|
|
30
|
+
register :SelectOrgAndShop, :select_org_and_shop, 'shopify-cli/tasks/select_org_and_shop'
|
|
30
31
|
register :UpdateDashboardURLS, :update_dashboard_urls, 'shopify-cli/tasks/update_dashboard_urls'
|
|
31
32
|
end
|
|
32
33
|
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'shopify_cli'
|
|
2
|
+
|
|
3
|
+
module ShopifyCli
|
|
4
|
+
module Tasks
|
|
5
|
+
class SelectOrgAndShop < ShopifyCli::Task
|
|
6
|
+
attr_reader :ctx
|
|
7
|
+
|
|
8
|
+
def call(ctx, organization_id: nil, shop_domain: nil)
|
|
9
|
+
@ctx = ctx
|
|
10
|
+
return response(organization_id.to_i, shop_domain) unless organization_id.nil? || shop_domain.nil?
|
|
11
|
+
org = get_organization(organization_id)
|
|
12
|
+
shop_domain ||= get_shop_domain(org)
|
|
13
|
+
response(org["id"].to_i, shop_domain)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def response(organization_id, shop_domain)
|
|
19
|
+
{
|
|
20
|
+
organization_id: organization_id,
|
|
21
|
+
shop_domain: shop_domain,
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def organizations
|
|
26
|
+
@organizations ||= ShopifyCli::PartnersAPI::Organizations.fetch_all(ctx)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def get_organization(organization_id)
|
|
30
|
+
@organization ||= if !organization_id.nil?
|
|
31
|
+
org = ShopifyCli::PartnersAPI::Organizations.fetch(ctx, id: organization_id)
|
|
32
|
+
if org.nil?
|
|
33
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.error.authentication_issue', ShopifyCli::TOOL_NAME))
|
|
34
|
+
ctx.abort(ctx.message('core.tasks.select_org_and_shop.error.organization_not_found'))
|
|
35
|
+
end
|
|
36
|
+
org
|
|
37
|
+
elsif organizations.count == 0
|
|
38
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.error.partners_notice'))
|
|
39
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.authentication_issue', ShopifyCli::TOOL_NAME))
|
|
40
|
+
ctx.abort(ctx.message('core.tasks.select_org_and_shop.error.no_organizations'))
|
|
41
|
+
elsif organizations.count == 1
|
|
42
|
+
org = organizations.first
|
|
43
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.organization', org['businessName'], org['id']))
|
|
44
|
+
org
|
|
45
|
+
else
|
|
46
|
+
org_id = CLI::UI::Prompt.ask(ctx.message('core.tasks.select_org_and_shop.organization_select')) do |handler|
|
|
47
|
+
organizations.each do |o|
|
|
48
|
+
handler.option(ctx.message('core.partners_api.org_name_and_id', o['businessName'], o['id'])) { o['id'] }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
organizations.find { |o| o['id'] == org_id }
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def get_shop_domain(organization)
|
|
56
|
+
valid_stores = organization['stores'].select do |store|
|
|
57
|
+
store['transferDisabled'] == true || store['convertableToPartnerTest'] == true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
if valid_stores.count == 0
|
|
61
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.error.no_development_stores'))
|
|
62
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.create_store', organization['id']))
|
|
63
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.authentication_issue', ShopifyCli::TOOL_NAME))
|
|
64
|
+
elsif valid_stores.count == 1
|
|
65
|
+
domain = valid_stores.first['shopDomain']
|
|
66
|
+
ctx.puts(ctx.message('core.tasks.select_org_and_shop.development_store', domain))
|
|
67
|
+
domain
|
|
68
|
+
else
|
|
69
|
+
CLI::UI::Prompt.ask(
|
|
70
|
+
ctx.message('core.tasks.select_org_and_shop.development_store_select'),
|
|
71
|
+
options: valid_stores.map { |s| s['shopDomain'] }
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|