@shopify/cli-kit 3.69.4 → 3.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/{assets/cli-ruby/LICENSE → LICENSE} +0 -2
  2. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.d.ts +41 -0
  3. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.js +165 -0
  4. package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.js.map +1 -0
  5. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.d.ts +29 -0
  6. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.js +100 -0
  7. package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.js.map +1 -0
  8. package/dist/cli/api/graphql/admin/generated/theme_delete.d.ts +17 -0
  9. package/dist/cli/api/graphql/admin/generated/theme_delete.js +53 -0
  10. package/dist/cli/api/graphql/admin/generated/theme_delete.js.map +1 -0
  11. package/dist/cli/api/graphql/admin/generated/theme_publish.d.ts +21 -0
  12. package/dist/cli/api/graphql/admin/generated/theme_publish.js +65 -0
  13. package/dist/cli/api/graphql/admin/generated/theme_publish.js.map +1 -0
  14. package/dist/cli/api/graphql/admin/generated/theme_update.d.ts +23 -0
  15. package/dist/cli/api/graphql/admin/generated/theme_update.js +75 -0
  16. package/dist/cli/api/graphql/admin/generated/theme_update.js.map +1 -0
  17. package/dist/private/node/api/graphql.d.ts +2 -2
  18. package/dist/private/node/api/graphql.js +4 -4
  19. package/dist/private/node/api/graphql.js.map +1 -1
  20. package/dist/private/node/api/headers.js +1 -1
  21. package/dist/private/node/api/headers.js.map +1 -1
  22. package/dist/private/node/api/rest.d.ts +1 -2
  23. package/dist/private/node/api/rest.js +2 -3
  24. package/dist/private/node/api/rest.js.map +1 -1
  25. package/dist/private/node/api.js +12 -1
  26. package/dist/private/node/api.js.map +1 -1
  27. package/dist/private/node/conf-store.d.ts +9 -4
  28. package/dist/private/node/conf-store.js +8 -6
  29. package/dist/private/node/conf-store.js.map +1 -1
  30. package/dist/private/node/constants.d.ts +1 -0
  31. package/dist/private/node/constants.js +1 -0
  32. package/dist/private/node/constants.js.map +1 -1
  33. package/dist/private/node/session/schema.d.ts +40 -40
  34. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +1 -0
  35. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -2
  36. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  37. package/dist/public/common/version.d.ts +1 -1
  38. package/dist/public/common/version.js +1 -1
  39. package/dist/public/common/version.js.map +1 -1
  40. package/dist/public/node/analytics.js +1 -2
  41. package/dist/public/node/analytics.js.map +1 -1
  42. package/dist/public/node/api/admin.d.ts +2 -1
  43. package/dist/public/node/api/admin.js +25 -9
  44. package/dist/public/node/api/admin.js.map +1 -1
  45. package/dist/public/node/api/graphql.js +1 -1
  46. package/dist/public/node/api/graphql.js.map +1 -1
  47. package/dist/public/node/base-command.js +4 -0
  48. package/dist/public/node/base-command.js.map +1 -1
  49. package/dist/public/node/cli.d.ts +4 -0
  50. package/dist/public/node/cli.js +7 -1
  51. package/dist/public/node/cli.js.map +1 -1
  52. package/dist/public/node/context/local.js +7 -0
  53. package/dist/public/node/context/local.js.map +1 -1
  54. package/dist/public/node/error-handler.js +1 -1
  55. package/dist/public/node/error-handler.js.map +1 -1
  56. package/dist/public/node/error.js +4 -13
  57. package/dist/public/node/error.js.map +1 -1
  58. package/dist/public/node/global-context.d.ts +15 -0
  59. package/dist/public/node/global-context.js +29 -0
  60. package/dist/public/node/global-context.js.map +1 -0
  61. package/dist/public/node/is-global.js +2 -1
  62. package/dist/public/node/is-global.js.map +1 -1
  63. package/dist/public/node/node-package-manager.js +1 -1
  64. package/dist/public/node/node-package-manager.js.map +1 -1
  65. package/dist/public/node/notifications-system.d.ts +191 -0
  66. package/dist/public/node/notifications-system.js +234 -0
  67. package/dist/public/node/notifications-system.js.map +1 -0
  68. package/dist/public/node/themes/api.d.ts +4 -12
  69. package/dist/public/node/themes/api.js +162 -32
  70. package/dist/public/node/themes/api.js.map +1 -1
  71. package/dist/public/node/themes/types.d.ts +1 -0
  72. package/dist/public/node/themes/types.js.map +1 -1
  73. package/dist/public/node/themes/utils.d.ts +2 -0
  74. package/dist/public/node/themes/utils.js +11 -0
  75. package/dist/public/node/themes/utils.js.map +1 -1
  76. package/dist/public/node/version.d.ts +13 -0
  77. package/dist/public/node/version.js +38 -0
  78. package/dist/public/node/version.js.map +1 -0
  79. package/dist/tsconfig.tsbuildinfo +1 -1
  80. package/package.json +4 -5
  81. package/assets/cli-ruby/.devcontainer.json +0 -5
  82. package/assets/cli-ruby/.rubocop.yml +0 -102
  83. package/assets/cli-ruby/.rubocop_todo.yml +0 -24
  84. package/assets/cli-ruby/CHANGELOG.md +0 -634
  85. package/assets/cli-ruby/CONTRIBUTING.md +0 -3
  86. package/assets/cli-ruby/Codespace.dockerfile +0 -35
  87. package/assets/cli-ruby/Gemfile +0 -32
  88. package/assets/cli-ruby/README.md +0 -30
  89. package/assets/cli-ruby/Rakefile +0 -167
  90. package/assets/cli-ruby/SECURITY.md +0 -59
  91. package/assets/cli-ruby/Tests.dockerfile +0 -35
  92. package/assets/cli-ruby/assets/logo.png +0 -0
  93. package/assets/cli-ruby/bin/console +0 -11
  94. package/assets/cli-ruby/bin/load_shopify.rb +0 -22
  95. package/assets/cli-ruby/bin/shopify +0 -67
  96. package/assets/cli-ruby/bin/shopify.bat +0 -3
  97. package/assets/cli-ruby/dev.yml +0 -29
  98. package/assets/cli-ruby/docs/README.md +0 -13
  99. package/assets/cli-ruby/docs/contributors/testing.md +0 -27
  100. package/assets/cli-ruby/docs/users/installation.md +0 -3
  101. package/assets/cli-ruby/docs/users/migrate-from-themekit.md +0 -18
  102. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256 +0 -1
  103. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256 +0 -1
  104. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256 +0 -1
  105. package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +0 -1
  106. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256 +0 -1
  107. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256 +0 -1
  108. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256 +0 -1
  109. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +0 -1
  110. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256 +0 -1
  111. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256 +0 -1
  112. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256 +0 -1
  113. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +0 -1
  114. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256 +0 -1
  115. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256 +0 -1
  116. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256 +0 -1
  117. package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +0 -1
  118. package/assets/cli-ruby/ext/javy/javy.rb +0 -204
  119. package/assets/cli-ruby/ext/javy/version +0 -1
  120. package/assets/cli-ruby/ext/shopify-extensions/extconf.rb +0 -21
  121. package/assets/cli-ruby/ext/shopify-extensions/shopify_extensions.rb +0 -152
  122. package/assets/cli-ruby/ext/shopify-extensions/version +0 -1
  123. package/assets/cli-ruby/features/support/assertions.rb +0 -17
  124. package/assets/cli-ruby/features/support/cli.rb +0 -7
  125. package/assets/cli-ruby/features/support/process.rb +0 -27
  126. package/assets/cli-ruby/features/support/requires.rb +0 -3
  127. package/assets/cli-ruby/lib/docgen/class_template.md.erb +0 -81
  128. package/assets/cli-ruby/lib/docgen/index_template.md.erb +0 -5
  129. package/assets/cli-ruby/lib/docgen/markdown.rb +0 -101
  130. package/assets/cli-ruby/lib/graphql/admin_introspection.graphql +0 -87
  131. package/assets/cli-ruby/lib/graphql/all_organizations.graphql +0 -19
  132. package/assets/cli-ruby/lib/graphql/all_orgs_with_apps.graphql +0 -30
  133. package/assets/cli-ruby/lib/graphql/api_versions.graphql +0 -6
  134. package/assets/cli-ruby/lib/graphql/convert_dev_to_test_store.graphql +0 -10
  135. package/assets/cli-ruby/lib/graphql/create_app.graphql +0 -20
  136. package/assets/cli-ruby/lib/graphql/create_customer.graphql +0 -9
  137. package/assets/cli-ruby/lib/graphql/create_draft_order.graphql +0 -8
  138. package/assets/cli-ruby/lib/graphql/create_product.graphql +0 -9
  139. package/assets/cli-ruby/lib/graphql/extension_create.graphql +0 -37
  140. package/assets/cli-ruby/lib/graphql/extension_update_draft.graphql +0 -19
  141. package/assets/cli-ruby/lib/graphql/fetch_specifications.graphql +0 -14
  142. package/assets/cli-ruby/lib/graphql/find_organization.graphql +0 -18
  143. package/assets/cli-ruby/lib/graphql/find_organization_with_apps.graphql +0 -20
  144. package/assets/cli-ruby/lib/graphql/get_app_by_api_key.graphql +0 -9
  145. package/assets/cli-ruby/lib/graphql/get_app_urls.graphql +0 -6
  146. package/assets/cli-ruby/lib/graphql/get_extension_registrations.graphql +0 -28
  147. package/assets/cli-ruby/lib/graphql/get_variant_id.graphql +0 -16
  148. package/assets/cli-ruby/lib/graphql/update_dashboard_urls.graphql +0 -8
  149. package/assets/cli-ruby/lib/project_types/extension/cli.rb +0 -75
  150. package/assets/cli-ruby/lib/project_types/extension/commands/extension_command.rb +0 -29
  151. package/assets/cli-ruby/lib/project_types/extension/commands/serve.rb +0 -164
  152. package/assets/cli-ruby/lib/project_types/extension/errors.rb +0 -9
  153. package/assets/cli-ruby/lib/project_types/extension/extension_project.rb +0 -151
  154. package/assets/cli-ruby/lib/project_types/extension/extension_project_keys.rb +0 -12
  155. package/assets/cli-ruby/lib/project_types/extension/features/argo.rb +0 -50
  156. package/assets/cli-ruby/lib/project_types/extension/features/argo_config.rb +0 -59
  157. package/assets/cli-ruby/lib/project_types/extension/features/argo_dependencies.rb +0 -28
  158. package/assets/cli-ruby/lib/project_types/extension/features/argo_runtime.rb +0 -15
  159. package/assets/cli-ruby/lib/project_types/extension/features/argo_serve.rb +0 -115
  160. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup.rb +0 -54
  161. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_step.rb +0 -31
  162. package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_steps.rb +0 -51
  163. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/admin.rb +0 -29
  164. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/base.rb +0 -19
  165. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +0 -23
  166. package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +0 -29
  167. package/assets/cli-ruby/lib/project_types/extension/loaders/project.rb +0 -50
  168. package/assets/cli-ruby/lib/project_types/extension/loaders/specification_handler.rb +0 -22
  169. package/assets/cli-ruby/lib/project_types/extension/messages/message_loading.rb +0 -34
  170. package/assets/cli-ruby/lib/project_types/extension/messages/messages.rb +0 -320
  171. package/assets/cli-ruby/lib/project_types/extension/models/app.rb +0 -14
  172. package/assets/cli-ruby/lib/project_types/extension/models/lazy_specification_handler.rb +0 -12
  173. package/assets/cli-ruby/lib/project_types/extension/models/specification.rb +0 -41
  174. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/default.rb +0 -145
  175. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +0 -134
  176. package/assets/cli-ruby/lib/project_types/extension/models/specifications.rb +0 -91
  177. package/assets/cli-ruby/lib/project_types/extension/models/validation_error.rb +0 -17
  178. package/assets/cli-ruby/lib/project_types/extension/models/version.rb +0 -15
  179. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_features.rb +0 -73
  180. package/assets/cli-ruby/lib/project_types/extension/tasks/configure_options.rb +0 -21
  181. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/validation_error_converter.rb +0 -25
  182. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/version_converter.rb +0 -28
  183. package/assets/cli-ruby/lib/project_types/extension/tasks/fetch_specifications.rb +0 -21
  184. package/assets/cli-ruby/lib/project_types/node/cli.rb +0 -12
  185. package/assets/cli-ruby/lib/project_types/node/forms/create.rb +0 -45
  186. package/assets/cli-ruby/lib/project_types/node/messages/messages.rb +0 -33
  187. package/assets/cli-ruby/lib/project_types/php/cli.rb +0 -16
  188. package/assets/cli-ruby/lib/project_types/php/forms/create.rb +0 -44
  189. package/assets/cli-ruby/lib/project_types/php/messages/messages.rb +0 -29
  190. package/assets/cli-ruby/lib/project_types/rails/cli.rb +0 -15
  191. package/assets/cli-ruby/lib/project_types/rails/forms/create.rb +0 -75
  192. package/assets/cli-ruby/lib/project_types/rails/gem.rb +0 -110
  193. package/assets/cli-ruby/lib/project_types/rails/messages/messages.rb +0 -101
  194. package/assets/cli-ruby/lib/project_types/script/cli.rb +0 -27
  195. package/assets/cli-ruby/lib/project_types/script/commands/connect.rb +0 -16
  196. package/assets/cli-ruby/lib/project_types/script/commands/create.rb +0 -24
  197. package/assets/cli-ruby/lib/project_types/script/commands/javy.rb +0 -24
  198. package/assets/cli-ruby/lib/project_types/script/commands/push.rb +0 -26
  199. package/assets/cli-ruby/lib/project_types/script/loaders/project.rb +0 -46
  200. package/assets/cli-ruby/lib/project_types/script/loaders/specification_handler.rb +0 -22
  201. package/assets/cli-ruby/lib/project_types/script/messages/messages.rb +0 -11
  202. package/assets/cli-ruby/lib/project_types/theme/cli.rb +0 -33
  203. package/assets/cli-ruby/lib/project_types/theme/commands/common/root_helper.rb +0 -94
  204. package/assets/cli-ruby/lib/project_types/theme/commands/common/shop_helper.rb +0 -13
  205. package/assets/cli-ruby/lib/project_types/theme/commands/console.rb +0 -23
  206. package/assets/cli-ruby/lib/project_types/theme/commands/delete.rb +0 -70
  207. package/assets/cli-ruby/lib/project_types/theme/commands/init.rb +0 -46
  208. package/assets/cli-ruby/lib/project_types/theme/commands/list.rb +0 -33
  209. package/assets/cli-ruby/lib/project_types/theme/commands/open.rb +0 -73
  210. package/assets/cli-ruby/lib/project_types/theme/commands/package.rb +0 -73
  211. package/assets/cli-ruby/lib/project_types/theme/commands/publish.rb +0 -49
  212. package/assets/cli-ruby/lib/project_types/theme/commands/pull.rb +0 -118
  213. package/assets/cli-ruby/lib/project_types/theme/commands/push.rb +0 -160
  214. package/assets/cli-ruby/lib/project_types/theme/commands/serve.rb +0 -91
  215. package/assets/cli-ruby/lib/project_types/theme/commands/share.rb +0 -62
  216. package/assets/cli-ruby/lib/project_types/theme/commands/token.rb +0 -22
  217. package/assets/cli-ruby/lib/project_types/theme/conversions/base_glob.rb +0 -65
  218. package/assets/cli-ruby/lib/project_types/theme/conversions/ignore_glob.rb +0 -15
  219. package/assets/cli-ruby/lib/project_types/theme/conversions/include_glob.rb +0 -15
  220. package/assets/cli-ruby/lib/project_types/theme/forms/confirm_store.rb +0 -15
  221. package/assets/cli-ruby/lib/project_types/theme/forms/select.rb +0 -34
  222. package/assets/cli-ruby/lib/project_types/theme/messages/messages.rb +0 -429
  223. package/assets/cli-ruby/lib/project_types/theme/models/specification_handlers/theme.rb +0 -19
  224. package/assets/cli-ruby/lib/project_types/theme/presenters/theme_presenter.rb +0 -48
  225. package/assets/cli-ruby/lib/project_types/theme/presenters/themes_presenter.rb +0 -29
  226. package/assets/cli-ruby/lib/project_types/theme/ui/sync_progress_bar.rb +0 -20
  227. package/assets/cli-ruby/lib/rubygems_plugin.rb +0 -26
  228. package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +0 -160
  229. package/assets/cli-ruby/lib/shopify_cli/api.rb +0 -130
  230. package/assets/cli-ruby/lib/shopify_cli/command/project_command.rb +0 -31
  231. package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +0 -20
  232. package/assets/cli-ruby/lib/shopify_cli/command.rb +0 -166
  233. package/assets/cli-ruby/lib/shopify_cli/commands.rb +0 -21
  234. package/assets/cli-ruby/lib/shopify_cli/constants.rb +0 -101
  235. package/assets/cli-ruby/lib/shopify_cli/context.rb +0 -709
  236. package/assets/cli-ruby/lib/shopify_cli/core/cli_version.rb +0 -20
  237. package/assets/cli-ruby/lib/shopify_cli/core/entry_point.rb +0 -64
  238. package/assets/cli-ruby/lib/shopify_cli/core/executor.rb +0 -23
  239. package/assets/cli-ruby/lib/shopify_cli/core/finalize.rb +0 -13
  240. package/assets/cli-ruby/lib/shopify_cli/core/monorail.rb +0 -122
  241. package/assets/cli-ruby/lib/shopify_cli/core.rb +0 -8
  242. package/assets/cli-ruby/lib/shopify_cli/db.rb +0 -114
  243. package/assets/cli-ruby/lib/shopify_cli/environment.rb +0 -217
  244. package/assets/cli-ruby/lib/shopify_cli/exception_reporter.rb +0 -80
  245. package/assets/cli-ruby/lib/shopify_cli/feature.rb +0 -95
  246. package/assets/cli-ruby/lib/shopify_cli/file_system_listener.rb +0 -30
  247. package/assets/cli-ruby/lib/shopify_cli/form.rb +0 -42
  248. package/assets/cli-ruby/lib/shopify_cli/git.rb +0 -320
  249. package/assets/cli-ruby/lib/shopify_cli/github/issue_url_generator.rb +0 -30
  250. package/assets/cli-ruby/lib/shopify_cli/github.rb +0 -5
  251. package/assets/cli-ruby/lib/shopify_cli/helpers/haikunator.rb +0 -92
  252. package/assets/cli-ruby/lib/shopify_cli/helpers.rb +0 -5
  253. package/assets/cli-ruby/lib/shopify_cli/http_request.rb +0 -43
  254. package/assets/cli-ruby/lib/shopify_cli/identity_auth/env_auth_token.rb +0 -34
  255. package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +0 -332
  256. package/assets/cli-ruby/lib/shopify_cli/js_system.rb +0 -115
  257. package/assets/cli-ruby/lib/shopify_cli/lazy_delegator.rb +0 -55
  258. package/assets/cli-ruby/lib/shopify_cli/messages/messages.rb +0 -863
  259. package/assets/cli-ruby/lib/shopify_cli/method_object.rb +0 -123
  260. package/assets/cli-ruby/lib/shopify_cli/migrator/migration.rb +0 -27
  261. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +0 -13
  262. package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +0 -41
  263. package/assets/cli-ruby/lib/shopify_cli/migrator.rb +0 -46
  264. package/assets/cli-ruby/lib/shopify_cli/options.rb +0 -40
  265. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions/job.rb +0 -36
  266. package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions.rb +0 -46
  267. package/assets/cli-ruby/lib/shopify_cli/partners_api/organizations.rb +0 -45
  268. package/assets/cli-ruby/lib/shopify_cli/partners_api.rb +0 -91
  269. package/assets/cli-ruby/lib/shopify_cli/project.rb +0 -199
  270. package/assets/cli-ruby/lib/shopify_cli/project_type.rb +0 -66
  271. package/assets/cli-ruby/lib/shopify_cli/reporting_configuration_controller.rb +0 -29
  272. package/assets/cli-ruby/lib/shopify_cli/resolve_constant.rb +0 -25
  273. package/assets/cli-ruby/lib/shopify_cli/resources/env_file.rb +0 -108
  274. package/assets/cli-ruby/lib/shopify_cli/resources.rb +0 -5
  275. package/assets/cli-ruby/lib/shopify_cli/result.rb +0 -448
  276. package/assets/cli-ruby/lib/shopify_cli/shopifolk.rb +0 -82
  277. package/assets/cli-ruby/lib/shopify_cli/task.rb +0 -20
  278. package/assets/cli-ruby/lib/shopify_cli/tasks/confirm_store.rb +0 -18
  279. package/assets/cli-ruby/lib/shopify_cli/tasks/create_api_client.rb +0 -40
  280. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_authenticated.rb +0 -19
  281. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_dev_store.rb +0 -41
  282. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_env.rb +0 -90
  283. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_git_dependency.rb +0 -14
  284. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_loopback_url.rb +0 -20
  285. package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_project_type.rb +0 -14
  286. package/assets/cli-ruby/lib/shopify_cli/tasks/select_org_and_shop.rb +0 -81
  287. package/assets/cli-ruby/lib/shopify_cli/tasks/update_dashboard_urls.rb +0 -57
  288. package/assets/cli-ruby/lib/shopify_cli/tasks.rb +0 -44
  289. package/assets/cli-ruby/lib/shopify_cli/theme/backoff_helper.rb +0 -47
  290. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +0 -82
  291. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/certificate_manager.rb +0 -79
  292. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/errors.rb +0 -9
  293. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/header_hash.rb +0 -98
  294. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hooks/file_change_hook.rb +0 -77
  295. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb +0 -62
  296. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +0 -63
  297. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +0 -27
  298. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot_reload.js +0 -48
  299. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/sse_client.js +0 -43
  300. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme.js +0 -114
  301. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme_extension.js +0 -121
  302. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/script_injector.rb +0 -57
  303. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb +0 -50
  304. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload.rb +0 -75
  305. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/local_assets.rb +0 -101
  306. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +0 -313
  307. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy_param_builder.rb +0 -84
  308. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/reload_mode.rb +0 -34
  309. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +0 -35
  310. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher.rb +0 -44
  311. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/sse.rb +0 -75
  312. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/watcher.rb +0 -64
  313. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/web_server.rb +0 -140
  314. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server.rb +0 -332
  315. package/assets/cli-ruby/lib/shopify_cli/theme/development_theme.rb +0 -101
  316. package/assets/cli-ruby/lib/shopify_cli/theme/extension/app_extension.rb +0 -40
  317. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hooks/file_change_hook.rb +0 -76
  318. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload/script_injector.rb +0 -30
  319. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload.rb +0 -13
  320. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/local_assets.rb +0 -31
  321. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/proxy_param_builder.rb +0 -94
  322. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/watcher.rb +0 -49
  323. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server.rb +0 -175
  324. package/assets/cli-ruby/lib/shopify_cli/theme/extension/host_theme.rb +0 -109
  325. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ignore_helper.rb +0 -35
  326. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/extension_serve_job.rb +0 -120
  327. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/operation.rb +0 -25
  328. package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer.rb +0 -100
  329. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_progress_bar.rb +0 -35
  330. package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_raw_progress_bar.rb +0 -40
  331. package/assets/cli-ruby/lib/shopify_cli/theme/file.rb +0 -133
  332. package/assets/cli-ruby/lib/shopify_cli/theme/filter/path_matcher.rb +0 -38
  333. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_filter.rb +0 -112
  334. package/assets/cli-ruby/lib/shopify_cli/theme/ignore_helper.rb +0 -37
  335. package/assets/cli-ruby/lib/shopify_cli/theme/include_filter.rb +0 -67
  336. package/assets/cli-ruby/lib/shopify_cli/theme/mime_type.rb +0 -34
  337. package/assets/cli-ruby/lib/shopify_cli/theme/notifier.rb +0 -52
  338. package/assets/cli-ruby/lib/shopify_cli/theme/repl/api.rb +0 -109
  339. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_dev_server.rb +0 -93
  340. package/assets/cli-ruby/lib/shopify_cli/theme/repl/auth_middleware.rb +0 -97
  341. package/assets/cli-ruby/lib/shopify_cli/theme/repl/remote_evaluator.rb +0 -166
  342. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/success.html +0 -78
  343. package/assets/cli-ruby/lib/shopify_cli/theme/repl/resources/template.liquid +0 -15
  344. package/assets/cli-ruby/lib/shopify_cli/theme/repl/snippet.rb +0 -81
  345. package/assets/cli-ruby/lib/shopify_cli/theme/repl.rb +0 -88
  346. package/assets/cli-ruby/lib/shopify_cli/theme/root.rb +0 -62
  347. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/checksums.rb +0 -66
  348. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/downloader.rb +0 -63
  349. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/error_reporter.rb +0 -45
  350. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/merger.rb +0 -53
  351. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/operation.rb +0 -49
  352. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/standard_reporter.rb +0 -32
  353. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/unsupported_script_warning.rb +0 -90
  354. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk.rb +0 -133
  355. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_item.rb +0 -64
  356. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_job.rb +0 -139
  357. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_request.rb +0 -30
  358. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all.rb +0 -41
  359. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +0 -37
  360. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/base_strategy_form.rb +0 -64
  361. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +0 -29
  362. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_update_strategy.rb +0 -30
  363. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_delete_handler.rb +0 -49
  364. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_update_handler.rb +0 -71
  365. package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader.rb +0 -231
  366. package/assets/cli-ruby/lib/shopify_cli/theme/syncer.rb +0 -391
  367. package/assets/cli-ruby/lib/shopify_cli/theme/theme.rb +0 -212
  368. package/assets/cli-ruby/lib/shopify_cli/theme/theme_access_api.rb +0 -89
  369. package/assets/cli-ruby/lib/shopify_cli/theme/theme_admin_api.rb +0 -101
  370. package/assets/cli-ruby/lib/shopify_cli/thread_pool/job.rb +0 -35
  371. package/assets/cli-ruby/lib/shopify_cli/thread_pool.rb +0 -49
  372. package/assets/cli-ruby/lib/shopify_cli/transform_data_structure.rb +0 -87
  373. package/assets/cli-ruby/lib/shopify_cli/utilities.rb +0 -21
  374. package/assets/cli-ruby/lib/shopify_cli/version.rb +0 -3
  375. package/assets/cli-ruby/lib/shopify_cli.rb +0 -182
  376. package/assets/cli-ruby/shipit.rubygems.yml +0 -3
  377. package/assets/cli-ruby/shopify-cli.gemspec +0 -46
  378. package/assets/cli-ruby/shopify-dev +0 -16
  379. package/assets/cli-ruby/test/minitest_ext.rb +0 -115
  380. package/assets/cli-ruby/test/project_types/extension/extension_test_helpers.rb +0 -70
  381. package/assets/cli-ruby/test/shopify-cli/migrator/migrations/migration_helper.rb +0 -20
  382. package/assets/cli-ruby/test/test_helpers.rb +0 -16
  383. package/assets/cli-ruby/utilities/constants.rb +0 -7
  384. package/assets/cli-ruby/utilities/docker/container.rb +0 -104
  385. package/assets/cli-ruby/utilities/docker.rb +0 -89
  386. package/assets/cli-ruby/utilities/utilities.rb +0 -6
  387. package/assets/cli-ruby/vendor/deps/cli-kit/REVISION +0 -1
  388. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +0 -21
  389. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +0 -49
  390. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +0 -94
  391. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/config.rb +0 -133
  392. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +0 -123
  393. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/executor.rb +0 -79
  394. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ini.rb +0 -102
  395. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +0 -82
  396. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/logger.rb +0 -82
  397. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +0 -60
  398. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ruby_backports/enumerable.rb +0 -6
  399. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +0 -244
  400. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support.rb +0 -9
  401. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/system.rb +0 -243
  402. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/util.rb +0 -193
  403. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/version.rb +0 -5
  404. package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit.rb +0 -60
  405. package/assets/cli-ruby/vendor/deps/cli-ui/REVISION +0 -1
  406. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +0 -157
  407. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/color.rb +0 -84
  408. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +0 -193
  409. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +0 -98
  410. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +0 -166
  411. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +0 -139
  412. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +0 -120
  413. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame.rb +0 -269
  414. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +0 -84
  415. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/os.rb +0 -73
  416. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/printer.rb +0 -59
  417. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress.rb +0 -90
  418. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress_plain.rb +0 -50
  419. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +0 -484
  420. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +0 -29
  421. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +0 -282
  422. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +0 -40
  423. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +0 -263
  424. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +0 -66
  425. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +0 -232
  426. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +0 -46
  427. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +0 -102
  428. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/version.rb +0 -5
  429. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +0 -27
  430. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +0 -61
  431. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +0 -77
  432. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +0 -56
  433. package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui.rb +0 -234
  434. package/assets/cli-ruby/vendor/deps/ruby2_keywords/LICENSE +0 -22
  435. package/assets/cli-ruby/vendor/deps/ruby2_keywords/README.md +0 -67
  436. package/assets/cli-ruby/vendor/deps/ruby2_keywords/Rakefile +0 -54
  437. package/assets/cli-ruby/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +0 -57
  438. package/assets/cli-ruby/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +0 -18
  439. package/assets/cli-ruby/vendor/deps/ruby2_keywords/test/test_keyword.rb +0 -41
  440. package/assets/cli-ruby/vendor/deps/smart_properties/REVISION +0 -1
  441. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/errors.rb +0 -114
  442. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property.rb +0 -168
  443. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property_collection.rb +0 -83
  444. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations/ancestor.rb +0 -27
  445. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations.rb +0 -8
  446. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/version.rb +0 -3
  447. package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties.rb +0 -174
  448. package/assets/cli-ruby/vendor/deps/webrick/Gemfile +0 -3
  449. package/assets/cli-ruby/vendor/deps/webrick/LICENSE.txt +0 -22
  450. package/assets/cli-ruby/vendor/deps/webrick/README.md +0 -61
  451. package/assets/cli-ruby/vendor/deps/webrick/Rakefile +0 -10
  452. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/accesslog.rb +0 -157
  453. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cgi.rb +0 -313
  454. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/compat.rb +0 -36
  455. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/config.rb +0 -158
  456. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cookie.rb +0 -172
  457. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/htmlutils.rb +0 -30
  458. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +0 -117
  459. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +0 -116
  460. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +0 -395
  461. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +0 -132
  462. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +0 -97
  463. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +0 -158
  464. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +0 -53
  465. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth.rb +0 -96
  466. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpproxy.rb +0 -354
  467. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httprequest.rb +0 -636
  468. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpresponse.rb +0 -564
  469. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/https.rb +0 -152
  470. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpserver.rb +0 -294
  471. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +0 -152
  472. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +0 -47
  473. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +0 -126
  474. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +0 -88
  475. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +0 -552
  476. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +0 -47
  477. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet.rb +0 -23
  478. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpstatus.rb +0 -194
  479. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httputils.rb +0 -512
  480. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpversion.rb +0 -76
  481. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/log.rb +0 -156
  482. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/server.rb +0 -381
  483. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/ssl.rb +0 -215
  484. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/utils.rb +0 -265
  485. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/version.rb +0 -18
  486. package/assets/cli-ruby/vendor/deps/webrick/lib/webrick.rb +0 -232
  487. package/assets/cli-ruby/vendor/deps/webrick/webrick.gemspec +0 -74
  488. package/assets/cli-ruby/vendor/gen/lib/gen/commands/help.rb +0 -20
  489. package/assets/cli-ruby/vendor/gen/lib/gen/commands/new.rb +0 -21
  490. package/assets/cli-ruby/vendor/gen/lib/gen/commands.rb +0 -18
  491. package/assets/cli-ruby/vendor/gen/lib/gen/entry_point.rb +0 -10
  492. package/assets/cli-ruby/vendor/gen/lib/gen/generator.rb +0 -165
  493. package/assets/cli-ruby/vendor/gen/lib/gen.rb +0 -39
  494. package/assets/cli-ruby/vendor/gen/template/Gemfile +0 -10
  495. package/assets/cli-ruby/vendor/gen/template/README.md +0 -1
  496. package/assets/cli-ruby/vendor/gen/template/bin/testunit +0 -23
  497. package/assets/cli-ruby/vendor/gen/template/bin/update-deps +0 -97
  498. package/assets/cli-ruby/vendor/gen/template/dev-gems.yml +0 -3
  499. package/assets/cli-ruby/vendor/gen/template/dev-vendor.yml +0 -4
  500. package/assets/cli-ruby/vendor/gen/template/exe/__app__-gems +0 -17
  501. package/assets/cli-ruby/vendor/gen/template/exe/__app__-vendor +0 -18
  502. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/example.rb +0 -19
  503. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/help.rb +0 -21
  504. package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands.rb +0 -18
  505. package/assets/cli-ruby/vendor/gen/template/lib/__app__/entry_point.rb +0 -10
  506. package/assets/cli-ruby/vendor/gen/template/lib/__app__.rb +0 -33
  507. package/assets/cli-ruby/vendor/gen/template/test/example_test.rb +0 -17
  508. package/assets/cli-ruby/vendor/gen/template/test/test_helper.rb +0 -22
  509. package/assets/cli-ruby/vendor/lib/semantic/LICENSE +0 -20
  510. package/assets/cli-ruby/vendor/lib/semantic/semantic.rb +0 -4
  511. package/assets/cli-ruby/vendor/lib/semantic/version.rb +0 -179
  512. package/dist/public/node/ruby.d.ts +0 -38
  513. package/dist/public/node/ruby.js +0 -327
  514. package/dist/public/node/ruby.js.map +0 -1
@@ -9,14 +9,14 @@ declare const IdentityTokenSchema: zod.ZodObject<{
9
9
  scopes: zod.ZodArray<zod.ZodString, "many">;
10
10
  userId: zod.ZodString;
11
11
  }, "strip", zod.ZodTypeAny, {
12
- accessToken: string;
13
12
  scopes: string[];
13
+ accessToken: string;
14
14
  refreshToken: string;
15
15
  expiresAt: Date;
16
16
  userId: string;
17
17
  }, {
18
- accessToken: string;
19
18
  scopes: string[];
19
+ accessToken: string;
20
20
  refreshToken: string;
21
21
  userId: string;
22
22
  expiresAt?: unknown;
@@ -29,12 +29,12 @@ declare const ApplicationTokenSchema: zod.ZodObject<{
29
29
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
30
30
  scopes: zod.ZodArray<zod.ZodString, "many">;
31
31
  }, "strip", zod.ZodTypeAny, {
32
- accessToken: string;
33
32
  scopes: string[];
33
+ accessToken: string;
34
34
  expiresAt: Date;
35
35
  }, {
36
- accessToken: string;
37
36
  scopes: string[];
37
+ accessToken: string;
38
38
  expiresAt?: unknown;
39
39
  }>;
40
40
  /**
@@ -73,14 +73,14 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
73
73
  scopes: zod.ZodArray<zod.ZodString, "many">;
74
74
  userId: zod.ZodString;
75
75
  }, "strip", zod.ZodTypeAny, {
76
- accessToken: string;
77
76
  scopes: string[];
77
+ accessToken: string;
78
78
  refreshToken: string;
79
79
  expiresAt: Date;
80
80
  userId: string;
81
81
  }, {
82
- accessToken: string;
83
82
  scopes: string[];
83
+ accessToken: string;
84
84
  refreshToken: string;
85
85
  userId: string;
86
86
  expiresAt?: unknown;
@@ -94,65 +94,65 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
94
94
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
95
95
  scopes: zod.ZodArray<zod.ZodString, "many">;
96
96
  }, "strip", zod.ZodTypeAny, {
97
- accessToken: string;
98
97
  scopes: string[];
98
+ accessToken: string;
99
99
  expiresAt: Date;
100
100
  }, {
101
- accessToken: string;
102
101
  scopes: string[];
102
+ accessToken: string;
103
103
  expiresAt?: unknown;
104
104
  }>, zod.objectOutputType<{}, zod.ZodObject<{
105
105
  accessToken: zod.ZodString;
106
106
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
107
107
  scopes: zod.ZodArray<zod.ZodString, "many">;
108
108
  }, "strip", zod.ZodTypeAny, {
109
- accessToken: string;
110
109
  scopes: string[];
110
+ accessToken: string;
111
111
  expiresAt: Date;
112
112
  }, {
113
- accessToken: string;
114
113
  scopes: string[];
114
+ accessToken: string;
115
115
  expiresAt?: unknown;
116
116
  }>, "strip">, zod.objectInputType<{}, zod.ZodObject<{
117
117
  accessToken: zod.ZodString;
118
118
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
119
119
  scopes: zod.ZodArray<zod.ZodString, "many">;
120
120
  }, "strip", zod.ZodTypeAny, {
121
- accessToken: string;
122
121
  scopes: string[];
122
+ accessToken: string;
123
123
  expiresAt: Date;
124
124
  }, {
125
- accessToken: string;
126
125
  scopes: string[];
126
+ accessToken: string;
127
127
  expiresAt?: unknown;
128
128
  }>, "strip">>;
129
129
  }, "strip", zod.ZodTypeAny, {
130
130
  identity: {
131
- accessToken: string;
132
131
  scopes: string[];
132
+ accessToken: string;
133
133
  refreshToken: string;
134
134
  expiresAt: Date;
135
135
  userId: string;
136
136
  };
137
137
  applications: {} & {
138
138
  [k: string]: {
139
- accessToken: string;
140
139
  scopes: string[];
140
+ accessToken: string;
141
141
  expiresAt: Date;
142
142
  };
143
143
  };
144
144
  }, {
145
145
  identity: {
146
- accessToken: string;
147
146
  scopes: string[];
147
+ accessToken: string;
148
148
  refreshToken: string;
149
149
  userId: string;
150
150
  expiresAt?: unknown;
151
151
  };
152
152
  applications: {} & {
153
153
  [k: string]: {
154
- accessToken: string;
155
154
  scopes: string[];
155
+ accessToken: string;
156
156
  expiresAt?: unknown;
157
157
  };
158
158
  };
@@ -169,14 +169,14 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
169
169
  scopes: zod.ZodArray<zod.ZodString, "many">;
170
170
  userId: zod.ZodString;
171
171
  }, "strip", zod.ZodTypeAny, {
172
- accessToken: string;
173
172
  scopes: string[];
173
+ accessToken: string;
174
174
  refreshToken: string;
175
175
  expiresAt: Date;
176
176
  userId: string;
177
177
  }, {
178
- accessToken: string;
179
178
  scopes: string[];
179
+ accessToken: string;
180
180
  refreshToken: string;
181
181
  userId: string;
182
182
  expiresAt?: unknown;
@@ -190,65 +190,65 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
190
190
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
191
191
  scopes: zod.ZodArray<zod.ZodString, "many">;
192
192
  }, "strip", zod.ZodTypeAny, {
193
- accessToken: string;
194
193
  scopes: string[];
194
+ accessToken: string;
195
195
  expiresAt: Date;
196
196
  }, {
197
- accessToken: string;
198
197
  scopes: string[];
198
+ accessToken: string;
199
199
  expiresAt?: unknown;
200
200
  }>, zod.objectOutputType<{}, zod.ZodObject<{
201
201
  accessToken: zod.ZodString;
202
202
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
203
203
  scopes: zod.ZodArray<zod.ZodString, "many">;
204
204
  }, "strip", zod.ZodTypeAny, {
205
- accessToken: string;
206
205
  scopes: string[];
206
+ accessToken: string;
207
207
  expiresAt: Date;
208
208
  }, {
209
- accessToken: string;
210
209
  scopes: string[];
210
+ accessToken: string;
211
211
  expiresAt?: unknown;
212
212
  }>, "strip">, zod.objectInputType<{}, zod.ZodObject<{
213
213
  accessToken: zod.ZodString;
214
214
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
215
215
  scopes: zod.ZodArray<zod.ZodString, "many">;
216
216
  }, "strip", zod.ZodTypeAny, {
217
- accessToken: string;
218
217
  scopes: string[];
218
+ accessToken: string;
219
219
  expiresAt: Date;
220
220
  }, {
221
- accessToken: string;
222
221
  scopes: string[];
222
+ accessToken: string;
223
223
  expiresAt?: unknown;
224
224
  }>, "strip">>;
225
225
  }, "strip", zod.ZodTypeAny, {
226
226
  identity: {
227
- accessToken: string;
228
227
  scopes: string[];
228
+ accessToken: string;
229
229
  refreshToken: string;
230
230
  expiresAt: Date;
231
231
  userId: string;
232
232
  };
233
233
  applications: {} & {
234
234
  [k: string]: {
235
- accessToken: string;
236
235
  scopes: string[];
236
+ accessToken: string;
237
237
  expiresAt: Date;
238
238
  };
239
239
  };
240
240
  }, {
241
241
  identity: {
242
- accessToken: string;
243
242
  scopes: string[];
243
+ accessToken: string;
244
244
  refreshToken: string;
245
245
  userId: string;
246
246
  expiresAt?: unknown;
247
247
  };
248
248
  applications: {} & {
249
249
  [k: string]: {
250
- accessToken: string;
251
250
  scopes: string[];
251
+ accessToken: string;
252
252
  expiresAt?: unknown;
253
253
  };
254
254
  };
@@ -265,14 +265,14 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
265
265
  scopes: zod.ZodArray<zod.ZodString, "many">;
266
266
  userId: zod.ZodString;
267
267
  }, "strip", zod.ZodTypeAny, {
268
- accessToken: string;
269
268
  scopes: string[];
269
+ accessToken: string;
270
270
  refreshToken: string;
271
271
  expiresAt: Date;
272
272
  userId: string;
273
273
  }, {
274
- accessToken: string;
275
274
  scopes: string[];
275
+ accessToken: string;
276
276
  refreshToken: string;
277
277
  userId: string;
278
278
  expiresAt?: unknown;
@@ -286,65 +286,65 @@ export declare const SessionSchema: zod.ZodObject<{}, "strip", zod.ZodObject<{
286
286
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
287
287
  scopes: zod.ZodArray<zod.ZodString, "many">;
288
288
  }, "strip", zod.ZodTypeAny, {
289
- accessToken: string;
290
289
  scopes: string[];
290
+ accessToken: string;
291
291
  expiresAt: Date;
292
292
  }, {
293
- accessToken: string;
294
293
  scopes: string[];
294
+ accessToken: string;
295
295
  expiresAt?: unknown;
296
296
  }>, zod.objectOutputType<{}, zod.ZodObject<{
297
297
  accessToken: zod.ZodString;
298
298
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
299
299
  scopes: zod.ZodArray<zod.ZodString, "many">;
300
300
  }, "strip", zod.ZodTypeAny, {
301
- accessToken: string;
302
301
  scopes: string[];
302
+ accessToken: string;
303
303
  expiresAt: Date;
304
304
  }, {
305
- accessToken: string;
306
305
  scopes: string[];
306
+ accessToken: string;
307
307
  expiresAt?: unknown;
308
308
  }>, "strip">, zod.objectInputType<{}, zod.ZodObject<{
309
309
  accessToken: zod.ZodString;
310
310
  expiresAt: zod.ZodEffects<zod.ZodDate, Date, unknown>;
311
311
  scopes: zod.ZodArray<zod.ZodString, "many">;
312
312
  }, "strip", zod.ZodTypeAny, {
313
- accessToken: string;
314
313
  scopes: string[];
314
+ accessToken: string;
315
315
  expiresAt: Date;
316
316
  }, {
317
- accessToken: string;
318
317
  scopes: string[];
318
+ accessToken: string;
319
319
  expiresAt?: unknown;
320
320
  }>, "strip">>;
321
321
  }, "strip", zod.ZodTypeAny, {
322
322
  identity: {
323
- accessToken: string;
324
323
  scopes: string[];
324
+ accessToken: string;
325
325
  refreshToken: string;
326
326
  expiresAt: Date;
327
327
  userId: string;
328
328
  };
329
329
  applications: {} & {
330
330
  [k: string]: {
331
- accessToken: string;
332
331
  scopes: string[];
332
+ accessToken: string;
333
333
  expiresAt: Date;
334
334
  };
335
335
  };
336
336
  }, {
337
337
  identity: {
338
- accessToken: string;
339
338
  scopes: string[];
339
+ accessToken: string;
340
340
  refreshToken: string;
341
341
  userId: string;
342
342
  expiresAt?: unknown;
343
343
  };
344
344
  applications: {} & {
345
345
  [k: string]: {
346
- accessToken: string;
347
346
  scopes: string[];
347
+ accessToken: string;
348
348
  expiresAt?: unknown;
349
349
  };
350
350
  };
@@ -7,6 +7,7 @@ export interface ConcurrentOutputProps {
7
7
  abortSignal: AbortSignal;
8
8
  showTimestamps?: boolean;
9
9
  keepRunningAfterProcessesResolve?: boolean;
10
+ useAlternativeColorPalette?: boolean;
10
11
  }
11
12
  interface ConcurrentOutputContext {
12
13
  outputPrefix?: string;
@@ -57,10 +57,12 @@ function useConcurrentOutputContext(context, callback) {
57
57
  *
58
58
  * ```
59
59
  */
60
- const ConcurrentOutput = ({ processes, prefixColumnSize, abortSignal, showTimestamps = true, keepRunningAfterProcessesResolve = false, }) => {
60
+ const ConcurrentOutput = ({ processes, prefixColumnSize, abortSignal, showTimestamps = true, keepRunningAfterProcessesResolve = false, useAlternativeColorPalette = false, }) => {
61
61
  const [processOutput, setProcessOutput] = useState([]);
62
62
  const { exit: unmountInk } = useApp();
63
- const concurrentColors = useMemo(() => ['yellow', 'cyan', 'magenta', 'green', 'blue'], []);
63
+ const concurrentColors = useMemo(() => useAlternativeColorPalette
64
+ ? ['#b994c3', '#e69e19', '#d17a73', 'cyan', 'magenta', 'blue']
65
+ : ['yellow', 'cyan', 'magenta', 'green', 'blue'], [useAlternativeColorPalette]);
64
66
  const calculatedPrefixColumnSize = useMemo(() => {
65
67
  const maxColumnSize = 25;
66
68
  // If the prefixColumnSize is not provided, we calculate it based on the longest process prefix
@@ -1 +1 @@
1
- {"version":3,"file":"ConcurrentOutput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/ConcurrentOutput.tsx"],"names":[],"mappings":"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","sourcesContent":["import {OutputProcess} from '../../../../public/node/output.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport {addOrUpdateConcurrentUIEventOutput} from '../../demo-recorder.js'\nimport React, {FunctionComponent, useCallback, useEffect, useMemo, useState} from 'react'\nimport {Box, Static, Text, TextProps, useApp} from 'ink'\nimport figures from 'figures'\nimport stripAnsi from 'strip-ansi'\nimport {Writable} from 'stream'\nimport {AsyncLocalStorage} from 'node:async_hooks'\n\nexport interface ConcurrentOutputProps {\n processes: OutputProcess[]\n prefixColumnSize?: number\n abortSignal: AbortSignal\n showTimestamps?: boolean\n keepRunningAfterProcessesResolve?: boolean\n}\n\ninterface Chunk {\n color: TextProps['color']\n prefix: string\n lines: string[]\n}\n\nfunction addLeadingZero(number: number) {\n if (number < 10) {\n return `0${number}`\n } else {\n return number.toString()\n }\n}\n\nfunction currentTime() {\n const currentDateTime = new Date()\n const hours = addLeadingZero(currentDateTime.getHours())\n const minutes = addLeadingZero(currentDateTime.getMinutes())\n const seconds = addLeadingZero(currentDateTime.getSeconds())\n return `${hours}:${minutes}:${seconds}`\n}\n\ninterface ConcurrentOutputContext {\n outputPrefix?: string\n stripAnsi?: boolean\n}\n\nconst outputContextStore = new AsyncLocalStorage<ConcurrentOutputContext>()\n\nfunction useConcurrentOutputContext<T>(context: ConcurrentOutputContext, callback: () => T): T {\n return outputContextStore.run(context, callback)\n}\n\n/**\n * Renders output from concurrent processes to the terminal.\n * Output will be divided in a three column layout\n * with the left column containing the timestamp,\n * the right column containing the output,\n * and the middle column containing the process prefix.\n * Every process will be rendered with a different color, up to 4 colors.\n *\n * For example running `shopify app dev`:\n *\n * ```shell\n * 2022-10-10 13:11:03 | backend | npm\n * 2022-10-10 13:11:03 | backend | WARN ignoring workspace config at ...\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend | > shopify-app-template-node@0.1.0 dev\n * 2022-10-10 13:11:03 | backend | > cross-env NODE_ENV=development nodemon backend/index.js --watch ./backend\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | frontend | > starter-react-frontend-app@0.1.0 dev\n * 2022-10-10 13:11:03 | frontend | > cross-env NODE_ENV=development node vite-server.js\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend | [nodemon] to restart at any time, enter `rs`\n * 2022-10-10 13:11:03 | backend | [nodemon] watching path(s): backend/\n * 2022-10-10 13:11:03 | backend | [nodemon] watching extensions: js,mjs,json\n * 2022-10-10 13:11:03 | backend | [nodemon] starting `node backend/index.js`\n * 2022-10-10 13:11:03 | backend |\n *\n * ```\n */\nconst ConcurrentOutput: FunctionComponent<ConcurrentOutputProps> = ({\n processes,\n prefixColumnSize,\n abortSignal,\n showTimestamps = true,\n keepRunningAfterProcessesResolve = false,\n}) => {\n const [processOutput, setProcessOutput] = useState<Chunk[]>([])\n const {exit: unmountInk} = useApp()\n const concurrentColors: TextProps['color'][] = useMemo(() => ['yellow', 'cyan', 'magenta', 'green', 'blue'], [])\n\n const calculatedPrefixColumnSize = useMemo(() => {\n const maxColumnSize = 25\n\n // If the prefixColumnSize is not provided, we calculate it based on the longest process prefix\n const columnSize =\n prefixColumnSize ??\n processes.reduce((maxPrefixLength, process) => Math.max(maxPrefixLength, process.prefix.length), 0)\n\n // Apply overall limit to the prefix column size\n return Math.min(columnSize, maxColumnSize)\n }, [processes, prefixColumnSize])\n\n const addPrefix = (prefix: string, prefixes: string[]) => {\n const index = prefixes.indexOf(prefix)\n if (index !== -1) {\n return index\n }\n prefixes.push(prefix)\n return prefixes.length - 1\n }\n\n const lineColor = useCallback(\n (index: number) => {\n const colorIndex = index % concurrentColors.length\n return concurrentColors[colorIndex]\n },\n [concurrentColors],\n )\n\n const writableStream = useCallback(\n (process: OutputProcess, prefixes: string[]) => {\n return new Writable({\n write(chunk, _encoding, next) {\n const context = outputContextStore.getStore()\n const prefix = context?.outputPrefix ?? process.prefix\n const shouldStripAnsi = context?.stripAnsi ?? true\n const log = chunk.toString('utf8').replace(/(\\n)$/, '')\n\n const index = addPrefix(prefix, prefixes)\n\n const lines = shouldStripAnsi ? stripAnsi(log).split(/\\n/) : log.split(/\\n/)\n addOrUpdateConcurrentUIEventOutput({prefix, index, output: lines.join('\\n')})\n setProcessOutput((previousProcessOutput) => [\n ...previousProcessOutput,\n {\n color: lineColor(index),\n prefix,\n lines,\n },\n ])\n next()\n },\n })\n },\n [lineColor],\n )\n\n const formatPrefix = (prefix: string) => {\n // Truncate prefix if needed\n if (prefix.length > calculatedPrefixColumnSize) {\n return prefix.substring(0, calculatedPrefixColumnSize)\n }\n\n return `${' '.repeat(calculatedPrefixColumnSize - prefix.length)}${prefix}`\n }\n\n useEffect(() => {\n const runProcesses = async () => {\n const prefixes: string[] = []\n\n try {\n await Promise.all(\n processes.map(async (process) => {\n const stdout = writableStream(process, prefixes)\n const stderr = writableStream(process, prefixes)\n await process.action(stdout, stderr, abortSignal)\n }),\n )\n if (!keepRunningAfterProcessesResolve) {\n unmountInk()\n }\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error: unknown) {\n if (!keepRunningAfterProcessesResolve) {\n unmountInk(error as Error | undefined)\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n runProcesses()\n }, [abortSignal, processes, writableStream, unmountInk, keepRunningAfterProcessesResolve])\n\n const {lineVertical} = figures\n\n return (\n <Static items={processOutput}>\n {(chunk, index) => {\n return (\n <Box flexDirection=\"column\" key={index}>\n {chunk.lines.map((line, index) => (\n <Box key={index} flexDirection=\"row\">\n <Text>\n {showTimestamps ? (\n <Text>\n {currentTime()} {lineVertical}{' '}\n </Text>\n ) : null}\n <Text color={chunk.color}>{formatPrefix(chunk.prefix)}</Text>\n <Text>\n {' '}\n {lineVertical} {line}\n </Text>\n </Text>\n </Box>\n ))}\n </Box>\n )\n }}\n </Static>\n )\n}\nexport {ConcurrentOutput, ConcurrentOutputContext, useConcurrentOutputContext}\n"]}
1
+ {"version":3,"file":"ConcurrentOutput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/ConcurrentOutput.tsx"],"names":[],"mappings":"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","sourcesContent":["import {OutputProcess} from '../../../../public/node/output.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport {addOrUpdateConcurrentUIEventOutput} from '../../demo-recorder.js'\nimport React, {FunctionComponent, useCallback, useEffect, useMemo, useState} from 'react'\nimport {Box, Static, Text, TextProps, useApp} from 'ink'\nimport figures from 'figures'\nimport stripAnsi from 'strip-ansi'\nimport {Writable} from 'stream'\nimport {AsyncLocalStorage} from 'node:async_hooks'\n\nexport interface ConcurrentOutputProps {\n processes: OutputProcess[]\n prefixColumnSize?: number\n abortSignal: AbortSignal\n showTimestamps?: boolean\n keepRunningAfterProcessesResolve?: boolean\n useAlternativeColorPalette?: boolean\n}\n\ninterface Chunk {\n color: TextProps['color']\n prefix: string\n lines: string[]\n}\n\nfunction addLeadingZero(number: number) {\n if (number < 10) {\n return `0${number}`\n } else {\n return number.toString()\n }\n}\n\nfunction currentTime() {\n const currentDateTime = new Date()\n const hours = addLeadingZero(currentDateTime.getHours())\n const minutes = addLeadingZero(currentDateTime.getMinutes())\n const seconds = addLeadingZero(currentDateTime.getSeconds())\n return `${hours}:${minutes}:${seconds}`\n}\n\ninterface ConcurrentOutputContext {\n outputPrefix?: string\n stripAnsi?: boolean\n}\n\nconst outputContextStore = new AsyncLocalStorage<ConcurrentOutputContext>()\n\nfunction useConcurrentOutputContext<T>(context: ConcurrentOutputContext, callback: () => T): T {\n return outputContextStore.run(context, callback)\n}\n\n/**\n * Renders output from concurrent processes to the terminal.\n * Output will be divided in a three column layout\n * with the left column containing the timestamp,\n * the right column containing the output,\n * and the middle column containing the process prefix.\n * Every process will be rendered with a different color, up to 4 colors.\n *\n * For example running `shopify app dev`:\n *\n * ```shell\n * 2022-10-10 13:11:03 | backend | npm\n * 2022-10-10 13:11:03 | backend | WARN ignoring workspace config at ...\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend | > shopify-app-template-node@0.1.0 dev\n * 2022-10-10 13:11:03 | backend | > cross-env NODE_ENV=development nodemon backend/index.js --watch ./backend\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | frontend | > starter-react-frontend-app@0.1.0 dev\n * 2022-10-10 13:11:03 | frontend | > cross-env NODE_ENV=development node vite-server.js\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | frontend |\n * 2022-10-10 13:11:03 | backend |\n * 2022-10-10 13:11:03 | backend | [nodemon] to restart at any time, enter `rs`\n * 2022-10-10 13:11:03 | backend | [nodemon] watching path(s): backend/\n * 2022-10-10 13:11:03 | backend | [nodemon] watching extensions: js,mjs,json\n * 2022-10-10 13:11:03 | backend | [nodemon] starting `node backend/index.js`\n * 2022-10-10 13:11:03 | backend |\n *\n * ```\n */\nconst ConcurrentOutput: FunctionComponent<ConcurrentOutputProps> = ({\n processes,\n prefixColumnSize,\n abortSignal,\n showTimestamps = true,\n keepRunningAfterProcessesResolve = false,\n useAlternativeColorPalette = false,\n}) => {\n const [processOutput, setProcessOutput] = useState<Chunk[]>([])\n const {exit: unmountInk} = useApp()\n const concurrentColors: TextProps['color'][] = useMemo(\n () =>\n useAlternativeColorPalette\n ? ['#b994c3', '#e69e19', '#d17a73', 'cyan', 'magenta', 'blue']\n : ['yellow', 'cyan', 'magenta', 'green', 'blue'],\n [useAlternativeColorPalette],\n )\n\n const calculatedPrefixColumnSize = useMemo(() => {\n const maxColumnSize = 25\n\n // If the prefixColumnSize is not provided, we calculate it based on the longest process prefix\n const columnSize =\n prefixColumnSize ??\n processes.reduce((maxPrefixLength, process) => Math.max(maxPrefixLength, process.prefix.length), 0)\n\n // Apply overall limit to the prefix column size\n return Math.min(columnSize, maxColumnSize)\n }, [processes, prefixColumnSize])\n\n const addPrefix = (prefix: string, prefixes: string[]) => {\n const index = prefixes.indexOf(prefix)\n if (index !== -1) {\n return index\n }\n prefixes.push(prefix)\n return prefixes.length - 1\n }\n\n const lineColor = useCallback(\n (index: number) => {\n const colorIndex = index % concurrentColors.length\n return concurrentColors[colorIndex]\n },\n [concurrentColors],\n )\n\n const writableStream = useCallback(\n (process: OutputProcess, prefixes: string[]) => {\n return new Writable({\n write(chunk, _encoding, next) {\n const context = outputContextStore.getStore()\n const prefix = context?.outputPrefix ?? process.prefix\n const shouldStripAnsi = context?.stripAnsi ?? true\n const log = chunk.toString('utf8').replace(/(\\n)$/, '')\n\n const index = addPrefix(prefix, prefixes)\n\n const lines = shouldStripAnsi ? stripAnsi(log).split(/\\n/) : log.split(/\\n/)\n addOrUpdateConcurrentUIEventOutput({prefix, index, output: lines.join('\\n')})\n setProcessOutput((previousProcessOutput) => [\n ...previousProcessOutput,\n {\n color: lineColor(index),\n prefix,\n lines,\n },\n ])\n next()\n },\n })\n },\n [lineColor],\n )\n\n const formatPrefix = (prefix: string) => {\n // Truncate prefix if needed\n if (prefix.length > calculatedPrefixColumnSize) {\n return prefix.substring(0, calculatedPrefixColumnSize)\n }\n\n return `${' '.repeat(calculatedPrefixColumnSize - prefix.length)}${prefix}`\n }\n\n useEffect(() => {\n const runProcesses = async () => {\n const prefixes: string[] = []\n\n try {\n await Promise.all(\n processes.map(async (process) => {\n const stdout = writableStream(process, prefixes)\n const stderr = writableStream(process, prefixes)\n await process.action(stdout, stderr, abortSignal)\n }),\n )\n if (!keepRunningAfterProcessesResolve) {\n unmountInk()\n }\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error: unknown) {\n if (!keepRunningAfterProcessesResolve) {\n unmountInk(error as Error | undefined)\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n runProcesses()\n }, [abortSignal, processes, writableStream, unmountInk, keepRunningAfterProcessesResolve])\n\n const {lineVertical} = figures\n\n return (\n <Static items={processOutput}>\n {(chunk, index) => {\n return (\n <Box flexDirection=\"column\" key={index}>\n {chunk.lines.map((line, index) => (\n <Box key={index} flexDirection=\"row\">\n <Text>\n {showTimestamps ? (\n <Text>\n {currentTime()} {lineVertical}{' '}\n </Text>\n ) : null}\n <Text color={chunk.color}>{formatPrefix(chunk.prefix)}</Text>\n <Text>\n {' '}\n {lineVertical} {line}\n </Text>\n </Text>\n </Box>\n ))}\n </Box>\n )\n }}\n </Static>\n )\n}\nexport {ConcurrentOutput, ConcurrentOutputContext, useConcurrentOutputContext}\n"]}
@@ -1 +1 @@
1
- export declare const CLI_KIT_VERSION = "3.69.4";
1
+ export declare const CLI_KIT_VERSION = "3.70.0";
@@ -1,2 +1,2 @@
1
- export const CLI_KIT_VERSION = '3.69.4';
1
+ export const CLI_KIT_VERSION = '3.70.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/public/common/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA","sourcesContent":["export const CLI_KIT_VERSION = '3.69.4'\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/public/common/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA","sourcesContent":["export const CLI_KIT_VERSION = '3.70.0'\n"]}
@@ -1,4 +1,3 @@
1
- import { version as rubyVersion } from './ruby.js';
2
1
  import { alwaysLogAnalytics, alwaysLogMetrics, analyticsDisabled, isShopify } from './context/local.js';
3
2
  import * as metadata from './metadata.js';
4
3
  import { publishMonorailEvent, MONORAIL_COMMAND_TOPIC } from './monorail.js';
@@ -109,7 +108,7 @@ async function buildPayload({ config, errorMessage, exitMode }) {
109
108
  total_time: wallClockElapsed,
110
109
  success: exitMode === 'ok' && errorMessage === undefined,
111
110
  cli_version: CLI_KIT_VERSION,
112
- ruby_version: (await rubyVersion()) || '',
111
+ ruby_version: '',
113
112
  node_version: process.version.replace('v', ''),
114
113
  is_employee: await isShopify(),
115
114
  ...environmentData,
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/public/node/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import {version as rubyVersion} from './ruby.js'\nimport {alwaysLogAnalytics, alwaysLogMetrics, analyticsDisabled, isShopify} from './context/local.js'\nimport * as metadata from './metadata.js'\nimport {publishMonorailEvent, MONORAIL_COMMAND_TOPIC} from './monorail.js'\nimport {fanoutHooks} from './plugins.js'\n\nimport {outputContent, outputDebug, outputToken} from '../../public/node/output.js'\nimport {getEnvironmentData, getSensitiveEnvironmentData} from '../../private/node/analytics.js'\nimport {CLI_KIT_VERSION} from '../common/version.js'\nimport {recordMetrics} from '../../private/node/otel-metrics.js'\nimport {runWithRateLimit} from '../../private/node/conf-store.js'\nimport {reportingRateLimit} from '../../private/node/constants.js'\nimport {getLastSeenUserIdAfterAuth} from '../../private/node/session.js'\nimport {Interfaces} from '@oclif/core'\n\nexport type CommandExitMode =\n // The command completed successfully\n | 'ok'\n // The command exited for some unexpected reason -- i.e. a bug\n | 'unexpected_error'\n // The command exited with an error, but its one we expect and doesn't point to a bug -- i.e. malformed config files\n | 'expected_error'\n\ninterface ReportAnalyticsEventOptions {\n config: Interfaces.Config\n errorMessage?: string\n exitMode: CommandExitMode\n}\n\n/**\n * Report an analytics event, sending it off to Monorail -- Shopify's internal analytics service.\n *\n * The payload for an event includes both generic data, and data gathered from installed plug-ins.\n *\n */\nexport async function reportAnalyticsEvent(options: ReportAnalyticsEventOptions): Promise<void> {\n try {\n const payload = await buildPayload(options)\n if (payload === undefined) {\n // Nothing to log\n return\n }\n\n let withinRateLimit = false\n await runWithRateLimit({\n key: 'report-analytics-event',\n ...reportingRateLimit,\n task: async () => {\n withinRateLimit = true\n },\n })\n if (!withinRateLimit) {\n outputDebug(outputContent`Skipping command analytics due to rate limiting, payload: ${outputToken.json(payload)}`)\n return\n }\n\n const skipMonorailAnalytics = !alwaysLogAnalytics() && analyticsDisabled()\n const skipMetricAnalytics = !alwaysLogMetrics() && analyticsDisabled()\n if (skipMonorailAnalytics || skipMetricAnalytics) {\n outputDebug(outputContent`Skipping command analytics, payload: ${outputToken.json(payload)}`)\n }\n\n const doMonorail = async () => {\n if (skipMonorailAnalytics) {\n return\n }\n const response = await publishMonorailEvent(MONORAIL_COMMAND_TOPIC, payload.public, payload.sensitive)\n if (response.type === 'error') {\n outputDebug(response.message)\n }\n }\n const doOpenTelemetry = async () => {\n const active = payload.public.cmd_all_timing_active_ms || 0\n const network = payload.public.cmd_all_timing_network_ms || 0\n const prompt = payload.public.cmd_all_timing_prompts_ms || 0\n\n return recordMetrics(\n {\n skipMetricAnalytics,\n cliVersion: payload.public.cli_version,\n owningPlugin: payload.public.cmd_all_plugin || '@shopify/cli',\n command: payload.public.command,\n exitMode: options.exitMode,\n },\n {\n active,\n network,\n prompt,\n },\n )\n }\n await Promise.all([doMonorail(), doOpenTelemetry()])\n\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n let message = 'Failed to report usage analytics'\n if (error instanceof Error) {\n message = message.concat(`: ${error.message}`)\n }\n outputDebug(message)\n }\n}\n\nasync function buildPayload({config, errorMessage, exitMode}: ReportAnalyticsEventOptions) {\n const {commandStartOptions, environmentFlags, ...sensitiveMetadata} = metadata.getAllSensitiveMetadata()\n if (commandStartOptions === undefined) {\n outputDebug('Unable to log analytics event - no information on executed command')\n return\n }\n const {startCommand, startArgs, startTime} = commandStartOptions\n const currentTime = new Date().getTime()\n\n // All bundled plugins appear as `@shopify/cli` in the payload\n const {'@shopify/cli': internalPluginsPublic, ...externalPluginsPublic} = await fanoutHooks(\n config,\n 'public_command_metadata',\n {},\n )\n const {'@shopify/cli': internalPluginsSensitive, ...externalPluginsSensitive} = await fanoutHooks(\n config,\n 'sensitive_command_metadata',\n {},\n )\n\n const environmentData = await getEnvironmentData(config)\n const sensitiveEnvironmentData = await getSensitiveEnvironmentData(config)\n const publicMetadata = metadata.getAllPublicMetadata()\n\n // Automatically calculate the total time spent in the command, excluding time spent in subtimers.\n const subTimers = ['cmd_all_timing_network_ms', 'cmd_all_timing_prompts_ms'] as const\n const totalTimeFromSubtimers = subTimers.reduce((total, timer) => {\n const value = publicMetadata[timer]\n if (value !== undefined) {\n return total + value\n }\n return total\n }, 0)\n const wallClockElapsed = currentTime - startTime\n const totalTimeWithoutSubtimers = wallClockElapsed - totalTimeFromSubtimers\n\n let payload = {\n public: {\n command: startCommand,\n time_start: startTime,\n time_end: currentTime,\n total_time: wallClockElapsed,\n success: exitMode === 'ok' && errorMessage === undefined,\n cli_version: CLI_KIT_VERSION,\n ruby_version: (await rubyVersion()) || '',\n node_version: process.version.replace('v', ''),\n is_employee: await isShopify(),\n ...environmentData,\n ...internalPluginsPublic,\n ...publicMetadata,\n cmd_all_timing_active_ms: totalTimeWithoutSubtimers,\n cmd_all_exit: exitMode,\n user_id: await getLastSeenUserIdAfterAuth(),\n },\n sensitive: {\n args: startArgs.join(' '),\n cmd_all_environment_flags: environmentFlags,\n error_message: errorMessage,\n ...internalPluginsSensitive,\n ...sensitiveEnvironmentData,\n metadata: JSON.stringify({\n ...sensitiveMetadata,\n extraPublic: {\n ...externalPluginsPublic,\n },\n extraSensitive: {...externalPluginsSensitive},\n }),\n },\n }\n\n // round down timing metrics\n const timingMetrics = ['cmd_all_timing_active_ms', 'cmd_all_timing_network_ms', 'cmd_all_timing_prompts_ms'] as const\n timingMetrics.forEach((metric) => {\n const current = payload.public[metric]\n if (current !== undefined) {\n payload.public[metric] = Math.floor(current)\n }\n })\n\n // strip undefined fields -- they make up the majority of payloads due to wide metadata structure.\n payload = JSON.parse(JSON.stringify(payload))\n\n return sanitizePayload(payload)\n}\n\nfunction sanitizePayload<T>(payload: T): T {\n const payloadString = JSON.stringify(payload)\n // Remove Theme Access passwords from the payload\n const sanitizedPayloadString = payloadString.replace(/shptka_\\w*/g, '*****')\n return JSON.parse(sanitizedPayloadString)\n}\n"]}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/public/node/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import {alwaysLogAnalytics, alwaysLogMetrics, analyticsDisabled, isShopify} from './context/local.js'\nimport * as metadata from './metadata.js'\nimport {publishMonorailEvent, MONORAIL_COMMAND_TOPIC} from './monorail.js'\nimport {fanoutHooks} from './plugins.js'\n\nimport {outputContent, outputDebug, outputToken} from '../../public/node/output.js'\nimport {getEnvironmentData, getSensitiveEnvironmentData} from '../../private/node/analytics.js'\nimport {CLI_KIT_VERSION} from '../common/version.js'\nimport {recordMetrics} from '../../private/node/otel-metrics.js'\nimport {runWithRateLimit} from '../../private/node/conf-store.js'\nimport {reportingRateLimit} from '../../private/node/constants.js'\nimport {getLastSeenUserIdAfterAuth} from '../../private/node/session.js'\nimport {Interfaces} from '@oclif/core'\n\nexport type CommandExitMode =\n // The command completed successfully\n | 'ok'\n // The command exited for some unexpected reason -- i.e. a bug\n | 'unexpected_error'\n // The command exited with an error, but its one we expect and doesn't point to a bug -- i.e. malformed config files\n | 'expected_error'\n\ninterface ReportAnalyticsEventOptions {\n config: Interfaces.Config\n errorMessage?: string\n exitMode: CommandExitMode\n}\n\n/**\n * Report an analytics event, sending it off to Monorail -- Shopify's internal analytics service.\n *\n * The payload for an event includes both generic data, and data gathered from installed plug-ins.\n *\n */\nexport async function reportAnalyticsEvent(options: ReportAnalyticsEventOptions): Promise<void> {\n try {\n const payload = await buildPayload(options)\n if (payload === undefined) {\n // Nothing to log\n return\n }\n\n let withinRateLimit = false\n await runWithRateLimit({\n key: 'report-analytics-event',\n ...reportingRateLimit,\n task: async () => {\n withinRateLimit = true\n },\n })\n if (!withinRateLimit) {\n outputDebug(outputContent`Skipping command analytics due to rate limiting, payload: ${outputToken.json(payload)}`)\n return\n }\n\n const skipMonorailAnalytics = !alwaysLogAnalytics() && analyticsDisabled()\n const skipMetricAnalytics = !alwaysLogMetrics() && analyticsDisabled()\n if (skipMonorailAnalytics || skipMetricAnalytics) {\n outputDebug(outputContent`Skipping command analytics, payload: ${outputToken.json(payload)}`)\n }\n\n const doMonorail = async () => {\n if (skipMonorailAnalytics) {\n return\n }\n const response = await publishMonorailEvent(MONORAIL_COMMAND_TOPIC, payload.public, payload.sensitive)\n if (response.type === 'error') {\n outputDebug(response.message)\n }\n }\n const doOpenTelemetry = async () => {\n const active = payload.public.cmd_all_timing_active_ms || 0\n const network = payload.public.cmd_all_timing_network_ms || 0\n const prompt = payload.public.cmd_all_timing_prompts_ms || 0\n\n return recordMetrics(\n {\n skipMetricAnalytics,\n cliVersion: payload.public.cli_version,\n owningPlugin: payload.public.cmd_all_plugin || '@shopify/cli',\n command: payload.public.command,\n exitMode: options.exitMode,\n },\n {\n active,\n network,\n prompt,\n },\n )\n }\n await Promise.all([doMonorail(), doOpenTelemetry()])\n\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n let message = 'Failed to report usage analytics'\n if (error instanceof Error) {\n message = message.concat(`: ${error.message}`)\n }\n outputDebug(message)\n }\n}\n\nasync function buildPayload({config, errorMessage, exitMode}: ReportAnalyticsEventOptions) {\n const {commandStartOptions, environmentFlags, ...sensitiveMetadata} = metadata.getAllSensitiveMetadata()\n if (commandStartOptions === undefined) {\n outputDebug('Unable to log analytics event - no information on executed command')\n return\n }\n const {startCommand, startArgs, startTime} = commandStartOptions\n const currentTime = new Date().getTime()\n\n // All bundled plugins appear as `@shopify/cli` in the payload\n const {'@shopify/cli': internalPluginsPublic, ...externalPluginsPublic} = await fanoutHooks(\n config,\n 'public_command_metadata',\n {},\n )\n const {'@shopify/cli': internalPluginsSensitive, ...externalPluginsSensitive} = await fanoutHooks(\n config,\n 'sensitive_command_metadata',\n {},\n )\n\n const environmentData = await getEnvironmentData(config)\n const sensitiveEnvironmentData = await getSensitiveEnvironmentData(config)\n const publicMetadata = metadata.getAllPublicMetadata()\n\n // Automatically calculate the total time spent in the command, excluding time spent in subtimers.\n const subTimers = ['cmd_all_timing_network_ms', 'cmd_all_timing_prompts_ms'] as const\n const totalTimeFromSubtimers = subTimers.reduce((total, timer) => {\n const value = publicMetadata[timer]\n if (value !== undefined) {\n return total + value\n }\n return total\n }, 0)\n const wallClockElapsed = currentTime - startTime\n const totalTimeWithoutSubtimers = wallClockElapsed - totalTimeFromSubtimers\n\n let payload = {\n public: {\n command: startCommand,\n time_start: startTime,\n time_end: currentTime,\n total_time: wallClockElapsed,\n success: exitMode === 'ok' && errorMessage === undefined,\n cli_version: CLI_KIT_VERSION,\n ruby_version: '',\n node_version: process.version.replace('v', ''),\n is_employee: await isShopify(),\n ...environmentData,\n ...internalPluginsPublic,\n ...publicMetadata,\n cmd_all_timing_active_ms: totalTimeWithoutSubtimers,\n cmd_all_exit: exitMode,\n user_id: await getLastSeenUserIdAfterAuth(),\n },\n sensitive: {\n args: startArgs.join(' '),\n cmd_all_environment_flags: environmentFlags,\n error_message: errorMessage,\n ...internalPluginsSensitive,\n ...sensitiveEnvironmentData,\n metadata: JSON.stringify({\n ...sensitiveMetadata,\n extraPublic: {\n ...externalPluginsPublic,\n },\n extraSensitive: {...externalPluginsSensitive},\n }),\n },\n }\n\n // round down timing metrics\n const timingMetrics = ['cmd_all_timing_active_ms', 'cmd_all_timing_network_ms', 'cmd_all_timing_prompts_ms'] as const\n timingMetrics.forEach((metric) => {\n const current = payload.public[metric]\n if (current !== undefined) {\n payload.public[metric] = Math.floor(current)\n }\n })\n\n // strip undefined fields -- they make up the majority of payloads due to wide metadata structure.\n payload = JSON.parse(JSON.stringify(payload))\n\n return sanitizePayload(payload)\n}\n\nfunction sanitizePayload<T>(payload: T): T {\n const payloadString = JSON.stringify(payload)\n // Remove Theme Access passwords from the payload\n const sanitizedPayloadString = payloadString.replace(/shptka_\\w*/g, '*****')\n return JSON.parse(sanitizedPayloadString)\n}\n"]}
@@ -34,9 +34,10 @@ export declare function supportedApiVersions(session: AdminSession): Promise<str
34
34
  *
35
35
  * @param store - Store FQDN.
36
36
  * @param version - API version.
37
+ * @param session - User session.
37
38
  * @returns - Admin API URL.
38
39
  */
39
- export declare function adminUrl(store: string, version: string | undefined): string;
40
+ export declare function adminUrl(store: string, version: string | undefined, session?: AdminSession): string;
40
41
  /**
41
42
  * Executes a REST request against the Admin API.
42
43
  *
@@ -1,11 +1,13 @@
1
1
  import { graphqlRequest, graphqlRequestDoc } from './graphql.js';
2
2
  import { outputContent, outputToken } from '../../../public/node/output.js';
3
3
  import { BugError, AbortError } from '../error.js';
4
- import { restRequestBody, restRequestHeaders, restRequestUrl } from '../../../private/node/api/rest.js';
4
+ import { restRequestBody, restRequestHeaders, restRequestUrl, isThemeAccessSession, } from '../../../private/node/api/rest.js';
5
5
  import { fetch } from '../http.js';
6
6
  import { PublicApiVersions } from '../../../cli/api/graphql/admin/generated/public_api_versions.js';
7
7
  import { normalizeStoreFqdn } from '../context/fqdn.js';
8
+ import { themeKitAccessDomain } from '../../../private/node/constants.js';
8
9
  import { ClientError } from 'graphql-request';
10
+ const LatestApiVersionByFQDN = new Map();
9
11
  /**
10
12
  * Executes a GraphQL query against the Admin API.
11
13
  *
@@ -18,8 +20,9 @@ export async function adminRequest(query, session, variables) {
18
20
  const api = 'Admin';
19
21
  const version = await fetchLatestSupportedApiVersion(session);
20
22
  const store = await normalizeStoreFqdn(session.storeFqdn);
21
- const url = adminUrl(store, version);
22
- return graphqlRequest({ query, api, url, token: session.token, variables });
23
+ const url = adminUrl(store, version, session);
24
+ const addedHeaders = themeAccessHeaders(session);
25
+ return graphqlRequest({ query, api, addedHeaders, url, token: session.token, variables });
23
26
  }
24
27
  /**
25
28
  * Executes a GraphQL query against the Admin API. Uses typed documents.
@@ -32,19 +35,26 @@ export async function adminRequest(query, session, variables) {
32
35
  * @returns The response of the query of generic type <TResult>.
33
36
  */
34
37
  export async function adminRequestDoc(query, session, variables, version, responseOptions) {
35
- let apiVersion = version;
36
- if (!version) {
38
+ let apiVersion = version ?? LatestApiVersionByFQDN.get(session.storeFqdn);
39
+ if (!apiVersion) {
37
40
  apiVersion = await fetchLatestSupportedApiVersion(session);
38
41
  }
39
42
  const store = await normalizeStoreFqdn(session.storeFqdn);
43
+ const addedHeaders = themeAccessHeaders(session);
40
44
  const opts = {
41
- url: adminUrl(store, apiVersion),
45
+ url: adminUrl(store, apiVersion, session),
42
46
  api: 'Admin',
43
47
  token: session.token,
48
+ addedHeaders,
44
49
  };
45
50
  const result = graphqlRequestDoc({ ...opts, query, variables, responseOptions });
46
51
  return result;
47
52
  }
53
+ function themeAccessHeaders(session) {
54
+ return isThemeAccessSession(session)
55
+ ? { 'X-Shopify-Shop': session.storeFqdn, 'X-Shopify-Access-Token': session.token }
56
+ : {};
57
+ }
48
58
  /**
49
59
  * GraphQL query to retrieve the latest supported API version.
50
60
  *
@@ -54,7 +64,9 @@ export async function adminRequestDoc(query, session, variables, version, respon
54
64
  async function fetchLatestSupportedApiVersion(session) {
55
65
  const apiVersions = await supportedApiVersions(session);
56
66
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57
- return apiVersions.reverse()[0];
67
+ const latest = apiVersions.reverse()[0];
68
+ LatestApiVersionByFQDN.set(session.storeFqdn, latest);
69
+ return latest;
58
70
  }
59
71
  /**
60
72
  * GraphQL query to retrieve all supported API versions.
@@ -98,11 +110,15 @@ async function fetchApiVersions(session) {
98
110
  *
99
111
  * @param store - Store FQDN.
100
112
  * @param version - API version.
113
+ * @param session - User session.
101
114
  * @returns - Admin API URL.
102
115
  */
103
- export function adminUrl(store, version) {
116
+ export function adminUrl(store, version, session) {
104
117
  const realVersion = version ?? 'unstable';
105
- return `https://${store}/admin/api/${realVersion}/graphql.json`;
118
+ const url = session && isThemeAccessSession(session)
119
+ ? `https://${themeKitAccessDomain}/cli/admin/api/${realVersion}/graphql.json`
120
+ : `https://${store}/admin/api/${realVersion}/graphql.json`;
121
+ return url;
106
122
  }
107
123
  /**
108
124
  * Executes a REST request against the Admin API.
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../../src/public/node/api/admin.ts"],"names":[],"mappings":"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","sourcesContent":["import {graphqlRequest, graphqlRequestDoc, GraphQLResponseOptions, GraphQLVariables} from './graphql.js'\nimport {AdminSession} from '../session.js'\nimport {outputContent, outputToken} from '../../../public/node/output.js'\nimport {BugError, AbortError} from '../error.js'\nimport {restRequestBody, restRequestHeaders, restRequestUrl} from '../../../private/node/api/rest.js'\nimport {fetch} from '../http.js'\nimport {PublicApiVersions} from '../../../cli/api/graphql/admin/generated/public_api_versions.js'\nimport {normalizeStoreFqdn} from '../context/fqdn.js'\nimport {ClientError, Variables} from 'graphql-request'\nimport {TypedDocumentNode} from '@graphql-typed-document-node/core'\n\n/**\n * Executes a GraphQL query against the Admin API.\n *\n * @param query - GraphQL query to execute.\n * @param session - Shopify admin session including token and Store FQDN.\n * @param variables - GraphQL variables to pass to the query.\n * @returns The response of the query of generic type <T>.\n */\nexport async function adminRequest<T>(query: string, session: AdminSession, variables?: GraphQLVariables): Promise<T> {\n const api = 'Admin'\n const version = await fetchLatestSupportedApiVersion(session)\n const store = await normalizeStoreFqdn(session.storeFqdn)\n const url = adminUrl(store, version)\n return graphqlRequest({query, api, url, token: session.token, variables})\n}\n\n/**\n * Executes a GraphQL query against the Admin API. Uses typed documents.\n *\n * @param query - GraphQL query to execute.\n * @param session - Shopify admin session including token and Store FQDN.\n * @param variables - GraphQL variables to pass to the query.\n * @param version - API version.\n * @param responseOptions - Control how API responses will be handled.\n * @returns The response of the query of generic type <TResult>.\n */\nexport async function adminRequestDoc<TResult, TVariables extends Variables>(\n query: TypedDocumentNode<TResult, TVariables>,\n session: AdminSession,\n variables?: TVariables,\n version?: string,\n responseOptions?: GraphQLResponseOptions<TResult>,\n): Promise<TResult> {\n let apiVersion = version\n if (!version) {\n apiVersion = await fetchLatestSupportedApiVersion(session)\n }\n const store = await normalizeStoreFqdn(session.storeFqdn)\n const opts = {\n url: adminUrl(store, apiVersion),\n api: 'Admin',\n token: session.token,\n }\n const result = graphqlRequestDoc<TResult, TVariables>({...opts, query, variables, responseOptions})\n return result\n}\n\n/**\n * GraphQL query to retrieve the latest supported API version.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - The latest supported API version.\n */\nasync function fetchLatestSupportedApiVersion(session: AdminSession): Promise<string> {\n const apiVersions = await supportedApiVersions(session)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return apiVersions.reverse()[0]!\n}\n\n/**\n * GraphQL query to retrieve all supported API versions.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - An array of supported API versions.\n */\nexport async function supportedApiVersions(session: AdminSession): Promise<string[]> {\n const apiVersions = await fetchApiVersions(session)\n return apiVersions\n .filter((item) => item.supported)\n .map((item) => item.handle)\n .sort()\n}\n\n/**\n * GraphQL query to retrieve all API versions.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - An array of supported and unsupported API versions.\n */\nasync function fetchApiVersions(session: AdminSession): Promise<ApiVersion[]> {\n try {\n const response = await adminRequestDoc(PublicApiVersions, session, {}, 'unstable', {handleErrors: false})\n return response.publicApiVersions\n } catch (error) {\n if (error instanceof ClientError && error.response.status === 403) {\n const storeName = session.storeFqdn.replace('.myshopify.com', '')\n throw new AbortError(\n outputContent`Looks like you don't have access this dev store: (${outputToken.link(\n storeName,\n `https://${session.storeFqdn}`,\n )})`,\n outputContent`If you're not the owner, create a dev store staff account for yourself`,\n )\n } else if (error instanceof ClientError) {\n throw new BugError(\n `Unknown client error connecting to your store ${session.storeFqdn}: ${error.message} ${error.response.status} ${error.response.data}`,\n )\n } else {\n throw new BugError(\n `Unknown error connecting to your store ${session.storeFqdn}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n }\n}\n\n/**\n * Returns the Admin API URL for the given store and version.\n *\n * @param store - Store FQDN.\n * @param version - API version.\n * @returns - Admin API URL.\n */\nexport function adminUrl(store: string, version: string | undefined): string {\n const realVersion = version ?? 'unstable'\n return `https://${store}/admin/api/${realVersion}/graphql.json`\n}\n\ninterface ApiVersion {\n handle: string\n supported: boolean\n}\n\n/**\n * Executes a REST request against the Admin API.\n *\n * @param method - Request's HTTP method.\n * @param path - Path of the REST resource.\n * @param session - Shopify Admin session including token and Store FQDN.\n * @param requestBody - Request body of including REST resource specific parameters.\n * @param searchParams - Search params, appended to the URL.\n * @param apiVersion - Admin API version.\n * @returns - The {@link RestResponse}.\n */\nexport async function restRequest<T>(\n method: string,\n path: string,\n session: AdminSession,\n requestBody?: T,\n searchParams: {[name: string]: string} = {},\n apiVersion = 'unstable',\n): Promise<RestResponse> {\n const url = restRequestUrl(session, apiVersion, path, searchParams)\n const body = restRequestBody<T>(requestBody)\n\n const headers = restRequestHeaders(session)\n const response = await fetch(url, {\n headers,\n method,\n body,\n })\n\n const json = await response.json().catch(() => ({}))\n\n return {\n json,\n status: response.status,\n headers: response.headers.raw(),\n }\n}\n\n/**\n * Respose of a REST request.\n */\nexport interface RestResponse {\n /**\n * REST JSON respose.\n */\n // Using `any` to avoid introducing extra DTO layers.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n json: any\n\n /**\n * HTTP response status.\n */\n status: number\n\n /**\n * HTTP response headers.\n */\n headers: {[key: string]: string[]}\n}\n"]}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../../src/public/node/api/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,iBAAiB,EAA2C,MAAM,cAAc,CAAA;AAExG,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAC,MAAM,aAAa,CAAA;AAChD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,oBAAoB,GACrB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAChC,OAAO,EAAC,iBAAiB,EAAC,MAAM,iEAAiE,CAAA;AACjG,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAC,WAAW,EAAY,MAAM,iBAAiB,CAAA;AAGtD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAA;AAExD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,KAAa,EAAE,OAAqB,EAAE,SAA4B;IACtG,MAAM,GAAG,GAAG,OAAO,CAAA;IACnB,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC,OAAO,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAChD,OAAO,cAAc,CAAC,EAAC,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAC,CAAC,CAAA;AACzF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA6C,EAC7C,OAAqB,EACrB,SAAsB,EACtB,OAAgB,EAChB,eAAiD;IAEjD,IAAI,UAAU,GAAG,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzE,IAAI,CAAC,UAAU,EAAE;QACf,UAAU,GAAG,MAAM,8BAA8B,CAAC,OAAO,CAAC,CAAA;KAC3D;IACD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzD,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG;QACX,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC;QACzC,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY;KACb,CAAA;IACD,MAAM,MAAM,GAAG,iBAAiB,CAAsB,EAAC,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAA;IACnG,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAqB;IAC/C,OAAO,oBAAoB,CAAC,OAAO,CAAC;QAClC,CAAC,CAAC,EAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,wBAAwB,EAAE,OAAO,CAAC,KAAK,EAAC;QAChF,CAAC,CAAC,EAAE,CAAA;AACR,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,8BAA8B,CAAC,OAAqB;IACjE,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACvD,oEAAoE;IACpE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAE,CAAA;IACxC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACrD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAqB;IAC9D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACnD,OAAO,WAAW;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;SAChC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAA;AACX,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAqB;IACnD,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,iBAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAC,YAAY,EAAE,KAAK,EAAC,CAAC,CAAA;QACzG,OAAO,QAAQ,CAAC,iBAAiB,CAAA;KAClC;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;YACjE,MAAM,IAAI,UAAU,CAClB,aAAa,CAAA,qDAAqD,WAAW,CAAC,IAAI,CAChF,SAAS,EACT,WAAW,OAAO,CAAC,SAAS,EAAE,CAC/B,GAAG,EACJ,aAAa,CAAA,wEAAwE,CACtF,CAAA;SACF;aAAM,IAAI,KAAK,YAAY,WAAW,EAAE;YACvC,MAAM,IAAI,QAAQ,CAChB,iDAAiD,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CACvI,CAAA;SACF;aAAM;YACL,MAAM,IAAI,QAAQ,CAChB,0CAA0C,OAAO,CAAC,SAAS,KACzD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAA;SACF;KACF;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,OAA2B,EAAE,OAAsB;IACzF,MAAM,WAAW,GAAG,OAAO,IAAI,UAAU,CAAA;IAEzC,MAAM,GAAG,GACP,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC;QACtC,CAAC,CAAC,WAAW,oBAAoB,kBAAkB,WAAW,eAAe;QAC7E,CAAC,CAAC,WAAW,KAAK,cAAc,WAAW,eAAe,CAAA;IAC9D,OAAO,GAAG,CAAA;AACZ,CAAC;AAOD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,IAAY,EACZ,OAAqB,EACrB,WAAe,EACf,eAAyC,EAAE,EAC3C,UAAU,GAAG,UAAU;IAEvB,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,eAAe,CAAI,WAAW,CAAC,CAAA;IAE5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO;QACP,MAAM;QACN,IAAI;KACL,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAEpD,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE;KAChC,CAAA;AACH,CAAC","sourcesContent":["import {graphqlRequest, graphqlRequestDoc, GraphQLResponseOptions, GraphQLVariables} from './graphql.js'\nimport {AdminSession} from '../session.js'\nimport {outputContent, outputToken} from '../../../public/node/output.js'\nimport {BugError, AbortError} from '../error.js'\nimport {\n restRequestBody,\n restRequestHeaders,\n restRequestUrl,\n isThemeAccessSession,\n} from '../../../private/node/api/rest.js'\nimport {fetch} from '../http.js'\nimport {PublicApiVersions} from '../../../cli/api/graphql/admin/generated/public_api_versions.js'\nimport {normalizeStoreFqdn} from '../context/fqdn.js'\nimport {themeKitAccessDomain} from '../../../private/node/constants.js'\nimport {ClientError, Variables} from 'graphql-request'\nimport {TypedDocumentNode} from '@graphql-typed-document-node/core'\n\nconst LatestApiVersionByFQDN = new Map<string, string>()\n\n/**\n * Executes a GraphQL query against the Admin API.\n *\n * @param query - GraphQL query to execute.\n * @param session - Shopify admin session including token and Store FQDN.\n * @param variables - GraphQL variables to pass to the query.\n * @returns The response of the query of generic type <T>.\n */\nexport async function adminRequest<T>(query: string, session: AdminSession, variables?: GraphQLVariables): Promise<T> {\n const api = 'Admin'\n const version = await fetchLatestSupportedApiVersion(session)\n const store = await normalizeStoreFqdn(session.storeFqdn)\n const url = adminUrl(store, version, session)\n const addedHeaders = themeAccessHeaders(session)\n return graphqlRequest({query, api, addedHeaders, url, token: session.token, variables})\n}\n\n/**\n * Executes a GraphQL query against the Admin API. Uses typed documents.\n *\n * @param query - GraphQL query to execute.\n * @param session - Shopify admin session including token and Store FQDN.\n * @param variables - GraphQL variables to pass to the query.\n * @param version - API version.\n * @param responseOptions - Control how API responses will be handled.\n * @returns The response of the query of generic type <TResult>.\n */\nexport async function adminRequestDoc<TResult, TVariables extends Variables>(\n query: TypedDocumentNode<TResult, TVariables>,\n session: AdminSession,\n variables?: TVariables,\n version?: string,\n responseOptions?: GraphQLResponseOptions<TResult>,\n): Promise<TResult> {\n let apiVersion = version ?? LatestApiVersionByFQDN.get(session.storeFqdn)\n if (!apiVersion) {\n apiVersion = await fetchLatestSupportedApiVersion(session)\n }\n const store = await normalizeStoreFqdn(session.storeFqdn)\n const addedHeaders = themeAccessHeaders(session)\n const opts = {\n url: adminUrl(store, apiVersion, session),\n api: 'Admin',\n token: session.token,\n addedHeaders,\n }\n const result = graphqlRequestDoc<TResult, TVariables>({...opts, query, variables, responseOptions})\n return result\n}\n\nfunction themeAccessHeaders(session: AdminSession): {[header: string]: string} {\n return isThemeAccessSession(session)\n ? {'X-Shopify-Shop': session.storeFqdn, 'X-Shopify-Access-Token': session.token}\n : {}\n}\n\n/**\n * GraphQL query to retrieve the latest supported API version.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - The latest supported API version.\n */\nasync function fetchLatestSupportedApiVersion(session: AdminSession): Promise<string> {\n const apiVersions = await supportedApiVersions(session)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const latest = apiVersions.reverse()[0]!\n LatestApiVersionByFQDN.set(session.storeFqdn, latest)\n return latest\n}\n\n/**\n * GraphQL query to retrieve all supported API versions.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - An array of supported API versions.\n */\nexport async function supportedApiVersions(session: AdminSession): Promise<string[]> {\n const apiVersions = await fetchApiVersions(session)\n return apiVersions\n .filter((item) => item.supported)\n .map((item) => item.handle)\n .sort()\n}\n\n/**\n * GraphQL query to retrieve all API versions.\n *\n * @param session - Shopify admin session including token and Store FQDN.\n * @returns - An array of supported and unsupported API versions.\n */\nasync function fetchApiVersions(session: AdminSession): Promise<ApiVersion[]> {\n try {\n const response = await adminRequestDoc(PublicApiVersions, session, {}, 'unstable', {handleErrors: false})\n return response.publicApiVersions\n } catch (error) {\n if (error instanceof ClientError && error.response.status === 403) {\n const storeName = session.storeFqdn.replace('.myshopify.com', '')\n throw new AbortError(\n outputContent`Looks like you don't have access this dev store: (${outputToken.link(\n storeName,\n `https://${session.storeFqdn}`,\n )})`,\n outputContent`If you're not the owner, create a dev store staff account for yourself`,\n )\n } else if (error instanceof ClientError) {\n throw new BugError(\n `Unknown client error connecting to your store ${session.storeFqdn}: ${error.message} ${error.response.status} ${error.response.data}`,\n )\n } else {\n throw new BugError(\n `Unknown error connecting to your store ${session.storeFqdn}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n }\n}\n\n/**\n * Returns the Admin API URL for the given store and version.\n *\n * @param store - Store FQDN.\n * @param version - API version.\n * @param session - User session.\n * @returns - Admin API URL.\n */\nexport function adminUrl(store: string, version: string | undefined, session?: AdminSession): string {\n const realVersion = version ?? 'unstable'\n\n const url =\n session && isThemeAccessSession(session)\n ? `https://${themeKitAccessDomain}/cli/admin/api/${realVersion}/graphql.json`\n : `https://${store}/admin/api/${realVersion}/graphql.json`\n return url\n}\n\ninterface ApiVersion {\n handle: string\n supported: boolean\n}\n\n/**\n * Executes a REST request against the Admin API.\n *\n * @param method - Request's HTTP method.\n * @param path - Path of the REST resource.\n * @param session - Shopify Admin session including token and Store FQDN.\n * @param requestBody - Request body of including REST resource specific parameters.\n * @param searchParams - Search params, appended to the URL.\n * @param apiVersion - Admin API version.\n * @returns - The {@link RestResponse}.\n */\nexport async function restRequest<T>(\n method: string,\n path: string,\n session: AdminSession,\n requestBody?: T,\n searchParams: {[name: string]: string} = {},\n apiVersion = 'unstable',\n): Promise<RestResponse> {\n const url = restRequestUrl(session, apiVersion, path, searchParams)\n const body = restRequestBody<T>(requestBody)\n\n const headers = restRequestHeaders(session)\n const response = await fetch(url, {\n headers,\n method,\n body,\n })\n\n const json = await response.json().catch(() => ({}))\n\n return {\n json,\n status: response.status,\n headers: response.headers.raw(),\n }\n}\n\n/**\n * Respose of a REST request.\n */\nexport interface RestResponse {\n /**\n * REST JSON respose.\n */\n // Using `any` to avoid introducing extra DTO layers.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n json: any\n\n /**\n * HTTP response status.\n */\n status: number\n\n /**\n * HTTP response headers.\n */\n headers: {[key: string]: string[]}\n}\n"]}