shopify-cli 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/project_types/extension/cli.rb +1 -0
- data/lib/project_types/extension/features/argo_config.rb +60 -0
- data/lib/project_types/extension/messages/messages.rb +3 -0
- data/lib/project_types/extension/models/types/checkout_post_purchase.rb +5 -2
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +36 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +7 -0
- data/lib/project_types/script/messages/messages.rb +3 -0
- data/lib/project_types/script/ui/error_handler.rb +8 -0
- data/lib/shopify-cli/messages/messages.rb +8 -5
- data/lib/shopify-cli/project.rb +3 -3
- data/lib/shopify-cli/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aac6d7ad80aa747af6b8334b1cf6f82b3dfc0c6db77e8e22eb9638365b11317b
|
4
|
+
data.tar.gz: f5a744abb193c02bad16f0978d93bac2825ce287f95e3143848be47c28c8bbfc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b934e0c4c5321cdb01d733886e2eae5fc23c94c1ea7115e9b18af302244512d93617440d1a4274ca764305c6797a10ef79285c97cf03636d473deec63a6a0d23
|
7
|
+
data.tar.gz: fec928d425a1be8c543d45d495156857fcf848c12170eaf825fdf549f70536198fdf076d71b35b448b97769869ac85e2eddb8d6dd1321a2f93949160cd2929fa
|
data/CHANGELOG.md
CHANGED
@@ -53,6 +53,7 @@ module Extension
|
|
53
53
|
autoload :ArgoSetupStep, Project.project_filepath('features/argo_setup_step')
|
54
54
|
autoload :ArgoSetupSteps, Project.project_filepath('features/argo_setup_steps')
|
55
55
|
autoload :ArgoDependencies, Project.project_filepath('features/argo_dependencies')
|
56
|
+
autoload :ArgoConfig, Project.project_filepath('features/argo_config')
|
56
57
|
end
|
57
58
|
|
58
59
|
module Models
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Features
|
5
|
+
class ArgoConfig
|
6
|
+
CONFIG_FILE_NAME = 'extension.config.yml'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def parse_yaml(context, permitted_keys = [])
|
10
|
+
file_name = File.join(context.root, CONFIG_FILE_NAME)
|
11
|
+
|
12
|
+
return {} unless File.size?(file_name)
|
13
|
+
|
14
|
+
require 'yaml' # takes 20ms, so deferred as late as possible.
|
15
|
+
begin
|
16
|
+
config = YAML.load_file(file_name)
|
17
|
+
|
18
|
+
# `YAML.load_file` returns nil if the file is not empty
|
19
|
+
# but does not contain any parsable yml data, e.g. only comments
|
20
|
+
# We consider this valid
|
21
|
+
return {} if config.nil?
|
22
|
+
|
23
|
+
unless config.is_a?(Hash)
|
24
|
+
raise ShopifyCli::Abort, ShopifyCli::Context.message('core.yaml.error.not_hash', CONFIG_FILE_NAME)
|
25
|
+
end
|
26
|
+
|
27
|
+
config.transform_keys!(&:to_sym)
|
28
|
+
assert_valid_config(config, permitted_keys) unless permitted_keys.empty?
|
29
|
+
|
30
|
+
config
|
31
|
+
rescue Psych::SyntaxError => e
|
32
|
+
raise(
|
33
|
+
ShopifyCli::Abort,
|
34
|
+
ShopifyCli::Context.message('core.yaml.error.invalid', CONFIG_FILE_NAME, e.message)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def assert_valid_config(config, permitted_keys)
|
42
|
+
unpermitted_keys = config.keys.select do |k|
|
43
|
+
!permitted_keys.include?(k)
|
44
|
+
end
|
45
|
+
|
46
|
+
unless unpermitted_keys.empty?
|
47
|
+
raise(
|
48
|
+
ShopifyCli::Abort,
|
49
|
+
ShopifyCli::Context.message(
|
50
|
+
'features.argo.config.unpermitted_keys',
|
51
|
+
CONFIG_FILE_NAME,
|
52
|
+
unpermitted_keys.map { |k| "\n- #{k}" }.join
|
53
|
+
)
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -6,13 +6,16 @@ module Extension
|
|
6
6
|
module Types
|
7
7
|
class CheckoutPostPurchase < Models::Type
|
8
8
|
IDENTIFIER = 'CHECKOUT_POST_PURCHASE'
|
9
|
-
|
9
|
+
PERMITTED_CONFIG_KEYS = [:metafields]
|
10
10
|
def create(directory_name, context)
|
11
11
|
Features::Argo.checkout.create(directory_name, IDENTIFIER, context)
|
12
12
|
end
|
13
13
|
|
14
14
|
def config(context)
|
15
|
-
|
15
|
+
{
|
16
|
+
**Features::ArgoConfig.parse_yaml(context, PERMITTED_CONFIG_KEYS),
|
17
|
+
**Features::Argo.checkout.config(context),
|
18
|
+
}
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -34,7 +34,9 @@ module Script
|
|
34
34
|
|
35
35
|
def dependencies_installed?
|
36
36
|
# Assuming if node_modules folder exist at root of script folder, all deps are installed
|
37
|
-
ctx.dir_exist?("node_modules")
|
37
|
+
return false unless ctx.dir_exist?("node_modules")
|
38
|
+
check_if_ep_dependencies_up_to_date!
|
39
|
+
true
|
38
40
|
end
|
39
41
|
|
40
42
|
private
|
@@ -58,6 +60,39 @@ module Script
|
|
58
60
|
def bytecode
|
59
61
|
File.read(format(BYTECODE_FILE, name: script_name))
|
60
62
|
end
|
63
|
+
|
64
|
+
def check_if_ep_dependencies_up_to_date!
|
65
|
+
return true if ENV['SHOPIFY_CLI_SCRIPTS_IGNORE_OUTDATED']
|
66
|
+
|
67
|
+
# ignore exit code since it will not be 0 unless every package is up to date which they probably won't be
|
68
|
+
out, _ = ctx.capture2e("npm", "outdated", "--json", "--depth", "0")
|
69
|
+
parsed_outdated_check = JSON.parse(out)
|
70
|
+
outdated_ep_packages = parsed_outdated_check
|
71
|
+
.select { |package_name, _| package_name.start_with?('@shopify/extension-point-as-') }
|
72
|
+
.select { |_, version_info| !package_is_up_to_date?(version_info) }
|
73
|
+
.keys
|
74
|
+
raise Errors::PackagesOutdatedError.new(outdated_ep_packages),
|
75
|
+
"NPM packages out of date: #{outdated_ep_packages.join(', ')}" unless outdated_ep_packages.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def package_is_up_to_date?(version_info)
|
79
|
+
require 'semantic/semantic'
|
80
|
+
current_version = version_info['current']
|
81
|
+
latest_version = version_info['latest']
|
82
|
+
|
83
|
+
# making an assumption that the script developer knows what they're doing if they're not referencing a
|
84
|
+
# semver version
|
85
|
+
begin
|
86
|
+
current_version = ::Semantic::Version.new(current_version)
|
87
|
+
latest_version = ::Semantic::Version.new(latest_version)
|
88
|
+
rescue ArgumentError
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
|
92
|
+
return false if current_version.major < latest_version.major
|
93
|
+
return false if latest_version.major == 0 && current_version.minor < latest_version.minor
|
94
|
+
true
|
95
|
+
end
|
61
96
|
end
|
62
97
|
end
|
63
98
|
end
|
@@ -34,6 +34,13 @@ module Script
|
|
34
34
|
class ShopScriptConflictError < ScriptProjectError; end
|
35
35
|
class ShopScriptUndefinedError < ScriptProjectError; end
|
36
36
|
class TaskRunnerNotFoundError < ScriptProjectError; end
|
37
|
+
class PackagesOutdatedError < ScriptProjectError
|
38
|
+
attr_reader :outdated_packages
|
39
|
+
def initialize(outdated_packages)
|
40
|
+
super("EP packages are outdated and need to be updated: #{outdated_packages.join(', ')}")
|
41
|
+
@outdated_packages = outdated_packages
|
42
|
+
end
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
@@ -71,6 +71,9 @@ module Script
|
|
71
71
|
shop_script_conflict_help: "Disable that script or uninstall that app and try again.",
|
72
72
|
|
73
73
|
shop_script_undefined_cause: "Script is already turned off in store.",
|
74
|
+
|
75
|
+
packages_outdated_cause: "The following npm packages are out of date: %s.",
|
76
|
+
packages_outdated_help: "Run `npm update` to update them.",
|
74
77
|
},
|
75
78
|
|
76
79
|
create: {
|
@@ -142,6 +142,14 @@ module Script
|
|
142
142
|
{
|
143
143
|
cause_of_error: ShopifyCli::Context.message('script.error.shop_script_undefined_cause'),
|
144
144
|
}
|
145
|
+
when Layers::Infrastructure::Errors::PackagesOutdatedError
|
146
|
+
{
|
147
|
+
cause_of_error: ShopifyCli::Context.message(
|
148
|
+
'script.error.packages_outdated_cause',
|
149
|
+
e.outdated_packages.join(', ')
|
150
|
+
),
|
151
|
+
help_suggestion: ShopifyCli::Context.message('script.error.packages_outdated_help'),
|
152
|
+
}
|
145
153
|
end
|
146
154
|
end
|
147
155
|
end
|
@@ -184,11 +184,14 @@ module ShopifyCli
|
|
184
184
|
{{x}} You are not in a Shopify app project
|
185
185
|
{{yellow:{{*}}}}{{reset: Run}}{{cyan: shopify create}}{{reset: to create your app}}
|
186
186
|
MESSAGE
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
187
|
+
},
|
188
|
+
},
|
189
|
+
|
190
|
+
yaml: {
|
191
|
+
error: {
|
192
|
+
not_hash: "{{x}} %s was not a proper YAML file. Expecting a hash.",
|
193
|
+
invalid: "{{x}} %s contains invalid YAML: %s",
|
194
|
+
not_found: "{{x}} %s not found",
|
192
195
|
},
|
193
196
|
},
|
194
197
|
|
data/lib/shopify-cli/project.rb
CHANGED
@@ -166,7 +166,7 @@ module ShopifyCli
|
|
166
166
|
@config ||= begin
|
167
167
|
config = load_yaml_file('.shopify-cli.yml')
|
168
168
|
unless config.is_a?(Hash)
|
169
|
-
raise ShopifyCli::Abort, Context.message('core.
|
169
|
+
raise ShopifyCli::Abort, Context.message('core.yaml.error.not_hash', '.shopify-cli.yml')
|
170
170
|
end
|
171
171
|
|
172
172
|
# The app_type key was deprecated in favour of project_type, so replace it
|
@@ -187,12 +187,12 @@ module ShopifyCli
|
|
187
187
|
begin
|
188
188
|
YAML.load_file(f)
|
189
189
|
rescue Psych::SyntaxError => e
|
190
|
-
raise(ShopifyCli::Abort, Context.message('core.
|
190
|
+
raise(ShopifyCli::Abort, Context.message('core.yaml.error.invalid', relative_path, e.message))
|
191
191
|
# rescue Errno::EACCES => e
|
192
192
|
# TODO
|
193
193
|
# Dev::Helpers::EaccesHandler.diagnose_and_raise(f, e, mode: :read)
|
194
194
|
rescue Errno::ENOENT
|
195
|
-
raise ShopifyCli::Abort, Context.message('core.
|
195
|
+
raise ShopifyCli::Abort, Context.message('core.yaml.error.not_found', f)
|
196
196
|
end
|
197
197
|
end
|
198
198
|
end
|
data/lib/shopify-cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- lib/project_types/extension/extension_project.rb
|
149
149
|
- lib/project_types/extension/extension_project_keys.rb
|
150
150
|
- lib/project_types/extension/features/argo.rb
|
151
|
+
- lib/project_types/extension/features/argo_config.rb
|
151
152
|
- lib/project_types/extension/features/argo_dependencies.rb
|
152
153
|
- lib/project_types/extension/features/argo_setup.rb
|
153
154
|
- lib/project_types/extension/features/argo_setup_step.rb
|