shopify-cli 1.4.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -2
- data/.github/CONTRIBUTING.md +9 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +3 -2
- data/.github/workflows/release.yml +0 -1
- data/.github/workflows/triage.yml +22 -0
- data/.rubocop.yml +21 -7
- data/.rubocop_todo.yml +2 -15
- data/.travis.yml +1 -1
- data/CHANGELOG.md +28 -0
- data/Gemfile +12 -11
- data/Gemfile.lock +17 -14
- data/README.md +39 -7
- data/RELEASING.md +5 -13
- data/Rakefile +32 -28
- data/bin/load_shopify.rb +6 -6
- data/bin/shopify +2 -2
- data/dev.yml +2 -2
- data/docs/_config.yml +1 -18
- data/docs/app/node/commands/index.md +2 -80
- data/docs/app/node/index.md +2 -33
- data/docs/app/rails/commands/index.md +2 -78
- data/docs/app/rails/index.md +2 -34
- data/docs/core/index.md +2 -84
- data/docs/getting-started/index.md +2 -25
- data/docs/getting-started/install/index.md +1 -118
- data/docs/getting-started/migrate/index.md +2 -94
- data/docs/getting-started/uninstall/index.md +2 -35
- data/docs/getting-started/upgrade/index.md +2 -39
- data/docs/help/start-app/index.md +2 -4
- data/docs/index.md +2 -24
- data/ext/shopify-cli/extconf.rb +7 -7
- data/install.sh +1 -1
- data/lib/docgen/markdown.rb +12 -12
- data/lib/graphql/fetch_specifications.graphql +14 -0
- data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
- data/lib/project_types/extension/cli.rb +54 -47
- data/lib/project_types/extension/commands/build.rb +3 -3
- data/lib/project_types/extension/commands/create.rb +17 -10
- data/lib/project_types/extension/commands/extension_command.rb +12 -5
- data/lib/project_types/extension/commands/push.rb +8 -8
- data/lib/project_types/extension/commands/register.rb +19 -30
- data/lib/project_types/extension/commands/serve.rb +31 -3
- data/lib/project_types/extension/commands/tunnel.rb +12 -12
- data/lib/project_types/extension/extension_project.rb +8 -4
- data/lib/project_types/extension/extension_project_keys.rb +4 -4
- data/lib/project_types/extension/features/argo.rb +117 -0
- data/lib/project_types/extension/features/argo_config.rb +5 -5
- data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
- data/lib/project_types/extension/features/argo_setup.rb +2 -2
- data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
- data/lib/project_types/extension/forms/create.rb +28 -34
- data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
- data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
- data/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
- data/lib/project_types/extension/messages/messages.rb +55 -52
- data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
- data/lib/project_types/extension/models/specification.rb +37 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
- data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
- data/lib/project_types/extension/models/specifications.rb +88 -0
- data/lib/project_types/extension/tasks/configure_features.rb +52 -0
- data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
- data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
- data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
- data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
- data/lib/project_types/extension/tasks/create_extension.rb +4 -4
- data/lib/project_types/extension/tasks/fetch_specifications.rb +18 -0
- data/lib/project_types/extension/tasks/get_app.rb +4 -4
- data/lib/project_types/extension/tasks/get_apps.rb +3 -3
- data/lib/project_types/extension/tasks/update_draft.rb +4 -4
- data/lib/project_types/extension/tasks/user_errors.rb +4 -4
- data/lib/project_types/node/cli.rb +19 -16
- data/lib/project_types/node/commands/connect.rb +15 -0
- data/lib/project_types/node/commands/create.rb +44 -41
- data/lib/project_types/node/commands/deploy.rb +4 -4
- data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
- data/lib/project_types/node/commands/generate.rb +9 -18
- data/lib/project_types/node/commands/open.rb +2 -2
- data/lib/project_types/node/commands/populate.rb +6 -6
- data/lib/project_types/node/commands/populate/customer.rb +5 -5
- data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
- data/lib/project_types/node/commands/populate/product.rb +5 -5
- data/lib/project_types/node/commands/serve.rb +9 -9
- data/lib/project_types/node/commands/tunnel.rb +7 -7
- data/lib/project_types/node/forms/create.rb +17 -8
- data/lib/project_types/node/messages/messages.rb +20 -53
- data/lib/project_types/rails/cli.rb +21 -18
- data/lib/project_types/rails/commands/connect.rb +15 -0
- data/lib/project_types/rails/commands/create.rb +58 -57
- data/lib/project_types/rails/commands/deploy.rb +4 -4
- data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
- data/lib/project_types/rails/commands/generate.rb +7 -7
- data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
- data/lib/project_types/rails/commands/open.rb +2 -2
- data/lib/project_types/rails/commands/populate.rb +6 -6
- data/lib/project_types/rails/commands/populate/customer.rb +5 -5
- data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
- data/lib/project_types/rails/commands/populate/product.rb +5 -5
- data/lib/project_types/rails/commands/serve.rb +11 -11
- data/lib/project_types/rails/commands/tunnel.rb +7 -7
- data/lib/project_types/rails/forms/create.rb +35 -25
- data/lib/project_types/rails/gem.rb +24 -24
- data/lib/project_types/rails/messages/messages.rb +13 -9
- data/lib/project_types/rails/ruby.rb +2 -2
- data/lib/project_types/script/cli.rb +44 -38
- data/lib/project_types/script/commands/create.rb +15 -10
- data/lib/project_types/script/commands/disable.rb +3 -3
- data/lib/project_types/script/commands/enable.rb +19 -9
- data/lib/project_types/script/commands/push.rb +10 -17
- data/lib/project_types/script/config/extension_points.yml +30 -12
- data/lib/project_types/script/errors.rb +22 -0
- data/lib/project_types/script/forms/create.rb +29 -5
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
- data/lib/project_types/script/layers/application/build_script.rb +19 -19
- data/lib/project_types/script/layers/application/create_script.rb +45 -12
- data/lib/project_types/script/layers/application/disable_script.rb +2 -2
- data/lib/project_types/script/layers/application/enable_script.rb +2 -2
- data/lib/project_types/script/layers/application/extension_points.rb +24 -0
- data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
- data/lib/project_types/script/layers/application/push_script.rb +15 -18
- data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
- data/lib/project_types/script/layers/domain/errors.rb +23 -0
- data/lib/project_types/script/layers/domain/extension_point.rb +67 -7
- data/lib/project_types/script/layers/domain/metadata.rb +55 -0
- data/lib/project_types/script/layers/domain/push_package.rb +29 -6
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +45 -55
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +41 -45
- data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +46 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +32 -5
- data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
- data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
- data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
- data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
- data/lib/project_types/script/layers/infrastructure/script_service.rb +39 -17
- data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
- data/lib/project_types/script/messages/messages.rb +76 -10
- data/lib/project_types/script/script_project.rb +26 -16
- data/lib/project_types/script/ui/error_handler.rb +135 -50
- data/lib/project_types/script/ui/printing_spinner.rb +1 -1
- data/lib/project_types/script/ui/strict_spinner.rb +1 -1
- data/lib/project_types/theme/cli.rb +40 -0
- data/lib/project_types/theme/commands/connect.rb +54 -0
- data/lib/project_types/theme/commands/create.rb +48 -0
- data/lib/project_types/theme/commands/deploy.rb +38 -0
- data/lib/project_types/theme/commands/generate.rb +20 -0
- data/lib/project_types/theme/commands/generate/env.rb +79 -0
- data/lib/project_types/theme/commands/push.rb +55 -0
- data/lib/project_types/theme/commands/serve.rb +31 -0
- data/lib/project_types/theme/forms/connect.rb +34 -0
- data/lib/project_types/theme/forms/create.rb +22 -0
- data/lib/project_types/theme/messages/messages.rb +147 -0
- data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
- data/lib/project_types/theme/themekit.rb +113 -0
- data/lib/rubygems_plugin.rb +3 -3
- data/lib/shopify-cli/admin_api.rb +52 -12
- data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
- data/lib/shopify-cli/admin_api/schema.rb +3 -3
- data/lib/shopify-cli/api.rb +36 -31
- data/lib/shopify-cli/command.rb +1 -1
- data/lib/shopify-cli/commands.rb +9 -9
- data/lib/shopify-cli/commands/config.rb +28 -28
- data/lib/shopify-cli/commands/connect.rb +35 -18
- data/lib/shopify-cli/commands/create.rb +5 -5
- data/lib/shopify-cli/commands/help.rb +6 -6
- data/lib/shopify-cli/commands/logout.rb +3 -3
- data/lib/shopify-cli/commands/system.rb +33 -33
- data/lib/shopify-cli/commands/version.rb +2 -2
- data/lib/shopify-cli/context.rb +43 -22
- data/lib/shopify-cli/core.rb +4 -4
- data/lib/shopify-cli/core/entry_point.rb +5 -5
- data/lib/shopify-cli/core/executor.rb +1 -1
- data/lib/shopify-cli/core/help_resolver.rb +2 -2
- data/lib/shopify-cli/core/monorail.rb +17 -16
- data/lib/shopify-cli/db.rb +2 -2
- data/lib/shopify-cli/feature.rb +1 -3
- data/lib/shopify-cli/form.rb +1 -1
- data/lib/shopify-cli/git.rb +17 -17
- data/lib/shopify-cli/helpers.rb +1 -1
- data/lib/shopify-cli/helpers/haikunator.rb +1 -1
- data/lib/shopify-cli/heroku.rb +28 -28
- data/lib/shopify-cli/http_request.rb +21 -9
- data/lib/shopify-cli/js_deps.rb +13 -13
- data/lib/shopify-cli/js_system.rb +5 -5
- data/lib/shopify-cli/lazy_delegator.rb +55 -0
- data/lib/shopify-cli/messages/messages.rb +21 -10
- data/lib/shopify-cli/method_object.rb +104 -0
- data/lib/shopify-cli/oauth.rb +25 -25
- data/lib/shopify-cli/oauth/servlet.rb +9 -9
- data/lib/shopify-cli/options.rb +3 -3
- data/lib/shopify-cli/packager.rb +24 -24
- data/lib/shopify-cli/partners_api.rb +38 -16
- data/lib/shopify-cli/partners_api/organizations.rb +10 -10
- data/lib/shopify-cli/process_supervision.rb +8 -8
- data/lib/shopify-cli/project.rb +27 -23
- data/lib/shopify-cli/project_type.rb +21 -5
- data/lib/shopify-cli/resolve_constant.rb +25 -0
- data/lib/shopify-cli/resources.rb +1 -1
- data/lib/shopify-cli/resources/env_file.rb +9 -9
- data/lib/shopify-cli/result.rb +432 -0
- data/lib/shopify-cli/shopifolk.rb +35 -18
- data/lib/shopify-cli/sub_command.rb +1 -1
- data/lib/shopify-cli/task.rb +9 -1
- data/lib/shopify-cli/tasks.rb +7 -7
- data/lib/shopify-cli/tasks/create_api_client.rb +13 -4
- data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
- data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
- data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +28 -24
- data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
- data/lib/shopify-cli/transform_data_structure.rb +86 -0
- data/lib/shopify-cli/tunnel.rb +36 -30
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +57 -52
- data/shopify-cli.gemspec +6 -6
- data/shopify.fish +1 -1
- data/shopify.sh +1 -1
- data/vendor/deps/cli-kit/REVISION +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
- data/vendor/deps/cli-ui/REVISION +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
- data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
- data/vendor/deps/webrick/.gitignore +9 -0
- data/vendor/deps/webrick/Gemfile +3 -0
- data/vendor/deps/webrick/LICENSE.txt +22 -0
- data/vendor/deps/webrick/README.md +61 -0
- data/vendor/deps/webrick/Rakefile +10 -0
- data/vendor/deps/webrick/lib/webrick.rb +232 -0
- data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
- data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
- data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
- data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
- data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
- data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
- data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
- data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
- data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
- data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
- data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
- data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
- data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
- data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
- data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
- data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
- data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
- data/vendor/deps/webrick/webrick.gemspec +74 -0
- data/vendor/gen/template/bin/update-deps +9 -9
- metadata +83 -29
- data/docs/Gemfile +0 -5
- data/docs/Gemfile.lock +0 -258
- data/docs/_data/nav.yml +0 -35
- data/docs/_includes/footer.html +0 -15
- data/docs/_includes/head.html +0 -19
- data/docs/_includes/sidebar_nav.html +0 -22
- data/docs/_includes/toc.html +0 -112
- data/docs/_layouts/default.html +0 -79
- data/docs/css/docs.css +0 -157
- data/docs/images/header.png +0 -0
- data/docs/installing-ruby.md +0 -28
- data/lib/project_types/extension/features/argo/admin.rb +0 -20
- data/lib/project_types/extension/features/argo/base.rb +0 -129
- data/lib/project_types/extension/features/argo/checkout.rb +0 -20
- data/lib/project_types/extension/forms/register.rb +0 -47
- data/lib/project_types/extension/models/type.rb +0 -81
- data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
- data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
- data/lib/project_types/node/commands/generate/billing.rb +0 -39
- data/lib/project_types/node/commands/generate/page.rb +0 -59
- data/lib/project_types/node/commands/generate/webhook.rb +0 -37
- data/lib/project_types/script/layers/domain/script.rb +0 -18
- data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
- data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
- data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
- data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Theme
|
3
|
+
module Messages
|
4
|
+
MESSAGES = {
|
5
|
+
theme: {
|
6
|
+
connect: {
|
7
|
+
duplicate: "Duplicate directory, theme files weren't connected",
|
8
|
+
help: <<~HELP,
|
9
|
+
{{command:%s connect theme}}: Connects an existing theme in your store to Shopify App CLI. Downloads a copy of the theme files to your local development environment.
|
10
|
+
Usage: {{command:%s connect theme}}
|
11
|
+
Options:
|
12
|
+
{{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
|
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.
|
15
|
+
HELP
|
16
|
+
inside_project: "You are inside an existing theme, theme files weren't connected",
|
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
|
+
},
|
21
|
+
create: {
|
22
|
+
creating_theme: "Creating theme %s",
|
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?",
|
40
|
+
deploying: "Deploying theme",
|
41
|
+
error: "Theme couldn't be deployed",
|
42
|
+
help: <<~HELP,
|
43
|
+
{{command:%s deploy}}: Uploads your local theme files to Shopify, then sets your theme as the live theme.
|
44
|
+
Usage: {{command:%s deploy}}
|
45
|
+
HELP
|
46
|
+
info: {
|
47
|
+
deployed: "Theme was updated and set as the live theme",
|
48
|
+
pushed: "All theme files were updated",
|
49
|
+
},
|
50
|
+
push_fail: "Theme files couldn't be updated",
|
51
|
+
},
|
52
|
+
forms: {
|
53
|
+
ask_password: "Password:",
|
54
|
+
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
|
+
errors: "%s can't be blank",
|
69
|
+
},
|
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
|
+
push: {
|
93
|
+
remove_abort: "Theme files weren't deleted",
|
94
|
+
remove_confirm: "This will delete the local and remote copies of the theme files. Do you wish to proceed?",
|
95
|
+
error: {
|
96
|
+
push_error: "Theme files couldn't be pushed to Shopify",
|
97
|
+
remove_error: "Theme files couldn't be removed from Shopify",
|
98
|
+
},
|
99
|
+
help: <<~HELP,
|
100
|
+
{{command:%s push}}: Uploads your local theme files to Shopify, overwriting the remote versions. If you specify filenames, separated by a space, only those files will be replaced. Otherwise, the whole theme will be replaced.
|
101
|
+
Usage: {{command:%s push}}
|
102
|
+
Options:
|
103
|
+
{{command:--remove}} Deletes both the local and the remote copies of the specified files. At least one filename must be specified.
|
104
|
+
{{command:--allow-live}} Allows Shopify App CLI to replace files on the store's live production theme.
|
105
|
+
{{command:--nodelete}} Runs the push command without deleting remote files from Shopify.
|
106
|
+
HELP
|
107
|
+
info: {
|
108
|
+
push: "Theme files were pushed from {{green:%s}} to Shopify",
|
109
|
+
remove: "Theme files were deleted from {{green:%s}} and Shopify",
|
110
|
+
},
|
111
|
+
push: "Pushing theme files to Shopify",
|
112
|
+
remove: "Deleting theme files",
|
113
|
+
},
|
114
|
+
serve: {
|
115
|
+
help: <<~HELP,
|
116
|
+
Sync your current changes, then view the active store in your default browser. Any theme edits will continue to update in real time. Also prints the active store's URL in your terminal.
|
117
|
+
Usage: {{command:%s serve}}
|
118
|
+
HELP
|
119
|
+
serve: "Viewing theme...",
|
120
|
+
open_fail: "Couldn't open the theme",
|
121
|
+
},
|
122
|
+
tasks: {
|
123
|
+
ensure_themekit_installed: {
|
124
|
+
auto_update: "Would you like to enable auto-updating?",
|
125
|
+
downloading: "Downloading Theme Kit %s",
|
126
|
+
errors: {
|
127
|
+
digest_fail: "Unable to verify download",
|
128
|
+
releases_fail: "Unable to fetch Theme Kit's list of releases",
|
129
|
+
update_fail: "Unable to update Theme Kit",
|
130
|
+
write_fail: "Unable to download Theme Kit",
|
131
|
+
},
|
132
|
+
installing_themekit: "Installing Theme Kit",
|
133
|
+
successful: "Theme Kit installed successfully",
|
134
|
+
updating_themekit: "Updating Theme Kit",
|
135
|
+
verifying: "Verifying download...",
|
136
|
+
},
|
137
|
+
},
|
138
|
+
themekit: {
|
139
|
+
query_themes: {
|
140
|
+
bad_password: "Bad password",
|
141
|
+
not_connect: "Couldn't connect to given shop",
|
142
|
+
},
|
143
|
+
},
|
144
|
+
},
|
145
|
+
}.freeze
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Theme
|
2
|
+
module Tasks
|
3
|
+
class EnsureThemekitInstalled < ShopifyCli::Task
|
4
|
+
URL = "https://shopify-themekit.s3.amazonaws.com/releases/latest.json"
|
5
|
+
OSMAP = {
|
6
|
+
mac: "darwin-amd64",
|
7
|
+
linux: "linux-amd64",
|
8
|
+
windows: "windows-amd64",
|
9
|
+
}
|
10
|
+
VERSION_CHECK_INTERVAL = 604800
|
11
|
+
VERSION_CHECK_SECTION = "themekit_version_check"
|
12
|
+
LAST_CHECKED_AT_FIELD = "last_checked_at"
|
13
|
+
|
14
|
+
def call(ctx)
|
15
|
+
_out, stat = ctx.capture2e(Themekit::THEMEKIT)
|
16
|
+
unless stat.success?
|
17
|
+
CLI::UI::Frame.open(ctx.message("theme.tasks.ensure_themekit_installed.installing_themekit")) do
|
18
|
+
install_themekit(ctx)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
now = Time.now.to_i
|
23
|
+
if ShopifyCli::Feature.enabled?(:themekit_auto_update) && (time_of_last_check + VERSION_CHECK_INTERVAL) < now
|
24
|
+
CLI::UI::Frame.open(ctx.message("theme.tasks.ensure_themekit_installed.updating_themekit")) do
|
25
|
+
unless Themekit.update(ctx)
|
26
|
+
ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.update_fail"))
|
27
|
+
end
|
28
|
+
update_time_of_last_check(now)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def install_themekit(ctx)
|
36
|
+
require "json"
|
37
|
+
require "fileutils"
|
38
|
+
require "digest"
|
39
|
+
require "open-uri"
|
40
|
+
|
41
|
+
begin
|
42
|
+
begin
|
43
|
+
releases = JSON.parse(Net::HTTP.get(URI(URL)))
|
44
|
+
release = releases["platforms"].find { |r| r["name"] == OSMAP[ctx.os] }
|
45
|
+
rescue
|
46
|
+
ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.releases_fail"))
|
47
|
+
end
|
48
|
+
|
49
|
+
ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.downloading", releases["version"]))
|
50
|
+
_out, stat = ctx.capture2e("curl", "-o", Themekit::THEMEKIT, release["url"])
|
51
|
+
ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.write_fail")) unless stat.success?
|
52
|
+
|
53
|
+
ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.verifying"))
|
54
|
+
if Digest::MD5.file(Themekit::THEMEKIT) == release["digest"]
|
55
|
+
FileUtils.chmod("+x", Themekit::THEMEKIT)
|
56
|
+
ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.successful"))
|
57
|
+
|
58
|
+
auto = CLI::UI.confirm(ctx.message("theme.tasks.ensure_themekit_installed.auto_update"))
|
59
|
+
ShopifyCli::Feature.set(:themekit_auto_update, auto)
|
60
|
+
else
|
61
|
+
ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.digest_fail"))
|
62
|
+
end
|
63
|
+
rescue StandardError, ShopifyCli::Abort => e
|
64
|
+
FileUtils.rm(Themekit::THEMEKIT) if File.exist?(Themekit::THEMEKIT)
|
65
|
+
raise e
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def time_of_last_check
|
70
|
+
(val = ShopifyCli::Config.get(VERSION_CHECK_SECTION, LAST_CHECKED_AT_FIELD)) ? val.to_i : 0
|
71
|
+
end
|
72
|
+
|
73
|
+
def update_time_of_last_check(time)
|
74
|
+
ShopifyCli::Config.set(VERSION_CHECK_SECTION, LAST_CHECKED_AT_FIELD, time)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Theme
|
2
|
+
class Themekit
|
3
|
+
THEMEKIT = File.join(ShopifyCli.cache_dir, "themekit")
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def add_flags(flags)
|
7
|
+
flags.map do |key, value|
|
8
|
+
flag = "--#{key}"
|
9
|
+
flag += "=#{value}" if value.is_a?(String)
|
10
|
+
flag
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def connect(ctx, store:, password:, themeid:, env:)
|
15
|
+
command = build_command("get", env)
|
16
|
+
command << "--password=#{password}"
|
17
|
+
command << "--store=#{store}"
|
18
|
+
command << "--themeid=#{themeid}"
|
19
|
+
|
20
|
+
stat = ctx.system(*command)
|
21
|
+
stat.success?
|
22
|
+
end
|
23
|
+
|
24
|
+
def create(ctx, password:, store:, name:, env:)
|
25
|
+
command = build_command("new", env)
|
26
|
+
command << "--password=#{password}"
|
27
|
+
command << "--store=#{store}"
|
28
|
+
command << "--name=#{name}"
|
29
|
+
|
30
|
+
stat = ctx.system(*command)
|
31
|
+
stat.success?
|
32
|
+
end
|
33
|
+
|
34
|
+
def deploy(ctx, flags: nil, env:)
|
35
|
+
unless push(ctx, flags: flags, env: env)
|
36
|
+
ctx.abort(ctx.message("theme.deploy.push_fail"))
|
37
|
+
end
|
38
|
+
ctx.done(ctx.message("theme.deploy.info.pushed"))
|
39
|
+
|
40
|
+
command = build_command("publish", env)
|
41
|
+
(command << flags).compact!
|
42
|
+
command.flatten!
|
43
|
+
|
44
|
+
stat = ctx.system(*command)
|
45
|
+
stat.success?
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_env(ctx, store:, password:, themeid:, env:)
|
49
|
+
command = build_command("configure", env)
|
50
|
+
command << "--password=#{password}"
|
51
|
+
command << "--store=#{store}"
|
52
|
+
command << "--themeid=#{themeid}"
|
53
|
+
|
54
|
+
stat = ctx.system(*command)
|
55
|
+
stat.success?
|
56
|
+
end
|
57
|
+
|
58
|
+
def push(ctx, files: nil, flags: nil, remove: false, env:)
|
59
|
+
action = remove ? "remove" : "deploy"
|
60
|
+
command = build_command(action, env)
|
61
|
+
|
62
|
+
(command << files << flags).compact!
|
63
|
+
command.flatten!
|
64
|
+
|
65
|
+
stat = ctx.system(*command)
|
66
|
+
stat.success?
|
67
|
+
end
|
68
|
+
|
69
|
+
def query_themes(ctx, store:, password:)
|
70
|
+
begin
|
71
|
+
resp = ::ShopifyCli::AdminAPI.rest_request(
|
72
|
+
ctx,
|
73
|
+
shop: store,
|
74
|
+
token: password,
|
75
|
+
path: "themes.json",
|
76
|
+
)
|
77
|
+
rescue ShopifyCli::API::APIRequestUnauthorizedError
|
78
|
+
ctx.abort(ctx.message("theme.themekit.query_themes.bad_password"))
|
79
|
+
rescue StandardError
|
80
|
+
ctx.abort(ctx.message("theme.themekit.query_themes.not_connect"))
|
81
|
+
end
|
82
|
+
|
83
|
+
resp[1]["themes"].map { |theme| [theme["name"], theme["id"]] }.to_h
|
84
|
+
end
|
85
|
+
|
86
|
+
def serve(ctx, flags: nil, env:)
|
87
|
+
command = build_command("open", env)
|
88
|
+
out, stat = ctx.capture2e(*command)
|
89
|
+
ctx.puts(out)
|
90
|
+
ctx.abort(ctx.message("theme.serve.open_fail")) unless stat.success?
|
91
|
+
|
92
|
+
command = build_command("watch", env)
|
93
|
+
(command << flags).compact!
|
94
|
+
command.flatten!
|
95
|
+
ctx.system(*command)
|
96
|
+
end
|
97
|
+
|
98
|
+
def update(ctx)
|
99
|
+
command = build_command("update")
|
100
|
+
ctx.system(*command)
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def build_command(action, env = nil)
|
106
|
+
command = [THEMEKIT, action]
|
107
|
+
command << "--no-update-notifier"
|
108
|
+
command << "--env=#{env}" if env
|
109
|
+
command
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/rubygems_plugin.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
Gem.post_uninstall do |uninstaller|
|
2
|
-
if uninstaller.spec.name ==
|
2
|
+
if uninstaller.spec.name == "shopify-cli"
|
3
3
|
if RUBY_PLATFORM.match(/mingw32/)
|
4
4
|
bat_path = File.dirname(RbConfig.ruby)
|
5
5
|
bat = "#{bat_path}\\shopify.bat"
|
@@ -7,9 +7,9 @@ Gem.post_uninstall do |uninstaller|
|
|
7
7
|
# delete the auto-generated batch script
|
8
8
|
File.unlink(bat)
|
9
9
|
else
|
10
|
-
require
|
10
|
+
require "fileutils"
|
11
11
|
|
12
|
-
symlink =
|
12
|
+
symlink = "/usr/local/bin/shopify"
|
13
13
|
|
14
14
|
# delete the symbolic link IFF it exists AND it does not point to a file
|
15
15
|
# (i.e., it's been left hanging as a result of the uninstall, as expected)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "shopify_cli"
|
2
2
|
|
3
3
|
module ShopifyCli
|
4
4
|
##
|
@@ -6,8 +6,8 @@ module ShopifyCli
|
|
6
6
|
# these concerns are taken care of.
|
7
7
|
#
|
8
8
|
class AdminAPI < API
|
9
|
-
autoload :PopulateResourceCommand,
|
10
|
-
autoload :Schema,
|
9
|
+
autoload :PopulateResourceCommand, "shopify-cli/admin_api/populate_resource_command"
|
10
|
+
autoload :Schema, "shopify-cli/admin_api/schema"
|
11
11
|
|
12
12
|
class << self
|
13
13
|
##
|
@@ -43,6 +43,46 @@ module ShopifyCli
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
##
|
47
|
+
#
|
48
|
+
#
|
49
|
+
#
|
50
|
+
# #### Parameters
|
51
|
+
# - `ctx`: running context from your command
|
52
|
+
# - `shop`: shop domain string for shop whose admin you are calling
|
53
|
+
# - `path`: path string (excluding prefixes and API version) for specific JSON that you are requesting
|
54
|
+
# ex. "data.json" instead of "/admin/api/unstable/data.json"
|
55
|
+
# - `body`: data string for corresponding REST request types
|
56
|
+
# - `method`: REST request string for the type of request; if nil, will perform GET request
|
57
|
+
# - `api_version`: API version string to specify version; if nil, latest will be used
|
58
|
+
# - `token`: shop password string for authentication to shop
|
59
|
+
#
|
60
|
+
# #### Raises
|
61
|
+
#
|
62
|
+
# * http 404 will raise a ShopifyCli::API::APIRequestNotFoundError
|
63
|
+
# * http 400..499 will raise a ShopifyCli::API::APIRequestClientError
|
64
|
+
# * http 500..599 will raise a ShopifyCli::API::APIRequestServerError
|
65
|
+
# * All other codes will raise ShopifyCli::API::APIRequestUnexpectedError
|
66
|
+
#
|
67
|
+
# #### Returns
|
68
|
+
#
|
69
|
+
# * `resp` - JSON response array
|
70
|
+
#
|
71
|
+
# #### Example
|
72
|
+
#
|
73
|
+
# ShopifyCli::AdminAPI.rest_request(@ctx,
|
74
|
+
# shop: 'shop.myshopify.com',
|
75
|
+
# path: 'data.json',
|
76
|
+
# token: 'password')
|
77
|
+
#
|
78
|
+
def rest_request(ctx, shop:, path:, body: nil, method: "GET", api_version: nil, token: nil)
|
79
|
+
ShopifyCli::DB.set(admin_access_token: token) unless token.nil?
|
80
|
+
url = URI::HTTPS.build(host: shop, path: "/admin/api/#{fetch_api_version(ctx, api_version, shop)}/#{path}")
|
81
|
+
resp = api_client(ctx, api_version, shop, path: path).request(url: url.to_s, body: body, method: method)
|
82
|
+
ShopifyCli::DB.set(admin_access_token: nil) unless token.nil?
|
83
|
+
resp
|
84
|
+
end
|
85
|
+
|
46
86
|
private
|
47
87
|
|
48
88
|
def authenticated_req(ctx, shop)
|
@@ -56,21 +96,21 @@ module ShopifyCli
|
|
56
96
|
env = Project.current.env
|
57
97
|
ShopifyCli::OAuth.new(
|
58
98
|
ctx: ctx,
|
59
|
-
service:
|
99
|
+
service: "admin",
|
60
100
|
client_id: env.api_key,
|
61
101
|
secret: env.secret,
|
62
102
|
scopes: env.scopes,
|
63
103
|
token_path: "/access_token",
|
64
|
-
options: {
|
104
|
+
options: { "grant_options[]" => "per user" },
|
65
105
|
).authenticate("https://#{shop}/admin/oauth")
|
66
106
|
end
|
67
107
|
|
68
|
-
def api_client(ctx, api_version, shop)
|
108
|
+
def api_client(ctx, api_version, shop, path: "graphql.json")
|
69
109
|
new(
|
70
110
|
ctx: ctx,
|
71
|
-
auth_header:
|
111
|
+
auth_header: "X-Shopify-Access-Token",
|
72
112
|
token: admin_access_token(ctx, shop),
|
73
|
-
url: "https://#{shop}/admin/api/#{fetch_api_version(ctx, api_version, shop)}
|
113
|
+
url: "https://#{shop}/admin/api/#{fetch_api_version(ctx, api_version, shop)}/#{path}",
|
74
114
|
)
|
75
115
|
end
|
76
116
|
|
@@ -85,13 +125,13 @@ module ShopifyCli
|
|
85
125
|
return api_version unless api_version.nil?
|
86
126
|
client = new(
|
87
127
|
ctx: ctx,
|
88
|
-
auth_header:
|
128
|
+
auth_header: "X-Shopify-Access-Token",
|
89
129
|
token: admin_access_token(ctx, shop),
|
90
130
|
url: "https://#{shop}/admin/api/unstable/graphql.json",
|
91
131
|
)
|
92
|
-
versions = client.query(
|
93
|
-
latest = versions.find { |version| version[
|
94
|
-
latest[
|
132
|
+
versions = client.query("api_versions")["data"]["publicApiVersions"]
|
133
|
+
latest = versions.find { |version| version["displayName"].include?("Latest") }
|
134
|
+
latest["handle"]
|
95
135
|
end
|
96
136
|
end
|
97
137
|
end
|