shopify-cli 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  3. data/.rubocop_todo.yml +15 -2
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +26 -0
  6. data/Gemfile +12 -12
  7. data/Gemfile.lock +14 -14
  8. data/README.md +39 -7
  9. data/Rakefile +32 -28
  10. data/bin/load_shopify.rb +6 -6
  11. data/bin/shopify +2 -2
  12. data/dev.yml +5 -2
  13. data/docs/_config.yml +1 -18
  14. data/docs/app/node/commands/index.md +2 -80
  15. data/docs/app/node/index.md +2 -33
  16. data/docs/app/rails/commands/index.md +2 -78
  17. data/docs/app/rails/index.md +2 -34
  18. data/docs/core/index.md +2 -84
  19. data/docs/getting-started/index.md +2 -25
  20. data/docs/getting-started/install/index.md +1 -118
  21. data/docs/getting-started/migrate/index.md +2 -94
  22. data/docs/getting-started/uninstall/index.md +2 -35
  23. data/docs/getting-started/upgrade/index.md +2 -39
  24. data/docs/help/start-app/index.md +2 -4
  25. data/docs/index.md +2 -24
  26. data/ext/shopify-cli/extconf.rb +7 -7
  27. data/install.sh +1 -1
  28. data/lib/docgen/markdown.rb +12 -12
  29. data/lib/graphql/extension_create.graphql +17 -2
  30. data/lib/graphql/fetch_specifications.graphql +14 -0
  31. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  32. data/lib/project_types/extension/cli.rb +56 -48
  33. data/lib/project_types/extension/commands/build.rb +3 -3
  34. data/lib/project_types/extension/commands/create.rb +17 -10
  35. data/lib/project_types/extension/commands/extension_command.rb +14 -7
  36. data/lib/project_types/extension/commands/push.rb +10 -10
  37. data/lib/project_types/extension/commands/register.rb +22 -32
  38. data/lib/project_types/extension/commands/serve.rb +1 -7
  39. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  40. data/lib/project_types/extension/extension_project.rb +22 -7
  41. data/lib/project_types/extension/extension_project_keys.rb +5 -4
  42. data/lib/project_types/extension/features/argo.rb +123 -0
  43. data/lib/project_types/extension/features/argo_config.rb +5 -5
  44. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  45. data/lib/project_types/extension/features/argo_renderer_package.rb +32 -0
  46. data/lib/project_types/extension/features/argo_serve.rb +69 -0
  47. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  48. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  49. data/lib/project_types/extension/forms/create.rb +28 -34
  50. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  51. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  52. data/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
  53. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  54. data/lib/project_types/extension/messages/messages.rb +55 -52
  55. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  56. data/lib/project_types/extension/models/registration.rb +1 -0
  57. data/lib/project_types/extension/models/specification.rb +39 -0
  58. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  59. data/lib/project_types/extension/models/specification_handlers/default.rb +75 -0
  60. data/lib/project_types/extension/models/specifications.rb +88 -0
  61. data/lib/project_types/extension/tasks/configure_features.rb +54 -0
  62. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  63. data/lib/project_types/extension/tasks/converters/registration_converter.rb +8 -6
  64. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  65. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  66. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  67. data/lib/project_types/extension/tasks/fetch_specifications.rb +18 -0
  68. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  69. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  70. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  71. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  72. data/lib/project_types/node/cli.rb +19 -19
  73. data/lib/project_types/node/commands/connect.rb +3 -3
  74. data/lib/project_types/node/commands/create.rb +42 -38
  75. data/lib/project_types/node/commands/deploy.rb +4 -4
  76. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  77. data/lib/project_types/node/commands/generate.rb +3 -34
  78. data/lib/project_types/node/commands/open.rb +2 -2
  79. data/lib/project_types/node/commands/populate.rb +6 -6
  80. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  81. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  82. data/lib/project_types/node/commands/populate/product.rb +5 -5
  83. data/lib/project_types/node/commands/serve.rb +9 -9
  84. data/lib/project_types/node/commands/tunnel.rb +7 -7
  85. data/lib/project_types/node/forms/create.rb +17 -8
  86. data/lib/project_types/node/messages/messages.rb +13 -47
  87. data/lib/project_types/rails/cli.rb +21 -21
  88. data/lib/project_types/rails/commands/connect.rb +3 -3
  89. data/lib/project_types/rails/commands/create.rb +56 -54
  90. data/lib/project_types/rails/commands/deploy.rb +4 -4
  91. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  92. data/lib/project_types/rails/commands/generate.rb +7 -7
  93. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  94. data/lib/project_types/rails/commands/open.rb +2 -2
  95. data/lib/project_types/rails/commands/populate.rb +6 -6
  96. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  97. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  99. data/lib/project_types/rails/commands/serve.rb +11 -11
  100. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  101. data/lib/project_types/rails/forms/create.rb +35 -25
  102. data/lib/project_types/rails/gem.rb +24 -24
  103. data/lib/project_types/rails/messages/messages.rb +6 -5
  104. data/lib/project_types/rails/ruby.rb +2 -2
  105. data/lib/project_types/script/cli.rb +38 -39
  106. data/lib/project_types/script/commands/create.rb +12 -14
  107. data/lib/project_types/script/commands/push.rb +10 -17
  108. data/lib/project_types/script/config/extension_points.yml +29 -10
  109. data/lib/project_types/script/errors.rb +1 -2
  110. data/lib/project_types/script/forms/create.rb +18 -5
  111. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +9 -1
  112. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  113. data/lib/project_types/script/layers/application/build_script.rb +10 -7
  114. data/lib/project_types/script/layers/application/create_script.rb +37 -25
  115. data/lib/project_types/script/layers/application/extension_points.rb +25 -0
  116. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  117. data/lib/project_types/script/layers/application/push_script.rb +13 -18
  118. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  119. data/lib/project_types/script/layers/domain/errors.rb +20 -0
  120. data/lib/project_types/script/layers/domain/extension_point.rb +82 -11
  121. data/lib/project_types/script/layers/domain/metadata.rb +48 -0
  122. data/lib/project_types/script/layers/domain/push_package.rb +25 -6
  123. data/lib/project_types/script/layers/domain/script_project.rb +34 -0
  124. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +42 -13
  125. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +24 -49
  126. data/lib/project_types/script/layers/infrastructure/errors.rb +32 -19
  127. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  128. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  129. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +22 -17
  130. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  131. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  132. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +145 -0
  133. data/lib/project_types/script/layers/infrastructure/script_service.rb +32 -75
  134. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  135. data/lib/project_types/script/messages/messages.rb +58 -59
  136. data/lib/project_types/script/ui/error_handler.rb +115 -72
  137. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  138. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  139. data/lib/project_types/theme/cli.rb +40 -0
  140. data/lib/project_types/theme/commands/connect.rb +54 -0
  141. data/lib/project_types/theme/commands/create.rb +48 -0
  142. data/lib/project_types/theme/commands/deploy.rb +38 -0
  143. data/lib/project_types/theme/commands/generate.rb +20 -0
  144. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  145. data/lib/project_types/theme/commands/push.rb +55 -0
  146. data/lib/project_types/theme/commands/serve.rb +31 -0
  147. data/lib/project_types/theme/forms/connect.rb +34 -0
  148. data/lib/project_types/theme/forms/create.rb +22 -0
  149. data/lib/project_types/theme/messages/messages.rb +147 -0
  150. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  151. data/lib/project_types/theme/themekit.rb +113 -0
  152. data/lib/rubygems_plugin.rb +3 -3
  153. data/lib/shopify-cli/admin_api.rb +52 -12
  154. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  155. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  156. data/lib/shopify-cli/api.rb +34 -31
  157. data/lib/shopify-cli/command.rb +1 -1
  158. data/lib/shopify-cli/commands.rb +9 -9
  159. data/lib/shopify-cli/commands/config.rb +28 -52
  160. data/lib/shopify-cli/commands/connect.rb +10 -10
  161. data/lib/shopify-cli/commands/create.rb +5 -5
  162. data/lib/shopify-cli/commands/help.rb +6 -6
  163. data/lib/shopify-cli/commands/logout.rb +3 -3
  164. data/lib/shopify-cli/commands/system.rb +33 -33
  165. data/lib/shopify-cli/commands/version.rb +2 -2
  166. data/lib/shopify-cli/context.rb +71 -22
  167. data/lib/shopify-cli/core.rb +4 -4
  168. data/lib/shopify-cli/core/entry_point.rb +5 -5
  169. data/lib/shopify-cli/core/executor.rb +1 -1
  170. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  171. data/lib/shopify-cli/core/monorail.rb +16 -16
  172. data/lib/shopify-cli/db.rb +2 -2
  173. data/lib/shopify-cli/feature.rb +1 -3
  174. data/lib/shopify-cli/form.rb +1 -1
  175. data/lib/shopify-cli/git.rb +17 -17
  176. data/lib/shopify-cli/helpers.rb +1 -1
  177. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  178. data/lib/shopify-cli/heroku.rb +28 -28
  179. data/lib/shopify-cli/http_request.rb +21 -9
  180. data/lib/shopify-cli/js_deps.rb +12 -12
  181. data/lib/shopify-cli/js_system.rb +5 -5
  182. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  183. data/lib/shopify-cli/messages/messages.rb +9 -16
  184. data/lib/shopify-cli/method_object.rb +104 -0
  185. data/lib/shopify-cli/oauth.rb +25 -25
  186. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  187. data/lib/shopify-cli/options.rb +3 -3
  188. data/lib/shopify-cli/packager.rb +24 -24
  189. data/lib/shopify-cli/partners_api.rb +24 -18
  190. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  191. data/lib/shopify-cli/process_supervision.rb +7 -7
  192. data/lib/shopify-cli/project.rb +16 -16
  193. data/lib/shopify-cli/project_type.rb +4 -4
  194. data/lib/shopify-cli/resolve_constant.rb +25 -0
  195. data/lib/shopify-cli/resources.rb +1 -1
  196. data/lib/shopify-cli/resources/env_file.rb +9 -9
  197. data/lib/shopify-cli/result.rb +432 -0
  198. data/lib/shopify-cli/shopifolk.rb +6 -8
  199. data/lib/shopify-cli/sub_command.rb +1 -1
  200. data/lib/shopify-cli/task.rb +3 -3
  201. data/lib/shopify-cli/tasks.rb +7 -7
  202. data/lib/shopify-cli/tasks/create_api_client.rb +5 -5
  203. data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
  204. data/lib/shopify-cli/tasks/ensure_env.rb +15 -15
  205. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  206. data/lib/shopify-cli/tasks/select_org_and_shop.rb +25 -24
  207. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  208. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  209. data/lib/shopify-cli/tunnel.rb +36 -30
  210. data/lib/shopify-cli/version.rb +1 -1
  211. data/lib/shopify_cli.rb +57 -52
  212. data/shopify-cli.gemspec +6 -6
  213. data/shopify.fish +1 -1
  214. data/shopify.sh +1 -1
  215. data/vendor/deps/cli-kit/REVISION +1 -1
  216. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  217. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  218. data/vendor/deps/cli-ui/REVISION +1 -1
  219. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  220. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  221. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  222. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  224. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  225. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  226. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  227. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  228. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  229. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  230. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  231. data/vendor/deps/webrick/.gitignore +9 -0
  232. data/vendor/deps/webrick/Gemfile +3 -0
  233. data/vendor/deps/webrick/LICENSE.txt +22 -0
  234. data/vendor/deps/webrick/README.md +61 -0
  235. data/vendor/deps/webrick/Rakefile +10 -0
  236. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  237. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  238. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  239. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  240. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  241. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  242. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  243. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  244. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  251. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  252. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  253. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  254. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  255. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  256. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  257. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  263. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  264. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  265. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  266. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  267. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  268. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  269. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  270. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  271. data/vendor/deps/webrick/webrick.gemspec +74 -0
  272. data/vendor/gen/template/bin/update-deps +9 -9
  273. metadata +83 -35
  274. data/docs/Gemfile +0 -5
  275. data/docs/Gemfile.lock +0 -258
  276. data/docs/_data/nav.yml +0 -35
  277. data/docs/_includes/footer.html +0 -15
  278. data/docs/_includes/head.html +0 -19
  279. data/docs/_includes/sidebar_nav.html +0 -22
  280. data/docs/_includes/toc.html +0 -112
  281. data/docs/_layouts/default.html +0 -79
  282. data/docs/css/docs.css +0 -157
  283. data/docs/images/header.png +0 -0
  284. data/docs/installing-ruby.md +0 -28
  285. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  286. data/lib/project_types/extension/features/argo/base.rb +0 -129
  287. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  288. data/lib/project_types/extension/forms/register.rb +0 -47
  289. data/lib/project_types/extension/models/type.rb +0 -81
  290. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  291. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  292. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  293. data/lib/project_types/node/commands/generate/page.rb +0 -59
  294. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  295. data/lib/project_types/script/commands/disable.rb +0 -25
  296. data/lib/project_types/script/commands/enable.rb +0 -78
  297. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  298. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  299. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  300. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  301. data/lib/project_types/script/layers/domain/script.rb +0 -18
  302. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -47
  303. data/lib/project_types/script/script_project.rb +0 -54
  304. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  305. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -11,6 +11,31 @@ module Script
11
11
  def self.types
12
12
  Infrastructure::ExtensionPointRepository.new.extension_point_types
13
13
  end
14
+
15
+ def self.available_types
16
+ Infrastructure::ExtensionPointRepository.new.extension_points.select do |ep|
17
+ next false if ep.deprecated?
18
+ !ep.beta? || ShopifyCli::Feature.enabled?(:scripts_beta_extension_points)
19
+ end.map(&:type)
20
+ end
21
+
22
+ def self.deprecated_types
23
+ Infrastructure::ExtensionPointRepository.new
24
+ .extension_points
25
+ .select(&:deprecated?)
26
+ .map(&:type)
27
+ end
28
+
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
33
+ end.compact
34
+ end
35
+
36
+ def self.supported_language?(type:, language:)
37
+ languages(type: type).include?(language.downcase)
38
+ end
14
39
  end
15
40
  end
16
41
  end
@@ -3,14 +3,14 @@ module Script
3
3
  module Application
4
4
  class ProjectDependencies
5
5
  def self.install(ctx:, task_runner:)
6
- CLI::UI::Frame.open(ctx.message('script.project_deps.checking_with_npm')) do
6
+ CLI::UI::Frame.open(ctx.message("script.project_deps.checking_with_npm")) do
7
7
  begin
8
8
  if task_runner.dependencies_installed?
9
- ctx.puts(ctx.message('script.project_deps.none_required'))
9
+ ctx.puts(ctx.message("script.project_deps.none_required"))
10
10
  else
11
- UI::StrictSpinner.spin(ctx.message('script.project_deps.installing')) do |spinner|
11
+ UI::StrictSpinner.spin(ctx.message("script.project_deps.installing")) do |spinner|
12
12
  task_runner.install_dependencies
13
- spinner.update_title(ctx.message('script.project_deps.installed'))
13
+ spinner.update_title(ctx.message("script.project_deps.installed"))
14
14
  end
15
15
  end
16
16
  true
@@ -5,26 +5,21 @@ module Script
5
5
  module Application
6
6
  class PushScript
7
7
  class << self
8
- def call(ctx:, language:, extension_point_type:, script_name:, source_file:, api_key:, force:)
9
- script = Infrastructure::ScriptRepository.new(ctx: ctx).get_script(
10
- language,
11
- extension_point_type,
12
- script_name
13
- )
14
- task_runner = Infrastructure::TaskRunner.for(ctx, language, script_name, source_file)
15
- ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
16
- BuildScript.call(ctx: ctx, task_runner: task_runner, script: script)
17
- push_script(ctx, task_runner, script, api_key, force)
18
- end
8
+ def call(ctx:, force:)
9
+ script_project = Infrastructure::ScriptProjectRepository.new(ctx: ctx).get
10
+ task_runner = Infrastructure::TaskRunner.for(ctx, script_project.language, script_project.script_name)
19
11
 
20
- private
12
+ ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
13
+ BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project)
21
14
 
22
- def push_script(ctx, task_runner, script, api_key, force)
23
- UI::PrintingSpinner.spin(ctx, ctx.message('script.application.pushing')) do |p_ctx, spinner|
24
- Infrastructure::PushPackageRepository.new(ctx: p_ctx)
25
- .get_push_package(script, task_runner.compiled_type)
26
- .push(Infrastructure::ScriptService.new(ctx: p_ctx), api_key, force)
27
- spinner.update_title(p_ctx.message('script.application.pushed'))
15
+ UI::PrintingSpinner.spin(ctx, ctx.message("script.application.pushing")) do |p_ctx, spinner|
16
+ package = Infrastructure::PushPackageRepository.new(ctx: p_ctx).get_push_package(
17
+ script_project: script_project,
18
+ compiled_type: task_runner.compiled_type,
19
+ metadata: task_runner.metadata,
20
+ )
21
+ package.push(Infrastructure::ScriptService.new(ctx: p_ctx), script_project.api_key, force)
22
+ spinner.update_title(p_ctx.message("script.application.pushed"))
28
23
  end
29
24
  end
30
25
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Domain
6
+ class ConfigUi
7
+ attr_reader :filename, :content
8
+
9
+ def initialize(filename:, content:)
10
+ @filename = filename
11
+ @content = content
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -14,6 +14,22 @@ module Script
14
14
  end
15
15
  end
16
16
 
17
+ class InvalidConfigUiDefinitionError < ScriptProjectError
18
+ attr_reader :filename
19
+ def initialize(filename)
20
+ super()
21
+ @filename = filename
22
+ end
23
+ end
24
+
25
+ class MissingSpecifiedConfigUiDefinitionError < ScriptProjectError
26
+ attr_reader :filename
27
+ def initialize(filename)
28
+ super()
29
+ @filename = filename
30
+ end
31
+ end
32
+
17
33
  class ScriptNotFoundError < ScriptProjectError
18
34
  attr_reader :script_name, :extension_point_type
19
35
  def initialize(extension_point_type, script_name)
@@ -24,6 +40,10 @@ module Script
24
40
  end
25
41
 
26
42
  class ServiceFailureError < ScriptProjectError; end
43
+
44
+ class MetadataNotFoundError < ScriptProjectError; end
45
+
46
+ class MetadataValidationError < ScriptProjectError; end
27
47
  end
28
48
  end
29
49
  end
@@ -4,23 +4,94 @@ module Script
4
4
  module Layers
5
5
  module Domain
6
6
  class ExtensionPoint
7
- attr_reader :type, :sdks
7
+ attr_reader :type, :beta, :deprecated, :sdks, :domain
8
8
 
9
9
  def initialize(type, config)
10
10
  @type = type
11
- @sdks = {
12
- ts: ExtensionPointAssemblyScriptSDK.new(config["assemblyscript"]),
13
- }
11
+ @beta = config["beta"] || false
12
+ @deprecated = config["deprecated"] || false
13
+ @domain = config["domain"] || nil
14
+ @sdks = ExtensionPointSDKs.new(config)
14
15
  end
15
- end
16
16
 
17
- class ExtensionPointAssemblyScriptSDK
18
- attr_reader :package, :version, :sdk_version, :toolchain_version
17
+ def beta?
18
+ @beta
19
+ end
20
+
21
+ def deprecated?
22
+ @deprecated
23
+ end
24
+
25
+ def dasherize_type
26
+ @type.gsub("_", "-")
27
+ end
28
+
29
+ class ExtensionPointSDKs
30
+ def initialize(config)
31
+ @config = config
32
+ end
33
+
34
+ def all
35
+ [assemblyscript, rust].compact
36
+ end
37
+
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)
52
+ end
53
+ end
54
+
55
+ class ExtensionPointSDK
56
+ attr_reader :version, :beta, :package
57
+
58
+ def initialize(config)
59
+ @beta = config["beta"] || false
60
+ @package = config["package"]
61
+ @version = config["package-version"]
62
+ end
63
+
64
+ def beta?
65
+ @beta
66
+ end
67
+
68
+ def versioned?
69
+ @version
70
+ 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
19
90
 
20
- def initialize(config)
21
- @package = config["package"]
22
- @sdk_version = config["sdk-version"]
23
- @toolchain_version = config["toolchain-version"]
91
+ class ExtensionPointRustSDK < ExtensionPointSDK
92
+ def self.language
93
+ "rust"
94
+ end
24
95
  end
25
96
  end
26
97
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Domain
6
+ class Metadata
7
+ attr_reader :schema_major_version, :schema_minor_version, :use_msgpack
8
+
9
+ def initialize(schema_major_version, schema_minor_version, use_msgpack)
10
+ @schema_major_version = schema_major_version
11
+ @schema_minor_version = schema_minor_version
12
+ @use_msgpack = use_msgpack
13
+ end
14
+
15
+ class << self
16
+ def create_from_json(ctx, metadata_json)
17
+ err_tag = nil
18
+ metadata_hash = JSON.parse(metadata_json)
19
+
20
+ use_msgpack = !!metadata_hash.dig("flags", "use_msgpack")
21
+ schema_versions = metadata_hash["schemaVersions"] || {}
22
+
23
+ version = schema_versions.values.first || {}
24
+ schema_major_version = version["major"]
25
+ schema_minor_version = version["minor"]
26
+
27
+ if schema_versions.empty?
28
+ err_tag = "script.error.metadata_schema_versions_missing"
29
+ elsif schema_versions.count != 1
30
+ # Scripts may be attached to more than one EP in the future but not right now
31
+ err_tag = "script.error.metadata_schema_versions_single_key"
32
+ elsif schema_major_version.nil?
33
+ err_tag = "script.error.metadata_schema_versions_missing_major"
34
+ elsif schema_minor_version.nil?
35
+ err_tag = "script.error.metadata_schema_versions_missing_minor"
36
+ end
37
+
38
+ Metadata.new(schema_major_version, schema_minor_version, use_msgpack)
39
+ rescue JSON::ParserError
40
+ err_tag = "script.error.metadata_validation_cause"
41
+ ensure
42
+ raise Errors::MetadataValidationError, ctx.message(err_tag) if err_tag
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -4,23 +4,42 @@ module Script
4
4
  module Layers
5
5
  module Domain
6
6
  class PushPackage
7
- attr_reader :id, :script, :script_content, :compiled_type
7
+ attr_reader :id,
8
+ :extension_point_type,
9
+ :script_name,
10
+ :config_ui,
11
+ :script_content,
12
+ :compiled_type,
13
+ :metadata
8
14
 
9
- def initialize(id, script, script_content, compiled_type)
15
+ def initialize(
16
+ id:,
17
+ extension_point_type:,
18
+ script_name:,
19
+ script_content:,
20
+ compiled_type:,
21
+ metadata:,
22
+ config_ui:
23
+ )
10
24
  @id = id
11
- @script = script
25
+ @extension_point_type = extension_point_type
26
+ @script_name = script_name
12
27
  @script_content = script_content
13
28
  @compiled_type = compiled_type
29
+ @metadata = metadata
30
+ @config_ui = config_ui
14
31
  end
15
32
 
16
33
  def push(script_service, api_key, force)
17
34
  script_service.push(
18
- extension_point_type: @script.extension_point_type,
19
- script_name: @script.name,
35
+ extension_point_type: @extension_point_type,
36
+ script_name: @script_name,
20
37
  script_content: @script_content,
21
38
  compiled_type: @compiled_type,
22
39
  api_key: api_key,
23
- force: force
40
+ force: force,
41
+ metadata: @metadata,
42
+ config_ui: @config_ui,
24
43
  )
25
44
  end
26
45
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Domain
6
+ class ScriptProject
7
+ include SmartProperties
8
+
9
+ property! :id, accepts: String
10
+ property :env, accepts: ShopifyCli::Resources::EnvFile
11
+
12
+ property! :extension_point_type, accepts: String
13
+ property! :script_name, accepts: String
14
+ property! :language, accepts: String
15
+
16
+ property :config_ui, accepts: ConfigUi
17
+
18
+ def initialize(*)
19
+ super
20
+
21
+ ShopifyCli::Core::Monorail.metadata = {
22
+ "script_name" => script_name,
23
+ "extension_point_type" => extension_point_type,
24
+ "language" => language,
25
+ }
26
+ end
27
+
28
+ def api_key
29
+ env[:api_key]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -11,7 +11,10 @@ module Script
11
11
  property! :path_to_project, accepts: String
12
12
 
13
13
  BOOTSTRAP = "npx --no-install shopify-scripts-toolchain-as bootstrap --from %{extension_point} --dest %{base}"
14
+ BUILD = "shopify-scripts-toolchain-as build --src src/shopify_main.ts " \
15
+ "--binary build/%{script_name}.wasm --metadata build/metadata.json"
14
16
  MIN_NODE_VERSION = "14.5.0"
17
+ ASC_ARGS = "-- --lib node_modules --optimize --use Date="
15
18
 
16
19
  def setup_dependencies
17
20
  write_npmrc
@@ -19,8 +22,7 @@ module Script
19
22
  end
20
23
 
21
24
  def bootstrap
22
- type = extension_point.type.gsub('_', '-')
23
- out, status = ctx.capture2e(format(BOOTSTRAP, extension_point: type, base: path_to_project))
25
+ out, status = ctx.capture2e(bootstap_command)
24
26
  raise Domain::Errors::ServiceFailureError, out unless status.success?
25
27
  end
26
28
 
@@ -28,17 +30,21 @@ module Script
28
30
 
29
31
  def write_npmrc
30
32
  ctx.system(
31
- 'npm', '--userconfig', './.npmrc', 'config', 'set', '@shopify:registry', 'https://registry.npmjs.com'
33
+ "npm", "--userconfig", "./.npmrc", "config", "set", "@shopify:registry", "https://registry.npmjs.com"
32
34
  )
33
35
  ctx.system(
34
- 'npm', '--userconfig', './.npmrc', 'config', 'set', 'engine-strict', 'true'
36
+ "npm", "--userconfig", "./.npmrc", "config", "set", "engine-strict", "true"
35
37
  )
36
38
  end
37
39
 
38
40
  def extension_point_version
39
- out, status = ctx.capture2e("npm show #{extension_point.sdks[:ts].package} version --json")
41
+ if extension_point.sdks.assemblyscript.versioned?
42
+ return extension_point.sdks.assemblyscript.version
43
+ end
44
+
45
+ out, status = ctx.capture2e("npm show #{extension_point.sdks.assemblyscript.package} version --json")
40
46
  raise Domain::Errors::ServiceFailureError, out unless status.success?
41
- JSON.parse(out)
47
+ "^#{JSON.parse(out)}"
42
48
  end
43
49
 
44
50
  def write_package_json
@@ -47,16 +53,15 @@ module Script
47
53
  "name": "#{script_name}",
48
54
  "version": "1.0.0",
49
55
  "devDependencies": {
50
- "@shopify/scripts-sdk-as": "#{extension_point.sdks[:ts].sdk_version}",
51
- "@shopify/scripts-toolchain-as": "#{extension_point.sdks[:ts].toolchain_version}",
52
- "#{extension_point.sdks[:ts].package}": "^#{extension_point_version}",
53
- "@as-pect/cli": "4.0.0",
54
- "as-wasi": "^0.2.1",
55
- "assemblyscript": "^0.14.0"
56
+ "@shopify/scripts-sdk-as": "#{extension_point.sdks.assemblyscript.sdk_version}",
57
+ "@shopify/scripts-toolchain-as": "#{extension_point.sdks.assemblyscript.toolchain_version}",
58
+ "#{extension_point.sdks.assemblyscript.package}": "#{extension_point_version}",
59
+ "@as-pect/cli": "^6.0.0",
60
+ "assemblyscript": "^0.18.13"
56
61
  },
57
62
  "scripts": {
58
63
  "test": "asp --summary --verbose",
59
- "build": "shopify-scripts-toolchain-as build --src src/script.ts --binary build/#{script_name}.wasm -- --lib node_modules --optimize --use Date="
64
+ "build": "#{build_command}"
60
65
  },
61
66
  "engines": {
62
67
  "node": ">=#{MIN_NODE_VERSION}"
@@ -65,6 +70,30 @@ module Script
65
70
  HERE
66
71
  ctx.write("package.json", package_json)
67
72
  end
73
+
74
+ def bootstap_command
75
+ type = extension_point.dasherize_type
76
+ base_command = format(BOOTSTRAP, extension_point: type, base: path_to_project)
77
+ domain = extension_point.domain
78
+
79
+ if domain.nil?
80
+ base_command
81
+ else
82
+ "#{base_command} --domain #{domain}"
83
+ end
84
+ end
85
+
86
+ def build_command
87
+ type = extension_point.dasherize_type
88
+ base_command = format(BUILD, script_name: script_name)
89
+ domain = extension_point.domain
90
+
91
+ if domain.nil?
92
+ "#{base_command} #{ASC_ARGS}"
93
+ else
94
+ "#{base_command} --domain #{domain} --ep #{type} #{ASC_ARGS}"
95
+ end
96
+ end
68
97
  end
69
98
  end
70
99
  end