Skip to content

Commit 38751af

Browse files
get something working with calculating integrity on pin.
1 parent 87a664b commit 38751af

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

lib/importmap/commands.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@ def self.exit_on_failure?
1313
option :env, type: :string, aliases: :e, default: "production"
1414
option :from, type: :string, aliases: :f, default: "jspm"
1515
option :download, type: :boolean, aliases: :d, default: false
16+
option :integrity, type: :boolean, aliases: :i, default: false
1617
def pin(*packages)
1718
if imports = packager.import(*packages, env: options[:env], from: options[:from])
1819
imports.each do |package, url|
1920
if options[:download]
2021
puts %(Pinning "#{package}" to #{packager.vendor_path}/#{package}.js via download from #{url})
2122
packager.download(package, url)
22-
pin = packager.vendored_pin_for(package, url)
23+
integrity = packager.calculate_integrity(package: package) if options[:integrity]
24+
pin = packager.vendored_pin_for(package, url, integrity: integrity)
2325
else
2426
puts %(Pinning "#{package}" to #{url})
25-
pin = packager.pin_for(package, url)
27+
integrity = packager.calculate_integrity(url: url) if options[:integrity]
28+
pin = packager.pin_for(package, url, integrity: integrity)
2629
end
2730

2831
if packager.packaged?(package)

lib/importmap/packager.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,23 @@ def import(*packages, env: "production", from: "jspm")
3232
end
3333
end
3434

35-
def pin_for(package, url)
36-
%(pin "#{package}", to: "#{url}")
35+
def pin_for(package, url, integrity: false)
36+
if integrity
37+
%(pin "#{package}", to: "#{url}", integrity: "#{integrity}")
38+
else
39+
%(pin "#{package}", to: "#{url}")
40+
end
3741
end
3842

39-
def vendored_pin_for(package, url)
43+
def vendored_pin_for(package, url, integrity: false)
4044
filename = package_filename(package)
4145
version = extract_package_version_from(url)
46+
integrity_suffix = %(, integrity: "#{integrity}") if integrity
4247

4348
if "#{package}.js" == filename
44-
%(pin "#{package}" # #{version})
49+
%(pin "#{package}"#{integrity_suffix} # #{version})
4550
else
46-
%(pin "#{package}", to: "#{filename}" # #{version})
51+
%(pin "#{package}", to: "#{filename}"#{integrity_suffix} # #{version})
4752
end
4853
end
4954

@@ -62,6 +67,13 @@ def remove(package)
6267
remove_package_from_importmap(package)
6368
end
6469

70+
def calculate_integrity(package: nil, url: nil)
71+
contents = File.read(vendored_package_path(package)) if package
72+
contents = Net::HTTP.get_response(URI(url)).body if url
73+
integrity = Digest::SHA384.base64digest(contents)
74+
"sha384-#{integrity}"
75+
end
76+
6577
private
6678
def post_json(body)
6779
Net::HTTP.post(self.class.endpoint, body.to_json, "Content-Type" => "application/json")

0 commit comments

Comments
 (0)