class Sass::Compiler::Host::ImporterRegistry
It stores importers and handles import requests.
The {ImporterRegistry} class.
def canonicalize(canonicalize_request)
def canonicalize(canonicalize_request) importer = @importers_by_id[canonicalize_request.importer_id] canonicalize_context = CanonicalizeContext.new(canonicalize_request) url = importer.canonicalize(canonicalize_request.url, canonicalize_context)&.to_s EmbeddedProtocol::InboundMessage::CanonicalizeResponse.new( id: canonicalize_request.id, url:, containing_url_unused: canonicalize_context.instance_variable_get(:@containing_url_unused) ) rescue StandardError => e EmbeddedProtocol::InboundMessage::CanonicalizeResponse.new( id: canonicalize_request.id, error: e.full_message(highlight: @highlight, order: :top) ) end
def file_import(file_import_request)
def file_import(file_import_request) importer = @importers_by_id[file_import_request.importer_id] canonicalize_context = CanonicalizeContext.new(file_import_request) file_url = importer.find_file_url(file_import_request.url, canonicalize_context)&.to_s EmbeddedProtocol::InboundMessage::FileImportResponse.new( id: file_import_request.id, file_url:, containing_url_unused: canonicalize_context.instance_variable_get(:@containing_url_unused) ) rescue StandardError => e EmbeddedProtocol::InboundMessage::FileImportResponse.new( id: file_import_request.id, error: e.full_message(highlight: @highlight, order: :top) ) end
def import(import_request)
def import(import_request) importer = @importers_by_id[import_request.importer_id] importer_result = importer.load(import_request.url) importer_result = Struct.new(importer_result, attrs: IMPORTER_RESULT_ATTRS) if importer_result.is_a?(::Hash) EmbeddedProtocol::InboundMessage::ImportResponse.new( id: import_request.id, success: EmbeddedProtocol::InboundMessage::ImportResponse::ImportSuccess.new( contents: importer_result.contents.to_str, syntax: syntax_to_proto(importer_result.syntax), source_map_url: (importer_result.source_map_url&.to_s if importer_result.respond_to?(:source_map_url)) ) ) rescue StandardError => e EmbeddedProtocol::InboundMessage::ImportResponse.new( id: import_request.id, error: e.full_message(highlight: @highlight, order: :top) ) end
def initialize(importers, load_paths, alert_color:)
def initialize(importers, load_paths, alert_color:) @id = 0 @importers_by_id = {}.compare_by_identity @importers = importers .map { |importer| register(importer) } .concat( load_paths.map do |load_path| EmbeddedProtocol::InboundMessage::CompileRequest::Importer.new( path: File.absolute_path(load_path) ) end ) @highlight = alert_color end
def register(importer)
def register(importer) if importer.is_a?(Sass::NodePackageImporter) EmbeddedProtocol::InboundMessage::CompileRequest::Importer.new( node_package_importer: EmbeddedProtocol::NodePackageImporter.new( entry_point_directory: importer.instance_variable_get(:@entry_point_directory) ) ) else importer = Struct.new(importer, attrs: IMPORTER_ATTRS, methods: IMPORTER_METHODS) if importer.is_a?(::Hash) is_importer = importer.respond_to?(:canonicalize) && importer.respond_to?(:load) is_file_importer = importer.respond_to?(:find_file_url) raise ArgumentError, 'importer must be an Importer or a FileImporter' if is_importer == is_file_importer id = @id @id = id.next @importers_by_id[id] = importer if is_importer EmbeddedProtocol::InboundMessage::CompileRequest::Importer.new( importer_id: id, non_canonical_scheme: if importer.respond_to?(:non_canonical_scheme) Array(importer.non_canonical_scheme) else [] end ) else EmbeddedProtocol::InboundMessage::CompileRequest::Importer.new( file_importer_id: id ) end end end
def syntax_to_proto(syntax)
def syntax_to_proto(syntax) case syntax&.to_sym when :scss EmbeddedProtocol::Syntax::SCSS when :indented EmbeddedProtocol::Syntax::INDENTED when :css EmbeddedProtocol::Syntax::CSS else raise ArgumentError, 'syntax must be one of :scss, :indented, :css' end end