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
@@ -5,14 +5,14 @@ module Script
5
5
  module Infrastructure
6
6
  class AssemblyScriptTaskRunner
7
7
  BYTECODE_FILE = "build/%{name}.wasm"
8
+ METADATA_FILE = "build/metadata.json"
8
9
  SCRIPT_SDK_BUILD = "npm run build"
9
10
 
10
- attr_reader :ctx, :script_name, :script_source_file
11
+ attr_reader :ctx, :script_name
11
12
 
12
- def initialize(ctx, script_name, script_source_file)
13
+ def initialize(ctx, script_name)
13
14
  @ctx = ctx
14
15
  @script_name = script_name
15
- @script_source_file = script_source_file
16
16
  end
17
17
 
18
18
  def build
@@ -27,15 +27,23 @@ module Script
27
27
  def install_dependencies
28
28
  check_node_version!
29
29
 
30
- output, status = ctx.capture2e("npm", "install", "--no-audit", "--no-optional", "--loglevel error")
30
+ output, status = ctx.capture2e("npm install --no-audit --no-optional --legacy-peer-deps --loglevel error")
31
31
  raise Errors::DependencyInstallError, output unless status.success?
32
32
  end
33
33
 
34
34
  def dependencies_installed?
35
35
  # Assuming if node_modules folder exist at root of script folder, all deps are installed
36
- return false unless ctx.dir_exist?("node_modules")
37
- check_if_ep_dependencies_up_to_date!
38
- true
36
+ ctx.dir_exist?("node_modules")
37
+ end
38
+
39
+ def metadata
40
+ unless @ctx.file_exist?(METADATA_FILE)
41
+ msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
42
+ raise Domain::Errors::MetadataNotFoundError, msg
43
+ end
44
+
45
+ raw_contents = File.read(METADATA_FILE)
46
+ Domain::Metadata.create_from_json(@ctx, raw_contents)
39
47
  end
40
48
 
41
49
  private
@@ -44,12 +52,12 @@ module Script
44
52
  output, status = @ctx.capture2e("node", "--version")
45
53
  raise Errors::DependencyInstallError, output unless status.success?
46
54
 
47
- require 'semantic/semantic'
55
+ require "semantic/semantic"
48
56
  version = ::Semantic::Version.new(output[1..-1])
49
57
  unless version >= ::Semantic::Version.new(AssemblyScriptProjectCreator::MIN_NODE_VERSION)
50
58
  raise Errors::DependencyInstallError,
51
- "Node version must be >= v#{AssemblyScriptProjectCreator::MIN_NODE_VERSION}. "\
52
- "Current version: #{output.strip}."
59
+ "Node version must be >= v#{AssemblyScriptProjectCreator::MIN_NODE_VERSION}. "\
60
+ "Current version: #{output.strip}."
53
61
  end
54
62
  end
55
63
 
@@ -61,8 +69,8 @@ module Script
61
69
  end
62
70
 
63
71
  def check_compilation_dependencies!
64
- pkg = JSON.parse(File.read('package.json'))
65
- build_script = pkg.dig('scripts', 'build')
72
+ pkg = JSON.parse(File.read("package.json"))
73
+ build_script = pkg.dig("scripts", "build")
66
74
 
67
75
  raise Errors::BuildScriptNotFoundError,
68
76
  "Build script not found" if build_script.nil?
@@ -73,47 +81,14 @@ module Script
73
81
  end
74
82
 
75
83
  def bytecode
76
- blob = format(BYTECODE_FILE, name: script_name)
77
- raise Errors::WebAssemblyBinaryNotFoundError unless @ctx.file_exist?(blob)
84
+ filename = format(BYTECODE_FILE, name: script_name)
85
+ raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(filename)
78
86
 
79
- contents = File.read(blob)
80
- @ctx.rm(blob)
87
+ contents = ctx.binread(filename)
88
+ ctx.rm(filename)
81
89
 
82
90
  contents
83
91
  end
84
-
85
- def check_if_ep_dependencies_up_to_date!
86
- return true if ENV['SHOPIFY_CLI_SCRIPTS_IGNORE_OUTDATED']
87
-
88
- # ignore exit code since it will not be 0 unless every package is up to date which they probably won't be
89
- out, _ = ctx.capture2e("npm", "outdated", "--json", "--depth", "0")
90
- parsed_outdated_check = JSON.parse(out)
91
- outdated_ep_packages = parsed_outdated_check
92
- .select { |package_name, _| package_name.start_with?('@shopify/extension-point-as-') }
93
- .select { |_, version_info| !package_is_up_to_date?(version_info) }
94
- .keys
95
- raise Errors::PackagesOutdatedError.new(outdated_ep_packages),
96
- "NPM packages out of date: #{outdated_ep_packages.join(', ')}" unless outdated_ep_packages.empty?
97
- end
98
-
99
- def package_is_up_to_date?(version_info)
100
- require 'semantic/semantic'
101
- current_version = version_info['current']
102
- latest_version = version_info['latest']
103
-
104
- # making an assumption that the script developer knows what they're doing if they're not referencing a
105
- # semver version
106
- begin
107
- current_version = ::Semantic::Version.new(current_version)
108
- latest_version = ::Semantic::Version.new(latest_version)
109
- rescue ArgumentError
110
- return true
111
- end
112
-
113
- return false if current_version.major < latest_version.major
114
- return false if latest_version.major == 0 && current_version.minor < latest_version.minor
115
- true
116
- end
117
92
  end
118
93
  end
119
94
  end
@@ -5,12 +5,41 @@ module Script
5
5
  module Infrastructure
6
6
  module Errors
7
7
  class AppNotInstalledError < ScriptProjectError; end
8
- class AppScriptNotPushedError < ScriptProjectError; end
9
- class AppScriptUndefinedError < ScriptProjectError; end
10
8
  class BuildError < ScriptProjectError; end
9
+ class ConfigUiSyntaxError < ScriptProjectError; end
10
+
11
+ class ConfigUiMissingKeysError < ScriptProjectError
12
+ attr_reader :filename, :missing_keys
13
+ def initialize(filename, missing_keys)
14
+ super()
15
+ @filename = filename
16
+ @missing_keys = missing_keys
17
+ end
18
+ end
19
+
20
+ class ConfigUiFieldsMissingKeysError < ScriptProjectError
21
+ attr_reader :filename, :missing_keys
22
+ def initialize(filename, missing_keys)
23
+ super()
24
+ @filename = filename
25
+ @missing_keys = missing_keys
26
+ end
27
+ end
28
+
11
29
  class DependencyInstallError < ScriptProjectError; end
30
+ class DeprecatedEPError < ScriptProjectError; end
12
31
  class EmptyResponseError < ScriptProjectError; end
13
32
  class ForbiddenError < ScriptProjectError; end
33
+ class InvalidContextError < ScriptProjectError; end
34
+
35
+ class InvalidLanguageError < ScriptProjectError
36
+ attr_reader :language, :extension_point_type
37
+ def initialize(language, extension_point_type)
38
+ super()
39
+ @language = language
40
+ @extension_point_type = extension_point_type
41
+ end
42
+ end
14
43
 
15
44
  class GraphqlError < ScriptProjectError
16
45
  attr_reader :errors
@@ -30,25 +59,9 @@ module Script
30
59
  end
31
60
  end
32
61
 
33
- class ScriptServiceUserError < ScriptProjectError
34
- def initialize(query_name, errors)
35
- super("Failed performing #{query_name}. Errors: #{errors}.")
36
- end
37
- end
38
-
62
+ class ScriptProjectAlreadyExistsError < ScriptProjectError; end
39
63
  class ShopAuthenticationError < ScriptProjectError; end
40
- class ShopScriptConflictError < ScriptProjectError; end
41
- class ShopScriptUndefinedError < ScriptProjectError; end
42
64
  class TaskRunnerNotFoundError < ScriptProjectError; end
43
-
44
- class PackagesOutdatedError < ScriptProjectError
45
- attr_reader :outdated_packages
46
- def initialize(outdated_packages)
47
- super("EP packages are outdated and need to be updated: #{outdated_packages.join(', ')}")
48
- @outdated_packages = outdated_packages
49
- end
50
- end
51
-
52
65
  class BuildScriptNotFoundError < ScriptProjectError; end
53
66
  class InvalidBuildScriptError < ScriptProjectError; end
54
67
 
@@ -8,21 +8,27 @@ module Script
8
8
  Domain::ExtensionPoint.new(type, fetch_extension_point(type))
9
9
  end
10
10
 
11
+ def extension_points
12
+ extension_point_configs.map do |type, extension_point_config|
13
+ Domain::ExtensionPoint.new(type, extension_point_config)
14
+ end
15
+ end
16
+
11
17
  def extension_point_types
12
- extension_points.keys
18
+ extension_point_configs.keys
13
19
  end
14
20
 
15
21
  private
16
22
 
17
23
  def fetch_extension_point(type)
18
- raise Domain::Errors::InvalidExtensionPointError, type unless extension_points[type]
19
- extension_points[type]
24
+ raise Domain::Errors::InvalidExtensionPointError, type unless extension_point_configs[type]
25
+ extension_point_configs[type]
20
26
  end
21
27
 
22
- def extension_points
28
+ def extension_point_configs
23
29
  @extension_points ||= begin
24
- require 'yaml'
25
- YAML.load_file(Project.project_filepath('config/extension_points.yml'))
30
+ require "yaml"
31
+ YAML.load_file(Project.project_filepath("config/extension_points.yml"))
26
32
  end
27
33
  end
28
34
  end
@@ -5,7 +5,8 @@ module Script
5
5
  module Infrastructure
6
6
  class ProjectCreator
7
7
  PROJECT_CREATORS = {
8
- "ts" => Infrastructure::AssemblyScriptProjectCreator,
8
+ "assemblyscript" => Infrastructure::AssemblyScriptProjectCreator,
9
+ "rust" => Infrastructure::RustProjectCreator,
9
10
  }
10
11
 
11
12
  def self.for(ctx, language, extension_point, script_name, path_to_project)
@@ -7,30 +7,35 @@ module Script
7
7
  include SmartProperties
8
8
  property! :ctx, accepts: ShopifyCli::Context
9
9
 
10
- def create_push_package(script, script_content, compiled_type)
11
- build_file_path = file_path(script.name, compiled_type)
10
+ def create_push_package(script_project:, script_content:, compiled_type:, metadata:)
11
+ build_file_path = file_path(script_project.id, script_project.script_name, compiled_type)
12
12
  write_to_path(build_file_path, script_content)
13
13
 
14
14
  Domain::PushPackage.new(
15
- build_file_path,
16
- script,
17
- script_content,
18
- compiled_type,
15
+ id: build_file_path,
16
+ extension_point_type: script_project.extension_point_type,
17
+ script_name: script_project.script_name,
18
+ script_content: script_content,
19
+ compiled_type: compiled_type,
20
+ metadata: metadata,
21
+ config_ui: script_project.config_ui,
19
22
  )
20
23
  end
21
24
 
22
- def get_push_package(script, compiled_type)
23
- build_file_path = file_path(script.name, compiled_type)
24
-
25
+ def get_push_package(script_project:, compiled_type:, metadata:)
26
+ build_file_path = file_path(script_project.id, script_project.script_name, compiled_type)
25
27
  raise Domain::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
26
28
 
27
- script_content = File.read(build_file_path)
29
+ script_content = ctx.binread(build_file_path)
28
30
 
29
31
  Domain::PushPackage.new(
30
- build_file_path,
31
- script,
32
- script_content,
33
- compiled_type,
32
+ id: build_file_path,
33
+ extension_point_type: script_project.extension_point_type,
34
+ script_name: script_project.script_name,
35
+ script_content: script_content,
36
+ compiled_type: compiled_type,
37
+ metadata: metadata,
38
+ config_ui: script_project.config_ui,
34
39
  )
35
40
  end
36
41
 
@@ -38,11 +43,11 @@ module Script
38
43
 
39
44
  def write_to_path(path, content)
40
45
  ctx.mkdir_p(File.dirname(path))
41
- ctx.write(path, content)
46
+ ctx.binwrite(path, content)
42
47
  end
43
48
 
44
- def file_path(script_name, compiled_type)
45
- "#{ScriptProject.current.directory}/build/#{script_name}.#{compiled_type}"
49
+ def file_path(path_to_script, script_name, compiled_type)
50
+ "#{path_to_script}/build/#{script_name}.#{compiled_type}"
46
51
  end
47
52
  end
48
53
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ class RustProjectCreator
7
+ include SmartProperties
8
+ property! :ctx, accepts: ShopifyCli::Context
9
+ property! :extension_point, accepts: Domain::ExtensionPoint
10
+ property! :script_name, accepts: String
11
+ property! :path_to_project, accepts: String
12
+
13
+ ORIGIN_BRANCH = "main"
14
+ SAMPLE_PATH = "default"
15
+
16
+ def setup_dependencies
17
+ git_init
18
+ setup_remote
19
+ setup_sparse_checkout
20
+ pull
21
+ clean
22
+ set_script_name
23
+ end
24
+
25
+ def bootstrap
26
+ end
27
+
28
+ private
29
+
30
+ def git_init
31
+ out, status = ctx.capture2e("git init")
32
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
33
+ end
34
+
35
+ def setup_remote
36
+ repo = extension_point.sdks.rust.package
37
+ out, status = ctx.capture2e("git remote add -f origin #{repo}")
38
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
39
+ end
40
+
41
+ def setup_sparse_checkout
42
+ type = extension_point.type
43
+ out, status = ctx.capture2e("git config core.sparsecheckout true")
44
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
45
+ out, status = ctx.capture2e("echo #{type}/#{SAMPLE_PATH} >> .git/info/sparse-checkout")
46
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
47
+ end
48
+
49
+ def pull
50
+ out, status = ctx.capture2e("git pull origin #{ORIGIN_BRANCH}")
51
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
52
+ end
53
+
54
+ def clean
55
+ type = extension_point.type
56
+ ctx.rm_rf(".git")
57
+ source = File.join(path_to_project, File.join(type, SAMPLE_PATH))
58
+ FileUtils.copy_entry(source, path_to_project)
59
+ ctx.rm_rf(type)
60
+ end
61
+
62
+ def set_script_name
63
+ config_file = "Cargo.toml"
64
+ upstream_name = "#{extension_point.type.gsub("_", "-")}-default"
65
+ contents = File.read(config_file)
66
+ new_contents = contents.sub(upstream_name, script_name)
67
+ File.write(config_file, new_contents)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ module Script
3
+ module Layers
4
+ module Infrastructure
5
+ class RustTaskRunner
6
+ attr_reader :ctx, :script_name
7
+
8
+ BUILD_TARGET = "wasm32-unknown-unknown"
9
+ METADATA_FILE = "build/metadata.json"
10
+
11
+ def initialize(ctx, script_name)
12
+ @ctx = ctx
13
+ @script_name = script_name
14
+ end
15
+
16
+ def dependencies_installed?
17
+ true
18
+ end
19
+
20
+ def install_dependencies
21
+ end
22
+
23
+ def build
24
+ compile
25
+ bytecode
26
+ end
27
+
28
+ def compiled_type
29
+ "wasm"
30
+ end
31
+
32
+ def metadata
33
+ unless @ctx.file_exist?(METADATA_FILE)
34
+ msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
35
+ raise Domain::Errors::MetadataNotFoundError, msg
36
+ end
37
+
38
+ raw_contents = File.read(METADATA_FILE)
39
+ Domain::Metadata.create_from_json(@ctx, raw_contents)
40
+ end
41
+
42
+ private
43
+
44
+ def compile
45
+ out, status = ctx.capture2e("cargo build --target=#{BUILD_TARGET} --release")
46
+ raise Domain::Errors::ServiceFailureError, out unless status.success?
47
+ end
48
+
49
+ def bytecode
50
+ binary_name = "#{script_name}.wasm"
51
+ binary_path = "target/#{BUILD_TARGET}/release/#{binary_name}"
52
+ raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(binary_path)
53
+
54
+ ctx.binread(binary_path)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ class ScriptProjectRepository
7
+ include SmartProperties
8
+ property! :ctx, accepts: ShopifyCli::Context
9
+
10
+ DEFAULT_CONFIG_UI_FILENAME = "config-ui.yml"
11
+
12
+ def create(script_name:, extension_point_type:, language:, no_config_ui:)
13
+ validate_metadata!(extension_point_type, language)
14
+
15
+ optional_identifiers = {}
16
+ config_ui_file = nil
17
+
18
+ unless no_config_ui
19
+ optional_identifiers.merge!(config_ui_file: DEFAULT_CONFIG_UI_FILENAME)
20
+ config_ui_file = ConfigUiRepository
21
+ .new(ctx: ctx)
22
+ .create(DEFAULT_CONFIG_UI_FILENAME, default_config_ui_content(script_name))
23
+ end
24
+
25
+ ShopifyCli::Project.write(
26
+ ctx,
27
+ project_type: :script,
28
+ organization_id: nil,
29
+ extension_point_type: extension_point_type,
30
+ script_name: script_name,
31
+ language: language,
32
+ **optional_identifiers
33
+ )
34
+
35
+ Domain::ScriptProject.new(
36
+ id: ctx.root,
37
+ env: project.env,
38
+ script_name: script_name,
39
+ extension_point_type: extension_point_type,
40
+ language: language,
41
+ config_ui: config_ui_file
42
+ )
43
+ end
44
+
45
+ def get
46
+ extension_point_type = project_config_value!("extension_point_type")
47
+ script_name = project_config_value!("script_name")
48
+ config_ui_file = project_config_value("config_ui_file")
49
+ language = project_config_value("language")&.downcase || default_language
50
+
51
+ validate_metadata!(extension_point_type, language)
52
+
53
+ config_ui = ConfigUiRepository.new(ctx: ctx).get(config_ui_file)
54
+
55
+ Domain::ScriptProject.new(
56
+ id: project.directory,
57
+ env: project.env,
58
+ script_name: script_name,
59
+ extension_point_type: extension_point_type,
60
+ language: language,
61
+ config_ui: config_ui
62
+ )
63
+ end
64
+
65
+ private
66
+
67
+ def project_config_value(key)
68
+ return nil unless project.config.key?(key)
69
+ project.config[key]
70
+ end
71
+
72
+ def project_config_value!(key)
73
+ raise Errors::InvalidContextError, key unless project.config.key?(key)
74
+ project.config[key]
75
+ end
76
+
77
+ def project
78
+ ShopifyCli::Project.current
79
+ end
80
+
81
+ def default_config_ui_content(title)
82
+ require "yaml" # takes 20ms, so deferred as late as possible.
83
+ YAML.dump({
84
+ "version" => 1,
85
+ "inputMode" => "single",
86
+ "title" => title,
87
+ "description" => "",
88
+ "fields" => [],
89
+ })
90
+ end
91
+
92
+ def default_language
93
+ Domain::ExtensionPoint::ExtensionPointAssemblyScriptSDK.language
94
+ end
95
+
96
+ def validate_metadata!(extension_point_type, language)
97
+ if Application::ExtensionPoints.deprecated_types.include?(extension_point_type)
98
+ raise Errors::DeprecatedEPError, extension_point_type
99
+ elsif !Application::ExtensionPoints.supported_language?(type: extension_point_type, language: language)
100
+ raise Errors::InvalidLanguageError.new(language, extension_point_type)
101
+ end
102
+ end
103
+
104
+ class ConfigUiRepository
105
+ include SmartProperties
106
+ property! :ctx, accepts: ShopifyCli::Context
107
+
108
+ def create(filename, content)
109
+ File.write(filename, content)
110
+
111
+ Domain::ConfigUi.new(
112
+ filename: filename,
113
+ content: content,
114
+ )
115
+ end
116
+
117
+ def get(filename)
118
+ return nil unless filename
119
+
120
+ path = File.join(ctx.root, filename)
121
+ raise Domain::Errors::MissingSpecifiedConfigUiDefinitionError, filename unless File.exist?(path)
122
+
123
+ content = File.read(path)
124
+ raise Domain::Errors::InvalidConfigUiDefinitionError, filename unless valid_config_ui?(content)
125
+
126
+ Domain::ConfigUi.new(
127
+ filename: filename,
128
+ content: content,
129
+ )
130
+ end
131
+
132
+ private
133
+
134
+ def valid_config_ui?(raw_yaml)
135
+ require "yaml" # takes 20ms, so deferred as late as possible.
136
+ YAML.safe_load(raw_yaml)
137
+ true
138
+ rescue Psych::SyntaxError
139
+ false
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end