# 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(mode, node_error_message) env_message = if 'production' == mode "\nIf this is a container build:\n" \ " - Verify that sewing_kit compilation succeeded before deployment\n" \ " - Verify that public/bundles/sewing-kit.manifest.json was uploaded\n" \ " - Verify that public/bundles/sewing-kit.manifest.json exists in the container\n" \ else "\nPossible 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" end super( "Could not fetch the sewing-kit manifest 🙀 " \ "#{env_message}\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 LegacyManifestError < StandardError def initialize(manifest) super "manifest must contain 'entrypoints' key (found: #{manifest})" end end class << self # :nodoc: def asset_dependencies(entrypoint_name) instance.asset_dependencies(entrypoint_name) end def clear_cache! @instance = nil end def manifest instance.manifest end def instance mode = ENV['NODE_ENV'] || Rails.env.to_s @instance ||= if mode == 'development' && ENV['SK_SIMULATE_PRODUCTION'] != '1' Development.new else Production.new end end end end end end require 'sewing_kit/webpack/manifest/development' require 'sewing_kit/webpack/manifest/production'