sassc-embedded 1.70.1 → 1.74.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a1d6d7f744b77407d5d03ab046589505f9b33251eb8440e61a8230725ea3160
4
- data.tar.gz: fb40b19e534709b43f83a26d3358efe8c7a6e0f493da6d1c2e358efc51a9c1a2
3
+ metadata.gz: f2035f16da9c3d02bf4fce8ac06465db89afbee4b1ece61dfd3213b4fec4a150
4
+ data.tar.gz: 1ec55533d5a8949ed2ab53266b52abf963a2be427d228605e0c7147974490856
5
5
  SHA512:
6
- metadata.gz: 6f300bc7794f77fb090e4264bb62f79f1836a69be5a21a4b8e2889315bfa30dc18f46b372476ff9e8c5ac39d36e867bbb63c5d994eeb45ab64f8f12ac86d5660
7
- data.tar.gz: 74441eae5009812fa2058cdbe992da2ca24dd3ddb5cfb4518b7bde3544a4bfde6fc1ebbe628b671726d7da528d81e48a9d48cb663664f21e324f2824c816db4c
6
+ metadata.gz: 4f0d03db8a9d0848c96c21bcc340ee8fc15993f7b56697649fee823bb4e6a398a992b6245c4b6d274a12cf846c6aa8ee59bf56cc19c1b11081d251ae4509e05e
7
+ data.tar.gz: 40760cf8ab3aa85a459b83f2b41e5513b96fea52fc000fa435dd4f4115526914e3665388305962fdd91da1c454a326f64acb27bd47fd6ddd566a6e428bfb1b9f
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SassC
4
4
  module Embedded
5
- VERSION = '1.70.1'
5
+ VERSION = '1.74.0'
6
6
  end
7
7
  end
@@ -13,11 +13,11 @@ module SassC
13
13
  def render
14
14
  return @template.dup if @template.empty?
15
15
 
16
- base_importer = import_handler.setup(nil)
16
+ importers = import_handler.setup(nil)
17
17
 
18
18
  result = ::Sass.compile_string(
19
19
  @template,
20
- importer: base_importer,
20
+ importer: importers.first,
21
21
  load_paths:,
22
22
  syntax:,
23
23
  url: file_url,
@@ -28,12 +28,15 @@ module SassC
28
28
  style: output_style,
29
29
 
30
30
  functions: functions_handler.setup(nil, functions: @functions),
31
- importers: (base_importer.nil? ? [] : [base_importer]).concat(@options.fetch(:importers, [])),
31
+ importers: importers.concat(@options.fetch(:importers, [])),
32
32
 
33
33
  alert_ascii: @options.fetch(:alert_ascii, false),
34
34
  alert_color: @options.fetch(:alert_color, nil),
35
+ fatal_deprecations: @options.fetch(:fatal_deprecations, []),
36
+ future_deprecations: @options.fetch(:future_deprecations, []),
35
37
  logger: @options.fetch(:logger, nil),
36
38
  quiet_deps: @options.fetch(:quiet_deps, false),
39
+ silence_deprecations: @options.fetch(:silence_deprecations, []),
37
40
  verbose: @options.fetch(:verbose, false)
38
41
  )
39
42
 
@@ -184,10 +187,43 @@ module SassC
184
187
 
185
188
  class ImportHandler
186
189
  def setup(_native_options)
187
- Importer.new(@importer) if @importer
190
+ if @importer
191
+ import_cache = ImportCache.new(@importer)
192
+ [Importer.new(import_cache), FileImporter.new(import_cache)]
193
+ else
194
+ []
195
+ end
188
196
  end
189
197
 
198
+ class Importer
199
+ def initialize(import_cache)
200
+ @import_cache = import_cache
201
+ end
202
+
203
+ def canonicalize(...)
204
+ @import_cache.canonicalize(...)
205
+ end
206
+
207
+ def load(...)
208
+ @import_cache.load(...)
209
+ end
210
+ end
211
+
212
+ private_constant :Importer
213
+
190
214
  class FileImporter
215
+ def initialize(import_cache)
216
+ @import_cache = import_cache
217
+ end
218
+
219
+ def find_file_url(...)
220
+ @import_cache.find_file_url(...)
221
+ end
222
+ end
223
+
224
+ private_constant :FileImporter
225
+
226
+ class FileSystemImporter
191
227
  class << self
192
228
  def resolve_path(path, from_import)
193
229
  ext = File.extname(path)
@@ -202,10 +238,10 @@ module SassC
202
238
  unless ext.empty?
203
239
  if from_import
204
240
  result = exactly_one(try_path("#{without_ext(path)}.import#{ext}"))
205
- return result unless result.nil?
241
+ return warn_deprecation_ext(result) unless result.nil?
206
242
  end
207
243
  result = exactly_one(try_path(path))
208
- return result unless result.nil?
244
+ return warn_deprecation_ext(result) unless result.nil?
209
245
  end
210
246
 
211
247
  if from_import
@@ -235,7 +271,7 @@ module SassC
235
271
  end
236
272
 
237
273
  def try_path_as_dir(path, from_import)
238
- return unless dir_exist? path
274
+ return unless dir_exist?(path)
239
275
 
240
276
  if from_import
241
277
  result = exactly_one(try_path_with_ext(File.join(path, 'index.import')))
@@ -247,7 +283,7 @@ module SassC
247
283
 
248
284
  def exactly_one(paths)
249
285
  return if paths.empty?
250
- return paths.first if paths.length == 1
286
+ return paths.first if paths.one?
251
287
 
252
288
  raise "It's not clear which file to import. Found:\n#{paths.map { |path| " #{path}" }.join("\n")}"
253
289
  end
@@ -264,46 +300,71 @@ module SassC
264
300
  ext = File.extname(path)
265
301
  path.delete_suffix(ext)
266
302
  end
303
+
304
+ def warn_deprecation_ext(path)
305
+ basename = File.basename(path)
306
+ warn <<~WARNING
307
+ Deprecation Warning: Importing files with extensions other than `.scss`, `.sass`, `.css` from relative path or load paths without custom SassC::Importer is deprecated.
308
+
309
+ Recommandation: Rename #{basename} to #{basename}.scss
310
+
311
+ More info: https://github.com/sass-contrib/sassc-embedded-shim-ruby/pull/86
312
+
313
+ #{path}
314
+ #{' ' * (path.length - basename.length)}#{'^' * basename.length}
315
+ WARNING
316
+ path
317
+ end
267
318
  end
268
319
  end
269
320
 
270
- private_constant :FileImporter
321
+ private_constant :FileSystemImporter
271
322
 
272
- class Importer
323
+ class ImportCache
273
324
  def initialize(importer)
274
325
  @importer = importer
275
-
276
326
  @canonical_urls = {}
277
- @id = 0
278
327
  @importer_results = {}
328
+ @load_paths = (@importer.options[:load_paths] || []) + SassC.load_paths
279
329
  @parent_urls = [URL.path_to_file_url(File.absolute_path(@importer.options[:filename] || 'stdin'))]
280
330
  end
281
331
 
282
332
  def canonicalize(url, context)
283
333
  if url.start_with?(Protocol::IMPORT)
284
- canonical_url = @canonical_urls.delete(url.delete_prefix(Protocol::IMPORT))
334
+ canonical_url = @canonical_urls.delete(url)
285
335
  unless @importer_results.key?(canonical_url)
286
- canonical_url = resolve_file_url(canonical_url, @parent_urls.last, context.from_import)
336
+ path = URL.unescape(canonical_url)
337
+ parent_path = URL.file_url_to_path(@parent_urls.last)
338
+ canonical_url = resolve_file_url(path, parent_path, context.from_import)
339
+ return unless canonical_url
340
+
341
+ # Temporarily disable FileImporter optimization
342
+ # https://github.com/sass/dart-sass/issues/2208
343
+ #
344
+ # if ['.sass', '.scss', '.css'].include?(File.extname(URL.file_url_to_path(canonical_url)))
345
+ # @canonical_urls[url] = canonical_url
346
+ # return nil
347
+ # end
287
348
  end
288
349
  @parent_urls.push(canonical_url)
289
350
  canonical_url
290
- elsif url.start_with?(Protocol::FILE)
291
- path = URL.file_urls_to_relative_path(url, @parent_urls.last)
292
- parent_path = URL.file_url_to_path(@parent_urls.last)
351
+ elsif url.start_with?(Protocol::LOADED)
352
+ @parent_urls.pop
353
+ Protocol::LOADED
354
+ else
355
+ parent_url = @parent_urls.last
356
+ url = URL.join(parent_url, url)
357
+ return unless url.start_with?(Protocol::FILE)
358
+
359
+ path = URL.file_urls_to_relative_path(url, parent_url)
360
+ parent_path = URL.file_url_to_path(parent_url)
293
361
 
294
362
  imports = @importer.imports(path, parent_path)
295
363
  imports = [SassC::Importer::Import.new(path)] if imports.nil?
296
364
  imports = [imports] unless imports.is_a?(Array)
297
- imports.each do |import|
298
- import.path = File.absolute_path(import.path, File.dirname(parent_path))
299
- end
300
365
 
301
- canonical_url = "#{Protocol::IMPORT}#{next_id}"
302
- @importer_results[canonical_url] = imports_to_native(imports, context.from_import)
303
- canonical_url
304
- elsif url.start_with?(Protocol::LOADED)
305
- canonical_url = Protocol::LOADED
306
- @parent_urls.pop
366
+ canonical_url = "#{Protocol::IMPORT}#{url}"
367
+ @importer_results[canonical_url] = imports_to_native(imports, File.dirname(parent_path), context.from_import)
307
368
  canonical_url
308
369
  end
309
370
  end
@@ -326,17 +387,19 @@ module SassC
326
387
  end
327
388
  end
328
389
 
329
- private
390
+ def find_file_url(url, _context)
391
+ canonical_url = @canonical_urls.delete(url)
392
+ return unless canonical_url
330
393
 
331
- def load_paths
332
- @load_paths ||= (@importer.options[:load_paths] || []) + SassC.load_paths
394
+ @parent_urls.push(canonical_url)
395
+ canonical_url
333
396
  end
334
397
 
335
- def resolve_file_url(url, parent_url, from_import)
336
- path = URL.file_urls_to_relative_path(url, parent_url)
337
- parent_path = URL.file_url_to_path(parent_url)
338
- [File.dirname(parent_path)].concat(load_paths).each do |load_path|
339
- resolved = FileImporter.resolve_path(File.absolute_path(path, load_path), from_import)
398
+ private
399
+
400
+ def resolve_file_url(path, parent_path, from_import)
401
+ [File.dirname(parent_path)].concat(@load_paths).each do |load_path|
402
+ resolved = FileSystemImporter.resolve_path(File.absolute_path(path, load_path), from_import)
340
403
  return URL.path_to_file_url(resolved) unless resolved.nil?
341
404
  end
342
405
  nil
@@ -353,13 +416,11 @@ module SassC
353
416
  end
354
417
  end
355
418
 
356
- def imports_to_native(imports, from_import)
419
+ def imports_to_native(imports, parent_dir, from_import)
357
420
  {
358
421
  contents: imports.flat_map do |import|
359
- id = next_id
360
- canonical_url = URL.path_to_file_url(import.path)
361
- @canonical_urls[id] = canonical_url
362
422
  if import.source
423
+ canonical_url = URL.path_to_file_url(File.absolute_path(import.path, parent_dir))
363
424
  @importer_results[canonical_url] = if import.source.is_a?(Hash)
364
425
  {
365
426
  contents: import.source[:contents],
@@ -373,25 +434,24 @@ module SassC
373
434
  source_map_url: canonical_url
374
435
  }
375
436
  end
437
+ else
438
+ canonical_url = URL.escape(import.path)
376
439
  end
440
+ import_url = "#{Protocol::IMPORT}#{canonical_url}"
441
+ loaded_url = "#{Protocol::LOADED}#{canonical_url}"
442
+ @canonical_urls[import_url] = canonical_url
377
443
  at_rule = from_import ? '@import' : '@forward'
378
- [
379
- "#{at_rule} \"#{Protocol::IMPORT}#{id}\";",
380
- "#{at_rule} \"#{Protocol::LOADED}#{id}\";"
381
- ]
444
+ <<~SCSS
445
+ #{at_rule} #{Script::Value::String.quote(import_url)};
446
+ #{at_rule} #{Script::Value::String.quote(loaded_url)};
447
+ SCSS
382
448
  end.join("\n"),
383
449
  syntax: :scss
384
450
  }
385
451
  end
386
-
387
- def next_id
388
- id = @id
389
- @id = id.next
390
- id.to_s
391
- end
392
452
  end
393
453
 
394
- private_constant :Importer
454
+ private_constant :ImportCache
395
455
  end
396
456
 
397
457
  class Sass2Scss
@@ -556,6 +616,10 @@ module SassC
556
616
 
557
617
  module_function
558
618
 
619
+ def join(...)
620
+ URI.join(...).to_s
621
+ end
622
+
559
623
  def parse(str)
560
624
  PARSER.parse(str)
561
625
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sassc-embedded
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.70.1
4
+ version: 1.74.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - なつき
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-14 00:00:00.000000000 Z
11
+ date: 2024-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sass-embedded
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.70'
19
+ version: '1.74'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.70'
26
+ version: '1.74'
27
27
  description: An embedded sass shim for SassC.
28
28
  email:
29
29
  - i@ntk.me
@@ -79,7 +79,7 @@ licenses:
79
79
  metadata:
80
80
  bug_tracker_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/issues
81
81
  documentation_uri: https://rubydoc.info/gems/sassc
82
- source_code_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/tree/v1.70.1
82
+ source_code_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/tree/v1.74.0
83
83
  funding_uri: https://github.com/sponsors/ntkme
84
84
  rubygems_mfa_required: 'true'
85
85
  post_install_message: