# frozen_string_literal: true require 'open3' require 'uri' module SewingKit module Webpack # Webpack manifest loading, caching & entry point retrieval class Manifest # Raised if the node sewing-kit isn't installed/runnable. class NodeSewingKitNotRunnable < StandardError def initialize(mode, cause) env_message = if 'production' == mode "\nIf this is a container build, try:\n" \ " - Adding `YARN_PRODUCTION=false` to your pipeline's environment variables\n" \ " - Adding the node buildpack: https://github.com/heroku/heroku-buildpack-nodejs" else "Try `yarn add --dev @shopify/sewing-kit`" end super( "Could not fetch manifest because node sewing-kit is not runnable. " \ "#{env_message}\n" \ "Original error #{cause}" ) end end 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 return @instance if @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'