@shopify/cli-kit 3.69.3 → 3.70.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 (514) hide show
  1. package/{assets/cli-ruby/LICENSE → LICENSE} +0 -2
  2. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.d.ts +41 -0
  3. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.js +165 -0
  4. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.js.map +1 -0
  5. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.d.ts +29 -0
  6. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.js +100 -0
  7. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.js.map +1 -0
  8. package/dist/cli/api/graphql/admin/generated/theme_delete.d.ts +17 -0
  9. package/dist/cli/api/graphql/admin/generated/theme_delete.js +53 -0
  10. package/dist/cli/api/graphql/admin/generated/theme_delete.js.map +1 -0
  11. package/dist/cli/api/graphql/admin/generated/theme_publish.d.ts +21 -0
  12. package/dist/cli/api/graphql/admin/generated/theme_publish.js +65 -0
  13. package/dist/cli/api/graphql/admin/generated/theme_publish.js.map +1 -0
  14. package/dist/cli/api/graphql/admin/generated/theme_update.d.ts +23 -0
  15. package/dist/cli/api/graphql/admin/generated/theme_update.js +75 -0
  16. package/dist/cli/api/graphql/admin/generated/theme_update.js.map +1 -0
  17. package/dist/private/node/api/graphql.d.ts +2 -2
  18. package/dist/private/node/api/graphql.js +4 -4
  19. package/dist/private/node/api/graphql.js.map +1 -1
  20. package/dist/private/node/api/headers.js +1 -1
  21. package/dist/private/node/api/headers.js.map +1 -1
  22. package/dist/private/node/api/rest.d.ts +1 -2
  23. package/dist/private/node/api/rest.js +2 -3
  24. package/dist/private/node/api/rest.js.map +1 -1
  25. package/dist/private/node/api.js +12 -1
  26. package/dist/private/node/api.js.map +1 -1
  27. package/dist/private/node/conf-store.d.ts +9 -4
  28. package/dist/private/node/conf-store.js +8 -6
  29. package/dist/private/node/conf-store.js.map +1 -1
  30. package/dist/private/node/constants.d.ts +1 -0
  31. package/dist/private/node/constants.js +1 -0
  32. package/dist/private/node/constants.js.map +1 -1
  33. package/dist/private/node/session/schema.d.ts +40 -40
  34. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +1 -0
  35. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -2
  36. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  37. package/dist/public/common/version.d.ts +1 -1
  38. package/dist/public/common/version.js +1 -1
  39. package/dist/public/common/version.js.map +1 -1
  40. package/dist/public/node/analytics.js +1 -2
  41. package/dist/public/node/analytics.js.map +1 -1
  42. package/dist/public/node/api/admin.d.ts +2 -1
  43. package/dist/public/node/api/admin.js +25 -9
  44. package/dist/public/node/api/admin.js.map +1 -1
  45. package/dist/public/node/api/graphql.js +1 -1
  46. package/dist/public/node/api/graphql.js.map +1 -1
  47. package/dist/public/node/base-command.js +4 -0
  48. package/dist/public/node/base-command.js.map +1 -1
  49. package/dist/public/node/cli.d.ts +4 -0
  50. package/dist/public/node/cli.js +7 -1
  51. package/dist/public/node/cli.js.map +1 -1
  52. package/dist/public/node/context/local.js +7 -0
  53. package/dist/public/node/context/local.js.map +1 -1
  54. package/dist/public/node/error-handler.js +1 -1
  55. package/dist/public/node/error-handler.js.map +1 -1
  56. package/dist/public/node/error.js +4 -13
  57. package/dist/public/node/error.js.map +1 -1
  58. package/dist/public/node/global-context.d.ts +15 -0
  59. package/dist/public/node/global-context.js +29 -0
  60. package/dist/public/node/global-context.js.map +1 -0
  61. package/dist/public/node/is-global.js +2 -1
  62. package/dist/public/node/is-global.js.map +1 -1
  63. package/dist/public/node/node-package-manager.js +1 -1
  64. package/dist/public/node/node-package-manager.js.map +1 -1
  65. package/dist/public/node/notifications-system.d.ts +191 -0
  66. package/dist/public/node/notifications-system.js +234 -0
  67. package/dist/public/node/notifications-system.js.map +1 -0
  68. package/dist/public/node/themes/api.d.ts +4 -12
  69. package/dist/public/node/themes/api.js +162 -32
  70. package/dist/public/node/themes/api.js.map +1 -1
  71. package/dist/public/node/themes/types.d.ts +1 -0
  72. package/dist/public/node/themes/types.js.map +1 -1
  73. package/dist/public/node/themes/utils.d.ts +2 -0
  74. package/dist/public/node/themes/utils.js +11 -0
  75. package/dist/public/node/themes/utils.js.map +1 -1
  76. package/dist/public/node/version.d.ts +13 -0
  77. package/dist/public/node/version.js +38 -0
  78. package/dist/public/node/version.js.map +1 -0
  79. package/dist/tsconfig.tsbuildinfo +1 -1
  80. package/package.json +4 -5
  81. package/assets/cli-ruby/.devcontainer.json +0 -5
  82. package/assets/cli-ruby/.rubocop.yml +0 -102
  83. package/assets/cli-ruby/.rubocop_todo.yml +0 -24
  84. package/assets/cli-ruby/CHANGELOG.md +0 -634
  85. package/assets/cli-ruby/CONTRIBUTING.md +0 -3
  86. package/assets/cli-ruby/Codespace.dockerfile +0 -35
  87. package/assets/cli-ruby/Gemfile +0 -32
  88. package/assets/cli-ruby/README.md +0 -30
  89. package/assets/cli-ruby/Rakefile +0 -167
  90. package/assets/cli-ruby/SECURITY.md +0 -59
  91. package/assets/cli-ruby/Tests.dockerfile +0 -35
  92. package/assets/cli-ruby/assets/logo.png +0 -0
  93. package/assets/cli-ruby/bin/console +0 -11
  94. package/assets/cli-ruby/bin/load_shopify.rb +0 -22
  95. package/assets/cli-ruby/bin/shopify +0 -67
  96. package/assets/cli-ruby/bin/shopify.bat +0 -3
  97. package/assets/cli-ruby/dev.yml +0 -29
  98. package/assets/cli-ruby/docs/README.md +0 -13
  99. package/assets/cli-ruby/docs/contributors/testing.md +0 -27
  100. package/assets/cli-ruby/docs/users/installation.md +0 -3
  101. package/assets/cli-ruby/docs/users/migrate-from-themekit.md +0 -18
  102. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256 +0 -1
  103. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256 +0 -1
  104. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256 +0 -1
  105. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +0 -1
  106. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256 +0 -1
  107. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256 +0 -1
  108. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256 +0 -1
  109. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +0 -1
  110. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256 +0 -1
  111. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256 +0 -1
  112. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256 +0 -1
  113. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +0 -1
  114. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256 +0 -1
  115. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256 +0 -1
  116. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256 +0 -1
  117. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +0 -1
  118. package/assets/cli-ruby/ext/javy/javy.rb +0 -204
  119. package/assets/cli-ruby/ext/javy/version +0 -1
  120. package/assets/cli-ruby/ext/shopify-extensions/extconf.rb +0 -21
  121. package/assets/cli-ruby/ext/shopify-extensions/shopify_extensions.rb +0 -152
  122. package/assets/cli-ruby/ext/shopify-extensions/version +0 -1
  123. package/assets/cli-ruby/features/support/assertions.rb +0 -17
  124. package/assets/cli-ruby/features/support/cli.rb +0 -7
  125. package/assets/cli-ruby/features/support/process.rb +0 -27
  126. package/assets/cli-ruby/features/support/requires.rb +0 -3
  127. package/assets/cli-ruby/lib/docgen/class_template.md.erb +0 -81
  128. package/assets/cli-ruby/lib/docgen/index_template.md.erb +0 -5
  129. package/assets/cli-ruby/lib/docgen/markdown.rb +0 -101
  130. package/assets/cli-ruby/lib/graphql/admin_introspection.graphql +0 -87
  131. package/assets/cli-ruby/lib/graphql/all_organizations.graphql +0 -19
  132. package/assets/cli-ruby/lib/graphql/all_orgs_with_apps.graphql +0 -30
  133. package/assets/cli-ruby/lib/graphql/api_versions.graphql +0 -6
  134. package/assets/cli-ruby/lib/graphql/convert_dev_to_test_store.graphql +0 -10
  135. package/assets/cli-ruby/lib/graphql/create_app.graphql +0 -20
  136. package/assets/cli-ruby/lib/graphql/create_customer.graphql +0 -9
  137. package/assets/cli-ruby/lib/graphql/create_draft_order.graphql +0 -8
  138. package/assets/cli-ruby/lib/graphql/create_product.graphql +0 -9
  139. package/assets/cli-ruby/lib/graphql/extension_create.graphql +0 -37
  140. package/assets/cli-ruby/lib/graphql/extension_update_draft.graphql +0 -19
  141. package/assets/cli-ruby/lib/graphql/fetch_specifications.graphql +0 -14
  142. package/assets/cli-ruby/lib/graphql/find_organization.graphql +0 -18
  143. package/assets/cli-ruby/lib/graphql/find_organization_with_apps.graphql +0 -20
  144. package/assets/cli-ruby/lib/graphql/get_app_by_api_key.graphql +0 -9
  145. package/assets/cli-ruby/lib/graphql/get_app_urls.graphql +0 -6
  146. package/assets/cli-ruby/lib/graphql/get_extension_registrations.graphql +0 -28
  147. package/assets/cli-ruby/lib/graphql/get_variant_id.graphql +0 -16
  148. package/assets/cli-ruby/lib/graphql/update_dashboard_urls.graphql +0 -8
  149. package/assets/cli-ruby/lib/project_types/extension/cli.rb +0 -75
  150. package/assets/cli-ruby/lib/project_types/extension/commands/extension_command.rb +0 -29
  151. package/assets/cli-ruby/lib/project_types/extension/commands/serve.rb +0 -164
  152. package/assets/cli-ruby/lib/project_types/extension/errors.rb +0 -9
  153. package/assets/cli-ruby/lib/project_types/extension/extension_project.rb +0 -151
  154. package/assets/cli-ruby/lib/project_types/extension/extension_project_keys.rb +0 -12
  155. package/assets/cli-ruby/lib/project_types/extension/features/argo.rb +0 -50
  156. package/assets/cli-ruby/lib/project_types/extension/features/argo_config.rb +0 -59
  157. package/assets/cli-ruby/lib/project_types/extension/features/argo_dependencies.rb +0 -28
  158. package/assets/cli-ruby/lib/project_types/extension/features/argo_runtime.rb +0 -15
  159. package/assets/cli-ruby/lib/project_types/extension/features/argo_serve.rb +0 -115
  160. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup.rb +0 -54
  161. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_step.rb +0 -31
  162. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_steps.rb +0 -51
  163. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/admin.rb +0 -29
  164. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/base.rb +0 -19
  165. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +0 -23
  166. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +0 -29
  167. package/assets/cli-ruby/lib/project_types/extension/loaders/project.rb +0 -50
  168. package/assets/cli-ruby/lib/project_types/extension/loaders/specification_handler.rb +0 -22
  169. package/assets/cli-ruby/lib/project_types/extension/messages/message_loading.rb +0 -34
  170. package/assets/cli-ruby/lib/project_types/extension/messages/messages.rb +0 -320
  171. package/assets/cli-ruby/lib/project_types/extension/models/app.rb +0 -14
  172. package/assets/cli-ruby/lib/project_types/extension/models/lazy_specification_handler.rb +0 -12
  173. package/assets/cli-ruby/lib/project_types/extension/models/specification.rb +0 -41
  174. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/default.rb +0 -145
  175. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +0 -134
  176. package/assets/cli-ruby/lib/project_types/extension/models/specifications.rb +0 -91
  177. package/assets/cli-ruby/lib/project_types/extension/models/validation_error.rb +0 -17
  178. package/assets/cli-ruby/lib/project_types/extension/models/version.rb +0 -15
  179. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_features.rb +0 -73
  180. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_options.rb +0 -21
  181. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/validation_error_converter.rb +0 -25
  182. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/version_converter.rb +0 -28
  183. package/assets/cli-ruby/lib/project_types/extension/tasks/fetch_specifications.rb +0 -21
  184. package/assets/cli-ruby/lib/project_types/node/cli.rb +0 -12
  185. package/assets/cli-ruby/lib/project_types/node/forms/create.rb +0 -45
  186. package/assets/cli-ruby/lib/project_types/node/messages/messages.rb +0 -33
  187. package/assets/cli-ruby/lib/project_types/php/cli.rb +0 -16
  188. package/assets/cli-ruby/lib/project_types/php/forms/create.rb +0 -44
  189. package/assets/cli-ruby/lib/project_types/php/messages/messages.rb +0 -29
  190. package/assets/cli-ruby/lib/project_types/rails/cli.rb +0 -15
  191. package/assets/cli-ruby/lib/project_types/rails/forms/create.rb +0 -75
  192. package/assets/cli-ruby/lib/project_types/rails/gem.rb +0 -110
  193. package/assets/cli-ruby/lib/project_types/rails/messages/messages.rb +0 -101
  194. package/assets/cli-ruby/lib/project_types/script/cli.rb +0 -27
  195. package/assets/cli-ruby/lib/project_types/script/commands/connect.rb +0 -16
  196. package/assets/cli-ruby/lib/project_types/script/commands/create.rb +0 -24
  197. package/assets/cli-ruby/lib/project_types/script/commands/javy.rb +0 -24
  198. package/assets/cli-ruby/lib/project_types/script/commands/push.rb +0 -26
  199. package/assets/cli-ruby/lib/project_types/script/loaders/project.rb +0 -46
  200. package/assets/cli-ruby/lib/project_types/script/loaders/specification_handler.rb +0 -22
  201. package/assets/cli-ruby/lib/project_types/script/messages/messages.rb +0 -11
  202. package/assets/cli-ruby/lib/project_types/theme/cli.rb +0 -33
  203. package/assets/cli-ruby/lib/project_types/theme/commands/common/root_helper.rb +0 -94
  204. package/assets/cli-ruby/lib/project_types/theme/commands/common/shop_helper.rb +0 -13
  205. package/assets/cli-ruby/lib/project_types/theme/commands/console.rb +0 -23
  206. package/assets/cli-ruby/lib/project_types/theme/commands/delete.rb +0 -70
  207. package/assets/cli-ruby/lib/project_types/theme/commands/init.rb +0 -46
  208. package/assets/cli-ruby/lib/project_types/theme/commands/list.rb +0 -33
  209. package/assets/cli-ruby/lib/project_types/theme/commands/open.rb +0 -73
  210. package/assets/cli-ruby/lib/project_types/theme/commands/package.rb +0 -73
  211. package/assets/cli-ruby/lib/project_types/theme/commands/publish.rb +0 -49
  212. package/assets/cli-ruby/lib/project_types/theme/commands/pull.rb +0 -118
  213. package/assets/cli-ruby/lib/project_types/theme/commands/push.rb +0 -160
  214. package/assets/cli-ruby/lib/project_types/theme/commands/serve.rb +0 -91
  215. package/assets/cli-ruby/lib/project_types/theme/commands/share.rb +0 -62
  216. package/assets/cli-ruby/lib/project_types/theme/commands/token.rb +0 -22
  217. package/assets/cli-ruby/lib/project_types/theme/conversions/base_glob.rb +0 -65
  218. package/assets/cli-ruby/lib/project_types/theme/conversions/ignore_glob.rb +0 -15
  219. package/assets/cli-ruby/lib/project_types/theme/conversions/include_glob.rb +0 -15
  220. package/assets/cli-ruby/lib/project_types/theme/forms/confirm_store.rb +0 -15
  221. package/assets/cli-ruby/lib/project_types/theme/forms/select.rb +0 -34
  222. package/assets/cli-ruby/lib/project_types/theme/messages/messages.rb +0 -429
  223. package/assets/cli-ruby/lib/project_types/theme/models/specification_handlers/theme.rb +0 -19
  224. package/assets/cli-ruby/lib/project_types/theme/presenters/theme_presenter.rb +0 -48
  225. package/assets/cli-ruby/lib/project_types/theme/presenters/themes_presenter.rb +0 -29
  226. package/assets/cli-ruby/lib/project_types/theme/ui/sync_progress_bar.rb +0 -20
  227. package/assets/cli-ruby/lib/rubygems_plugin.rb +0 -26
  228. package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +0 -160
  229. package/assets/cli-ruby/lib/shopify_cli/api.rb +0 -130
  230. package/assets/cli-ruby/lib/shopify_cli/command/project_command.rb +0 -31
  231. package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +0 -20
  232. package/assets/cli-ruby/lib/shopify_cli/command.rb +0 -166
  233. package/assets/cli-ruby/lib/shopify_cli/commands.rb +0 -21
  234. package/assets/cli-ruby/lib/shopify_cli/constants.rb +0 -101
  235. package/assets/cli-ruby/lib/shopify_cli/context.rb +0 -709
  236. package/assets/cli-ruby/lib/shopify_cli/core/cli_version.rb +0 -20
  237. package/assets/cli-ruby/lib/shopify_cli/core/entry_point.rb +0 -64
  238. package/assets/cli-ruby/lib/shopify_cli/core/executor.rb +0 -23
  239. package/assets/cli-ruby/lib/shopify_cli/core/finalize.rb +0 -13
  240. package/assets/cli-ruby/lib/shopify_cli/core/monorail.rb +0 -122
  241. package/assets/cli-ruby/lib/shopify_cli/core.rb +0 -8
  242. package/assets/cli-ruby/lib/shopify_cli/db.rb +0 -114
  243. package/assets/cli-ruby/lib/shopify_cli/environment.rb +0 -217
  244. package/assets/cli-ruby/lib/shopify_cli/exception_reporter.rb +0 -80
  245. package/assets/cli-ruby/lib/shopify_cli/feature.rb +0 -95
  246. package/assets/cli-ruby/lib/shopify_cli/file_system_listener.rb +0 -30
  247. package/assets/cli-ruby/lib/shopify_cli/form.rb +0 -42
  248. package/assets/cli-ruby/lib/shopify_cli/git.rb +0 -320
  249. package/assets/cli-ruby/lib/shopify_cli/github/issue_url_generator.rb +0 -30
  250. package/assets/cli-ruby/lib/shopify_cli/github.rb +0 -5
  251. package/assets/cli-ruby/lib/shopify_cli/helpers/haikunator.rb +0 -92
  252. package/assets/cli-ruby/lib/shopify_cli/helpers.rb +0 -5
  253. package/assets/cli-ruby/lib/shopify_cli/http_request.rb +0 -43
  254. package/assets/cli-ruby/lib/shopify_cli/identity_auth/env_auth_token.rb +0 -34
  255. package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +0 -332
  256. package/assets/cli-ruby/lib/shopify_cli/js_system.rb +0 -115
  257. package/assets/cli-ruby/lib/shopify_cli/lazy_delegator.rb +0 -55
  258. package/assets/cli-ruby/lib/shopify_cli/messages/messages.rb +0 -863
  259. package/assets/cli-ruby/lib/shopify_cli/method_object.rb +0 -123
  260. package/assets/cli-ruby/lib/shopify_cli/migrator/migration.rb +0 -27
  261. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +0 -13
  262. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +0 -41
  263. package/assets/cli-ruby/lib/shopify_cli/migrator.rb +0 -46
  264. package/assets/cli-ruby/lib/shopify_cli/options.rb +0 -40
  265. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions/job.rb +0 -36
  266. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions.rb +0 -46
  267. package/assets/cli-ruby/lib/shopify_cli/partners_api/organizations.rb +0 -45
  268. package/assets/cli-ruby/lib/shopify_cli/partners_api.rb +0 -91
  269. package/assets/cli-ruby/lib/shopify_cli/project.rb +0 -199
  270. package/assets/cli-ruby/lib/shopify_cli/project_type.rb +0 -66
  271. package/assets/cli-ruby/lib/shopify_cli/reporting_configuration_controller.rb +0 -29
  272. package/assets/cli-ruby/lib/shopify_cli/resolve_constant.rb +0 -25
  273. package/assets/cli-ruby/lib/shopify_cli/resources/env_file.rb +0 -108
  274. package/assets/cli-ruby/lib/shopify_cli/resources.rb +0 -5
  275. package/assets/cli-ruby/lib/shopify_cli/result.rb +0 -448
  276. package/assets/cli-ruby/lib/shopify_cli/shopifolk.rb +0 -82
  277. package/assets/cli-ruby/lib/shopify_cli/task.rb +0 -20
  278. package/assets/cli-ruby/lib/shopify_cli/tasks/confirm_store.rb +0 -18
  279. package/assets/cli-ruby/lib/shopify_cli/tasks/create_api_client.rb +0 -40
  280. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_authenticated.rb +0 -19
  281. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_dev_store.rb +0 -41
  282. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_env.rb +0 -90
  283. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_git_dependency.rb +0 -14
  284. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_loopback_url.rb +0 -20
  285. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_project_type.rb +0 -14
  286. package/assets/cli-ruby/lib/shopify_cli/tasks/select_org_and_shop.rb +0 -81
  287. package/assets/cli-ruby/lib/shopify_cli/tasks/update_dashboard_urls.rb +0 -57
  288. package/assets/cli-ruby/lib/shopify_cli/tasks.rb +0 -44
  289. package/assets/cli-ruby/lib/shopify_cli/theme/backoff_helper.rb +0 -47
  290. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +0 -82
  291. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/certificate_manager.rb +0 -79
  292. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/errors.rb +0 -9
  293. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/header_hash.rb +0 -98
  294. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hooks/file_change_hook.rb +0 -77
  295. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb +0 -62
  296. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +0 -63
  297. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +0 -27
  298. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot_reload.js +0 -48
  299. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/sse_client.js +0 -43
  300. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme.js +0 -114
  301. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme_extension.js +0 -121
  302. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/script_injector.rb +0 -57
  303. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb +0 -50
  304. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload.rb +0 -75
  305. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/local_assets.rb +0 -101
  306. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +0 -313
  307. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy_param_builder.rb +0 -84
  308. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/reload_mode.rb +0 -34
  309. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +0 -35
  310. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher.rb +0 -44
  311. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/sse.rb +0 -75
  312. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/watcher.rb +0 -64
  313. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/web_server.rb +0 -140
  314. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server.rb +0 -332
  315. package/assets/cli-ruby/lib/shopify_cli/theme/development_theme.rb +0 -101
  316. package/assets/cli-ruby/lib/shopify_cli/theme/extension/app_extension.rb +0 -40
  317. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hooks/file_change_hook.rb +0 -76
  318. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload/script_injector.rb +0 -30
  319. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload.rb +0 -13
  320. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/local_assets.rb +0 -31
  321. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/proxy_param_builder.rb +0 -94
  322. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/watcher.rb +0 -49
  323. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server.rb +0 -175
  324. package/assets/cli-ruby/lib/shopify_cli/theme/extension/host_theme.rb +0 -109
  325. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ignore_helper.rb +0 -35
  326. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/extension_serve_job.rb +0 -120
  327. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/operation.rb +0 -25
  328. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer.rb +0 -100
  329. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_progress_bar.rb +0 -35
  330. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_raw_progress_bar.rb +0 -40
  331. package/assets/cli-ruby/lib/shopify_cli/theme/file.rb +0 -133
  332. package/assets/cli-ruby/lib/shopify_cli/theme/filter/path_matcher.rb +0 -38
  333. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_filter.rb +0 -112
  334. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_helper.rb +0 -37
  335. package/assets/cli-ruby/lib/shopify_cli/theme/include_filter.rb +0 -67
  336. package/assets/cli-ruby/lib/shopify_cli/theme/mime_type.rb +0 -34
  337. package/assets/cli-ruby/lib/shopify_cli/theme/notifier.rb +0 -52
  338. package/assets/cli-ruby/lib/shopify_cli/theme/repl/api.rb +0 -109
  339. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_dev_server.rb +0 -93
  340. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_middleware.rb +0 -97
  341. package/assets/cli-ruby/lib/shopify_cli/theme/repl/remote_evaluator.rb +0 -166
  342. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/success.html +0 -78
  343. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/template.liquid +0 -15
  344. package/assets/cli-ruby/lib/shopify_cli/theme/repl/snippet.rb +0 -81
  345. package/assets/cli-ruby/lib/shopify_cli/theme/repl.rb +0 -88
  346. package/assets/cli-ruby/lib/shopify_cli/theme/root.rb +0 -62
  347. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/checksums.rb +0 -66
  348. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/downloader.rb +0 -63
  349. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/error_reporter.rb +0 -45
  350. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/merger.rb +0 -53
  351. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/operation.rb +0 -49
  352. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/standard_reporter.rb +0 -32
  353. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/unsupported_script_warning.rb +0 -90
  354. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk.rb +0 -133
  355. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_item.rb +0 -64
  356. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_job.rb +0 -139
  357. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_request.rb +0 -30
  358. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all.rb +0 -41
  359. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +0 -37
  360. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/base_strategy_form.rb +0 -64
  361. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +0 -29
  362. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_update_strategy.rb +0 -30
  363. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_delete_handler.rb +0 -49
  364. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_update_handler.rb +0 -71
  365. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader.rb +0 -231
  366. package/assets/cli-ruby/lib/shopify_cli/theme/syncer.rb +0 -391
  367. package/assets/cli-ruby/lib/shopify_cli/theme/theme.rb +0 -212
  368. package/assets/cli-ruby/lib/shopify_cli/theme/theme_access_api.rb +0 -89
  369. package/assets/cli-ruby/lib/shopify_cli/theme/theme_admin_api.rb +0 -101
  370. package/assets/cli-ruby/lib/shopify_cli/thread_pool/job.rb +0 -35
  371. package/assets/cli-ruby/lib/shopify_cli/thread_pool.rb +0 -49
  372. package/assets/cli-ruby/lib/shopify_cli/transform_data_structure.rb +0 -87
  373. package/assets/cli-ruby/lib/shopify_cli/utilities.rb +0 -21
  374. package/assets/cli-ruby/lib/shopify_cli/version.rb +0 -3
  375. package/assets/cli-ruby/lib/shopify_cli.rb +0 -182
  376. package/assets/cli-ruby/shipit.rubygems.yml +0 -3
  377. package/assets/cli-ruby/shopify-cli.gemspec +0 -46
  378. package/assets/cli-ruby/shopify-dev +0 -16
  379. package/assets/cli-ruby/test/minitest_ext.rb +0 -115
  380. package/assets/cli-ruby/test/project_types/extension/extension_test_helpers.rb +0 -70
  381. package/assets/cli-ruby/test/shopify-cli/migrator/migrations/migration_helper.rb +0 -20
  382. package/assets/cli-ruby/test/test_helpers.rb +0 -16
  383. package/assets/cli-ruby/utilities/constants.rb +0 -7
  384. package/assets/cli-ruby/utilities/docker/container.rb +0 -104
  385. package/assets/cli-ruby/utilities/docker.rb +0 -89
  386. package/assets/cli-ruby/utilities/utilities.rb +0 -6
  387. package/assets/cli-ruby/vendor/deps/cli-kit/REVISION +0 -1
  388. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +0 -21
  389. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +0 -49
  390. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +0 -94
  391. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/config.rb +0 -133
  392. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +0 -123
  393. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/executor.rb +0 -79
  394. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ini.rb +0 -102
  395. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +0 -82
  396. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/logger.rb +0 -82
  397. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +0 -60
  398. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ruby_backports/enumerable.rb +0 -6
  399. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +0 -244
  400. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support.rb +0 -9
  401. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/system.rb +0 -243
  402. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/util.rb +0 -193
  403. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/version.rb +0 -5
  404. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit.rb +0 -60
  405. package/assets/cli-ruby/vendor/deps/cli-ui/REVISION +0 -1
  406. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +0 -157
  407. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/color.rb +0 -84
  408. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +0 -193
  409. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +0 -98
  410. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +0 -166
  411. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +0 -139
  412. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +0 -120
  413. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame.rb +0 -269
  414. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +0 -84
  415. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/os.rb +0 -73
  416. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/printer.rb +0 -59
  417. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress.rb +0 -90
  418. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress_plain.rb +0 -50
  419. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +0 -484
  420. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +0 -29
  421. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +0 -282
  422. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +0 -40
  423. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +0 -263
  424. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +0 -66
  425. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +0 -232
  426. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +0 -46
  427. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +0 -102
  428. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/version.rb +0 -5
  429. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +0 -27
  430. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +0 -61
  431. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +0 -77
  432. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +0 -56
  433. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui.rb +0 -234
  434. package/assets/cli-ruby/vendor/deps/ruby2_keywords/LICENSE +0 -22
  435. package/assets/cli-ruby/vendor/deps/ruby2_keywords/README.md +0 -67
  436. package/assets/cli-ruby/vendor/deps/ruby2_keywords/Rakefile +0 -54
  437. package/assets/cli-ruby/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +0 -57
  438. package/assets/cli-ruby/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +0 -18
  439. package/assets/cli-ruby/vendor/deps/ruby2_keywords/test/test_keyword.rb +0 -41
  440. package/assets/cli-ruby/vendor/deps/smart_properties/REVISION +0 -1
  441. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/errors.rb +0 -114
  442. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property.rb +0 -168
  443. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property_collection.rb +0 -83
  444. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations/ancestor.rb +0 -27
  445. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations.rb +0 -8
  446. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/version.rb +0 -3
  447. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties.rb +0 -174
  448. package/assets/cli-ruby/vendor/deps/webrick/Gemfile +0 -3
  449. package/assets/cli-ruby/vendor/deps/webrick/LICENSE.txt +0 -22
  450. package/assets/cli-ruby/vendor/deps/webrick/README.md +0 -61
  451. package/assets/cli-ruby/vendor/deps/webrick/Rakefile +0 -10
  452. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/accesslog.rb +0 -157
  453. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cgi.rb +0 -313
  454. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/compat.rb +0 -36
  455. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/config.rb +0 -158
  456. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cookie.rb +0 -172
  457. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/htmlutils.rb +0 -30
  458. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +0 -117
  459. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +0 -116
  460. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +0 -395
  461. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +0 -132
  462. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +0 -97
  463. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +0 -158
  464. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +0 -53
  465. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth.rb +0 -96
  466. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpproxy.rb +0 -354
  467. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httprequest.rb +0 -636
  468. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpresponse.rb +0 -564
  469. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/https.rb +0 -152
  470. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpserver.rb +0 -294
  471. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +0 -152
  472. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +0 -47
  473. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +0 -126
  474. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +0 -88
  475. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +0 -552
  476. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +0 -47
  477. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet.rb +0 -23
  478. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpstatus.rb +0 -194
  479. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httputils.rb +0 -512
  480. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpversion.rb +0 -76
  481. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/log.rb +0 -156
  482. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/server.rb +0 -381
  483. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/ssl.rb +0 -215
  484. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/utils.rb +0 -265
  485. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/version.rb +0 -18
  486. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick.rb +0 -232
  487. package/assets/cli-ruby/vendor/deps/webrick/webrick.gemspec +0 -74
  488. package/assets/cli-ruby/vendor/gen/lib/gen/commands/help.rb +0 -20
  489. package/assets/cli-ruby/vendor/gen/lib/gen/commands/new.rb +0 -21
  490. package/assets/cli-ruby/vendor/gen/lib/gen/commands.rb +0 -18
  491. package/assets/cli-ruby/vendor/gen/lib/gen/entry_point.rb +0 -10
  492. package/assets/cli-ruby/vendor/gen/lib/gen/generator.rb +0 -165
  493. package/assets/cli-ruby/vendor/gen/lib/gen.rb +0 -39
  494. package/assets/cli-ruby/vendor/gen/template/Gemfile +0 -10
  495. package/assets/cli-ruby/vendor/gen/template/README.md +0 -1
  496. package/assets/cli-ruby/vendor/gen/template/bin/testunit +0 -23
  497. package/assets/cli-ruby/vendor/gen/template/bin/update-deps +0 -97
  498. package/assets/cli-ruby/vendor/gen/template/dev-gems.yml +0 -3
  499. package/assets/cli-ruby/vendor/gen/template/dev-vendor.yml +0 -4
  500. package/assets/cli-ruby/vendor/gen/template/exe/__app__-gems +0 -17
  501. package/assets/cli-ruby/vendor/gen/template/exe/__app__-vendor +0 -18
  502. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/example.rb +0 -19
  503. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/help.rb +0 -21
  504. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands.rb +0 -18
  505. package/assets/cli-ruby/vendor/gen/template/lib/__app__/entry_point.rb +0 -10
  506. package/assets/cli-ruby/vendor/gen/template/lib/__app__.rb +0 -33
  507. package/assets/cli-ruby/vendor/gen/template/test/example_test.rb +0 -17
  508. package/assets/cli-ruby/vendor/gen/template/test/test_helper.rb +0 -22
  509. package/assets/cli-ruby/vendor/lib/semantic/LICENSE +0 -20
  510. package/assets/cli-ruby/vendor/lib/semantic/semantic.rb +0 -4
  511. package/assets/cli-ruby/vendor/lib/semantic/version.rb +0 -179
  512. package/dist/public/node/ruby.d.ts +0 -38
  513. package/dist/public/node/ruby.js +0 -327
  514. package/dist/public/node/ruby.js.map +0 -1
@@ -0,0 +1,234 @@
1
+ import { versionSatisfies } from './node-package-manager.js';
2
+ import { renderError, renderInfo, renderWarning } from './ui.js';
3
+ import { getCurrentCommandId } from './global-context.js';
4
+ import { outputDebug } from './output.js';
5
+ import { zod } from './schema.js';
6
+ import { AbortSilentError } from './error.js';
7
+ import { CLI_KIT_VERSION } from '../common/version.js';
8
+ import { cacheRetrieve, cacheRetrieveOrRepopulate, cacheStore, } from '../../private/node/conf-store.js';
9
+ import { fetch } from '@shopify/cli-kit/node/http';
10
+ const URL = 'https://cdn.shopify.com/static/cli/notifications.json';
11
+ const CACHE_DURATION_IN_MS = 3600 * 1000;
12
+ function url() {
13
+ return process.env.SHOPIFY_CLI_NOTIFICATIONS_URL ?? URL;
14
+ }
15
+ const NotificationSchema = zod.object({
16
+ id: zod.string(),
17
+ message: zod.string(),
18
+ type: zod.enum(['info', 'warning', 'error']),
19
+ frequency: zod.enum(['always', 'once', 'once_a_day', 'once_a_week']),
20
+ ownerChannel: zod.string(),
21
+ cta: zod
22
+ .object({
23
+ label: zod.string(),
24
+ url: zod.string().url(),
25
+ })
26
+ .optional(),
27
+ title: zod.string().optional(),
28
+ minVersion: zod.string().optional(),
29
+ maxVersion: zod.string().optional(),
30
+ minDate: zod.string().optional(),
31
+ maxDate: zod.string().optional(),
32
+ commands: zod.array(zod.string()).optional(),
33
+ surface: zod.string().optional(),
34
+ });
35
+ const NotificationsSchema = zod.object({ notifications: zod.array(NotificationSchema) });
36
+ /**
37
+ * Shows notifications to the user if they meet the criteria specified in the notifications.json file.
38
+ *
39
+ * @param currentSurfaces - The surfaces present in the current project (usually for app extensions).
40
+ * @returns - A promise that resolves when the notifications have been shown.
41
+ */
42
+ export async function showNotificationsIfNeeded(currentSurfaces) {
43
+ try {
44
+ const notifications = await getNotifications();
45
+ const commandId = getCurrentCommandId();
46
+ const notificationsToShow = filterNotifications(notifications.notifications, commandId, currentSurfaces);
47
+ outputDebug(`Notifications to show: ${notificationsToShow.length}`);
48
+ await renderNotifications(notificationsToShow);
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ }
51
+ catch (error) {
52
+ if (error.message === 'abort')
53
+ throw new AbortSilentError();
54
+ const errorMessage = `Error retrieving notifications: ${error.message}`;
55
+ outputDebug(errorMessage);
56
+ // This is very prone to becoming a circular dependency, so we import it dynamically
57
+ const { sendErrorToBugsnag } = await import('./error-handler.js');
58
+ await sendErrorToBugsnag(errorMessage, 'unexpected_error');
59
+ }
60
+ }
61
+ /**
62
+ * Renders the first 2 notifications to the user.
63
+ *
64
+ * @param notifications - The notifications to render.
65
+ */
66
+ async function renderNotifications(notifications) {
67
+ notifications.slice(0, 2).forEach((notification) => {
68
+ const content = {
69
+ headline: notification.title,
70
+ body: notification.message.replaceAll('\\n', '\n'),
71
+ link: notification.cta,
72
+ };
73
+ switch (notification.type) {
74
+ case 'info': {
75
+ renderInfo(content);
76
+ break;
77
+ }
78
+ case 'warning': {
79
+ renderWarning(content);
80
+ break;
81
+ }
82
+ case 'error': {
83
+ renderError(content);
84
+ throw new Error('abort');
85
+ }
86
+ }
87
+ cacheStore(`notification-${notification.id}`, new Date().getTime().toString());
88
+ });
89
+ }
90
+ /**
91
+ * Get notifications list from cache (refreshed every hour) or fetch it if not present.
92
+ *
93
+ * @returns A Notifications object.
94
+ */
95
+ export async function getNotifications() {
96
+ const cacheKey = `notifications-${url()}`;
97
+ const rawNotifications = await cacheRetrieveOrRepopulate(cacheKey, fetchNotifications, CACHE_DURATION_IN_MS);
98
+ const notifications = JSON.parse(rawNotifications);
99
+ return NotificationsSchema.parse(notifications);
100
+ }
101
+ /**
102
+ * Fetch notifications from GitHub.
103
+ */
104
+ async function fetchNotifications() {
105
+ outputDebug(`No cached notifications found. Fetching them...`);
106
+ const response = await fetch(url(), { signal: AbortSignal.timeout(3 * 1000) });
107
+ if (response.status !== 200)
108
+ throw new Error(`Failed to fetch notifications: ${response.statusText}`);
109
+ return response.text();
110
+ }
111
+ /**
112
+ * Filters notifications based on the version of the CLI.
113
+ *
114
+ * @param notifications - The notifications to filter.
115
+ * @param commandId - The command ID to filter by.
116
+ * @param currentSurfaces - The surfaces present in the current project (usually for app extensions).
117
+ * @param today - The current date.
118
+ * @param currentVersion - The current version of the CLI.
119
+ * @returns - The filtered notifications.
120
+ */
121
+ export function filterNotifications(notifications, commandId, currentSurfaces, today = new Date(new Date().setUTCHours(0, 0, 0, 0)), currentVersion = CLI_KIT_VERSION) {
122
+ return notifications
123
+ .filter((notification) => filterByVersion(notification, currentVersion))
124
+ .filter((notifications) => filterByDate(notifications, today))
125
+ .filter((notification) => filterByCommand(notification, commandId))
126
+ .filter((notification) => filterBySurface(notification, commandId, currentSurfaces))
127
+ .filter((notification) => filterByFrequency(notification));
128
+ }
129
+ /**
130
+ * Filters notifications based on the version of the CLI.
131
+ *
132
+ * @param notification - The notification to filter.
133
+ * @param currentVersion - The current version of the CLI.
134
+ */
135
+ function filterByVersion(notification, currentVersion) {
136
+ const minVersion = !notification.minVersion || versionSatisfies(currentVersion, `>=${notification.minVersion}`);
137
+ const maxVersion = !notification.maxVersion || versionSatisfies(currentVersion, `<=${notification.maxVersion}`);
138
+ return minVersion && maxVersion;
139
+ }
140
+ /**
141
+ * Filters notifications based on the date.
142
+ *
143
+ * @param notification - The notification to filter.
144
+ * @param today - The current date.
145
+ */
146
+ function filterByDate(notification, today) {
147
+ const minDate = !notification.minDate || new Date(notification.minDate) <= today;
148
+ const maxDate = !notification.maxDate || new Date(notification.maxDate) >= today;
149
+ return minDate && maxDate;
150
+ }
151
+ /**
152
+ * Filters notifications based on the command ID.
153
+ *
154
+ * @param notification - The notification to filter.
155
+ * @param commandId - The command ID to filter by.
156
+ * @returns - A boolean indicating whether the notification should be shown.
157
+ */
158
+ function filterByCommand(notification, commandId) {
159
+ if (commandId === '')
160
+ return true;
161
+ return !notification.commands || notification.commands.includes(commandId);
162
+ }
163
+ /**
164
+ * Filters notifications based on the surface.
165
+ *
166
+ * @param notification - The notification to filter.
167
+ * @param commandId - The command id.
168
+ * @param surfacesFromContext - The surfaces present in the current project (usually for app extensions).
169
+ * @returns - A boolean indicating whether the notification should be shown.
170
+ */
171
+ function filterBySurface(notification, commandId, surfacesFromContext) {
172
+ const surfaceFromCommand = commandId.split(':')[0] ?? 'all';
173
+ const notificationSurface = notification.surface ?? 'all';
174
+ if (surfacesFromContext)
175
+ return surfacesFromContext.includes(notificationSurface);
176
+ return notificationSurface === surfaceFromCommand || notificationSurface === 'all';
177
+ }
178
+ /**
179
+ * Filters notifications based on the frequency.
180
+ *
181
+ * @param notification - The notification to filter.
182
+ * @returns - A boolean indicating whether the notification should be shown.
183
+ */
184
+ function filterByFrequency(notification) {
185
+ if (!notification.frequency)
186
+ return true;
187
+ const cacheKey = `notification-${notification.id}`;
188
+ const lastShown = cacheRetrieve(cacheKey)?.value;
189
+ if (!lastShown)
190
+ return true;
191
+ switch (notification.frequency) {
192
+ case 'always': {
193
+ return true;
194
+ }
195
+ case 'once': {
196
+ return false;
197
+ }
198
+ case 'once_a_day': {
199
+ return new Date().getTime() - Number(lastShown) > 24 * 3600 * 1000;
200
+ }
201
+ case 'once_a_week': {
202
+ return new Date().getTime() - Number(lastShown) > 7 * 24 * 3600 * 1000;
203
+ }
204
+ }
205
+ }
206
+ /**
207
+ * Returns a string with the filters from a notification, one by line.
208
+ *
209
+ * @param notification - The notification to get the filters from.
210
+ * @returns A string with human-readable filters from the notification.
211
+ */
212
+ export function stringifyFilters(notification) {
213
+ const filters = [];
214
+ if (notification.minDate)
215
+ filters.push(`from ${notification.minDate}`);
216
+ if (notification.maxDate)
217
+ filters.push(`to ${notification.maxDate}`);
218
+ if (notification.minVersion)
219
+ filters.push(`from v${notification.minVersion}`);
220
+ if (notification.maxVersion)
221
+ filters.push(`to v${notification.maxVersion}`);
222
+ if (notification.frequency === 'once')
223
+ filters.push('show only once');
224
+ if (notification.frequency === 'once_a_day')
225
+ filters.push('show once a day');
226
+ if (notification.frequency === 'once_a_week')
227
+ filters.push('show once a week');
228
+ if (notification.surface)
229
+ filters.push(`surface = ${notification.surface}`);
230
+ if (notification.commands)
231
+ filters.push(`commands = ${notification.commands.join(', ')}`);
232
+ return filters.join('\n');
233
+ }
234
+ //# sourceMappingURL=notifications-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications-system.js","sourceRoot":"","sources":["../../../src/public/node/notifications-system.ts"],"names":[],"mappings":"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","sourcesContent":["import {versionSatisfies} from './node-package-manager.js'\nimport {renderError, renderInfo, renderWarning} from './ui.js'\nimport {getCurrentCommandId} from './global-context.js'\nimport {outputDebug} from './output.js'\nimport {zod} from './schema.js'\nimport {AbortSilentError} from './error.js'\nimport {CLI_KIT_VERSION} from '../common/version.js'\nimport {\n NotificationKey,\n NotificationsKey,\n cacheRetrieve,\n cacheRetrieveOrRepopulate,\n cacheStore,\n} from '../../private/node/conf-store.js'\nimport {fetch} from '@shopify/cli-kit/node/http'\n\nconst URL = 'https://cdn.shopify.com/static/cli/notifications.json'\nconst CACHE_DURATION_IN_MS = 3600 * 1000\n\nfunction url(): string {\n return process.env.SHOPIFY_CLI_NOTIFICATIONS_URL ?? URL\n}\n\nconst NotificationSchema = zod.object({\n id: zod.string(),\n message: zod.string(),\n type: zod.enum(['info', 'warning', 'error']),\n frequency: zod.enum(['always', 'once', 'once_a_day', 'once_a_week']),\n ownerChannel: zod.string(),\n cta: zod\n .object({\n label: zod.string(),\n url: zod.string().url(),\n })\n .optional(),\n title: zod.string().optional(),\n minVersion: zod.string().optional(),\n maxVersion: zod.string().optional(),\n minDate: zod.string().optional(),\n maxDate: zod.string().optional(),\n commands: zod.array(zod.string()).optional(),\n surface: zod.string().optional(),\n})\nexport type Notification = zod.infer<typeof NotificationSchema>\n\nconst NotificationsSchema = zod.object({notifications: zod.array(NotificationSchema)})\nexport type Notifications = zod.infer<typeof NotificationsSchema>\n\n/**\n * Shows notifications to the user if they meet the criteria specified in the notifications.json file.\n *\n * @param currentSurfaces - The surfaces present in the current project (usually for app extensions).\n * @returns - A promise that resolves when the notifications have been shown.\n */\nexport async function showNotificationsIfNeeded(currentSurfaces?: string[]): Promise<void> {\n try {\n const notifications = await getNotifications()\n const commandId = getCurrentCommandId()\n const notificationsToShow = filterNotifications(notifications.notifications, commandId, currentSurfaces)\n outputDebug(`Notifications to show: ${notificationsToShow.length}`)\n await renderNotifications(notificationsToShow)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.message === 'abort') throw new AbortSilentError()\n const errorMessage = `Error retrieving notifications: ${error.message}`\n outputDebug(errorMessage)\n // This is very prone to becoming a circular dependency, so we import it dynamically\n const {sendErrorToBugsnag} = await import('./error-handler.js')\n await sendErrorToBugsnag(errorMessage, 'unexpected_error')\n }\n}\n\n/**\n * Renders the first 2 notifications to the user.\n *\n * @param notifications - The notifications to render.\n */\nasync function renderNotifications(notifications: Notification[]) {\n notifications.slice(0, 2).forEach((notification) => {\n const content = {\n headline: notification.title,\n body: notification.message.replaceAll('\\\\n', '\\n'),\n link: notification.cta,\n }\n switch (notification.type) {\n case 'info': {\n renderInfo(content)\n break\n }\n case 'warning': {\n renderWarning(content)\n break\n }\n case 'error': {\n renderError(content)\n throw new Error('abort')\n }\n }\n cacheStore(`notification-${notification.id}`, new Date().getTime().toString())\n })\n}\n\n/**\n * Get notifications list from cache (refreshed every hour) or fetch it if not present.\n *\n * @returns A Notifications object.\n */\nexport async function getNotifications(): Promise<Notifications> {\n const cacheKey: NotificationsKey = `notifications-${url()}`\n const rawNotifications = await cacheRetrieveOrRepopulate(cacheKey, fetchNotifications, CACHE_DURATION_IN_MS)\n const notifications: object = JSON.parse(rawNotifications)\n return NotificationsSchema.parse(notifications)\n}\n\n/**\n * Fetch notifications from GitHub.\n */\nasync function fetchNotifications(): Promise<string> {\n outputDebug(`No cached notifications found. Fetching them...`)\n const response = await fetch(url(), {signal: AbortSignal.timeout(3 * 1000)})\n if (response.status !== 200) throw new Error(`Failed to fetch notifications: ${response.statusText}`)\n return response.text() as unknown as string\n}\n\n/**\n * Filters notifications based on the version of the CLI.\n *\n * @param notifications - The notifications to filter.\n * @param commandId - The command ID to filter by.\n * @param currentSurfaces - The surfaces present in the current project (usually for app extensions).\n * @param today - The current date.\n * @param currentVersion - The current version of the CLI.\n * @returns - The filtered notifications.\n */\nexport function filterNotifications(\n notifications: Notification[],\n commandId: string,\n currentSurfaces?: string[],\n today: Date = new Date(new Date().setUTCHours(0, 0, 0, 0)),\n currentVersion: string = CLI_KIT_VERSION,\n): Notification[] {\n return notifications\n .filter((notification) => filterByVersion(notification, currentVersion))\n .filter((notifications) => filterByDate(notifications, today))\n .filter((notification) => filterByCommand(notification, commandId))\n .filter((notification) => filterBySurface(notification, commandId, currentSurfaces))\n .filter((notification) => filterByFrequency(notification))\n}\n\n/**\n * Filters notifications based on the version of the CLI.\n *\n * @param notification - The notification to filter.\n * @param currentVersion - The current version of the CLI.\n */\nfunction filterByVersion(notification: Notification, currentVersion: string) {\n const minVersion = !notification.minVersion || versionSatisfies(currentVersion, `>=${notification.minVersion}`)\n const maxVersion = !notification.maxVersion || versionSatisfies(currentVersion, `<=${notification.maxVersion}`)\n return minVersion && maxVersion\n}\n\n/**\n * Filters notifications based on the date.\n *\n * @param notification - The notification to filter.\n * @param today - The current date.\n */\nfunction filterByDate(notification: Notification, today: Date) {\n const minDate = !notification.minDate || new Date(notification.minDate) <= today\n const maxDate = !notification.maxDate || new Date(notification.maxDate) >= today\n return minDate && maxDate\n}\n\n/**\n * Filters notifications based on the command ID.\n *\n * @param notification - The notification to filter.\n * @param commandId - The command ID to filter by.\n * @returns - A boolean indicating whether the notification should be shown.\n */\nfunction filterByCommand(notification: Notification, commandId: string) {\n if (commandId === '') return true\n return !notification.commands || notification.commands.includes(commandId)\n}\n\n/**\n * Filters notifications based on the surface.\n *\n * @param notification - The notification to filter.\n * @param commandId - The command id.\n * @param surfacesFromContext - The surfaces present in the current project (usually for app extensions).\n * @returns - A boolean indicating whether the notification should be shown.\n */\nfunction filterBySurface(notification: Notification, commandId: string, surfacesFromContext?: string[]) {\n const surfaceFromCommand = commandId.split(':')[0] ?? 'all'\n const notificationSurface = notification.surface ?? 'all'\n\n if (surfacesFromContext) return surfacesFromContext.includes(notificationSurface)\n\n return notificationSurface === surfaceFromCommand || notificationSurface === 'all'\n}\n\n/**\n * Filters notifications based on the frequency.\n *\n * @param notification - The notification to filter.\n * @returns - A boolean indicating whether the notification should be shown.\n */\nfunction filterByFrequency(notification: Notification): boolean {\n if (!notification.frequency) return true\n const cacheKey: NotificationKey = `notification-${notification.id}`\n const lastShown = cacheRetrieve(cacheKey)?.value as unknown as string\n if (!lastShown) return true\n\n switch (notification.frequency) {\n case 'always': {\n return true\n }\n case 'once': {\n return false\n }\n case 'once_a_day': {\n return new Date().getTime() - Number(lastShown) > 24 * 3600 * 1000\n }\n case 'once_a_week': {\n return new Date().getTime() - Number(lastShown) > 7 * 24 * 3600 * 1000\n }\n }\n}\n\n/**\n * Returns a string with the filters from a notification, one by line.\n *\n * @param notification - The notification to get the filters from.\n * @returns A string with human-readable filters from the notification.\n */\nexport function stringifyFilters(notification: Notification): string {\n const filters = []\n if (notification.minDate) filters.push(`from ${notification.minDate}`)\n if (notification.maxDate) filters.push(`to ${notification.maxDate}`)\n if (notification.minVersion) filters.push(`from v${notification.minVersion}`)\n if (notification.maxVersion) filters.push(`to v${notification.maxVersion}`)\n if (notification.frequency === 'once') filters.push('show only once')\n if (notification.frequency === 'once_a_day') filters.push('show once a day')\n if (notification.frequency === 'once_a_week') filters.push('show once a week')\n if (notification.surface) filters.push(`surface = ${notification.surface}`)\n if (notification.commands) filters.push(`commands = ${notification.commands.join(', ')}`)\n return filters.join('\\n')\n}\n"]}
@@ -5,18 +5,10 @@ export type AssetParams = Pick<ThemeAsset, 'key'> & Partial<Pick<ThemeAsset, 'va
5
5
  export declare function fetchTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
6
6
  export declare function fetchThemes(session: AdminSession): Promise<Theme[]>;
7
7
  export declare function createTheme(params: ThemeParams, session: AdminSession): Promise<Theme | undefined>;
8
- export declare function fetchThemeAsset(id: number, key: Key, session: AdminSession): Promise<ThemeAsset | undefined>;
8
+ export declare function fetchThemeAssets(id: number, filenames: Key[], session: AdminSession): Promise<ThemeAsset[]>;
9
9
  export declare function deleteThemeAsset(id: number, key: Key, session: AdminSession): Promise<boolean>;
10
10
  export declare function bulkUploadThemeAssets(id: number, assets: AssetParams[], session: AdminSession): Promise<Result[]>;
11
11
  export declare function fetchChecksums(id: number, session: AdminSession): Promise<Checksum[]>;
12
- interface UpgradeThemeOptions {
13
- fromTheme: number;
14
- toTheme: number;
15
- script?: string;
16
- session: AdminSession;
17
- }
18
- export declare function upgradeTheme(upgradeOptions: UpgradeThemeOptions): Promise<Theme | undefined>;
19
- export declare function updateTheme(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined>;
20
- export declare function publishTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
21
- export declare function deleteTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
22
- export {};
12
+ export declare function themeUpdate(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined>;
13
+ export declare function themePublish(id: number, session: AdminSession): Promise<Theme | undefined>;
14
+ export declare function themeDelete(id: number, session: AdminSession): Promise<boolean | undefined>;
@@ -1,8 +1,14 @@
1
1
  import { storeAdminUrl } from './urls.js';
2
+ import { composeThemeGid, parseGid } from './utils.js';
2
3
  import * as throttler from '../api/rest-api-throttler.js';
3
- import { restRequest } from '@shopify/cli-kit/node/api/admin';
4
+ import { ThemeUpdate } from '../../../cli/api/graphql/admin/generated/theme_update.js';
5
+ import { ThemeDelete } from '../../../cli/api/graphql/admin/generated/theme_delete.js';
6
+ import { ThemePublish } from '../../../cli/api/graphql/admin/generated/theme_publish.js';
7
+ import { GetThemeFileBodies } from '../../../cli/api/graphql/admin/generated/get_theme_file_bodies.js';
8
+ import { GetThemeFileChecksums } from '../../../cli/api/graphql/admin/generated/get_theme_file_checksums.js';
9
+ import { restRequest, adminRequestDoc } from '@shopify/cli-kit/node/api/admin';
4
10
  import { AbortError } from '@shopify/cli-kit/node/error';
5
- import { buildBulkUploadResults, buildChecksum, buildTheme, buildThemeAsset, } from '@shopify/cli-kit/node/themes/factories';
11
+ import { buildBulkUploadResults, buildTheme } from '@shopify/cli-kit/node/themes/factories';
6
12
  import { outputDebug } from '@shopify/cli-kit/node/output';
7
13
  import { sleep } from '@shopify/cli-kit/node/system';
8
14
  export async function fetchTheme(id, session) {
@@ -18,19 +24,46 @@ export async function fetchThemes(session) {
18
24
  }
19
25
  export async function createTheme(params, session) {
20
26
  const response = await request('POST', '/themes', session, { theme: { ...params } });
21
- const minimumThemeAssets = [
22
- { key: 'config/settings_schema.json', value: '[]' },
23
- { key: 'layout/password.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
24
- { key: 'layout/theme.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
25
- ];
26
- await bulkUploadThemeAssets(response.json.theme.id, minimumThemeAssets, session);
27
+ if (!params.src) {
28
+ const minimumThemeAssets = [
29
+ { key: 'config/settings_schema.json', value: '[]' },
30
+ { key: 'layout/password.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
31
+ { key: 'layout/theme.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
32
+ ];
33
+ await bulkUploadThemeAssets(response.json.theme.id, minimumThemeAssets, session);
34
+ }
27
35
  return buildTheme({ ...response.json.theme, createdAtRuntime: true });
28
36
  }
29
- export async function fetchThemeAsset(id, key, session) {
30
- const response = await request('GET', `/themes/${id}/assets`, session, undefined, {
31
- 'asset[key]': key,
32
- });
33
- return buildThemeAsset(response.json.asset);
37
+ export async function fetchThemeAssets(id, filenames, session) {
38
+ const assets = [];
39
+ let after = null;
40
+ while (true) {
41
+ // eslint-disable-next-line no-await-in-loop
42
+ const response = await adminRequestDoc(GetThemeFileBodies, session, {
43
+ id: themeGid(id),
44
+ filenames,
45
+ after,
46
+ });
47
+ if (!response.theme?.files?.nodes || !response.theme?.files?.pageInfo) {
48
+ const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ');
49
+ throw new AbortError(`Error fetching assets: ${userErrors}`);
50
+ }
51
+ const { nodes, pageInfo } = response.theme.files;
52
+ assets.push(
53
+ // eslint-disable-next-line no-await-in-loop
54
+ ...(await Promise.all(nodes.map(async (file) => {
55
+ const content = await parseThemeFileContent(file.body);
56
+ return {
57
+ key: file.filename,
58
+ checksum: file.checksumMd5,
59
+ value: content,
60
+ };
61
+ }))));
62
+ if (!pageInfo.hasNextPage) {
63
+ return assets;
64
+ }
65
+ after = pageInfo.endCursor;
66
+ }
34
67
  }
35
68
  export async function deleteThemeAsset(id, key, session) {
36
69
  const response = await request('DELETE', `/themes/${id}/assets`, session, undefined, {
@@ -46,28 +79,89 @@ export async function bulkUploadThemeAssets(id, assets, session) {
46
79
  return buildBulkUploadResults(response.json.results, assets);
47
80
  }
48
81
  export async function fetchChecksums(id, session) {
49
- const response = await request('GET', `/themes/${id}/assets`, session, undefined, { fields: 'key,checksum' });
50
- const assets = response.json.assets;
51
- if (assets?.length > 0)
52
- return assets.map(buildChecksum);
53
- return [];
54
- }
55
- export async function upgradeTheme(upgradeOptions) {
56
- const { fromTheme, toTheme, session, script } = upgradeOptions;
57
- const params = { from_theme: fromTheme, to_theme: toTheme, ...(script && { script }) };
58
- const response = await request('POST', `/themes`, session, params);
59
- return buildTheme(response.json.theme);
82
+ const checksums = [];
83
+ let after = null;
84
+ while (true) {
85
+ // eslint-disable-next-line no-await-in-loop
86
+ const response = await adminRequestDoc(GetThemeFileChecksums, session, { id: themeGid(id), after });
87
+ if (!response?.theme?.files?.nodes || !response?.theme?.files?.pageInfo) {
88
+ const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ');
89
+ throw new AbortError(`Failed to fetch checksums for: ${userErrors}`);
90
+ }
91
+ const { nodes, pageInfo } = response.theme.files;
92
+ checksums.push(...nodes.map((file) => ({
93
+ key: file.filename,
94
+ checksum: file.checksumMd5,
95
+ })));
96
+ if (!pageInfo.hasNextPage) {
97
+ return checksums;
98
+ }
99
+ after = pageInfo.endCursor;
100
+ }
60
101
  }
61
- export async function updateTheme(id, params, session) {
62
- const response = await request('PUT', `/themes/${id}`, session, { theme: { id, ...params } });
63
- return buildTheme(response.json.theme);
102
+ export async function themeUpdate(id, params, session) {
103
+ const name = params.name;
104
+ const input = {};
105
+ if (name) {
106
+ input.name = name;
107
+ }
108
+ const { themeUpdate } = await adminRequestDoc(ThemeUpdate, session, { id: composeThemeGid(id), input });
109
+ if (!themeUpdate) {
110
+ // An unexpected error occurred during the GraphQL request execution
111
+ unexpectedGraphQLError('Failed to update theme');
112
+ }
113
+ const { theme, userErrors } = themeUpdate;
114
+ if (userErrors.length) {
115
+ const userErrors = themeUpdate.userErrors.map((error) => error.message).join(', ');
116
+ throw new AbortError(userErrors);
117
+ }
118
+ if (!theme) {
119
+ // An unexpected error if neither theme nor userErrors are returned
120
+ unexpectedGraphQLError('Failed to update theme');
121
+ }
122
+ return buildTheme({
123
+ id: parseGid(theme.id),
124
+ name: theme.name,
125
+ role: theme.role.toLowerCase(),
126
+ });
64
127
  }
65
- export async function publishTheme(id, session) {
66
- return updateTheme(id, { role: 'main' }, session);
128
+ export async function themePublish(id, session) {
129
+ const { themePublish } = await adminRequestDoc(ThemePublish, session, { id: composeThemeGid(id) });
130
+ if (!themePublish) {
131
+ // An unexpected error occurred during the GraphQL request execution
132
+ unexpectedGraphQLError('Failed to update theme');
133
+ }
134
+ const { theme, userErrors } = themePublish;
135
+ if (userErrors.length) {
136
+ const userErrors = themePublish.userErrors.map((error) => error.message).join(', ');
137
+ throw new AbortError(userErrors);
138
+ }
139
+ if (!theme) {
140
+ // An unexpected error if neither theme nor userErrors are returned
141
+ unexpectedGraphQLError('Failed to update theme');
142
+ }
143
+ return buildTheme({
144
+ id: parseGid(theme.id),
145
+ name: theme.name,
146
+ role: theme.role.toLowerCase(),
147
+ });
67
148
  }
68
- export async function deleteTheme(id, session) {
69
- const response = await request('DELETE', `/themes/${id}`, session);
70
- return buildTheme(response.json.theme);
149
+ export async function themeDelete(id, session) {
150
+ const { themeDelete } = await adminRequestDoc(ThemeDelete, session, { id: composeThemeGid(id) });
151
+ if (!themeDelete) {
152
+ // An unexpected error occurred during the GraphQL request execution
153
+ unexpectedGraphQLError('Failed to update theme');
154
+ }
155
+ const { deletedThemeId, userErrors } = themeDelete;
156
+ if (userErrors.length) {
157
+ const userErrors = themeDelete.userErrors.map((error) => error.message).join(', ');
158
+ throw new AbortError(userErrors);
159
+ }
160
+ if (!deletedThemeId) {
161
+ // An unexpected error if neither theme nor userErrors are returned
162
+ unexpectedGraphQLError('Failed to update theme');
163
+ }
164
+ return true;
71
165
  }
72
166
  async function request(method, path, session, params, searchParams = {}, retries = 1) {
73
167
  const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams));
@@ -86,6 +180,17 @@ async function request(method, path, session, params, searchParams = {}, retries
86
180
  case status === 403:
87
181
  return handleForbiddenError(response, session);
88
182
  case status === 401:
183
+ /**
184
+ * We need to resolve the call to the refresh function at runtime to
185
+ * avoid a circular reference.
186
+ *
187
+ * This won't be necessary when https://github.com/Shopify/cli/issues/4769
188
+ * gets resolved, and this condition must be removed then.
189
+ */
190
+ if ('refresh' in session) {
191
+ const refresh = session.refresh;
192
+ await refresh();
193
+ }
89
194
  // Retry 401 errors to be resilient to authentication errors.
90
195
  return handleRetriableError({
91
196
  path,
@@ -143,6 +248,9 @@ function errorMessage(response) {
143
248
  }
144
249
  return '';
145
250
  }
251
+ function unexpectedGraphQLError(message) {
252
+ throw new AbortError(message);
253
+ }
146
254
  async function handleRetriableError({ path, retries, retry, fail }) {
147
255
  if (retries >= 3) {
148
256
  fail();
@@ -151,4 +259,26 @@ async function handleRetriableError({ path, retries, retry, fail }) {
151
259
  await sleep(0.2);
152
260
  return retry();
153
261
  }
262
+ function themeGid(id) {
263
+ return `gid://shopify/OnlineStoreTheme/${id}`;
264
+ }
265
+ async function parseThemeFileContent(body) {
266
+ switch (body.__typename) {
267
+ case 'OnlineStoreThemeFileBodyText':
268
+ return body.content;
269
+ break;
270
+ case 'OnlineStoreThemeFileBodyBase64':
271
+ return Buffer.from(body.contentBase64, 'base64').toString();
272
+ break;
273
+ case 'OnlineStoreThemeFileBodyUrl':
274
+ try {
275
+ const response = await fetch(body.url);
276
+ return await response.text();
277
+ }
278
+ catch (error) {
279
+ // Raise error if we can't download the file
280
+ throw new AbortError(`Error downloading content from URL: ${body.url}`);
281
+ }
282
+ }
283
+ }
154
284
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/public/node/themes/api.ts"],"names":[],"mappings":"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","sourcesContent":["import {storeAdminUrl} from './urls.js'\nimport * as throttler from '../api/rest-api-throttler.js'\nimport {restRequest, RestResponse} from '@shopify/cli-kit/node/api/admin'\nimport {AdminSession} from '@shopify/cli-kit/node/session'\nimport {AbortError} from '@shopify/cli-kit/node/error'\nimport {\n buildBulkUploadResults,\n buildChecksum,\n buildTheme,\n buildThemeAsset,\n} from '@shopify/cli-kit/node/themes/factories'\nimport {Result, Checksum, Key, Theme, ThemeAsset} from '@shopify/cli-kit/node/themes/types'\nimport {outputDebug} from '@shopify/cli-kit/node/output'\nimport {sleep} from '@shopify/cli-kit/node/system'\n\nexport type ThemeParams = Partial<Pick<Theme, 'name' | 'role' | 'processing' | 'src'>>\nexport type AssetParams = Pick<ThemeAsset, 'key'> & Partial<Pick<ThemeAsset, 'value' | 'attachment'>>\n\nexport async function fetchTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('GET', `/themes/${id}`, session, undefined, {fields: 'id,name,role,processing'})\n return buildTheme(response.json.theme)\n}\n\nexport async function fetchThemes(session: AdminSession): Promise<Theme[]> {\n const response = await request('GET', '/themes', session, undefined, {fields: 'id,name,role,processing'})\n const themes = response.json?.themes\n if (themes?.length > 0) return themes.map(buildTheme)\n return []\n}\n\nexport async function createTheme(params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('POST', '/themes', session, {theme: {...params}})\n const minimumThemeAssets = [\n {key: 'config/settings_schema.json', value: '[]'},\n {key: 'layout/password.liquid', value: '{{ content_for_header }}{{ content_for_layout }}'},\n {key: 'layout/theme.liquid', value: '{{ content_for_header }}{{ content_for_layout }}'},\n ]\n\n await bulkUploadThemeAssets(response.json.theme.id, minimumThemeAssets, session)\n\n return buildTheme({...response.json.theme, createdAtRuntime: true})\n}\n\nexport async function fetchThemeAsset(id: number, key: Key, session: AdminSession): Promise<ThemeAsset | undefined> {\n const response = await request('GET', `/themes/${id}/assets`, session, undefined, {\n 'asset[key]': key,\n })\n\n return buildThemeAsset(response.json.asset)\n}\n\nexport async function deleteThemeAsset(id: number, key: Key, session: AdminSession): Promise<boolean> {\n const response = await request('DELETE', `/themes/${id}/assets`, session, undefined, {\n 'asset[key]': key,\n })\n return response.status === 200\n}\n\nexport async function bulkUploadThemeAssets(\n id: number,\n assets: AssetParams[],\n session: AdminSession,\n): Promise<Result[]> {\n const response = await request('PUT', `/themes/${id}/assets/bulk`, session, {assets})\n if (response.status !== 207) {\n throw new AbortError('Upload failed, could not reach the server')\n }\n return buildBulkUploadResults(response.json.results, assets)\n}\n\nexport async function fetchChecksums(id: number, session: AdminSession): Promise<Checksum[]> {\n const response = await request('GET', `/themes/${id}/assets`, session, undefined, {fields: 'key,checksum'})\n const assets = response.json.assets\n\n if (assets?.length > 0) return assets.map(buildChecksum)\n\n return []\n}\n\ninterface UpgradeThemeOptions {\n fromTheme: number\n toTheme: number\n script?: string\n session: AdminSession\n}\n\nexport async function upgradeTheme(upgradeOptions: UpgradeThemeOptions): Promise<Theme | undefined> {\n const {fromTheme, toTheme, session, script} = upgradeOptions\n const params = {from_theme: fromTheme, to_theme: toTheme, ...(script && {script})}\n const response = await request('POST', `/themes`, session, params)\n return buildTheme(response.json.theme)\n}\n\nexport async function updateTheme(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('PUT', `/themes/${id}`, session, {theme: {id, ...params}})\n return buildTheme(response.json.theme)\n}\n\nexport async function publishTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n return updateTheme(id, {role: 'main'}, session)\n}\n\nexport async function deleteTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('DELETE', `/themes/${id}`, session)\n return buildTheme(response.json.theme)\n}\n\nasync function request<T>(\n method: string,\n path: string,\n session: AdminSession,\n params?: T,\n searchParams: {[name: string]: string} = {},\n retries = 1,\n): Promise<RestResponse> {\n const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams))\n\n const status = response.status\n\n throttler.updateApiCallLimitFromResponse(response)\n\n switch (true) {\n case status >= 200 && status <= 399:\n // Returns the successful reponse\n return response\n case status === 404:\n // Defer the decision when a resource is not found\n return response\n case status === 429:\n // Retry following the \"retry-after\" header\n return throttler.delayAwareRetry(response, () => request(method, path, session, params, searchParams))\n case status === 403:\n return handleForbiddenError(response, session)\n case status === 401:\n // Retry 401 errors to be resilient to authentication errors.\n return handleRetriableError({\n path,\n retries,\n retry: () => {\n return request(method, path, session, params, searchParams, retries + 1)\n },\n fail: () => {\n throw new AbortError(`[${status}] API request unauthorized error`)\n },\n })\n case status === 422:\n throw new AbortError(`[${status}] API request unprocessable content: ${errors(response)}`)\n case status >= 400 && status <= 499:\n throw new AbortError(`[${status}] API request client error`)\n case status >= 500 && status <= 599:\n // Retry 500-family of errors as that may solve the issue (especially in 503 errors)\n return handleRetriableError({\n path,\n retries,\n retry: () => {\n return request(method, path, session, params, searchParams, retries + 1)\n },\n fail: () => {\n throw new AbortError(`[${status}] API request server error`)\n },\n })\n default:\n throw new AbortError(`[${status}] API request unexpected error`)\n }\n}\n\nfunction handleForbiddenError(response: RestResponse, session: AdminSession): never {\n const store = session.storeFqdn\n const adminUrl = storeAdminUrl(session)\n const error = errorMessage(response)\n\n if (error.match(/Cannot delete generated asset/) !== null) {\n throw new AbortError(error)\n }\n\n throw new AbortError(\n `You are not authorized to edit themes on \"${store}\".`,\n \"You can't use Shopify CLI with development stores if you only have Partner staff \" +\n 'member access. If you want to use Shopify CLI to work on a development store, then ' +\n 'you should be the store owner or create a staff account on the store.' +\n '\\n\\n' +\n \"If you're the store owner, then you need to log in to the store directly using the \" +\n `store URL at least once (for example, using \"${adminUrl}\") before you log in using ` +\n 'Shopify CLI. Logging in to the Shopify admin directly connects the development ' +\n 'store with your Shopify login.',\n )\n}\n\nfunction errors(response: RestResponse) {\n return JSON.stringify(response.json?.errors)\n}\n\nfunction errorMessage(response: RestResponse): string {\n const message = response.json?.message\n\n if (typeof message === 'string') {\n return message\n }\n\n return ''\n}\n\ninterface RetriableErrorOptions {\n path: string\n retries: number\n retry: () => Promise<RestResponse>\n fail: () => never\n}\n\nasync function handleRetriableError({path, retries, retry, fail}: RetriableErrorOptions): Promise<RestResponse> {\n if (retries >= 3) {\n fail()\n }\n\n outputDebug(`[${retries}] Retrying '${path}' request...`)\n\n await sleep(0.2)\n return retry()\n}\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/public/node/themes/api.ts"],"names":[],"mappings":"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","sourcesContent":["import {storeAdminUrl} from './urls.js'\nimport {composeThemeGid, parseGid} from './utils.js'\nimport * as throttler from '../api/rest-api-throttler.js'\nimport {ThemeUpdate} from '../../../cli/api/graphql/admin/generated/theme_update.js'\nimport {ThemeDelete} from '../../../cli/api/graphql/admin/generated/theme_delete.js'\nimport {ThemePublish} from '../../../cli/api/graphql/admin/generated/theme_publish.js'\nimport {GetThemeFileBodies} from '../../../cli/api/graphql/admin/generated/get_theme_file_bodies.js'\nimport {GetThemeFileChecksums} from '../../../cli/api/graphql/admin/generated/get_theme_file_checksums.js'\nimport {restRequest, RestResponse, adminRequestDoc} from '@shopify/cli-kit/node/api/admin'\nimport {AdminSession} from '@shopify/cli-kit/node/session'\nimport {AbortError} from '@shopify/cli-kit/node/error'\nimport {buildBulkUploadResults, buildTheme} from '@shopify/cli-kit/node/themes/factories'\nimport {Result, Checksum, Key, Theme, ThemeAsset} from '@shopify/cli-kit/node/themes/types'\nimport {outputDebug} from '@shopify/cli-kit/node/output'\nimport {sleep} from '@shopify/cli-kit/node/system'\n\nexport type ThemeParams = Partial<Pick<Theme, 'name' | 'role' | 'processing' | 'src'>>\nexport type AssetParams = Pick<ThemeAsset, 'key'> & Partial<Pick<ThemeAsset, 'value' | 'attachment'>>\n\nexport async function fetchTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('GET', `/themes/${id}`, session, undefined, {fields: 'id,name,role,processing'})\n return buildTheme(response.json.theme)\n}\n\nexport async function fetchThemes(session: AdminSession): Promise<Theme[]> {\n const response = await request('GET', '/themes', session, undefined, {fields: 'id,name,role,processing'})\n const themes = response.json?.themes\n if (themes?.length > 0) return themes.map(buildTheme)\n return []\n}\n\nexport async function createTheme(params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('POST', '/themes', session, {theme: {...params}})\n\n if (!params.src) {\n const minimumThemeAssets = [\n {key: 'config/settings_schema.json', value: '[]'},\n {key: 'layout/password.liquid', value: '{{ content_for_header }}{{ content_for_layout }}'},\n {key: 'layout/theme.liquid', value: '{{ content_for_header }}{{ content_for_layout }}'},\n ]\n\n await bulkUploadThemeAssets(response.json.theme.id, minimumThemeAssets, session)\n }\n\n return buildTheme({...response.json.theme, createdAtRuntime: true})\n}\n\nexport async function fetchThemeAssets(id: number, filenames: Key[], session: AdminSession): Promise<ThemeAsset[]> {\n const assets: ThemeAsset[] = []\n let after: string | null = null\n\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const response = await adminRequestDoc(GetThemeFileBodies, session, {\n id: themeGid(id),\n filenames,\n after,\n })\n\n if (!response.theme?.files?.nodes || !response.theme?.files?.pageInfo) {\n const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ')\n throw new AbortError(`Error fetching assets: ${userErrors}`)\n }\n\n const {nodes, pageInfo} = response.theme.files\n\n assets.push(\n // eslint-disable-next-line no-await-in-loop\n ...(await Promise.all(\n nodes.map(async (file) => {\n const content = await parseThemeFileContent(file.body)\n return {\n key: file.filename,\n checksum: file.checksumMd5 as string,\n value: content,\n }\n }),\n )),\n )\n\n if (!pageInfo.hasNextPage) {\n return assets\n }\n\n after = pageInfo.endCursor as string\n }\n}\n\nexport async function deleteThemeAsset(id: number, key: Key, session: AdminSession): Promise<boolean> {\n const response = await request('DELETE', `/themes/${id}/assets`, session, undefined, {\n 'asset[key]': key,\n })\n return response.status === 200\n}\n\nexport async function bulkUploadThemeAssets(\n id: number,\n assets: AssetParams[],\n session: AdminSession,\n): Promise<Result[]> {\n const response = await request('PUT', `/themes/${id}/assets/bulk`, session, {assets})\n if (response.status !== 207) {\n throw new AbortError('Upload failed, could not reach the server')\n }\n return buildBulkUploadResults(response.json.results, assets)\n}\n\nexport async function fetchChecksums(id: number, session: AdminSession): Promise<Checksum[]> {\n const checksums: Checksum[] = []\n let after: string | null = null\n\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const response = await adminRequestDoc(GetThemeFileChecksums, session, {id: themeGid(id), after})\n\n if (!response?.theme?.files?.nodes || !response?.theme?.files?.pageInfo) {\n const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ')\n throw new AbortError(`Failed to fetch checksums for: ${userErrors}`)\n }\n\n const {nodes, pageInfo} = response.theme.files\n\n checksums.push(\n ...nodes.map((file) => ({\n key: file.filename,\n checksum: file.checksumMd5 as string,\n })),\n )\n\n if (!pageInfo.hasNextPage) {\n return checksums\n }\n\n after = pageInfo.endCursor as string\n }\n}\n\nexport async function themeUpdate(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const name = params.name\n const input: {[key: string]: string} = {}\n if (name) {\n input.name = name\n }\n\n const {themeUpdate} = await adminRequestDoc(ThemeUpdate, session, {id: composeThemeGid(id), input})\n if (!themeUpdate) {\n // An unexpected error occurred during the GraphQL request execution\n unexpectedGraphQLError('Failed to update theme')\n }\n\n const {theme, userErrors} = themeUpdate\n if (userErrors.length) {\n const userErrors = themeUpdate.userErrors.map((error) => error.message).join(', ')\n throw new AbortError(userErrors)\n }\n\n if (!theme) {\n // An unexpected error if neither theme nor userErrors are returned\n unexpectedGraphQLError('Failed to update theme')\n }\n\n return buildTheme({\n id: parseGid(theme.id),\n name: theme.name,\n role: theme.role.toLowerCase(),\n })\n}\n\nexport async function themePublish(id: number, session: AdminSession): Promise<Theme | undefined> {\n const {themePublish} = await adminRequestDoc(ThemePublish, session, {id: composeThemeGid(id)})\n if (!themePublish) {\n // An unexpected error occurred during the GraphQL request execution\n unexpectedGraphQLError('Failed to update theme')\n }\n\n const {theme, userErrors} = themePublish\n if (userErrors.length) {\n const userErrors = themePublish.userErrors.map((error) => error.message).join(', ')\n throw new AbortError(userErrors)\n }\n\n if (!theme) {\n // An unexpected error if neither theme nor userErrors are returned\n unexpectedGraphQLError('Failed to update theme')\n }\n\n return buildTheme({\n id: parseGid(theme.id),\n name: theme.name,\n role: theme.role.toLowerCase(),\n })\n}\n\nexport async function themeDelete(id: number, session: AdminSession): Promise<boolean | undefined> {\n const {themeDelete} = await adminRequestDoc(ThemeDelete, session, {id: composeThemeGid(id)})\n if (!themeDelete) {\n // An unexpected error occurred during the GraphQL request execution\n unexpectedGraphQLError('Failed to update theme')\n }\n\n const {deletedThemeId, userErrors} = themeDelete\n if (userErrors.length) {\n const userErrors = themeDelete.userErrors.map((error) => error.message).join(', ')\n throw new AbortError(userErrors)\n }\n\n if (!deletedThemeId) {\n // An unexpected error if neither theme nor userErrors are returned\n unexpectedGraphQLError('Failed to update theme')\n }\n\n return true\n}\n\nasync function request<T>(\n method: string,\n path: string,\n session: AdminSession,\n params?: T,\n searchParams: {[name: string]: string} = {},\n retries = 1,\n): Promise<RestResponse> {\n const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams))\n\n const status = response.status\n\n throttler.updateApiCallLimitFromResponse(response)\n\n switch (true) {\n case status >= 200 && status <= 399:\n // Returns the successful reponse\n return response\n case status === 404:\n // Defer the decision when a resource is not found\n return response\n case status === 429:\n // Retry following the \"retry-after\" header\n return throttler.delayAwareRetry(response, () => request(method, path, session, params, searchParams))\n case status === 403:\n return handleForbiddenError(response, session)\n case status === 401:\n /**\n * We need to resolve the call to the refresh function at runtime to\n * avoid a circular reference.\n *\n * This won't be necessary when https://github.com/Shopify/cli/issues/4769\n * gets resolved, and this condition must be removed then.\n */\n if ('refresh' in session) {\n const refresh = session.refresh as () => Promise<void>\n await refresh()\n }\n\n // Retry 401 errors to be resilient to authentication errors.\n return handleRetriableError({\n path,\n retries,\n retry: () => {\n return request(method, path, session, params, searchParams, retries + 1)\n },\n fail: () => {\n throw new AbortError(`[${status}] API request unauthorized error`)\n },\n })\n case status === 422:\n throw new AbortError(`[${status}] API request unprocessable content: ${errors(response)}`)\n case status >= 400 && status <= 499:\n throw new AbortError(`[${status}] API request client error`)\n case status >= 500 && status <= 599:\n // Retry 500-family of errors as that may solve the issue (especially in 503 errors)\n return handleRetriableError({\n path,\n retries,\n retry: () => {\n return request(method, path, session, params, searchParams, retries + 1)\n },\n fail: () => {\n throw new AbortError(`[${status}] API request server error`)\n },\n })\n default:\n throw new AbortError(`[${status}] API request unexpected error`)\n }\n}\n\nfunction handleForbiddenError(response: RestResponse, session: AdminSession): never {\n const store = session.storeFqdn\n const adminUrl = storeAdminUrl(session)\n const error = errorMessage(response)\n\n if (error.match(/Cannot delete generated asset/) !== null) {\n throw new AbortError(error)\n }\n\n throw new AbortError(\n `You are not authorized to edit themes on \"${store}\".`,\n \"You can't use Shopify CLI with development stores if you only have Partner staff \" +\n 'member access. If you want to use Shopify CLI to work on a development store, then ' +\n 'you should be the store owner or create a staff account on the store.' +\n '\\n\\n' +\n \"If you're the store owner, then you need to log in to the store directly using the \" +\n `store URL at least once (for example, using \"${adminUrl}\") before you log in using ` +\n 'Shopify CLI. Logging in to the Shopify admin directly connects the development ' +\n 'store with your Shopify login.',\n )\n}\n\nfunction errors(response: RestResponse) {\n return JSON.stringify(response.json?.errors)\n}\n\nfunction errorMessage(response: RestResponse): string {\n const message = response.json?.message\n\n if (typeof message === 'string') {\n return message\n }\n\n return ''\n}\n\nfunction unexpectedGraphQLError(message: string): never {\n throw new AbortError(message)\n}\n\ninterface RetriableErrorOptions {\n path: string\n retries: number\n retry: () => Promise<RestResponse>\n fail: () => never\n}\n\nasync function handleRetriableError({path, retries, retry, fail}: RetriableErrorOptions): Promise<RestResponse> {\n if (retries >= 3) {\n fail()\n }\n\n outputDebug(`[${retries}] Retrying '${path}' request...`)\n\n await sleep(0.2)\n return retry()\n}\n\nfunction themeGid(id: number): string {\n return `gid://shopify/OnlineStoreTheme/${id}`\n}\n\ntype OnlineStoreThemeFileBody =\n | {__typename: 'OnlineStoreThemeFileBodyBase64'; contentBase64: string}\n | {__typename: 'OnlineStoreThemeFileBodyText'; content: string}\n | {__typename: 'OnlineStoreThemeFileBodyUrl'; url: string}\n\nasync function parseThemeFileContent(body: OnlineStoreThemeFileBody): Promise<string> {\n switch (body.__typename) {\n case 'OnlineStoreThemeFileBodyText':\n return body.content\n break\n case 'OnlineStoreThemeFileBodyBase64':\n return Buffer.from(body.contentBase64, 'base64').toString()\n break\n case 'OnlineStoreThemeFileBodyUrl':\n try {\n const response = await fetch(body.url)\n return await response.text()\n } catch (error) {\n // Raise error if we can't download the file\n throw new AbortError(`Error downloading content from URL: ${body.url}`)\n }\n }\n}\n"]}
@@ -28,6 +28,7 @@ export interface ThemeFileSystemOptions {
28
28
  only?: string[];
29
29
  };
30
30
  notify?: string;
31
+ noDelete?: boolean;
31
32
  }
32
33
  /**
33
34
  * Represents a theme on the file system.