shopify-cli 2.3.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
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