Skip to content

Commit 08d50ee

Browse files
committed
feat: rewrite workspace deps
1 parent 0722c9c commit 08d50ee

File tree

6 files changed

+135
-5
lines changed

6 files changed

+135
-5
lines changed

lib/content/release-please-config.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"separate-pull-requests": {{{del}}},
3-
"plugins": ["node-workspace"],
3+
"plugins": ["node-workspace", "workspace-deps"],
44
"exclude-packages-from-root": true,
5+
"group-pull-request-title-pattern": "Release ${version}",
56
"changelog-sections": {{{json changelogTypes}}},
67
"packages": {
78
"{{#unless pkgRelPath}}.{{/unless}}{{pkgRelPath}}": {

lib/release-please/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ const RP = require('release-please')
22
const logger = require('./logger.js')
33
const ChangelogNotes = require('./changelog.js')
44
const Version = require('./version.js')
5+
const WorkspaceDeps = require('./workspace-deps.js')
56

67
RP.setLogger(logger)
78
RP.registerChangelogNotes('default', (options) => new ChangelogNotes(options))
89
RP.registerVersioningStrategy('default', (options) => new Version(options))
10+
RP.registerPlugin('workspace-deps', (options) => new WorkspaceDeps(options))
911

1012
const main = async ({ repo: fullRepo, token, dryRun, branch }) => {
1113
if (!token) {

lib/release-please/workspace-deps.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
const { ManifestPlugin } = require('release-please/build/src/plugin')
2+
3+
const matchLine = (line, re) => {
4+
const trimmed = line.trim().replace(/^[*#\s]+/, '')
5+
if (typeof re === 'string') {
6+
return trimmed === re
7+
}
8+
return trimmed.match(re)
9+
}
10+
11+
module.exports = class WorkspaceDeps extends ManifestPlugin {
12+
run (pullRequests) {
13+
for (const { pullRequest } of pullRequests) {
14+
const depLinks = pullRequest.body.releaseData.reduce((acc, release) => {
15+
if (release.component) {
16+
const url = matchLine(release.notes.split('\n')[0], /^\[[^\]]+\]\((.*?)\)/)
17+
if (url) {
18+
acc[release.component] = url[1]
19+
}
20+
}
21+
return acc
22+
}, {})
23+
24+
for (const release of pullRequest.body.releaseData) {
25+
const lines = release.notes.split('\n')
26+
const newLines = []
27+
28+
let inWorkspaceDeps = false
29+
let collectWorkspaceDeps = false
30+
31+
for (const line of lines) {
32+
if (matchLine(line, 'The following workspace dependencies were updated')) {
33+
// We are in the section with our workspace deps
34+
// Set the flag and discard this line since we dont want it in the final output
35+
inWorkspaceDeps = true
36+
} else if (inWorkspaceDeps) {
37+
if (collectWorkspaceDeps) {
38+
const depMatch = matchLine(line, /^(\S+) bumped from \S+ to (\S+)$/)
39+
if (depMatch) {
40+
// If we have a line that is a workspace dep update, then reformat
41+
// it and save it to the new lines
42+
const [, depName, newVersion] = depMatch
43+
const url = depLinks[depName]
44+
if (url) {
45+
newLines.push(` * [\`${depName}@${newVersion}\`](${url})`)
46+
} else {
47+
newLines.push(` * \`${depName}@${newVersion}\``)
48+
}
49+
} else {
50+
// Anything else means we are done with dependencies so ignore
51+
// this line and dont look for any more
52+
collectWorkspaceDeps = false
53+
}
54+
} else if (matchLine(line, 'dependencies')) {
55+
// Only collect dependencies discard dev deps and everything else
56+
collectWorkspaceDeps = true
57+
} else if (matchLine(line, '') || matchLine(line, /^#/)) {
58+
inWorkspaceDeps = false
59+
newLines.push(line)
60+
}
61+
} else {
62+
newLines.push(line)
63+
}
64+
}
65+
66+
release.notes = newLines.join('\n')
67+
}
68+
}
69+
70+
return pullRequests
71+
}
72+
}

release-please-config.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"plugins": [
3-
"node-workspace"
3+
"node-workspace",
4+
"workspace-deps"
45
],
56
"changelog-sections": [
67
{
@@ -33,5 +34,6 @@
3334
"package-name": ""
3435
}
3536
},
36-
"exclude-packages-from-root": true
37+
"exclude-packages-from-root": true,
38+
"group-pull-request-title-pattern": "Release ${version}"
3739
}

tap-snapshots/test/apply/full-content.js.test.cjs

+6-2
Original file line numberDiff line numberDiff line change
@@ -703,9 +703,11 @@ release-please-config.json
703703
========================================
704704
{
705705
"plugins": [
706-
"node-workspace"
706+
"node-workspace",
707+
"workspace-deps"
707708
],
708709
"exclude-packages-from-root": true,
710+
"group-pull-request-title-pattern": "Release \${version}",
709711
"changelog-sections": [
710712
{
711713
"type": "feat",
@@ -1639,9 +1641,11 @@ release-please-config.json
16391641
========================================
16401642
{
16411643
"plugins": [
1642-
"node-workspace"
1644+
"node-workspace",
1645+
"workspace-deps"
16431646
],
16441647
"exclude-packages-from-root": true,
1648+
"group-pull-request-title-pattern": "Release \${version}",
16451649
"changelog-sections": [
16461650
{
16471651
"type": "feat",

test/release-please/workspace-deps.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const t = require('tap')
2+
const WorkspaceDeps = require('../../lib/release-please/workspace-deps.js')
3+
4+
const PRS = [{
5+
pullRequest: {
6+
body: {
7+
releaseData: [{
8+
component: '',
9+
notes: [
10+
'### Deps',
11+
'',
12+
'* The following workspace dependencies were updated',
13+
' * peerDependencies',
14+
' * pkgA bumped from ^1.0.0 to ^2.0.0',
15+
' * pkgB bumped from ^1.0.0 to ^2.0.0',
16+
' * dependencies',
17+
' * pkg1 bumped from ^1.0.0 to ^2.0.0',
18+
' * pkg2 bumped from ^1.0.0 to ^2.0.0',
19+
' * devDependencies',
20+
' * pkgC bumped from ^1.0.0 to ^2.0.0',
21+
' * pkgD bumped from ^1.0.0 to ^2.0.0',
22+
'',
23+
'### Next',
24+
].join('\n'),
25+
}, {
26+
component: 'pkg2',
27+
notes: '### no link',
28+
}, {
29+
component: 'pkg1',
30+
notes: '### [sdsfsdf](http://url1)',
31+
}],
32+
},
33+
},
34+
}]
35+
36+
t.test('rewrite deps', async (t) => {
37+
const pullRequests = new WorkspaceDeps().run(PRS)
38+
const workspaceDeps = pullRequests[0].pullRequest.body.releaseData[0].notes
39+
40+
const lines = workspaceDeps.split('\n')
41+
t.strictSame(lines, [
42+
'### Deps',
43+
'',
44+
' * [`pkg1@^2.0.0`](http://url1)',
45+
' * `pkg2@^2.0.0`',
46+
'',
47+
'### Next',
48+
])
49+
})

0 commit comments

Comments
 (0)