Skip to content

Commit 98ea3de

Browse files
authored
Add Sass::GemPackageImporter (#339)
1 parent e781394 commit 98ea3de

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

lib/sass/compiler.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
require_relative 'embedded_protocol'
1212
require_relative 'exception'
1313
require_relative 'fork_tracker'
14+
require_relative 'gem_package_importer'
1415
require_relative 'logger/silent'
1516
require_relative 'logger/source_location'
1617
require_relative 'logger/source_span'

lib/sass/gem_package_importer.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
module Sass
4+
# The built-in RubyGems package importer. This loads pkg: URLs from gems.
5+
class GemPackageImporter
6+
# @!visibility private
7+
def find_file_url(url, _canonicalize_context)
8+
return unless url.start_with?('pkg:')
9+
10+
library, _, path = url[4..].partition('/')
11+
gem_dir = Gem::Dependency.new(library).to_spec.gem_dir
12+
13+
"file://#{'/' unless gem_dir.start_with?('/')}#{gem_dir}/#{path}"
14+
rescue Gem::MissingSpecError
15+
nil
16+
end
17+
end
18+
end
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
RSpec.describe Sass::GemPackageImporter do
6+
around do |example|
7+
require 'bundler/inline'
8+
9+
sandbox do |dir|
10+
dir.write({
11+
'_test.scss' => '/* test */',
12+
'_index.scss' => '@use "test";',
13+
'test.gemspec' => <<~GEMSPEC
14+
Gem::Specification.new do |spec|
15+
spec.name = 'test'
16+
spec.summary = 'test'
17+
spec.authors = ['test']
18+
spec.version = '0.0.1'
19+
spec.files = Dir['**/*']
20+
end
21+
GEMSPEC
22+
})
23+
24+
gemfile do
25+
gem 'test', path: dir.path, require: false
26+
end
27+
28+
example.call
29+
end
30+
end
31+
32+
describe 'resolves pkg: url' do
33+
it 'without subpath' do
34+
expect(Sass.compile_string('@use "pkg:test";',
35+
importers: [described_class.new],
36+
logger: Sass::Logger.silent).css)
37+
.to eq('/* test */')
38+
end
39+
40+
it 'with subpath' do
41+
expect(Sass.compile_string('@use "pkg:test/test";',
42+
importers: [described_class.new],
43+
logger: Sass::Logger.silent).css)
44+
.to eq('/* test */')
45+
end
46+
47+
it 'with uppercase scheme' do
48+
expect(Sass.compile_string('@use "PKG:test";',
49+
importers: [described_class.new],
50+
logger: Sass::Logger.silent).css)
51+
.to eq('/* test */')
52+
end
53+
54+
it 'with precent-encoding' do
55+
expect(Sass.compile_string('@use "pkg:%74%65%73%74";',
56+
importers: [described_class.new],
57+
logger: Sass::Logger.silent).css)
58+
.to eq('/* test */')
59+
end
60+
end
61+
end

0 commit comments

Comments
 (0)