-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate-node-version-in-files.js
More file actions
124 lines (107 loc) · 4.68 KB
/
Copy pathupdate-node-version-in-files.js
File metadata and controls
124 lines (107 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import * as fs from 'fs'
const encoding = 'utf8'
const nodeVersionString = process.argv[2]
const nodeVersion = parseInt(nodeVersionString)
if (isNaN(nodeVersion)) {
throw new Error(`Node.js major version must be passed as a script parameter: ${nodeVersionString}`)
}
function readJsonFile(path) {
const content = fs.readFileSync(path, encoding)
return JSON.parse(content)
}
function writeJsonFile(path, json) {
let content = JSON.stringify(json, null, 2) + '\n'
content = content.replaceAll(/(\r\n)|(\n\r)|(\r)/g, '\n')
fs.writeFileSync(path, content, encoding)
}
;(function() {
const currentVerRaw = fs.readFileSync('.nvmrc', encoding).trim()
const currentVer = parseInt(currentVerRaw.replace(/^v/, ''))
if (currentVer !== nodeVersion) {
console.log(`.nvmrc: ${currentVerRaw} -> v${nodeVersion}`)
fs.writeFileSync('.nvmrc', `v${nodeVersion}`, encoding)
} else {
console.log(`.nvmrc: ${currentVerRaw} (up to date)`)
}
})()
;(function() {
const content = fs.readFileSync('.tool-versions', encoding)
const match = content.match(/^nodejs\s+(\d+\.\d+\.\d+)$/m)
const currentVerFull = match && match[1]
const currentVer = currentVerFull && parseInt(currentVerFull)
if (currentVer != null && currentVer !== nodeVersion) {
console.log(`.tool-versions: ${currentVerFull} -> ${nodeVersion}.0.0`)
const modifiedContent = content.replace(
/^(nodejs\s+)\d+\.\d+\.\d+$/m,
`$1${nodeVersion}.0.0`
)
fs.writeFileSync('.tool-versions', modifiedContent, encoding)
} else if (currentVer != null) {
console.log(`.tool-versions: ${currentVerFull} (up to date)`)
}
})()
;(function() {
const json = readJsonFile('package.json')
json.engines = json.engines || {}
const currentEngineNode = json.engines.node
json.engines.node = `>=${nodeVersion}`
if (currentEngineNode !== json.engines.node) {
console.log(`package.json engines.node: ${currentEngineNode || '(not set)'} -> ${json.engines.node}`)
} else {
console.log(`package.json engines.node: ${currentEngineNode} (up to date)`)
}
if (json.devDependencies[`@tsconfig/node${nodeVersion}`] == null) {
console.log(`Adding @tsconfig/node${nodeVersion} dependency`)
json.devDependencies[`@tsconfig/node${nodeVersion}`] = `${nodeVersion}.0.0`
}
if (json.devDependencies['@types/node'] == null) {
console.log(`Adding @types/node dependency`)
json.devDependencies['@types/node'] = `${nodeVersion}.0.0`
}
;[
'dependencies',
'devDependencies',
].forEach(dependenciesKey => {
const dependencies = json[dependenciesKey]
if (dependencies == null) {
return
}
Object.entries(dependencies).forEach(([dependency, version]) => {
if (dependency.startsWith('@tsconfig/node') && dependency !== `@tsconfig/node${nodeVersion}`) {
console.log(`Removing ${dependency} dependency`)
delete dependencies[dependency]
}
})
Object.entries(dependencies).forEach(([dependency, version]) => {
if (dependency === '@types/node' && !version.startsWith(`${nodeVersion}.`)) {
const newVersion = `${nodeVersion}.0.0`
console.log(`Setting version of ${dependency} dependency to ${newVersion}`)
dependencies[dependency] = newVersion
}
})
})
writeJsonFile('package.json', json)
})()
;(function() {
const json = readJsonFile('tsconfig.json')
if ((json.extends || '').startsWith('@tsconfig/node')) {
const currentExtends = json.extends
json.extends = `@tsconfig/node${nodeVersion}/tsconfig.json`
if (currentExtends !== json.extends) {
console.log(`tsconfig.json extends: ${currentExtends} -> ${json.extends}`)
} else {
console.log(`tsconfig.json extends: ${currentExtends} (up to date)`)
}
}
writeJsonFile('tsconfig.json', json)
})()
;(function() {
const content = fs.readFileSync('.github/renovate.json5', encoding)
const modifiedContent = content.replace(
/([ ]*)\/\/\s*\$\$\$sync-with-template-modifiable:\s*(force: \{\s*)?constraints\s*\$\$\$[\s\S]*?\/\/\s*\$\$\$sync-with-template-modifiable-end\s*\$\$\$/,
`$1// $$$$$sync-with-template-modifiable: constraints $$$$$\n$1constraints: {\n$1$1node: "^${nodeVersion}.9999.9999",\n$1},\n$1force: {\n$1$1constraints: {\n$1$1$1node: "^${nodeVersion}.9999.9999",\n$1$1},\n$1},\n$1// $$$$$sync-with-template-modifiable-end$$$$$`
)
if (modifiedContent !== content) {
fs.writeFileSync('.github/renovate.json5', modifiedContent, encoding)
}
})()