# 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'