update-db.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. var childProcess = require('child_process')
  2. var pkgUp = require('pkg-up')
  3. var path = require('path')
  4. var fs = require('fs')
  5. var BrowserslistError = require('./error')
  6. function detectLockfile () {
  7. var packagePath = pkgUp.sync()
  8. if (!packagePath) {
  9. throw new BrowserslistError(
  10. 'Cannot find package.json. ' +
  11. 'Is it a right project to run npx browserslist --update-db?'
  12. )
  13. }
  14. var rootDir = path.dirname(packagePath)
  15. var lockfileNpm = path.join(rootDir, 'package-lock.json')
  16. var lockfileYarn = path.join(rootDir, 'yarn.lock')
  17. var lockfilePnpm = path.join(rootDir, 'pnpm-lock.yaml')
  18. /* istanbul ignore next */
  19. if (fs.existsSync(lockfilePnpm)) {
  20. return { mode: 'pnpm', file: lockfilePnpm }
  21. } else if (fs.existsSync(lockfileNpm)) {
  22. return { mode: 'npm', file: lockfileNpm }
  23. } else if (fs.existsSync(lockfileYarn)) {
  24. return { mode: 'yarn', file: lockfileYarn }
  25. } else {
  26. throw new BrowserslistError(
  27. 'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
  28. )
  29. }
  30. }
  31. function getCurrentVersion (lock) {
  32. var match
  33. /* istanbul ignore if */
  34. if (lock.mode === 'pnpm') {
  35. match = /\/caniuse-lite\/([^:]+):/.exec(lock.content)
  36. if (match[1]) return match[1]
  37. } else if (lock.mode === 'npm') {
  38. var dependencies = JSON.parse(lock.content).dependencies
  39. if (dependencies && dependencies['caniuse-lite']) {
  40. return dependencies['caniuse-lite'].version
  41. }
  42. } else if (lock.mode === 'yarn') {
  43. match = /caniuse-lite@[^:]+:\n\s+version\s+"([^"]+)"/.exec(lock.content)
  44. if (match[1]) return match[1]
  45. }
  46. return null
  47. }
  48. function getLastestInfo () {
  49. return JSON.parse(
  50. childProcess.execSync('npm show caniuse-lite --json').toString()
  51. )
  52. }
  53. function updateLockfile (lock, latest) {
  54. if (lock.mode === 'npm') {
  55. var fixed = deletePackage(JSON.parse(lock.content))
  56. return JSON.stringify(fixed, null, ' ')
  57. } else {
  58. var lines = lock.content.split('\n')
  59. var i
  60. /* istanbul ignore if */
  61. if (lock.mode === 'pnpm') {
  62. for (i = 0; i < lines.length; i++) {
  63. if (lines[i].indexOf('caniuse-lite:') >= 0) {
  64. lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
  65. } else if (lines[i].indexOf('/caniuse-lite') >= 0) {
  66. lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
  67. for (i = i + 1; i < lines.length; i++) {
  68. if (lines[i].indexOf('integrity: ') !== -1) {
  69. lines[i] = lines[i].replace(
  70. /integrity: .+/, 'integrity: ' + latest.dist.integrity
  71. )
  72. } else if (lines[i].indexOf(' /') !== -1) {
  73. break
  74. }
  75. }
  76. }
  77. }
  78. } else if (lock.mode === 'yarn') {
  79. for (i = 0; i < lines.length; i++) {
  80. if (lines[i].indexOf('caniuse-lite@') !== -1) {
  81. lines[i + 1] = lines[i + 1].replace(
  82. /version "[^"]+"/, 'version "' + latest.version + '"'
  83. )
  84. lines[i + 2] = lines[i + 2].replace(
  85. /resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
  86. )
  87. lines[i + 3] = lines[i + 3].replace(
  88. /integrity .+/, 'integrity ' + latest.dist.integrity
  89. )
  90. i += 4
  91. }
  92. }
  93. }
  94. return lines.join('\n')
  95. }
  96. }
  97. function deletePackage (node) {
  98. if (node.dependencies) {
  99. delete node.dependencies['caniuse-lite']
  100. for (var i in node.dependencies) {
  101. node.dependencies[i] = deletePackage(node.dependencies[i])
  102. }
  103. }
  104. return node
  105. }
  106. module.exports = function updateDB (print) {
  107. var lock = detectLockfile()
  108. lock.content = fs.readFileSync(lock.file).toString()
  109. var current = getCurrentVersion(lock)
  110. var latest = getLastestInfo()
  111. if (typeof current === 'string') {
  112. print('Current version: ' + current + '\n')
  113. }
  114. print(
  115. 'New version: ' + latest.version + '\n' +
  116. 'Updating caniuse-lite…\n'
  117. )
  118. fs.writeFileSync(lock.file, updateLockfile(lock, latest))
  119. childProcess.execSync(lock.mode + ' install')
  120. print('caniuse-lite has been successfully updated')
  121. }