@shopify/cli-kit 3.39.0 → 3.40.1
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.
- package/assets/cli-ruby/.devcontainer.json +5 -0
- package/assets/cli-ruby/.rubocop.yml +102 -0
- package/assets/cli-ruby/.rubocop_todo.yml +24 -0
- package/assets/cli-ruby/.ruby-version +1 -0
- package/assets/cli-ruby/CHANGELOG.md +634 -0
- package/assets/cli-ruby/CONTRIBUTING.md +3 -0
- package/assets/cli-ruby/Codespace.dockerfile +35 -0
- package/assets/cli-ruby/Gemfile +31 -0
- package/assets/cli-ruby/Gemfile.lock +190 -0
- package/{LICENSE → assets/cli-ruby/LICENSE} +2 -0
- package/assets/cli-ruby/README.md +30 -0
- package/assets/cli-ruby/RELEASING.md +72 -0
- package/assets/cli-ruby/Rakefile +243 -0
- package/assets/cli-ruby/SECURITY.md +59 -0
- package/assets/cli-ruby/Tests.dockerfile +35 -0
- package/assets/cli-ruby/assets/logo.png +0 -0
- package/assets/cli-ruby/bin/console +11 -0
- package/assets/cli-ruby/bin/load_shopify.rb +22 -0
- package/assets/cli-ruby/bin/shopify +60 -0
- package/assets/cli-ruby/bin/shopify.bat +3 -0
- package/assets/cli-ruby/dev.yml +29 -0
- package/assets/cli-ruby/docs/README.md +13 -0
- package/assets/cli-ruby/docs/contributors/testing.md +27 -0
- package/assets/cli-ruby/docs/users/installation.md +3 -0
- package/assets/cli-ruby/docs/users/migrate-from-themekit.md +18 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +1 -0
- package/assets/cli-ruby/ext/javy/javy.rb +204 -0
- package/assets/cli-ruby/ext/javy/version +1 -0
- package/assets/cli-ruby/ext/shopify-extensions/extconf.rb +21 -0
- package/assets/cli-ruby/ext/shopify-extensions/shopify_extensions.rb +152 -0
- package/assets/cli-ruby/ext/shopify-extensions/version +1 -0
- package/assets/cli-ruby/features/support/assertions.rb +17 -0
- package/assets/cli-ruby/features/support/cli.rb +7 -0
- package/assets/cli-ruby/features/support/process.rb +27 -0
- package/assets/cli-ruby/features/support/requires.rb +3 -0
- package/assets/cli-ruby/lib/docgen/class_template.md.erb +81 -0
- package/assets/cli-ruby/lib/docgen/index_template.md.erb +5 -0
- package/assets/cli-ruby/lib/docgen/markdown.rb +101 -0
- package/assets/cli-ruby/lib/graphql/admin_introspection.graphql +87 -0
- package/assets/cli-ruby/lib/graphql/all_organizations.graphql +19 -0
- package/assets/cli-ruby/lib/graphql/all_orgs_with_apps.graphql +30 -0
- package/assets/cli-ruby/lib/graphql/api_versions.graphql +6 -0
- package/assets/cli-ruby/lib/graphql/convert_dev_to_test_store.graphql +10 -0
- package/assets/cli-ruby/lib/graphql/create_app.graphql +20 -0
- package/assets/cli-ruby/lib/graphql/create_customer.graphql +9 -0
- package/assets/cli-ruby/lib/graphql/create_draft_order.graphql +8 -0
- package/assets/cli-ruby/lib/graphql/create_product.graphql +9 -0
- package/assets/cli-ruby/lib/graphql/extension_create.graphql +36 -0
- package/assets/cli-ruby/lib/graphql/extension_update_draft.graphql +18 -0
- package/assets/cli-ruby/lib/graphql/fetch_specifications.graphql +14 -0
- package/assets/cli-ruby/lib/graphql/find_organization.graphql +18 -0
- package/assets/cli-ruby/lib/graphql/find_organization_with_apps.graphql +20 -0
- package/assets/cli-ruby/lib/graphql/get_app_by_api_key.graphql +9 -0
- package/assets/cli-ruby/lib/graphql/get_app_urls.graphql +6 -0
- package/assets/cli-ruby/lib/graphql/get_extension_registrations.graphql +27 -0
- package/assets/cli-ruby/lib/graphql/get_variant_id.graphql +16 -0
- package/assets/cli-ruby/lib/graphql/update_dashboard_urls.graphql +8 -0
- package/assets/cli-ruby/lib/project_types/extension/cli.rb +156 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/build.rb +51 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/check.rb +51 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/connect.rb +35 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/create.rb +100 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/extension_command.rb +29 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/info.rb +86 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/push.rb +112 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/register.rb +67 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/serve.rb +150 -0
- package/assets/cli-ruby/lib/project_types/extension/commands/tunnel.rb +73 -0
- package/assets/cli-ruby/lib/project_types/extension/errors.rb +9 -0
- package/assets/cli-ruby/lib/project_types/extension/extension_project.rb +151 -0
- package/assets/cli-ruby/lib/project_types/extension/extension_project_keys.rb +12 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo.rb +50 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_config.rb +59 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_dependencies.rb +28 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_runtime.rb +15 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_serve.rb +115 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_setup.rb +54 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_step.rb +31 -0
- package/assets/cli-ruby/lib/project_types/extension/features/argo_setup_steps.rb +51 -0
- package/assets/cli-ruby/lib/project_types/extension/features/runtimes/admin.rb +29 -0
- package/assets/cli-ruby/lib/project_types/extension/features/runtimes/base.rb +19 -0
- package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +23 -0
- package/assets/cli-ruby/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +29 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/connect.rb +42 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/create.rb +49 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_name.rb +48 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_registration.rb +55 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_template.rb +37 -0
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
- package/assets/cli-ruby/lib/project_types/extension/loaders/project.rb +50 -0
- package/assets/cli-ruby/lib/project_types/extension/loaders/specification_handler.rb +22 -0
- package/assets/cli-ruby/lib/project_types/extension/messages/message_loading.rb +34 -0
- package/assets/cli-ruby/lib/project_types/extension/messages/messages.rb +292 -0
- package/assets/cli-ruby/lib/project_types/extension/models/app.rb +14 -0
- package/assets/cli-ruby/lib/project_types/extension/models/development_server.rb +77 -0
- package/assets/cli-ruby/lib/project_types/extension/models/development_server_requirements.rb +56 -0
- package/assets/cli-ruby/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
- package/assets/cli-ruby/lib/project_types/extension/models/npm_package.rb +44 -0
- package/assets/cli-ruby/lib/project_types/extension/models/product.rb +12 -0
- package/assets/cli-ruby/lib/project_types/extension/models/registration.rb +20 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/app.rb +13 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/base.rb +31 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/capabilities.rb +11 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development.rb +33 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_renderer.rb +38 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_resource.rb +13 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/extension.rb +46 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/root.rb +21 -0
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/user.rb +10 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification.rb +41 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +29 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +170 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/default.rb +145 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +122 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension.rb +58 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config.rb +33 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config_repository.rb +75 -0
- package/assets/cli-ruby/lib/project_types/extension/models/specifications.rb +89 -0
- package/assets/cli-ruby/lib/project_types/extension/models/validation_error.rb +17 -0
- package/assets/cli-ruby/lib/project_types/extension/models/version.rb +15 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/choose_next_available_port.rb +36 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/configure_features.rb +73 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/configure_options.rb +21 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/convert_server_config.rb +85 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/app_converter.rb +27 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/product_converter.rb +21 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/registration_converter.rb +28 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/validation_error_converter.rb +25 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/version_converter.rb +28 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/create_extension.rb +31 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/ensure_resource_url.rb +39 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/base.rb +15 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/build.rb +30 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/create.rb +30 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/outdated_extension_detection.rb +57 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/serve.rb +36 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/fetch_specifications.rb +21 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/find_npm_packages.rb +106 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/find_package_from_json.rb +37 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_app.rb +22 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_apps.rb +26 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_extensions.rb +33 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_product.rb +22 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/merge_server_config.rb +47 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/update_draft.rb +29 -0
- package/assets/cli-ruby/lib/project_types/extension/tasks/user_errors.rb +45 -0
- package/assets/cli-ruby/lib/project_types/node/cli.rb +12 -0
- package/assets/cli-ruby/lib/project_types/node/forms/create.rb +45 -0
- package/assets/cli-ruby/lib/project_types/node/messages/messages.rb +33 -0
- package/assets/cli-ruby/lib/project_types/php/cli.rb +16 -0
- package/assets/cli-ruby/lib/project_types/php/forms/create.rb +44 -0
- package/assets/cli-ruby/lib/project_types/php/messages/messages.rb +29 -0
- package/assets/cli-ruby/lib/project_types/rails/cli.rb +15 -0
- package/assets/cli-ruby/lib/project_types/rails/forms/create.rb +75 -0
- package/assets/cli-ruby/lib/project_types/rails/gem.rb +110 -0
- package/assets/cli-ruby/lib/project_types/rails/messages/messages.rb +101 -0
- package/assets/cli-ruby/lib/project_types/script/cli.rb +27 -0
- package/assets/cli-ruby/lib/project_types/script/commands/connect.rb +16 -0
- package/assets/cli-ruby/lib/project_types/script/commands/create.rb +24 -0
- package/assets/cli-ruby/lib/project_types/script/commands/javy.rb +24 -0
- package/assets/cli-ruby/lib/project_types/script/commands/push.rb +26 -0
- package/assets/cli-ruby/lib/project_types/script/loaders/project.rb +46 -0
- package/assets/cli-ruby/lib/project_types/script/loaders/specification_handler.rb +22 -0
- package/assets/cli-ruby/lib/project_types/script/messages/messages.rb +11 -0
- package/assets/cli-ruby/lib/project_types/theme/cli.rb +33 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/check.rb +38 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/common/root_helper.rb +93 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/common/shop_helper.rb +13 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/delete.rb +70 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/init.rb +46 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/language_server.rb +18 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/list.rb +33 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/open.rb +73 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/package.rb +73 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/publish.rb +49 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/pull.rb +112 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/push.rb +153 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/serve.rb +88 -0
- package/assets/cli-ruby/lib/project_types/theme/commands/share.rb +62 -0
- package/assets/cli-ruby/lib/project_types/theme/conversions/base_glob.rb +65 -0
- package/assets/cli-ruby/lib/project_types/theme/conversions/ignore_glob.rb +15 -0
- package/assets/cli-ruby/lib/project_types/theme/conversions/include_glob.rb +15 -0
- package/assets/cli-ruby/lib/project_types/theme/forms/confirm_store.rb +15 -0
- package/assets/cli-ruby/lib/project_types/theme/forms/select.rb +34 -0
- package/assets/cli-ruby/lib/project_types/theme/messages/messages.rb +424 -0
- package/assets/cli-ruby/lib/project_types/theme/models/specification_handlers/theme.rb +19 -0
- package/assets/cli-ruby/lib/project_types/theme/presenters/theme_presenter.rb +48 -0
- package/assets/cli-ruby/lib/project_types/theme/presenters/themes_presenter.rb +29 -0
- package/assets/cli-ruby/lib/project_types/theme/ui/sync_progress_bar.rb +20 -0
- package/assets/cli-ruby/lib/rubygems_plugin.rb +26 -0
- package/assets/cli-ruby/lib/shopify_cli/admin_api/populate_resource_command.rb +166 -0
- package/assets/cli-ruby/lib/shopify_cli/admin_api/schema.rb +35 -0
- package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +163 -0
- package/assets/cli-ruby/lib/shopify_cli/api.rb +131 -0
- package/assets/cli-ruby/lib/shopify_cli/app_type_detector.rb +36 -0
- package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/index.html.erb +34 -0
- package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/style.css +58 -0
- package/assets/cli-ruby/lib/shopify_cli/changelog.rb +148 -0
- package/assets/cli-ruby/lib/shopify_cli/command/app_sub_command.rb +26 -0
- package/assets/cli-ruby/lib/shopify_cli/command/project_command.rb +31 -0
- package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +21 -0
- package/assets/cli-ruby/lib/shopify_cli/command.rb +173 -0
- package/assets/cli-ruby/lib/shopify_cli/command_options/command_serve_options.rb +53 -0
- package/assets/cli-ruby/lib/shopify_cli/command_options.rb +7 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/connect.rb +22 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/node.rb +40 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/php.rb +37 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/rails.rb +42 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create.rb +28 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/deploy.rb +51 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/open.rb +19 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/serve.rb +51 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app/tunnel.rb +43 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/app.rb +29 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/config.rb +76 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/help.rb +52 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/login.rb +98 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/logout.rb +50 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/customer.rb +25 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/draft_order.rb +28 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/product.rb +24 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/populate.rb +23 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/reporting.rb +38 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/store.rb +15 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/switch.rb +39 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/system.rb +165 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/version.rb +15 -0
- package/assets/cli-ruby/lib/shopify_cli/commands/whoami.rb +28 -0
- package/assets/cli-ruby/lib/shopify_cli/commands.rb +36 -0
- package/assets/cli-ruby/lib/shopify_cli/connect.rb +32 -0
- package/assets/cli-ruby/lib/shopify_cli/constants.rb +91 -0
- package/assets/cli-ruby/lib/shopify_cli/context.rb +691 -0
- package/assets/cli-ruby/lib/shopify_cli/core/cli_version.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/core/entry_point.rb +64 -0
- package/assets/cli-ruby/lib/shopify_cli/core/executor.rb +23 -0
- package/assets/cli-ruby/lib/shopify_cli/core/finalize.rb +13 -0
- package/assets/cli-ruby/lib/shopify_cli/core/help_resolver.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/core/monorail.rb +122 -0
- package/assets/cli-ruby/lib/shopify_cli/core.rb +9 -0
- package/assets/cli-ruby/lib/shopify_cli/db.rb +114 -0
- package/assets/cli-ruby/lib/shopify_cli/environment.rb +198 -0
- package/assets/cli-ruby/lib/shopify_cli/exception_reporter.rb +79 -0
- package/assets/cli-ruby/lib/shopify_cli/feature.rb +95 -0
- package/assets/cli-ruby/lib/shopify_cli/file_system_listener.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/form.rb +42 -0
- package/assets/cli-ruby/lib/shopify_cli/git.rb +320 -0
- package/assets/cli-ruby/lib/shopify_cli/github/issue_url_generator.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/github.rb +5 -0
- package/assets/cli-ruby/lib/shopify_cli/helpers/haikunator.rb +92 -0
- package/assets/cli-ruby/lib/shopify_cli/helpers.rb +5 -0
- package/assets/cli-ruby/lib/shopify_cli/heroku.rb +140 -0
- package/assets/cli-ruby/lib/shopify_cli/http_request.rb +43 -0
- package/assets/cli-ruby/lib/shopify_cli/identity_auth/env_auth_token.rb +34 -0
- package/assets/cli-ruby/lib/shopify_cli/identity_auth/servlet.rb +44 -0
- package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +333 -0
- package/assets/cli-ruby/lib/shopify_cli/js_deps.rb +110 -0
- package/assets/cli-ruby/lib/shopify_cli/js_system.rb +115 -0
- package/assets/cli-ruby/lib/shopify_cli/lazy_delegator.rb +55 -0
- package/assets/cli-ruby/lib/shopify_cli/messages/messages.rb +863 -0
- package/assets/cli-ruby/lib/shopify_cli/method_object.rb +123 -0
- package/assets/cli-ruby/lib/shopify_cli/migrator/migration.rb +27 -0
- package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
- package/assets/cli-ruby/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +41 -0
- package/assets/cli-ruby/lib/shopify_cli/migrator.rb +46 -0
- package/assets/cli-ruby/lib/shopify_cli/options.rb +40 -0
- package/assets/cli-ruby/lib/shopify_cli/packager.rb +108 -0
- package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions/job.rb +36 -0
- package/assets/cli-ruby/lib/shopify_cli/partners_api/app_extensions.rb +46 -0
- package/assets/cli-ruby/lib/shopify_cli/partners_api/organizations.rb +45 -0
- package/assets/cli-ruby/lib/shopify_cli/partners_api.rb +91 -0
- package/assets/cli-ruby/lib/shopify_cli/php_deps.rb +102 -0
- package/assets/cli-ruby/lib/shopify_cli/process_supervision.rb +228 -0
- package/assets/cli-ruby/lib/shopify_cli/project.rb +199 -0
- package/assets/cli-ruby/lib/shopify_cli/project_commands.rb +16 -0
- package/assets/cli-ruby/lib/shopify_cli/project_type.rb +66 -0
- package/assets/cli-ruby/lib/shopify_cli/release.rb +197 -0
- package/assets/cli-ruby/lib/shopify_cli/reporting_configuration_controller.rb +64 -0
- package/assets/cli-ruby/lib/shopify_cli/resolve_constant.rb +25 -0
- package/assets/cli-ruby/lib/shopify_cli/resources/env_file.rb +108 -0
- package/assets/cli-ruby/lib/shopify_cli/resources.rb +5 -0
- package/assets/cli-ruby/lib/shopify_cli/result.rb +448 -0
- package/assets/cli-ruby/lib/shopify_cli/sed.rb +19 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/connect_service.rb +25 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/node_service.rb +143 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/php_service.rb +147 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/rails_service.rb +239 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +101 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +135 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +120 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/open_service.rb +19 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/node_service.rb +19 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/php_service.rb +23 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/rails_service.rb +28 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/serve_service.rb +57 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/auth_service.rb +21 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/start_service.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/stop_service.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/services/base_service.rb +13 -0
- package/assets/cli-ruby/lib/shopify_cli/services/reporting_service.rb +16 -0
- package/assets/cli-ruby/lib/shopify_cli/services.rb +38 -0
- package/assets/cli-ruby/lib/shopify_cli/shopifolk.rb +81 -0
- package/assets/cli-ruby/lib/shopify_cli/task.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/confirm_store.rb +18 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/create_api_client.rb +40 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_authenticated.rb +19 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_dev_store.rb +41 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_env.rb +90 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_git_dependency.rb +14 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_loopback_url.rb +20 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/ensure_project_type.rb +14 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/select_org_and_shop.rb +81 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks/update_dashboard_urls.rb +57 -0
- package/assets/cli-ruby/lib/shopify_cli/tasks.rb +44 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/backoff_helper.rb +47 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +73 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/certificate_manager.rb +79 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/errors.rb +9 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/header_hash.rb +98 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hooks/file_change_hook.rb +77 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb +62 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +63 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/hot_reload.js +48 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme.js +114 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/resources/theme_extension.js +121 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/script_injector.rb +57 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb +50 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/hot_reload.rb +68 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/local_assets.rb +87 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +246 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy_param_builder.rb +82 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/reload_mode.rb +34 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +35 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/remote_watcher.rb +44 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/sse.rb +75 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/watcher.rb +61 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/web_server.rb +140 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server.rb +320 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/development_theme.rb +101 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/app_extension.rb +40 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hooks/file_change_hook.rb +68 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload/script_injector.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/hot_reload.rb +13 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/local_assets.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/proxy_param_builder.rb +94 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server/watcher.rb +47 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server.rb +150 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/host_theme.rb +104 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/extension_serve_job.rb +133 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer/operation.rb +21 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/syncer.rb +81 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/extension/ui/host_theme_progress_bar.rb +35 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/file.rb +149 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/filter/path_matcher.rb +38 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/ignore_filter.rb +112 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/ignore_helper.rb +37 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/include_filter.rb +67 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/mime_type.rb +34 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/root.rb +62 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/checksums.rb +66 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/downloader.rb +63 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/error_reporter.rb +45 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/merger.rb +53 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/operation.rb +57 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/standard_reporter.rb +32 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/unsupported_script_warning.rb +90 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk.rb +133 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_item.rb +64 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_job.rb +139 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/bulk_request.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer/uploader.rb +231 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/syncer.rb +386 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/theme.rb +212 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/theme_access_api.rb +89 -0
- package/assets/cli-ruby/lib/shopify_cli/theme/theme_admin_api.rb +101 -0
- package/assets/cli-ruby/lib/shopify_cli/thread_pool/job.rb +35 -0
- package/assets/cli-ruby/lib/shopify_cli/thread_pool.rb +49 -0
- package/assets/cli-ruby/lib/shopify_cli/transform_data_structure.rb +87 -0
- package/assets/cli-ruby/lib/shopify_cli/tunnel.rb +255 -0
- package/assets/cli-ruby/lib/shopify_cli/utilities.rb +21 -0
- package/assets/cli-ruby/lib/shopify_cli/version.rb +3 -0
- package/assets/cli-ruby/lib/shopify_cli.rb +191 -0
- package/assets/cli-ruby/shipit.rubygems.yml +3 -0
- package/assets/cli-ruby/shopify-cli.gemspec +54 -0
- package/assets/cli-ruby/shopify-dev +16 -0
- package/assets/cli-ruby/test/minitest_ext.rb +115 -0
- package/assets/cli-ruby/test/project_types/extension/extension_test_helpers.rb +70 -0
- package/assets/cli-ruby/test/shopify-cli/migrator/migrations/migration_helper.rb +20 -0
- package/assets/cli-ruby/test/test_helpers.rb +18 -0
- package/assets/cli-ruby/utilities/constants.rb +7 -0
- package/assets/cli-ruby/utilities/docker/container.rb +104 -0
- package/assets/cli-ruby/utilities/docker.rb +89 -0
- package/assets/cli-ruby/utilities/utilities.rb +6 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/REVISION +1 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +21 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +49 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +94 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/config.rb +133 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +123 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/executor.rb +79 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ini.rb +102 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +82 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/logger.rb +82 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +60 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/ruby_backports/enumerable.rb +6 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +244 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/support.rb +9 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/system.rb +243 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/util.rb +193 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit/version.rb +5 -0
- package/assets/cli-ruby/vendor/deps/cli-kit/lib/cli/kit.rb +60 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/REVISION +1 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +157 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/color.rb +84 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +192 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +98 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +166 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +139 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +120 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/frame.rb +269 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +84 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/os.rb +73 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/printer.rb +59 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/progress.rb +90 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +484 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +29 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +282 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +40 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +263 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +66 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +232 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +46 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +102 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/version.rb +5 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +27 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +61 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +77 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
- package/assets/cli-ruby/vendor/deps/cli-ui/lib/cli/ui.rb +233 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/LICENSE +22 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/README.md +67 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/Rakefile +54 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +57 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +18 -0
- package/assets/cli-ruby/vendor/deps/ruby2_keywords/test/test_keyword.rb +41 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/REVISION +1 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/errors.rb +114 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property.rb +168 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/property_collection.rb +83 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations/ancestor.rb +27 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/validations.rb +8 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties/version.rb +3 -0
- package/assets/cli-ruby/vendor/deps/smart_properties/lib/smart_properties.rb +174 -0
- package/assets/cli-ruby/vendor/deps/webrick/Gemfile +3 -0
- package/assets/cli-ruby/vendor/deps/webrick/LICENSE.txt +22 -0
- package/assets/cli-ruby/vendor/deps/webrick/README.md +61 -0
- package/assets/cli-ruby/vendor/deps/webrick/Rakefile +10 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/config.rb +158 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/https.rb +152 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/log.rb +156 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/server.rb +381 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick/version.rb +18 -0
- package/assets/cli-ruby/vendor/deps/webrick/lib/webrick.rb +232 -0
- package/assets/cli-ruby/vendor/deps/webrick/webrick.gemspec +74 -0
- package/assets/cli-ruby/vendor/gen/lib/gen/commands/help.rb +20 -0
- package/assets/cli-ruby/vendor/gen/lib/gen/commands/new.rb +21 -0
- package/assets/cli-ruby/vendor/gen/lib/gen/commands.rb +18 -0
- package/assets/cli-ruby/vendor/gen/lib/gen/entry_point.rb +10 -0
- package/assets/cli-ruby/vendor/gen/lib/gen/generator.rb +165 -0
- package/assets/cli-ruby/vendor/gen/lib/gen.rb +39 -0
- package/assets/cli-ruby/vendor/gen/template/Gemfile +10 -0
- package/assets/cli-ruby/vendor/gen/template/README.md +1 -0
- package/assets/cli-ruby/vendor/gen/template/bin/testunit +23 -0
- package/assets/cli-ruby/vendor/gen/template/bin/update-deps +97 -0
- package/assets/cli-ruby/vendor/gen/template/dev-gems.yml +3 -0
- package/assets/cli-ruby/vendor/gen/template/dev-vendor.yml +4 -0
- package/assets/cli-ruby/vendor/gen/template/exe/__app__-gems +17 -0
- package/assets/cli-ruby/vendor/gen/template/exe/__app__-vendor +18 -0
- package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/example.rb +19 -0
- package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands/help.rb +21 -0
- package/assets/cli-ruby/vendor/gen/template/lib/__app__/commands.rb +18 -0
- package/assets/cli-ruby/vendor/gen/template/lib/__app__/entry_point.rb +10 -0
- package/assets/cli-ruby/vendor/gen/template/lib/__app__.rb +33 -0
- package/assets/cli-ruby/vendor/gen/template/test/example_test.rb +17 -0
- package/assets/cli-ruby/vendor/gen/template/test/test_helper.rb +22 -0
- package/assets/cli-ruby/vendor/lib/semantic/LICENSE +20 -0
- package/assets/cli-ruby/vendor/lib/semantic/semantic.rb +4 -0
- package/assets/cli-ruby/vendor/lib/semantic/version.rb +179 -0
- package/dist/private/node/analytics.js +1 -1
- package/dist/private/node/analytics.js.map +1 -1
- package/dist/private/node/api/headers.js +2 -2
- package/dist/private/node/api/headers.js.map +1 -1
- package/dist/private/node/constants.d.ts +1 -1
- package/dist/private/node/constants.js +1 -1
- package/dist/private/node/constants.js.map +1 -1
- package/dist/private/node/{environment → context}/service.d.ts +0 -0
- package/dist/private/node/{environment → context}/service.js +1 -1
- package/dist/private/node/context/service.js.map +1 -0
- package/dist/private/node/{environment → context}/spin-cache.d.ts +0 -0
- package/dist/private/node/{environment → context}/spin-cache.js +0 -0
- package/dist/private/node/context/spin-cache.js.map +1 -0
- package/dist/private/node/{environment → context}/utilities.d.ts +0 -0
- package/dist/private/node/{environment → context}/utilities.js +0 -0
- package/dist/private/node/context/utilities.js.map +1 -0
- package/dist/private/node/session/authorize.js +13 -3
- package/dist/private/node/session/authorize.js.map +1 -1
- package/dist/private/node/session/device-authorization.js +1 -1
- package/dist/private/node/session/device-authorization.js.map +1 -1
- package/dist/private/node/session/exchange.js +1 -1
- package/dist/private/node/session/exchange.js.map +1 -1
- package/dist/private/node/session/identity-token-validation.js +1 -1
- package/dist/private/node/session/identity-token-validation.js.map +1 -1
- package/dist/private/node/session/identity.js +1 -1
- package/dist/private/node/session/identity.js.map +1 -1
- package/dist/private/node/session/validate.js +1 -1
- package/dist/private/node/session/validate.js.map +1 -1
- package/dist/private/node/session.js +3 -3
- package/dist/private/node/session.js.map +1 -1
- package/dist/private/node/testing/ui.d.ts +31 -0
- package/dist/private/node/testing/ui.js +32 -1
- package/dist/private/node/testing/ui.js.map +1 -1
- package/dist/private/node/ui/components/Alert.d.ts +7 -7
- package/dist/private/node/ui/components/Alert.js +14 -13
- package/dist/private/node/ui/components/Alert.js.map +1 -1
- package/dist/private/node/ui/components/Alert.test.js +18 -4
- package/dist/private/node/ui/components/Alert.test.js.map +1 -1
- package/dist/private/node/ui/components/AutocompletePrompt.d.ts +5 -5
- package/dist/private/node/ui/components/AutocompletePrompt.js +10 -8
- package/dist/private/node/ui/components/AutocompletePrompt.js.map +1 -1
- package/dist/private/node/ui/components/AutocompletePrompt.test.js.map +1 -1
- package/dist/private/node/ui/components/Banner.d.ts +3 -3
- package/dist/private/node/ui/components/Banner.js.map +1 -1
- package/dist/private/node/ui/components/Command.d.ts +3 -3
- package/dist/private/node/ui/components/Command.js.map +1 -1
- package/dist/private/node/ui/components/ConcurrentOutput.d.ts +9 -3
- package/dist/private/node/ui/components/ConcurrentOutput.js +31 -16
- package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
- package/dist/private/node/ui/components/ConcurrentOutput.test.js +36 -12
- package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
- package/dist/private/node/ui/components/FatalError.d.ts +2 -2
- package/dist/private/node/ui/components/FatalError.js +10 -10
- package/dist/private/node/ui/components/FatalError.js.map +1 -1
- package/dist/private/node/ui/components/FilePath.d.ts +3 -3
- package/dist/private/node/ui/components/FilePath.js +1 -4
- package/dist/private/node/ui/components/FilePath.js.map +1 -1
- package/dist/private/node/ui/components/FilePath.test.js +1 -1
- package/dist/private/node/ui/components/FilePath.test.js.map +1 -1
- package/dist/private/node/ui/components/FullScreen.d.ts +3 -3
- package/dist/private/node/ui/components/FullScreen.js +1 -1
- package/dist/private/node/ui/components/FullScreen.js.map +1 -1
- package/dist/private/node/ui/components/Link.d.ts +3 -3
- package/dist/private/node/ui/components/Link.js.map +1 -1
- package/dist/private/node/ui/components/List.d.ts +6 -5
- package/dist/private/node/ui/components/List.js +4 -3
- package/dist/private/node/ui/components/List.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/InfoTable.d.ts +6 -5
- package/dist/private/node/ui/components/Prompts/InfoTable.js +5 -5
- package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/InfoTable.test.d.ts +1 -0
- package/dist/private/node/ui/components/Prompts/InfoTable.test.js +29 -0
- package/dist/private/node/ui/components/Prompts/InfoTable.test.js.map +1 -0
- package/dist/private/node/ui/components/SelectInput.d.ts +9 -3
- package/dist/private/node/ui/components/SelectInput.js +24 -17
- package/dist/private/node/ui/components/SelectInput.js.map +1 -1
- package/dist/private/node/ui/components/SelectInput.test.js +36 -8
- package/dist/private/node/ui/components/SelectInput.test.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.d.ts +8 -7
- package/dist/private/node/ui/components/SelectPrompt.js +22 -13
- package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.test.js +27 -2
- package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
- package/dist/private/node/ui/components/Subdued.d.ts +3 -3
- package/dist/private/node/ui/components/Subdued.js.map +1 -1
- package/dist/private/node/ui/components/Table/Row.d.ts +2 -2
- package/dist/private/node/ui/components/Table/Row.js +3 -2
- package/dist/private/node/ui/components/Table/Row.js.map +1 -1
- package/dist/private/node/ui/components/Table/Table.d.ts +10 -7
- package/dist/private/node/ui/components/Table/Table.js +3 -1
- package/dist/private/node/ui/components/Table/Table.js.map +1 -1
- package/dist/private/node/ui/components/Table/Table.test.js +1 -1
- package/dist/private/node/ui/components/Table/Table.test.js.map +1 -1
- package/dist/private/node/ui/components/Tasks.d.ts +2 -2
- package/dist/private/node/ui/components/Tasks.js +2 -1
- package/dist/private/node/ui/components/Tasks.js.map +1 -1
- package/dist/private/node/ui/components/Tasks.test.js +1 -1
- package/dist/private/node/ui/components/Tasks.test.js.map +1 -1
- package/dist/private/node/ui/components/TextAnimation.d.ts +3 -3
- package/dist/private/node/ui/components/TextAnimation.js.map +1 -1
- package/dist/private/node/ui/components/TextInput.d.ts +3 -3
- package/dist/private/node/ui/components/TextInput.js +1 -2
- package/dist/private/node/ui/components/TextInput.js.map +1 -1
- package/dist/private/node/ui/components/TextInput.test.js +1 -1
- package/dist/private/node/ui/components/TextInput.test.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.d.ts +3 -3
- package/dist/private/node/ui/components/TextPrompt.js +5 -4
- package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.test.js +2 -2
- package/dist/private/node/ui/components/TextPrompt.test.js.map +1 -1
- package/dist/private/node/ui/components/TextWithBackground.d.ts +12 -0
- package/dist/private/node/ui/components/TextWithBackground.js +39 -0
- package/dist/private/node/ui/components/TextWithBackground.js.map +1 -0
- package/dist/private/node/ui/components/TokenizedText.d.ts +17 -13
- package/dist/private/node/ui/components/TokenizedText.js +24 -6
- package/dist/private/node/ui/components/TokenizedText.js.map +1 -1
- package/dist/private/node/ui/components/TokenizedText.test.js +7 -2
- package/dist/private/node/ui/components/TokenizedText.test.js.map +1 -1
- package/dist/private/node/ui/components/UserInput.d.ts +3 -3
- package/dist/private/node/ui/components/UserInput.js.map +1 -1
- package/dist/private/node/ui/hooks/use-async-and-unmount.d.ts +1 -1
- package/dist/private/node/ui/hooks/use-async-and-unmount.js +1 -1
- package/dist/private/node/ui/hooks/use-async-and-unmount.js.map +1 -1
- package/dist/private/node/ui/hooks/use-layout.d.ts +1 -0
- package/dist/private/node/ui/hooks/use-layout.js +1 -0
- package/dist/private/node/ui/hooks/use-layout.js.map +1 -1
- package/dist/private/node/ui/utilities.d.ts +1 -1
- package/dist/private/node/ui.js +3 -2
- package/dist/private/node/ui.js.map +1 -1
- package/dist/public/common/string.d.ts +2 -2
- package/dist/public/common/string.js.map +1 -1
- package/dist/public/common/version.d.ts +1 -1
- package/dist/public/common/version.js +1 -1
- package/dist/public/common/version.js.map +1 -1
- package/dist/public/node/analytics.js +1 -1
- package/dist/public/node/analytics.js.map +1 -1
- package/dist/public/node/api/partners.js +1 -1
- package/dist/public/node/api/partners.js.map +1 -1
- package/dist/public/node/base-command.d.ts +3 -3
- package/dist/public/node/base-command.js +33 -31
- package/dist/public/node/base-command.js.map +1 -1
- package/dist/public/node/cli.d.ts +1 -1
- package/dist/public/node/cli.js +6 -5
- package/dist/public/node/cli.js.map +1 -1
- package/dist/public/node/{environment → context}/fqdn.d.ts +0 -0
- package/dist/public/node/{environment → context}/fqdn.js +1 -1
- package/dist/public/node/context/fqdn.js.map +1 -0
- package/dist/public/node/{environment → context}/local.d.ts +3 -3
- package/dist/public/node/{environment → context}/local.js +6 -6
- package/dist/public/node/context/local.js.map +1 -0
- package/dist/public/node/{environment → context}/spin.d.ts +0 -0
- package/dist/public/node/{environment → context}/spin.js +3 -3
- package/dist/public/node/context/spin.js.map +1 -0
- package/dist/public/node/environments.d.ts +15 -0
- package/dist/public/node/environments.js +33 -0
- package/dist/public/node/environments.js.map +1 -0
- package/dist/public/node/error.d.ts +5 -5
- package/dist/public/node/error.js.map +1 -1
- package/dist/public/node/git.js +1 -1
- package/dist/public/node/git.js.map +1 -1
- package/dist/public/node/hooks/postrun.d.ts +1 -1
- package/dist/public/node/hooks/postrun.js +1 -1
- package/dist/public/node/hooks/postrun.js.map +1 -1
- package/dist/public/node/http.d.ts +1 -0
- package/dist/public/node/http.js +1 -0
- package/dist/public/node/http.js.map +1 -1
- package/dist/public/node/metadata.js +1 -1
- package/dist/public/node/metadata.js.map +1 -1
- package/dist/public/node/output.js +1 -1
- package/dist/public/node/output.js.map +1 -1
- package/dist/public/node/ruby.d.ts +1 -0
- package/dist/public/node/ruby.js +43 -20
- package/dist/public/node/ruby.js.map +1 -1
- package/dist/public/node/session.js +1 -1
- package/dist/public/node/session.js.map +1 -1
- package/dist/public/node/themes/generate-theme-name.d.ts +1 -0
- package/dist/public/node/themes/generate-theme-name.js +13 -0
- package/dist/public/node/themes/generate-theme-name.js.map +1 -0
- package/dist/public/node/themes/models/theme.d.ts +11 -0
- package/dist/public/node/themes/models/theme.js +29 -0
- package/dist/public/node/themes/models/theme.js.map +1 -0
- package/dist/public/node/themes/replace-invalid-characters.d.ts +1 -0
- package/dist/public/node/themes/replace-invalid-characters.js +6 -0
- package/dist/public/node/themes/replace-invalid-characters.js.map +1 -0
- package/dist/public/node/themes/theme-manager.d.ts +13 -0
- package/dist/public/node/themes/theme-manager.js +40 -0
- package/dist/public/node/themes/theme-manager.js.map +1 -0
- package/dist/public/node/themes/theme-urls.d.ts +5 -0
- package/dist/public/node/themes/theme-urls.js +16 -0
- package/dist/public/node/themes/theme-urls.js.map +1 -0
- package/dist/public/node/themes/themes-api/headers.d.ts +3 -0
- package/dist/public/node/themes/themes-api/headers.js +29 -0
- package/dist/public/node/themes/themes-api/headers.js.map +1 -0
- package/dist/public/node/themes/themes-api/retry.d.ts +1 -0
- package/dist/public/node/themes/themes-api/retry.js +6 -0
- package/dist/public/node/themes/themes-api/retry.js.map +1 -0
- package/dist/public/node/themes/themes-api/throttler.d.ts +2 -0
- package/dist/public/node/themes/themes-api/throttler.js +82 -0
- package/dist/public/node/themes/themes-api/throttler.js.map +1 -0
- package/dist/public/node/themes/themes-api.d.ts +9 -0
- package/dist/public/node/themes/themes-api.js +85 -0
- package/dist/public/node/themes/themes-api.js.map +1 -0
- package/dist/public/node/ui.d.ts +25 -26
- package/dist/public/node/ui.js +47 -5
- package/dist/public/node/ui.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -5
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/private/node/environment/service.js.map +0 -1
- package/dist/private/node/environment/spin-cache.js.map +0 -1
- package/dist/private/node/environment/utilities.js.map +0 -1
- package/dist/public/node/environment/fqdn.js.map +0 -1
- package/dist/public/node/environment/local.js.map +0 -1
- package/dist/public/node/environment/spin.js.map +0 -1
- package/dist/public/node/presets.d.ts +0 -8
- package/dist/public/node/presets.js +0 -26
- package/dist/public/node/presets.js.map +0 -1
- package/dist/ui/executor.d.ts +0 -2
- package/dist/ui/executor.js +0 -56
- package/dist/ui/executor.js.map +0 -1
- package/dist/ui.d.ts +0 -40
- package/dist/ui.js +0 -91
- package/dist/ui.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {coerceSemverVersion} from './semver.js'\nimport {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.js'\nimport {pathConstants} from '../../private/node/constants.js'\nimport {AdminSession} from '../../public/node/session.js'\nimport {outputContent, outputToken} from '../../public/node/output.js'\nimport {isTruthy} from '../../private/node/environment/utilities.js'\nimport {Writable} from 'stream'\n\nconst RubyCLIVersion = '2.34.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.8'\nconst MinRubyVersion = '2.7.5'\n\ninterface ExecCLI2Options {\n // Contains token and store to pass to CLI 2.0, which will be set as environment variables\n adminSession?: AdminSession\n // Contains token for storefront access to pass to CLI 2.0 as environment variable\n storefrontToken?: string\n // Contains token for partners access to pass to CLI 2.0 as environment variable\n token?: string\n // Directory in which to execute the command. Otherwise the current directory will be used.\n directory?: string\n // A signal to stop the process execution.\n signal?: AbortSignal\n // Stream to pipe the command's stdout to.\n stdout?: Writable\n}\n/**\n * Execute CLI 2.0 commands.\n * Installs a version of RubyCLI as a vendor dependency in a hidden folder in the system.\n * User must have a valid ruby+bundler environment to run any command.\n *\n * @param args - List of argumets to execute. (ex: ['theme', 'pull']).\n * @param options - Options to customize the execution of cli2.\n */\nexport async function execCLI2(args: string[], options: ExecCLI2Options = {}): Promise<void> {\n await installCLIDependencies(options.stdout ?? process.stdout)\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN: options.storefrontToken,\n SHOPIFY_CLI_ADMIN_AUTH_TOKEN: options.adminSession?.token,\n SHOPIFY_SHOP: options.adminSession?.storeFqdn,\n SHOPIFY_CLI_AUTH_TOKEN: options.token,\n SHOPIFY_CLI_RUN_AS_SUBPROCESS: 'true',\n // Bundler uses this Gemfile to understand which gems are available in the\n // environment. We use this to specify our own Gemfile for CLI2, which exists\n // outside the user's project directory.\n BUNDLE_GEMFILE: joinPath(shopifyCLIDirectory(), 'Gemfile'),\n }\n\n try {\n await exec(bundleExecutable(), ['exec', 'shopify'].concat(args), {\n stdio: 'inherit',\n cwd: options.directory ?? cwd(),\n env,\n signal: options.signal,\n })\n } catch (error) {\n // CLI2 will show it's own errors, we don't need to show an additional CLI3 error\n throw new AbortSilentError()\n }\n}\n\ninterface ExecThemeCheckCLIOptions {\n /** A list of directories in which theme-check should run. */\n directories: string[]\n /** Arguments to pass to the theme-check CLI. */\n args?: string[]\n /** Writable to send standard output content through. */\n stdout: Writable\n /** Writable to send standard error content through. */\n stderr: Writable\n}\n\n/**\n * A function that installs (if needed) and runs the theme-check CLI.\n *\n * @param options - Options to customize the execution of theme-check.\n * @returns A promise that resolves or rejects depending on the result of the underlying theme-check process.\n */\nexport async function execThemeCheckCLI(options: ExecThemeCheckCLIOptions): Promise<void[]> {\n await installThemeCheckCLIDependencies(options.stdout)\n\n const processes = options.directories.map(async (directory): Promise<void> => {\n // Check that there are files aside from the extension TOML config file,\n // otherwise theme-check will return a false failure.\n const files = await file.glob(joinPath(directory, '/**/*'))\n const fileCount = files.filter((file) => !file.match(/\\.toml$/)).length\n if (fileCount === 0) return\n\n const customStderr = new Writable({\n write(chunk, ...args) {\n // For some reason, theme-check reports this initial status line to stderr\n // See https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/diagnostics_engine.rb#L31\n // which leads to https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/io_messenger.rb#L65\n if (chunk.toString('ascii').match(/^Checking/)) {\n options.stdout.write(chunk, ...args)\n } else {\n options.stderr.write(chunk, ...args)\n }\n },\n })\n await exec(bundleExecutable(), ['exec', 'theme-check'].concat([directory, ...(options.args || [])]), {\n stdout: options.stdout,\n stderr: customStderr,\n cwd: themeCheckDirectory(),\n })\n })\n return Promise.all(processes)\n}\n\n/**\n * Validate Ruby Enviroment\n * Install Theme Check CLI and its dependencies\n * Shows a loading message if it's the first time installing dependencies\n * or if we are installing a new version of Theme Check CLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n */\nasync function installThemeCheckCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(themeCheckDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n await validateRubyEnv()\n await createThemeCheckCLIWorkingDirectory()\n await createThemeCheckGemfile()\n await bundleInstallThemeCheck()\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * Validate Ruby Enviroment\n * Install RubyCLI and its dependencies\n * Shows a loading spinner if it's the first time installing dependencies\n * or if we are installing a new version of RubyCLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n */\nasync function installCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(shopifyCLIDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = isTruthy(process.env.SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI()\n } else {\n await createShopifyCLIWorkingDirectory()\n await createShopifyCLIGemfile()\n await bundleInstallShopifyCLI()\n }\n\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby and Bundler.\n */\nasync function validateRubyEnv() {\n await validateRuby()\n await validateBundler()\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby.\n */\nasync function validateRuby() {\n let version\n try {\n const stdout = await captureOutput(rubyExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Ruby environment not found',\n `Make sure you have Ruby installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n\n const isValid = version?.compare(MinRubyVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Ruby version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `Make sure you have at least Ruby ${\n outputContent`${outputToken.yellow(MinRubyVersion)}`.value\n } installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Bundler.\n */\nasync function validateBundler() {\n let version\n try {\n const stdout = await captureOutput(bundleExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Bundler not found',\n `To install the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n\n const isValid = version?.compare(MinBundlerVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Bundler version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `To update to the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n}\n\n/**\n * It creates the directory where the Ruby CLI will be downloaded along its dependencies.\n */\nasync function createShopifyCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(shopifyCLIDirectory())\n}\n\n/**\n * It creates the directory where the theme-check CLI will be downloaded along its dependencies.\n */\nasync function createThemeCheckCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(themeCheckDirectory())\n}\n\n/**\n * It creates the Gemfile to install The Ruby CLI and the dependencies.\n */\nasync function createShopifyCLIGemfile(): Promise<void> {\n const gemPath = joinPath(shopifyCLIDirectory(), 'Gemfile')\n const gemFileContent = [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n const {platform} = platformAndArch()\n if (platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n gemFileContent.push(\"gem 'wdm', '>= 0.1.0'\")\n }\n await file.writeFile(gemPath, gemFileContent.join('\\n'))\n}\n\n/**\n * It creates the Gemfile to install theme-check and its dependencies.\n */\nasync function createThemeCheckGemfile(): Promise<void> {\n const gemPath = joinPath(themeCheckDirectory(), 'Gemfile')\n await file.writeFile(gemPath, `source 'https://rubygems.org'\\ngem 'theme-check', '${ThemeCheckVersion}'`)\n}\n\n/**\n * It runs bundle install for the dev-managed copy of the Ruby CLI.\n */\nasync function bundleInstallLocalShopifyCLI(): Promise<void> {\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', shopifyCLIDirectory()], {\n cwd: shopifyCLIDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', themeCheckDirectory()], {\n cwd: themeCheckDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: themeCheckDirectory()})\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @returns The absolute path to the directory.\n */\nfunction shopifyCLIDirectory(): string {\n return (\n process.env.SHOPIFY_CLI_2_0_DIRECTORY ??\n joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n )\n}\n\n/**\n * It returns the path to the directory containing the theme-check CLI.\n *\n * @returns The absolute path to the theme-check directory.\n */\nfunction themeCheckDirectory(): string {\n return joinPath(pathConstants.directories.cache.vendor.path(), 'theme-check', ThemeCheckVersion)\n}\n\n/**\n * It returns the Ruby version present in the envirronment.\n */\nexport async function version(): Promise<string | undefined> {\n const parseOutput = (version: string) => version.match(/ruby (\\d+\\.\\d+\\.\\d+)/)?.[1]\n return captureOutput(rubyExecutable(), ['-v'])\n .then(parseOutput)\n .catch(() => undefined)\n}\n\n/**\n * It returns the Ruby binary path set through the environment variable SHOPIFY_RUBY_BINDIR.\n * This is useful when the CLI is managed by an installer like a Homebrew where we need to\n * point the CLI to the Ruby installation managed by Homebrew.\n *\n * @returns The value of the environment variable.\n */\nfunction getRubyBinDir(): string | undefined {\n return process.env.SHOPIFY_RUBY_BINDIR\n}\n\n/**\n * It returns the path to the \"ruby\" executable.\n *\n * @returns The path to the executable.\n */\nfunction rubyExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'ruby') : 'ruby'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nfunction bundleExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'bundle') : 'bundle'\n}\n\n/**\n * It returns the path to the \"gem\"\" executable.\n *\n * @returns The path to the executable.\n */\nfunction gemExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'gem') : 'gem'\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {coerceSemverVersion} from './semver.js'\nimport {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, dirname, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.js'\nimport {pathConstants} from '../../private/node/constants.js'\nimport {AdminSession} from '../../public/node/session.js'\nimport {outputContent, outputToken} from '../../public/node/output.js'\nimport {isTruthy} from '../../private/node/context/utilities.js'\nimport {Writable} from 'stream'\nimport {fileURLToPath} from 'url'\n\nexport const RubyCLIVersion = '2.34.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.8'\nconst MinRubyVersion = '2.7.5'\n\ninterface ExecCLI2Options {\n // Contains token and store to pass to CLI 2.0, which will be set as environment variables\n adminSession?: AdminSession\n // Contains token for storefront access to pass to CLI 2.0 as environment variable\n storefrontToken?: string\n // Contains token for partners access to pass to CLI 2.0 as environment variable\n token?: string\n // Directory in which to execute the command. Otherwise the current directory will be used.\n directory?: string\n // A signal to stop the process execution.\n signal?: AbortSignal\n // Stream to pipe the command's stdout to.\n stdout?: Writable\n}\n/**\n * Execute CLI 2.0 commands.\n * Installs a version of RubyCLI as a vendor dependency in a hidden folder in the system.\n * User must have a valid ruby+bundler environment to run any command.\n *\n * @param args - List of argumets to execute. (ex: ['theme', 'pull']).\n * @param options - Options to customize the execution of cli2.\n */\nexport async function execCLI2(args: string[], options: ExecCLI2Options = {}): Promise<void> {\n const embedded = !isTruthy(process.env.SHOPIFY_CLI_BUNDLED_THEME_CLI) && !process.env.SHOPIFY_CLI_2_0_DIRECTORY\n\n await installCLIDependencies(options.stdout ?? process.stdout, embedded)\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN: options.storefrontToken,\n SHOPIFY_CLI_ADMIN_AUTH_TOKEN: options.adminSession?.token,\n SHOPIFY_SHOP: options.adminSession?.storeFqdn,\n SHOPIFY_CLI_AUTH_TOKEN: options.token,\n SHOPIFY_CLI_RUN_AS_SUBPROCESS: 'true',\n // Bundler uses this Gemfile to understand which gems are available in the\n // environment. We use this to specify our own Gemfile for CLI2, which exists\n // outside the user's project directory.\n BUNDLE_GEMFILE: joinPath(await shopifyCLIDirectory(embedded), 'Gemfile'),\n }\n\n try {\n const executable = embedded ? await embeddedCLIExecutable() : bundleExecutable()\n const finalArgs = embedded ? args : ['exec', 'shopify'].concat(args)\n\n await exec(executable, finalArgs, {\n stdio: 'inherit',\n cwd: options.directory ?? cwd(),\n env,\n signal: options.signal,\n })\n } catch (error) {\n // CLI2 will show it's own errors, we don't need to show an additional CLI3 error\n throw new AbortSilentError()\n }\n}\n\ninterface ExecThemeCheckCLIOptions {\n /** A list of directories in which theme-check should run. */\n directories: string[]\n /** Arguments to pass to the theme-check CLI. */\n args?: string[]\n /** Writable to send standard output content through. */\n stdout: Writable\n /** Writable to send standard error content through. */\n stderr: Writable\n}\n\n/**\n * A function that installs (if needed) and runs the theme-check CLI.\n *\n * @param options - Options to customize the execution of theme-check.\n * @returns A promise that resolves or rejects depending on the result of the underlying theme-check process.\n */\nexport async function execThemeCheckCLI(options: ExecThemeCheckCLIOptions): Promise<void[]> {\n await installThemeCheckCLIDependencies(options.stdout)\n\n const processes = options.directories.map(async (directory): Promise<void> => {\n // Check that there are files aside from the extension TOML config file,\n // otherwise theme-check will return a false failure.\n const files = await file.glob(joinPath(directory, '/**/*'))\n const fileCount = files.filter((file) => !file.match(/\\.toml$/)).length\n if (fileCount === 0) return\n\n const customStderr = new Writable({\n write(chunk, ...args) {\n // For some reason, theme-check reports this initial status line to stderr\n // See https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/diagnostics_engine.rb#L31\n // which leads to https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/io_messenger.rb#L65\n if (chunk.toString('ascii').match(/^Checking/)) {\n options.stdout.write(chunk, ...args)\n } else {\n options.stderr.write(chunk, ...args)\n }\n },\n })\n await exec(bundleExecutable(), ['exec', 'theme-check'].concat([directory, ...(options.args || [])]), {\n stdout: options.stdout,\n stderr: customStderr,\n cwd: themeCheckDirectory(),\n })\n })\n return Promise.all(processes)\n}\n\n/**\n * Validate Ruby Enviroment\n * Install Theme Check CLI and its dependencies\n * Shows a loading message if it's the first time installing dependencies\n * or if we are installing a new version of Theme Check CLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n */\nasync function installThemeCheckCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(themeCheckDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n await validateRubyEnv()\n await createThemeCheckCLIWorkingDirectory()\n await createThemeCheckGemfile()\n await bundleInstallThemeCheck()\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * Validate Ruby Enviroment\n * Install RubyCLI and its dependencies\n * Shows a loading spinner if it's the first time installing dependencies\n * or if we are installing a new version of RubyCLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n * @param embedded - True when embebbed codebase of CLI should be used.\n */\nasync function installCLIDependencies(stdout: Writable, embedded = false) {\n const localCLI = await shopifyCLIDirectory(embedded)\n const exists = await file.fileExists(localCLI)\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = embedded || isTruthy(process.env.SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI(localCLI)\n } else {\n await createShopifyCLIWorkingDirectory()\n await createShopifyCLIGemfile()\n await bundleInstallShopifyCLI()\n }\n\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby and Bundler.\n */\nasync function validateRubyEnv() {\n await validateRuby()\n await validateBundler()\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby.\n */\nasync function validateRuby() {\n let version\n try {\n const stdout = await captureOutput(rubyExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Ruby environment not found',\n `Make sure you have Ruby installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n\n const isValid = version?.compare(MinRubyVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Ruby version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `Make sure you have at least Ruby ${\n outputContent`${outputToken.yellow(MinRubyVersion)}`.value\n } installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Bundler.\n */\nasync function validateBundler() {\n let version\n try {\n const stdout = await captureOutput(bundleExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Bundler not found',\n `To install the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n\n const isValid = version?.compare(MinBundlerVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Bundler version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `To update to the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n}\n\n/**\n * It creates the directory where the Ruby CLI will be downloaded along its dependencies.\n */\nasync function createShopifyCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(await shopifyCLIDirectory())\n}\n\n/**\n * It creates the directory where the theme-check CLI will be downloaded along its dependencies.\n */\nasync function createThemeCheckCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(themeCheckDirectory())\n}\n\n/**\n * It creates the Gemfile to install The Ruby CLI and the dependencies.\n */\nasync function createShopifyCLIGemfile(): Promise<void> {\n const gemPath = joinPath(await shopifyCLIDirectory(), 'Gemfile')\n const gemFileContent = [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n const {platform} = platformAndArch()\n if (platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n gemFileContent.push(\"gem 'wdm', '>= 0.1.0'\")\n }\n await file.writeFile(gemPath, gemFileContent.join('\\n'))\n}\n\n/**\n * It creates the Gemfile to install theme-check and its dependencies.\n */\nasync function createThemeCheckGemfile(): Promise<void> {\n const gemPath = joinPath(themeCheckDirectory(), 'Gemfile')\n await file.writeFile(gemPath, `source 'https://rubygems.org'\\ngem 'theme-check', '${ThemeCheckVersion}'`)\n}\n\n/**\n * It runs bundle install for the dev-managed copy of the Ruby CLI.\n *\n * @param directory - Directory where CLI2 Gemfile is located.\n */\nasync function bundleInstallLocalShopifyCLI(directory: string): Promise<void> {\n await exec(bundleExecutable(), ['install'], {cwd: directory})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n const cliDirectory = await shopifyCLIDirectory()\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', cliDirectory], {\n cwd: cliDirectory,\n })\n await exec(bundleExecutable(), ['install'], {cwd: cliDirectory})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', themeCheckDirectory()], {\n cwd: themeCheckDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: themeCheckDirectory()})\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @param embedded - True when embebbed codebase of CLI should be used.\n * @returns The absolute path to the directory.\n */\nasync function shopifyCLIDirectory(embedded = false): Promise<string> {\n const embeddedDirectory = (await file.findPathUp('assets/cli-ruby', {\n type: 'directory',\n cwd: dirname(fileURLToPath(import.meta.url)),\n })) as string\n const bundledDirectory = joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n\n return embedded ? embeddedDirectory : process.env.SHOPIFY_CLI_2_0_DIRECTORY ?? bundledDirectory\n}\n\n/**\n * It returns the path to the directory containing the theme-check CLI.\n *\n * @returns The absolute path to the theme-check directory.\n */\nfunction themeCheckDirectory(): string {\n return joinPath(pathConstants.directories.cache.vendor.path(), 'theme-check', ThemeCheckVersion)\n}\n\n/**\n * It returns the Ruby version present in the envirronment.\n */\nexport async function version(): Promise<string | undefined> {\n const parseOutput = (version: string) => version.match(/ruby (\\d+\\.\\d+\\.\\d+)/)?.[1]\n return captureOutput(rubyExecutable(), ['-v'])\n .then(parseOutput)\n .catch(() => undefined)\n}\n\n/**\n * It returns the Ruby binary path set through the environment variable SHOPIFY_RUBY_BINDIR.\n * This is useful when the CLI is managed by an installer like a Homebrew where we need to\n * point the CLI to the Ruby installation managed by Homebrew.\n *\n * @returns The value of the environment variable.\n */\nfunction getRubyBinDir(): string | undefined {\n return process.env.SHOPIFY_RUBY_BINDIR\n}\n\n/**\n * It returns the path to the \"ruby\" executable.\n *\n * @returns The path to the executable.\n */\nfunction rubyExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'ruby') : 'ruby'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nfunction bundleExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'bundle') : 'bundle'\n}\n\n/**\n * It returns the path to the \"gem\"\" executable.\n *\n * @returns The path to the executable.\n */\nfunction gemExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'gem') : 'gem'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nasync function embeddedCLIExecutable(): Promise<string> {\n const cliDirectory = await shopifyCLIDirectory(true)\n return joinPath(cliDirectory, 'bin', 'shopify')\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { normalizeStoreFqdn } from './
|
|
1
|
+
import { normalizeStoreFqdn } from './context/fqdn.js';
|
|
2
2
|
import { BugError } from './error.js';
|
|
3
3
|
import * as secureStore from '../../private/node/session/store.js';
|
|
4
4
|
import { exchangeCustomPartnerToken } from '../../private/node/session/exchange.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/public/node/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/public/node/session.ts"],"names":[],"mappings":"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","sourcesContent":["import {normalizeStoreFqdn} from './context/fqdn.js'\nimport {BugError} from './error.js'\nimport * as secureStore from '../../private/node/session/store.js'\nimport {exchangeCustomPartnerToken} from '../../private/node/session/exchange.js'\nimport {outputContent, outputToken, outputDebug} from '../../public/node/output.js'\nimport {ensureAuthenticated} from '../../private/node/session.js'\nimport {environmentVariables} from '../../private/node/constants.js'\n\n/**\n * Session Object to access the Admin API, includes the token and the store FQDN.\n */\nexport interface AdminSession {\n token: string\n storeFqdn: string\n}\n\n/**\n * Ensure that we have a valid session to access the Partners API.\n * If SHOPIFY_CLI_PARTNERS_TOKEN exists, that token will be used to obtain a valid Partners Token\n * If SHOPIFY_CLI_PARTNERS_TOKEN exists, scopes will be ignored.\n *\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param env - Optional environment variables to use.\n * @returns The access token for the Partners API.\n */\nexport async function ensureAuthenticatedPartners(scopes: string[] = [], env = process.env): Promise<string> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Partners API with the following scopes:\n${outputToken.json(scopes)}\n`)\n const envToken = env[environmentVariables.partnersToken]\n if (envToken) {\n return (await exchangeCustomPartnerToken(envToken)).accessToken\n }\n const tokens = await ensureAuthenticated({partnersApi: {scopes}})\n if (!tokens.partners) {\n throw new BugError('No partners token found after ensuring authenticated')\n }\n return tokens.partners\n}\n\n/**\n * Ensure that we have a valid session to access the Storefront API.\n *\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param password - Optional password to use.\n * @returns The access token for the Storefront API.\n */\nexport async function ensureAuthenticatedStorefront(\n scopes: string[] = [],\n password: string | undefined = undefined,\n): Promise<string> {\n if (password) return password\n\n outputDebug(outputContent`Ensuring that the user is authenticated with the Storefront API with the following scopes:\n${outputToken.json(scopes)}\n`)\n const tokens = await ensureAuthenticated({storefrontRendererApi: {scopes}})\n if (!tokens.storefront) {\n throw new BugError('No storefront token found after ensuring authenticated')\n }\n return tokens.storefront\n}\n\n/**\n * Ensure that we have a valid Admin session for the given store.\n *\n * @param store - Store fqdn to request auth for.\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param forceRefresh - Optional flag to force a refresh of the token.\n * @returns The access token for the Admin API.\n */\nexport async function ensureAuthenticatedAdmin(\n store: string,\n scopes: string[] = [],\n forceRefresh = false,\n): Promise<AdminSession> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Admin API with the following scopes for the store ${outputToken.raw(\n store,\n )}:\n${outputToken.json(scopes)}\n`)\n const tokens = await ensureAuthenticated({adminApi: {scopes, storeFqdn: store}}, process.env, forceRefresh)\n if (!tokens.admin) {\n throw new BugError('No admin token found after ensuring authenticated')\n }\n return tokens.admin\n}\n\n/**\n * Ensure that we have a valid session to access the Theme API.\n * If a password is provided, that token will be used against Theme Access API.\n * Otherwise, it will ensure that the user is authenticated with the Admin API.\n *\n * @param store - Store fqdn to request auth for.\n * @param password - Password generated from Theme Access app.\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param forceRefresh - Optional flag to force a refresh of the token.\n * @returns The access token and store.\n */\nexport async function ensureAuthenticatedThemes(\n store: string,\n password: string | undefined,\n scopes: string[] = [],\n forceRefresh = false,\n): Promise<AdminSession> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Theme API with the following scopes:\n${outputToken.json(scopes)}\n`)\n if (password) return {token: password, storeFqdn: await normalizeStoreFqdn(store)}\n return ensureAuthenticatedAdmin(store, scopes, forceRefresh)\n}\n\n/**\n * Logout from Shopify.\n *\n * @returns A promise that resolves when the logout is complete.\n */\nexport function logout(): Promise<void> {\n return secureStore.remove()\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateThemeName(context: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { replaceInvalidCharacters } from './replace-invalid-characters.js';
|
|
2
|
+
import { randomBytes } from 'crypto';
|
|
3
|
+
import { hostname } from 'os';
|
|
4
|
+
const API_NAME_LIMIT = 50;
|
|
5
|
+
export function generateThemeName(context) {
|
|
6
|
+
const hostNameWithoutDomain = hostname().split('.')[0];
|
|
7
|
+
const hash = randomBytes(3).toString('hex');
|
|
8
|
+
const name = `${context} ()`;
|
|
9
|
+
const hostNameCharacterLimit = API_NAME_LIMIT - name.length - hash.length;
|
|
10
|
+
const identifier = replaceInvalidCharacters(`${hash}-${hostNameWithoutDomain.substring(0, hostNameCharacterLimit)}`);
|
|
11
|
+
return `${context} (${identifier})`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=generate-theme-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-theme-name.js","sourceRoot":"","sources":["../../../../src/public/node/themes/generate-theme-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAC,QAAQ,EAAC,MAAM,IAAI,CAAA;AAE3B,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,qBAAqB,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,IAAI,GAAG,GAAG,OAAO,KAAK,CAAA;IAC5B,MAAM,sBAAsB,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IACzE,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,IAAI,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC,EAAE,sBAAsB,CAAC,EAAE,CAAC,CAAA;IACpH,OAAO,GAAG,OAAO,KAAK,UAAU,GAAG,CAAA;AACrC,CAAC","sourcesContent":["import {replaceInvalidCharacters} from './replace-invalid-characters.js'\nimport {randomBytes} from 'crypto'\nimport {hostname} from 'os'\n\nconst API_NAME_LIMIT = 50\n\nexport function generateThemeName(context: string): string {\n const hostNameWithoutDomain = hostname().split('.')[0]!\n const hash = randomBytes(3).toString('hex')\n\n const name = `${context} ()`\n const hostNameCharacterLimit = API_NAME_LIMIT - name.length - hash.length\n const identifier = replaceInvalidCharacters(`${hash}-${hostNameWithoutDomain.substring(0, hostNameCharacterLimit)}`)\n return `${context} (${identifier})`\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const DEVELOPMENT_THEME_ROLE = "development";
|
|
2
|
+
export declare class Theme {
|
|
3
|
+
id: number;
|
|
4
|
+
name: string;
|
|
5
|
+
private _role;
|
|
6
|
+
createdAtRuntime: boolean;
|
|
7
|
+
constructor(id: number, name: string, _role: string, createdAtRuntime?: boolean);
|
|
8
|
+
get role(): string;
|
|
9
|
+
set role(_role: string);
|
|
10
|
+
get hasDevelopmentRole(): boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const DEVELOPMENT_THEME_ROLE = 'development';
|
|
2
|
+
export class Theme {
|
|
3
|
+
constructor(id, name, _role, createdAtRuntime = false) {
|
|
4
|
+
this.id = id;
|
|
5
|
+
this.name = name;
|
|
6
|
+
this._role = _role;
|
|
7
|
+
this.createdAtRuntime = createdAtRuntime;
|
|
8
|
+
}
|
|
9
|
+
get role() {
|
|
10
|
+
if (this._role === 'main') {
|
|
11
|
+
return 'live';
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return this._role;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
set role(_role) {
|
|
18
|
+
if (_role === 'live') {
|
|
19
|
+
this._role = 'main';
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this._role = _role;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
get hasDevelopmentRole() {
|
|
26
|
+
return this.role === DEVELOPMENT_THEME_ROLE;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../../src/public/node/themes/models/theme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAA;AAEnD,MAAM,OAAO,KAAK;IAChB,YAAmB,EAAU,EAAS,IAAY,EAAU,KAAa,EAAS,mBAAmB,KAAK;QAAvF,OAAE,GAAF,EAAE,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAQ;QAAS,qBAAgB,GAAhB,gBAAgB,CAAQ;IAAG,CAAC;IAE9G,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE;YACzB,OAAO,MAAM,CAAA;SACd;aAAM;YACL,OAAO,IAAI,CAAC,KAAK,CAAA;SAClB;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAa;QACpB,IAAI,KAAK,KAAK,MAAM,EAAE;YACpB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;SACpB;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;SACnB;IACH,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,IAAI,KAAK,sBAAsB,CAAA;IAC7C,CAAC;CACF","sourcesContent":["export const DEVELOPMENT_THEME_ROLE = 'development'\n\nexport class Theme {\n constructor(public id: number, public name: string, private _role: string, public createdAtRuntime = false) {}\n\n get role(): string {\n if (this._role === 'main') {\n return 'live'\n } else {\n return this._role\n }\n }\n\n set role(_role: string) {\n if (_role === 'live') {\n this._role = 'main'\n } else {\n this._role = _role\n }\n }\n\n get hasDevelopmentRole(): boolean {\n return this.role === DEVELOPMENT_THEME_ROLE\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function replaceInvalidCharacters(identifier: string): string;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function replaceInvalidCharacters(identifier) {
|
|
2
|
+
const findAllMatches = 'g';
|
|
3
|
+
const enablesUnicodeSupport = 'u';
|
|
4
|
+
return identifier.replace(new RegExp(/[^\p{Letter}\p{Number}\p{Mark}-]/, `${findAllMatches}${enablesUnicodeSupport}`), '-');
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=replace-invalid-characters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace-invalid-characters.js","sourceRoot":"","sources":["../../../../src/public/node/themes/replace-invalid-characters.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,MAAM,cAAc,GAAG,GAAG,CAAA;IAC1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;IACjC,OAAO,UAAU,CAAC,OAAO,CACvB,IAAI,MAAM,CAAC,kCAAkC,EAAE,GAAG,cAAc,GAAG,qBAAqB,EAAE,CAAC,EAC3F,GAAG,CACJ,CAAA;AACH,CAAC","sourcesContent":["export function replaceInvalidCharacters(identifier: string) {\n const findAllMatches = 'g'\n const enablesUnicodeSupport = 'u'\n return identifier.replace(\n new RegExp(/[^\\p{Letter}\\p{Number}\\p{Mark}-]/, `${findAllMatches}${enablesUnicodeSupport}`),\n '-',\n )\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Theme } from './models/theme.js';
|
|
2
|
+
import { AdminSession } from '@shopify/cli-kit/node/session';
|
|
3
|
+
export declare abstract class ThemeManager {
|
|
4
|
+
protected adminSession: AdminSession;
|
|
5
|
+
protected themeId: string | undefined;
|
|
6
|
+
protected abstract setTheme(themeId: string): void;
|
|
7
|
+
protected abstract removeTheme(): void;
|
|
8
|
+
protected abstract context: string;
|
|
9
|
+
constructor(adminSession: AdminSession);
|
|
10
|
+
findOrCreate(): Promise<Theme>;
|
|
11
|
+
protected fetch(): Promise<Theme | undefined>;
|
|
12
|
+
private create;
|
|
13
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { fetchTheme, createTheme } from './themes-api.js';
|
|
2
|
+
import { DEVELOPMENT_THEME_ROLE } from './models/theme.js';
|
|
3
|
+
import { generateThemeName } from './generate-theme-name.js';
|
|
4
|
+
import { BugError } from '@shopify/cli-kit/node/error';
|
|
5
|
+
export class ThemeManager {
|
|
6
|
+
constructor(adminSession) {
|
|
7
|
+
this.adminSession = adminSession;
|
|
8
|
+
}
|
|
9
|
+
async findOrCreate() {
|
|
10
|
+
let theme = await this.fetch();
|
|
11
|
+
if (!theme) {
|
|
12
|
+
theme = await this.create();
|
|
13
|
+
}
|
|
14
|
+
return theme;
|
|
15
|
+
}
|
|
16
|
+
async fetch() {
|
|
17
|
+
if (!this.themeId) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const theme = await fetchTheme(parseInt(this.themeId, 10), this.adminSession);
|
|
21
|
+
if (!theme) {
|
|
22
|
+
this.removeTheme();
|
|
23
|
+
}
|
|
24
|
+
return theme;
|
|
25
|
+
}
|
|
26
|
+
async create() {
|
|
27
|
+
const name = generateThemeName(this.context);
|
|
28
|
+
const role = DEVELOPMENT_THEME_ROLE;
|
|
29
|
+
const theme = await createTheme({
|
|
30
|
+
name,
|
|
31
|
+
role,
|
|
32
|
+
}, this.adminSession);
|
|
33
|
+
if (!theme) {
|
|
34
|
+
throw new BugError(`Could not create theme with name "${name}" and role "${role}"`);
|
|
35
|
+
}
|
|
36
|
+
this.setTheme(theme.id.toString());
|
|
37
|
+
return theme;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=theme-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-manager.js","sourceRoot":"","sources":["../../../../src/public/node/themes/theme-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAC,sBAAsB,EAAQ,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAC,QAAQ,EAAC,MAAM,6BAA6B,CAAA;AAEpD,MAAM,OAAgB,YAAY;IAMhC,YAAsB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,YAAY;QAChB,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;SAC5B;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAES,KAAK,CAAC,KAAK;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAM;SACP;QACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7E,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,WAAW,EAAE,CAAA;SACnB;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,sBAAsB,CAAA;QACnC,MAAM,KAAK,GAAG,MAAM,WAAW,CAC7B;YACE,IAAI;YACJ,IAAI;SACL,EACD,IAAI,CAAC,YAAY,CAClB,CAAA;QACD,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,QAAQ,CAAC,qCAAqC,IAAI,eAAe,IAAI,GAAG,CAAC,CAAA;SACpF;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QAClC,OAAO,KAAK,CAAA;IACd,CAAC;CACF","sourcesContent":["import {fetchTheme, createTheme} from './themes-api.js'\nimport {DEVELOPMENT_THEME_ROLE, Theme} from './models/theme.js'\nimport {generateThemeName} from './generate-theme-name.js'\nimport {AdminSession} from '@shopify/cli-kit/node/session'\nimport {BugError} from '@shopify/cli-kit/node/error'\n\nexport abstract class ThemeManager {\n protected themeId: string | undefined\n protected abstract setTheme(themeId: string): void\n protected abstract removeTheme(): void\n protected abstract context: string\n\n constructor(protected adminSession: AdminSession) {}\n\n async findOrCreate(): Promise<Theme> {\n let theme = await this.fetch()\n if (!theme) {\n theme = await this.create()\n }\n return theme\n }\n\n protected async fetch() {\n if (!this.themeId) {\n return\n }\n const theme = await fetchTheme(parseInt(this.themeId, 10), this.adminSession)\n if (!theme) {\n this.removeTheme()\n }\n return theme\n }\n\n private async create() {\n const name = generateThemeName(this.context)\n const role = DEVELOPMENT_THEME_ROLE\n const theme = await createTheme(\n {\n name,\n role,\n },\n this.adminSession,\n )\n if (!theme) {\n throw new BugError(`Could not create theme with name \"${name}\" and role \"${role}\"`)\n }\n this.setTheme(theme.id.toString())\n return theme\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Theme } from '@shopify/cli-kit/node/themes/models/theme';
|
|
2
|
+
import { AdminSession } from '@shopify/cli-kit/node/session';
|
|
3
|
+
export declare function themePreviewUrl(theme: Theme, session: AdminSession): string;
|
|
4
|
+
export declare function themeEditorUrl(theme: Theme, session: AdminSession): string;
|
|
5
|
+
export declare function storeAdminUrl(session: AdminSession): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function themePreviewUrl(theme, session) {
|
|
2
|
+
const store = session.storeFqdn;
|
|
3
|
+
if (theme.role === 'live') {
|
|
4
|
+
return `https://${store}`;
|
|
5
|
+
}
|
|
6
|
+
return `https://${store}?preview_theme_id=${theme.id}`;
|
|
7
|
+
}
|
|
8
|
+
export function themeEditorUrl(theme, session) {
|
|
9
|
+
const store = session.storeFqdn;
|
|
10
|
+
return `https://${store}/admin/themes/${theme.id}/editor`;
|
|
11
|
+
}
|
|
12
|
+
export function storeAdminUrl(session) {
|
|
13
|
+
const store = session.storeFqdn;
|
|
14
|
+
return `https://${store}/admin`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=theme-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-urls.js","sourceRoot":"","sources":["../../../../src/public/node/themes/theme-urls.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,OAAqB;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAA;IAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;QACzB,OAAO,WAAW,KAAK,EAAE,CAAA;KAC1B;IAED,OAAO,WAAW,KAAK,qBAAqB,KAAK,CAAC,EAAE,EAAE,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,OAAqB;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAA;IAC/B,OAAO,WAAW,KAAK,iBAAiB,KAAK,CAAC,EAAE,SAAS,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAA;IAC/B,OAAO,WAAW,KAAK,QAAQ,CAAA;AACjC,CAAC","sourcesContent":["import {Theme} from '@shopify/cli-kit/node/themes/models/theme'\nimport {AdminSession} from '@shopify/cli-kit/node/session'\n\nexport function themePreviewUrl(theme: Theme, session: AdminSession) {\n const store = session.storeFqdn\n if (theme.role === 'live') {\n return `https://${store}`\n }\n\n return `https://${store}?preview_theme_id=${theme.id}`\n}\n\nexport function themeEditorUrl(theme: Theme, session: AdminSession) {\n const store = session.storeFqdn\n return `https://${store}/admin/themes/${theme.id}/editor`\n}\n\nexport function storeAdminUrl(session: AdminSession) {\n const store = session.storeFqdn\n return `https://${store}/admin`\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { tryParseInt } from '@shopify/cli-kit/common/string';
|
|
2
|
+
export function retryAfter(response) {
|
|
3
|
+
const retryAfterStr = header(response, 'retry-after');
|
|
4
|
+
const retryAfter = tryParseInt(retryAfterStr);
|
|
5
|
+
if (!retryAfter) {
|
|
6
|
+
return 0;
|
|
7
|
+
}
|
|
8
|
+
return retryAfter;
|
|
9
|
+
}
|
|
10
|
+
export function apiCallLimit(response) {
|
|
11
|
+
const apiCallLimit = header(response, 'x-shopify-shop-api-call-limit');
|
|
12
|
+
const [used, limit] = apiCallLimit
|
|
13
|
+
.split('/')
|
|
14
|
+
.map((num) => tryParseInt(num))
|
|
15
|
+
.filter(Boolean);
|
|
16
|
+
if (!used || !limit) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
return [used, limit];
|
|
20
|
+
}
|
|
21
|
+
function header(response, name) {
|
|
22
|
+
const headers = response.headers;
|
|
23
|
+
const header = headers[name];
|
|
24
|
+
if (header?.length === 1) {
|
|
25
|
+
return header[0] ?? '';
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../../../src/public/node/themes/themes-api/headers.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAA;AAE1D,MAAM,UAAU,UAAU,CAAC,QAAsB;IAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;IAE7C,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,CAAC,CAAA;KACT;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAsB;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAA;IAEtE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,YAAY;SAC/B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC,CAAA;IAElB,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;QACnB,OAAM;KACP;IAED,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACtB,CAAC;AAED,SAAS,MAAM,CAAC,QAAsB,EAAE,IAAY;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,MAAM,EAAE,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;KACvB;IAED,OAAO,EAAE,CAAA;AACX,CAAC","sourcesContent":["import {RestResponse} from '@shopify/cli-kit/node/api/admin'\nimport {tryParseInt} from '@shopify/cli-kit/common/string'\n\nexport function retryAfter(response: RestResponse): number {\n const retryAfterStr = header(response, 'retry-after')\n const retryAfter = tryParseInt(retryAfterStr)\n\n if (!retryAfter) {\n return 0\n }\n\n return retryAfter\n}\n\nexport function apiCallLimit(response: RestResponse): [number, number] | undefined {\n const apiCallLimit = header(response, 'x-shopify-shop-api-call-limit')\n\n const [used, limit] = apiCallLimit\n .split('/')\n .map((num) => tryParseInt(num))\n .filter(Boolean)\n\n if (!used || !limit) {\n return\n }\n\n return [used, limit]\n}\n\nfunction header(response: RestResponse, name: string): string {\n const headers = response.headers\n const header = headers[name]\n\n if (header?.length === 1) {\n return header[0] ?? ''\n }\n\n return ''\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function retry<T>(operation: () => T, retryDelay: number): Promise<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../../src/public/node/themes/themes-api/retry.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,KAAK,CAAI,SAAkB,EAAE,UAAkB;IACnE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACzC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["export async function retry<T>(operation: () => T, retryDelay: number) {\n return new Promise<T>((resolve, _reject) => {\n setTimeout(() => resolve(operation()), retryDelay)\n })\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const MAX_NUMBER_OF_PARALLEL_REQUESTS = 5;
|
|
2
|
+
const MARGIN_TO_RATE_LIMIT = 5;
|
|
3
|
+
export async function throttle(request) {
|
|
4
|
+
return new Promise((resolve, _reject) => {
|
|
5
|
+
const performRequest = () => {
|
|
6
|
+
throttlingState().requestCounter += 1;
|
|
7
|
+
resolve(request());
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Performs the {@link performRequest} taking into account the
|
|
11
|
+
* limit of parallel requests only when the API limit has not
|
|
12
|
+
* been reached.
|
|
13
|
+
*
|
|
14
|
+
* Otherwise, performs the request to get the updated API limit
|
|
15
|
+
* headers, so throttler parameters get updates.
|
|
16
|
+
*/
|
|
17
|
+
const throttleByHeader = () => {
|
|
18
|
+
if (!isReachingApiLimit()) {
|
|
19
|
+
throttleByCounter(performRequest);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
setTimeout(() => throttleByCounter(performRequest), 4000);
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Performs the {@link command} only when the the limit
|
|
26
|
+
* of parallel request has not been reached.
|
|
27
|
+
*
|
|
28
|
+
* Otherwise, defers the execution to the {@link throttleByHeader},
|
|
29
|
+
* still respecting the limit of parallel requests.
|
|
30
|
+
*/
|
|
31
|
+
const throttleByCounter = (command) => {
|
|
32
|
+
if (!hasTooManyRequests()) {
|
|
33
|
+
command();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setTimeout(() => throttleByCounter(throttleByHeader), 1000);
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Start throttling by counter to get the API limit headers.
|
|
40
|
+
*/
|
|
41
|
+
throttleByCounter(throttleByHeader);
|
|
42
|
+
}).finally(() => {
|
|
43
|
+
throttlingState().requestCounter -= 1;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function updateApiCallLimit(callLimit) {
|
|
47
|
+
if (!callLimit) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const [used, limit] = callLimit;
|
|
51
|
+
latestRequestInfo().apiCallLimit = { used, limit };
|
|
52
|
+
}
|
|
53
|
+
function hasTooManyRequests() {
|
|
54
|
+
return throttlingState().requestCounter > MAX_NUMBER_OF_PARALLEL_REQUESTS;
|
|
55
|
+
}
|
|
56
|
+
function isReachingApiLimit() {
|
|
57
|
+
const { used, limit } = latestRequestInfo().apiCallLimit;
|
|
58
|
+
return used >= limit - MARGIN_TO_RATE_LIMIT;
|
|
59
|
+
}
|
|
60
|
+
function latestRequestInfo() {
|
|
61
|
+
return throttlingState().latestRequestInfo;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Even considering the Stateless modules convention,
|
|
65
|
+
* tracking information about the latest request is
|
|
66
|
+
* critical to optimize the request throttler efficiently.
|
|
67
|
+
*
|
|
68
|
+
* Thus, in this case, this module deliberately avoids
|
|
69
|
+
* IO cost and uses the `_throttlingState` instance for
|
|
70
|
+
* that purpose.
|
|
71
|
+
*/
|
|
72
|
+
function throttlingState() {
|
|
73
|
+
return (_throttlingState ??
|
|
74
|
+
(_throttlingState = {
|
|
75
|
+
requestCounter: 0,
|
|
76
|
+
latestRequestInfo: {
|
|
77
|
+
apiCallLimit: { used: 0, limit: 40 },
|
|
78
|
+
},
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
let _throttlingState;
|
|
82
|
+
//# sourceMappingURL=throttler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttler.js","sourceRoot":"","sources":["../../../../../src/public/node/themes/themes-api/throttler.ts"],"names":[],"mappings":"AAAA,MAAM,+BAA+B,GAAG,CAAC,CAAA;AACzC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AAE9B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,OAAgB;IAChD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACzC,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,eAAe,EAAE,CAAC,cAAc,IAAI,CAAC,CAAA;YACrC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACpB,CAAC,CAAA;QAED;;;;;;;WAOG;QACH,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,kBAAkB,EAAE,EAAE;gBACzB,iBAAiB,CAAC,cAAc,CAAC,CAAA;gBACjC,OAAM;aACP;YAED,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAA;QAC3D,CAAC,CAAA;QAED;;;;;;WAMG;QACH,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAE,EAAE;YAChD,IAAI,CAAC,kBAAkB,EAAE,EAAE;gBACzB,OAAO,EAAE,CAAA;gBACT,OAAM;aACP;YAED,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC,CAAA;QAED;;WAEG;QACH,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IACrC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,eAAe,EAAE,CAAC,cAAc,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAuC;IACxE,IAAI,CAAC,SAAS,EAAE;QACd,OAAM;KACP;IAED,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAA;IAE/B,iBAAiB,EAAE,CAAC,YAAY,GAAG,EAAC,IAAI,EAAE,KAAK,EAAC,CAAA;AAClD,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,eAAe,EAAE,CAAC,cAAc,GAAG,+BAA+B,CAAA;AAC3E,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,iBAAiB,EAAE,CAAC,YAAY,CAAA;IACtD,OAAO,IAAI,IAAI,KAAK,GAAG,oBAAoB,CAAA;AAC7C,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,eAAe,EAAE,CAAC,iBAAiB,CAAA;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe;IACtB,OAAO,CACL,gBAAgB;QAChB,CAAC,gBAAgB,GAAG;YAClB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE;gBACjB,YAAY,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAC;aACnC;SACF,CAAC,CACH,CAAA;AACH,CAAC;AAED,IAAI,gBAUH,CAAA","sourcesContent":["const MAX_NUMBER_OF_PARALLEL_REQUESTS = 5\nconst MARGIN_TO_RATE_LIMIT = 5\n\nexport async function throttle<T>(request: () => T) {\n return new Promise<T>((resolve, _reject) => {\n const performRequest = () => {\n throttlingState().requestCounter += 1\n resolve(request())\n }\n\n /**\n * Performs the {@link performRequest} taking into account the\n * limit of parallel requests only when the API limit has not\n * been reached.\n *\n * Otherwise, performs the request to get the updated API limit\n * headers, so throttler parameters get updates.\n */\n const throttleByHeader = () => {\n if (!isReachingApiLimit()) {\n throttleByCounter(performRequest)\n return\n }\n\n setTimeout(() => throttleByCounter(performRequest), 4000)\n }\n\n /**\n * Performs the {@link command} only when the the limit\n * of parallel request has not been reached.\n *\n * Otherwise, defers the execution to the {@link throttleByHeader},\n * still respecting the limit of parallel requests.\n */\n const throttleByCounter = (command: () => void) => {\n if (!hasTooManyRequests()) {\n command()\n return\n }\n\n setTimeout(() => throttleByCounter(throttleByHeader), 1000)\n }\n\n /**\n * Start throttling by counter to get the API limit headers.\n */\n throttleByCounter(throttleByHeader)\n }).finally(() => {\n throttlingState().requestCounter -= 1\n })\n}\n\nexport function updateApiCallLimit(callLimit: [number, number] | undefined) {\n if (!callLimit) {\n return\n }\n\n const [used, limit] = callLimit\n\n latestRequestInfo().apiCallLimit = {used, limit}\n}\n\nfunction hasTooManyRequests() {\n return throttlingState().requestCounter > MAX_NUMBER_OF_PARALLEL_REQUESTS\n}\n\nfunction isReachingApiLimit() {\n const {used, limit} = latestRequestInfo().apiCallLimit\n return used >= limit - MARGIN_TO_RATE_LIMIT\n}\n\nfunction latestRequestInfo() {\n return throttlingState().latestRequestInfo\n}\n\n/**\n * Even considering the Stateless modules convention,\n * tracking information about the latest request is\n * critical to optimize the request throttler efficiently.\n *\n * Thus, in this case, this module deliberately avoids\n * IO cost and uses the `_throttlingState` instance for\n * that purpose.\n */\nfunction throttlingState() {\n return (\n _throttlingState ??\n (_throttlingState = {\n requestCounter: 0,\n latestRequestInfo: {\n apiCallLimit: {used: 0, limit: 40},\n },\n })\n )\n}\n\nlet _throttlingState: {\n /**\n * Number of parallel requests */\n requestCounter: number\n\n /**\n * Latest request information */\n latestRequestInfo: {\n apiCallLimit: {used: number; limit: number}\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Theme } from './models/theme.js';
|
|
2
|
+
import { AdminSession } from '@shopify/cli-kit/node/session';
|
|
3
|
+
export type ThemeParams = Partial<Pick<Theme, 'name' | 'role'>>;
|
|
4
|
+
export declare function fetchTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
|
|
5
|
+
export declare function fetchThemes(session: AdminSession): Promise<Theme[]>;
|
|
6
|
+
export declare function createTheme(params: ThemeParams, session: AdminSession): Promise<Theme | undefined>;
|
|
7
|
+
export declare function updateTheme(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined>;
|
|
8
|
+
export declare function publishTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
|
|
9
|
+
export declare function deleteTheme(id: number, session: AdminSession): Promise<Theme | undefined>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as throttler from './themes-api/throttler.js';
|
|
2
|
+
import { apiCallLimit, retryAfter } from './themes-api/headers.js';
|
|
3
|
+
import { retry } from './themes-api/retry.js';
|
|
4
|
+
import { storeAdminUrl } from './theme-urls.js';
|
|
5
|
+
import { Theme } from './models/theme.js';
|
|
6
|
+
import { restRequest } from '@shopify/cli-kit/node/api/admin';
|
|
7
|
+
import { AbortError } from '@shopify/cli-kit/node/error';
|
|
8
|
+
export async function fetchTheme(id, session) {
|
|
9
|
+
const response = await request('GET', `/themes/${id}`, session, undefined, { fields: 'id' });
|
|
10
|
+
return buildTheme(response.json.theme);
|
|
11
|
+
}
|
|
12
|
+
export async function fetchThemes(session) {
|
|
13
|
+
const response = await request('GET', '/themes', session, undefined, { fields: 'id,name,role' });
|
|
14
|
+
return buildThemes(response);
|
|
15
|
+
}
|
|
16
|
+
export async function createTheme(params, session) {
|
|
17
|
+
const response = await request('POST', '/themes', session, { theme: { ...params } });
|
|
18
|
+
return buildTheme({ ...response.json.theme, createdAtRuntime: true });
|
|
19
|
+
}
|
|
20
|
+
export async function updateTheme(id, params, session) {
|
|
21
|
+
const response = await request('PUT', `/themes/${id}`, session, { theme: { id, ...params } });
|
|
22
|
+
return buildTheme(response.json.theme);
|
|
23
|
+
}
|
|
24
|
+
export async function publishTheme(id, session) {
|
|
25
|
+
return updateTheme(id, { role: 'main' }, session);
|
|
26
|
+
}
|
|
27
|
+
export async function deleteTheme(id, session) {
|
|
28
|
+
const response = await request('DELETE', `/themes/${id}`, session);
|
|
29
|
+
return buildTheme(response.json.theme);
|
|
30
|
+
}
|
|
31
|
+
async function request(method, path, session, params, searchParams = {}) {
|
|
32
|
+
const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams));
|
|
33
|
+
const status = response.status;
|
|
34
|
+
const callLimit = apiCallLimit(response);
|
|
35
|
+
throttler.updateApiCallLimit(callLimit);
|
|
36
|
+
switch (true) {
|
|
37
|
+
case status >= 200 && status <= 399:
|
|
38
|
+
// Returns the successful reponse
|
|
39
|
+
return response;
|
|
40
|
+
case status === 404:
|
|
41
|
+
// Defer the decision when a resource is not found
|
|
42
|
+
return response;
|
|
43
|
+
case status === 429:
|
|
44
|
+
// Retry following the "retry-after" header
|
|
45
|
+
return retry(() => request(method, path, session, params, searchParams), retryAfter(response));
|
|
46
|
+
case status === 403:
|
|
47
|
+
return handleForbiddenError(session);
|
|
48
|
+
case status === 401:
|
|
49
|
+
throw new AbortError(`[${status}] API request unauthorized error`);
|
|
50
|
+
case status >= 400 && status <= 499:
|
|
51
|
+
throw new AbortError(`[${status}] API request client error`);
|
|
52
|
+
case status >= 500 && status <= 599:
|
|
53
|
+
throw new AbortError(`[${status}] API request server error`);
|
|
54
|
+
default:
|
|
55
|
+
throw new AbortError(`[${status}] API request unexpected error`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function buildThemes(response) {
|
|
59
|
+
const themes = response.json?.themes;
|
|
60
|
+
if (themes?.length > 0) {
|
|
61
|
+
return themes.map(buildTheme);
|
|
62
|
+
}
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
// Using `any` to avoid introducing extra DTO layers.
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
function buildTheme(themeJson) {
|
|
68
|
+
if (!themeJson?.id) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return new Theme(themeJson.id, themeJson.name, themeJson.role, themeJson.createdAtRuntime);
|
|
72
|
+
}
|
|
73
|
+
function handleForbiddenError(session) {
|
|
74
|
+
const store = session.storeFqdn;
|
|
75
|
+
const adminUrl = storeAdminUrl(session);
|
|
76
|
+
throw new AbortError(`You are not authorized to edit themes on "${store}".`, "You can't use Shopify CLI with development stores if you only have Partner staff " +
|
|
77
|
+
'member access. If you want to use Shopify CLI to work on a development store, then ' +
|
|
78
|
+
'you should be the store owner or create a staff account on the store.' +
|
|
79
|
+
'\n\n' +
|
|
80
|
+
"If you're the store owner, then you need to log in to the store directly using the " +
|
|
81
|
+
`store URL at least once (for example, using "${adminUrl}") before you log in using ` +
|
|
82
|
+
'Shopify CLI. Logging in to the Shopify admin directly connects the development ' +
|
|
83
|
+
'store with your Shopify login.');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=themes-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themes-api.js","sourceRoot":"","sources":["../../../../src/public/node/themes/themes-api.ts"],"names":[],"mappings":"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","sourcesContent":["import * as throttler from './themes-api/throttler.js'\nimport {apiCallLimit, retryAfter} from './themes-api/headers.js'\nimport {retry} from './themes-api/retry.js'\nimport {storeAdminUrl} from './theme-urls.js'\nimport {Theme} from './models/theme.js'\nimport {restRequest, RestResponse} from '@shopify/cli-kit/node/api/admin'\nimport {AdminSession} from '@shopify/cli-kit/node/session'\nimport {AbortError} from '@shopify/cli-kit/node/error'\n\nexport type ThemeParams = Partial<Pick<Theme, 'name' | 'role'>>\n\nexport async function fetchTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('GET', `/themes/${id}`, session, undefined, {fields: 'id'})\n return buildTheme(response.json.theme)\n}\n\nexport async function fetchThemes(session: AdminSession): Promise<Theme[]> {\n const response = await request('GET', '/themes', session, undefined, {fields: 'id,name,role'})\n return buildThemes(response)\n}\n\nexport async function createTheme(params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('POST', '/themes', session, {theme: {...params}})\n return buildTheme({...response.json.theme, createdAtRuntime: true})\n}\n\nexport async function updateTheme(id: number, params: ThemeParams, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('PUT', `/themes/${id}`, session, {theme: {id, ...params}})\n return buildTheme(response.json.theme)\n}\n\nexport async function publishTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n return updateTheme(id, {role: 'main'}, session)\n}\n\nexport async function deleteTheme(id: number, session: AdminSession): Promise<Theme | undefined> {\n const response = await request('DELETE', `/themes/${id}`, session)\n return buildTheme(response.json.theme)\n}\n\nasync function request<T>(\n method: string,\n path: string,\n session: AdminSession,\n params?: T,\n searchParams: {[name: string]: string} = {},\n): Promise<RestResponse> {\n const response = await throttler.throttle(() => restRequest(method, path, session, params, searchParams))\n\n const status = response.status\n const callLimit = apiCallLimit(response)\n\n throttler.updateApiCallLimit(callLimit)\n\n switch (true) {\n case status >= 200 && status <= 399:\n // Returns the successful reponse\n return response\n case status === 404:\n // Defer the decision when a resource is not found\n return response\n case status === 429:\n // Retry following the \"retry-after\" header\n return retry(() => request(method, path, session, params, searchParams), retryAfter(response))\n case status === 403:\n return handleForbiddenError(session)\n case status === 401:\n throw new AbortError(`[${status}] API request unauthorized error`)\n case status >= 400 && status <= 499:\n throw new AbortError(`[${status}] API request client error`)\n case status >= 500 && status <= 599:\n throw new AbortError(`[${status}] API request server error`)\n default:\n throw new AbortError(`[${status}] API request unexpected error`)\n }\n}\n\nfunction buildThemes(response: RestResponse): Theme[] {\n const themes = response.json?.themes\n\n if (themes?.length > 0) {\n return themes.map(buildTheme)\n }\n\n return []\n}\n\n// Using `any` to avoid introducing extra DTO layers.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildTheme(themeJson: any): Theme | undefined {\n if (!themeJson?.id) {\n return undefined\n }\n\n return new Theme(themeJson.id, themeJson.name, themeJson.role, themeJson.createdAtRuntime)\n}\n\nfunction handleForbiddenError(session: AdminSession): never {\n const store = session.storeFqdn\n const adminUrl = storeAdminUrl(session)\n\n throw new AbortError(\n `You are not authorized to edit themes on \"${store}\".`,\n \"You can't use Shopify CLI with development stores if you only have Partner staff \" +\n 'member access. If you want to use Shopify CLI to work on a development store, then ' +\n 'you should be the store owner or create a staff account on the store.' +\n '\\n\\n' +\n \"If you're the store owner, then you need to log in to the store directly using the \" +\n `store URL at least once (for example, using \"${adminUrl}\") before you log in using ` +\n 'Shopify CLI. Logging in to the Shopify admin directly connects the development ' +\n 'store with your Shopify login.',\n )\n}\n"]}
|