shopify-cli 2.4.0 → 2.6.2

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/shopify.yml +0 -2
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +14 -14
  5. data/.rubocop_todo.yml +3 -3
  6. data/CHANGELOG.md +25 -0
  7. data/Dockerfile +1 -3
  8. data/Gemfile.lock +22 -16
  9. data/README.md +1 -1
  10. data/RELEASING.md +1 -1
  11. data/Rakefile +25 -34
  12. data/bin/console +11 -0
  13. data/bin/shopify +17 -4
  14. data/dev.yml +3 -0
  15. data/ext/shopify-cli/extconf.rb +1 -0
  16. data/lib/project_types/extension/cli.rb +5 -3
  17. data/lib/project_types/extension/commands/build.rb +4 -3
  18. data/lib/project_types/extension/commands/check.rb +2 -2
  19. data/lib/project_types/extension/commands/connect.rb +1 -1
  20. data/lib/project_types/extension/commands/create.rb +41 -23
  21. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  22. data/lib/project_types/extension/commands/info.rb +1 -1
  23. data/lib/project_types/extension/commands/push.rb +1 -1
  24. data/lib/project_types/extension/commands/register.rb +2 -2
  25. data/lib/project_types/extension/commands/serve.rb +5 -5
  26. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  27. data/lib/project_types/extension/extension_project.rb +4 -4
  28. data/lib/project_types/extension/features/argo.rb +3 -3
  29. data/lib/project_types/extension/features/argo_config.rb +5 -5
  30. data/lib/project_types/extension/features/argo_serve.rb +21 -6
  31. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  32. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  33. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  34. data/lib/project_types/extension/forms/connect.rb +2 -2
  35. data/lib/project_types/extension/forms/create.rb +2 -2
  36. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  37. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  38. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  39. data/lib/project_types/extension/forms/questions/ask_template.rb +2 -2
  40. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  41. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  42. data/lib/project_types/extension/models/development_server.rb +49 -6
  43. data/lib/project_types/extension/models/development_server_requirements.rb +21 -3
  44. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  45. data/lib/project_types/extension/models/specification.rb +1 -1
  46. data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
  47. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  48. data/lib/project_types/extension/models/specifications.rb +4 -4
  49. data/lib/project_types/extension/tasks/choose_next_available_port.rb +1 -1
  50. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  51. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  52. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  53. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
  54. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  55. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  56. data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
  57. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  58. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  59. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  60. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  61. data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
  62. data/lib/project_types/extension/tasks/run_extension_command.rb +34 -11
  63. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  64. data/lib/project_types/node/cli.rb +3 -3
  65. data/lib/project_types/node/commands/connect.rb +4 -4
  66. data/lib/project_types/node/commands/create.rb +10 -10
  67. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  68. data/lib/project_types/node/commands/deploy.rb +3 -3
  69. data/lib/project_types/node/commands/generate.rb +2 -2
  70. data/lib/project_types/node/commands/open.rb +3 -3
  71. data/lib/project_types/node/commands/serve.rb +15 -7
  72. data/lib/project_types/node/commands/tunnel.rb +6 -6
  73. data/lib/project_types/node/forms/create.rb +3 -3
  74. data/lib/project_types/node/messages/messages.rb +3 -0
  75. data/lib/project_types/php/cli.rb +27 -0
  76. data/lib/project_types/php/commands/connect.rb +19 -0
  77. data/lib/project_types/php/commands/create.rb +143 -0
  78. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  79. data/lib/project_types/php/commands/deploy.rb +32 -0
  80. data/lib/project_types/php/commands/open.rb +16 -0
  81. data/lib/project_types/php/commands/serve.rb +51 -0
  82. data/lib/project_types/php/commands/tunnel.rb +37 -0
  83. data/lib/project_types/php/forms/create.rb +45 -0
  84. data/lib/project_types/php/messages/messages.rb +191 -0
  85. data/lib/project_types/rails/cli.rb +3 -3
  86. data/lib/project_types/rails/commands/connect.rb +4 -4
  87. data/lib/project_types/rails/commands/create.rb +12 -12
  88. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  89. data/lib/project_types/rails/commands/deploy.rb +3 -3
  90. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  91. data/lib/project_types/rails/commands/generate.rb +3 -3
  92. data/lib/project_types/rails/commands/open.rb +3 -3
  93. data/lib/project_types/rails/commands/serve.rb +8 -8
  94. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  95. data/lib/project_types/rails/forms/create.rb +3 -3
  96. data/lib/project_types/rails/gem.rb +1 -1
  97. data/lib/project_types/rails/ruby.rb +1 -1
  98. data/lib/project_types/script/cli.rb +15 -7
  99. data/lib/project_types/script/commands/create.rb +4 -2
  100. data/lib/project_types/script/commands/push.rb +2 -2
  101. data/lib/project_types/script/config/extension_points.yml +30 -29
  102. data/lib/project_types/script/forms/create.rb +1 -1
  103. data/lib/project_types/script/layers/application/create_script.rb +32 -12
  104. data/lib/project_types/script/layers/application/extension_points.rb +4 -4
  105. data/lib/project_types/script/layers/application/push_script.rb +4 -1
  106. data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
  107. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  108. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
  109. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  110. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  111. data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
  112. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
  113. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
  114. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
  115. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
  116. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
  117. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  118. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
  119. data/lib/project_types/script/layers/infrastructure/script_service.rb +4 -8
  120. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  121. data/lib/project_types/script/messages/messages.rb +4 -0
  122. data/lib/project_types/script/tasks/ensure_env.rb +6 -6
  123. data/lib/project_types/script/ui/error_handler.rb +83 -75
  124. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  125. data/lib/project_types/theme/cli.rb +3 -3
  126. data/lib/project_types/theme/commands/check.rb +3 -3
  127. data/lib/project_types/theme/commands/delete.rb +7 -7
  128. data/lib/project_types/theme/commands/init.rb +3 -3
  129. data/lib/project_types/theme/commands/language_server.rb +2 -2
  130. data/lib/project_types/theme/commands/package.rb +2 -2
  131. data/lib/project_types/theme/commands/publish.rb +5 -5
  132. data/lib/project_types/theme/commands/pull.rb +9 -9
  133. data/lib/project_types/theme/commands/push.rb +12 -12
  134. data/lib/project_types/theme/commands/serve.rb +4 -4
  135. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  136. data/lib/project_types/theme/forms/select.rb +2 -2
  137. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  138. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  139. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  140. data/lib/{shopify-cli → shopify_cli}/api.rb +12 -8
  141. data/lib/shopify_cli/command/app_sub_command.rb +16 -0
  142. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  143. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  144. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  145. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  146. data/lib/shopify_cli/commands/logout.rb +39 -0
  147. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  148. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  149. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  150. data/lib/shopify_cli/commands/populate.rb +23 -0
  151. data/lib/shopify_cli/commands/store.rb +15 -0
  152. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  153. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  154. data/lib/shopify_cli/commands/version.rb +15 -0
  155. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  156. data/lib/shopify_cli/commands.rb +34 -0
  157. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  158. data/lib/shopify_cli/constants.rb +54 -0
  159. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  160. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  161. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
  162. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  163. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  164. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  165. data/lib/shopify_cli/core.rb +8 -0
  166. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  167. data/lib/{shopify-cli → shopify_cli}/environment.rb +36 -5
  168. data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
  169. data/lib/shopify_cli/exception_reporter.rb +55 -0
  170. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  171. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  172. data/lib/{shopify-cli → shopify_cli}/git.rb +36 -6
  173. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  174. data/lib/shopify_cli/helpers.rb +5 -0
  175. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  176. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  177. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  178. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +8 -8
  179. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  180. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  181. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  182. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
  183. data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
  184. data/lib/shopify_cli/migrator/migration.rb +27 -0
  185. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
  186. data/lib/shopify_cli/migrator.rb +48 -0
  187. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  188. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  189. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  190. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +13 -13
  191. data/lib/shopify_cli/php_deps.rb +102 -0
  192. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
  193. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  194. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  195. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  196. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  197. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  198. data/lib/shopify_cli/resources.rb +5 -0
  199. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  200. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  201. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  202. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  203. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  204. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  205. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  206. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  207. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  208. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  209. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  210. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  211. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  212. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  213. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  214. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
  215. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  216. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +1 -1
  217. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  218. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
  219. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  220. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  221. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  222. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  223. data/lib/{shopify-cli → shopify_cli}/theme/development_theme.rb +9 -9
  224. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
  225. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
  226. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  227. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
  228. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  229. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  230. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  231. data/lib/shopify_cli/version.rb +3 -0
  232. data/lib/shopify_cli.rb +61 -52
  233. data/shopify-cli.gemspec +11 -3
  234. data/utilities/docker.rb +47 -0
  235. data/utilities/utilities.rb +5 -0
  236. metadata +133 -95
  237. data/lib/project_types/script/layers/infrastructure/api_clients.rb +0 -89
  238. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
  239. data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
  240. data/lib/shopify-cli/commands/logout.rb +0 -39
  241. data/lib/shopify-cli/commands/populate.rb +0 -23
  242. data/lib/shopify-cli/commands/store.rb +0 -15
  243. data/lib/shopify-cli/commands/version.rb +0 -15
  244. data/lib/shopify-cli/commands.rb +0 -34
  245. data/lib/shopify-cli/constants.rb +0 -26
  246. data/lib/shopify-cli/core.rb +0 -8
  247. data/lib/shopify-cli/helpers.rb +0 -5
  248. data/lib/shopify-cli/resources.rb +0 -5
  249. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  250. data/lib/shopify-cli/version.rb +0 -3
@@ -5,20 +5,85 @@ module Script
5
5
  module Infrastructure
6
6
  module Languages
7
7
  class ProjectCreator
8
- PROJECT_CREATORS = {
9
- "assemblyscript" => AssemblyScriptProjectCreator,
10
- "rust" => RustProjectCreator,
11
- }
12
-
13
- def self.for(ctx, language, extension_point, script_name, path_to_project)
14
- raise Errors::ProjectCreatorNotFoundError unless PROJECT_CREATORS[language]
15
- PROJECT_CREATORS[language].new(
8
+ include SmartProperties
9
+ property! :ctx, accepts: ShopifyCLI::Context
10
+ property! :type, accepts: String
11
+ property! :project_name, accepts: String
12
+ property! :path_to_project, accepts: String
13
+ property! :sparse_checkout_repo, accepts: String
14
+ property! :sparse_checkout_branch, accepts: String
15
+ property! :sparse_checkout_set_path, accepts: String
16
+
17
+ def self.for(
18
+ ctx:,
19
+ language:,
20
+ type:,
21
+ project_name:,
22
+ path_to_project:,
23
+ sparse_checkout_repo:,
24
+ sparse_checkout_branch:,
25
+ sparse_checkout_set_path:
26
+ )
27
+
28
+ project_creators = {
29
+ "assemblyscript" => AssemblyScriptProjectCreator,
30
+ "typescript" => TypeScriptProjectCreator,
31
+ }
32
+
33
+ raise Errors::ProjectCreatorNotFoundError unless project_creators[language]
34
+ project_creators[language].new(
16
35
  ctx: ctx,
17
- extension_point: extension_point,
18
- script_name: script_name,
19
- path_to_project: path_to_project
36
+ type: type,
37
+ project_name: project_name,
38
+ path_to_project: path_to_project,
39
+ sparse_checkout_repo: sparse_checkout_repo,
40
+ sparse_checkout_branch: sparse_checkout_branch,
41
+ sparse_checkout_set_path: sparse_checkout_set_path
42
+ )
43
+ end
44
+
45
+ def self.config_file
46
+ raise NotImplementedError
47
+ end
48
+
49
+ # the sparse checkout process is common to all script types
50
+ def setup_dependencies
51
+ setup_sparse_checkout
52
+ clean
53
+ update_project_name(File.join(path_to_project, self.class.config_file))
54
+ end
55
+
56
+ private
57
+
58
+ def setup_sparse_checkout
59
+ ShopifyCLI::Git.sparse_checkout(
60
+ sparse_checkout_repo,
61
+ sparse_checkout_set_path,
62
+ sparse_checkout_branch,
63
+ ctx
20
64
  )
21
65
  end
66
+
67
+ def clean
68
+ source = File.join(path_to_project, sparse_checkout_set_path, ".")
69
+ FileUtils.cp_r(source, path_to_project)
70
+ ctx.rm_rf(sparse_checkout_set_path.split("/")[0])
71
+ ctx.rm_rf(".git")
72
+ end
73
+
74
+ def update_project_name(config_file)
75
+ raise Errors::ProjectConfigNotFoundError unless File.exist?(config_file)
76
+ upstream_name = "#{type.gsub("_", "-")}-default"
77
+ contents = File.read(config_file)
78
+
79
+ raise Errors::InvalidProjectConfigError unless contents.include?(upstream_name)
80
+ new_contents = contents.gsub(upstream_name, project_name)
81
+ File.write(config_file, new_contents)
82
+ end
83
+
84
+ def command_runner
85
+ @command_runner ||= CommandRunner.new(ctx: ctx)
86
+ end
22
87
  end
23
88
  end
24
89
  end
@@ -7,7 +7,7 @@ module Script
7
7
  class TaskRunner
8
8
  TASK_RUNNERS = {
9
9
  "assemblyscript" => AssemblyScriptTaskRunner,
10
- "rust" => RustTaskRunner,
10
+ "typescript" => TypeScriptTaskRunner,
11
11
  }
12
12
 
13
13
  def self.for(ctx, language, script_name)
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ module Languages
7
+ class TypeScriptProjectCreator < ProjectCreator
8
+ MIN_NODE_VERSION = "14.15.0"
9
+ NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
10
+ NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
11
+
12
+ def self.config_file
13
+ "package.json"
14
+ end
15
+
16
+ def setup_dependencies
17
+ super
18
+ command_runner.call(NPM_SET_REGISTRY_COMMAND)
19
+ command_runner.call(NPM_SET_ENGINE_STRICT_COMMAND)
20
+
21
+ if ctx.file_exist?("yarn.lock")
22
+ ctx.rm("yarn.lock")
23
+ end
24
+
25
+ if ctx.file_exist?("package-lock.json")
26
+ ctx.rm("package-lock.json")
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ module Languages
7
+ class TypeScriptTaskRunner
8
+ BYTECODE_FILE = "build/%{name}.wasm"
9
+ METADATA_FILE = "build/metadata.json"
10
+ SCRIPT_SDK_BUILD = "npm run build"
11
+ GEN_METADATA = "npm run gen-metadata"
12
+
13
+ attr_reader :ctx, :script_name
14
+
15
+ def initialize(ctx, script_name)
16
+ @ctx = ctx
17
+ @script_name = script_name
18
+ end
19
+
20
+ def build
21
+ compile
22
+ bytecode
23
+ end
24
+
25
+ def compiled_type
26
+ "wasm"
27
+ end
28
+
29
+ def install_dependencies
30
+ check_node_version!
31
+
32
+ output, status = ctx.capture2e("npm install --no-audit --no-optional --legacy-peer-deps --loglevel error")
33
+ raise Errors::DependencyInstallError, output unless status.success?
34
+ end
35
+
36
+ def dependencies_installed?
37
+ # Assuming if node_modules folder exist at root of script folder, all deps are installed
38
+ ctx.dir_exist?("node_modules")
39
+ end
40
+
41
+ def metadata
42
+ unless @ctx.file_exist?(METADATA_FILE)
43
+ msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
44
+ raise Domain::Errors::MetadataNotFoundError, msg
45
+ end
46
+
47
+ raw_contents = File.read(METADATA_FILE)
48
+ Domain::Metadata.create_from_json(@ctx, raw_contents)
49
+ end
50
+
51
+ private
52
+
53
+ def check_node_version!
54
+ output, status = @ctx.capture2e("node", "--version")
55
+ raise Errors::DependencyInstallError, output unless status.success?
56
+
57
+ require "semantic/semantic"
58
+ version = ::Semantic::Version.new(output[1..-1])
59
+ unless version >= ::Semantic::Version.new(TypeScriptProjectCreator::MIN_NODE_VERSION)
60
+ raise Errors::DependencyInstallError,
61
+ "Node version must be >= v#{TypeScriptProjectCreator::MIN_NODE_VERSION}. "\
62
+ "Current version: #{output.strip}."
63
+ end
64
+ end
65
+
66
+ def compile
67
+ check_compilation_dependencies!
68
+ CommandRunner.new(ctx: ctx).call(SCRIPT_SDK_BUILD)
69
+ CommandRunner.new(ctx: ctx).call(GEN_METADATA)
70
+ end
71
+
72
+ def check_compilation_dependencies!
73
+ pkg = JSON.parse(File.read("package.json"))
74
+ build_script = pkg.dig("scripts", "build")
75
+
76
+ raise Errors::BuildScriptNotFoundError,
77
+ "Build script not found" if build_script.nil?
78
+
79
+ unless build_script.start_with?("javy")
80
+ raise Errors::InvalidBuildScriptError, "Invalid build script"
81
+ end
82
+ end
83
+
84
+ def bytecode
85
+ legacy_filename = format(BYTECODE_FILE, name: script_name)
86
+ filename = format(BYTECODE_FILE, name: "index")
87
+
88
+ bytecode_file = if ctx.file_exist?(filename)
89
+ filename
90
+ elsif ctx.file_exist?(legacy_filename)
91
+ legacy_filename
92
+ else
93
+ raise Errors::WebAssemblyBinaryNotFoundError
94
+ end
95
+
96
+ contents = ctx.binread(bytecode_file)
97
+ ctx.rm(bytecode_file)
98
+
99
+ contents
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  class PushPackageRepository
7
7
  include SmartProperties
8
- property! :ctx, accepts: ShopifyCli::Context
8
+ property! :ctx, accepts: ShopifyCLI::Context
9
9
 
10
10
  def create_push_package(script_project:, script_content:, compiled_type:, metadata:)
11
11
  build_file_path = file_path(script_project.id, compiled_type)
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  class ScriptProjectRepository
7
7
  include SmartProperties
8
- property! :ctx, accepts: ShopifyCli::Context
8
+ property! :ctx, accepts: ShopifyCLI::Context
9
9
 
10
10
  SCRIPT_JSON_FILENAME = "script.json"
11
11
  MUTABLE_ENV_VALUES = %i(uuid)
@@ -13,7 +13,7 @@ module Script
13
13
  def create(script_name:, extension_point_type:, language:)
14
14
  validate_metadata!(extension_point_type, language)
15
15
 
16
- ShopifyCli::Project.write(
16
+ ShopifyCLI::Project.write(
17
17
  ctx,
18
18
  project_type: :script,
19
19
  organization_id: nil,
@@ -63,7 +63,7 @@ module Script
63
63
  end
64
64
 
65
65
  def create_env(api_key:, secret:, uuid:)
66
- ShopifyCli::Resources::EnvFile.new(
66
+ ShopifyCLI::Resources::EnvFile.new(
67
67
  api_key: api_key,
68
68
  secret: secret,
69
69
  extra: {
@@ -125,11 +125,11 @@ module Script
125
125
  end
126
126
 
127
127
  def project
128
- @project ||= ShopifyCli::Project.current(force_reload: true)
128
+ @project ||= ShopifyCLI::Project.current(force_reload: true)
129
129
  end
130
130
 
131
131
  def default_language
132
- Domain::ExtensionPoint::ExtensionPointAssemblyScriptSDK.language
132
+ "assemblyscript"
133
133
  end
134
134
 
135
135
  def validate_metadata!(extension_point_type, language)
@@ -142,7 +142,7 @@ module Script
142
142
 
143
143
  class ScriptJsonRepository
144
144
  include SmartProperties
145
- property! :ctx, accepts: ShopifyCli::Context
145
+ property! :ctx, accepts: ShopifyCLI::Context
146
146
 
147
147
  def get
148
148
  current_script_json || raise(Domain::Errors::NoScriptJsonFile)
@@ -7,13 +7,9 @@ module Script
7
7
  module Layers
8
8
  module Infrastructure
9
9
  class ScriptService
10
- include SmartProperties
11
- property! :ctx, accepts: ShopifyCli::Context
12
- property! :api_key, accepts: String
13
-
14
- def initialize(*args, ctx:, api_key:, **kwargs)
15
- super(*args, ctx: ctx, api_key: api_key, **kwargs)
16
- @client = ApiClients.default_client(ctx, api_key)
10
+ def initialize(client:, api_key:)
11
+ @client = client
12
+ @api_key = api_key
17
13
  end
18
14
 
19
15
  def set_app_script(
@@ -68,7 +64,7 @@ module Script
68
64
 
69
65
  def get_app_scripts(extension_point_type:)
70
66
  query_name = "get_app_scripts"
71
- variables = { appKey: api_key, extensionPointName: extension_point_type.upcase }
67
+ variables = { appKey: @api_key, extensionPointName: extension_point_type.upcase }
72
68
  response = make_request(query_name: query_name, variables: variables)
73
69
  response["data"]["appScripts"]
74
70
  end
@@ -0,0 +1,20 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ class ServiceLocator
5
+ def self.api_client(ctx:, api_key:)
6
+ if ENV["BYPASS_PARTNERS_PROXY"]
7
+ ApiClients::ScriptServiceApiClient.new(ctx, api_key)
8
+ else
9
+ ApiClients::PartnersProxyApiClient.new(ctx, api_key)
10
+ end
11
+ end
12
+
13
+ def self.script_service(ctx:, api_key:)
14
+ client = api_client(ctx: ctx, api_key: api_key)
15
+ ScriptService.new(client: client, api_key: api_key)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -142,6 +142,10 @@ module Script
142
142
  "Check that your build npm script outputs the generated binary to the root of the directory." \
143
143
  "Generated binary should match the script name: <script_name>.wasm",
144
144
 
145
+ project_config_not_found: "Internal error - Script can't be created because the project's config file is missing from the repository.",
146
+
147
+ invalid_project_config: "Internal error - Script can't be created because the project's config file is invalid in the repository.",
148
+
145
149
  script_upload_cause: "Fail to upload script.",
146
150
  script_upload_help: "Try again.",
147
151
  },
@@ -2,7 +2,7 @@ require "shopify_cli"
2
2
 
3
3
  module Script
4
4
  module Tasks
5
- class EnsureEnv < ShopifyCli::Task
5
+ class EnsureEnv < ShopifyCLI::Task
6
6
  attr_accessor :ctx
7
7
 
8
8
  def call(ctx)
@@ -31,11 +31,11 @@ module Script
31
31
  def ask_org
32
32
  return stubbed_org if partner_proxy_bypass
33
33
 
34
- if ShopifyCli::Shopifolk.check && wants_to_run_against_shopify_org?
35
- ShopifyCli::Shopifolk.act_as_shopify_organization
34
+ if ShopifyCLI::Shopifolk.check && wants_to_run_against_shopify_org?
35
+ ShopifyCLI::Shopifolk.act_as_shopify_organization
36
36
  end
37
37
 
38
- orgs = ShopifyCli::PartnersAPI::Organizations.fetch_with_app(ctx)
38
+ orgs = ShopifyCLI::PartnersAPI::Organizations.fetch_with_app(ctx)
39
39
  if orgs.count == 1
40
40
  default = orgs.first
41
41
  ctx.puts(ctx.message("script.application.ensure_env.organization", default["businessName"], default["id"]))
@@ -69,7 +69,7 @@ module Script
69
69
  end
70
70
 
71
71
  def ask_app(apps)
72
- unless ShopifyCli::Shopifolk.acting_as_shopify_organization?
72
+ unless ShopifyCLI::Shopifolk.acting_as_shopify_organization?
73
73
  apps = apps.select { |app| app["appType"] == "custom" }
74
74
  end
75
75
 
@@ -89,7 +89,7 @@ module Script
89
89
  end
90
90
 
91
91
  def ask_script_uuid(app, extension_point_type)
92
- script_service = Layers::Infrastructure::ScriptService.new(ctx: ctx, api_key: app["apiKey"])
92
+ script_service = Layers::Infrastructure::ServiceLocator.script_service(ctx: ctx, api_key: app["apiKey"])
93
93
  scripts = script_service.get_app_scripts(extension_point_type: extension_point_type)
94
94
 
95
95
  return nil unless scripts.count > 0 &&