shopify-cli 1.12.0 → 2.0.1
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 -1
- data/.github/CONTRIBUTING.md +7 -7
- data/.github/DESIGN.md +3 -3
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- data/.github/workflows/build.yml +1 -1
- data/.gitignore +3 -0
- data/.rubocop.yml +3 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +52 -21
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/LICENSE +4 -1
- data/README.md +92 -26
- data/RELEASING.md +31 -7
- data/Rakefile +2 -2
- data/SECURITY.md +1 -1
- data/bin/load_shopify.rb +1 -1
- data/bin/shopify +3 -3
- data/dev.yml +1 -1
- data/docs/app/node/index.md +1 -1
- data/docs/app/rails/index.md +1 -1
- data/docs/core/index.md +1 -1
- data/docs/getting-started/index.md +1 -1
- data/docs/getting-started/install/index.md +1 -1
- data/docs/getting-started/migrate/index.md +1 -1
- data/docs/getting-started/uninstall/index.md +1 -1
- data/docs/getting-started/upgrade/index.md +1 -1
- data/docs/help/start-app/index.md +1 -1
- data/docs/index.md +1 -1
- data/ext/shopify-cli/extconf.rb +17 -5
- data/install.sh +1 -1
- data/lib/docgen/index_template.md.erb +2 -2
- data/lib/graphql/all_orgs_with_extensions.graphql +37 -0
- data/lib/graphql/find_organization.graphql +2 -1
- data/lib/project_types/extension/cli.rb +18 -15
- data/lib/project_types/extension/commands/build.rb +4 -5
- data/lib/project_types/extension/commands/connect.rb +35 -0
- data/lib/project_types/extension/commands/create.rb +12 -16
- data/lib/project_types/extension/commands/extension_command.rb +2 -2
- data/lib/project_types/extension/commands/info.rb +86 -0
- data/lib/project_types/extension/commands/push.rb +8 -7
- data/lib/project_types/extension/commands/register.rb +4 -5
- data/lib/project_types/extension/commands/serve.rb +5 -8
- data/lib/project_types/extension/commands/tunnel.rb +3 -1
- data/lib/project_types/extension/errors.rb +9 -0
- data/lib/project_types/extension/extension_project.rb +5 -0
- data/lib/project_types/extension/features/argo.rb +6 -6
- data/lib/project_types/extension/features/argo_runtime.rb +22 -59
- data/lib/project_types/extension/features/argo_serve.rb +25 -21
- data/lib/project_types/extension/forms/connect.rb +42 -0
- data/lib/project_types/extension/forms/questions/ask_name.rb +14 -6
- data/lib/project_types/extension/forms/questions/ask_registration.rb +51 -0
- data/lib/project_types/extension/messages/messages.rb +75 -11
- data/lib/project_types/extension/models/specification.rb +1 -0
- data/lib/project_types/extension/models/specification_handlers/{checkout_argo_extension.rb → checkout_ui_extension.rb} +3 -1
- data/lib/project_types/extension/models/specification_handlers/default.rb +13 -13
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +89 -0
- data/lib/project_types/extension/models/specifications.rb +1 -0
- data/lib/project_types/extension/tasks/configure_features.rb +6 -7
- data/lib/project_types/extension/tasks/configure_options.rb +20 -0
- data/lib/project_types/extension/tasks/get_extensions.rb +32 -0
- data/lib/project_types/node/cli.rb +9 -21
- data/lib/project_types/node/commands/connect.rb +8 -2
- data/lib/project_types/node/commands/create.rb +9 -5
- data/lib/project_types/node/commands/deploy.rb +15 -5
- data/lib/project_types/node/commands/deploy/heroku.rb +29 -29
- data/lib/project_types/node/commands/generate.rb +4 -2
- data/lib/project_types/node/commands/open.rb +4 -2
- data/lib/project_types/node/commands/serve.rb +3 -2
- data/lib/project_types/node/commands/tunnel.rb +4 -2
- data/lib/project_types/node/messages/messages.rb +46 -89
- data/lib/project_types/rails/cli.rb +9 -21
- data/lib/project_types/rails/commands/connect.rb +8 -2
- data/lib/project_types/rails/commands/create.rb +10 -6
- data/lib/project_types/rails/commands/deploy.rb +15 -5
- data/lib/project_types/rails/commands/deploy/heroku.rb +84 -82
- data/lib/project_types/rails/commands/generate.rb +15 -5
- data/lib/project_types/rails/commands/generate/webhook.rb +28 -26
- data/lib/project_types/rails/commands/open.rb +4 -2
- data/lib/project_types/rails/commands/serve.rb +3 -2
- data/lib/project_types/rails/commands/tunnel.rb +4 -2
- data/lib/project_types/rails/messages/messages.rb +54 -101
- data/lib/project_types/script/cli.rb +18 -20
- data/lib/project_types/script/commands/create.rb +3 -1
- data/lib/project_types/script/commands/push.rb +12 -5
- data/lib/project_types/script/config/extension_points.yml +0 -3
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +9 -3
- data/lib/project_types/script/layers/application/create_script.rb +6 -5
- data/lib/project_types/script/layers/application/push_script.rb +2 -1
- data/lib/project_types/script/layers/domain/errors.rb +6 -11
- data/lib/project_types/script/layers/domain/push_package.rb +4 -8
- data/lib/project_types/script/layers/domain/script_json.rb +32 -0
- data/lib/project_types/script/layers/domain/script_project.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +14 -18
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +105 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +103 -0
- data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +26 -0
- data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +73 -0
- data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +60 -0
- data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +21 -0
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +2 -4
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +45 -34
- data/lib/project_types/script/layers/infrastructure/script_service.rb +37 -16
- data/lib/project_types/script/messages/messages.rb +66 -55
- data/lib/project_types/script/tasks/ensure_env.rb +22 -1
- data/lib/project_types/script/ui/error_handler.rb +32 -32
- data/lib/project_types/theme/cli.rb +16 -27
- data/lib/project_types/theme/commands/check.rb +33 -0
- data/lib/project_types/theme/commands/delete.rb +64 -0
- data/lib/project_types/theme/commands/init.rb +42 -0
- data/lib/project_types/theme/commands/language_server.rb +16 -0
- data/lib/project_types/theme/commands/package.rb +55 -0
- data/lib/project_types/theme/commands/publish.rb +43 -0
- data/lib/project_types/theme/commands/pull.rb +51 -0
- data/lib/project_types/theme/commands/push.rb +58 -32
- data/lib/project_types/theme/commands/serve.rb +8 -16
- data/lib/project_types/theme/forms/confirm_store.rb +15 -0
- data/lib/project_types/theme/forms/select.rb +59 -0
- data/lib/project_types/theme/messages/messages.rb +117 -102
- data/lib/project_types/theme/ui/sync_progress_bar.rb +20 -0
- data/lib/shopify-cli/admin_api.rb +53 -35
- data/lib/shopify-cli/admin_api/populate_resource_command.rb +6 -14
- data/lib/shopify-cli/admin_api/schema.rb +1 -10
- data/lib/shopify-cli/api.rb +29 -14
- data/lib/shopify-cli/command.rb +15 -3
- data/lib/shopify-cli/commands.rb +7 -2
- data/lib/shopify-cli/commands/help.rb +2 -29
- data/lib/shopify-cli/commands/login.rb +95 -0
- data/lib/shopify-cli/commands/logout.rb +24 -8
- data/lib/shopify-cli/commands/populate.rb +23 -0
- data/lib/{project_types/node → shopify-cli}/commands/populate/customer.rb +2 -8
- data/lib/{project_types/node → shopify-cli}/commands/populate/draft_order.rb +2 -2
- data/lib/{project_types/node → shopify-cli}/commands/populate/product.rb +2 -8
- data/lib/shopify-cli/commands/store.rb +15 -0
- data/lib/shopify-cli/commands/switch.rb +39 -0
- data/lib/shopify-cli/commands/system.rb +12 -0
- data/lib/shopify-cli/commands/whoami.rb +28 -0
- data/lib/shopify-cli/connect.rb +32 -0
- data/lib/shopify-cli/context.rb +65 -4
- data/lib/shopify-cli/core/entry_point.rb +3 -22
- data/lib/shopify-cli/db.rb +4 -4
- data/lib/shopify-cli/http_request.rb +16 -0
- data/lib/shopify-cli/identity_auth.rb +282 -0
- data/lib/shopify-cli/{oauth → identity_auth}/servlet.rb +11 -12
- data/lib/shopify-cli/messages/messages.rb +133 -39
- data/lib/shopify-cli/partners_api.rb +21 -41
- data/lib/shopify-cli/partners_api/organizations.rb +8 -0
- data/lib/shopify-cli/project_commands.rb +16 -0
- data/lib/shopify-cli/project_type.rb +0 -31
- data/lib/shopify-cli/resources/env_file.rb +1 -1
- data/lib/shopify-cli/shopifolk.rb +8 -11
- data/lib/shopify-cli/sub_command.rb +1 -0
- data/lib/shopify-cli/tasks.rb +3 -0
- data/lib/shopify-cli/tasks/confirm_store.rb +18 -0
- data/lib/shopify-cli/tasks/create_api_client.rb +2 -2
- data/lib/shopify-cli/tasks/ensure_authenticated.rb +13 -0
- data/lib/shopify-cli/tasks/ensure_loopback_url.rb +1 -1
- data/lib/shopify-cli/tasks/ensure_project_type.rb +12 -0
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +0 -3
- data/lib/shopify-cli/theme/dev_server.rb +98 -0
- data/lib/shopify-cli/theme/dev_server/certificate_manager.rb +79 -0
- data/lib/shopify-cli/theme/dev_server/header_hash.rb +94 -0
- data/lib/shopify-cli/theme/dev_server/hot-reload.js +93 -0
- data/lib/shopify-cli/theme/dev_server/hot_reload.rb +76 -0
- data/lib/shopify-cli/theme/dev_server/local_assets.rb +87 -0
- data/lib/shopify-cli/theme/dev_server/proxy.rb +205 -0
- data/lib/shopify-cli/theme/dev_server/sse.rb +75 -0
- data/lib/shopify-cli/theme/dev_server/watcher.rb +59 -0
- data/lib/shopify-cli/theme/dev_server/web_server.rb +140 -0
- data/lib/shopify-cli/theme/development_theme.rb +69 -0
- data/lib/shopify-cli/theme/file.rb +112 -0
- data/lib/shopify-cli/theme/ignore_filter.rb +109 -0
- data/lib/shopify-cli/theme/mime_type.rb +34 -0
- data/lib/shopify-cli/theme/syncer.rb +328 -0
- data/lib/shopify-cli/theme/theme.rb +204 -0
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +18 -11
- data/shopify-cli.gemspec +12 -5
- data/shopify.fish +1 -1
- data/shopify.sh +1 -1
- metadata +96 -41
- data/.github/workflows/release.yml +0 -61
- data/lib/project_types/extension/features/argo_serve_options.rb +0 -41
- data/lib/project_types/node/commands/populate.rb +0 -23
- data/lib/project_types/rails/commands/populate.rb +0 -23
- data/lib/project_types/rails/commands/populate/customer.rb +0 -31
- data/lib/project_types/rails/commands/populate/draft_order.rb +0 -28
- data/lib/project_types/rails/commands/populate/product.rb +0 -30
- data/lib/project_types/script/layers/domain/config_ui.rb +0 -16
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +0 -95
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +0 -101
- data/lib/project_types/script/layers/infrastructure/project_creator.rb +0 -24
- data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +0 -71
- data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +0 -58
- data/lib/project_types/script/layers/infrastructure/task_runner.rb +0 -19
- data/lib/project_types/theme/commands/connect.rb +0 -54
- data/lib/project_types/theme/commands/create.rb +0 -48
- data/lib/project_types/theme/commands/deploy.rb +0 -38
- data/lib/project_types/theme/commands/generate.rb +0 -20
- data/lib/project_types/theme/commands/generate/env.rb +0 -79
- data/lib/project_types/theme/forms/connect.rb +0 -34
- data/lib/project_types/theme/forms/create.rb +0 -22
- data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +0 -78
- data/lib/project_types/theme/themekit.rb +0 -113
- data/lib/shopify-cli/commands/connect.rb +0 -64
- data/lib/shopify-cli/commands/create.rb +0 -50
- data/lib/shopify-cli/oauth.rb +0 -198
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "shopify-cli/theme/theme"
|
|
3
|
+
require "shopify-cli/theme/ignore_filter"
|
|
4
|
+
require "shopify-cli/theme/syncer"
|
|
5
|
+
|
|
6
|
+
module Theme
|
|
7
|
+
class Command
|
|
8
|
+
class Pull < ShopifyCli::SubCommand
|
|
9
|
+
options do |parser, flags|
|
|
10
|
+
parser.on("-n", "--nodelete") { flags[:nodelete] = true }
|
|
11
|
+
parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call(args, _name)
|
|
15
|
+
root = args.first || "."
|
|
16
|
+
delete = !options.flags[:nodelete]
|
|
17
|
+
|
|
18
|
+
theme = if (theme_id = options.flags[:theme_id])
|
|
19
|
+
ShopifyCli::Theme::Theme.new(@ctx, root: root, id: theme_id)
|
|
20
|
+
else
|
|
21
|
+
form = Forms::Select.ask(
|
|
22
|
+
@ctx,
|
|
23
|
+
[],
|
|
24
|
+
title: @ctx.message("theme.pull.select"),
|
|
25
|
+
root: root,
|
|
26
|
+
)
|
|
27
|
+
return unless form
|
|
28
|
+
form.theme
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
ignore_filter = ShopifyCli::Theme::IgnoreFilter.from_path(root)
|
|
32
|
+
syncer = ShopifyCli::Theme::Syncer.new(@ctx, theme: theme, ignore_filter: ignore_filter)
|
|
33
|
+
begin
|
|
34
|
+
syncer.start_threads
|
|
35
|
+
CLI::UI::Frame.open(@ctx.message("theme.pull.pulling", theme.name, theme.id, theme.shop)) do
|
|
36
|
+
UI::SyncProgressBar.new(syncer).progress(:download_theme!, delete: delete)
|
|
37
|
+
end
|
|
38
|
+
@ctx.done(@ctx.message("theme.pull.done"))
|
|
39
|
+
rescue ShopifyCli::API::APIRequestNotFoundError
|
|
40
|
+
@ctx.abort(@ctx.message("theme.pull.theme_not_found", theme.id))
|
|
41
|
+
ensure
|
|
42
|
+
syncer.shutdown
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.help
|
|
47
|
+
ShopifyCli::Context.message("theme.pull.help", ShopifyCli::TOOL_NAME, ShopifyCli::TOOL_NAME)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -1,49 +1,75 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
require "shopify-cli/theme/theme"
|
|
3
|
+
require "shopify-cli/theme/development_theme"
|
|
4
|
+
require "shopify-cli/theme/ignore_filter"
|
|
5
|
+
require "shopify-cli/theme/syncer"
|
|
6
6
|
|
|
7
|
+
module Theme
|
|
8
|
+
class Command
|
|
9
|
+
class Push < ShopifyCli::SubCommand
|
|
7
10
|
options do |parser, flags|
|
|
8
|
-
parser.on("--
|
|
9
|
-
parser.on("--
|
|
10
|
-
parser.on("
|
|
11
|
-
parser.on("--
|
|
11
|
+
parser.on("-n", "--nodelete") { flags[:nodelete] = true }
|
|
12
|
+
parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
|
|
13
|
+
parser.on("-d", "--development") { flags[:development] = true }
|
|
14
|
+
parser.on("-u", "--unpublished") { flags[:unpublished] = true }
|
|
15
|
+
parser.on("-j", "--json") { flags[:json] = true }
|
|
16
|
+
parser.on("-a", "--allow-live") { flags[:allow_live] = true }
|
|
17
|
+
parser.on("-p", "--publish") { flags[:publish] = true }
|
|
12
18
|
end
|
|
13
19
|
|
|
14
20
|
def call(args, _name)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
options.flags.delete("remove")
|
|
18
|
-
end
|
|
21
|
+
root = args.first || "."
|
|
22
|
+
delete = !options.flags[:nodelete]
|
|
19
23
|
|
|
20
|
-
if options.flags[:
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
theme = if (theme_id = options.flags[:theme_id])
|
|
25
|
+
ShopifyCli::Theme::Theme.new(@ctx, root: root, id: theme_id)
|
|
26
|
+
elsif options.flags[:development]
|
|
27
|
+
theme = ShopifyCli::Theme::DevelopmentTheme.new(@ctx, root: root)
|
|
28
|
+
theme.ensure_exists!
|
|
29
|
+
theme
|
|
30
|
+
elsif options.flags[:unpublished]
|
|
31
|
+
name = CLI::UI::Prompt.ask(@ctx.message("theme.push.name"), allow_empty: false)
|
|
32
|
+
theme = ShopifyCli::Theme::Theme.new(@ctx, root: root, name: name, role: "unpublished")
|
|
33
|
+
theme.create
|
|
34
|
+
theme
|
|
35
|
+
else
|
|
36
|
+
form = Forms::Select.ask(
|
|
37
|
+
@ctx,
|
|
38
|
+
[],
|
|
39
|
+
title: @ctx.message("theme.push.select"),
|
|
40
|
+
root: root,
|
|
41
|
+
)
|
|
42
|
+
return unless form
|
|
43
|
+
form.theme
|
|
23
44
|
end
|
|
24
45
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
CLI::UI::Frame.open(@ctx.message("theme.push.remove")) do
|
|
29
|
-
unless CLI::UI::Prompt.confirm(@ctx.message("theme.push.remove_confirm"))
|
|
30
|
-
@ctx.abort(@ctx.message("theme.push.remove_abort"))
|
|
31
|
-
end
|
|
46
|
+
if theme.live? && !options.flags[:allow_live]
|
|
47
|
+
return unless CLI::UI::Prompt.confirm(@ctx.message("theme.push.live"))
|
|
48
|
+
end
|
|
32
49
|
|
|
33
|
-
|
|
34
|
-
|
|
50
|
+
ignore_filter = ShopifyCli::Theme::IgnoreFilter.from_path(root)
|
|
51
|
+
syncer = ShopifyCli::Theme::Syncer.new(@ctx, theme: theme, ignore_filter: ignore_filter)
|
|
52
|
+
begin
|
|
53
|
+
syncer.start_threads
|
|
54
|
+
if options.flags[:json]
|
|
55
|
+
syncer.upload_theme!(delete: delete)
|
|
56
|
+
puts(JSON.generate(theme: theme.to_h))
|
|
57
|
+
else
|
|
58
|
+
CLI::UI::Frame.open(@ctx.message("theme.push.info.pushing", theme.name, theme.id, theme.shop)) do
|
|
59
|
+
UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delete: delete)
|
|
35
60
|
end
|
|
36
|
-
end
|
|
37
61
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@ctx.
|
|
62
|
+
if options.flags[:publish]
|
|
63
|
+
theme.publish
|
|
64
|
+
@ctx.done(@ctx.message("theme.publish.done", theme.preview_url))
|
|
65
|
+
else
|
|
66
|
+
@ctx.done(@ctx.message("theme.push.done", theme.preview_url, theme.editor_url))
|
|
43
67
|
end
|
|
44
68
|
end
|
|
45
|
-
|
|
46
|
-
@ctx.
|
|
69
|
+
rescue ShopifyCli::API::APIRequestNotFoundError
|
|
70
|
+
@ctx.abort(@ctx.message("theme.push.theme_not_found", theme.id))
|
|
71
|
+
ensure
|
|
72
|
+
syncer.shutdown
|
|
47
73
|
end
|
|
48
74
|
end
|
|
49
75
|
|
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Commands
|
|
4
|
-
class Serve < ShopifyCli::Command
|
|
5
|
-
prerequisite_task :ensure_themekit_installed
|
|
2
|
+
require "shopify-cli/theme/dev_server"
|
|
6
3
|
|
|
4
|
+
module Theme
|
|
5
|
+
class Command
|
|
6
|
+
class Serve < ShopifyCli::SubCommand
|
|
7
7
|
options do |parser, flags|
|
|
8
|
-
parser.on("--
|
|
9
|
-
parser.on("--allow-live") { flags["allow-live"] = true }
|
|
10
|
-
parser.on("--notify=FILES") { |files| flags["notify"] = files }
|
|
8
|
+
parser.on("--port=PORT") { |port| flags[:port] = port.to_i }
|
|
11
9
|
end
|
|
12
10
|
|
|
13
11
|
def call(*)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
flags = Themekit.add_flags(options.flags)
|
|
20
|
-
|
|
21
|
-
CLI::UI::Frame.open(@ctx.message("theme.serve.serve")) do
|
|
22
|
-
Themekit.serve(@ctx, flags: flags, env: env)
|
|
12
|
+
flags = options.flags.dup
|
|
13
|
+
ShopifyCli::Theme::DevServer.start(@ctx, ".", **flags) do |syncer|
|
|
14
|
+
UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delay_low_priority_files: true)
|
|
23
15
|
end
|
|
24
16
|
end
|
|
25
17
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Theme
|
|
2
|
+
module Forms
|
|
3
|
+
class Select < ShopifyCli::Form
|
|
4
|
+
attr_accessor :theme
|
|
5
|
+
flag_arguments :root, :title, :exclude_roles, :include_foreign_developments
|
|
6
|
+
|
|
7
|
+
def ask
|
|
8
|
+
self.theme = CLI::UI::Prompt.ask(title, allow_empty: false) do |handler|
|
|
9
|
+
themes.each do |theme|
|
|
10
|
+
next if exclude_roles&.include?(theme.role)
|
|
11
|
+
next if !include_foreign_developments && theme.foreign_development?
|
|
12
|
+
handler.option("#{theme.name} #{theme_tags(theme)}") { theme }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def themes
|
|
20
|
+
@themes ||= ShopifyCli::Theme::Theme.all(@ctx, root: root)
|
|
21
|
+
.sort_by { |theme| theme_sort_order(theme) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def theme_sort_order(theme)
|
|
25
|
+
case theme.role
|
|
26
|
+
when "live"
|
|
27
|
+
0
|
|
28
|
+
when "unpublished"
|
|
29
|
+
1
|
|
30
|
+
when "development"
|
|
31
|
+
2
|
|
32
|
+
else
|
|
33
|
+
3
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def theme_tags(theme)
|
|
38
|
+
color = case theme.role
|
|
39
|
+
when "live"
|
|
40
|
+
"green"
|
|
41
|
+
when "unpublished"
|
|
42
|
+
"yellow"
|
|
43
|
+
when "development"
|
|
44
|
+
"blue"
|
|
45
|
+
else
|
|
46
|
+
"grey"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
tags = ["{{#{color}:[#{theme.role}]}}"]
|
|
50
|
+
|
|
51
|
+
if theme.current_development?
|
|
52
|
+
tags << "{{cyan:[yours]}}}}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
tags.join(" ")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -3,143 +3,158 @@ module Theme
|
|
|
3
3
|
module Messages
|
|
4
4
|
MESSAGES = {
|
|
5
5
|
theme: {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
help: <<~HELP,
|
|
7
|
+
Suite of commands for developing Shopify themes. See {{command:%1$s theme <command> --help}} for usage of each command.
|
|
8
|
+
Usage: {{command:%1$s theme [ %2$s ]}}
|
|
9
|
+
HELP
|
|
10
|
+
|
|
11
|
+
init: {
|
|
8
12
|
help: <<~HELP,
|
|
9
|
-
{{command:%s
|
|
10
|
-
|
|
13
|
+
{{command:%s theme init}}: Clones a Git repository to use as a starting point for building a new theme.
|
|
14
|
+
|
|
15
|
+
Usage: {{command:%s theme init [ NAME ]}}
|
|
16
|
+
|
|
11
17
|
Options:
|
|
12
|
-
{{command
|
|
13
|
-
{{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
|
|
14
|
-
{{command:--themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
|
|
18
|
+
{{command:-u, --clone-url=URL}} The Git URL to clone from. Defaults to Shopify's example theme, Dawn: https://github.com/Shopify/dawn.git
|
|
15
19
|
HELP
|
|
16
|
-
|
|
17
|
-
connect: "Downloading theme files...",
|
|
18
|
-
failed: "Couldn't download theme files from store",
|
|
19
|
-
connected: "{{green:%s}} files were downloaded from {{underline:%s}} to {{green:%s}}",
|
|
20
|
+
ask_name: "Theme name",
|
|
20
21
|
},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
duplicate_theme: "Duplicate theme",
|
|
24
|
-
failed: "Couldn't create the theme",
|
|
25
|
-
help: <<~HELP,
|
|
26
|
-
{{command:%s create theme}}: Creates a theme.
|
|
27
|
-
Usage: {{command:%s create theme}}
|
|
28
|
-
Options:
|
|
29
|
-
{{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
|
|
30
|
-
{{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
|
|
31
|
-
{{command:--name=NAME}} Theme name. Any string.
|
|
32
|
-
HELP
|
|
33
|
-
info: {
|
|
34
|
-
created: "{{green:%s}} was created for {{underline:%s}} in {{green:%s}}",
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
deploy: {
|
|
38
|
-
abort: "Theme wasn't deployed",
|
|
39
|
-
confirmation: "This will change your live theme. Do you wish to proceed?",
|
|
22
|
+
publish: {
|
|
23
|
+
confirmation: "This will change your live theme. Do you want to continue?",
|
|
40
24
|
deploying: "Deploying theme",
|
|
41
25
|
error: "Theme couldn't be deployed",
|
|
42
26
|
help: <<~HELP,
|
|
43
|
-
{{command:%s
|
|
44
|
-
Usage: {{command:%s
|
|
27
|
+
{{command:%s theme publish}}: Set a remote theme as the live theme.
|
|
28
|
+
Usage: {{command:%s theme publish [ THEME_ID ]}}
|
|
29
|
+
|
|
30
|
+
Options:
|
|
31
|
+
{{command:-f, --force}} Skip confirmation.
|
|
32
|
+
|
|
33
|
+
Run without arguments to select theme from a list.
|
|
45
34
|
HELP
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
push_fail: "Theme files couldn't be updated",
|
|
35
|
+
done: "Your theme is now live at %s",
|
|
36
|
+
not_found: "Theme #%s does not exist",
|
|
37
|
+
select: "Select theme to push to",
|
|
38
|
+
confirm: "Are you sure you want to make %s the new live theme on %s?",
|
|
51
39
|
},
|
|
52
40
|
forms: {
|
|
53
41
|
ask_password: "Password:",
|
|
54
42
|
ask_store: "Store domain:",
|
|
55
|
-
create: {
|
|
56
|
-
ask_title: "Title:",
|
|
57
|
-
private_app: <<~APP,
|
|
58
|
-
To create a new theme, Shopify App CLI needs to connect with a private app installed on your store. Visit {{underline:%s/admin/apps/private}} to create a new API key and password, or retrieve an existing password.
|
|
59
|
-
If you create a new private app, ensure that it has Read and Write Theme access.
|
|
60
|
-
APP
|
|
61
|
-
},
|
|
62
|
-
connect: {
|
|
63
|
-
private_app: <<~APP,
|
|
64
|
-
To fetch your existing themes, Shopify App CLI needs to connect with your store. Visit {{underline:%s/admin/apps/private}} to create a new API key and password, or retrieve an existing password.
|
|
65
|
-
If you create a new private app, ensure that it has Read and Write Theme access.
|
|
66
|
-
APP
|
|
67
|
-
},
|
|
68
43
|
errors: "%s can't be blank",
|
|
69
44
|
},
|
|
70
|
-
generate: {
|
|
71
|
-
env: {
|
|
72
|
-
ask_password: "Password",
|
|
73
|
-
ask_password_default: "Password (defaults to {{green:%s}})",
|
|
74
|
-
ask_store: "Store",
|
|
75
|
-
ask_store_default: "Store (defaults to {{green:%s}})",
|
|
76
|
-
ask_theme: "Select theme",
|
|
77
|
-
help: <<~HELP,
|
|
78
|
-
Create or update configuration file in the current directory.
|
|
79
|
-
Usage: {{command:%s generate env}}
|
|
80
|
-
Options:
|
|
81
|
-
{{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
|
|
82
|
-
{{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
|
|
83
|
-
{{command:--themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
|
|
84
|
-
HELP
|
|
85
|
-
no_themes: "Please create a new theme using %s create theme",
|
|
86
|
-
},
|
|
87
|
-
help: <<~HELP,
|
|
88
|
-
Generate code in your Theme. Currently supports generating new envs.
|
|
89
|
-
Usage: {{command:%s generate [ env ]}}
|
|
90
|
-
HELP
|
|
91
|
-
},
|
|
92
45
|
push: {
|
|
93
46
|
remove_abort: "Theme files weren't deleted",
|
|
94
|
-
remove_confirm:
|
|
47
|
+
remove_confirm:
|
|
48
|
+
"This will delete the local and remote copies of the theme files, which " \
|
|
49
|
+
"can't be undone. Do you want to continue?",
|
|
95
50
|
error: {
|
|
96
51
|
push_error: "Theme files couldn't be pushed to Shopify",
|
|
97
52
|
remove_error: "Theme files couldn't be removed from Shopify",
|
|
98
53
|
},
|
|
99
54
|
help: <<~HELP,
|
|
100
|
-
{{command:%s push}}: Uploads your local theme files to
|
|
101
|
-
|
|
55
|
+
{{command:%s theme push}}: Uploads your local theme files to the connected store, overwriting the remote version if specified.
|
|
56
|
+
|
|
57
|
+
Usage: {{command:%s theme push [ ROOT ]}}
|
|
58
|
+
|
|
102
59
|
Options:
|
|
103
|
-
{{command
|
|
104
|
-
{{command
|
|
105
|
-
{{command
|
|
60
|
+
{{command:-i, --themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
|
|
61
|
+
{{command:-d, --development}} Push to your remote development theme, and create it if needed.
|
|
62
|
+
{{command:-u, --unpublished}} Create a new unpublished theme and push to it.
|
|
63
|
+
{{command:-n, --nodelete}} Runs the push command without deleting remote files from Shopify.
|
|
64
|
+
{{command:-j, --json}} Output JSON instead of a UI.
|
|
65
|
+
{{command:-a, --allow-live}} Allow push to a live theme.
|
|
66
|
+
{{command:-p, --publish}} Publish as the live theme after uploading.
|
|
67
|
+
|
|
68
|
+
Run without options to select theme from a list.
|
|
106
69
|
HELP
|
|
107
70
|
info: {
|
|
108
|
-
|
|
109
|
-
remove: "Theme files were deleted from {{green:%s}} and Shopify",
|
|
71
|
+
pushing: "Pushing theme files to %s (#%s) on %s",
|
|
110
72
|
},
|
|
111
73
|
push: "Pushing theme files to Shopify",
|
|
112
|
-
|
|
74
|
+
select: "Select theme to push to",
|
|
75
|
+
live: "Are you sure you want to push to your live theme?",
|
|
76
|
+
theme_not_found: "Theme #%s doesn't exist",
|
|
77
|
+
done: <<~DONE,
|
|
78
|
+
{{green:Your theme was pushed successfully}}
|
|
79
|
+
|
|
80
|
+
{{info:View your theme:}}
|
|
81
|
+
{{underline:%s}}
|
|
82
|
+
|
|
83
|
+
{{info:Customize this theme in the Online Store Editor:}}
|
|
84
|
+
{{underline:%s}}
|
|
85
|
+
DONE
|
|
86
|
+
name: "Theme name",
|
|
113
87
|
},
|
|
114
88
|
serve: {
|
|
115
89
|
help: <<~HELP,
|
|
116
|
-
|
|
117
|
-
Usage: {{command:%s serve}}
|
|
90
|
+
Uploads the current theme as a development theme to the connected store, then prints theme editor and preview URLs to your terminal. While running, changes will push to the store in real time.
|
|
91
|
+
Usage: {{command:%s theme serve}}
|
|
118
92
|
HELP
|
|
119
93
|
serve: "Viewing theme...",
|
|
120
94
|
open_fail: "Couldn't open the theme",
|
|
121
95
|
},
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
96
|
+
check: {
|
|
97
|
+
help: <<~HELP,
|
|
98
|
+
Check your theme for errors, suggestions, and best practices.
|
|
99
|
+
Usage: {{command:%s check}}
|
|
100
|
+
HELP
|
|
101
|
+
},
|
|
102
|
+
delete: {
|
|
103
|
+
help: <<~HELP,
|
|
104
|
+
{{command:%s theme delete}}: Delete remote themes from the connected store. This command can't be undone.
|
|
105
|
+
|
|
106
|
+
Usage: {{command:%s theme delete [ THEME_ID [ ... ] ]}}
|
|
107
|
+
|
|
108
|
+
Options:
|
|
109
|
+
{{command:-d, --development}} Delete your development theme.
|
|
110
|
+
{{command:-a, --show-all}} Include others development themes in theme list.
|
|
111
|
+
{{command:-f, --force}} Skip confirmation.
|
|
112
|
+
|
|
113
|
+
Run without options to select the theme to delete from a list.
|
|
114
|
+
HELP
|
|
115
|
+
select: "Select theme to delete",
|
|
116
|
+
done: "%s theme(s) deleted",
|
|
117
|
+
not_found: "{{x}} Theme #%s does not exist",
|
|
118
|
+
live: "{{x}} Theme #%s is your live theme. You can't delete it.",
|
|
119
|
+
confirm: "Are you sure you want to delete %s on %s?",
|
|
137
120
|
},
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
121
|
+
package: {
|
|
122
|
+
help: <<~HELP,
|
|
123
|
+
{{command:%s theme package}}: Package your theme into a .zip file, ready to upload to the Online Store.
|
|
124
|
+
|
|
125
|
+
Usage: {{command:%s theme package [ ROOT ]}}
|
|
126
|
+
HELP
|
|
127
|
+
error: {
|
|
128
|
+
prereq_command_required: "%1$s is required for packaging a theme. Please install %1$s "\
|
|
129
|
+
"using the appropriate package manager for your system.",
|
|
130
|
+
missing_config: "Provide a config/settings_schema.json to package your theme",
|
|
131
|
+
missing_theme_name: "Provide a theme_info.theme_name configuration in config/settings_schema.json",
|
|
142
132
|
},
|
|
133
|
+
done: "Theme packaged in %s",
|
|
134
|
+
},
|
|
135
|
+
language_server: {
|
|
136
|
+
help: <<~HELP,
|
|
137
|
+
{{command:%s theme language-server}}: Start a Language Server Protocol server.
|
|
138
|
+
|
|
139
|
+
Usage: {{command:%s theme language-server}}
|
|
140
|
+
HELP
|
|
141
|
+
},
|
|
142
|
+
pull: {
|
|
143
|
+
help: <<~HELP,
|
|
144
|
+
{{command:%s theme pull}}: Downloads your remote theme files locally.
|
|
145
|
+
|
|
146
|
+
Usage: {{command:%s theme pull [ ROOT ]}}
|
|
147
|
+
|
|
148
|
+
Options:
|
|
149
|
+
{{command:-i, --themeid=THEMEID}} The Theme ID. Must be an existing theme on your store.
|
|
150
|
+
{{command:-n, --nodelete}} Runs the pull command without deleting local files.
|
|
151
|
+
|
|
152
|
+
Run without options to select theme from a list.
|
|
153
|
+
HELP
|
|
154
|
+
select: "Select a theme to pull from",
|
|
155
|
+
pulling: "Pulling theme files from %s (#%s) on %s",
|
|
156
|
+
done: "Theme pulled successfully",
|
|
157
|
+
not_found: "{{x}} Theme #%s doesn't exist",
|
|
143
158
|
},
|
|
144
159
|
},
|
|
145
160
|
}.freeze
|