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 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("github/Author")({ login: String$1 }) {};
150372
- var Comment = class extends Class("github/Comment")({
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 CommentsEdge = class extends Class("github/CommentsEdge")({ node: Comment }) {};
150378
- var PullRequestComments = class extends Class("PullRequestComments")({ edges: Array$1(CommentsEdge) }) {};
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("github/Repository")({ pullRequest: PullRequest }) {};
150385
- var Data = class extends Class("github/Data")({ repository: Repository }) {};
150386
- var CommentsData = class extends Class("github/CommentsData")({ data: Data }) {};
150387
- var ReviewComment = class extends Class("github/ReviewComment")({
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: NullOr(Number$1),
150393
- diffHunk: String$1
150400
+ originalLine: Number$1,
150401
+ diffHunk: String$1,
150402
+ createdAt: String$1
150394
150403
  }) {};
150395
- var NodeComments = class extends Class("github/NodeComments")({ nodes: Array$1(ReviewComment) }) {};
150396
- var ReviewThreadNode = class extends Class("github/ReviewThreadNode")({
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 ReviewThreadsEdge = class extends Class("ReviewThreadsEdge")({ node: ReviewThreadNode }) {};
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(CommentsFromJson)), map$8((data) => {
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.edges.map((edge) => edge.node),
150419
- reviewThreads: data.data.repository.pullRequest.reviewThreads.edges.map((edge) => edge.node)
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 CommentsFromJson = fromJsonString(CommentsData);
150494
+ const PullRequestDataFromJson = fromJsonString(GithubPullRequestData);
150474
150495
  const githubReviewCommentsQuery = `
150475
- query FetchPRComments($owner: String!, $repo: String!, $pr: Int!) {
150476
- repository(owner: $owner, name: $repo) {
150477
- pullRequest(number: $pr) {
150478
- url
150479
- reviewDecision
150480
- reviewThreads(first: 100) {
150481
- edges {
150482
- node {
150483
- isCollapsed
150484
- isOutdated
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
- comments(first: 100) {
150501
- edges {
150502
- node {
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
- author { login }
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.18";
152253
+ var version = "0.2.19";
152224
152254
 
152225
152255
  //#endregion
152226
152256
  //#region src/commands/projects/ls.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lalph",
3
3
  "type": "module",
4
- "version": "0.2.18",
4
+ "version": "0.2.19",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
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(CommentsFromJson)),
44
+ Effect.flatMap(Schema.decodeEffect(PullRequestDataFromJson)),
45
45
  Effect.map((data) => {
46
46
  const comments =
47
- data.data.repository.pullRequest.comments.edges.map(
48
- (edge) => edge.node,
47
+ data.data.repository.pullRequest.comments.nodes.filter(
48
+ (c) => !c.author.login.startsWith("github"),
49
49
  )
50
- const reviewThreads =
51
- data.data.repository.pullRequest.reviewThreads.edges.map(
52
- (edge) => edge.node,
50
+ const reviews =
51
+ data.data.repository.pullRequest.reviews.nodes.filter(
52
+ (r) => r.body.trim().length > 0,
53
53
  )
54
- return { comments, reviewThreads } as const
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 (comments.length === 0 && eligibleReviewThreads.length === 0) {
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 CommentsFromJson = Schema.fromJsonString(CommentsData)
181
+ const PullRequestDataFromJson = Schema.fromJsonString(GithubPullRequestData)
159
182
 
160
183
  const githubReviewCommentsQuery = `
161
- query FetchPRComments($owner: String!, $repo: String!, $pr: Int!) {
162
- repository(owner: $owner, name: $repo) {
163
- pullRequest(number: $pr) {
164
- url
165
- reviewDecision
166
- reviewThreads(first: 100) {
167
- edges {
168
- node {
169
- isCollapsed
170
- isOutdated
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
- comments(first: 100) {
187
- edges {
188
- node {
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
- author { login }
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>("github/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>("github/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
- // createdAt: S.String,
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
- edges: S.Array(CommentsEdge),
17
+ nodes: S.Array(Comment),
22
18
  }) {}
23
19
 
24
- export class PullRequest extends S.Class<PullRequest>("github/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>("github/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>("github/Data")({
32
+ export class Data extends S.Class<Data>("Data")({
35
33
  repository: Repository,
36
34
  }) {}
37
35
 
38
- export class CommentsData extends S.Class<CommentsData>("github/CommentsData")({
36
+ export class GithubPullRequestData extends S.Class<GithubPullRequestData>(
37
+ "GithubPullRequestData",
38
+ )({
39
39
  data: Data,
40
40
  }) {}
41
41
 
42
- export class ReviewComment extends S.Class<ReviewComment>(
43
- "github/ReviewComment",
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.NullOr(S.Number),
57
+ originalLine: S.Number,
50
58
  diffHunk: S.String,
51
- // createdAt: S.String,
59
+ createdAt: S.String,
52
60
  }) {}
53
61
 
54
- export class NodeComments extends S.Class<NodeComments>("github/NodeComments")({
62
+ export class NodeComments extends S.Class<NodeComments>("NodeComments")({
55
63
  nodes: S.Array(ReviewComment),
56
64
  }) {}
57
65
 
58
- export class ReviewThreadNode extends S.Class<ReviewThreadNode>(
59
- "github/ReviewThreadNode",
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 ReviewThreadsEdge extends S.Class<ReviewThreadsEdge>(
71
- "ReviewThreadsEdge",
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
  }) {}