UNPKG

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