shopify-cli 1.4.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+ module Theme
3
+ module Messages
4
+ MESSAGES = {
5
+ theme: {
6
+ connect: {
7
+ duplicate: "Duplicate directory, theme files weren't connected",
8
+ help: <<~HELP,
9
+ {{command:%s connect theme}}: Connects an existing theme in your store to Shopify App CLI. Downloads a copy of the theme files to your local development environment.
10
+ Usage: {{command:%s connect theme}}
11
+ Options:
12
+ {{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
13
+ {{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
14
+ {{command:--themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
15
+ HELP
16
+ inside_project: "You are inside an existing theme, theme files weren't connected",
17
+ connect: "Downloading theme files...",
18
+ failed: "Couldn't download theme files from store",
19
+ connected: "{{green:%s}} files were downloaded from {{underline:%s}} to {{green:%s}}",
20
+ },
21
+ create: {
22
+ creating_theme: "Creating theme %s",
23
+ duplicate_theme: "Duplicate theme",
24
+ failed: "Couldn't create the theme",
25
+ help: <<~HELP,
26
+ {{command:%s create theme}}: Creates a theme.
27
+ Usage: {{command:%s create theme}}
28
+ Options:
29
+ {{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
30
+ {{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
31
+ {{command:--name=NAME}} Theme name. Any string.
32
+ HELP
33
+ info: {
34
+ created: "{{green:%s}} was created for {{underline:%s}} in {{green:%s}}",
35
+ },
36
+ },
37
+ deploy: {
38
+ abort: "Theme wasn't deployed",
39
+ confirmation: "This will change your live theme. Do you wish to proceed?",
40
+ deploying: "Deploying theme",
41
+ error: "Theme couldn't be deployed",
42
+ help: <<~HELP,
43
+ {{command:%s deploy}}: Uploads your local theme files to Shopify, then sets your theme as the live theme.
44
+ Usage: {{command:%s deploy}}
45
+ HELP
46
+ info: {
47
+ deployed: "Theme was updated and set as the live theme",
48
+ pushed: "All theme files were updated",
49
+ },
50
+ push_fail: "Theme files couldn't be updated",
51
+ },
52
+ forms: {
53
+ ask_password: "Password:",
54
+ ask_store: "Store domain:",
55
+ create: {
56
+ ask_title: "Title:",
57
+ private_app: <<~APP,
58
+ To create a new theme, Shopify App CLI needs to connect with a private app installed on your store. Visit {{underline:%s/admin/apps/private}} to create a new API key and password, or retrieve an existing password.
59
+ If you create a new private app, ensure that it has Read and Write Theme access.
60
+ APP
61
+ },
62
+ connect: {
63
+ private_app: <<~APP,
64
+ To fetch your existing themes, Shopify App CLI needs to connect with your store. Visit {{underline:%s/admin/apps/private}} to create a new API key and password, or retrieve an existing password.
65
+ If you create a new private app, ensure that it has Read and Write Theme access.
66
+ APP
67
+ },
68
+ errors: "%s can't be blank",
69
+ },
70
+ generate: {
71
+ env: {
72
+ ask_password: "Password",
73
+ ask_password_default: "Password (defaults to {{green:%s}})",
74
+ ask_store: "Store",
75
+ ask_store_default: "Store (defaults to {{green:%s}})",
76
+ ask_theme: "Select theme",
77
+ help: <<~HELP,
78
+ Create or update configuration file in the current directory.
79
+ Usage: {{command:%s generate env}}
80
+ Options:
81
+ {{command:--store=MYSHOPIFYDOMAIN}} Store URL. Must be an existing store with private apps enabled.
82
+ {{command:--password=PASSWORD}} Private app password. App must have Read and Write Theme access.
83
+ {{command:--themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
84
+ HELP
85
+ no_themes: "Please create a new theme using %s create theme",
86
+ },
87
+ help: <<~HELP,
88
+ Generate code in your Theme. Currently supports generating new envs.
89
+ Usage: {{command:%s generate [ env ]}}
90
+ HELP
91
+ },
92
+ push: {
93
+ remove_abort: "Theme files weren't deleted",
94
+ remove_confirm: "This will delete the local and remote copies of the theme files. Do you wish to proceed?",
95
+ error: {
96
+ push_error: "Theme files couldn't be pushed to Shopify",
97
+ remove_error: "Theme files couldn't be removed from Shopify",
98
+ },
99
+ help: <<~HELP,
100
+ {{command:%s push}}: Uploads your local theme files to Shopify, overwriting the remote versions. If you specify filenames, separated by a space, only those files will be replaced. Otherwise, the whole theme will be replaced.
101
+ Usage: {{command:%s push}}
102
+ Options:
103
+ {{command:--remove}} Deletes both the local and the remote copies of the specified files. At least one filename must be specified.
104
+ {{command:--allow-live}} Allows Shopify App CLI to replace files on the store's live production theme.
105
+ {{command:--nodelete}} Runs the push command without deleting remote files from Shopify.
106
+ HELP
107
+ info: {
108
+ push: "Theme files were pushed from {{green:%s}} to Shopify",
109
+ remove: "Theme files were deleted from {{green:%s}} and Shopify",
110
+ },
111
+ push: "Pushing theme files to Shopify",
112
+ remove: "Deleting theme files",
113
+ },
114
+ serve: {
115
+ help: <<~HELP,
116
+ Sync your current changes, then view the active store in your default browser. Any theme edits will continue to update in real time. Also prints the active store's URL in your terminal.
117
+ Usage: {{command:%s serve}}
118
+ HELP
119
+ serve: "Viewing theme...",
120
+ open_fail: "Couldn't open the theme",
121
+ },
122
+ tasks: {
123
+ ensure_themekit_installed: {
124
+ auto_update: "Would you like to enable auto-updating?",
125
+ downloading: "Downloading Theme Kit %s",
126
+ errors: {
127
+ digest_fail: "Unable to verify download",
128
+ releases_fail: "Unable to fetch Theme Kit's list of releases",
129
+ update_fail: "Unable to update Theme Kit",
130
+ write_fail: "Unable to download Theme Kit",
131
+ },
132
+ installing_themekit: "Installing Theme Kit",
133
+ successful: "Theme Kit installed successfully",
134
+ updating_themekit: "Updating Theme Kit",
135
+ verifying: "Verifying download...",
136
+ },
137
+ },
138
+ themekit: {
139
+ query_themes: {
140
+ bad_password: "Bad password",
141
+ not_connect: "Couldn't connect to given shop",
142
+ },
143
+ },
144
+ },
145
+ }.freeze
146
+ end
147
+ end
@@ -0,0 +1,78 @@
1
+ module Theme
2
+ module Tasks
3
+ class EnsureThemekitInstalled < ShopifyCli::Task
4
+ URL = "https://shopify-themekit.s3.amazonaws.com/releases/latest.json"
5
+ OSMAP = {
6
+ mac: "darwin-amd64",
7
+ linux: "linux-amd64",
8
+ windows: "windows-amd64",
9
+ }
10
+ VERSION_CHECK_INTERVAL = 604800
11
+ VERSION_CHECK_SECTION = "themekit_version_check"
12
+ LAST_CHECKED_AT_FIELD = "last_checked_at"
13
+
14
+ def call(ctx)
15
+ _out, stat = ctx.capture2e(Themekit::THEMEKIT)
16
+ unless stat.success?
17
+ CLI::UI::Frame.open(ctx.message("theme.tasks.ensure_themekit_installed.installing_themekit")) do
18
+ install_themekit(ctx)
19
+ end
20
+ end
21
+
22
+ now = Time.now.to_i
23
+ if ShopifyCli::Feature.enabled?(:themekit_auto_update) && (time_of_last_check + VERSION_CHECK_INTERVAL) < now
24
+ CLI::UI::Frame.open(ctx.message("theme.tasks.ensure_themekit_installed.updating_themekit")) do
25
+ unless Themekit.update(ctx)
26
+ ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.update_fail"))
27
+ end
28
+ update_time_of_last_check(now)
29
+ end
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def install_themekit(ctx)
36
+ require "json"
37
+ require "fileutils"
38
+ require "digest"
39
+ require "open-uri"
40
+
41
+ begin
42
+ begin
43
+ releases = JSON.parse(Net::HTTP.get(URI(URL)))
44
+ release = releases["platforms"].find { |r| r["name"] == OSMAP[ctx.os] }
45
+ rescue
46
+ ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.releases_fail"))
47
+ end
48
+
49
+ ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.downloading", releases["version"]))
50
+ _out, stat = ctx.capture2e("curl", "-o", Themekit::THEMEKIT, release["url"])
51
+ ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.write_fail")) unless stat.success?
52
+
53
+ ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.verifying"))
54
+ if Digest::MD5.file(Themekit::THEMEKIT) == release["digest"]
55
+ FileUtils.chmod("+x", Themekit::THEMEKIT)
56
+ ctx.puts(ctx.message("theme.tasks.ensure_themekit_installed.successful"))
57
+
58
+ auto = CLI::UI.confirm(ctx.message("theme.tasks.ensure_themekit_installed.auto_update"))
59
+ ShopifyCli::Feature.set(:themekit_auto_update, auto)
60
+ else
61
+ ctx.abort(ctx.message("theme.tasks.ensure_themekit_installed.errors.digest_fail"))
62
+ end
63
+ rescue StandardError, ShopifyCli::Abort => e
64
+ FileUtils.rm(Themekit::THEMEKIT) if File.exist?(Themekit::THEMEKIT)
65
+ raise e
66
+ end
67
+ end
68
+
69
+ def time_of_last_check
70
+ (val = ShopifyCli::Config.get(VERSION_CHECK_SECTION, LAST_CHECKED_AT_FIELD)) ? val.to_i : 0
71
+ end
72
+
73
+ def update_time_of_last_check(time)
74
+ ShopifyCli::Config.set(VERSION_CHECK_SECTION, LAST_CHECKED_AT_FIELD, time)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,113 @@
1
+ module Theme
2
+ class Themekit
3
+ THEMEKIT = File.join(ShopifyCli.cache_dir, "themekit")
4
+
5
+ class << self
6
+ def add_flags(flags)
7
+ flags.map do |key, value|
8
+ flag = "--#{key}"
9
+ flag += "=#{value}" if value.is_a?(String)
10
+ flag
11
+ end
12
+ end
13
+
14
+ def connect(ctx, store:, password:, themeid:, env:)
15
+ command = build_command("get", env)
16
+ command << "--password=#{password}"
17
+ command << "--store=#{store}"
18
+ command << "--themeid=#{themeid}"
19
+
20
+ stat = ctx.system(*command)
21
+ stat.success?
22
+ end
23
+
24
+ def create(ctx, password:, store:, name:, env:)
25
+ command = build_command("new", env)
26
+ command << "--password=#{password}"
27
+ command << "--store=#{store}"
28
+ command << "--name=#{name}"
29
+
30
+ stat = ctx.system(*command)
31
+ stat.success?
32
+ end
33
+
34
+ def deploy(ctx, flags: nil, env:)
35
+ unless push(ctx, flags: flags, env: env)
36
+ ctx.abort(ctx.message("theme.deploy.push_fail"))
37
+ end
38
+ ctx.done(ctx.message("theme.deploy.info.pushed"))
39
+
40
+ command = build_command("publish", env)
41
+ (command << flags).compact!
42
+ command.flatten!
43
+
44
+ stat = ctx.system(*command)
45
+ stat.success?
46
+ end
47
+
48
+ def generate_env(ctx, store:, password:, themeid:, env:)
49
+ command = build_command("configure", env)
50
+ command << "--password=#{password}"
51
+ command << "--store=#{store}"
52
+ command << "--themeid=#{themeid}"
53
+
54
+ stat = ctx.system(*command)
55
+ stat.success?
56
+ end
57
+
58
+ def push(ctx, files: nil, flags: nil, remove: false, env:)
59
+ action = remove ? "remove" : "deploy"
60
+ command = build_command(action, env)
61
+
62
+ (command << files << flags).compact!
63
+ command.flatten!
64
+
65
+ stat = ctx.system(*command)
66
+ stat.success?
67
+ end
68
+
69
+ def query_themes(ctx, store:, password:)
70
+ begin
71
+ resp = ::ShopifyCli::AdminAPI.rest_request(
72
+ ctx,
73
+ shop: store,
74
+ token: password,
75
+ path: "themes.json",
76
+ )
77
+ rescue ShopifyCli::API::APIRequestUnauthorizedError
78
+ ctx.abort(ctx.message("theme.themekit.query_themes.bad_password"))
79
+ rescue StandardError
80
+ ctx.abort(ctx.message("theme.themekit.query_themes.not_connect"))
81
+ end
82
+
83
+ resp[1]["themes"].map { |theme| [theme["name"], theme["id"]] }.to_h
84
+ end
85
+
86
+ def serve(ctx, flags: nil, env:)
87
+ command = build_command("open", env)
88
+ out, stat = ctx.capture2e(*command)
89
+ ctx.puts(out)
90
+ ctx.abort(ctx.message("theme.serve.open_fail")) unless stat.success?
91
+
92
+ command = build_command("watch", env)
93
+ (command << flags).compact!
94
+ command.flatten!
95
+ ctx.system(*command)
96
+ end
97
+
98
+ def update(ctx)
99
+ command = build_command("update")
100
+ ctx.system(*command)
101
+ end
102
+
103
+ private
104
+
105
+ def build_command(action, env = nil)
106
+ command = [THEMEKIT, action]
107
+ command << "--no-update-notifier"
108
+ command << "--env=#{env}" if env
109
+ command
110
+ end
111
+ end
112
+ end
113
+ end
@@ -1,5 +1,5 @@
1
1
  Gem.post_uninstall do |uninstaller|
2
- if uninstaller.spec.name == 'shopify-cli'
2
+ if uninstaller.spec.name == "shopify-cli"
3
3
  if RUBY_PLATFORM.match(/mingw32/)
4
4
  bat_path = File.dirname(RbConfig.ruby)
5
5
  bat = "#{bat_path}\\shopify.bat"
@@ -7,9 +7,9 @@ Gem.post_uninstall do |uninstaller|
7
7
  # delete the auto-generated batch script
8
8
  File.unlink(bat)
9
9
  else
10
- require 'fileutils'
10
+ require "fileutils"
11
11
 
12
- symlink = '/usr/local/bin/shopify'
12
+ symlink = "/usr/local/bin/shopify"
13
13
 
14
14
  # delete the symbolic link IFF it exists AND it does not point to a file
15
15
  # (i.e., it's been left hanging as a result of the uninstall, as expected)
@@ -1,4 +1,4 @@
1
- require 'shopify_cli'
1
+ require "shopify_cli"
2
2
 
3
3
  module ShopifyCli
4
4
  ##
@@ -6,8 +6,8 @@ module ShopifyCli
6
6
  # these concerns are taken care of.
7
7
  #
8
8
  class AdminAPI < API
9
- autoload :PopulateResourceCommand, 'shopify-cli/admin_api/populate_resource_command'
10
- autoload :Schema, 'shopify-cli/admin_api/schema'
9
+ autoload :PopulateResourceCommand, "shopify-cli/admin_api/populate_resource_command"
10
+ autoload :Schema, "shopify-cli/admin_api/schema"
11
11
 
12
12
  class << self
13
13
  ##
@@ -43,6 +43,46 @@ module ShopifyCli
43
43
  end
44
44
  end
45
45
 
46
+ ##
47
+ #
48
+ #
49
+ #
50
+ # #### Parameters
51
+ # - `ctx`: running context from your command
52
+ # - `shop`: shop domain string for shop whose admin you are calling
53
+ # - `path`: path string (excluding prefixes and API version) for specific JSON that you are requesting
54
+ # ex. "data.json" instead of "/admin/api/unstable/data.json"
55
+ # - `body`: data string for corresponding REST request types
56
+ # - `method`: REST request string for the type of request; if nil, will perform GET request
57
+ # - `api_version`: API version string to specify version; if nil, latest will be used
58
+ # - `token`: shop password string for authentication to shop
59
+ #
60
+ # #### Raises
61
+ #
62
+ # * http 404 will raise a ShopifyCli::API::APIRequestNotFoundError
63
+ # * http 400..499 will raise a ShopifyCli::API::APIRequestClientError
64
+ # * http 500..599 will raise a ShopifyCli::API::APIRequestServerError
65
+ # * All other codes will raise ShopifyCli::API::APIRequestUnexpectedError
66
+ #
67
+ # #### Returns
68
+ #
69
+ # * `resp` - JSON response array
70
+ #
71
+ # #### Example
72
+ #
73
+ # ShopifyCli::AdminAPI.rest_request(@ctx,
74
+ # shop: 'shop.myshopify.com',
75
+ # path: 'data.json',
76
+ # token: 'password')
77
+ #
78
+ def rest_request(ctx, shop:, path:, body: nil, method: "GET", api_version: nil, token: nil)
79
+ ShopifyCli::DB.set(admin_access_token: token) unless token.nil?
80
+ url = URI::HTTPS.build(host: shop, path: "/admin/api/#{fetch_api_version(ctx, api_version, shop)}/#{path}")
81
+ resp = api_client(ctx, api_version, shop, path: path).request(url: url.to_s, body: body, method: method)
82
+ ShopifyCli::DB.set(admin_access_token: nil) unless token.nil?
83
+ resp
84
+ end
85
+
46
86
  private
47
87
 
48
88
  def authenticated_req(ctx, shop)
@@ -56,21 +96,21 @@ module ShopifyCli
56
96
  env = Project.current.env
57
97
  ShopifyCli::OAuth.new(
58
98
  ctx: ctx,
59
- service: 'admin',
99
+ service: "admin",
60
100
  client_id: env.api_key,
61
101
  secret: env.secret,
62
102
  scopes: env.scopes,
63
103
  token_path: "/access_token",
64
- options: { 'grant_options[]' => 'per user' },
104
+ options: { "grant_options[]" => "per user" },
65
105
  ).authenticate("https://#{shop}/admin/oauth")
66
106
  end
67
107
 
68
- def api_client(ctx, api_version, shop)
108
+ def api_client(ctx, api_version, shop, path: "graphql.json")
69
109
  new(
70
110
  ctx: ctx,
71
- auth_header: 'X-Shopify-Access-Token',
111
+ auth_header: "X-Shopify-Access-Token",
72
112
  token: admin_access_token(ctx, shop),
73
- url: "https://#{shop}/admin/api/#{fetch_api_version(ctx, api_version, shop)}/graphql.json",
113
+ url: "https://#{shop}/admin/api/#{fetch_api_version(ctx, api_version, shop)}/#{path}",
74
114
  )
75
115
  end
76
116
 
@@ -85,13 +125,13 @@ module ShopifyCli
85
125
  return api_version unless api_version.nil?
86
126
  client = new(
87
127
  ctx: ctx,
88
- auth_header: 'X-Shopify-Access-Token',
128
+ auth_header: "X-Shopify-Access-Token",
89
129
  token: admin_access_token(ctx, shop),
90
130
  url: "https://#{shop}/admin/api/unstable/graphql.json",
91
131
  )
92
- versions = client.query('api_versions')['data']['publicApiVersions']
93
- latest = versions.find { |version| version['displayName'].include?('Latest') }
94
- latest['handle']
132
+ versions = client.query("api_versions")["data"]["publicApiVersions"]
133
+ latest = versions.find { |version| version["displayName"].include?("Latest") }
134
+ latest["handle"]
95
135
  end
96
136
  end
97
137
  end