Class: CDNGet::Unpkg

Inherits:
Base
  • Object
show all
Defined in:
lib/cdnget.rb

Constant Summary collapse

CODE =
"unpkg"
SITE_URL =
"https://unpkg.com/"
API_URL =

API_URL = “www.npmjs.com

"https://api.npms.io/v2"

Instance Attribute Summary

Attributes inherited from Base

#debug_mode

Instance Method Summary collapse

Methods inherited from Base

#download, inherited, #initialize

Constructor Details

This class inherits a constructor from CDNGet::Base

Instance Method Details

#find(library) ⇒ Object



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
# File 'lib/cdnget.rb', line 421

def find(library)
  validate(library, nil)
  json = fetch("#{API_URL}/package/#{library}", library)
  jdata = JSON.load(json)
  _debug_print(jdata)
  dict = jdata["collected"]["metadata"]
  versions = [dict["version"]]
  #
  url = File.join(SITE_URL, "/browse/#{library}/")
  html = fetch(url, library)
  _debug_print(html)
  if html =~ /<script>window.__DATA__\s*=\s*(.*?)<\/script>/m
    jdata2 = JSON.load($1)
    versions = jdata2["availableVersions"].reverse()
  end
  #
  return {
    name:      dict["name"],
    desc:      dict["description"],
    tags:      (dict["keywords"] || []).join(", "),
    site:      dict["links"] ? dict["links"]["homepage"] : dict["links"]["npm"],
    info:      File.join(SITE_URL, "/browse/#{library}/"),
    versions:  versions,
    license:   dict["license"],
  }
end

#get(library, version) ⇒ Object



448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
# File 'lib/cdnget.rb', line 448

def get(library, version)
  validate(library, version)
  dict = find(library)
  dict.delete(:versions)
  #
  url = "https://data.jsdelivr.com/v1/package/npm/#{library}@#{version}/flat"
  begin
    json = fetch(url, library)
  rescue CommandError
    raise CommandError.new("#{library}@#{version}: Library or version not found.")
  end
  jdata   = JSON.load(json)
  files   = jdata["files"].collect {|d| d["name"] }
  baseurl = File.join(SITE_URL, "/#{library}@#{version}")
  _debug_print(jdata)
  #
  dict.update({
    name:     library,
    version:  version,
    info:     File.join(SITE_URL, "/browse/#{library}@#{version}/"),
    npmpkg:  "https://registry.npmjs.org/#{library}/-/#{library}-#{version}.tgz",
    urls:     files.collect {|x| baseurl+x },
    files:    files,
    baseurl:  baseurl,
    default:  jdata["default"],
    destdir:  "#{library}@#{version}",
  })
  return dict
end

#listObject



402
403
404
# File 'lib/cdnget.rb', line 402

def list()
  return nil    # nil means that this CDN can't list libraries without pattern
end

#search(pattern) ⇒ Object



406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'lib/cdnget.rb', line 406

def search(pattern)
  #json = fetch("#{API_URL}/search?q=#{pattern}")
  json = fetch("#{API_URL}/search?q=#{pattern}&size=250")
  jdata = JSON.load(json)
  _debug_print(jdata)
  #arr = jdata["objects"]   # www.npmjs.com
  arr = jdata["results"]    # api.npms.io
  return arr.select {|dict|
    File.fnmatch(pattern, dict["package"]["name"], File::FNM_CASEFOLD)
  }.collect {|dict|
    d = dict["package"]
    {name: d["name"], desc: d["description"], version: d["version"]}
  }
end