# frozen_string_literal: true require "open3" require "uri" module SewingKit module Webpack # Webpack manifest loading, caching & entry point retrieval class Manifest class NodeSewingKitManifestMissing < StandardError def initialize(node_error_message) super( "Could not fetch the sewing-kit manifest 🙀 \n" \ "Possible next steps:\n" \ " - If the server is still starting up, wait for a " \ "'Compiled with latest changes' message then refresh your browser\n" \ " - Check the development console for compilation errors\n" \ " - Restart your development server\n" \ "\n" \ "Original error #{node_error_message}" ) end end # Raised if the node-generated manifest cannot be read from the filesystem. class ManifestLoadError < StandardError def initialize(path, cause) super("Could not load manifest from #{path} (original error #{cause})") end end # Raised if the node-generated manifest returns unparseable JSON. class ManifestParseError < StandardError def initialize(cause) super("Could not parse manifest JSON (original error #{cause})") end end class << self def asset_bundle_name(user_agent) instance.asset_bundle_name(user_agent) end # :nodoc: def asset_dependencies(entrypoint_name, user_agent) instance.asset_dependencies(entrypoint_name, user_agent) end def clear_cache! @instance = nil end def manifest instance.manifest end def instance return Production.new if simulate_production? @instance ||= if mode == "development" Development.new elsif skip_assets? TestWithNoAssets.new else Production.new end end private def mode ENV["NODE_ENV"] || Rails.env.to_s end def skip_assets? mode == "test" && SewingKit.configuration.test_manifest_mode == :return_no_assets end def simulate_production? ENV["SK_SIMULATE_PRODUCTION"] == "1" || ENV["SK_SIMULATE_PRODUCTION"] == "true" end end end end end require "sewing_kit/webpack/manifest/development" require "sewing_kit/webpack/manifest/production" require "sewing_kit/webpack/manifest/test_with_no_assets"