shopify-cli 1.4.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -2
- data/.github/CONTRIBUTING.md +9 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
- data/.github/workflows/release.yml +61 -0
- data/.github/workflows/triage.yml +22 -0
- data/.rubocop.yml +56 -7
- data/.rubocop_todo.yml +4 -13
- data/.travis.yml +1 -0
- data/CHANGELOG.md +27 -1
- data/Gemfile +12 -10
- data/Gemfile.lock +33 -31
- data/README.md +39 -7
- data/RELEASING.md +5 -27
- 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 +11 -11
- data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
- data/lib/project_types/extension/cli.rb +64 -47
- data/lib/project_types/extension/commands/build.rb +3 -3
- data/lib/project_types/extension/commands/create.rb +16 -9
- data/lib/project_types/extension/commands/extension_command.rb +8 -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 +23 -3
- data/lib/project_types/extension/commands/tunnel.rb +12 -12
- data/lib/project_types/extension/extension_project.rb +4 -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 +36 -0
- data/lib/project_types/extension/messages/messages.rb +53 -52
- data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
- data/lib/project_types/extension/models/specification.rb +35 -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 +77 -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 +38 -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 +7 -7
- data/lib/project_types/node/messages/messages.rb +19 -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 +24 -24
- data/lib/project_types/rails/gem.rb +24 -24
- data/lib/project_types/rails/messages/messages.rb +12 -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 +17 -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 +41 -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 +62 -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 +19 -55
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
- data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +46 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +37 -1
- 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 +79 -10
- data/lib/project_types/script/script_project.rb +26 -16
- data/lib/project_types/script/ui/error_handler.rb +141 -45
- 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 +21 -19
- 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 +17 -6
- data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
- 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 +29 -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
|
@@ -4,16 +4,15 @@ module Script
|
|
|
4
4
|
module Layers
|
|
5
5
|
module Infrastructure
|
|
6
6
|
class AssemblyScriptTaskRunner
|
|
7
|
-
BYTECODE_FILE = "
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
BYTECODE_FILE = "build/%{name}.wasm"
|
|
8
|
+
METADATA_FILE = "build/metadata.json"
|
|
9
|
+
SCRIPT_SDK_BUILD = "npm run build"
|
|
10
10
|
|
|
11
|
-
attr_reader :ctx, :script_name
|
|
11
|
+
attr_reader :ctx, :script_name
|
|
12
12
|
|
|
13
|
-
def initialize(ctx, script_name
|
|
13
|
+
def initialize(ctx, script_name)
|
|
14
14
|
@ctx = ctx
|
|
15
15
|
@script_name = script_name
|
|
16
|
-
@script_source_file = script_source_file
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
def build
|
|
@@ -28,7 +27,7 @@ module Script
|
|
|
28
27
|
def install_dependencies
|
|
29
28
|
check_node_version!
|
|
30
29
|
|
|
31
|
-
output, status = ctx.capture2e("npm
|
|
30
|
+
output, status = ctx.capture2e("npm install --no-audit --no-optional --legacy-peer-deps --loglevel error")
|
|
32
31
|
raise Errors::DependencyInstallError, output unless status.success?
|
|
33
32
|
end
|
|
34
33
|
|
|
@@ -39,46 +38,78 @@ module Script
|
|
|
39
38
|
true
|
|
40
39
|
end
|
|
41
40
|
|
|
41
|
+
def metadata
|
|
42
|
+
unless @ctx.file_exist?(METADATA_FILE)
|
|
43
|
+
msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
|
|
44
|
+
raise Domain::Errors::MetadataNotFoundError, msg
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
raw_contents = File.read(METADATA_FILE)
|
|
48
|
+
Domain::Metadata.create_from_json(@ctx, raw_contents)
|
|
49
|
+
end
|
|
50
|
+
|
|
42
51
|
private
|
|
43
52
|
|
|
44
53
|
def check_node_version!
|
|
45
54
|
output, status = @ctx.capture2e("node", "--version")
|
|
46
55
|
raise Errors::DependencyInstallError, output unless status.success?
|
|
47
56
|
|
|
48
|
-
require
|
|
57
|
+
require "semantic/semantic"
|
|
49
58
|
version = ::Semantic::Version.new(output[1..-1])
|
|
50
|
-
unless version >= ::Semantic::Version.new(
|
|
51
|
-
raise Errors::DependencyInstallError,
|
|
59
|
+
unless version >= ::Semantic::Version.new(AssemblyScriptProjectCreator::MIN_NODE_VERSION)
|
|
60
|
+
raise Errors::DependencyInstallError,
|
|
61
|
+
"Node version must be >= v#{AssemblyScriptProjectCreator::MIN_NODE_VERSION}. "\
|
|
62
|
+
"Current version: #{output.strip}."
|
|
52
63
|
end
|
|
53
64
|
end
|
|
54
65
|
|
|
55
66
|
def compile
|
|
56
|
-
|
|
67
|
+
check_compilation_dependencies!
|
|
68
|
+
|
|
69
|
+
out, status = ctx.capture2e(SCRIPT_SDK_BUILD)
|
|
57
70
|
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
58
71
|
end
|
|
59
72
|
|
|
73
|
+
def check_compilation_dependencies!
|
|
74
|
+
pkg = JSON.parse(File.read("package.json"))
|
|
75
|
+
build_script = pkg.dig("scripts", "build")
|
|
76
|
+
|
|
77
|
+
raise Errors::BuildScriptNotFoundError,
|
|
78
|
+
"Build script not found" if build_script.nil?
|
|
79
|
+
|
|
80
|
+
unless build_script.start_with?("shopify-scripts")
|
|
81
|
+
raise Errors::InvalidBuildScriptError, "Invalid build script"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
60
85
|
def bytecode
|
|
61
|
-
|
|
86
|
+
blob = format(BYTECODE_FILE, name: script_name)
|
|
87
|
+
raise Errors::WebAssemblyBinaryNotFoundError unless @ctx.file_exist?(blob)
|
|
88
|
+
|
|
89
|
+
contents = File.read(blob)
|
|
90
|
+
@ctx.rm(blob)
|
|
91
|
+
|
|
92
|
+
contents
|
|
62
93
|
end
|
|
63
94
|
|
|
64
95
|
def check_if_ep_dependencies_up_to_date!
|
|
65
|
-
return true if ENV[
|
|
96
|
+
return true if ENV["SHOPIFY_CLI_SCRIPTS_IGNORE_OUTDATED"]
|
|
66
97
|
|
|
67
98
|
# ignore exit code since it will not be 0 unless every package is up to date which they probably won't be
|
|
68
99
|
out, _ = ctx.capture2e("npm", "outdated", "--json", "--depth", "0")
|
|
69
100
|
parsed_outdated_check = JSON.parse(out)
|
|
70
101
|
outdated_ep_packages = parsed_outdated_check
|
|
71
|
-
.select { |package_name, _| package_name.start_with?(
|
|
102
|
+
.select { |package_name, _| package_name.start_with?("@shopify/extension-point-as-") }
|
|
72
103
|
.select { |_, version_info| !package_is_up_to_date?(version_info) }
|
|
73
104
|
.keys
|
|
74
105
|
raise Errors::PackagesOutdatedError.new(outdated_ep_packages),
|
|
75
|
-
"NPM packages out of date: #{outdated_ep_packages.join(
|
|
106
|
+
"NPM packages out of date: #{outdated_ep_packages.join(", ")}" unless outdated_ep_packages.empty?
|
|
76
107
|
end
|
|
77
108
|
|
|
78
109
|
def package_is_up_to_date?(version_info)
|
|
79
|
-
require
|
|
80
|
-
current_version = version_info[
|
|
81
|
-
latest_version = version_info[
|
|
110
|
+
require "semantic/semantic"
|
|
111
|
+
current_version = version_info["current"]
|
|
112
|
+
latest_version = version_info["latest"]
|
|
82
113
|
|
|
83
114
|
# making an assumption that the script developer knows what they're doing if they're not referencing a
|
|
84
115
|
# semver version
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Script
|
|
4
|
+
module Layers
|
|
5
|
+
module Infrastructure
|
|
6
|
+
class ConfigUiRepository
|
|
7
|
+
include SmartProperties
|
|
8
|
+
property! :ctx, accepts: ShopifyCli::Context
|
|
9
|
+
|
|
10
|
+
def create_config_ui(filename, content)
|
|
11
|
+
File.write(filename, content)
|
|
12
|
+
|
|
13
|
+
Domain::ConfigUi.new(
|
|
14
|
+
filename: filename,
|
|
15
|
+
content: content,
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_config_ui(filename)
|
|
20
|
+
return nil unless filename
|
|
21
|
+
|
|
22
|
+
path = File.join(ctx.root, filename)
|
|
23
|
+
raise Domain::Errors::MissingSpecifiedConfigUiDefinitionError, filename unless File.exist?(path)
|
|
24
|
+
|
|
25
|
+
content = File.read(path)
|
|
26
|
+
raise Domain::Errors::InvalidConfigUiDefinitionError, filename unless valid_config_ui?(content)
|
|
27
|
+
|
|
28
|
+
Domain::ConfigUi.new(
|
|
29
|
+
filename: filename,
|
|
30
|
+
content: content,
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def valid_config_ui?(raw_yaml)
|
|
37
|
+
require "yaml" # takes 20ms, so deferred as late as possible.
|
|
38
|
+
YAML.safe_load(raw_yaml)
|
|
39
|
+
true
|
|
40
|
+
rescue Psych::SyntaxError
|
|
41
|
+
false
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -8,8 +8,30 @@ module Script
|
|
|
8
8
|
class AppScriptNotPushedError < ScriptProjectError; end
|
|
9
9
|
class AppScriptUndefinedError < ScriptProjectError; end
|
|
10
10
|
class BuildError < ScriptProjectError; end
|
|
11
|
+
class ConfigUiSyntaxError < ScriptProjectError; end
|
|
12
|
+
|
|
13
|
+
class ConfigUiMissingKeysError < ScriptProjectError
|
|
14
|
+
attr_reader :filename, :missing_keys
|
|
15
|
+
def initialize(filename, missing_keys)
|
|
16
|
+
super()
|
|
17
|
+
@filename = filename
|
|
18
|
+
@missing_keys = missing_keys
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class ConfigUiFieldsMissingKeysError < ScriptProjectError
|
|
23
|
+
attr_reader :filename, :missing_keys
|
|
24
|
+
def initialize(filename, missing_keys)
|
|
25
|
+
super()
|
|
26
|
+
@filename = filename
|
|
27
|
+
@missing_keys = missing_keys
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
11
31
|
class DependencyInstallError < ScriptProjectError; end
|
|
32
|
+
class EmptyResponseError < ScriptProjectError; end
|
|
12
33
|
class ForbiddenError < ScriptProjectError; end
|
|
34
|
+
|
|
13
35
|
class GraphqlError < ScriptProjectError
|
|
14
36
|
attr_reader :errors
|
|
15
37
|
def initialize(errors)
|
|
@@ -17,7 +39,9 @@ module Script
|
|
|
17
39
|
super("GraphQL failed with errors: #{errors}")
|
|
18
40
|
end
|
|
19
41
|
end
|
|
42
|
+
|
|
20
43
|
class ProjectCreatorNotFoundError < ScriptProjectError; end
|
|
44
|
+
|
|
21
45
|
class ScriptRepushError < ScriptProjectError
|
|
22
46
|
attr_reader :api_key
|
|
23
47
|
def initialize(api_key)
|
|
@@ -25,22 +49,34 @@ module Script
|
|
|
25
49
|
@api_key = api_key
|
|
26
50
|
end
|
|
27
51
|
end
|
|
52
|
+
|
|
28
53
|
class ScriptServiceUserError < ScriptProjectError
|
|
29
54
|
def initialize(query_name, errors)
|
|
30
55
|
super("Failed performing #{query_name}. Errors: #{errors}.")
|
|
31
56
|
end
|
|
32
57
|
end
|
|
58
|
+
|
|
33
59
|
class ShopAuthenticationError < ScriptProjectError; end
|
|
34
60
|
class ShopScriptConflictError < ScriptProjectError; end
|
|
35
61
|
class ShopScriptUndefinedError < ScriptProjectError; end
|
|
36
62
|
class TaskRunnerNotFoundError < ScriptProjectError; end
|
|
63
|
+
|
|
37
64
|
class PackagesOutdatedError < ScriptProjectError
|
|
38
65
|
attr_reader :outdated_packages
|
|
39
66
|
def initialize(outdated_packages)
|
|
40
|
-
super("EP packages are outdated and need to be updated: #{outdated_packages.join(
|
|
67
|
+
super("EP packages are outdated and need to be updated: #{outdated_packages.join(", ")}")
|
|
41
68
|
@outdated_packages = outdated_packages
|
|
42
69
|
end
|
|
43
70
|
end
|
|
71
|
+
|
|
72
|
+
class BuildScriptNotFoundError < ScriptProjectError; end
|
|
73
|
+
class InvalidBuildScriptError < ScriptProjectError; end
|
|
74
|
+
|
|
75
|
+
class WebAssemblyBinaryNotFoundError < ScriptProjectError
|
|
76
|
+
def initialize
|
|
77
|
+
super("WebAssembly binary not found")
|
|
78
|
+
end
|
|
79
|
+
end
|
|
44
80
|
end
|
|
45
81
|
end
|
|
46
82
|
end
|
|
@@ -8,21 +8,27 @@ module Script
|
|
|
8
8
|
Domain::ExtensionPoint.new(type, fetch_extension_point(type))
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
def extension_points
|
|
12
|
+
extension_point_configs.map do |type, extension_point_config|
|
|
13
|
+
Domain::ExtensionPoint.new(type, extension_point_config)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
11
17
|
def extension_point_types
|
|
12
|
-
|
|
18
|
+
extension_point_configs.keys
|
|
13
19
|
end
|
|
14
20
|
|
|
15
21
|
private
|
|
16
22
|
|
|
17
23
|
def fetch_extension_point(type)
|
|
18
|
-
raise Domain::Errors::InvalidExtensionPointError, type unless
|
|
19
|
-
|
|
24
|
+
raise Domain::Errors::InvalidExtensionPointError, type unless extension_point_configs[type]
|
|
25
|
+
extension_point_configs[type]
|
|
20
26
|
end
|
|
21
27
|
|
|
22
|
-
def
|
|
28
|
+
def extension_point_configs
|
|
23
29
|
@extension_points ||= begin
|
|
24
|
-
require
|
|
25
|
-
YAML.load_file(Project.project_filepath(
|
|
30
|
+
require "yaml"
|
|
31
|
+
YAML.load_file(Project.project_filepath("config/extension_points.yml"))
|
|
26
32
|
end
|
|
27
33
|
end
|
|
28
34
|
end
|
|
@@ -5,7 +5,8 @@ module Script
|
|
|
5
5
|
module Infrastructure
|
|
6
6
|
class ProjectCreator
|
|
7
7
|
PROJECT_CREATORS = {
|
|
8
|
-
"
|
|
8
|
+
"assemblyscript" => Infrastructure::AssemblyScriptProjectCreator,
|
|
9
|
+
"rust" => Infrastructure::RustProjectCreator,
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
def self.for(ctx, language, extension_point, script_name, path_to_project)
|
|
@@ -7,30 +7,37 @@ module Script
|
|
|
7
7
|
include SmartProperties
|
|
8
8
|
property! :ctx, accepts: ShopifyCli::Context
|
|
9
9
|
|
|
10
|
-
def create_push_package(
|
|
11
|
-
build_file_path = file_path(
|
|
10
|
+
def create_push_package(script_project:, script_content:, compiled_type:, metadata:, config_ui:)
|
|
11
|
+
build_file_path = file_path(script_project.script_name, compiled_type)
|
|
12
12
|
write_to_path(build_file_path, script_content)
|
|
13
13
|
|
|
14
14
|
Domain::PushPackage.new(
|
|
15
|
-
build_file_path,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
id: build_file_path,
|
|
16
|
+
extension_point_type: script_project.extension_point_type,
|
|
17
|
+
script_name: script_project.script_name,
|
|
18
|
+
description: script_project.description,
|
|
19
|
+
script_content: script_content,
|
|
20
|
+
compiled_type: compiled_type,
|
|
21
|
+
metadata: metadata,
|
|
22
|
+
config_ui: config_ui,
|
|
19
23
|
)
|
|
20
24
|
end
|
|
21
25
|
|
|
22
|
-
def get_push_package(
|
|
23
|
-
build_file_path = file_path(
|
|
24
|
-
|
|
26
|
+
def get_push_package(script_project:, compiled_type:, metadata:, config_ui:)
|
|
27
|
+
build_file_path = file_path(script_project.script_name, compiled_type)
|
|
25
28
|
raise Domain::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
|
|
26
29
|
|
|
27
30
|
script_content = File.read(build_file_path)
|
|
28
31
|
|
|
29
32
|
Domain::PushPackage.new(
|
|
30
|
-
build_file_path,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
id: build_file_path,
|
|
34
|
+
extension_point_type: script_project.extension_point_type,
|
|
35
|
+
script_name: script_project.script_name,
|
|
36
|
+
description: script_project.description,
|
|
37
|
+
script_content: script_content,
|
|
38
|
+
compiled_type: compiled_type,
|
|
39
|
+
metadata: metadata,
|
|
40
|
+
config_ui: config_ui,
|
|
34
41
|
)
|
|
35
42
|
end
|
|
36
43
|
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Script
|
|
4
|
+
module Layers
|
|
5
|
+
module Infrastructure
|
|
6
|
+
class RustProjectCreator
|
|
7
|
+
include SmartProperties
|
|
8
|
+
property! :ctx, accepts: ShopifyCli::Context
|
|
9
|
+
property! :extension_point, accepts: Domain::ExtensionPoint
|
|
10
|
+
property! :script_name, accepts: String
|
|
11
|
+
property! :path_to_project, accepts: String
|
|
12
|
+
|
|
13
|
+
ORIGIN_BRANCH = "main"
|
|
14
|
+
SAMPLE_PATH = "default"
|
|
15
|
+
|
|
16
|
+
def setup_dependencies
|
|
17
|
+
git_init
|
|
18
|
+
setup_remote
|
|
19
|
+
setup_sparse_checkout
|
|
20
|
+
pull
|
|
21
|
+
clean
|
|
22
|
+
set_script_name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def bootstrap
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def git_init
|
|
31
|
+
out, status = ctx.capture2e("git init")
|
|
32
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def setup_remote
|
|
36
|
+
repo = extension_point.sdks.rust.package
|
|
37
|
+
out, status = ctx.capture2e("git remote add -f origin #{repo}")
|
|
38
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def setup_sparse_checkout
|
|
42
|
+
type = extension_point.type
|
|
43
|
+
out, status = ctx.capture2e("git config core.sparsecheckout true")
|
|
44
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
45
|
+
out, status = ctx.capture2e("echo #{type}/#{SAMPLE_PATH} >> .git/info/sparse-checkout")
|
|
46
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def pull
|
|
50
|
+
out, status = ctx.capture2e("git pull origin #{ORIGIN_BRANCH}")
|
|
51
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def clean
|
|
55
|
+
type = extension_point.type
|
|
56
|
+
ctx.rm_rf(".git")
|
|
57
|
+
source = File.join(path_to_project, File.join(type, SAMPLE_PATH))
|
|
58
|
+
FileUtils.copy_entry(source, path_to_project)
|
|
59
|
+
ctx.rm_rf(type)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def set_script_name
|
|
63
|
+
config_file = "Cargo.toml"
|
|
64
|
+
upstream_name = "#{extension_point.type.gsub("_", "-")}-default"
|
|
65
|
+
contents = File.read(config_file)
|
|
66
|
+
new_contents = contents.sub(upstream_name, script_name)
|
|
67
|
+
File.write(config_file, new_contents)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Script
|
|
3
|
+
module Layers
|
|
4
|
+
module Infrastructure
|
|
5
|
+
class RustTaskRunner
|
|
6
|
+
attr_reader :ctx, :script_name
|
|
7
|
+
|
|
8
|
+
BUILD_TARGET = "wasm32-unknown-unknown"
|
|
9
|
+
METADATA_FILE = "build/metadata.json"
|
|
10
|
+
|
|
11
|
+
def initialize(ctx, script_name)
|
|
12
|
+
@ctx = ctx
|
|
13
|
+
@script_name = script_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def dependencies_installed?
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def install_dependencies
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def build
|
|
24
|
+
compile
|
|
25
|
+
bytecode
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def compiled_type
|
|
29
|
+
"wasm"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def metadata
|
|
33
|
+
unless @ctx.file_exist?(METADATA_FILE)
|
|
34
|
+
msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
|
|
35
|
+
raise Domain::Errors::MetadataNotFoundError, msg
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
raw_contents = File.read(METADATA_FILE)
|
|
39
|
+
Domain::Metadata.create_from_json(@ctx, raw_contents)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def compile
|
|
45
|
+
out, status = ctx.capture2e("cargo build --target=#{BUILD_TARGET} --release")
|
|
46
|
+
raise Domain::Errors::ServiceFailureError, out unless status.success?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def bytecode
|
|
50
|
+
binary_name = "#{script_name}.wasm"
|
|
51
|
+
binary_path = "target/#{BUILD_TARGET}/release/#{binary_name}"
|
|
52
|
+
raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(binary_path)
|
|
53
|
+
|
|
54
|
+
File.read(binary_path)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|