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