shopify-cli 2.3.0 → 2.6.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.
Files changed (266) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/workflows/shopify.yml +104 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +14 -14
  6. data/.rubocop_todo.yml +3 -3
  7. data/CHANGELOG.md +26 -0
  8. data/CONTRIBUTING.md +23 -0
  9. data/Dockerfile +17 -0
  10. data/Gemfile +1 -0
  11. data/Gemfile.lock +67 -24
  12. data/README.md +1 -1
  13. data/RELEASING.md +1 -1
  14. data/Rakefile +75 -18
  15. data/bin/console +11 -0
  16. data/bin/shopify +17 -4
  17. data/dev.yml +14 -1
  18. data/ext/shopify-cli/extconf.rb +2 -0
  19. data/ext/shopify-extensions/extconf.rb +21 -0
  20. data/ext/shopify-extensions/shopify_extensions.rb +152 -0
  21. data/ext/shopify-extensions/version +1 -0
  22. data/lib/project_types/extension/cli.rb +19 -3
  23. data/lib/project_types/extension/commands/build.rb +32 -3
  24. data/lib/project_types/extension/commands/check.rb +2 -2
  25. data/lib/project_types/extension/commands/connect.rb +1 -1
  26. data/lib/project_types/extension/commands/create.rb +59 -16
  27. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  28. data/lib/project_types/extension/commands/info.rb +1 -1
  29. data/lib/project_types/extension/commands/push.rb +1 -1
  30. data/lib/project_types/extension/commands/register.rb +2 -2
  31. data/lib/project_types/extension/commands/serve.rb +5 -5
  32. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  33. data/lib/project_types/extension/extension_project.rb +4 -4
  34. data/lib/project_types/extension/features/argo.rb +3 -3
  35. data/lib/project_types/extension/features/argo_config.rb +5 -5
  36. data/lib/project_types/extension/features/argo_serve.rb +21 -6
  37. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  38. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  39. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  40. data/lib/project_types/extension/forms/connect.rb +2 -2
  41. data/lib/project_types/extension/forms/create.rb +6 -3
  42. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  43. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  44. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  45. data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
  46. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  47. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  48. data/lib/project_types/extension/messages/messages.rb +3 -0
  49. data/lib/project_types/extension/models/development_server.rb +78 -0
  50. data/lib/project_types/extension/models/development_server_requirements.rb +35 -0
  51. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  52. data/lib/project_types/extension/models/server_config/base.rb +31 -0
  53. data/lib/project_types/extension/models/server_config/development.rb +23 -0
  54. data/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
  55. data/lib/project_types/extension/models/server_config/development_renderer.rb +30 -0
  56. data/lib/project_types/extension/models/server_config/extension.rb +35 -0
  57. data/lib/project_types/extension/models/server_config/root.rb +18 -0
  58. data/lib/project_types/extension/models/server_config/user.rb +10 -0
  59. data/lib/project_types/extension/models/specification.rb +1 -1
  60. data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
  61. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  62. data/lib/project_types/extension/models/specifications.rb +4 -4
  63. data/lib/project_types/extension/tasks/choose_next_available_port.rb +2 -2
  64. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  65. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  66. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  67. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
  68. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  69. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  70. data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
  71. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  72. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  73. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  74. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  75. data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
  76. data/lib/project_types/extension/tasks/run_extension_command.rb +81 -0
  77. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  78. data/lib/project_types/node/cli.rb +3 -3
  79. data/lib/project_types/node/commands/connect.rb +4 -4
  80. data/lib/project_types/node/commands/create.rb +10 -14
  81. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  82. data/lib/project_types/node/commands/deploy.rb +3 -3
  83. data/lib/project_types/node/commands/generate.rb +2 -2
  84. data/lib/project_types/node/commands/open.rb +3 -3
  85. data/lib/project_types/node/commands/serve.rb +15 -7
  86. data/lib/project_types/node/commands/tunnel.rb +6 -6
  87. data/lib/project_types/node/forms/create.rb +3 -3
  88. data/lib/project_types/node/messages/messages.rb +3 -0
  89. data/lib/project_types/php/cli.rb +27 -0
  90. data/lib/project_types/php/commands/connect.rb +19 -0
  91. data/lib/project_types/php/commands/create.rb +143 -0
  92. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  93. data/lib/project_types/php/commands/deploy.rb +32 -0
  94. data/lib/project_types/php/commands/open.rb +16 -0
  95. data/lib/project_types/php/commands/serve.rb +51 -0
  96. data/lib/project_types/php/commands/tunnel.rb +37 -0
  97. data/lib/project_types/php/forms/create.rb +45 -0
  98. data/lib/project_types/php/messages/messages.rb +191 -0
  99. data/lib/project_types/rails/cli.rb +3 -3
  100. data/lib/project_types/rails/commands/connect.rb +4 -4
  101. data/lib/project_types/rails/commands/create.rb +12 -16
  102. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  103. data/lib/project_types/rails/commands/deploy.rb +3 -3
  104. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  105. data/lib/project_types/rails/commands/generate.rb +3 -3
  106. data/lib/project_types/rails/commands/open.rb +3 -3
  107. data/lib/project_types/rails/commands/serve.rb +8 -8
  108. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  109. data/lib/project_types/rails/forms/create.rb +3 -3
  110. data/lib/project_types/rails/gem.rb +1 -1
  111. data/lib/project_types/rails/ruby.rb +1 -1
  112. data/lib/project_types/script/cli.rb +16 -6
  113. data/lib/project_types/script/commands/create.rb +4 -2
  114. data/lib/project_types/script/commands/push.rb +2 -2
  115. data/lib/project_types/script/config/extension_points.yml +30 -29
  116. data/lib/project_types/script/forms/create.rb +1 -1
  117. data/lib/project_types/script/layers/application/create_script.rb +32 -12
  118. data/lib/project_types/script/layers/application/extension_points.rb +4 -4
  119. data/lib/project_types/script/layers/application/push_script.rb +13 -1
  120. data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
  121. data/lib/project_types/script/layers/domain/push_package.rb +0 -12
  122. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  123. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
  124. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  125. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  126. data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
  127. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
  128. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
  129. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
  130. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
  131. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
  132. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  133. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
  134. data/lib/project_types/script/layers/infrastructure/script_service.rb +25 -144
  135. data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
  136. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  137. data/lib/project_types/script/messages/messages.rb +4 -0
  138. data/lib/project_types/script/tasks/ensure_env.rb +7 -7
  139. data/lib/project_types/script/ui/error_handler.rb +84 -76
  140. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  141. data/lib/project_types/theme/cli.rb +3 -3
  142. data/lib/project_types/theme/commands/check.rb +3 -3
  143. data/lib/project_types/theme/commands/delete.rb +7 -7
  144. data/lib/project_types/theme/commands/init.rb +3 -3
  145. data/lib/project_types/theme/commands/language_server.rb +2 -2
  146. data/lib/project_types/theme/commands/package.rb +2 -2
  147. data/lib/project_types/theme/commands/publish.rb +5 -5
  148. data/lib/project_types/theme/commands/pull.rb +9 -9
  149. data/lib/project_types/theme/commands/push.rb +12 -12
  150. data/lib/project_types/theme/commands/serve.rb +4 -4
  151. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  152. data/lib/project_types/theme/forms/select.rb +2 -2
  153. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  154. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  155. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  156. data/lib/{shopify-cli → shopify_cli}/api.rb +12 -8
  157. data/lib/shopify_cli/command/app_sub_command.rb +16 -0
  158. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  159. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  160. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  161. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  162. data/lib/shopify_cli/commands/logout.rb +39 -0
  163. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  164. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  165. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  166. data/lib/shopify_cli/commands/populate.rb +23 -0
  167. data/lib/shopify_cli/commands/store.rb +15 -0
  168. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  169. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  170. data/lib/shopify_cli/commands/version.rb +15 -0
  171. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  172. data/lib/shopify_cli/commands.rb +34 -0
  173. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  174. data/lib/shopify_cli/constants.rb +54 -0
  175. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  176. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  177. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
  178. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  179. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  180. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  181. data/lib/shopify_cli/core.rb +8 -0
  182. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  183. data/lib/shopify_cli/environment.rb +91 -0
  184. data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
  185. data/lib/shopify_cli/exception_reporter.rb +55 -0
  186. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  187. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  188. data/lib/{shopify-cli → shopify_cli}/git.rb +38 -8
  189. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  190. data/lib/shopify_cli/helpers.rb +5 -0
  191. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  192. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  193. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  194. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +24 -31
  195. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  196. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  197. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  198. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
  199. data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
  200. data/lib/shopify_cli/migrator/migration.rb +27 -0
  201. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
  202. data/lib/shopify_cli/migrator.rb +48 -0
  203. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  204. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  205. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  206. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +16 -40
  207. data/lib/shopify_cli/php_deps.rb +102 -0
  208. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
  209. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  210. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  211. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  212. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  213. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  214. data/lib/shopify_cli/resources.rb +5 -0
  215. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  216. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  217. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  218. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  219. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  220. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  221. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  222. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  223. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  224. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  225. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  226. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  227. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  228. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  229. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  230. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
  231. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  232. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +5 -6
  233. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  234. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
  235. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  236. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  237. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  238. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  239. data/lib/shopify_cli/theme/development_theme.rb +83 -0
  240. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
  241. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
  242. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  243. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
  244. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  245. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  246. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  247. data/lib/shopify_cli/version.rb +3 -0
  248. data/lib/shopify_cli.rb +61 -50
  249. data/shopify-cli.gemspec +13 -5
  250. data/utilities/docker.rb +47 -0
  251. data/utilities/utilities.rb +5 -0
  252. metadata +155 -97
  253. data/.github/workflows/build.yml +0 -28
  254. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
  255. data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
  256. data/lib/shopify-cli/commands/logout.rb +0 -39
  257. data/lib/shopify-cli/commands/populate.rb +0 -23
  258. data/lib/shopify-cli/commands/store.rb +0 -15
  259. data/lib/shopify-cli/commands/version.rb +0 -15
  260. data/lib/shopify-cli/commands.rb +0 -34
  261. data/lib/shopify-cli/core.rb +0 -8
  262. data/lib/shopify-cli/helpers.rb +0 -5
  263. data/lib/shopify-cli/resources.rb +0 -5
  264. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  265. data/lib/shopify-cli/theme/development_theme.rb +0 -69
  266. data/lib/shopify-cli/version.rb +0 -3
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  class Command
5
- class Create < ShopifyCli::SubCommand
5
+ class Create < ShopifyCLI::SubCommand
6
6
  prerequisite_task :ensure_authenticated
7
7
 
8
8
  options do |parser, flags|
@@ -10,6 +10,7 @@ module Script
10
10
  parser.on("--extension_point=EP_NAME") { |ep_name| flags[:extension_point] = ep_name }
11
11
  parser.on("--extension-point=EP_NAME") { |ep_name| flags[:extension_point] = ep_name }
12
12
  parser.on("--language=LANGUAGE") { |language| flags[:language] = language }
13
+ parser.on("--branch=BRANCH") { |branch| flags[:branch] = branch }
13
14
  parser.on("--no-config-ui") { |no_config_ui| flags[:no_config_ui] = no_config_ui }
14
15
  end
15
16
 
@@ -24,6 +25,7 @@ module Script
24
25
  project = Layers::Application::CreateScript.call(
25
26
  ctx: @ctx,
26
27
  language: form.language,
28
+ sparse_checkout_branch: options.flags[:branch] || "master",
27
29
  script_name: form.name,
28
30
  extension_point_type: form.extension_point,
29
31
  no_config_ui: options.flags.key?(:no_config_ui)
@@ -35,7 +37,7 @@ module Script
35
37
 
36
38
  def self.help
37
39
  allowed_values = Script::Layers::Application::ExtensionPoints.available_types.map { |type| "{{cyan:#{type}}}" }
38
- ShopifyCli::Context.message("script.create.help", ShopifyCli::TOOL_NAME, allowed_values.join(", "))
40
+ ShopifyCLI::Context.message("script.create.help", ShopifyCLI::TOOL_NAME, allowed_values.join(", "))
39
41
  end
40
42
  end
41
43
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  class Command
5
- class Push < ShopifyCli::SubCommand
5
+ class Push < ShopifyCLI::SubCommand
6
6
  prerequisite_task ensure_project_type: :script
7
7
 
8
8
  options do |parser, flags|
@@ -28,7 +28,7 @@ module Script
28
28
  end
29
29
 
30
30
  def self.help
31
- ShopifyCli::Context.message("script.push.help", ShopifyCli::TOOL_NAME)
31
+ ShopifyCLI::Context.message("script.push.help", ShopifyCLI::TOOL_NAME)
32
32
  end
33
33
  end
34
34
  end
@@ -1,43 +1,44 @@
1
1
  discount:
2
2
  deprecated: true
3
- assemblyscript:
4
- package: "@shopify/extension-point-as-discount"
5
- sdk-version: "^9.0.0"
6
- toolchain-version: "^5.0.0"
3
+ libraries:
4
+ assemblyscript:
5
+ package: "@shopify/extension-point-as-discount"
7
6
  unit_limit_per_order:
8
7
  beta: true
9
- assemblyscript:
10
- package: "@shopify/extension-point-as-unit-limit-per-order"
11
- sdk-version: "^9.0.0"
12
- toolchain-version: "^5.0.0"
8
+ libraries:
9
+ assemblyscript:
10
+ package: "@shopify/extension-point-as-unit-limit-per-order"
13
11
  payment_filter:
14
12
  deprecated: true
15
- assemblyscript:
16
- package: "@shopify/extension-point-as-payment-filter"
17
- sdk-version: "^9.0.0"
18
- toolchain-version: "^5.0.0"
19
- rust:
20
- beta: true
21
- package: "https://github.com/Shopify/scripts-apis-rs"
13
+ libraries:
14
+ assemblyscript:
15
+ package: "@shopify/extension-point-as-payment-filter"
22
16
  shipping_filter:
23
17
  deprecated: true
24
- assemblyscript:
25
- package: "@shopify/extension-point-as-shipping-filter"
26
- sdk-version: "^9.0.0"
27
- toolchain-version: "^5.0.0"
18
+ libraries:
19
+ assemblyscript:
20
+ package: "@shopify/extension-point-as-shipping-filter"
28
21
  tax_filter:
29
22
  beta: true
30
- assemblyscript:
31
- package: "@shopify/extension-point-as-tax-filter"
32
- sdk-version: "^9.0.0"
33
- toolchain-version: "^5.0.0"
23
+ libraries:
24
+ assemblyscript:
25
+ repo: "https://github.com/Shopify/extension-points.git"
26
+ package: "@shopify/extension-point-as-tax-filter"
34
27
  payment_methods:
35
28
  domain: 'checkout'
36
- assemblyscript:
37
- package: "@shopify/scripts-checkout-apis"
38
- toolchain-version: "^5.0.0"
29
+ libraries:
30
+ assemblyscript:
31
+ repo: "https://github.com/Shopify/scripts-apis-examples"
32
+ package: "@shopify/scripts-checkout-apis"
33
+ typescript:
34
+ beta: true
35
+ repo: "https://github.com/Shopify/scripts-apis-examples"
39
36
  shipping_methods:
40
37
  domain: 'checkout'
41
- assemblyscript:
42
- package: "@shopify/scripts-checkout-apis"
43
- toolchain-version: "^5.0.0"
38
+ libraries:
39
+ assemblyscript:
40
+ repo: "https://github.com/Shopify/scripts-apis-examples"
41
+ package: "@shopify/scripts-checkout-apis"
42
+ typescript:
43
+ beta: true
44
+ repo: "https://github.com/Shopify/scripts-apis-examples"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  module Forms
5
- class Create < ShopifyCli::Form
5
+ class Create < ShopifyCLI::Form
6
6
  flag_arguments :extension_point, :name, :language
7
7
 
8
8
  def ask
@@ -7,7 +7,7 @@ module Script
7
7
  module Application
8
8
  class CreateScript
9
9
  class << self
10
- def call(ctx:, language:, script_name:, extension_point_type:, no_config_ui:)
10
+ def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type:, no_config_ui:)
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
@@ -18,10 +18,24 @@ module Script
18
18
  extension_point_type: extension_point_type,
19
19
  language: language
20
20
  )
21
- project_creator = Infrastructure::Languages::ProjectCreator
22
- .for(ctx, language, extension_point, script_name, project.id)
21
+
22
+ # remove the need to pass the whole extension-point object to the infra layer
23
+ sparse_checkout_repo = extension_point.libraries.for(language).repo
24
+ type = extension_point.dasherize_type
25
+ domain = extension_point.domain
26
+
27
+ project_creator = Infrastructure::Languages::ProjectCreator.for(
28
+ ctx: ctx,
29
+ language: language,
30
+ type: type,
31
+ project_name: script_name,
32
+ path_to_project: project.id,
33
+ sparse_checkout_repo: sparse_checkout_repo,
34
+ sparse_checkout_branch: sparse_checkout_branch,
35
+ sparse_checkout_set_path: "#{domain}/#{language}/#{type}/default"
36
+ )
37
+
23
38
  install_dependencies(ctx, language, script_name, project_creator)
24
- bootstrap(ctx, project_creator)
25
39
  script_project_repo.update_or_create_script_json(title: script_name, configuration_ui: !no_config_ui)
26
40
  project
27
41
  end
@@ -31,15 +45,21 @@ module Script
31
45
 
32
46
  def install_dependencies(ctx, language, script_name, project_creator)
33
47
  task_runner = Infrastructure::Languages::TaskRunner.for(ctx, language, script_name)
34
- project_creator.setup_dependencies
35
- ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
36
- end
37
-
38
- def bootstrap(ctx, project_creator)
39
- UI::StrictSpinner.spin(ctx.message("script.create.creating")) do |spinner|
40
- project_creator.bootstrap
41
- spinner.update_title(ctx.message("script.create.created"))
48
+ CLI::UI::Frame.open(ctx.message(
49
+ "core.git.pulling_from_to",
50
+ project_creator.sparse_checkout_repo,
51
+ script_name,
52
+ )) do
53
+ UI::StrictSpinner.spin(ctx.message(
54
+ "core.git.pulling",
55
+ project_creator.sparse_checkout_repo,
56
+ script_name,
57
+ )) do |spinner|
58
+ project_creator.setup_dependencies
59
+ spinner.update_title(ctx.message("core.git.pulled", script_name))
60
+ end
42
61
  end
62
+ ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
43
63
  end
44
64
 
45
65
  def in_new_directory_context(ctx, directory)
@@ -15,7 +15,7 @@ module Script
15
15
  def self.available_types
16
16
  Infrastructure::ExtensionPointRepository.new.extension_points.select do |ep|
17
17
  next false if ep.deprecated?
18
- !ep.beta? || ShopifyCli::Feature.enabled?(:scripts_beta_extension_points)
18
+ !ep.beta? || ShopifyCLI::Feature.enabled?(:scripts_beta_extension_points)
19
19
  end.map(&:type)
20
20
  end
21
21
 
@@ -27,9 +27,9 @@ module Script
27
27
  end
28
28
 
29
29
  def self.languages(type:)
30
- get(type: type).sdks.all.map do |sdk|
31
- next nil if sdk.beta? && !ShopifyCli::Feature.enabled?(:scripts_beta_languages)
32
- sdk.class.language
30
+ get(type: type).libraries.all.map do |library|
31
+ next nil if library.beta? && !ShopifyCLI::Feature.enabled?(:scripts_beta_languages)
32
+ library.language
33
33
  end.compact
34
34
  end
35
35
 
@@ -20,7 +20,19 @@ module Script
20
20
  compiled_type: task_runner.compiled_type,
21
21
  metadata: task_runner.metadata,
22
22
  )
23
- uuid = package.push(Infrastructure::ScriptService.new(ctx: p_ctx), script_project.api_key, force)
23
+ script_service = Infrastructure::ServiceLocator.script_service(
24
+ ctx: p_ctx,
25
+ api_key: script_project.api_key
26
+ )
27
+ module_upload_url = Infrastructure::ScriptUploader.new(script_service).upload(package.script_content)
28
+ uuid = script_service.set_app_script(
29
+ uuid: package.uuid,
30
+ extension_point_type: package.extension_point_type,
31
+ force: force,
32
+ metadata: package.metadata,
33
+ script_json: package.script_json,
34
+ module_upload_url: module_upload_url,
35
+ )
24
36
  script_project_repo.update_env(uuid: uuid)
25
37
  spinner.update_title(p_ctx.message("script.application.pushed"))
26
38
  end
@@ -4,14 +4,14 @@ module Script
4
4
  module Layers
5
5
  module Domain
6
6
  class ExtensionPoint
7
- attr_reader :type, :beta, :deprecated, :sdks, :domain
7
+ attr_reader :type, :beta, :deprecated, :libraries, :domain
8
8
 
9
9
  def initialize(type, config)
10
10
  @type = type
11
11
  @beta = config["beta"] || false
12
12
  @deprecated = config["deprecated"] || false
13
13
  @domain = config["domain"] || nil
14
- @sdks = ExtensionPointSDKs.new(config)
14
+ @libraries = ExtensionPointLibraries.new(config["libraries"])
15
15
  end
16
16
 
17
17
  def beta?
@@ -26,39 +26,31 @@ module Script
26
26
  @type.gsub("_", "-")
27
27
  end
28
28
 
29
- class ExtensionPointSDKs
29
+ class ExtensionPointLibraries
30
30
  def initialize(config)
31
31
  @config = config
32
32
  end
33
33
 
34
34
  def all
35
- [assemblyscript, rust].compact
35
+ @all ||= @config.map do |language, libray_config|
36
+ ExtensionPointLibrary.new(language, libray_config)
37
+ end
36
38
  end
37
39
 
38
- def assemblyscript
39
- @assemblyscript ||= new_sdk(ExtensionPointAssemblyScriptSDK)
40
- end
41
-
42
- def rust
43
- @rust ||= new_sdk(ExtensionPointRustSDK)
44
- end
45
-
46
- private
47
-
48
- def new_sdk(klass)
49
- config = @config[klass.language]
50
- return nil if config.nil?
51
- klass.new(config)
40
+ def for(language)
41
+ all.find { |ep| ep.language == language }
52
42
  end
53
43
  end
54
44
 
55
- class ExtensionPointSDK
56
- attr_reader :version, :beta, :package
45
+ class ExtensionPointLibrary
46
+ attr_reader :language, :version, :beta, :package, :repo
57
47
 
58
- def initialize(config)
48
+ def initialize(language, config)
49
+ @language = language
59
50
  @beta = config["beta"] || false
60
51
  @package = config["package"]
61
52
  @version = config["package-version"]
53
+ @repo = config["repo"]
62
54
  end
63
55
 
64
56
  def beta?
@@ -68,30 +60,6 @@ module Script
68
60
  def versioned?
69
61
  @version
70
62
  end
71
-
72
- def self.language
73
- raise NotImplementedError
74
- end
75
- end
76
-
77
- class ExtensionPointAssemblyScriptSDK < ExtensionPointSDK
78
- attr_reader :sdk_version, :toolchain_version
79
-
80
- def initialize(config)
81
- super
82
- @sdk_version = config["sdk-version"]
83
- @toolchain_version = config["toolchain-version"]
84
- end
85
-
86
- def self.language
87
- "assemblyscript"
88
- end
89
- end
90
-
91
- class ExtensionPointRustSDK < ExtensionPointSDK
92
- def self.language
93
- "rust"
94
- end
95
63
  end
96
64
  end
97
65
  end
@@ -29,18 +29,6 @@ module Script
29
29
  @metadata = metadata
30
30
  @script_json = script_json
31
31
  end
32
-
33
- def push(script_service, api_key, force)
34
- script_service.push(
35
- uuid: @uuid,
36
- extension_point_type: @extension_point_type,
37
- script_content: @script_content,
38
- api_key: api_key,
39
- force: force,
40
- metadata: @metadata,
41
- script_json: @script_json,
42
- )
43
- end
44
32
  end
45
33
  end
46
34
  end
@@ -9,7 +9,7 @@ module Script
9
9
  UUID_ENV_KEY = "UUID"
10
10
 
11
11
  property! :id, accepts: String
12
- property :env, accepts: ShopifyCli::Resources::EnvFile
12
+ property :env, accepts: ShopifyCLI::Resources::EnvFile
13
13
 
14
14
  property! :extension_point_type, accepts: String
15
15
  property! :script_name, accepts: String
@@ -20,7 +20,7 @@ module Script
20
20
  def initialize(*)
21
21
  super
22
22
 
23
- ShopifyCli::Core::Monorail.metadata = {
23
+ ShopifyCLI::Core::Monorail.metadata = {
24
24
  "script_name" => script_name,
25
25
  "extension_point_type" => extension_point_type,
26
26
  "language" => language,
@@ -0,0 +1,57 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ module ApiClients
5
+ class PartnersProxyApiClient
6
+ def initialize(ctx, api_key)
7
+ @ctx = ctx
8
+ @api_key = api_key
9
+ end
10
+
11
+ def query(query_name, variables: {})
12
+ proxy_response = ShimAPI.query(@ctx, query_name, api_key: @api_key, variables: variables.to_json)
13
+ raise_if_graphql_failed(proxy_response)
14
+
15
+ response = proxy_response.dig("data", "scriptServiceProxy")
16
+ raise Errors::InvalidResponseError unless response
17
+
18
+ JSON.parse(response)
19
+ end
20
+
21
+ private
22
+
23
+ def raise_if_graphql_failed(response)
24
+ raise Errors::EmptyResponseError if response.nil?
25
+
26
+ return unless response.key?("errors")
27
+ case error_code(response["errors"])
28
+ when "forbidden"
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
+ else
35
+ raise Errors::GraphqlError, response["errors"]
36
+ end
37
+ end
38
+
39
+ def error_code(errors)
40
+ errors.map do |e|
41
+ code = e.dig("extensions", "code")
42
+ return code if code
43
+ end
44
+ end
45
+
46
+ class ShimAPI < ShopifyCLI::PartnersAPI
47
+ def query(query_name, variables: {})
48
+ variables[:query] = load_query(query_name)
49
+ super("script_service_proxy", variables: variables)
50
+ end
51
+ end
52
+ private_constant(:ShimAPI)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,35 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ module ApiClients
5
+ class ScriptServiceApiClient
6
+ LOCAL_INSTANCE_URL = "https://script-service.myshopify.io"
7
+
8
+ def initialize(ctx, api_key)
9
+ instance_url = script_service_url
10
+ @api = ShopifyCLI::API.new(
11
+ ctx: ctx,
12
+ url: "#{instance_url}/graphql",
13
+ token: { "APP_KEY" => api_key }.compact.to_json,
14
+ auth_header: "X-Shopify-Authenticated-Tokens"
15
+ )
16
+ end
17
+
18
+ def query(query_name, variables: {})
19
+ @api.query(query_name, variables: variables)
20
+ end
21
+
22
+ private
23
+
24
+ def script_service_url
25
+ if ::ShopifyCLI::Environment.use_spin?
26
+ "https://script-service.#{::ShopifyCLI::Environment.spin_url}"
27
+ else
28
+ LOCAL_INSTANCE_URL
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,7 +6,7 @@ module Script
6
6
  class CommandRunner
7
7
  include SmartProperties
8
8
 
9
- property! :ctx, accepts: ShopifyCli::Context
9
+ property! :ctx, accepts: ShopifyCLI::Context
10
10
 
11
11
  def call(cmd)
12
12
  out, status = ctx.capture2e(cmd)
@@ -43,6 +43,7 @@ module Script
43
43
  class DependencyInstallError < ScriptProjectError; end
44
44
  class DeprecatedEPError < ScriptProjectError; end
45
45
  class EmptyResponseError < ScriptProjectError; end
46
+ class InvalidResponseError < ScriptProjectError; end
46
47
  class ForbiddenError < ScriptProjectError; end
47
48
  class InvalidContextError < ScriptProjectError; end
48
49
 
@@ -94,7 +95,11 @@ module Script
94
95
  end
95
96
  end
96
97
 
98
+ class InvalidProjectError < ScriptProjectError; end
99
+
97
100
  class ScriptUploadError < ScriptProjectError; end
101
+ class ProjectConfigNotFoundError < ScriptProjectError; end
102
+ class InvalidProjectConfigError < ScriptProjectError; end
98
103
  end
99
104
  end
100
105
  end
@@ -4,99 +4,19 @@ module Script
4
4
  module Layers
5
5
  module Infrastructure
6
6
  module Languages
7
- class AssemblyScriptProjectCreator
8
- include SmartProperties
9
- property! :ctx, accepts: ShopifyCli::Context
10
- property! :extension_point, accepts: Domain::ExtensionPoint
11
- property! :script_name, accepts: String
12
- property! :path_to_project, accepts: String
7
+ class AssemblyScriptProjectCreator < ProjectCreator
8
+ MIN_NODE_VERSION = "14.5.0" # kept because task_runner uses this
9
+ NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
10
+ NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
13
11
 
14
- BOOTSTRAP = "npx --no-install shopify-scripts-toolchain-as bootstrap --from %{extension_point} --dest %{base}"
15
- BUILD = "shopify-scripts-toolchain-as build --src src/shopify_main.ts " \
16
- "--binary build/script.wasm --metadata build/metadata.json"
17
- MIN_NODE_VERSION = "14.5.0"
18
- ASC_ARGS = "-- --lib node_modules --optimize --use Date="
19
-
20
- def setup_dependencies
21
- write_npmrc
22
- write_package_json
23
- end
24
-
25
- def bootstrap
26
- command_runner.call(bootstap_command)
27
- end
28
-
29
- private
30
-
31
- def command_runner
32
- @command_runner ||= CommandRunner.new(ctx: ctx)
33
- end
34
-
35
- def write_npmrc
36
- command_runner.call("npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com")
37
- command_runner.call("npm --userconfig ./.npmrc config set engine-strict true")
38
- end
39
-
40
- def extension_point_version
41
- return extension_point.sdks.assemblyscript.version if extension_point.sdks.assemblyscript.versioned?
42
-
43
- out = command_runner.call("npm show #{extension_point.sdks.assemblyscript.package} version --json")
44
- "^#{JSON.parse(out)}"
12
+ def self.config_file
13
+ "package.json"
45
14
  end
46
15
 
47
- def write_package_json
48
- package_json = {
49
- name: script_name,
50
- version: "1.0.0",
51
- devDependencies: dev_dependencies,
52
- scripts: {
53
- test: "asp --summary --verbose",
54
- build: build_command,
55
- },
56
- engines: {
57
- node: ">=#{MIN_NODE_VERSION}",
58
- },
59
- }
60
-
61
- ctx.write("package.json", JSON.pretty_generate(package_json))
62
- end
63
-
64
- def bootstap_command
65
- type = extension_point.dasherize_type
66
- base_command = format(BOOTSTRAP, extension_point: type, base: path_to_project)
67
- domain = extension_point.domain
68
-
69
- if domain.nil?
70
- base_command
71
- else
72
- "#{base_command} --domain #{domain}"
73
- end
74
- end
75
-
76
- def build_command
77
- type = extension_point.dasherize_type
78
- domain = extension_point.domain
79
-
80
- if domain.nil?
81
- "#{BUILD} #{ASC_ARGS}"
82
- else
83
- "#{BUILD} --domain #{domain} --ep #{type} #{ASC_ARGS}"
84
- end
85
- end
86
-
87
- def dev_dependencies
88
- dependencies = {
89
- "@as-pect/cli": "^6.0.0",
90
- "assemblyscript": "^0.18.13",
91
- "@shopify/scripts-toolchain-as": extension_point.sdks.assemblyscript.toolchain_version,
92
- "#{extension_point.sdks.assemblyscript.package}": extension_point_version,
93
- }
94
-
95
- if extension_point.sdks.assemblyscript.sdk_version
96
- dependencies["@shopify/scripts-sdk-as"] = extension_point.sdks.assemblyscript.sdk_version
97
- end
98
-
99
- dependencies
16
+ def setup_dependencies
17
+ super
18
+ command_runner.call(NPM_SET_REGISTRY_COMMAND)
19
+ command_runner.call(NPM_SET_ENGINE_STRICT_COMMAND)
100
20
  end
101
21
  end
102
22
  end