shopify-cli 2.0.1 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/Gemfile.lock +4 -4
- data/README.md +3 -1
- data/THEMEKIT_MIGRATION.md +18 -0
- data/lib/graphql/api_versions.graphql +1 -1
- data/lib/graphql/get_variant_id.graphql +16 -0
- data/lib/project_types/extension/cli.rb +10 -1
- data/lib/project_types/extension/commands/check.rb +44 -0
- data/lib/project_types/extension/commands/push.rb +0 -1
- data/lib/project_types/extension/commands/serve.rb +8 -2
- data/lib/project_types/extension/extension_project.rb +39 -1
- data/lib/project_types/extension/extension_project_keys.rb +1 -0
- data/lib/project_types/extension/features/argo.rb +1 -11
- data/lib/project_types/extension/features/argo_runtime.rb +6 -38
- data/lib/project_types/extension/features/argo_serve.rb +30 -1
- data/lib/project_types/extension/features/runtimes/admin.rb +29 -0
- data/lib/project_types/extension/features/runtimes/base.rb +19 -0
- data/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +23 -0
- data/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +29 -0
- data/lib/project_types/extension/messages/messages.rb +19 -6
- data/lib/project_types/extension/models/product.rb +12 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +10 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +10 -2
- data/lib/project_types/extension/models/specification_handlers/default.rb +13 -4
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +12 -0
- data/lib/project_types/extension/tasks/configure_features.rb +1 -0
- data/lib/project_types/extension/tasks/converters/product_converter.rb +21 -0
- data/lib/project_types/extension/tasks/get_product.rb +22 -0
- data/lib/project_types/node/messages/messages.rb +1 -1
- data/lib/project_types/rails/messages/messages.rb +18 -18
- data/lib/project_types/script/commands/create.rb +1 -1
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +3 -3
- data/lib/project_types/theme/forms/select.rb +1 -1
- data/lib/project_types/theme/messages/messages.rb +3 -3
- data/lib/shopify-cli/admin_api.rb +6 -2
- data/lib/shopify-cli/api.rb +2 -2
- data/lib/shopify-cli/core/monorail.rb +8 -3
- data/lib/shopify-cli/messages/messages.rb +9 -8
- data/lib/shopify-cli/packager.rb +5 -5
- data/lib/shopify-cli/theme/dev_server.rb +1 -1
- data/lib/shopify-cli/theme/dev_server/local_assets.rb +1 -1
- data/lib/shopify-cli/theme/file.rb +2 -2
- data/lib/shopify-cli/theme/syncer.rb +9 -5
- data/lib/shopify-cli/theme/theme.rb +5 -5
- data/lib/shopify-cli/tunnel.rb +1 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/shopify-cli.gemspec +1 -1
- metadata +14 -4
@@ -0,0 +1,29 @@
|
|
1
|
+
module Extension
|
2
|
+
module Features
|
3
|
+
module Runtimes
|
4
|
+
class Admin < Base
|
5
|
+
ADMIN_UI_EXTENSIONS_RUN = "@shopify/admin-ui-extensions-run"
|
6
|
+
PRODUCT_SUBSCRIPTION = "PRODUCT_SUBSCRIPTION"
|
7
|
+
|
8
|
+
AVAILABLE_FLAGS = [
|
9
|
+
:api_key,
|
10
|
+
:name,
|
11
|
+
:port,
|
12
|
+
:public_url,
|
13
|
+
:renderer_version,
|
14
|
+
:resource_url,
|
15
|
+
:shop,
|
16
|
+
:uuid,
|
17
|
+
]
|
18
|
+
|
19
|
+
def available_flags
|
20
|
+
AVAILABLE_FLAGS
|
21
|
+
end
|
22
|
+
|
23
|
+
def active_runtime?(cli_package, identifier)
|
24
|
+
cli_package.name == ADMIN_UI_EXTENSIONS_RUN && identifier == PRODUCT_SUBSCRIPTION
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Extension
|
2
|
+
module Features
|
3
|
+
module Runtimes
|
4
|
+
class Base
|
5
|
+
def available_flags
|
6
|
+
[]
|
7
|
+
end
|
8
|
+
|
9
|
+
def supports?(flag)
|
10
|
+
available_flags.include?(flag)
|
11
|
+
end
|
12
|
+
|
13
|
+
def active_runtime?(cli_package, identifier)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Extension
|
2
|
+
module Features
|
3
|
+
module Runtimes
|
4
|
+
class CheckoutPostPurchase < Base
|
5
|
+
CHECKOUT_UI_EXTENSIONS_RUN = "@shopify/checkout-ui-extensions-run"
|
6
|
+
CHECKOUT_POST_PURCHASE = "CHECKOUT_POST_PURCHASE"
|
7
|
+
|
8
|
+
AVAILABLE_FLAGS = [
|
9
|
+
:port,
|
10
|
+
:public_url,
|
11
|
+
]
|
12
|
+
|
13
|
+
def available_flags
|
14
|
+
AVAILABLE_FLAGS
|
15
|
+
end
|
16
|
+
|
17
|
+
def active_runtime?(cli_package, identifier)
|
18
|
+
cli_package.name == CHECKOUT_UI_EXTENSIONS_RUN && identifier == CHECKOUT_POST_PURCHASE
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Extension
|
2
|
+
module Features
|
3
|
+
module Runtimes
|
4
|
+
class CheckoutUiExtension < Base
|
5
|
+
CHECKOUT_UI_EXTENSIONS_RUN = "@shopify/checkout-ui-extensions-run"
|
6
|
+
|
7
|
+
IDENTIFIERS = [
|
8
|
+
"CHECKOUT_ARGO_EXTENSION",
|
9
|
+
"CHECKOUT_UI_EXTENSION",
|
10
|
+
]
|
11
|
+
|
12
|
+
AVAILABLE_FLAGS = [
|
13
|
+
:port,
|
14
|
+
:public_url,
|
15
|
+
:resource_url,
|
16
|
+
:shop,
|
17
|
+
]
|
18
|
+
|
19
|
+
def available_flags
|
20
|
+
AVAILABLE_FLAGS
|
21
|
+
end
|
22
|
+
|
23
|
+
def active_runtime?(cli_package, identifier)
|
24
|
+
cli_package.name == CHECKOUT_UI_EXTENSIONS_RUN && IDENTIFIERS.include?(identifier)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -43,7 +43,7 @@ module Extension
|
|
43
43
|
no_apps: "{{x}} You don’t have any apps.",
|
44
44
|
learn_about_apps: "{{*}} Learn more about building apps at <https://shopify.dev/concepts/apps>, " \
|
45
45
|
"or try creating a new app using {{command:shopify [node|rails] create}}.",
|
46
|
-
loading_apps: "Loading your apps
|
46
|
+
loading_apps: "Loading your apps…",
|
47
47
|
no_available_extensions: "{{x}} There are no available extensions for this app.",
|
48
48
|
},
|
49
49
|
connect: {
|
@@ -51,7 +51,7 @@ module Extension
|
|
51
51
|
incomplete_configuration: "Cannot connect extension due to missing configuration information",
|
52
52
|
invalid_api_key: "The API key %s does not match any of your apps.",
|
53
53
|
ask_registration: "Which extension would you like to connect to?",
|
54
|
-
loading_extensions: "Loading your extensions
|
54
|
+
loading_extensions: "Loading your extensions…",
|
55
55
|
no_extensions: "{{x}} You don't have any extensions of type %s",
|
56
56
|
learn_about_extensions: "{{*}} Learn more about building extensions at <https://shopify.dev/concepts/apps>, " \
|
57
57
|
"or try creating a new extension using {{command:shopify extension create}}.",
|
@@ -65,7 +65,7 @@ module Extension
|
|
65
65
|
Build your extension to prepare for deployment.
|
66
66
|
Usage: {{command:%s extension build}}
|
67
67
|
HELP
|
68
|
-
frame_title: "Building extension with: %s
|
68
|
+
frame_title: "Building extension with: %s…",
|
69
69
|
build_failure_message: "Failed to build extension code.",
|
70
70
|
},
|
71
71
|
register: {
|
@@ -76,7 +76,7 @@ module Extension
|
|
76
76
|
{{command:--api-key=API_KEY}} The API key used to register an app with the extension. This can be found on the app page on Partners Dashboard.
|
77
77
|
HELP
|
78
78
|
frame_title: "Registering Extension",
|
79
|
-
waiting_text: "Registering with Shopify
|
79
|
+
waiting_text: "Registering with Shopify…",
|
80
80
|
already_registered: "Extension is already registered.",
|
81
81
|
confirm_info: "This will create a new extension registration for %s, which can’t be undone.",
|
82
82
|
confirm_question: "Would you like to register this extension? (y/n)",
|
@@ -90,7 +90,7 @@ module Extension
|
|
90
90
|
Usage: {{command:%s extension push}}
|
91
91
|
HELP
|
92
92
|
frame_title: "Pushing your extension to Shopify",
|
93
|
-
waiting_text: "Pushing code to Shopify
|
93
|
+
waiting_text: "Pushing code to Shopify…",
|
94
94
|
pushed_with_errors: "{{x}} Code pushed to Shopify with errors on %s.",
|
95
95
|
push_with_errors_info: "{{*}} Fix these errors and run {{command:shopify extension push}} to " \
|
96
96
|
"revalidate your extension.",
|
@@ -104,7 +104,7 @@ module Extension
|
|
104
104
|
Options:
|
105
105
|
{{command:--tunnel=TUNNEL}} Establish an ngrok tunnel (default: false)
|
106
106
|
HELP
|
107
|
-
frame_title: "Serving extension
|
107
|
+
frame_title: "Serving extension…",
|
108
108
|
no_available_ports_found: "No available ports found to run extension.",
|
109
109
|
serve_failure_message: "Failed to run extension code.",
|
110
110
|
serve_missing_information: "Missing shop or api_key.",
|
@@ -139,6 +139,10 @@ module Extension
|
|
139
139
|
Usage: {{command:%1$s extension tunnel status}}
|
140
140
|
HELP
|
141
141
|
},
|
142
|
+
check: {
|
143
|
+
help: "Check your extension for errors, suggestions, and best practices.",
|
144
|
+
unsupported: "{{red:%s projects are not supported for `extension check`}}",
|
145
|
+
},
|
142
146
|
features: {
|
143
147
|
argo: {
|
144
148
|
missing_file_error: "Could not find built extension file.",
|
@@ -162,12 +166,18 @@ module Extension
|
|
162
166
|
tasks: {
|
163
167
|
errors: {
|
164
168
|
parse_error: "Unable to parse response from Partners Dashboard.",
|
169
|
+
store_error: "There was an error getting store data. Try again later.",
|
165
170
|
},
|
166
171
|
},
|
167
172
|
errors: {
|
168
173
|
unknown_type: "Unknown extension type %s",
|
169
174
|
package_not_found: "`%s` package not found.",
|
170
175
|
},
|
176
|
+
warnings: {
|
177
|
+
resource_url_auto_generation_failed: "{{*}} {{yellow:Warning:}} Unable to auto generate " \
|
178
|
+
"the extension resource URL because %s does not have any products. " \
|
179
|
+
"Please run {{bold:shopify populate products}} to generate sample products.",
|
180
|
+
},
|
171
181
|
}
|
172
182
|
|
173
183
|
TYPES = {
|
@@ -196,6 +206,9 @@ module Extension
|
|
196
206
|
{{*}} You’re ready to start building {{green:%s}}!
|
197
207
|
MESSAGE
|
198
208
|
},
|
209
|
+
serve: {
|
210
|
+
unsupported: "shopify extension serve is not supported for theme app extensions",
|
211
|
+
},
|
199
212
|
},
|
200
213
|
},
|
201
214
|
}
|
@@ -6,6 +6,7 @@ module Extension
|
|
6
6
|
module SpecificationHandlers
|
7
7
|
class CheckoutPostPurchase < Default
|
8
8
|
PERMITTED_CONFIG_KEYS = [:metafields]
|
9
|
+
RENDERER_PACKAGE_NAME = "@shopify/post-purchase-ui-extensions"
|
9
10
|
|
10
11
|
def config(context)
|
11
12
|
{
|
@@ -13,6 +14,15 @@ module Extension
|
|
13
14
|
**argo.config(context),
|
14
15
|
}
|
15
16
|
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def argo
|
21
|
+
Features::Argo.new(
|
22
|
+
git_template: specification.features.argo.git_template,
|
23
|
+
renderer_package_name: RENDERER_PACKAGE_NAME
|
24
|
+
)
|
25
|
+
end
|
16
26
|
end
|
17
27
|
end
|
18
28
|
end
|
@@ -12,9 +12,17 @@ module Extension
|
|
12
12
|
**argo.config(context),
|
13
13
|
}
|
14
14
|
end
|
15
|
-
end
|
16
15
|
|
17
|
-
|
16
|
+
def supplies_resource_url?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def build_resource_url(context:, shop:)
|
21
|
+
product = Tasks::GetProduct.call(context, shop)
|
22
|
+
return unless product
|
23
|
+
format("/cart/%<variant_id>d:%<quantity>d", variant_id: product.variant_id, quantity: 1)
|
24
|
+
end
|
25
|
+
end
|
18
26
|
end
|
19
27
|
end
|
20
28
|
end
|
@@ -50,13 +50,14 @@ module Extension
|
|
50
50
|
argo_runtime(context).supports?(:public_url)
|
51
51
|
end
|
52
52
|
|
53
|
-
def serve(context:, port:, tunnel_url:)
|
53
|
+
def serve(context:, port:, tunnel_url:, resource_url:)
|
54
54
|
Features::ArgoServe.new(
|
55
55
|
specification_handler: self,
|
56
56
|
argo_runtime: argo_runtime(context),
|
57
57
|
context: context,
|
58
58
|
port: port,
|
59
59
|
tunnel_url: tunnel_url,
|
60
|
+
resource_url: resource_url
|
60
61
|
).call
|
61
62
|
end
|
62
63
|
|
@@ -65,9 +66,9 @@ module Extension
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def argo_runtime(context)
|
68
|
-
@argo_runtime ||= Features::ArgoRuntime.
|
69
|
-
|
70
|
-
|
69
|
+
@argo_runtime ||= Features::ArgoRuntime.find(
|
70
|
+
cli_package: cli_package(context),
|
71
|
+
identifier: identifier
|
71
72
|
)
|
72
73
|
end
|
73
74
|
|
@@ -90,6 +91,14 @@ module Extension
|
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
94
|
+
def supplies_resource_url?
|
95
|
+
false
|
96
|
+
end
|
97
|
+
|
98
|
+
def build_resource_url(shop)
|
99
|
+
raise NotImplementedError
|
100
|
+
end
|
101
|
+
|
93
102
|
protected
|
94
103
|
|
95
104
|
def argo
|
@@ -60,6 +60,18 @@ module Extension
|
|
60
60
|
"Theme App Extension"
|
61
61
|
end
|
62
62
|
|
63
|
+
def choose_port?(ctx)
|
64
|
+
ctx.abort(ctx.message("serve.unsupported"))
|
65
|
+
end
|
66
|
+
|
67
|
+
def establish_tunnel?(ctx)
|
68
|
+
ctx.abort(ctx.message("serve.unsupported"))
|
69
|
+
end
|
70
|
+
|
71
|
+
def serve(ctx)
|
72
|
+
ctx.abort(ctx.message("serve.unsupported"))
|
73
|
+
end
|
74
|
+
|
63
75
|
private
|
64
76
|
|
65
77
|
def validate(filename)
|
@@ -46,6 +46,7 @@ module Extension
|
|
46
46
|
checkout: {
|
47
47
|
git_template: "https://github.com/Shopify/checkout-ui-extensions-template",
|
48
48
|
renderer_package_name: "@shopify/checkout-ui-extensions",
|
49
|
+
required_fields: [:shop],
|
49
50
|
cli_package_name: "@shopify/checkout-ui-extensions-run",
|
50
51
|
},
|
51
52
|
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
module Converters
|
7
|
+
module ProductConverter
|
8
|
+
VARIANT_PATH = ["data", "products", "edges", 0, "node", "variants", "edges", 0, "node", "id"]
|
9
|
+
|
10
|
+
def self.from_hash(hash)
|
11
|
+
return nil if hash.nil?
|
12
|
+
variant = hash.dig(*VARIANT_PATH)
|
13
|
+
return unless variant
|
14
|
+
Models::Product.new(
|
15
|
+
variant_id: ShopifyCli::API.gid_to_id(variant)
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
class GetProduct < ShopifyCli::Task
|
7
|
+
API_VERSION = "2021-07"
|
8
|
+
GRAPHQL_FILE = "get_variant_id"
|
9
|
+
|
10
|
+
def call(context, shop)
|
11
|
+
response = ShopifyCli::AdminAPI.query(
|
12
|
+
context,
|
13
|
+
GRAPHQL_FILE,
|
14
|
+
shop: shop,
|
15
|
+
api_version: API_VERSION
|
16
|
+
)
|
17
|
+
context.abort(context.message("tasks.errors.store_error")) if response.nil?
|
18
|
+
Converters::ProductConverter.from_hash(response)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -17,7 +17,7 @@ module Rails
|
|
17
17
|
checking_installation_path: "Checking path %s for gem %s",
|
18
18
|
installed: "Installed %s gem",
|
19
19
|
installed_debug: "%s installed: %s",
|
20
|
-
installing: "Installing %s gem
|
20
|
+
installing: "Installing %s gem…",
|
21
21
|
setting_gem_home: "GEM_HOME being set to %s",
|
22
22
|
setting_gem_path: "GEM_PATH being set to %s",
|
23
23
|
},
|
@@ -62,15 +62,15 @@ module Rails
|
|
62
62
|
open_new_shell: "{{*}} {{yellow:After installing %s, please open a new Command Prompt or PowerShell " \
|
63
63
|
"window to continue.}}",
|
64
64
|
},
|
65
|
-
installing_bundler: "Installing bundler
|
66
|
-
generating_app: "Generating new rails app project in %s
|
67
|
-
adding_shopify_gem: "{{v}} Adding shopify_app gem
|
65
|
+
installing_bundler: "Installing bundler…",
|
66
|
+
generating_app: "Generating new rails app project in %s…",
|
67
|
+
adding_shopify_gem: "{{v}} Adding shopify_app gem…",
|
68
68
|
node_version: "node %s",
|
69
69
|
yarn_version: "yarn %s",
|
70
|
-
running_bundle_install: "Running bundle install
|
71
|
-
running_generator: "Running shopify_app generator
|
72
|
-
running_migrations: "Running migrations
|
73
|
-
running_webpacker_install: "Running webpacker:install
|
70
|
+
running_bundle_install: "Running bundle install…",
|
71
|
+
running_generator: "Running shopify_app generator…",
|
72
|
+
running_migrations: "Running migrations…",
|
73
|
+
running_webpacker_install: "Running webpacker:install…",
|
74
74
|
},
|
75
75
|
|
76
76
|
deploy: {
|
@@ -89,18 +89,18 @@ module Rails
|
|
89
89
|
Deploy the current Rails project to Heroku
|
90
90
|
Usage: {{command:%s rails deploy heroku}}
|
91
91
|
HELP
|
92
|
-
downloading: "Downloading Heroku CLI
|
92
|
+
downloading: "Downloading Heroku CLI…",
|
93
93
|
downloaded: "Downloaded Heroku CLI",
|
94
|
-
installing: "Installing Heroku CLI
|
94
|
+
installing: "Installing Heroku CLI…",
|
95
95
|
installed: "Installed Heroku CLI",
|
96
96
|
authenticated_with_account: "{{v}} Authenticated with Heroku as {{green:%s}}",
|
97
|
-
authenticating: "Authenticating with Heroku
|
97
|
+
authenticating: "Authenticating with Heroku…",
|
98
98
|
authenticated: "{{v}} Authenticated with Heroku",
|
99
|
-
deploying: "Deploying to Heroku
|
99
|
+
deploying: "Deploying to Heroku…",
|
100
100
|
deployed: "{{v}} Deployed to Heroku",
|
101
101
|
db_check: {
|
102
|
-
validating: "Validating application
|
103
|
-
checking: "Checking database type
|
102
|
+
validating: "Validating application…",
|
103
|
+
checking: "Checking database type…",
|
104
104
|
validated: "Database type \"%s\" validated for platform \"Heroku\"",
|
105
105
|
problem: "A problem was encountered while checking your database type.",
|
106
106
|
sqlite: <<~SQLITE,
|
@@ -110,7 +110,7 @@ module Rails
|
|
110
110
|
SQLITE
|
111
111
|
},
|
112
112
|
git: {
|
113
|
-
checking: "Checking git repo
|
113
|
+
checking: "Checking git repo…",
|
114
114
|
initialized: "Git repo initialized",
|
115
115
|
what_branch: "What branch would you like to deploy?",
|
116
116
|
branch_selected: "{{v}} Git branch {{green:%s}} selected for deploy",
|
@@ -119,10 +119,10 @@ module Rails
|
|
119
119
|
no_apps_found: "No existing Heroku app found. What would you like to do?",
|
120
120
|
name: "What is your Heroku app’s name?",
|
121
121
|
select: "Specify an existing Heroku app",
|
122
|
-
selecting: "Selecting Heroku app %s
|
122
|
+
selecting: "Selecting Heroku app %s…",
|
123
123
|
selected: "{{v}} Heroku app {{green:%s}} selected",
|
124
124
|
create: "Create a new Heroku app",
|
125
|
-
creating: "Creating new Heroku app
|
125
|
+
creating: "Creating new Heroku app…",
|
126
126
|
created: "{{v}} New Heroku app created",
|
127
127
|
},
|
128
128
|
},
|
@@ -180,7 +180,7 @@ module Rails
|
|
180
180
|
{{*}} To install and start using your app, open this URL in your browser:
|
181
181
|
{{green:%s}}
|
182
182
|
MESSAGE
|
183
|
-
running_server: "Running server
|
183
|
+
running_server: "Running server…",
|
184
184
|
},
|
185
185
|
|
186
186
|
tunnel: {
|