lalph 0.2.18 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +80 -50
- package/package.json +1 -1
- package/src/Github/Cli.ts +71 -39
- package/src/domain/GithubComment.ts +30 -30
package/dist/cli.mjs
CHANGED
|
@@ -150368,32 +150368,41 @@ const PollResponse = Union([TokenResponse, PollErrorResponse]);
|
|
|
150368
150368
|
|
|
150369
150369
|
//#endregion
|
|
150370
150370
|
//#region src/domain/GithubComment.ts
|
|
150371
|
-
var Author = class extends Class("
|
|
150372
|
-
var Comment = class extends Class("
|
|
150371
|
+
var Author = class extends Class("Author")({ login: String$1 }) {};
|
|
150372
|
+
var Comment = class extends Class("Comment")({
|
|
150373
150373
|
id: String$1,
|
|
150374
150374
|
body: String$1,
|
|
150375
|
-
author: Author
|
|
150375
|
+
author: Author,
|
|
150376
|
+
createdAt: String$1
|
|
150376
150377
|
}) {};
|
|
150377
|
-
var
|
|
150378
|
-
var
|
|
150379
|
-
var PullRequest = class extends Class("github/PullRequest")({
|
|
150378
|
+
var PullRequestComments = class extends Class("PullRequestComments")({ nodes: Array$1(Comment) }) {};
|
|
150379
|
+
var PullRequest = class extends Class("PullRequest")({
|
|
150380
150380
|
url: String$1,
|
|
150381
|
+
reviewDecision: Null,
|
|
150382
|
+
reviews: suspend(() => Reviews),
|
|
150381
150383
|
reviewThreads: suspend(() => ReviewThreads),
|
|
150382
150384
|
comments: PullRequestComments
|
|
150383
150385
|
}) {};
|
|
150384
|
-
var Repository = class extends Class("
|
|
150385
|
-
var Data = class extends Class("
|
|
150386
|
-
var
|
|
150387
|
-
var
|
|
150386
|
+
var Repository = class extends Class("Repository")({ pullRequest: PullRequest }) {};
|
|
150387
|
+
var Data = class extends Class("Data")({ repository: Repository }) {};
|
|
150388
|
+
var GithubPullRequestData = class extends Class("GithubPullRequestData")({ data: Data }) {};
|
|
150389
|
+
var Review = class extends Class("Review")({
|
|
150390
|
+
id: String$1,
|
|
150391
|
+
author: Author,
|
|
150392
|
+
body: String$1
|
|
150393
|
+
}) {};
|
|
150394
|
+
var Reviews = class extends Class("Reviews")({ nodes: Array$1(Review) }) {};
|
|
150395
|
+
var ReviewComment = class extends Class("ReviewComment")({
|
|
150388
150396
|
id: String$1,
|
|
150389
150397
|
author: Author,
|
|
150390
150398
|
body: String$1,
|
|
150391
150399
|
path: String$1,
|
|
150392
|
-
originalLine:
|
|
150393
|
-
diffHunk: String$1
|
|
150400
|
+
originalLine: Number$1,
|
|
150401
|
+
diffHunk: String$1,
|
|
150402
|
+
createdAt: String$1
|
|
150394
150403
|
}) {};
|
|
150395
|
-
var NodeComments = class extends Class("
|
|
150396
|
-
var
|
|
150404
|
+
var NodeComments = class extends Class("NodeComments")({ nodes: Array$1(ReviewComment) }) {};
|
|
150405
|
+
var ReviewThreadsNode = class extends Class("ReviewThreadsNode")({
|
|
150397
150406
|
isCollapsed: Boolean$2,
|
|
150398
150407
|
isOutdated: Boolean$2,
|
|
150399
150408
|
isResolved: Boolean$2,
|
|
@@ -150402,8 +150411,7 @@ var ReviewThreadNode = class extends Class("github/ReviewThreadNode")({
|
|
|
150402
150411
|
commentNodes = this.comments.nodes;
|
|
150403
150412
|
shouldDisplayThread = !this.isCollapsed && !this.isOutdated;
|
|
150404
150413
|
};
|
|
150405
|
-
var
|
|
150406
|
-
var ReviewThreads = class extends Class("github/ReviewThreads")({ edges: Array$1(ReviewThreadsEdge) }) {};
|
|
150414
|
+
var ReviewThreads = class extends Class("ReviewThreads")({ nodes: Array$1(ReviewThreadsNode) }) {};
|
|
150407
150415
|
|
|
150408
150416
|
//#endregion
|
|
150409
150417
|
//#region src/Github/Cli.ts
|
|
@@ -150413,15 +150421,16 @@ var GithubCli = class extends Service$1()("lalph/Github/Cli", { make: gen(functi
|
|
|
150413
150421
|
onNone: () => fail$4(new GithubCliRepoNotFound()),
|
|
150414
150422
|
onSome: (value) => succeed$1(value)
|
|
150415
150423
|
}))))).split("/");
|
|
150416
|
-
const reviewComments = (pr) => make$23`gh api graphql -f owner=${owner} -f repo=${repo} -F pr=${pr} -f query=${githubReviewCommentsQuery}`.pipe(string, flatMap$2(decodeEffect(
|
|
150424
|
+
const reviewComments = (pr) => make$23`gh api graphql -f owner=${owner} -f repo=${repo} -F pr=${pr} -f query=${githubReviewCommentsQuery}`.pipe(string, flatMap$2(decodeEffect(PullRequestDataFromJson)), map$8((data) => {
|
|
150417
150425
|
return {
|
|
150418
|
-
comments: data.data.repository.pullRequest.comments.
|
|
150419
|
-
|
|
150426
|
+
comments: data.data.repository.pullRequest.comments.nodes.filter((c) => !c.author.login.startsWith("github")),
|
|
150427
|
+
reviews: data.data.repository.pullRequest.reviews.nodes.filter((r) => r.body.trim().length > 0),
|
|
150428
|
+
reviewThreads: data.data.repository.pullRequest.reviewThreads.nodes
|
|
150420
150429
|
};
|
|
150421
150430
|
}), provideService(ChildProcessSpawner, spawner));
|
|
150422
|
-
const prFeedbackMd = (pr) => reviewComments(pr).pipe(map$8(({ comments, reviewThreads }) => {
|
|
150431
|
+
const prFeedbackMd = (pr) => reviewComments(pr).pipe(map$8(({ comments, reviewThreads, reviews }) => {
|
|
150423
150432
|
const eligibleReviewThreads = reviewThreads.filter((thread) => thread.shouldDisplayThread);
|
|
150424
|
-
if (comments.length === 0 && eligibleReviewThreads.length === 0) return `No review comments found.`;
|
|
150433
|
+
if (comments.length === 0 && eligibleReviewThreads.length === 0 && reviews.length === 0) return `No review comments found.`;
|
|
150425
150434
|
let content = `# PR feedback
|
|
150426
150435
|
|
|
150427
150436
|
Comments are rendered in XML format.`;
|
|
@@ -150432,6 +150441,18 @@ Comments are rendered in XML format.`;
|
|
|
150432
150441
|
## Review Comments
|
|
150433
150442
|
|
|
150434
150443
|
${reviewCommentsMd}`;
|
|
150444
|
+
}
|
|
150445
|
+
if (reviews.length > 0) {
|
|
150446
|
+
const reviewsXml = reviews.map((review) => `<review author="${review.author.login}">
|
|
150447
|
+
<body><![CDATA[${review.body}]]></body>
|
|
150448
|
+
</review>`).join("\n");
|
|
150449
|
+
content += `
|
|
150450
|
+
|
|
150451
|
+
## Reviews
|
|
150452
|
+
|
|
150453
|
+
<reviews>
|
|
150454
|
+
${reviewsXml}
|
|
150455
|
+
</reviews>`;
|
|
150435
150456
|
}
|
|
150436
150457
|
if (comments.length > 0) {
|
|
150437
150458
|
const generalCommentsXml = comments.map((comment) => renderGeneralComment(comment)).join("\n");
|
|
@@ -150470,46 +150491,55 @@ const renderReviewComments = (comment, followup) => `<comment author="${comment.
|
|
|
150470
150491
|
const renderGeneralComment = (comment) => ` <comment author="${comment.author.login}">
|
|
150471
150492
|
<body><![CDATA[${comment.body}]]></body>
|
|
150472
150493
|
</comment>`;
|
|
150473
|
-
const
|
|
150494
|
+
const PullRequestDataFromJson = fromJsonString(GithubPullRequestData);
|
|
150474
150495
|
const githubReviewCommentsQuery = `
|
|
150475
|
-
|
|
150476
|
-
|
|
150477
|
-
|
|
150478
|
-
|
|
150479
|
-
|
|
150480
|
-
|
|
150481
|
-
|
|
150482
|
-
|
|
150483
|
-
|
|
150484
|
-
|
|
150485
|
-
isResolved
|
|
150486
|
-
comments(first: 100) {
|
|
150487
|
-
nodes {
|
|
150488
|
-
id
|
|
150489
|
-
author { login }
|
|
150490
|
-
body
|
|
150491
|
-
path
|
|
150492
|
-
originalLine
|
|
150493
|
-
diffHunk
|
|
150494
|
-
createdAt
|
|
150495
|
-
}
|
|
150496
|
-
}
|
|
150497
|
-
}
|
|
150496
|
+
query FetchPRComments($owner: String!, $repo: String!, $pr: Int!) {
|
|
150497
|
+
repository(owner: $owner, name: $repo) {
|
|
150498
|
+
pullRequest(number: $pr) {
|
|
150499
|
+
url
|
|
150500
|
+
reviewDecision
|
|
150501
|
+
reviews(first: 100) {
|
|
150502
|
+
nodes {
|
|
150503
|
+
id
|
|
150504
|
+
author {
|
|
150505
|
+
login
|
|
150498
150506
|
}
|
|
150507
|
+
body
|
|
150499
150508
|
}
|
|
150500
|
-
|
|
150501
|
-
|
|
150502
|
-
|
|
150509
|
+
}
|
|
150510
|
+
reviewThreads(first: 100) {
|
|
150511
|
+
nodes {
|
|
150512
|
+
isCollapsed
|
|
150513
|
+
isOutdated
|
|
150514
|
+
isResolved
|
|
150515
|
+
comments(first: 100) {
|
|
150516
|
+
nodes {
|
|
150503
150517
|
id
|
|
150518
|
+
author {
|
|
150519
|
+
login
|
|
150520
|
+
}
|
|
150504
150521
|
body
|
|
150505
|
-
|
|
150522
|
+
path
|
|
150523
|
+
originalLine
|
|
150524
|
+
diffHunk
|
|
150506
150525
|
createdAt
|
|
150507
150526
|
}
|
|
150508
150527
|
}
|
|
150509
150528
|
}
|
|
150510
150529
|
}
|
|
150530
|
+
comments(first: 100) {
|
|
150531
|
+
nodes {
|
|
150532
|
+
id
|
|
150533
|
+
body
|
|
150534
|
+
author {
|
|
150535
|
+
login
|
|
150536
|
+
}
|
|
150537
|
+
createdAt
|
|
150538
|
+
}
|
|
150539
|
+
}
|
|
150511
150540
|
}
|
|
150512
150541
|
}
|
|
150542
|
+
}
|
|
150513
150543
|
`;
|
|
150514
150544
|
|
|
150515
150545
|
//#endregion
|
|
@@ -152220,7 +152250,7 @@ const commandSource = make$35("source").pipe(withDescription("Select the issue s
|
|
|
152220
152250
|
|
|
152221
152251
|
//#endregion
|
|
152222
152252
|
//#region package.json
|
|
152223
|
-
var version = "0.2.
|
|
152253
|
+
var version = "0.2.19";
|
|
152224
152254
|
|
|
152225
152255
|
//#endregion
|
|
152226
152256
|
//#region src/commands/projects/ls.ts
|
package/package.json
CHANGED
package/src/Github/Cli.ts
CHANGED
|
@@ -10,9 +10,9 @@ import {
|
|
|
10
10
|
} from "effect"
|
|
11
11
|
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
|
|
12
12
|
import {
|
|
13
|
-
CommentsData,
|
|
14
|
-
ReviewComment,
|
|
15
13
|
Comment,
|
|
14
|
+
GithubPullRequestData,
|
|
15
|
+
ReviewComment,
|
|
16
16
|
} from "../domain/GithubComment.ts"
|
|
17
17
|
|
|
18
18
|
export class GithubCli extends ServiceMap.Service<GithubCli>()(
|
|
@@ -41,17 +41,19 @@ export class GithubCli extends ServiceMap.Service<GithubCli>()(
|
|
|
41
41
|
const reviewComments = (pr: number) =>
|
|
42
42
|
ChildProcess.make`gh api graphql -f owner=${owner} -f repo=${repo} -F pr=${pr} -f query=${githubReviewCommentsQuery}`.pipe(
|
|
43
43
|
ChildProcess.string,
|
|
44
|
-
Effect.flatMap(Schema.decodeEffect(
|
|
44
|
+
Effect.flatMap(Schema.decodeEffect(PullRequestDataFromJson)),
|
|
45
45
|
Effect.map((data) => {
|
|
46
46
|
const comments =
|
|
47
|
-
data.data.repository.pullRequest.comments.
|
|
48
|
-
(
|
|
47
|
+
data.data.repository.pullRequest.comments.nodes.filter(
|
|
48
|
+
(c) => !c.author.login.startsWith("github"),
|
|
49
49
|
)
|
|
50
|
-
const
|
|
51
|
-
data.data.repository.pullRequest.
|
|
52
|
-
(
|
|
50
|
+
const reviews =
|
|
51
|
+
data.data.repository.pullRequest.reviews.nodes.filter(
|
|
52
|
+
(r) => r.body.trim().length > 0,
|
|
53
53
|
)
|
|
54
|
-
|
|
54
|
+
const reviewThreads =
|
|
55
|
+
data.data.repository.pullRequest.reviewThreads.nodes
|
|
56
|
+
return { comments, reviews, reviewThreads } as const
|
|
55
57
|
}),
|
|
56
58
|
Effect.provideService(
|
|
57
59
|
ChildProcessSpawner.ChildProcessSpawner,
|
|
@@ -61,12 +63,16 @@ export class GithubCli extends ServiceMap.Service<GithubCli>()(
|
|
|
61
63
|
|
|
62
64
|
const prFeedbackMd = (pr: number) =>
|
|
63
65
|
reviewComments(pr).pipe(
|
|
64
|
-
Effect.map(({ comments, reviewThreads }) => {
|
|
66
|
+
Effect.map(({ comments, reviewThreads, reviews }) => {
|
|
65
67
|
const eligibleReviewThreads = reviewThreads.filter(
|
|
66
68
|
(thread) => thread.shouldDisplayThread,
|
|
67
69
|
)
|
|
68
70
|
|
|
69
|
-
if (
|
|
71
|
+
if (
|
|
72
|
+
comments.length === 0 &&
|
|
73
|
+
eligibleReviewThreads.length === 0 &&
|
|
74
|
+
reviews.length === 0
|
|
75
|
+
) {
|
|
70
76
|
return `No review comments found.`
|
|
71
77
|
}
|
|
72
78
|
|
|
@@ -90,6 +96,23 @@ Comments are rendered in XML format.`
|
|
|
90
96
|
${reviewCommentsMd}`
|
|
91
97
|
}
|
|
92
98
|
|
|
99
|
+
if (reviews.length > 0) {
|
|
100
|
+
const reviewsXml = reviews
|
|
101
|
+
.map(
|
|
102
|
+
(review) => `<review author="${review.author.login}">
|
|
103
|
+
<body><![CDATA[${review.body}]]></body>
|
|
104
|
+
</review>`,
|
|
105
|
+
)
|
|
106
|
+
.join("\n")
|
|
107
|
+
content += `
|
|
108
|
+
|
|
109
|
+
## Reviews
|
|
110
|
+
|
|
111
|
+
<reviews>
|
|
112
|
+
${reviewsXml}
|
|
113
|
+
</reviews>`
|
|
114
|
+
}
|
|
115
|
+
|
|
93
116
|
if (comments.length > 0) {
|
|
94
117
|
const generalCommentsXml = comments
|
|
95
118
|
.map((comment) => renderGeneralComment(comment))
|
|
@@ -155,45 +178,54 @@ const renderGeneralComment = (
|
|
|
155
178
|
|
|
156
179
|
// Schema definitions and GraphQL query
|
|
157
180
|
|
|
158
|
-
const
|
|
181
|
+
const PullRequestDataFromJson = Schema.fromJsonString(GithubPullRequestData)
|
|
159
182
|
|
|
160
183
|
const githubReviewCommentsQuery = `
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
isResolved
|
|
172
|
-
comments(first: 100) {
|
|
173
|
-
nodes {
|
|
174
|
-
id
|
|
175
|
-
author { login }
|
|
176
|
-
body
|
|
177
|
-
path
|
|
178
|
-
originalLine
|
|
179
|
-
diffHunk
|
|
180
|
-
createdAt
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
+
query FetchPRComments($owner: String!, $repo: String!, $pr: Int!) {
|
|
185
|
+
repository(owner: $owner, name: $repo) {
|
|
186
|
+
pullRequest(number: $pr) {
|
|
187
|
+
url
|
|
188
|
+
reviewDecision
|
|
189
|
+
reviews(first: 100) {
|
|
190
|
+
nodes {
|
|
191
|
+
id
|
|
192
|
+
author {
|
|
193
|
+
login
|
|
184
194
|
}
|
|
195
|
+
body
|
|
185
196
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
197
|
+
}
|
|
198
|
+
reviewThreads(first: 100) {
|
|
199
|
+
nodes {
|
|
200
|
+
isCollapsed
|
|
201
|
+
isOutdated
|
|
202
|
+
isResolved
|
|
203
|
+
comments(first: 100) {
|
|
204
|
+
nodes {
|
|
189
205
|
id
|
|
206
|
+
author {
|
|
207
|
+
login
|
|
208
|
+
}
|
|
190
209
|
body
|
|
191
|
-
|
|
210
|
+
path
|
|
211
|
+
originalLine
|
|
212
|
+
diffHunk
|
|
192
213
|
createdAt
|
|
193
214
|
}
|
|
194
215
|
}
|
|
195
216
|
}
|
|
196
217
|
}
|
|
218
|
+
comments(first: 100) {
|
|
219
|
+
nodes {
|
|
220
|
+
id
|
|
221
|
+
body
|
|
222
|
+
author {
|
|
223
|
+
login
|
|
224
|
+
}
|
|
225
|
+
createdAt
|
|
226
|
+
}
|
|
227
|
+
}
|
|
197
228
|
}
|
|
198
229
|
}
|
|
230
|
+
}
|
|
199
231
|
`
|
|
@@ -1,62 +1,70 @@
|
|
|
1
1
|
import * as S from "effect/Schema"
|
|
2
2
|
|
|
3
|
-
export class Author extends S.Class<Author>("
|
|
3
|
+
export class Author extends S.Class<Author>("Author")({
|
|
4
4
|
login: S.String,
|
|
5
5
|
}) {}
|
|
6
6
|
|
|
7
|
-
export class Comment extends S.Class<Comment>("
|
|
7
|
+
export class Comment extends S.Class<Comment>("Comment")({
|
|
8
8
|
id: S.String,
|
|
9
9
|
body: S.String,
|
|
10
10
|
author: Author,
|
|
11
|
-
|
|
12
|
-
}) {}
|
|
13
|
-
|
|
14
|
-
export class CommentsEdge extends S.Class<CommentsEdge>("github/CommentsEdge")({
|
|
15
|
-
node: Comment,
|
|
11
|
+
createdAt: S.String,
|
|
16
12
|
}) {}
|
|
17
13
|
|
|
18
14
|
export class PullRequestComments extends S.Class<PullRequestComments>(
|
|
19
15
|
"PullRequestComments",
|
|
20
16
|
)({
|
|
21
|
-
|
|
17
|
+
nodes: S.Array(Comment),
|
|
22
18
|
}) {}
|
|
23
19
|
|
|
24
|
-
export class PullRequest extends S.Class<PullRequest>("
|
|
20
|
+
export class PullRequest extends S.Class<PullRequest>("PullRequest")({
|
|
25
21
|
url: S.String,
|
|
22
|
+
reviewDecision: S.Null,
|
|
23
|
+
reviews: S.suspend(() => Reviews),
|
|
26
24
|
reviewThreads: S.suspend(() => ReviewThreads),
|
|
27
25
|
comments: PullRequestComments,
|
|
28
26
|
}) {}
|
|
29
27
|
|
|
30
|
-
export class Repository extends S.Class<Repository>("
|
|
28
|
+
export class Repository extends S.Class<Repository>("Repository")({
|
|
31
29
|
pullRequest: PullRequest,
|
|
32
30
|
}) {}
|
|
33
31
|
|
|
34
|
-
export class Data extends S.Class<Data>("
|
|
32
|
+
export class Data extends S.Class<Data>("Data")({
|
|
35
33
|
repository: Repository,
|
|
36
34
|
}) {}
|
|
37
35
|
|
|
38
|
-
export class
|
|
36
|
+
export class GithubPullRequestData extends S.Class<GithubPullRequestData>(
|
|
37
|
+
"GithubPullRequestData",
|
|
38
|
+
)({
|
|
39
39
|
data: Data,
|
|
40
40
|
}) {}
|
|
41
41
|
|
|
42
|
-
export class
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
export class Review extends S.Class<Review>("Review")({
|
|
43
|
+
id: S.String,
|
|
44
|
+
author: Author,
|
|
45
|
+
body: S.String,
|
|
46
|
+
}) {}
|
|
47
|
+
|
|
48
|
+
export class Reviews extends S.Class<Reviews>("Reviews")({
|
|
49
|
+
nodes: S.Array(Review),
|
|
50
|
+
}) {}
|
|
51
|
+
|
|
52
|
+
export class ReviewComment extends S.Class<ReviewComment>("ReviewComment")({
|
|
45
53
|
id: S.String,
|
|
46
54
|
author: Author,
|
|
47
55
|
body: S.String,
|
|
48
56
|
path: S.String,
|
|
49
|
-
originalLine: S.
|
|
57
|
+
originalLine: S.Number,
|
|
50
58
|
diffHunk: S.String,
|
|
51
|
-
|
|
59
|
+
createdAt: S.String,
|
|
52
60
|
}) {}
|
|
53
61
|
|
|
54
|
-
export class NodeComments extends S.Class<NodeComments>("
|
|
62
|
+
export class NodeComments extends S.Class<NodeComments>("NodeComments")({
|
|
55
63
|
nodes: S.Array(ReviewComment),
|
|
56
64
|
}) {}
|
|
57
65
|
|
|
58
|
-
export class
|
|
59
|
-
"
|
|
66
|
+
export class ReviewThreadsNode extends S.Class<ReviewThreadsNode>(
|
|
67
|
+
"ReviewThreadsNode",
|
|
60
68
|
)({
|
|
61
69
|
isCollapsed: S.Boolean,
|
|
62
70
|
isOutdated: S.Boolean,
|
|
@@ -67,14 +75,6 @@ export class ReviewThreadNode extends S.Class<ReviewThreadNode>(
|
|
|
67
75
|
readonly shouldDisplayThread = !this.isCollapsed && !this.isOutdated
|
|
68
76
|
}
|
|
69
77
|
|
|
70
|
-
export class
|
|
71
|
-
|
|
72
|
-
)({
|
|
73
|
-
node: ReviewThreadNode,
|
|
74
|
-
}) {}
|
|
75
|
-
|
|
76
|
-
export class ReviewThreads extends S.Class<ReviewThreads>(
|
|
77
|
-
"github/ReviewThreads",
|
|
78
|
-
)({
|
|
79
|
-
edges: S.Array(ReviewThreadsEdge),
|
|
78
|
+
export class ReviewThreads extends S.Class<ReviewThreads>("ReviewThreads")({
|
|
79
|
+
nodes: S.Array(ReviewThreadsNode),
|
|
80
80
|
}) {}
|