@shopify/cli-kit 3.69.4 → 3.71.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 (571) 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_files_upsert.d.ts +21 -0
  12. package/dist/cli/api/graphql/admin/generated/theme_files_upsert.js +82 -0
  13. package/dist/cli/api/graphql/admin/generated/theme_files_upsert.js.map +1 -0
  14. package/dist/cli/api/graphql/admin/generated/theme_publish.d.ts +21 -0
  15. package/dist/cli/api/graphql/admin/generated/theme_publish.js +65 -0
  16. package/dist/cli/api/graphql/admin/generated/theme_publish.js.map +1 -0
  17. package/dist/cli/api/graphql/admin/generated/theme_update.d.ts +23 -0
  18. package/dist/cli/api/graphql/admin/generated/theme_update.js +75 -0
  19. package/dist/cli/api/graphql/admin/generated/theme_update.js.map +1 -0
  20. package/dist/private/node/api/graphql.d.ts +2 -2
  21. package/dist/private/node/api/graphql.js +4 -4
  22. package/dist/private/node/api/graphql.js.map +1 -1
  23. package/dist/private/node/api/headers.js +1 -1
  24. package/dist/private/node/api/headers.js.map +1 -1
  25. package/dist/private/node/api/rest.d.ts +1 -2
  26. package/dist/private/node/api/rest.js +2 -3
  27. package/dist/private/node/api/rest.js.map +1 -1
  28. package/dist/private/node/api.d.ts +1 -1
  29. package/dist/private/node/api.js +41 -2
  30. package/dist/private/node/api.js.map +1 -1
  31. package/dist/private/node/conf-store.d.ts +9 -4
  32. package/dist/private/node/conf-store.js +8 -6
  33. package/dist/private/node/conf-store.js.map +1 -1
  34. package/dist/private/node/constants.d.ts +3 -0
  35. package/dist/private/node/constants.js +3 -0
  36. package/dist/private/node/constants.js.map +1 -1
  37. package/dist/private/node/session/exchange.js +2 -2
  38. package/dist/private/node/session/exchange.js.map +1 -1
  39. package/dist/private/node/session/schema.d.ts +40 -40
  40. package/dist/private/node/session/scopes.js +3 -5
  41. package/dist/private/node/session/scopes.js.map +1 -1
  42. package/dist/private/node/session.js +2 -3
  43. package/dist/private/node/session.js.map +1 -1
  44. package/dist/private/node/ui/alert.js +1 -3
  45. package/dist/private/node/ui/alert.js.map +1 -1
  46. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +1 -0
  47. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -4
  48. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  49. package/dist/private/node/ui/components/Link.js +3 -0
  50. package/dist/private/node/ui/components/Link.js.map +1 -1
  51. package/dist/private/node/ui/components/Link.test.js +23 -0
  52. package/dist/private/node/ui/components/Link.test.js.map +1 -1
  53. package/dist/private/node/ui.js +1 -1
  54. package/dist/private/node/ui.js.map +1 -1
  55. package/dist/public/common/version.d.ts +1 -1
  56. package/dist/public/common/version.js +1 -1
  57. package/dist/public/common/version.js.map +1 -1
  58. package/dist/public/node/analytics.js +1 -2
  59. package/dist/public/node/analytics.js.map +1 -1
  60. package/dist/public/node/api/admin.d.ts +2 -1
  61. package/dist/public/node/api/admin.js +36 -10
  62. package/dist/public/node/api/admin.js.map +1 -1
  63. package/dist/public/node/api/graphql.d.ts +2 -0
  64. package/dist/public/node/api/graphql.js +3 -3
  65. package/dist/public/node/api/graphql.js.map +1 -1
  66. package/dist/public/node/api/webhooks.d.ts +13 -0
  67. package/dist/public/node/api/webhooks.js +34 -0
  68. package/dist/public/node/api/webhooks.js.map +1 -0
  69. package/dist/public/node/base-command.js +4 -0
  70. package/dist/public/node/base-command.js.map +1 -1
  71. package/dist/public/node/cli-launcher.d.ts +12 -0
  72. package/dist/public/node/cli-launcher.js +29 -0
  73. package/dist/public/node/cli-launcher.js.map +1 -0
  74. package/dist/public/node/cli.d.ts +16 -10
  75. package/dist/public/node/cli.js +45 -101
  76. package/dist/public/node/cli.js.map +1 -1
  77. package/dist/public/node/context/fqdn.js +11 -7
  78. package/dist/public/node/context/fqdn.js.map +1 -1
  79. package/dist/public/node/context/local.d.ts +7 -0
  80. package/dist/public/node/context/local.js +16 -0
  81. package/dist/public/node/context/local.js.map +1 -1
  82. package/dist/public/node/environment.d.ts +7 -0
  83. package/dist/public/node/environment.js +11 -0
  84. package/dist/public/node/environment.js.map +1 -1
  85. package/dist/public/node/error-handler.js +2 -4
  86. package/dist/public/node/error-handler.js.map +1 -1
  87. package/dist/public/node/error.js +4 -13
  88. package/dist/public/node/error.js.map +1 -1
  89. package/dist/public/node/global-context.d.ts +15 -0
  90. package/dist/public/node/global-context.js +29 -0
  91. package/dist/public/node/global-context.js.map +1 -0
  92. package/dist/public/node/hooks/prerun.js +0 -2
  93. package/dist/public/node/hooks/prerun.js.map +1 -1
  94. package/dist/public/node/is-global.js +2 -1
  95. package/dist/public/node/is-global.js.map +1 -1
  96. package/dist/public/node/json-schema.d.ts +2 -1
  97. package/dist/public/node/json-schema.js +8 -3
  98. package/dist/public/node/json-schema.js.map +1 -1
  99. package/dist/public/node/node-package-manager.js +1 -1
  100. package/dist/public/node/node-package-manager.js.map +1 -1
  101. package/dist/public/node/notifications-system.d.ts +193 -0
  102. package/dist/public/node/notifications-system.js +242 -0
  103. package/dist/public/node/notifications-system.js.map +1 -0
  104. package/dist/public/node/output.d.ts +1 -6
  105. package/dist/public/node/output.js +1 -5
  106. package/dist/public/node/output.js.map +1 -1
  107. package/dist/public/node/path.d.ts +3 -3
  108. package/dist/public/node/path.js +4 -5
  109. package/dist/public/node/path.js.map +1 -1
  110. package/dist/public/node/system.js +14 -2
  111. package/dist/public/node/system.js.map +1 -1
  112. package/dist/public/node/themes/api.d.ts +4 -12
  113. package/dist/public/node/themes/api.js +225 -36
  114. package/dist/public/node/themes/api.js.map +1 -1
  115. package/dist/public/node/themes/factories.d.ts +1 -3
  116. package/dist/public/node/themes/factories.js +0 -16
  117. package/dist/public/node/themes/factories.js.map +1 -1
  118. package/dist/public/node/themes/types.d.ts +1 -0
  119. package/dist/public/node/themes/types.js.map +1 -1
  120. package/dist/public/node/themes/utils.d.ts +2 -0
  121. package/dist/public/node/themes/utils.js +11 -0
  122. package/dist/public/node/themes/utils.js.map +1 -1
  123. package/dist/public/node/tree-kill.js +0 -2
  124. package/dist/public/node/tree-kill.js.map +1 -1
  125. package/dist/public/node/ui.js +30 -80
  126. package/dist/public/node/ui.js.map +1 -1
  127. package/dist/public/node/vendor/dev_server/DevServer.d.ts +19 -0
  128. package/dist/public/node/vendor/dev_server/DevServer.js +170 -0
  129. package/dist/public/node/vendor/dev_server/DevServer.js.map +1 -0
  130. package/dist/public/node/version.d.ts +13 -0
  131. package/dist/public/node/version.js +38 -0
  132. package/dist/public/node/version.js.map +1 -0
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +9 -7
  135. package/assets/cli-ruby/.devcontainer.json +0 -5
  136. package/assets/cli-ruby/.rubocop.yml +0 -102
  137. package/assets/cli-ruby/.rubocop_todo.yml +0 -24
  138. package/assets/cli-ruby/CHANGELOG.md +0 -634
  139. package/assets/cli-ruby/CONTRIBUTING.md +0 -3
  140. package/assets/cli-ruby/Codespace.dockerfile +0 -35
  141. package/assets/cli-ruby/Gemfile +0 -32
  142. package/assets/cli-ruby/README.md +0 -30
  143. package/assets/cli-ruby/Rakefile +0 -167
  144. package/assets/cli-ruby/SECURITY.md +0 -59
  145. package/assets/cli-ruby/Tests.dockerfile +0 -35
  146. package/assets/cli-ruby/assets/logo.png +0 -0
  147. package/assets/cli-ruby/bin/console +0 -11
  148. package/assets/cli-ruby/bin/load_shopify.rb +0 -22
  149. package/assets/cli-ruby/bin/shopify +0 -67
  150. package/assets/cli-ruby/bin/shopify.bat +0 -3
  151. package/assets/cli-ruby/dev.yml +0 -29
  152. package/assets/cli-ruby/docs/README.md +0 -13
  153. package/assets/cli-ruby/docs/contributors/testing.md +0 -27
  154. package/assets/cli-ruby/docs/users/installation.md +0 -3
  155. package/assets/cli-ruby/docs/users/migrate-from-themekit.md +0 -18
  156. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256 +0 -1
  157. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256 +0 -1
  158. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256 +0 -1
  159. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +0 -1
  160. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256 +0 -1
  161. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256 +0 -1
  162. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256 +0 -1
  163. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +0 -1
  164. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256 +0 -1
  165. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256 +0 -1
  166. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256 +0 -1
  167. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +0 -1
  168. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256 +0 -1
  169. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256 +0 -1
  170. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256 +0 -1
  171. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +0 -1
  172. package/assets/cli-ruby/ext/javy/javy.rb +0 -204
  173. package/assets/cli-ruby/ext/javy/version +0 -1
  174. package/assets/cli-ruby/ext/shopify-extensions/extconf.rb +0 -21
  175. package/assets/cli-ruby/ext/shopify-extensions/shopify_extensions.rb +0 -152
  176. package/assets/cli-ruby/ext/shopify-extensions/version +0 -1
  177. package/assets/cli-ruby/features/support/assertions.rb +0 -17
  178. package/assets/cli-ruby/features/support/cli.rb +0 -7
  179. package/assets/cli-ruby/features/support/process.rb +0 -27
  180. package/assets/cli-ruby/features/support/requires.rb +0 -3
  181. package/assets/cli-ruby/lib/docgen/class_template.md.erb +0 -81
  182. package/assets/cli-ruby/lib/docgen/index_template.md.erb +0 -5
  183. package/assets/cli-ruby/lib/docgen/markdown.rb +0 -101
  184. package/assets/cli-ruby/lib/graphql/admin_introspection.graphql +0 -87
  185. package/assets/cli-ruby/lib/graphql/all_organizations.graphql +0 -19
  186. package/assets/cli-ruby/lib/graphql/all_orgs_with_apps.graphql +0 -30
  187. package/assets/cli-ruby/lib/graphql/api_versions.graphql +0 -6
  188. package/assets/cli-ruby/lib/graphql/convert_dev_to_test_store.graphql +0 -10
  189. package/assets/cli-ruby/lib/graphql/create_app.graphql +0 -20
  190. package/assets/cli-ruby/lib/graphql/create_customer.graphql +0 -9
  191. package/assets/cli-ruby/lib/graphql/create_draft_order.graphql +0 -8
  192. package/assets/cli-ruby/lib/graphql/create_product.graphql +0 -9
  193. package/assets/cli-ruby/lib/graphql/extension_create.graphql +0 -37
  194. package/assets/cli-ruby/lib/graphql/extension_update_draft.graphql +0 -19
  195. package/assets/cli-ruby/lib/graphql/fetch_specifications.graphql +0 -14
  196. package/assets/cli-ruby/lib/graphql/find_organization.graphql +0 -18
  197. package/assets/cli-ruby/lib/graphql/find_organization_with_apps.graphql +0 -20
  198. package/assets/cli-ruby/lib/graphql/get_app_by_api_key.graphql +0 -9
  199. package/assets/cli-ruby/lib/graphql/get_app_urls.graphql +0 -6
  200. package/assets/cli-ruby/lib/graphql/get_extension_registrations.graphql +0 -28
  201. package/assets/cli-ruby/lib/graphql/get_variant_id.graphql +0 -16
  202. package/assets/cli-ruby/lib/graphql/update_dashboard_urls.graphql +0 -8
  203. package/assets/cli-ruby/lib/project_types/extension/cli.rb +0 -75
  204. package/assets/cli-ruby/lib/project_types/extension/commands/extension_command.rb +0 -29
  205. package/assets/cli-ruby/lib/project_types/extension/commands/serve.rb +0 -164
  206. package/assets/cli-ruby/lib/project_types/extension/errors.rb +0 -9
  207. package/assets/cli-ruby/lib/project_types/extension/extension_project.rb +0 -151
  208. package/assets/cli-ruby/lib/project_types/extension/extension_project_keys.rb +0 -12
  209. package/assets/cli-ruby/lib/project_types/extension/features/argo.rb +0 -50
  210. package/assets/cli-ruby/lib/project_types/extension/features/argo_config.rb +0 -59
  211. package/assets/cli-ruby/lib/project_types/extension/features/argo_dependencies.rb +0 -28
  212. package/assets/cli-ruby/lib/project_types/extension/features/argo_runtime.rb +0 -15
  213. package/assets/cli-ruby/lib/project_types/extension/features/argo_serve.rb +0 -115
  214. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup.rb +0 -54
  215. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_step.rb +0 -31
  216. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_steps.rb +0 -51
  217. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/admin.rb +0 -29
  218. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/base.rb +0 -19
  219. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +0 -23
  220. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +0 -29
  221. package/assets/cli-ruby/lib/project_types/extension/loaders/project.rb +0 -50
  222. package/assets/cli-ruby/lib/project_types/extension/loaders/specification_handler.rb +0 -22
  223. package/assets/cli-ruby/lib/project_types/extension/messages/message_loading.rb +0 -34
  224. package/assets/cli-ruby/lib/project_types/extension/messages/messages.rb +0 -320
  225. package/assets/cli-ruby/lib/project_types/extension/models/app.rb +0 -14
  226. package/assets/cli-ruby/lib/project_types/extension/models/lazy_specification_handler.rb +0 -12
  227. package/assets/cli-ruby/lib/project_types/extension/models/specification.rb +0 -41
  228. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/default.rb +0 -145
  229. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +0 -134
  230. package/assets/cli-ruby/lib/project_types/extension/models/specifications.rb +0 -91
  231. package/assets/cli-ruby/lib/project_types/extension/models/validation_error.rb +0 -17
  232. package/assets/cli-ruby/lib/project_types/extension/models/version.rb +0 -15
  233. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_features.rb +0 -73
  234. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_options.rb +0 -21
  235. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/validation_error_converter.rb +0 -25
  236. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/version_converter.rb +0 -28
  237. package/assets/cli-ruby/lib/project_types/extension/tasks/fetch_specifications.rb +0 -21
  238. package/assets/cli-ruby/lib/project_types/node/cli.rb +0 -12
  239. package/assets/cli-ruby/lib/project_types/node/forms/create.rb +0 -45
  240. package/assets/cli-ruby/lib/project_types/node/messages/messages.rb +0 -33
  241. package/assets/cli-ruby/lib/project_types/php/cli.rb +0 -16
  242. package/assets/cli-ruby/lib/project_types/php/forms/create.rb +0 -44
  243. package/assets/cli-ruby/lib/project_types/php/messages/messages.rb +0 -29
  244. package/assets/cli-ruby/lib/project_types/rails/cli.rb +0 -15
  245. package/assets/cli-ruby/lib/project_types/rails/forms/create.rb +0 -75
  246. package/assets/cli-ruby/lib/project_types/rails/gem.rb +0 -110
  247. package/assets/cli-ruby/lib/project_types/rails/messages/messages.rb +0 -101
  248. package/assets/cli-ruby/lib/project_types/script/cli.rb +0 -27
  249. package/assets/cli-ruby/lib/project_types/script/commands/connect.rb +0 -16
  250. package/assets/cli-ruby/lib/project_types/script/commands/create.rb +0 -24
  251. package/assets/cli-ruby/lib/project_types/script/commands/javy.rb +0 -24
  252. package/assets/cli-ruby/lib/project_types/script/commands/push.rb +0 -26
  253. package/assets/cli-ruby/lib/project_types/script/loaders/project.rb +0 -46
  254. package/assets/cli-ruby/lib/project_types/script/loaders/specification_handler.rb +0 -22
  255. package/assets/cli-ruby/lib/project_types/script/messages/messages.rb +0 -11
  256. package/assets/cli-ruby/lib/project_types/theme/cli.rb +0 -33
  257. package/assets/cli-ruby/lib/project_types/theme/commands/common/root_helper.rb +0 -94
  258. package/assets/cli-ruby/lib/project_types/theme/commands/common/shop_helper.rb +0 -13
  259. package/assets/cli-ruby/lib/project_types/theme/commands/console.rb +0 -23
  260. package/assets/cli-ruby/lib/project_types/theme/commands/delete.rb +0 -70
  261. package/assets/cli-ruby/lib/project_types/theme/commands/init.rb +0 -46
  262. package/assets/cli-ruby/lib/project_types/theme/commands/list.rb +0 -33
  263. package/assets/cli-ruby/lib/project_types/theme/commands/open.rb +0 -73
  264. package/assets/cli-ruby/lib/project_types/theme/commands/package.rb +0 -73
  265. package/assets/cli-ruby/lib/project_types/theme/commands/publish.rb +0 -49
  266. package/assets/cli-ruby/lib/project_types/theme/commands/pull.rb +0 -118
  267. package/assets/cli-ruby/lib/project_types/theme/commands/push.rb +0 -160
  268. package/assets/cli-ruby/lib/project_types/theme/commands/serve.rb +0 -91
  269. package/assets/cli-ruby/lib/project_types/theme/commands/share.rb +0 -62
  270. package/assets/cli-ruby/lib/project_types/theme/commands/token.rb +0 -22
  271. package/assets/cli-ruby/lib/project_types/theme/conversions/base_glob.rb +0 -65
  272. package/assets/cli-ruby/lib/project_types/theme/conversions/ignore_glob.rb +0 -15
  273. package/assets/cli-ruby/lib/project_types/theme/conversions/include_glob.rb +0 -15
  274. package/assets/cli-ruby/lib/project_types/theme/forms/confirm_store.rb +0 -15
  275. package/assets/cli-ruby/lib/project_types/theme/forms/select.rb +0 -34
  276. package/assets/cli-ruby/lib/project_types/theme/messages/messages.rb +0 -429
  277. package/assets/cli-ruby/lib/project_types/theme/models/specification_handlers/theme.rb +0 -19
  278. package/assets/cli-ruby/lib/project_types/theme/presenters/theme_presenter.rb +0 -48
  279. package/assets/cli-ruby/lib/project_types/theme/presenters/themes_presenter.rb +0 -29
  280. package/assets/cli-ruby/lib/project_types/theme/ui/sync_progress_bar.rb +0 -20
  281. package/assets/cli-ruby/lib/rubygems_plugin.rb +0 -26
  282. package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +0 -160
  283. package/assets/cli-ruby/lib/shopify_cli/api.rb +0 -130
  284. package/assets/cli-ruby/lib/shopify_cli/command/project_command.rb +0 -31
  285. package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +0 -20
  286. package/assets/cli-ruby/lib/shopify_cli/command.rb +0 -166
  287. package/assets/cli-ruby/lib/shopify_cli/commands.rb +0 -21
  288. package/assets/cli-ruby/lib/shopify_cli/constants.rb +0 -101
  289. package/assets/cli-ruby/lib/shopify_cli/context.rb +0 -709
  290. package/assets/cli-ruby/lib/shopify_cli/core/cli_version.rb +0 -20
  291. package/assets/cli-ruby/lib/shopify_cli/core/entry_point.rb +0 -64
  292. package/assets/cli-ruby/lib/shopify_cli/core/executor.rb +0 -23
  293. package/assets/cli-ruby/lib/shopify_cli/core/finalize.rb +0 -13
  294. package/assets/cli-ruby/lib/shopify_cli/core/monorail.rb +0 -122
  295. package/assets/cli-ruby/lib/shopify_cli/core.rb +0 -8
  296. package/assets/cli-ruby/lib/shopify_cli/db.rb +0 -114
  297. package/assets/cli-ruby/lib/shopify_cli/environment.rb +0 -217
  298. package/assets/cli-ruby/lib/shopify_cli/exception_reporter.rb +0 -80
  299. package/assets/cli-ruby/lib/shopify_cli/feature.rb +0 -95
  300. package/assets/cli-ruby/lib/shopify_cli/file_system_listener.rb +0 -30
  301. package/assets/cli-ruby/lib/shopify_cli/form.rb +0 -42
  302. package/assets/cli-ruby/lib/shopify_cli/git.rb +0 -320
  303. package/assets/cli-ruby/lib/shopify_cli/github/issue_url_generator.rb +0 -30
  304. package/assets/cli-ruby/lib/shopify_cli/github.rb +0 -5
  305. package/assets/cli-ruby/lib/shopify_cli/helpers/haikunator.rb +0 -92
  306. package/assets/cli-ruby/lib/shopify_cli/helpers.rb +0 -5
  307. package/assets/cli-ruby/lib/shopify_cli/http_request.rb +0 -43
  308. package/assets/cli-ruby/lib/shopify_cli/identity_auth/env_auth_token.rb +0 -34
  309. package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +0 -332
  310. package/assets/cli-ruby/lib/shopify_cli/js_system.rb +0 -115
  311. package/assets/cli-ruby/lib/shopify_cli/lazy_delegator.rb +0 -55
  312. package/assets/cli-ruby/lib/shopify_cli/messages/messages.rb +0 -863
  313. package/assets/cli-ruby/lib/shopify_cli/method_object.rb +0 -123
  314. package/assets/cli-ruby/lib/shopify_cli/migrator/migration.rb +0 -27
  315. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +0 -13
  316. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +0 -41
  317. package/assets/cli-ruby/lib/shopify_cli/migrator.rb +0 -46
  318. package/assets/cli-ruby/lib/shopify_cli/options.rb +0 -40
  319. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions/job.rb +0 -36
  320. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions.rb +0 -46
  321. package/assets/cli-ruby/lib/shopify_cli/partners_api/organizations.rb +0 -45
  322. package/assets/cli-ruby/lib/shopify_cli/partners_api.rb +0 -91
  323. package/assets/cli-ruby/lib/shopify_cli/project.rb +0 -199
  324. package/assets/cli-ruby/lib/shopify_cli/project_type.rb +0 -66
  325. package/assets/cli-ruby/lib/shopify_cli/reporting_configuration_controller.rb +0 -29
  326. package/assets/cli-ruby/lib/shopify_cli/resolve_constant.rb +0 -25
  327. package/assets/cli-ruby/lib/shopify_cli/resources/env_file.rb +0 -108
  328. package/assets/cli-ruby/lib/shopify_cli/resources.rb +0 -5
  329. package/assets/cli-ruby/lib/shopify_cli/result.rb +0 -448
  330. package/assets/cli-ruby/lib/shopify_cli/shopifolk.rb +0 -82
  331. package/assets/cli-ruby/lib/shopify_cli/task.rb +0 -20
  332. package/assets/cli-ruby/lib/shopify_cli/tasks/confirm_store.rb +0 -18
  333. package/assets/cli-ruby/lib/shopify_cli/tasks/create_api_client.rb +0 -40
  334. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_authenticated.rb +0 -19
  335. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_dev_store.rb +0 -41
  336. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_env.rb +0 -90
  337. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_git_dependency.rb +0 -14
  338. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_loopback_url.rb +0 -20
  339. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_project_type.rb +0 -14
  340. package/assets/cli-ruby/lib/shopify_cli/tasks/select_org_and_shop.rb +0 -81
  341. package/assets/cli-ruby/lib/shopify_cli/tasks/update_dashboard_urls.rb +0 -57
  342. package/assets/cli-ruby/lib/shopify_cli/tasks.rb +0 -44
  343. package/assets/cli-ruby/lib/shopify_cli/theme/backoff_helper.rb +0 -47
  344. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +0 -82
  345. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/certificate_manager.rb +0 -79
  346. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/errors.rb +0 -9
  347. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/header_hash.rb +0 -98
  348. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hooks/file_change_hook.rb +0 -77
  349. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb +0 -62
  350. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +0 -63
  351. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +0 -27
  352. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot_reload.js +0 -48
  353. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/sse_client.js +0 -43
  354. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme.js +0 -114
  355. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme_extension.js +0 -121
  356. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/script_injector.rb +0 -57
  357. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb +0 -50
  358. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload.rb +0 -75
  359. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/local_assets.rb +0 -101
  360. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +0 -313
  361. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy_param_builder.rb +0 -84
  362. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/reload_mode.rb +0 -34
  363. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +0 -35
  364. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher.rb +0 -44
  365. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/sse.rb +0 -75
  366. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/watcher.rb +0 -64
  367. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/web_server.rb +0 -140
  368. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server.rb +0 -332
  369. package/assets/cli-ruby/lib/shopify_cli/theme/development_theme.rb +0 -101
  370. package/assets/cli-ruby/lib/shopify_cli/theme/extension/app_extension.rb +0 -40
  371. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hooks/file_change_hook.rb +0 -76
  372. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload/script_injector.rb +0 -30
  373. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload.rb +0 -13
  374. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/local_assets.rb +0 -31
  375. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/proxy_param_builder.rb +0 -94
  376. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/watcher.rb +0 -49
  377. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server.rb +0 -175
  378. package/assets/cli-ruby/lib/shopify_cli/theme/extension/host_theme.rb +0 -109
  379. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ignore_helper.rb +0 -35
  380. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/extension_serve_job.rb +0 -120
  381. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/operation.rb +0 -25
  382. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer.rb +0 -100
  383. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_progress_bar.rb +0 -35
  384. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_raw_progress_bar.rb +0 -40
  385. package/assets/cli-ruby/lib/shopify_cli/theme/file.rb +0 -133
  386. package/assets/cli-ruby/lib/shopify_cli/theme/filter/path_matcher.rb +0 -38
  387. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_filter.rb +0 -112
  388. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_helper.rb +0 -37
  389. package/assets/cli-ruby/lib/shopify_cli/theme/include_filter.rb +0 -67
  390. package/assets/cli-ruby/lib/shopify_cli/theme/mime_type.rb +0 -34
  391. package/assets/cli-ruby/lib/shopify_cli/theme/notifier.rb +0 -52
  392. package/assets/cli-ruby/lib/shopify_cli/theme/repl/api.rb +0 -109
  393. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_dev_server.rb +0 -93
  394. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_middleware.rb +0 -97
  395. package/assets/cli-ruby/lib/shopify_cli/theme/repl/remote_evaluator.rb +0 -166
  396. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/success.html +0 -78
  397. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/template.liquid +0 -15
  398. package/assets/cli-ruby/lib/shopify_cli/theme/repl/snippet.rb +0 -81
  399. package/assets/cli-ruby/lib/shopify_cli/theme/repl.rb +0 -88
  400. package/assets/cli-ruby/lib/shopify_cli/theme/root.rb +0 -62
  401. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/checksums.rb +0 -66
  402. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/downloader.rb +0 -63
  403. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/error_reporter.rb +0 -45
  404. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/merger.rb +0 -53
  405. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/operation.rb +0 -49
  406. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/standard_reporter.rb +0 -32
  407. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/unsupported_script_warning.rb +0 -90
  408. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk.rb +0 -133
  409. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_item.rb +0 -64
  410. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_job.rb +0 -139
  411. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_request.rb +0 -30
  412. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all.rb +0 -41
  413. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +0 -37
  414. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/base_strategy_form.rb +0 -64
  415. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +0 -29
  416. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_update_strategy.rb +0 -30
  417. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_delete_handler.rb +0 -49
  418. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_update_handler.rb +0 -71
  419. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader.rb +0 -231
  420. package/assets/cli-ruby/lib/shopify_cli/theme/syncer.rb +0 -391
  421. package/assets/cli-ruby/lib/shopify_cli/theme/theme.rb +0 -212
  422. package/assets/cli-ruby/lib/shopify_cli/theme/theme_access_api.rb +0 -89
  423. package/assets/cli-ruby/lib/shopify_cli/theme/theme_admin_api.rb +0 -101
  424. package/assets/cli-ruby/lib/shopify_cli/thread_pool/job.rb +0 -35
  425. package/assets/cli-ruby/lib/shopify_cli/thread_pool.rb +0 -49
  426. package/assets/cli-ruby/lib/shopify_cli/transform_data_structure.rb +0 -87
  427. package/assets/cli-ruby/lib/shopify_cli/utilities.rb +0 -21
  428. package/assets/cli-ruby/lib/shopify_cli/version.rb +0 -3
  429. package/assets/cli-ruby/lib/shopify_cli.rb +0 -182
  430. package/assets/cli-ruby/shipit.rubygems.yml +0 -3
  431. package/assets/cli-ruby/shopify-cli.gemspec +0 -46
  432. package/assets/cli-ruby/shopify-dev +0 -16
  433. package/assets/cli-ruby/test/minitest_ext.rb +0 -115
  434. package/assets/cli-ruby/test/project_types/extension/extension_test_helpers.rb +0 -70
  435. package/assets/cli-ruby/test/shopify-cli/migrator/migrations/migration_helper.rb +0 -20
  436. package/assets/cli-ruby/test/test_helpers.rb +0 -16
  437. package/assets/cli-ruby/utilities/constants.rb +0 -7
  438. package/assets/cli-ruby/utilities/docker/container.rb +0 -104
  439. package/assets/cli-ruby/utilities/docker.rb +0 -89
  440. package/assets/cli-ruby/utilities/utilities.rb +0 -6
  441. package/assets/cli-ruby/vendor/deps/cli-kit/REVISION +0 -1
  442. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +0 -21
  443. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +0 -49
  444. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +0 -94
  445. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/config.rb +0 -133
  446. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +0 -123
  447. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/executor.rb +0 -79
  448. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ini.rb +0 -102
  449. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +0 -82
  450. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/logger.rb +0 -82
  451. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +0 -60
  452. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ruby_backports/enumerable.rb +0 -6
  453. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +0 -244
  454. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support.rb +0 -9
  455. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/system.rb +0 -243
  456. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/util.rb +0 -193
  457. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/version.rb +0 -5
  458. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit.rb +0 -60
  459. package/assets/cli-ruby/vendor/deps/cli-ui/REVISION +0 -1
  460. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +0 -157
  461. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/color.rb +0 -84
  462. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +0 -193
  463. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +0 -98
  464. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +0 -166
  465. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +0 -139
  466. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +0 -120
  467. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame.rb +0 -269
  468. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +0 -84
  469. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/os.rb +0 -73
  470. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/printer.rb +0 -59
  471. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress.rb +0 -90
  472. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress_plain.rb +0 -50
  473. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +0 -484
  474. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +0 -29
  475. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +0 -282
  476. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +0 -40
  477. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +0 -263
  478. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +0 -66
  479. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +0 -232
  480. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +0 -46
  481. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +0 -102
  482. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/version.rb +0 -5
  483. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +0 -27
  484. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +0 -61
  485. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +0 -77
  486. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +0 -56
  487. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui.rb +0 -234
  488. package/assets/cli-ruby/vendor/deps/ruby2_keywords/LICENSE +0 -22
  489. package/assets/cli-ruby/vendor/deps/ruby2_keywords/README.md +0 -67
  490. package/assets/cli-ruby/vendor/deps/ruby2_keywords/Rakefile +0 -54
  491. package/assets/cli-ruby/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +0 -57
  492. package/assets/cli-ruby/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +0 -18
  493. package/assets/cli-ruby/vendor/deps/ruby2_keywords/test/test_keyword.rb +0 -41
  494. package/assets/cli-ruby/vendor/deps/smart_properties/REVISION +0 -1
  495. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/errors.rb +0 -114
  496. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property.rb +0 -168
  497. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property_collection.rb +0 -83
  498. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations/ancestor.rb +0 -27
  499. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations.rb +0 -8
  500. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/version.rb +0 -3
  501. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties.rb +0 -174
  502. package/assets/cli-ruby/vendor/deps/webrick/Gemfile +0 -3
  503. package/assets/cli-ruby/vendor/deps/webrick/LICENSE.txt +0 -22
  504. package/assets/cli-ruby/vendor/deps/webrick/README.md +0 -61
  505. package/assets/cli-ruby/vendor/deps/webrick/Rakefile +0 -10
  506. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/accesslog.rb +0 -157
  507. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cgi.rb +0 -313
  508. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/compat.rb +0 -36
  509. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/config.rb +0 -158
  510. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cookie.rb +0 -172
  511. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/htmlutils.rb +0 -30
  512. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +0 -117
  513. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +0 -116
  514. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +0 -395
  515. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +0 -132
  516. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +0 -97
  517. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +0 -158
  518. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +0 -53
  519. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth.rb +0 -96
  520. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpproxy.rb +0 -354
  521. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httprequest.rb +0 -636
  522. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpresponse.rb +0 -564
  523. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/https.rb +0 -152
  524. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpserver.rb +0 -294
  525. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +0 -152
  526. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +0 -47
  527. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +0 -126
  528. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +0 -88
  529. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +0 -552
  530. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +0 -47
  531. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet.rb +0 -23
  532. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpstatus.rb +0 -194
  533. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httputils.rb +0 -512
  534. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpversion.rb +0 -76
  535. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/log.rb +0 -156
  536. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/server.rb +0 -381
  537. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/ssl.rb +0 -215
  538. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/utils.rb +0 -265
  539. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/version.rb +0 -18
  540. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick.rb +0 -232
  541. package/assets/cli-ruby/vendor/deps/webrick/webrick.gemspec +0 -74
  542. package/assets/cli-ruby/vendor/gen/lib/gen/commands/help.rb +0 -20
  543. package/assets/cli-ruby/vendor/gen/lib/gen/commands/new.rb +0 -21
  544. package/assets/cli-ruby/vendor/gen/lib/gen/commands.rb +0 -18
  545. package/assets/cli-ruby/vendor/gen/lib/gen/entry_point.rb +0 -10
  546. package/assets/cli-ruby/vendor/gen/lib/gen/generator.rb +0 -165
  547. package/assets/cli-ruby/vendor/gen/lib/gen.rb +0 -39
  548. package/assets/cli-ruby/vendor/gen/template/Gemfile +0 -10
  549. package/assets/cli-ruby/vendor/gen/template/README.md +0 -1
  550. package/assets/cli-ruby/vendor/gen/template/bin/testunit +0 -23
  551. package/assets/cli-ruby/vendor/gen/template/bin/update-deps +0 -97
  552. package/assets/cli-ruby/vendor/gen/template/dev-gems.yml +0 -3
  553. package/assets/cli-ruby/vendor/gen/template/dev-vendor.yml +0 -4
  554. package/assets/cli-ruby/vendor/gen/template/exe/__app__-gems +0 -17
  555. package/assets/cli-ruby/vendor/gen/template/exe/__app__-vendor +0 -18
  556. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/example.rb +0 -19
  557. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/help.rb +0 -21
  558. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands.rb +0 -18
  559. package/assets/cli-ruby/vendor/gen/template/lib/__app__/entry_point.rb +0 -10
  560. package/assets/cli-ruby/vendor/gen/template/lib/__app__.rb +0 -33
  561. package/assets/cli-ruby/vendor/gen/template/test/example_test.rb +0 -17
  562. package/assets/cli-ruby/vendor/gen/template/test/test_helper.rb +0 -22
  563. package/assets/cli-ruby/vendor/lib/semantic/LICENSE +0 -20
  564. package/assets/cli-ruby/vendor/lib/semantic/semantic.rb +0 -4
  565. package/assets/cli-ruby/vendor/lib/semantic/version.rb +0 -179
  566. package/dist/private/node/demo-recorder.d.ts +0 -17
  567. package/dist/private/node/demo-recorder.js +0 -121
  568. package/dist/private/node/demo-recorder.js.map +0 -1
  569. package/dist/public/node/ruby.d.ts +0 -38
  570. package/dist/public/node/ruby.js +0 -327
  571. package/dist/public/node/ruby.js.map +0 -1
@@ -149,13 +149,12 @@ export function sniffForPath(argv = process.argv) {
149
149
  return pathFlag;
150
150
  }
151
151
  /**
152
- * Returns whether the `--json` flag is present in the arguments.
152
+ * Returns whether the `--json` or `-j` flags are present in the arguments.
153
153
  *
154
- * @param argv - The arguments to search for the `--json` flag.
155
- * @returns Whether the `--json` flag is present in the arguments.
154
+ * @param argv - The arguments to search for the `--json` and `-j` flags.
155
+ * @returns Whether the `--json` or `-j` flag is present in the arguments.
156
156
  */
157
157
  export function sniffForJson(argv = process.argv) {
158
- const jsonFlagIndex = argv.indexOf('--json');
159
- return jsonFlagIndex !== -1;
158
+ return argv.includes('--json') || argv.includes('-j');
160
159
  }
161
160
  //# sourceMappingURL=path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/public/node/path.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,EACL,QAAQ,EACR,OAAO,IAAI,YAAY,EACvB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,QAAQ,IAAI,aAAa,EACzB,OAAO,IAAI,YAAY,EACvB,UAAU,GACX,MAAM,OAAO,CAAA;AACd,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAA;AAIjC;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAe;IACzC,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,KAAe;IAC5C,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,EAAU;IACnD,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAY;IACjD,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAc,GAAG,EAAE;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACxC,6DAA6D;IAC7D,aAAa;IACb,MAAM,kBAAkB,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,MAAM,CAAA;IACnG,IAAI,MAAM,KAAK,GAAG,IAAI,YAAY,KAAK,EAAE,IAAI,kBAAkB,GAAG,CAAC,EAAE;QACnE,OAAO,IAAI,CAAA;KACZ;SAAM;QACL,OAAO,YAAY,CAAA;KACpB;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;AACxE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAuB;IACrD,OAAO,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG;IACjB,uDAAuD;IACvD,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7D,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;KAC9B;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAA;IACxC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAM;IACjD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C,OAAO,aAAa,KAAK,CAAC,CAAC,CAAA;AAC7B,CAAC","sourcesContent":["import commondir from 'commondir'\nimport {\n relative,\n dirname as patheDirname,\n join,\n normalize,\n resolve,\n basename as basenamePathe,\n extname as extnamePathe,\n isAbsolute,\n} from 'pathe'\nimport {fileURLToPath} from 'url'\n// eslint-disable-next-line node/prefer-global/url\nimport type {URL} from 'url'\n\n/**\n * Joins a list of paths together.\n *\n * @param paths - Paths to join.\n * @returns Joined path.\n */\nexport function joinPath(...paths: string[]): string {\n return join(...paths)\n}\n\n/**\n * Normalizes a path.\n *\n * @param path - Path to normalize.\n * @returns Normalized path.\n */\nexport function normalizePath(path: string): string {\n return normalize(path)\n}\n\n/**\n * Resolves a list of paths together.\n *\n * @param paths - Paths to resolve.\n * @returns Resolved path.\n */\nexport function resolvePath(...paths: string[]): string {\n return resolve(...paths)\n}\n\n/**\n * Returns the relative path from one path to another.\n *\n * @param from - Path to resolve from.\n * @param to - Path to resolve to.\n * @returns Relative path.\n */\nexport function relativePath(from: string, to: string): string {\n return relative(from, to)\n}\n\n/**\n * Returns whether the path is absolute.\n *\n * @param path - Path to check.\n * @returns Whether the path is absolute.\n */\nexport function isAbsolutePath(path: string): boolean {\n return isAbsolute(path)\n}\n\n/**\n * Returns the directory name of a path.\n *\n * @param path - Path to get the directory name of.\n * @returns Directory name.\n */\nexport function dirname(path: string): string {\n return patheDirname(path)\n}\n\n/**\n * Returns the base name of a path.\n *\n * @param path - Path to get the base name of.\n * @param ext - Optional extension to remove from the result.\n * @returns Base name.\n */\nexport function basename(path: string, ext?: string): string {\n return basenamePathe(path, ext)\n}\n\n/**\n * Returns the extension of the path.\n *\n * @param path - Path to get the extension of.\n * @returns Extension.\n */\nexport function extname(path: string): string {\n return extnamePathe(path)\n}\n\n/**\n * Given an absolute filesystem path, it makes it relative to\n * the current working directory. This is useful when logging paths\n * to allow the users to click on the file and let the OS open it\n * in the editor of choice.\n *\n * @param path - Path to relativize.\n * @param dir - Current working directory.\n * @returns Relativized path.\n */\nexport function relativizePath(path: string, dir: string = cwd()): string {\n const result = commondir([path, dir])\n const relativePath = relative(dir, path)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const relativeComponents = relativePath.split('/').filter((component) => component === '..').length\n if (result === '/' || relativePath === '' || relativeComponents > 2) {\n return path\n } else {\n return relativePath\n }\n}\n\n/**\n * Given 2 paths, it returns whether the second path is a subpath of the first path.\n *\n * @param mainPath - The main path.\n * @param subpath - The subpath.\n * @returns Whether the subpath is a subpath of the main path.\n */\nexport function isSubpath(mainPath: string, subpath: string): boolean {\n const relativePath = relative(mainPath, subpath)\n return !relativePath.startsWith('..') && !isAbsolutePath(relativePath)\n}\n\n/**\n * Given a module's import.meta.url it returns the directory containing the module.\n *\n * @param moduleURL - The value of import.meta.url in the context of the caller module.\n * @returns The path to the directory containing the caller module.\n */\nexport function moduleDirectory(moduleURL: string | URL): string {\n return dirname(fileURLToPath(moduleURL))\n}\n\n/**\n * When running a script using `npm run`, something interesting happens. If the current\n * folder does not have a `package.json` or a `node_modules` folder, npm will traverse\n * the directory tree upwards until it finds one. Then it will run the script and set\n * `process.cwd()` to that folder, while the actual path is stored in the INIT_CWD\n * environment variable (see here: https://docs.npmjs.com/cli/v9/commands/npm-run-script#description).\n *\n * @returns The path to the current working directory.\n */\nexport function cwd(): string {\n // eslint-disable-next-line @shopify/cli/no-process-cwd\n return normalize(process.env.INIT_CWD ? process.env.INIT_CWD : process.cwd())\n}\n\n/**\n * Tries to get the value of the `--path` argument, if provided.\n *\n * @param argv - The arguments to search for the `--path` argument.\n * @returns The value of the `--path` argument, if provided.\n */\nexport function sniffForPath(argv = process.argv): string | undefined {\n const pathFlagIndex = argv.indexOf('--path')\n if (pathFlagIndex === -1) {\n const pathArg = argv.find((arg) => arg.startsWith('--path='))\n return pathArg?.split('=')[1]\n }\n const pathFlag = argv[pathFlagIndex + 1]\n if (!pathFlag || pathFlag.startsWith('-')) return\n return pathFlag\n}\n\n/**\n * Returns whether the `--json` flag is present in the arguments.\n *\n * @param argv - The arguments to search for the `--json` flag.\n * @returns Whether the `--json` flag is present in the arguments.\n */\nexport function sniffForJson(argv = process.argv): boolean {\n const jsonFlagIndex = argv.indexOf('--json')\n return jsonFlagIndex !== -1\n}\n"]}
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/public/node/path.ts"],"names":[],"mappings":"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","sourcesContent":["import commondir from 'commondir'\nimport {\n relative,\n dirname as patheDirname,\n join,\n normalize,\n resolve,\n basename as basenamePathe,\n extname as extnamePathe,\n isAbsolute,\n} from 'pathe'\nimport {fileURLToPath} from 'url'\n// eslint-disable-next-line node/prefer-global/url\nimport type {URL} from 'url'\n\n/**\n * Joins a list of paths together.\n *\n * @param paths - Paths to join.\n * @returns Joined path.\n */\nexport function joinPath(...paths: string[]): string {\n return join(...paths)\n}\n\n/**\n * Normalizes a path.\n *\n * @param path - Path to normalize.\n * @returns Normalized path.\n */\nexport function normalizePath(path: string): string {\n return normalize(path)\n}\n\n/**\n * Resolves a list of paths together.\n *\n * @param paths - Paths to resolve.\n * @returns Resolved path.\n */\nexport function resolvePath(...paths: string[]): string {\n return resolve(...paths)\n}\n\n/**\n * Returns the relative path from one path to another.\n *\n * @param from - Path to resolve from.\n * @param to - Path to resolve to.\n * @returns Relative path.\n */\nexport function relativePath(from: string, to: string): string {\n return relative(from, to)\n}\n\n/**\n * Returns whether the path is absolute.\n *\n * @param path - Path to check.\n * @returns Whether the path is absolute.\n */\nexport function isAbsolutePath(path: string): boolean {\n return isAbsolute(path)\n}\n\n/**\n * Returns the directory name of a path.\n *\n * @param path - Path to get the directory name of.\n * @returns Directory name.\n */\nexport function dirname(path: string): string {\n return patheDirname(path)\n}\n\n/**\n * Returns the base name of a path.\n *\n * @param path - Path to get the base name of.\n * @param ext - Optional extension to remove from the result.\n * @returns Base name.\n */\nexport function basename(path: string, ext?: string): string {\n return basenamePathe(path, ext)\n}\n\n/**\n * Returns the extension of the path.\n *\n * @param path - Path to get the extension of.\n * @returns Extension.\n */\nexport function extname(path: string): string {\n return extnamePathe(path)\n}\n\n/**\n * Given an absolute filesystem path, it makes it relative to\n * the current working directory. This is useful when logging paths\n * to allow the users to click on the file and let the OS open it\n * in the editor of choice.\n *\n * @param path - Path to relativize.\n * @param dir - Current working directory.\n * @returns Relativized path.\n */\nexport function relativizePath(path: string, dir: string = cwd()): string {\n const result = commondir([path, dir])\n const relativePath = relative(dir, path)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const relativeComponents = relativePath.split('/').filter((component) => component === '..').length\n if (result === '/' || relativePath === '' || relativeComponents > 2) {\n return path\n } else {\n return relativePath\n }\n}\n\n/**\n * Given 2 paths, it returns whether the second path is a subpath of the first path.\n *\n * @param mainPath - The main path.\n * @param subpath - The subpath.\n * @returns Whether the subpath is a subpath of the main path.\n */\nexport function isSubpath(mainPath: string, subpath: string): boolean {\n const relativePath = relative(mainPath, subpath)\n return !relativePath.startsWith('..') && !isAbsolutePath(relativePath)\n}\n\n/**\n * Given a module's import.meta.url it returns the directory containing the module.\n *\n * @param moduleURL - The value of import.meta.url in the context of the caller module.\n * @returns The path to the directory containing the caller module.\n */\nexport function moduleDirectory(moduleURL: string | URL): string {\n return dirname(fileURLToPath(moduleURL))\n}\n\n/**\n * When running a script using `npm run`, something interesting happens. If the current\n * folder does not have a `package.json` or a `node_modules` folder, npm will traverse\n * the directory tree upwards until it finds one. Then it will run the script and set\n * `process.cwd()` to that folder, while the actual path is stored in the INIT_CWD\n * environment variable (see here: https://docs.npmjs.com/cli/v9/commands/npm-run-script#description).\n *\n * @returns The path to the current working directory.\n */\nexport function cwd(): string {\n // eslint-disable-next-line @shopify/cli/no-process-cwd\n return normalize(process.env.INIT_CWD ? process.env.INIT_CWD : process.cwd())\n}\n\n/**\n * Tries to get the value of the `--path` argument, if provided.\n *\n * @param argv - The arguments to search for the `--path` argument.\n * @returns The value of the `--path` argument, if provided.\n */\nexport function sniffForPath(argv = process.argv): string | undefined {\n const pathFlagIndex = argv.indexOf('--path')\n if (pathFlagIndex === -1) {\n const pathArg = argv.find((arg) => arg.startsWith('--path='))\n return pathArg?.split('=')[1]\n }\n const pathFlag = argv[pathFlagIndex + 1]\n if (!pathFlag || pathFlag.startsWith('-')) return\n return pathFlag\n}\n\n/**\n * Returns whether the `--json` or `-j` flags are present in the arguments.\n *\n * @param argv - The arguments to search for the `--json` and `-j` flags.\n * @returns Whether the `--json` or `-j` flag is present in the arguments.\n */\nexport function sniffForJson(argv = process.argv): boolean {\n return argv.includes('--json') || argv.includes('-j')\n}\n"]}
@@ -1,9 +1,11 @@
1
- import { ExternalError } from './error.js';
2
- import { cwd } from './path.js';
1
+ import { AbortError, ExternalError } from './error.js';
2
+ import { cwd, dirname } from './path.js';
3
3
  import { treeKill } from './tree-kill.js';
4
4
  import { isTruthy } from './context/utilities.js';
5
+ import { renderWarning } from './ui.js';
5
6
  import { shouldDisplayColors, outputDebug } from '../../public/node/output.js';
6
7
  import { execa } from 'execa';
8
+ import which from 'which';
7
9
  /**
8
10
  * Opens a URL in the user's default browser.
9
11
  *
@@ -81,6 +83,7 @@ function buildExec(command, args, options) {
81
83
  if (shouldDisplayColors()) {
82
84
  env.FORCE_COLOR = '1';
83
85
  }
86
+ checkCommandSafety(command);
84
87
  const commandProcess = execa(command, args, {
85
88
  env,
86
89
  cwd: options?.cwd,
@@ -100,6 +103,15 @@ Running system process:
100
103
  `);
101
104
  return commandProcess;
102
105
  }
106
+ function checkCommandSafety(command) {
107
+ const commandDirectory = dirname(which.sync(command));
108
+ if (commandDirectory === cwd()) {
109
+ const headline = ['Skipped run of unsecure binary', { command }, 'found in the current directory.'];
110
+ const body = 'Please remove that file or review your current PATH.';
111
+ renderWarning({ headline, body });
112
+ throw new AbortError(headline, body);
113
+ }
114
+ }
103
115
  /**
104
116
  * Waits for a given number of seconds.
105
117
  *
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/public/node/system.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbortSignal} from './abort.js'\nimport {ExternalError} from './error.js'\nimport {cwd} from './path.js'\nimport {treeKill} from './tree-kill.js'\nimport {isTruthy} from './context/utilities.js'\nimport {shouldDisplayColors, outputDebug} from '../../public/node/output.js'\nimport {execa, ExecaChildProcess} from 'execa'\nimport type {Writable, Readable} from 'stream'\n\nexport interface ExecOptions {\n cwd?: string\n env?: {[key: string]: string | undefined}\n stdin?: Readable | 'inherit'\n stdout?: Writable | 'inherit'\n stderr?: Writable | 'inherit'\n stdio?: 'inherit'\n input?: string\n signal?: AbortSignal\n // Custom handler if process exits with a non-zero code\n externalErrorHandler?: (error: unknown) => Promise<void>\n}\n\n/**\n * Opens a URL in the user's default browser.\n *\n * @param url - URL to open.\n */\nexport async function openURL(url: string): Promise<void> {\n const externalOpen = await import('open')\n await externalOpen.default(url)\n}\n\n/**\n * Runs a command asynchronously, aggregates the stdout data, and returns it.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n * @returns A promise that resolves with the aggregatted stdout of the command.\n */\nexport async function captureOutput(command: string, args: string[], options?: ExecOptions): Promise<string> {\n const result = await buildExec(command, args, options)\n return result.stdout\n}\n\n/**\n * Runs a command asynchronously.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n */\nexport async function exec(command: string, args: string[], options?: ExecOptions): Promise<void> {\n const commandProcess = buildExec(command, args, options)\n if (options?.stderr && options.stderr !== 'inherit') {\n commandProcess.stderr?.pipe(options.stderr, {end: false})\n }\n if (options?.stdout && options.stdout !== 'inherit') {\n commandProcess.stdout?.pipe(options.stdout, {end: false})\n }\n let aborted = false\n options?.signal?.addEventListener('abort', () => {\n const pid = commandProcess.pid\n if (pid) {\n outputDebug(`Killing process ${pid}: ${command} ${args.join(' ')}`)\n aborted = true\n treeKill(pid, 'SIGTERM')\n }\n })\n try {\n await commandProcess\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (processError: any) {\n // Windows will throw an error whenever the process is killed, no matter the reason.\n // The aborted flag tell use that we killed it, so we can ignore the error.\n if (aborted) return\n if (options?.externalErrorHandler) {\n await options.externalErrorHandler(processError)\n } else {\n const abortError = new ExternalError(processError.message, command, args)\n abortError.stack = processError.stack\n throw abortError\n }\n }\n}\n\n/**\n * Runs a command asynchronously.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n * @returns A promise for a result with stdout and stderr properties.\n */\nfunction buildExec(command: string, args: string[], options?: ExecOptions): ExecaChildProcess {\n const env = options?.env ?? process.env\n if (shouldDisplayColors()) {\n env.FORCE_COLOR = '1'\n }\n const commandProcess = execa(command, args, {\n env,\n cwd: options?.cwd,\n input: options?.input,\n stdio: options?.stdio,\n stdin: options?.stdin,\n stdout: options?.stdout === 'inherit' ? 'inherit' : undefined,\n stderr: options?.stderr === 'inherit' ? 'inherit' : undefined,\n // Setting this to false makes it possible to kill the main process\n // and all its sub-processes with Ctrl+C on Windows\n windowsHide: false,\n })\n outputDebug(`\nRunning system process:\n · Command: ${command} ${args.join(' ')}\n · Working directory: ${options?.cwd ?? cwd()}\n`)\n return commandProcess\n}\n\n/**\n * Waits for a given number of seconds.\n *\n * @param seconds - Number of seconds to wait.\n * @returns A Promise resolving after the number of seconds.\n */\nexport async function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, 1000 * seconds)\n })\n}\n\n/**\n * Check if the standard input and output streams support prompting.\n *\n * @returns True if the standard input and output streams support prompting.\n */\nexport function terminalSupportsPrompting(): boolean {\n if (isTruthy(process.env.CI)) {\n return false\n }\n return Boolean(process.stdin.isTTY && process.stdout.isTTY)\n}\n"]}
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/public/node/system.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,YAAY,CAAA;AACpD,OAAO,EAAC,GAAG,EAAE,OAAO,EAAC,MAAM,WAAW,CAAA;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAA;AACrC,OAAO,EAAC,mBAAmB,EAAE,WAAW,EAAC,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAC,KAAK,EAAoB,MAAM,OAAO,CAAA;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAA;AAgBzB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,IAAc,EAAE,OAAqB;IACxF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACtD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc,EAAE,OAAqB;IAC/E,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACxD,IAAI,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE;QACnD,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC,CAAA;KAC1D;IACD,IAAI,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE;QACnD,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC,CAAA;KAC1D;IACD,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAA;QAC9B,IAAI,GAAG,EAAE;YACP,WAAW,CAAC,mBAAmB,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACnE,OAAO,GAAG,IAAI,CAAA;YACd,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;SACzB;IACH,CAAC,CAAC,CAAA;IACF,IAAI;QACF,MAAM,cAAc,CAAA;QACpB,8DAA8D;KAC/D;IAAC,OAAO,YAAiB,EAAE;QAC1B,oFAAoF;QACpF,2EAA2E;QAC3E,IAAI,OAAO;YAAE,OAAM;QACnB,IAAI,OAAO,EAAE,oBAAoB,EAAE;YACjC,MAAM,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;SACjD;aAAM;YACL,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACzE,UAAU,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAA;YACrC,MAAM,UAAU,CAAA;SACjB;KACF;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,OAAe,EAAE,IAAc,EAAE,OAAqB;IACvE,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACvC,IAAI,mBAAmB,EAAE,EAAE;QACzB,GAAG,CAAC,WAAW,GAAG,GAAG,CAAA;KACtB;IACD,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC3B,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAC1C,GAAG;QACH,GAAG,EAAE,OAAO,EAAE,GAAG;QACjB,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC7D,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC7D,mEAAmE;QACnE,mDAAmD;QACnD,WAAW,EAAE,KAAK;KACnB,CAAC,CAAA;IACF,WAAW,CAAC;;eAEC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;yBACf,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE;CAC7C,CAAC,CAAA;IACA,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACrD,IAAI,gBAAgB,KAAK,GAAG,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,CAAC,gCAAgC,EAAE,EAAC,OAAO,EAAC,EAAE,iCAAiC,CAAC,CAAA;QACjG,MAAM,IAAI,GAAG,sDAAsD,CAAA;QACnE,aAAa,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;QAC/B,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;KACrC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAe;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAC5B,OAAO,KAAK,CAAA;KACb;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC","sourcesContent":["import {AbortSignal} from './abort.js'\nimport {AbortError, ExternalError} from './error.js'\nimport {cwd, dirname} from './path.js'\nimport {treeKill} from './tree-kill.js'\nimport {isTruthy} from './context/utilities.js'\nimport {renderWarning} from './ui.js'\nimport {shouldDisplayColors, outputDebug} from '../../public/node/output.js'\nimport {execa, ExecaChildProcess} from 'execa'\nimport which from 'which'\nimport type {Writable, Readable} from 'stream'\n\nexport interface ExecOptions {\n cwd?: string\n env?: {[key: string]: string | undefined}\n stdin?: Readable | 'inherit'\n stdout?: Writable | 'inherit'\n stderr?: Writable | 'inherit'\n stdio?: 'inherit'\n input?: string\n signal?: AbortSignal\n // Custom handler if process exits with a non-zero code\n externalErrorHandler?: (error: unknown) => Promise<void>\n}\n\n/**\n * Opens a URL in the user's default browser.\n *\n * @param url - URL to open.\n */\nexport async function openURL(url: string): Promise<void> {\n const externalOpen = await import('open')\n await externalOpen.default(url)\n}\n\n/**\n * Runs a command asynchronously, aggregates the stdout data, and returns it.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n * @returns A promise that resolves with the aggregatted stdout of the command.\n */\nexport async function captureOutput(command: string, args: string[], options?: ExecOptions): Promise<string> {\n const result = await buildExec(command, args, options)\n return result.stdout\n}\n\n/**\n * Runs a command asynchronously.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n */\nexport async function exec(command: string, args: string[], options?: ExecOptions): Promise<void> {\n const commandProcess = buildExec(command, args, options)\n if (options?.stderr && options.stderr !== 'inherit') {\n commandProcess.stderr?.pipe(options.stderr, {end: false})\n }\n if (options?.stdout && options.stdout !== 'inherit') {\n commandProcess.stdout?.pipe(options.stdout, {end: false})\n }\n let aborted = false\n options?.signal?.addEventListener('abort', () => {\n const pid = commandProcess.pid\n if (pid) {\n outputDebug(`Killing process ${pid}: ${command} ${args.join(' ')}`)\n aborted = true\n treeKill(pid, 'SIGTERM')\n }\n })\n try {\n await commandProcess\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (processError: any) {\n // Windows will throw an error whenever the process is killed, no matter the reason.\n // The aborted flag tell use that we killed it, so we can ignore the error.\n if (aborted) return\n if (options?.externalErrorHandler) {\n await options.externalErrorHandler(processError)\n } else {\n const abortError = new ExternalError(processError.message, command, args)\n abortError.stack = processError.stack\n throw abortError\n }\n }\n}\n\n/**\n * Runs a command asynchronously.\n *\n * @param command - Command to be executed.\n * @param args - Arguments to pass to the command.\n * @param options - Optional settings for how to run the command.\n * @returns A promise for a result with stdout and stderr properties.\n */\nfunction buildExec(command: string, args: string[], options?: ExecOptions): ExecaChildProcess {\n const env = options?.env ?? process.env\n if (shouldDisplayColors()) {\n env.FORCE_COLOR = '1'\n }\n checkCommandSafety(command)\n const commandProcess = execa(command, args, {\n env,\n cwd: options?.cwd,\n input: options?.input,\n stdio: options?.stdio,\n stdin: options?.stdin,\n stdout: options?.stdout === 'inherit' ? 'inherit' : undefined,\n stderr: options?.stderr === 'inherit' ? 'inherit' : undefined,\n // Setting this to false makes it possible to kill the main process\n // and all its sub-processes with Ctrl+C on Windows\n windowsHide: false,\n })\n outputDebug(`\nRunning system process:\n · Command: ${command} ${args.join(' ')}\n · Working directory: ${options?.cwd ?? cwd()}\n`)\n return commandProcess\n}\n\nfunction checkCommandSafety(command: string) {\n const commandDirectory = dirname(which.sync(command))\n if (commandDirectory === cwd()) {\n const headline = ['Skipped run of unsecure binary', {command}, 'found in the current directory.']\n const body = 'Please remove that file or review your current PATH.'\n renderWarning({headline, body})\n throw new AbortError(headline, body)\n }\n}\n\n/**\n * Waits for a given number of seconds.\n *\n * @param seconds - Number of seconds to wait.\n * @returns A Promise resolving after the number of seconds.\n */\nexport async function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, 1000 * seconds)\n })\n}\n\n/**\n * Check if the standard input and output streams support prompting.\n *\n * @returns True if the standard input and output streams support prompting.\n */\nexport function terminalSupportsPrompting(): boolean {\n if (isTruthy(process.env.CI)) {\n return false\n }\n return Boolean(process.stdin.isTTY && process.stdout.isTTY)\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,16 @@
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 { ThemeFilesUpsert, } from '../../../cli/api/graphql/admin/generated/theme_files_upsert.js';
10
+ import { restRequest, adminRequestDoc } from '@shopify/cli-kit/node/api/admin';
4
11
  import { AbortError } from '@shopify/cli-kit/node/error';
5
- import { buildBulkUploadResults, buildChecksum, buildTheme, buildThemeAsset, } from '@shopify/cli-kit/node/themes/factories';
12
+ import { buildTheme } from '@shopify/cli-kit/node/themes/factories';
13
+ import { Operation } from '@shopify/cli-kit/node/themes/types';
6
14
  import { outputDebug } from '@shopify/cli-kit/node/output';
7
15
  import { sleep } from '@shopify/cli-kit/node/system';
8
16
  export async function fetchTheme(id, session) {
@@ -18,19 +26,46 @@ export async function fetchThemes(session) {
18
26
  }
19
27
  export async function createTheme(params, session) {
20
28
  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);
29
+ if (!params.src) {
30
+ const minimumThemeAssets = [
31
+ { key: 'config/settings_schema.json', value: '[]' },
32
+ { key: 'layout/password.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
33
+ { key: 'layout/theme.liquid', value: '{{ content_for_header }}{{ content_for_layout }}' },
34
+ ];
35
+ await bulkUploadThemeAssets(response.json.theme.id, minimumThemeAssets, session);
36
+ }
27
37
  return buildTheme({ ...response.json.theme, createdAtRuntime: true });
28
38
  }
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);
39
+ export async function fetchThemeAssets(id, filenames, session) {
40
+ const assets = [];
41
+ let after = null;
42
+ while (true) {
43
+ // eslint-disable-next-line no-await-in-loop
44
+ const response = await adminRequestDoc(GetThemeFileBodies, session, {
45
+ id: themeGid(id),
46
+ filenames,
47
+ after,
48
+ });
49
+ if (!response.theme?.files?.nodes || !response.theme?.files?.pageInfo) {
50
+ const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ');
51
+ unexpectedGraphQLError(`Error fetching assets: ${userErrors}`);
52
+ }
53
+ const { nodes, pageInfo } = response.theme.files;
54
+ assets.push(
55
+ // eslint-disable-next-line no-await-in-loop
56
+ ...(await Promise.all(nodes.map(async (file) => {
57
+ const content = await parseThemeFileContent(file.body);
58
+ return {
59
+ key: file.filename,
60
+ checksum: file.checksumMd5,
61
+ value: content,
62
+ };
63
+ }))));
64
+ if (!pageInfo.hasNextPage) {
65
+ return assets;
66
+ }
67
+ after = pageInfo.endCursor;
68
+ }
34
69
  }
35
70
  export async function deleteThemeAsset(id, key, session) {
36
71
  const response = await request('DELETE', `/themes/${id}/assets`, session, undefined, {
@@ -39,35 +74,155 @@ export async function deleteThemeAsset(id, key, session) {
39
74
  return response.status === 200;
40
75
  }
41
76
  export async function bulkUploadThemeAssets(id, assets, session) {
42
- const response = await request('PUT', `/themes/${id}/assets/bulk`, session, { assets });
43
- if (response.status !== 207) {
44
- throw new AbortError('Upload failed, could not reach the server');
77
+ const results = [];
78
+ for (let i = 0; i < assets.length; i += 50) {
79
+ const chunk = assets.slice(i, i + 50);
80
+ const files = prepareFilesForUpload(chunk);
81
+ // eslint-disable-next-line no-await-in-loop
82
+ const uploadResults = await uploadFiles(id, files, session);
83
+ results.push(...processUploadResults(uploadResults));
45
84
  }
46
- return buildBulkUploadResults(response.json.results, assets);
85
+ return results;
47
86
  }
48
- 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 [];
87
+ function prepareFilesForUpload(assets) {
88
+ return assets.map((asset) => {
89
+ if (asset.value) {
90
+ return {
91
+ filename: asset.key,
92
+ body: {
93
+ type: 'TEXT',
94
+ value: asset.value,
95
+ },
96
+ };
97
+ }
98
+ else if (asset.attachment) {
99
+ return {
100
+ filename: asset.key,
101
+ body: {
102
+ type: 'BASE64',
103
+ value: asset.attachment,
104
+ },
105
+ };
106
+ }
107
+ else {
108
+ unexpectedGraphQLError('Asset must have a value or attachment');
109
+ }
110
+ });
54
111
  }
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);
112
+ async function uploadFiles(themeId, files, session) {
113
+ return adminRequestDoc(ThemeFilesUpsert, session, { themeId: themeGid(themeId), files });
60
114
  }
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);
115
+ function processUploadResults(uploadResults) {
116
+ const { themeFilesUpsert } = uploadResults;
117
+ if (!themeFilesUpsert) {
118
+ unexpectedGraphQLError('Failed to upload theme files');
119
+ }
120
+ const { upsertedThemeFiles, userErrors } = themeFilesUpsert;
121
+ const results = [];
122
+ upsertedThemeFiles?.forEach((file) => {
123
+ results.push({
124
+ key: file.filename,
125
+ success: true,
126
+ operation: Operation.Upload,
127
+ });
128
+ });
129
+ userErrors.forEach((error) => {
130
+ if (!error.filename) {
131
+ unexpectedGraphQLError(`Error uploading theme files: ${error.message}`);
132
+ }
133
+ results.push({
134
+ key: error.filename,
135
+ success: false,
136
+ operation: Operation.Upload,
137
+ errors: { asset: [error.message] },
138
+ });
139
+ });
140
+ return results;
64
141
  }
65
- export async function publishTheme(id, session) {
66
- return updateTheme(id, { role: 'main' }, session);
142
+ export async function fetchChecksums(id, session) {
143
+ const checksums = [];
144
+ let after = null;
145
+ while (true) {
146
+ // eslint-disable-next-line no-await-in-loop
147
+ const response = await adminRequestDoc(GetThemeFileChecksums, session, { id: themeGid(id), after });
148
+ if (!response?.theme?.files?.nodes || !response?.theme?.files?.pageInfo) {
149
+ const userErrors = response.theme?.files?.userErrors.map((error) => error.filename).join(', ');
150
+ throw new AbortError(`Failed to fetch checksums for: ${userErrors}`);
151
+ }
152
+ const { nodes, pageInfo } = response.theme.files;
153
+ checksums.push(...nodes.map((file) => ({
154
+ key: file.filename,
155
+ checksum: file.checksumMd5,
156
+ })));
157
+ if (!pageInfo.hasNextPage) {
158
+ return checksums;
159
+ }
160
+ after = pageInfo.endCursor;
161
+ }
67
162
  }
68
- export async function deleteTheme(id, session) {
69
- const response = await request('DELETE', `/themes/${id}`, session);
70
- return buildTheme(response.json.theme);
163
+ export async function themeUpdate(id, params, session) {
164
+ const name = params.name;
165
+ const input = {};
166
+ if (name) {
167
+ input.name = name;
168
+ }
169
+ const { themeUpdate } = await adminRequestDoc(ThemeUpdate, session, { id: composeThemeGid(id), input });
170
+ if (!themeUpdate) {
171
+ // An unexpected error occurred during the GraphQL request execution
172
+ unexpectedGraphQLError('Failed to update theme');
173
+ }
174
+ const { theme, userErrors } = themeUpdate;
175
+ if (userErrors.length) {
176
+ const userErrors = themeUpdate.userErrors.map((error) => error.message).join(', ');
177
+ throw new AbortError(userErrors);
178
+ }
179
+ if (!theme) {
180
+ // An unexpected error if neither theme nor userErrors are returned
181
+ unexpectedGraphQLError('Failed to update theme');
182
+ }
183
+ return buildTheme({
184
+ id: parseGid(theme.id),
185
+ name: theme.name,
186
+ role: theme.role.toLowerCase(),
187
+ });
188
+ }
189
+ export async function themePublish(id, session) {
190
+ const { themePublish } = await adminRequestDoc(ThemePublish, session, { id: composeThemeGid(id) });
191
+ if (!themePublish) {
192
+ // An unexpected error occurred during the GraphQL request execution
193
+ unexpectedGraphQLError('Failed to update theme');
194
+ }
195
+ const { theme, userErrors } = themePublish;
196
+ if (userErrors.length) {
197
+ const userErrors = themePublish.userErrors.map((error) => error.message).join(', ');
198
+ throw new AbortError(userErrors);
199
+ }
200
+ if (!theme) {
201
+ // An unexpected error if neither theme nor userErrors are returned
202
+ unexpectedGraphQLError('Failed to update theme');
203
+ }
204
+ return buildTheme({
205
+ id: parseGid(theme.id),
206
+ name: theme.name,
207
+ role: theme.role.toLowerCase(),
208
+ });
209
+ }
210
+ export async function themeDelete(id, session) {
211
+ const { themeDelete } = await adminRequestDoc(ThemeDelete, session, { id: composeThemeGid(id) });
212
+ if (!themeDelete) {
213
+ // An unexpected error occurred during the GraphQL request execution
214
+ unexpectedGraphQLError('Failed to update theme');
215
+ }
216
+ const { deletedThemeId, userErrors } = themeDelete;
217
+ if (userErrors.length) {
218
+ const userErrors = themeDelete.userErrors.map((error) => error.message).join(', ');
219
+ throw new AbortError(userErrors);
220
+ }
221
+ if (!deletedThemeId) {
222
+ // An unexpected error if neither theme nor userErrors are returned
223
+ unexpectedGraphQLError('Failed to update theme');
224
+ }
225
+ return true;
71
226
  }
72
227
  async function request(method, path, session, params, searchParams = {}, retries = 1) {
73
228
  const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams));
@@ -86,6 +241,17 @@ async function request(method, path, session, params, searchParams = {}, retries
86
241
  case status === 403:
87
242
  return handleForbiddenError(response, session);
88
243
  case status === 401:
244
+ /**
245
+ * We need to resolve the call to the refresh function at runtime to
246
+ * avoid a circular reference.
247
+ *
248
+ * This won't be necessary when https://github.com/Shopify/cli/issues/4769
249
+ * gets resolved, and this condition must be removed then.
250
+ */
251
+ if ('refresh' in session) {
252
+ const refresh = session.refresh;
253
+ await refresh();
254
+ }
89
255
  // Retry 401 errors to be resilient to authentication errors.
90
256
  return handleRetriableError({
91
257
  path,
@@ -143,6 +309,9 @@ function errorMessage(response) {
143
309
  }
144
310
  return '';
145
311
  }
312
+ function unexpectedGraphQLError(message) {
313
+ throw new AbortError(message);
314
+ }
146
315
  async function handleRetriableError({ path, retries, retry, fail }) {
147
316
  if (retries >= 3) {
148
317
  fail();
@@ -151,4 +320,24 @@ async function handleRetriableError({ path, retries, retry, fail }) {
151
320
  await sleep(0.2);
152
321
  return retry();
153
322
  }
323
+ function themeGid(id) {
324
+ return `gid://shopify/OnlineStoreTheme/${id}`;
325
+ }
326
+ async function parseThemeFileContent(body) {
327
+ switch (body.__typename) {
328
+ case 'OnlineStoreThemeFileBodyText':
329
+ return body.content;
330
+ case 'OnlineStoreThemeFileBodyBase64':
331
+ return Buffer.from(body.contentBase64, 'base64').toString();
332
+ case 'OnlineStoreThemeFileBodyUrl':
333
+ try {
334
+ const response = await fetch(body.url);
335
+ return await response.text();
336
+ }
337
+ catch (error) {
338
+ // Raise error if we can't download the file
339
+ throw new AbortError(`Error downloading content from URL: ${body.url}`);
340
+ }
341
+ }
342
+ }
154
343
  //# 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 {\n ThemeFilesUpsert,\n ThemeFilesUpsertMutation,\n} from '../../../cli/api/graphql/admin/generated/theme_files_upsert.js'\nimport {\n OnlineStoreThemeFileBodyInputType,\n OnlineStoreThemeFilesUpsertFileInput,\n} from '../../../cli/api/graphql/admin/generated/types.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 {buildTheme} from '@shopify/cli-kit/node/themes/factories'\nimport {Result, Checksum, Key, Theme, ThemeAsset, Operation} 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 unexpectedGraphQLError(`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 results: Result[] = []\n for (let i = 0; i < assets.length; i += 50) {\n const chunk = assets.slice(i, i + 50)\n const files = prepareFilesForUpload(chunk)\n // eslint-disable-next-line no-await-in-loop\n const uploadResults = await uploadFiles(id, files, session)\n results.push(...processUploadResults(uploadResults))\n }\n return results\n}\n\nfunction prepareFilesForUpload(assets: AssetParams[]): OnlineStoreThemeFilesUpsertFileInput[] {\n return assets.map((asset) => {\n if (asset.value) {\n return {\n filename: asset.key,\n body: {\n type: 'TEXT' as const,\n value: asset.value,\n },\n }\n } else if (asset.attachment) {\n return {\n filename: asset.key,\n body: {\n type: 'BASE64' as const,\n value: asset.attachment,\n },\n }\n } else {\n unexpectedGraphQLError('Asset must have a value or attachment')\n }\n })\n}\n\nasync function uploadFiles(\n themeId: number,\n files: {filename: string; body: {type: OnlineStoreThemeFileBodyInputType; value: string}}[],\n session: AdminSession,\n): Promise<ThemeFilesUpsertMutation> {\n return adminRequestDoc(ThemeFilesUpsert, session, {themeId: themeGid(themeId), files})\n}\n\nfunction processUploadResults(uploadResults: ThemeFilesUpsertMutation): Result[] {\n const {themeFilesUpsert} = uploadResults\n\n if (!themeFilesUpsert) {\n unexpectedGraphQLError('Failed to upload theme files')\n }\n\n const {upsertedThemeFiles, userErrors} = themeFilesUpsert\n\n const results: Result[] = []\n\n upsertedThemeFiles?.forEach((file) => {\n results.push({\n key: file.filename,\n success: true,\n operation: Operation.Upload,\n })\n })\n\n userErrors.forEach((error) => {\n if (!error.filename) {\n unexpectedGraphQLError(`Error uploading theme files: ${error.message}`)\n }\n results.push({\n key: error.filename,\n success: false,\n operation: Operation.Upload,\n errors: {asset: [error.message]},\n })\n })\n\n return results\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 case 'OnlineStoreThemeFileBodyBase64':\n return Buffer.from(body.contentBase64, 'base64').toString()\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"]}
@@ -1,5 +1,4 @@
1
- import { AssetParams } from './api.js';
2
- import { Result, Checksum, Theme, ThemeAsset } from '@shopify/cli-kit/node/themes/types';
1
+ import { Checksum, Theme, ThemeAsset } from '@shopify/cli-kit/node/themes/types';
3
2
  interface RemoteThemeResponse {
4
3
  id: number;
5
4
  name: string;
@@ -26,5 +25,4 @@ export declare function buildTheme(themeJson?: RemoteThemeResponse): Theme | und
26
25
  export declare function buildChecksum(asset?: RemoteAssetResponse): Checksum | undefined;
27
26
  export declare function buildThemeAsset(asset: undefined): undefined;
28
27
  export declare function buildThemeAsset(asset: RemoteAssetResponse): ThemeAsset;
29
- export declare function buildBulkUploadResults(bulkUploadResponse: RemoteBulkUploadResponse[], assets: AssetParams[]): Result[];
30
28
  export {};
@@ -1,4 +1,3 @@
1
- import { Operation } from '@shopify/cli-kit/node/themes/types';
2
1
  export function buildTheme(themeJson) {
3
2
  if (!themeJson)
4
3
  return;
@@ -27,19 +26,4 @@ export function buildThemeAsset(asset) {
27
26
  const stats = { size: (value || attachment || '').length, mtime: Date.now() };
28
27
  return { key, checksum, attachment, value, stats };
29
28
  }
30
- export function buildBulkUploadResults(bulkUploadResponse, assets) {
31
- if (!bulkUploadResponse) {
32
- return [];
33
- }
34
- return bulkUploadResponse.map((bulkUpload, index) => {
35
- return {
36
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
37
- key: assets[index].key,
38
- success: bulkUpload.code === 200,
39
- errors: bulkUpload.body.errors || {},
40
- asset: bulkUpload.body.asset,
41
- operation: Operation.Upload,
42
- };
43
- });
44
- }
45
29
  //# sourceMappingURL=factories.js.map