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
@@ -4,16 +4,15 @@ module Script
4
4
  module Layers
5
5
  module Infrastructure
6
6
  class AssemblyScriptTaskRunner
7
- BYTECODE_FILE = "%{name}.wasm"
8
- SCRIPT_SDK_BUILD = "npx --no-install shopify-scripts-build --src=../%{source} --binary=#{BYTECODE_FILE} "\
9
- "-- --lib=../node_modules --optimize --use Date="
7
+ BYTECODE_FILE = "build/%{name}.wasm"
8
+ METADATA_FILE = "build/metadata.json"
9
+ SCRIPT_SDK_BUILD = "npm run build"
10
10
 
11
- attr_reader :ctx, :script_name, :script_source_file
11
+ attr_reader :ctx, :script_name
12
12
 
13
- def initialize(ctx, script_name, script_source_file)
13
+ def initialize(ctx, script_name)
14
14
  @ctx = ctx
15
15
  @script_name = script_name
16
- @script_source_file = script_source_file
17
16
  end
18
17
 
19
18
  def build
@@ -28,15 +27,23 @@ module Script
28
27
  def install_dependencies
29
28
  check_node_version!
30
29
 
31
- 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")
32
31
  raise Errors::DependencyInstallError, output unless status.success?
33
32
  end
34
33
 
35
34
  def dependencies_installed?
36
35
  # Assuming if node_modules folder exist at root of script folder, all deps are installed
37
- return false unless ctx.dir_exist?("node_modules")
38
- check_if_ep_dependencies_up_to_date!
39
- 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)
40
47
  end
41
48
 
42
49
  private
@@ -45,53 +52,42 @@ module Script
45
52
  output, status = @ctx.capture2e("node", "--version")
46
53
  raise Errors::DependencyInstallError, output unless status.success?
47
54
 
48
- require 'semantic/semantic'
55
+ require "semantic/semantic"
49
56
  version = ::Semantic::Version.new(output[1..-1])
50
- unless version >= ::Semantic::Version.new("12.16.0")
51
- raise Errors::DependencyInstallError, "Node version must be >= v12.16.0. Current version: #{output.strip}."
57
+ unless version >= ::Semantic::Version.new(AssemblyScriptProjectCreator::MIN_NODE_VERSION)
58
+ raise Errors::DependencyInstallError,
59
+ "Node version must be >= v#{AssemblyScriptProjectCreator::MIN_NODE_VERSION}. "\
60
+ "Current version: #{output.strip}."
52
61
  end
53
62
  end
54
63
 
55
64
  def compile
56
- out, status = ctx.capture2e(format(SCRIPT_SDK_BUILD, source: script_source_file, name: script_name))
65
+ check_compilation_dependencies!
66
+
67
+ out, status = ctx.capture2e(SCRIPT_SDK_BUILD)
57
68
  raise Domain::Errors::ServiceFailureError, out unless status.success?
58
69
  end
59
70
 
60
- def bytecode
61
- File.read(format(BYTECODE_FILE, name: script_name))
62
- end
71
+ def check_compilation_dependencies!
72
+ pkg = JSON.parse(File.read("package.json"))
73
+ build_script = pkg.dig("scripts", "build")
63
74
 
64
- def check_if_ep_dependencies_up_to_date!
65
- return true if ENV['SHOPIFY_CLI_SCRIPTS_IGNORE_OUTDATED']
66
-
67
- # ignore exit code since it will not be 0 unless every package is up to date which they probably won't be
68
- out, _ = ctx.capture2e("npm", "outdated", "--json", "--depth", "0")
69
- parsed_outdated_check = JSON.parse(out)
70
- outdated_ep_packages = parsed_outdated_check
71
- .select { |package_name, _| package_name.start_with?('@shopify/extension-point-as-') }
72
- .select { |_, version_info| !package_is_up_to_date?(version_info) }
73
- .keys
74
- raise Errors::PackagesOutdatedError.new(outdated_ep_packages),
75
- "NPM packages out of date: #{outdated_ep_packages.join(', ')}" unless outdated_ep_packages.empty?
76
- end
75
+ raise Errors::BuildScriptNotFoundError,
76
+ "Build script not found" if build_script.nil?
77
77
 
78
- def package_is_up_to_date?(version_info)
79
- require 'semantic/semantic'
80
- current_version = version_info['current']
81
- latest_version = version_info['latest']
82
-
83
- # making an assumption that the script developer knows what they're doing if they're not referencing a
84
- # semver version
85
- begin
86
- current_version = ::Semantic::Version.new(current_version)
87
- latest_version = ::Semantic::Version.new(latest_version)
88
- rescue ArgumentError
89
- return true
78
+ unless build_script.start_with?("shopify-scripts")
79
+ raise Errors::InvalidBuildScriptError, "Invalid build script"
90
80
  end
81
+ end
82
+
83
+ def bytecode
84
+ blob = format(BYTECODE_FILE, name: script_name)
85
+ raise Errors::WebAssemblyBinaryNotFoundError unless @ctx.file_exist?(blob)
86
+
87
+ contents = File.read(blob)
88
+ @ctx.rm(blob)
91
89
 
92
- return false if current_version.major < latest_version.major
93
- return false if latest_version.major == 0 && current_version.minor < latest_version.minor
94
- true
90
+ contents
95
91
  end
96
92
  end
97
93
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ class ConfigUiRepository
7
+ include SmartProperties
8
+ property! :ctx, accepts: ShopifyCli::Context
9
+
10
+ def create_config_ui(filename, content)
11
+ File.write(filename, content)
12
+
13
+ Domain::ConfigUi.new(
14
+ filename: filename,
15
+ content: content,
16
+ )
17
+ end
18
+
19
+ def get_config_ui(filename)
20
+ return nil unless filename
21
+
22
+ path = File.join(ctx.root, filename)
23
+ raise Domain::Errors::MissingSpecifiedConfigUiDefinitionError, filename unless File.exist?(path)
24
+
25
+ content = File.read(path)
26
+ raise Domain::Errors::InvalidConfigUiDefinitionError, filename unless valid_config_ui?(content)
27
+
28
+ Domain::ConfigUi.new(
29
+ filename: filename,
30
+ content: content,
31
+ )
32
+ end
33
+
34
+ private
35
+
36
+ def valid_config_ui?(raw_yaml)
37
+ require "yaml" # takes 20ms, so deferred as late as possible.
38
+ YAML.safe_load(raw_yaml)
39
+ true
40
+ rescue Psych::SyntaxError
41
+ false
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -8,8 +8,30 @@ module Script
8
8
  class AppScriptNotPushedError < ScriptProjectError; end
9
9
  class AppScriptUndefinedError < ScriptProjectError; end
10
10
  class BuildError < ScriptProjectError; end
11
+ class ConfigUiSyntaxError < ScriptProjectError; end
12
+
13
+ class ConfigUiMissingKeysError < ScriptProjectError
14
+ attr_reader :filename, :missing_keys
15
+ def initialize(filename, missing_keys)
16
+ super()
17
+ @filename = filename
18
+ @missing_keys = missing_keys
19
+ end
20
+ end
21
+
22
+ class ConfigUiFieldsMissingKeysError < ScriptProjectError
23
+ attr_reader :filename, :missing_keys
24
+ def initialize(filename, missing_keys)
25
+ super()
26
+ @filename = filename
27
+ @missing_keys = missing_keys
28
+ end
29
+ end
30
+
11
31
  class DependencyInstallError < ScriptProjectError; end
32
+ class EmptyResponseError < ScriptProjectError; end
12
33
  class ForbiddenError < ScriptProjectError; end
34
+
13
35
  class GraphqlError < ScriptProjectError
14
36
  attr_reader :errors
15
37
  def initialize(errors)
@@ -17,7 +39,9 @@ module Script
17
39
  super("GraphQL failed with errors: #{errors}")
18
40
  end
19
41
  end
42
+
20
43
  class ProjectCreatorNotFoundError < ScriptProjectError; end
44
+
21
45
  class ScriptRepushError < ScriptProjectError
22
46
  attr_reader :api_key
23
47
  def initialize(api_key)
@@ -25,20 +49,23 @@ module Script
25
49
  @api_key = api_key
26
50
  end
27
51
  end
52
+
28
53
  class ScriptServiceUserError < ScriptProjectError
29
54
  def initialize(query_name, errors)
30
55
  super("Failed performing #{query_name}. Errors: #{errors}.")
31
56
  end
32
57
  end
58
+
33
59
  class ShopAuthenticationError < ScriptProjectError; end
34
60
  class ShopScriptConflictError < ScriptProjectError; end
35
61
  class ShopScriptUndefinedError < ScriptProjectError; end
36
62
  class TaskRunnerNotFoundError < ScriptProjectError; end
37
- class PackagesOutdatedError < ScriptProjectError
38
- attr_reader :outdated_packages
39
- def initialize(outdated_packages)
40
- super("EP packages are outdated and need to be updated: #{outdated_packages.join(', ')}")
41
- @outdated_packages = outdated_packages
63
+ class BuildScriptNotFoundError < ScriptProjectError; end
64
+ class InvalidBuildScriptError < ScriptProjectError; end
65
+
66
+ class WebAssemblyBinaryNotFoundError < ScriptProjectError
67
+ def initialize
68
+ super("WebAssembly binary not found")
42
69
  end
43
70
  end
44
71
  end
@@ -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,37 @@ 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:, config_ui:)
11
+ build_file_path = file_path(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
+ description: script_project.description,
19
+ script_content: script_content,
20
+ compiled_type: compiled_type,
21
+ metadata: metadata,
22
+ config_ui: config_ui,
19
23
  )
20
24
  end
21
25
 
22
- def get_push_package(script, compiled_type)
23
- build_file_path = file_path(script.name, compiled_type)
24
-
26
+ def get_push_package(script_project:, compiled_type:, metadata:, config_ui:)
27
+ build_file_path = file_path(script_project.script_name, compiled_type)
25
28
  raise Domain::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
26
29
 
27
30
  script_content = File.read(build_file_path)
28
31
 
29
32
  Domain::PushPackage.new(
30
- build_file_path,
31
- script,
32
- script_content,
33
- compiled_type,
33
+ id: build_file_path,
34
+ extension_point_type: script_project.extension_point_type,
35
+ script_name: script_project.script_name,
36
+ description: script_project.description,
37
+ script_content: script_content,
38
+ compiled_type: compiled_type,
39
+ metadata: metadata,
40
+ config_ui: config_ui,
34
41
  )
35
42
  end
36
43
 
@@ -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
+ File.read(binary_path)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end