shopify-cli 2.6.5 → 2.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/CONTRIBUTING.md +9 -1
- data/Dockerfile +11 -3
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/lib/project_types/extension/cli.rb +1 -0
- data/lib/project_types/extension/commands/create.rb +1 -0
- data/lib/project_types/extension/features/argo.rb +1 -8
- data/lib/project_types/extension/features/argo_serve.rb +1 -1
- data/lib/project_types/extension/forms/create.rb +1 -1
- data/lib/project_types/extension/forms/questions/ask_template.rb +2 -1
- data/lib/project_types/extension/messages/messages.rb +1 -0
- data/lib/project_types/extension/models/server_config/extension.rb +2 -0
- data/lib/project_types/extension/tasks/converters/server_config_converter.rb +4 -5
- data/lib/project_types/extension/tasks/find_package_from_json.rb +37 -0
- data/lib/project_types/extension/tasks/load_server_config.rb +6 -1
- data/lib/project_types/rails/commands/create.rb +45 -16
- data/lib/project_types/rails/forms/create.rb +0 -1
- data/lib/project_types/script/commands/create.rb +1 -4
- data/lib/project_types/script/config/extension_points.yml +3 -0
- data/lib/project_types/script/errors.rb +0 -18
- data/lib/project_types/script/layers/application/create_script.rb +2 -2
- data/lib/project_types/script/layers/domain/script_json.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +0 -4
- data/lib/project_types/script/layers/infrastructure/errors.rb +0 -2
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +25 -0
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +3 -4
- data/lib/project_types/script/layers/infrastructure/script_service.rb +1 -1
- data/lib/project_types/script/messages/messages.rb +3 -18
- data/lib/project_types/script/ui/error_handler.rb +0 -26
- data/lib/project_types/theme/commands/serve.rb +1 -0
- data/lib/project_types/theme/messages/messages.rb +1 -0
- data/lib/shopify_cli/exception_reporter.rb +5 -2
- data/lib/shopify_cli/migrator.rb +9 -11
- data/lib/shopify_cli/theme/dev_server.rb +2 -1
- data/lib/shopify_cli/version.rb +1 -1
- data/shopify-cli.gemspec +1 -5
- data/utilities/docker/container.rb +23 -2
- data/utilities/docker.rb +1 -0
- metadata +6 -7
- data/ext/shopify-cli/extconf.rb +0 -60
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb41d18df964832b9ebc6be79e80006c4750c8d416c9550cbcc625d190bf26b9
|
4
|
+
data.tar.gz: d5c6b523faf27c0a6b3c53ccaadd1c4f47e932d7e0c2520e7f0bfcb2f7f7b820
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 396c3c47f510e78d67775fc6b6a091849ce8c3955d2c91ec516659ef4377df44a00a3faaa70facdd0649763b2a3b69f96ab4f859a003b23becd6baf3202d4b64
|
7
|
+
data.tar.gz: 1514e2a4c8f1841e8714a30f4e05450c5116863cc2c14cf5655143a43a49e1b5f6f2da1b8ffc2af6acd683359ea970920090ba55c6f82213e91de1cd4aeb7b87
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
From version 2.6.0, the sections in this file adhere to the [keep a changelog](https://keepachangelog.com/en/1.0.0/) specification.
|
2
2
|
## [Unreleased]
|
3
3
|
|
4
|
+
## Version 2.6.6
|
5
|
+
### Added
|
6
|
+
* [#1609](https://github.com/Shopify/shopify-cli/pull/1609): Add `--bind=HOST` option to `shopify theme serve`.
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
* [#1678](https://github.com/Shopify/shopify-cli/pull/1678): Fix migrator's incompatibility with Ruby 2.5.
|
10
|
+
* [#1690](https://github.com/Shopify/shopify-cli/pull/1690): Fix `extension push` command for `PRODUCT_SUBSCRIPTION` extensions
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
* [#1678](https://github.com/Shopify/shopify-cli/pull/1678): Change the `@shopify/scripts-checkout-apis-temp` package name to `@shopify/scripts-discount-apis`.
|
14
|
+
|
15
|
+
### Removed
|
16
|
+
* [#1664](https://github.com/Shopify/shopify-cli/pull/1664): Remove ruby-locking extension
|
4
17
|
## Version 2.6.5
|
5
18
|
### Fixed
|
6
19
|
* [#1661](https://github.com/Shopify/shopify-cli/pull/1661): Handle npm list non-zero exit status when pushing scripts
|
@@ -24,7 +37,7 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
|
|
24
37
|
|
25
38
|
## Version 2.6.2
|
26
39
|
* Fix broken installation due to a missing variable in `extconf.rb`
|
27
|
-
|
40
|
+
|
28
41
|
## Version 2.6.1
|
29
42
|
* [#1608](https://github.com/Shopify/shopify-cli/pull/1608): Fix errors not being reported.
|
30
43
|
## Version 2.6.0
|
data/CONTRIBUTING.md
CHANGED
@@ -13,7 +13,7 @@ Most of the internal components the project uses have unit tests to thoroughly t
|
|
13
13
|
|
14
14
|
Acceptance tests run the built `shopify` command line against a wide range of fixtures and verify its output and results. They are the slowest to run however provide the most coverage. The idea is to test a few complete scenarios for each major feature.
|
15
15
|
|
16
|
-
Those are written in [Cucumber](https://cucumber.io/) and Ruby and can be found in the [`features/`](/features) directory. They can be executed by running
|
16
|
+
Those are written in [Cucumber](https://cucumber.io/) and Ruby and can be found in the [`features/`](/features) directory. They can be executed by running:
|
17
17
|
|
18
18
|
```bash
|
19
19
|
bundle exec cucumber
|
@@ -21,3 +21,11 @@ bundle exec cucumber features/theme.feature:3 # A specific test
|
|
21
21
|
```
|
22
22
|
|
23
23
|
> **Note** that we currently don't have an approach for stubbing the interactions with the GraphQL APIs and that therefore we can't write acceptance tests for commands that interact with APIs.
|
24
|
+
|
25
|
+
#### Debugging acceptance tests
|
26
|
+
When developing acceptance tests, it can be helpful to see the outputs of running commands.
|
27
|
+
To see outputs, append `--verbose` when running an acceptance test. Example:
|
28
|
+
|
29
|
+
```sh
|
30
|
+
bundle exec cucumber features/theme.feature --verbose
|
31
|
+
```
|
data/Dockerfile
CHANGED
@@ -6,8 +6,7 @@ FROM cimg/ruby:2.7.1
|
|
6
6
|
RUN git config --global user.email "development-lifecycle@shopify.com"
|
7
7
|
RUN git config --global user.name "Development Lifecycle"
|
8
8
|
|
9
|
-
|
10
|
-
RUN bundle config --global frozen 1
|
9
|
+
RUN gem update bundler
|
11
10
|
|
12
11
|
WORKDIR /usr/src/app
|
13
12
|
|
@@ -24,4 +23,13 @@ RUN sudo apt-get install git -y
|
|
24
23
|
# Install the latest version of NodeJS
|
25
24
|
RUN sudo apt-get install ca-certificates -y
|
26
25
|
RUN curl -fsSL https://deb.nodesource.com/setup_current.x | sudo -E bash -
|
27
|
-
RUN sudo apt-get install -y nodejs
|
26
|
+
RUN sudo apt-get install -y nodejs
|
27
|
+
|
28
|
+
# Install the latest version of Yarn
|
29
|
+
RUN sudo npm install --global yarn
|
30
|
+
|
31
|
+
# Python is necessary to compile NPM packages with native extensions through node-gyp
|
32
|
+
RUN sudo apt install python-minimal -y
|
33
|
+
|
34
|
+
# Install sqlite3
|
35
|
+
RUN sudo apt-get install libsqlite3-dev -y
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
shopify-cli (2.6.
|
4
|
+
shopify-cli (2.6.6)
|
5
5
|
bugsnag (~> 6.22)
|
6
6
|
listen (~> 3.7.0)
|
7
7
|
theme-check (~> 1.7.2)
|
@@ -18,6 +18,7 @@ GEM
|
|
18
18
|
builder (3.2.4)
|
19
19
|
byebug (11.1.3)
|
20
20
|
coderay (1.1.3)
|
21
|
+
colorize (0.8.1)
|
21
22
|
concurrent-ruby (1.1.9)
|
22
23
|
crack (0.4.5)
|
23
24
|
rexml
|
@@ -135,6 +136,7 @@ PLATFORMS
|
|
135
136
|
DEPENDENCIES
|
136
137
|
bundler (~> 2.2.2)
|
137
138
|
byebug
|
139
|
+
colorize (~> 0.8.1)
|
138
140
|
cucumber (~> 7.0)
|
139
141
|
fakefs (>= 1.0)
|
140
142
|
iniparse (~> 1.5)
|
@@ -43,6 +43,7 @@ module Extension
|
|
43
43
|
autoload :GetProduct, Project.project_filepath("tasks/get_product")
|
44
44
|
autoload :RunExtensionCommand, Project.project_filepath("tasks/run_extension_command")
|
45
45
|
autoload :LoadServerConfig, Project.project_filepath("tasks/load_server_config")
|
46
|
+
autoload :FindPackageFromJson, Project.project_filepath("tasks/find_package_from_json.rb")
|
46
47
|
|
47
48
|
module Converters
|
48
49
|
autoload :RegistrationConverter, Project.project_filepath("tasks/converters/registration_converter")
|
@@ -11,6 +11,7 @@ module Extension
|
|
11
11
|
|
12
12
|
options do |parser, flags|
|
13
13
|
parser.on("--name=NAME") { |name| flags[:name] = name }
|
14
|
+
parser.on("--template=TEMPLATE") { |template| flags[:template] = template }
|
14
15
|
parser.on("--type=TYPE") { |type| flags[:type] = type.upcase }
|
15
16
|
parser.on("--api-key=KEY") { |key| flags[:api_key] = key.downcase }
|
16
17
|
parser.on("--getting-started") { flags[:getting_started] = true }
|
@@ -48,14 +48,7 @@ module Extension
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def renderer_package(context)
|
51
|
-
|
52
|
-
Tasks::FindNpmPackages
|
53
|
-
.exactly_one_of(renderer_package_name, js_system: js_system, production_only: true)
|
54
|
-
.unwrap { |err| raise err }
|
55
|
-
rescue Extension::PackageResolutionFailed
|
56
|
-
context.abort(
|
57
|
-
context.message("features.argo.dependencies.argo_missing_renderer_package_error")
|
58
|
-
)
|
51
|
+
Tasks::FindPackageFromJson.call(renderer_package_name, context: context)
|
59
52
|
end
|
60
53
|
|
61
54
|
private
|
@@ -63,7 +63,7 @@ module Extension
|
|
63
63
|
ShopifyCLI::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
|
64
64
|
|
65
65
|
project = ExtensionProject.current
|
66
|
-
ensure_resource_resource_url! if specification_handler.supplies_resource_url?
|
66
|
+
ensure_resource_resource_url! if specification_handler.supplies_resource_url? && !supports_development_server?
|
67
67
|
|
68
68
|
return if required_fields.all? do |field|
|
69
69
|
value = project.env.public_send(field)
|
@@ -24,7 +24,7 @@ module Extension
|
|
24
24
|
ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
|
25
25
|
.then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
|
26
26
|
.then(&Questions::AskType.new(ctx: ctx, type: type))
|
27
|
-
.then(&Questions::AskTemplate.new(ctx: ctx))
|
27
|
+
.then(&Questions::AskTemplate.new(ctx: ctx, template: template))
|
28
28
|
.then(&Questions::AskName.new(ctx: ctx, name: name))
|
29
29
|
.unwrap { |e| raise e }
|
30
30
|
.tap do |project_details|
|
@@ -9,13 +9,14 @@ module Extension
|
|
9
9
|
]
|
10
10
|
|
11
11
|
property! :ctx
|
12
|
+
property :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
|
12
13
|
property :prompt,
|
13
14
|
accepts: ->(prompt) { prompt.respond_to?(:call) },
|
14
15
|
default: -> { CLI::UI::Prompt.method(:ask) }
|
15
16
|
|
16
17
|
def call(project_details)
|
17
18
|
return project_details unless template_required?(project_details)
|
18
|
-
project_details.template = choose_interactively
|
19
|
+
project_details.template = template || choose_interactively
|
19
20
|
project_details
|
20
21
|
end
|
21
22
|
|
@@ -175,6 +175,7 @@ module Extension
|
|
175
175
|
errors: {
|
176
176
|
unknown_type: "Unknown extension type %s",
|
177
177
|
package_not_found: "`%s` package not found.",
|
178
|
+
module_not_found: "Unable to find module %s. Ensure your dependencies are up-to-date and try again.",
|
178
179
|
},
|
179
180
|
warnings: {
|
180
181
|
resource_url_auto_generation_failed: "{{*}} {{yellow:Warning:}} Unable to auto generate " \
|
@@ -5,10 +5,12 @@ module Extension
|
|
5
5
|
module ServerConfig
|
6
6
|
class Extension < Base
|
7
7
|
include SmartProperties
|
8
|
+
|
8
9
|
property! :uuid, accepts: String
|
9
10
|
property! :type, accepts: String
|
10
11
|
property! :user, accepts: ServerConfig::User
|
11
12
|
property! :development, accepts: ServerConfig::Development
|
13
|
+
property :extension_points, accepts: Array
|
12
14
|
|
13
15
|
def self.build(uuid: "", template:, type:, root_dir:)
|
14
16
|
renderer = ServerConfig::DevelopmentRenderer.find(type)
|
@@ -5,13 +5,11 @@ module Extension
|
|
5
5
|
module Tasks
|
6
6
|
module Converters
|
7
7
|
module ServerConfigConverter
|
8
|
-
def self.from_hash(hash
|
8
|
+
def self.from_hash(hash:, type:, registration_uuid:)
|
9
9
|
context.abort(context.message("tasks.errors.parse_error")) if hash.nil?
|
10
10
|
|
11
|
-
project = ExtensionProject.current
|
12
|
-
|
13
11
|
extension = Models::ServerConfig::Extension.new(
|
14
|
-
uuid:
|
12
|
+
uuid: registration_uuid,
|
15
13
|
type: type.upcase,
|
16
14
|
user: Models::ServerConfig::User.new,
|
17
15
|
development: Models::ServerConfig::Development.new(
|
@@ -20,7 +18,8 @@ module Extension
|
|
20
18
|
entries: Models::ServerConfig::DevelopmentEntries.new(
|
21
19
|
main: hash.dig("development", "entries", "main")
|
22
20
|
)
|
23
|
-
)
|
21
|
+
),
|
22
|
+
extension_points: hash.dig("extension_points")
|
24
23
|
)
|
25
24
|
|
26
25
|
Models::ServerConfig::Root.new(extensions: [extension])
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
class FindPackageFromJson < ShopifyCLI::Task
|
7
|
+
include SmartProperties
|
8
|
+
|
9
|
+
property! :context, accepts: ShopifyCLI::Context
|
10
|
+
|
11
|
+
def self.call(package_name, **config)
|
12
|
+
new(**config).call(package_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(package_name)
|
16
|
+
ShopifyCLI::Result.success(resolve_package_json(package_name))
|
17
|
+
.then { |file| File.read(file) }
|
18
|
+
.then { |file| JSON.parse(file) }
|
19
|
+
.then { |file| file.dig("version") }
|
20
|
+
.then { |version| return Models::NpmPackage.new(name: package_name, version: version) }
|
21
|
+
.unwrap do |error|
|
22
|
+
context.debug(error)
|
23
|
+
context.abort(context.message("errors.module_not_found", package_name))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def resolve_package_json(package_name)
|
30
|
+
path = "path.join(require.resolve('#{package_name}'), '../package.json')"
|
31
|
+
package_json, error, _ = CLI::Kit::System.capture3("node", "-p", path)
|
32
|
+
return error unless !error.nil?
|
33
|
+
package_json.chomp
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -10,7 +10,12 @@ module Extension
|
|
10
10
|
class << self
|
11
11
|
def call(file_name:, type:)
|
12
12
|
config = YAML.load_file(file_name)
|
13
|
-
|
13
|
+
project = ExtensionProject.current
|
14
|
+
Tasks::Converters::ServerConfigConverter.from_hash(
|
15
|
+
hash: config,
|
16
|
+
type: type,
|
17
|
+
registration_uuid: project.registration_uuid
|
18
|
+
)
|
14
19
|
rescue Psych::SyntaxError => e
|
15
20
|
raise(
|
16
21
|
ShopifyCLI::Abort,
|
@@ -2,7 +2,9 @@
|
|
2
2
|
module Rails
|
3
3
|
class Command
|
4
4
|
class Create < ShopifyCLI::SubCommand
|
5
|
-
|
5
|
+
unless ShopifyCLI::Environment.acceptance_test?
|
6
|
+
prerequisite_task :ensure_authenticated
|
7
|
+
end
|
6
8
|
|
7
9
|
USER_AGENT_CODE = <<~USERAGENT
|
8
10
|
module ShopifyAPI
|
@@ -31,8 +33,8 @@ module Rails
|
|
31
33
|
end
|
32
34
|
|
33
35
|
def call(args, _name)
|
34
|
-
|
35
|
-
return @ctx.puts(self.class.help) if
|
36
|
+
form_data = self.form_data(args)
|
37
|
+
return @ctx.puts(self.class.help) if form_data.nil?
|
36
38
|
|
37
39
|
ruby_version = Ruby.version(@ctx)
|
38
40
|
@ctx.abort(@ctx.message("rails.create.error.invalid_ruby_version")) unless
|
@@ -41,34 +43,61 @@ module Rails
|
|
41
43
|
check_node
|
42
44
|
check_yarn
|
43
45
|
|
44
|
-
build(
|
46
|
+
build(form_data.name, form_data.db)
|
47
|
+
|
45
48
|
set_custom_ua
|
46
49
|
ShopifyCLI::Project.write(
|
47
50
|
@ctx,
|
48
51
|
project_type: "rails",
|
49
|
-
organization_id:
|
52
|
+
organization_id: form_data.organization_id,
|
50
53
|
)
|
51
54
|
|
52
|
-
api_client = ShopifyCLI::
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
api_client = if ShopifyCLI::Environment.acceptance_test?
|
56
|
+
{
|
57
|
+
"apiKey" => "public_api_key",
|
58
|
+
"apiSecretKeys" => [
|
59
|
+
{
|
60
|
+
"secret" => "api_secret_key",
|
61
|
+
},
|
62
|
+
],
|
63
|
+
}
|
64
|
+
else
|
65
|
+
ShopifyCLI::Tasks::CreateApiClient.call(
|
66
|
+
@ctx,
|
67
|
+
org_id: form_data.organization_id,
|
68
|
+
title: form_data.title,
|
69
|
+
type: form_data.type,
|
70
|
+
)
|
71
|
+
end
|
58
72
|
|
59
73
|
ShopifyCLI::Resources::EnvFile.new(
|
60
74
|
api_key: api_client["apiKey"],
|
61
75
|
secret: api_client["apiSecretKeys"].first["secret"],
|
62
|
-
shop:
|
76
|
+
shop: form_data.shop_domain,
|
63
77
|
scopes: "write_products,write_customers,write_draft_orders",
|
64
78
|
).write(@ctx)
|
65
79
|
|
66
|
-
partners_url = ShopifyCLI::PartnersAPI.partners_url_for(
|
80
|
+
partners_url = ShopifyCLI::PartnersAPI.partners_url_for(form_data.organization_id, api_client["id"])
|
67
81
|
|
68
|
-
@ctx.puts(@ctx.message("apps.create.info.created",
|
69
|
-
@ctx.puts(@ctx.message("apps.create.info.serve",
|
82
|
+
@ctx.puts(@ctx.message("apps.create.info.created", form_data.title, partners_url))
|
83
|
+
@ctx.puts(@ctx.message("apps.create.info.serve", form_data.name, ShopifyCLI::TOOL_NAME, "rails"))
|
70
84
|
unless ShopifyCLI::Shopifolk.acting_as_shopify_organization?
|
71
|
-
@ctx.puts(@ctx.message("apps.create.info.install", partners_url,
|
85
|
+
@ctx.puts(@ctx.message("apps.create.info.install", partners_url, form_data.title))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def form_data(args)
|
90
|
+
if ShopifyCLI::Environment.acceptance_test?
|
91
|
+
Struct.new(:title, :name, :organization_id, :type, :shop_domain, :db, keyword_init: true).new(
|
92
|
+
title: options.flags[:title],
|
93
|
+
name: options.flags[:title],
|
94
|
+
organization_id: "123",
|
95
|
+
shop_domain: "test.shopify.io",
|
96
|
+
type: "public",
|
97
|
+
db: options.flags[:db]
|
98
|
+
)
|
99
|
+
else
|
100
|
+
Forms::Create.ask(@ctx, args, options.flags)
|
72
101
|
end
|
73
102
|
end
|
74
103
|
|
@@ -9,11 +9,9 @@ module Script
|
|
9
9
|
|
10
10
|
options do |parser, flags|
|
11
11
|
parser.on("--name=NAME") { |name| flags[:name] = name }
|
12
|
-
parser.on("--
|
13
|
-
parser.on("--extension-point=EP_NAME") { |ep_name| flags[:extension_point] = ep_name }
|
12
|
+
parser.on("--api=API_NAME") { |ep_name| flags[:extension_point] = ep_name }
|
14
13
|
parser.on("--language=LANGUAGE") { |language| flags[:language] = language }
|
15
14
|
parser.on("--branch=BRANCH") { |branch| flags[:branch] = branch }
|
16
|
-
parser.on("--no-config-ui") { |no_config_ui| flags[:no_config_ui] = no_config_ui }
|
17
15
|
end
|
18
16
|
|
19
17
|
def call(args, _name)
|
@@ -30,7 +28,6 @@ module Script
|
|
30
28
|
sparse_checkout_branch: options.flags[:branch] || "master",
|
31
29
|
script_name: form.name,
|
32
30
|
extension_point_type: form.extension_point,
|
33
|
-
no_config_ui: options.flags.key?(:no_config_ui)
|
34
31
|
)
|
35
32
|
@ctx.puts(@ctx.message("script.create.change_directory_notice", project.script_name))
|
36
33
|
rescue StandardError => e
|
@@ -32,6 +32,7 @@ payment_methods:
|
|
32
32
|
package: "@shopify/scripts-checkout-apis"
|
33
33
|
typescript:
|
34
34
|
beta: true
|
35
|
+
package: "@shopify/scripts-checkout-apis-temp"
|
35
36
|
repo: "https://github.com/Shopify/scripts-apis-examples"
|
36
37
|
shipping_methods:
|
37
38
|
domain: 'checkout'
|
@@ -41,6 +42,7 @@ shipping_methods:
|
|
41
42
|
package: "@shopify/scripts-checkout-apis"
|
42
43
|
typescript:
|
43
44
|
beta: true
|
45
|
+
package: "@shopify/scripts-checkout-apis-temp"
|
44
46
|
repo: "https://github.com/Shopify/scripts-apis-examples"
|
45
47
|
discount_types:
|
46
48
|
beta: true
|
@@ -48,4 +50,5 @@ discount_types:
|
|
48
50
|
libraries:
|
49
51
|
typescript:
|
50
52
|
beta: true
|
53
|
+
package: "@shopify/scripts-discount-apis"
|
51
54
|
repo: "https://github.com/Shopify/scripts-apis-examples"
|
@@ -6,23 +6,5 @@ module Script
|
|
6
6
|
|
7
7
|
class NoExistingAppsError < ScriptProjectError; end
|
8
8
|
class NoExistingOrganizationsError < ScriptProjectError; end
|
9
|
-
|
10
|
-
class NoExistingStoresError < ScriptProjectError
|
11
|
-
attr_reader :organization_id
|
12
|
-
def initialize(organization_id)
|
13
|
-
super()
|
14
|
-
@organization_id = organization_id
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class InvalidConfigProps < ScriptProjectError; end
|
19
|
-
|
20
|
-
class InvalidConfigYAMLError < ScriptProjectError
|
21
|
-
attr_reader :config_file
|
22
|
-
def initialize(config_file)
|
23
|
-
super()
|
24
|
-
@config_file = config_file
|
25
|
-
end
|
26
|
-
end
|
27
9
|
end
|
28
10
|
end
|
@@ -7,7 +7,7 @@ module Script
|
|
7
7
|
module Application
|
8
8
|
class CreateScript
|
9
9
|
class << self
|
10
|
-
def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type
|
10
|
+
def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type:)
|
11
11
|
raise Infrastructure::Errors::ScriptProjectAlreadyExistsError, script_name if ctx.dir_exist?(script_name)
|
12
12
|
|
13
13
|
in_new_directory_context(ctx, script_name) do
|
@@ -36,7 +36,7 @@ module Script
|
|
36
36
|
)
|
37
37
|
|
38
38
|
install_dependencies(ctx, language, script_name, project_creator)
|
39
|
-
script_project_repo.update_or_create_script_json(title: script_name
|
39
|
+
script_project_repo.update_or_create_script_json(title: script_name)
|
40
40
|
project
|
41
41
|
end
|
42
42
|
end
|
@@ -15,7 +15,7 @@ module Script
|
|
15
15
|
@version = @content["version"].to_s
|
16
16
|
@title = @content["title"]
|
17
17
|
@description = @content["description"]
|
18
|
-
@configuration_ui = @content
|
18
|
+
@configuration_ui = @content.fetch("configurationUi", true)
|
19
19
|
@configuration = @content["configuration"]
|
20
20
|
end
|
21
21
|
|
data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb
CHANGED
@@ -27,10 +27,6 @@ module Script
|
|
27
27
|
case error_code(response["errors"])
|
28
28
|
when "forbidden"
|
29
29
|
raise Errors::ForbiddenError
|
30
|
-
when "forbidden_on_shop"
|
31
|
-
raise Errors::ShopAuthenticationError
|
32
|
-
when "app_not_installed_on_shop"
|
33
|
-
raise Errors::AppNotInstalledError
|
34
30
|
else
|
35
31
|
raise Errors::GraphqlError, response["errors"]
|
36
32
|
end
|
@@ -4,7 +4,6 @@ module Script
|
|
4
4
|
module Layers
|
5
5
|
module Infrastructure
|
6
6
|
module Errors
|
7
|
-
class AppNotInstalledError < ScriptProjectError; end
|
8
7
|
class BuildError < ScriptProjectError; end
|
9
8
|
class ScriptJsonSyntaxError < ScriptProjectError; end
|
10
9
|
|
@@ -101,7 +100,6 @@ module Script
|
|
101
100
|
end
|
102
101
|
|
103
102
|
class ScriptProjectAlreadyExistsError < ScriptProjectError; end
|
104
|
-
class ShopAuthenticationError < ScriptProjectError; end
|
105
103
|
class TaskRunnerNotFoundError < ScriptProjectError; end
|
106
104
|
class BuildScriptNotFoundError < ScriptProjectError; end
|
107
105
|
class InvalidBuildScriptError < ScriptProjectError; end
|
@@ -48,7 +48,7 @@ module Script
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def library_version(library_name)
|
51
|
-
output = JSON.parse(CommandRunner.new(ctx: ctx).call("npm list --json"))
|
51
|
+
output = JSON.parse(CommandRunner.new(ctx: ctx).call("npm -s list --json"))
|
52
52
|
library_version_from_npm_list(output, library_name)
|
53
53
|
rescue Errors::SystemCallFailureError => error
|
54
54
|
library_version_from_npm_list_error_output(error, library_name)
|
@@ -48,8 +48,33 @@ module Script
|
|
48
48
|
Domain::Metadata.create_from_json(@ctx, raw_contents)
|
49
49
|
end
|
50
50
|
|
51
|
+
def library_version(library_name)
|
52
|
+
output = JSON.parse(CommandRunner.new(ctx: ctx).call("npm -s list --json"))
|
53
|
+
library_version_from_npm_list(output, library_name)
|
54
|
+
rescue Errors::SystemCallFailureError => error
|
55
|
+
library_version_from_npm_list_error_output(error, library_name)
|
56
|
+
end
|
57
|
+
|
51
58
|
private
|
52
59
|
|
60
|
+
def library_version_from_npm_list_error_output(error, library_name)
|
61
|
+
# npm list can return a failure status code, even when returning the correct data.
|
62
|
+
# This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
|
63
|
+
# In here, we check that the output contains `npm list`'s structure and extract the version.
|
64
|
+
output = JSON.parse(error.out)
|
65
|
+
raise error unless output.key?("dependencies")
|
66
|
+
|
67
|
+
library_version_from_npm_list(output, library_name)
|
68
|
+
rescue JSON::ParserError
|
69
|
+
raise error
|
70
|
+
end
|
71
|
+
|
72
|
+
def library_version_from_npm_list(output, library_name)
|
73
|
+
output.dig("dependencies", library_name, "version").tap do |version|
|
74
|
+
raise Errors::APILibraryNotFoundError, library_name unless version
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
53
78
|
def check_node_version!
|
54
79
|
output, status = @ctx.capture2e("node", "--version")
|
55
80
|
raise Errors::DependencyInstallError, output unless status.success?
|
@@ -81,10 +81,10 @@ module Script
|
|
81
81
|
)
|
82
82
|
end
|
83
83
|
|
84
|
-
def update_or_create_script_json(title
|
84
|
+
def update_or_create_script_json(title:)
|
85
85
|
script_json = ScriptJsonRepository
|
86
86
|
.new(ctx: ctx)
|
87
|
-
.update_or_create(title: title
|
87
|
+
.update_or_create(title: title)
|
88
88
|
|
89
89
|
Domain::ScriptProject.new(
|
90
90
|
id: ctx.root,
|
@@ -148,11 +148,10 @@ module Script
|
|
148
148
|
current_script_json || raise(Domain::Errors::NoScriptJsonFile)
|
149
149
|
end
|
150
150
|
|
151
|
-
def update_or_create(title
|
151
|
+
def update_or_create(title:)
|
152
152
|
json = current_script_json&.content || {}
|
153
153
|
json["version"] ||= "1"
|
154
154
|
json["title"] = title
|
155
|
-
json["configurationUi"] = !!configuration_ui
|
156
155
|
|
157
156
|
ctx.write(SCRIPT_JSON_FILENAME, JSON.pretty_generate(json))
|
158
157
|
|
@@ -46,7 +46,7 @@ module Script
|
|
46
46
|
|
47
47
|
if user_errors.any? { |e| e["tag"] == "already_exists_error" }
|
48
48
|
raise Errors::ScriptRepushError, uuid
|
49
|
-
elsif (e = user_errors.any? { |err| err["tag"] == "
|
49
|
+
elsif (e = user_errors.any? { |err| err["tag"] == "configuration_definition_syntax_error" })
|
50
50
|
raise Errors::ScriptJsonSyntaxError
|
51
51
|
elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_missing_keys_error" })
|
52
52
|
raise Errors::ScriptJsonMissingKeysError, e["message"]
|
@@ -27,10 +27,6 @@ module Script
|
|
27
27
|
"extension_point_type or script_name.",
|
28
28
|
invalid_context_help: "Add these values and try again.",
|
29
29
|
|
30
|
-
invalid_config_props_cause: "{{command:--config-props}} is formatted incorrectly.",
|
31
|
-
invalid_config_props_help: "Try again using this format: "\
|
32
|
-
"{{cyan:--config-props='name1:value1, name2:value2'}}",
|
33
|
-
|
34
30
|
invalid_script_name_cause: "Invalid script name.",
|
35
31
|
invalid_script_name_help: "Replace or remove unsupported characters. Valid characters "\
|
36
32
|
"are numbers, letters, hyphens, or underscores.",
|
@@ -42,9 +38,6 @@ module Script
|
|
42
38
|
no_existing_orgs_cause: "You don't have any partner organizations.",
|
43
39
|
no_existing_orgs_help: "Visit https://partners.shopify.com/ to create a partners account.",
|
44
40
|
|
45
|
-
no_existing_stores_cause: "You don't have any stores in your Partner Dashboard.",
|
46
|
-
no_existing_stores_help: "Visit https://partners.shopify.com/%{organization_id}/stores/ to create one.",
|
47
|
-
|
48
41
|
project_exists_cause: "A directory with this same name already exists.",
|
49
42
|
project_exists_help: "Try again and enter a different name for the script.",
|
50
43
|
|
@@ -54,9 +47,6 @@ module Script
|
|
54
47
|
invalid_language_cause: "Invalid language %s.",
|
55
48
|
invalid_language_help: "Allowed values: %s.",
|
56
49
|
|
57
|
-
invalid_config: "Can't change the configuration values because %1$s is missing or "\
|
58
|
-
"it isn't formatted properly.",
|
59
|
-
|
60
50
|
missing_script_json_field_cause: "The script.json file is missing the required %s field.",
|
61
51
|
missing_script_json_field_help: "Add the field and try again.",
|
62
52
|
|
@@ -91,8 +81,8 @@ module Script
|
|
91
81
|
system_call_failure_cause: "An error was returned while running {{command:%{cmd}}}.",
|
92
82
|
system_call_failure_help: "Review the following error and try again.\n{{red:%{out}}}",
|
93
83
|
|
94
|
-
metadata_validation_cause: "
|
95
|
-
metadata_validation_help: "
|
84
|
+
metadata_validation_cause: "The Script API metadata is incorrect.",
|
85
|
+
metadata_validation_help: "The 'schemaVersions.major' field contains an unsupported version.",
|
96
86
|
|
97
87
|
metadata_schema_versions_missing: "Invalid Script metadata:" \
|
98
88
|
" 'schemaVersions' field is missing",
|
@@ -107,7 +97,6 @@ module Script
|
|
107
97
|
metadata_not_found_help: "Ensure the 'shopify/scripts-toolchain-as' package is up to date and " \
|
108
98
|
"'package.json' contains a 'scripts/build' entry with a " \
|
109
99
|
"'--metadata build/metadata.json' argument",
|
110
|
-
app_not_installed_cause: "App not installed on store.",
|
111
100
|
|
112
101
|
build_error_cause: "Something went wrong while building the script.",
|
113
102
|
build_error_help: "Correct the errors and try again.",
|
@@ -126,9 +115,6 @@ module Script
|
|
126
115
|
script_repush_cause: "A version of this script already exists on the app.",
|
127
116
|
script_repush_help: "Use {{cyan:--force}} to replace the existing script.",
|
128
117
|
|
129
|
-
shop_auth_cause: "Unable to authenticate with the store.",
|
130
|
-
shop_auth_help: "Try again.",
|
131
|
-
|
132
118
|
invalid_build_script: "The root package.json contains an invalid build command that " \
|
133
119
|
"is needed to compile your script to WebAssembly.",
|
134
120
|
build_script_not_found: "The root package.json is missing the build command that " \
|
@@ -162,8 +148,7 @@ module Script
|
|
162
148
|
Usage: {{command:%1$s script create}}
|
163
149
|
Options:
|
164
150
|
{{command:--name=NAME}} Script project name. Use any string.
|
165
|
-
{{command:--
|
166
|
-
{{command:--no-config-ui}} Specify this option when you don’t want your script to render an interface in Shopify admin.
|
151
|
+
{{command:--api=TYPE}} Script API name. Allowed values: %2$s.
|
167
152
|
HELP
|
168
153
|
|
169
154
|
error: {
|
@@ -44,15 +44,6 @@ module Script
|
|
44
44
|
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_context_cause"),
|
45
45
|
help_suggestion: ShopifyCLI::Context.message("script.error.invalid_context_help"),
|
46
46
|
}
|
47
|
-
when Errors::InvalidConfigProps
|
48
|
-
{
|
49
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_config_props_cause"),
|
50
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.invalid_config_props_help"),
|
51
|
-
}
|
52
|
-
when Errors::InvalidConfigYAMLError
|
53
|
-
{
|
54
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_config", e.config_file),
|
55
|
-
}
|
56
47
|
when Layers::Infrastructure::Errors::InvalidLanguageError
|
57
48
|
{
|
58
49
|
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_language_cause", e.language),
|
@@ -76,14 +67,6 @@ module Script
|
|
76
67
|
cause_of_error: ShopifyCLI::Context.message("script.error.no_existing_orgs_cause"),
|
77
68
|
help_suggestion: ShopifyCLI::Context.message("script.error.no_existing_orgs_help"),
|
78
69
|
}
|
79
|
-
when Errors::NoExistingStoresError
|
80
|
-
{
|
81
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.no_existing_stores_cause"),
|
82
|
-
help_suggestion: ShopifyCLI::Context.message(
|
83
|
-
"script.error.no_existing_stores_help",
|
84
|
-
organization_id: e.organization_id
|
85
|
-
),
|
86
|
-
}
|
87
70
|
when Layers::Infrastructure::Errors::ScriptProjectAlreadyExistsError
|
88
71
|
{
|
89
72
|
cause_of_error: ShopifyCLI::Context.message("script.error.project_exists_cause"),
|
@@ -135,10 +118,6 @@ module Script
|
|
135
118
|
cause_of_error: ShopifyCLI::Context.message("script.error.no_script_json_file_cause"),
|
136
119
|
help_suggestion: ShopifyCLI::Context.message("script.error.no_script_json_file_help"),
|
137
120
|
}
|
138
|
-
when Layers::Infrastructure::Errors::AppNotInstalledError
|
139
|
-
{
|
140
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.app_not_installed_cause"),
|
141
|
-
}
|
142
121
|
when Layers::Infrastructure::Errors::BuildError
|
143
122
|
{
|
144
123
|
cause_of_error: ShopifyCLI::Context.message("script.error.build_error_cause"),
|
@@ -217,11 +196,6 @@ module Script
|
|
217
196
|
cause_of_error: ShopifyCLI::Context.message("script.error.script_repush_cause"),
|
218
197
|
help_suggestion: ShopifyCLI::Context.message("script.error.script_repush_help"),
|
219
198
|
}
|
220
|
-
when Layers::Infrastructure::Errors::ShopAuthenticationError
|
221
|
-
{
|
222
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.shop_auth_cause"),
|
223
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.shop_auth_help"),
|
224
|
-
}
|
225
199
|
when Layers::Infrastructure::Errors::BuildScriptNotFoundError
|
226
200
|
{
|
227
201
|
cause_of_error: ShopifyCLI::Context.message("script.error.build_script_not_found"),
|
@@ -5,6 +5,7 @@ module Theme
|
|
5
5
|
class Command
|
6
6
|
class Serve < ShopifyCLI::SubCommand
|
7
7
|
options do |parser, flags|
|
8
|
+
parser.on("--bind=HOST") { |bind| flags[:bind] = bind.to_s }
|
8
9
|
parser.on("--port=PORT") { |port| flags[:port] = port.to_i }
|
9
10
|
parser.on("--poll") { flags[:poll] = true }
|
10
11
|
end
|
@@ -94,6 +94,7 @@ module Theme
|
|
94
94
|
Options:
|
95
95
|
{{command:--port=PORT}} Local port to serve theme preview from
|
96
96
|
{{command:--poll}} Force polling to detect file changes
|
97
|
+
{{command:--bind=HOST}} Set which network interface the web server listens on
|
97
98
|
HELP
|
98
99
|
serve: "Viewing theme…",
|
99
100
|
open_fail: "Couldn't open the theme",
|
@@ -31,9 +31,12 @@ module ShopifyCLI
|
|
31
31
|
config.auto_capture_sessions = false
|
32
32
|
end
|
33
33
|
|
34
|
-
metadata = {}
|
34
|
+
metadata = { rubyPlatform: RUBY_PLATFORM }
|
35
35
|
metadata.merge!(custom_metadata)
|
36
|
-
|
36
|
+
|
37
|
+
Bugsnag.notify(error) do |event|
|
38
|
+
event.add_metadata(:device, metadata)
|
39
|
+
end
|
37
40
|
end
|
38
41
|
|
39
42
|
def self.report?(context:)
|
data/lib/shopify_cli/migrator.rb
CHANGED
@@ -9,23 +9,21 @@ module ShopifyCLI
|
|
9
9
|
migrations_directory: File.expand_path("migrator/migrations", __dir__)
|
10
10
|
)
|
11
11
|
baseline_date = last_migration_date
|
12
|
-
unless baseline_date.nil?
|
13
|
-
migrations
|
14
|
-
.select
|
15
|
-
m.date > baseline_date.to_i
|
16
|
-
|
17
|
-
.each
|
12
|
+
unless baseline_date.nil?
|
13
|
+
migrations(migrations_directory: migrations_directory)
|
14
|
+
.select do |m|
|
15
|
+
m.date > baseline_date.to_i
|
16
|
+
end
|
17
|
+
.each(&:run)
|
18
18
|
end
|
19
19
|
|
20
20
|
store_last_migration_date
|
21
21
|
end
|
22
22
|
|
23
|
-
private
|
24
|
-
|
25
23
|
def self.store_last_migration_date
|
26
24
|
ShopifyCLI::DB.set(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE => Time.now.to_i)
|
27
25
|
end
|
28
|
-
|
26
|
+
|
29
27
|
def self.last_migration_date
|
30
28
|
ShopifyCLI::DB.get(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE)
|
31
29
|
end
|
@@ -35,7 +33,7 @@ module ShopifyCLI
|
|
35
33
|
file_name = File.basename(file_path).gsub(".rb", "")
|
36
34
|
file_name_components = file_name.split("_")
|
37
35
|
date_timestamp = file_name_components[0].to_i
|
38
|
-
migration_name = file_name_components
|
36
|
+
migration_name = file_name_components.drop(1).join("_")
|
39
37
|
|
40
38
|
Migrator::Migration.new(
|
41
39
|
name: migration_name,
|
@@ -45,4 +43,4 @@ module ShopifyCLI
|
|
45
43
|
end
|
46
44
|
end
|
47
45
|
end
|
48
|
-
end
|
46
|
+
end
|
@@ -20,7 +20,7 @@ module ShopifyCLI
|
|
20
20
|
class << self
|
21
21
|
attr_accessor :ctx
|
22
22
|
|
23
|
-
def start(ctx, root, port: 9292, poll: false)
|
23
|
+
def start(ctx, root, bind: "127.0.0.1", port: 9292, poll: false)
|
24
24
|
@ctx = ctx
|
25
25
|
theme = DevelopmentTheme.new(ctx, root: root)
|
26
26
|
ignore_filter = IgnoreFilter.from_path(root)
|
@@ -74,6 +74,7 @@ module ShopifyCLI
|
|
74
74
|
watcher.start
|
75
75
|
WebServer.run(
|
76
76
|
@app,
|
77
|
+
BindAddress: bind,
|
77
78
|
Port: port,
|
78
79
|
Logger: logger,
|
79
80
|
AccessLog: [],
|
data/lib/shopify_cli/version.rb
CHANGED
data/shopify-cli.gemspec
CHANGED
@@ -33,11 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
end
|
34
34
|
spec.bindir = "bin"
|
35
35
|
spec.require_paths = ["lib", "vendor"]
|
36
|
-
spec.
|
37
|
-
# Do NOT include `shopify` as a listed executable via `spec.executables`.
|
38
|
-
# `ext/shopify-cli/extconf.rb` will dynamically create a script and soft-link
|
39
|
-
# `/usr/local/bin/shopify` to that script, in order to "lock" the Ruby used to
|
40
|
-
# a single Ruby (useful for debugging in multi-Ruby environments)
|
36
|
+
spec.executables << "shopify"
|
41
37
|
|
42
38
|
spec.add_development_dependency("bundler", "~> 2.2.2")
|
43
39
|
spec.add_development_dependency("rake", "~> 12.3", ">= 12.3.3")
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require "open3"
|
2
|
+
require "colorize"
|
2
3
|
|
3
4
|
module Utilities
|
4
5
|
module Docker
|
5
6
|
class Container
|
7
|
+
SHOPIFY_PATH = "/usr/src/app"
|
6
8
|
SHOPIFY_BIN_PATH = "/usr/src/app/bin/shopify"
|
7
9
|
|
8
10
|
Error = Class.new(StandardError)
|
@@ -55,6 +57,10 @@ module Utilities
|
|
55
57
|
end
|
56
58
|
|
57
59
|
def exec(*args, relative_dir: nil)
|
60
|
+
if ARGV.include?("--verbose")
|
61
|
+
running_prefix = "Running command: #{args.join(" ")}"
|
62
|
+
STDOUT.puts(running_prefix.colorize(:yellow).bold)
|
63
|
+
end
|
58
64
|
command = ["docker", "exec"]
|
59
65
|
cwd = if relative_dir.nil?
|
60
66
|
@cwd
|
@@ -68,8 +74,23 @@ module Utilities
|
|
68
74
|
command << @id
|
69
75
|
command += args
|
70
76
|
|
71
|
-
|
72
|
-
|
77
|
+
docker_prefix = "Docker (#{args.first}):"
|
78
|
+
|
79
|
+
if ARGV.include?("--verbose")
|
80
|
+
stat = Open3.popen3(*command) do |stdin, stdout, stderr, wait_thread|
|
81
|
+
Thread.new do
|
82
|
+
stdout.each { |l| STDOUT.puts("#{docker_prefix.colorize(:cyan).bold} #{l}") }
|
83
|
+
stderr.each { |l| STDERR.puts("#{docker_prefix.colorize(:red).bold} #{l}") }
|
84
|
+
end
|
85
|
+
stdin.close
|
86
|
+
|
87
|
+
wait_thread.value
|
88
|
+
end
|
89
|
+
raise StandardError, "The command #{args.first} failed" unless stat.success?
|
90
|
+
else
|
91
|
+
out, stat = Open3.capture2e(*command)
|
92
|
+
raise Error, out unless stat.success?
|
93
|
+
end
|
73
94
|
end
|
74
95
|
end
|
75
96
|
end
|
data/utilities/docker.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: 2.6.
|
4
|
+
version: 2.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -107,9 +107,9 @@ description: |
|
|
107
107
|
and webhooks.
|
108
108
|
email:
|
109
109
|
- dev-tools-education@shopify.com
|
110
|
-
executables:
|
111
|
-
|
112
|
-
|
110
|
+
executables:
|
111
|
+
- shopify
|
112
|
+
extensions: []
|
113
113
|
extra_rdoc_files: []
|
114
114
|
files:
|
115
115
|
- ".github/CODEOWNERS"
|
@@ -155,7 +155,6 @@ files:
|
|
155
155
|
- docs/getting-started/upgrade/index.md
|
156
156
|
- docs/help/start-app/index.md
|
157
157
|
- docs/index.md
|
158
|
-
- ext/shopify-cli/extconf.rb
|
159
158
|
- ext/shopify-extensions/extconf.rb
|
160
159
|
- ext/shopify-extensions/shopify_extensions.rb
|
161
160
|
- ext/shopify-extensions/version
|
@@ -250,6 +249,7 @@ files:
|
|
250
249
|
- lib/project_types/extension/tasks/create_extension.rb
|
251
250
|
- lib/project_types/extension/tasks/fetch_specifications.rb
|
252
251
|
- lib/project_types/extension/tasks/find_npm_packages.rb
|
252
|
+
- lib/project_types/extension/tasks/find_package_from_json.rb
|
253
253
|
- lib/project_types/extension/tasks/get_app.rb
|
254
254
|
- lib/project_types/extension/tasks/get_apps.rb
|
255
255
|
- lib/project_types/extension/tasks/get_extensions.rb
|
@@ -300,7 +300,6 @@ files:
|
|
300
300
|
- lib/project_types/script/errors.rb
|
301
301
|
- lib/project_types/script/forms/create.rb
|
302
302
|
- lib/project_types/script/graphql/app_script_set.graphql
|
303
|
-
- lib/project_types/script/graphql/app_script_update_or_create.graphql
|
304
303
|
- lib/project_types/script/graphql/get_app_scripts.graphql
|
305
304
|
- lib/project_types/script/graphql/module_upload_url_generate.graphql
|
306
305
|
- lib/project_types/script/graphql/script_service_proxy.graphql
|
data/ext/shopify-cli/extconf.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require "rbconfig"
|
2
|
-
require "fileutils"
|
3
|
-
require "date"
|
4
|
-
|
5
|
-
gem = File.expand_path("../../../", __FILE__)
|
6
|
-
exe = File.join(gem, "bin", "shopify")
|
7
|
-
|
8
|
-
# `--skip-cli-build` will be passed from the brew `shopify-cli.rb` formula, so
|
9
|
-
# as to prevent this extension builder doing the script and sym-link creation;
|
10
|
-
# the brew install process takes care of these itself - see
|
11
|
-
# https://github.com/Shopify/homebrew-shopify/shopify-cli.rb
|
12
|
-
if ARGV && ARGV[0]&.match(/skip-cli-build/)
|
13
|
-
makefile_content = <<~MAKEFILE
|
14
|
-
.PHONY: clean
|
15
|
-
|
16
|
-
clean: ;
|
17
|
-
|
18
|
-
install: ;
|
19
|
-
MAKEFILE
|
20
|
-
elsif RUBY_PLATFORM.match(/mswin|mingw|cygwin/)
|
21
|
-
bat_path = File.dirname(RbConfig.ruby)
|
22
|
-
bat = "#{bat_path}\\shopify.bat"
|
23
|
-
|
24
|
-
script_content = "#{RbConfig.ruby} -I '#{gem}' '#{exe}' %*"
|
25
|
-
|
26
|
-
FileUtils.mkdir_p(bat_path)
|
27
|
-
makefile_content = <<~MAKEFILE
|
28
|
-
.PHONY: clean install
|
29
|
-
|
30
|
-
clean:
|
31
|
-
\t rm -f "#{bat}"
|
32
|
-
|
33
|
-
install: clean
|
34
|
-
\t echo "@ECHO OFF"> "#{bat}"
|
35
|
-
\t echo "#{script_content}">> "#{bat}"
|
36
|
-
MAKEFILE
|
37
|
-
else
|
38
|
-
script = exe + ".sh"
|
39
|
-
symlink = "/usr/local/bin/shopify"
|
40
|
-
|
41
|
-
script_content = <<~SCRIPT
|
42
|
-
#!/usr/bin/env bash
|
43
|
-
#{RbConfig.ruby} -I #{gem} #{exe} $@
|
44
|
-
SCRIPT
|
45
|
-
|
46
|
-
File.write(script, script_content)
|
47
|
-
FileUtils.chmod("+x", script)
|
48
|
-
|
49
|
-
makefile_content = <<~MAKEFILE
|
50
|
-
.PHONY: clean install
|
51
|
-
|
52
|
-
clean:
|
53
|
-
\t@sudo rm -f #{symlink}
|
54
|
-
|
55
|
-
install: clean
|
56
|
-
\t@sudo ln -s #{script} #{symlink}
|
57
|
-
MAKEFILE
|
58
|
-
end
|
59
|
-
|
60
|
-
File.write("Makefile", makefile_content)
|
File without changes
|