github-issue-tower-defence-management 1.147.3 → 1.147.5
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/CHANGELOG.md +14 -0
- package/bin/adapter/entry-points/console/ui-dist/assets/index-D7Yt5Ya6.js +82 -0
- package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +12 -4
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +48 -0
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +55 -25
- package/src/adapter/entry-points/console/ui-dist/assets/index-D7Yt5Ya6.js +82 -0
- package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.test.ts +63 -0
- package/src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts +24 -7
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +2 -1
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-CtUryuGr.js +0 -82
- package/src/adapter/entry-points/console/ui-dist/assets/index-CtUryuGr.js +0 -82
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TDPM Console</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-D7Yt5Ya6.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-BihdmZb-.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -29,8 +29,7 @@ class ConvertCheckboxToIssueInStoryIssueUseCase {
|
|
|
29
29
|
console.warn(`ConvertCheckboxToIssueInStoryIssueUseCase: story issue not found by URL (possibly deleted), skipping story. storyIssueUrl: ${storyIssue.url}`);
|
|
30
30
|
continue;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
let newBody = this.bodyWithStoryViewLinkOnFirstLine(freshStoryIssue.body, storyViewLink);
|
|
32
|
+
let newBody = this.bodyWithStoryViewLinkOnFirstLine(freshStoryIssue.body, input.urlOfStoryView, storyOption.name);
|
|
34
33
|
if (newBody !== freshStoryIssue.body) {
|
|
35
34
|
await this.issueRepository.updateIssue({
|
|
36
35
|
...freshStoryIssue,
|
|
@@ -63,11 +62,14 @@ class ConvertCheckboxToIssueInStoryIssueUseCase {
|
|
|
63
62
|
}
|
|
64
63
|
}
|
|
65
64
|
};
|
|
66
|
-
this.bodyWithStoryViewLinkOnFirstLine = (body,
|
|
65
|
+
this.bodyWithStoryViewLinkOnFirstLine = (body, urlOfStoryView, storyName) => {
|
|
66
|
+
const storyViewLink = this.buildStoryViewLink(urlOfStoryView, storyName);
|
|
67
|
+
const storyViewLinkPattern = this.buildStoryViewLinkPattern(urlOfStoryView, storyName);
|
|
68
|
+
const isStoryViewLinkLine = (line) => storyViewLinkPattern.test(line);
|
|
67
69
|
const lines = body.split('\n');
|
|
68
70
|
const remainingLines = [];
|
|
69
71
|
for (let i = 0; i < lines.length; i++) {
|
|
70
|
-
if (!lines[i]
|
|
72
|
+
if (!isStoryViewLinkLine(lines[i])) {
|
|
71
73
|
remainingLines.push(lines[i]);
|
|
72
74
|
continue;
|
|
73
75
|
}
|
|
@@ -88,6 +90,12 @@ class ConvertCheckboxToIssueInStoryIssueUseCase {
|
|
|
88
90
|
this.buildStoryViewLink = (urlOfStoryView, storyName) => {
|
|
89
91
|
return `${urlOfStoryView}?sliceBy%5Bvalue%5D=${(0, utils_1.encodeForURI)(storyName)}`;
|
|
90
92
|
};
|
|
93
|
+
this.buildStoryViewLinkPattern = (urlOfStoryView, storyName) => {
|
|
94
|
+
const escapeForRegularExpression = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
95
|
+
const storyViewProjectUrl = urlOfStoryView.split('/views/')[0];
|
|
96
|
+
const storySliceQuery = `?sliceBy%5Bvalue%5D=${(0, utils_1.encodeForURI)(storyName)}`;
|
|
97
|
+
return new RegExp(`${escapeForRegularExpression(storyViewProjectUrl)}(/views/\\d+)?${escapeForRegularExpression(storySliceQuery)}(?![\\w%])`);
|
|
98
|
+
};
|
|
91
99
|
this.findCheckboxTextsNotCreatedIssue = (storyIssueBody) => {
|
|
92
100
|
const regexToFindCheckboxes = /^- \[ ] (.*)$/gm;
|
|
93
101
|
const match = storyIssueBody.match(regexToFindCheckboxes);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConvertCheckboxToIssueInStoryIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts"],"names":[],"mappings":";;;AAIA,mCAAuC;AACvC,+DAAgE;AAGhE,MAAa,yCAAyC;IACpD,YACW,eAOR;QAPQ,oBAAe,GAAf,eAAe,CAOvB;QAGH,QAAG,GAAG,KAAK,EAAE,KAQZ,EAAiB,EAAE;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;gBAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CACzC,CAAC;gBACF,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC/D,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,SAAS;gBACX,CAAC;qBAAM,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC;qBAAM,IACL,UAAU,CAAC,QAAQ;oBACnB,UAAU,CAAC,MAAM,KAAK,mCAAkB,EACxC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAC9D,UAAU,CAAC,GAAG,CACf,CAAC;gBACF,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CACV,8HAA8H,UAAU,CAAC,GAAG,EAAE,CAC/I,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,
|
|
1
|
+
{"version":3,"file":"ConvertCheckboxToIssueInStoryIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -91,6 +91,54 @@ describe('renderMarkdownToSafeHtml', () => {
|
|
|
91
91
|
});
|
|
92
92
|
expect(html).toContain('href="https://github.com/owner/repo/issues/9"');
|
|
93
93
|
});
|
|
94
|
+
|
|
95
|
+
it('links an owner/repo#N reference to the referenced repository issues path', () => {
|
|
96
|
+
const html = renderMarkdownToSafeHtml(
|
|
97
|
+
'- close other-owner/other-repo#1547',
|
|
98
|
+
{
|
|
99
|
+
owner: 'owner',
|
|
100
|
+
repo: 'repo',
|
|
101
|
+
},
|
|
102
|
+
);
|
|
103
|
+
expect(html).toContain(
|
|
104
|
+
'href="https://github.com/other-owner/other-repo/issues/1547"',
|
|
105
|
+
);
|
|
106
|
+
expect(html).toContain('>other-owner/other-repo#1547</a>');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('does not link the number of an owner/repo#N reference to the displayed repository', () => {
|
|
110
|
+
const html = renderMarkdownToSafeHtml(
|
|
111
|
+
'- close other-owner/other-repo#1547',
|
|
112
|
+
{
|
|
113
|
+
owner: 'owner',
|
|
114
|
+
repo: 'repo',
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
expect(html).not.toContain('https://github.com/owner/repo/issues/1547');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('links an owner/repo#N reference even when no repo context is given', () => {
|
|
121
|
+
const html = renderMarkdownToSafeHtml('close other-owner/other-repo#1547');
|
|
122
|
+
expect(html).toContain(
|
|
123
|
+
'href="https://github.com/other-owner/other-repo/issues/1547"',
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('keeps a URL ending in a numeric fragment as a single link', () => {
|
|
128
|
+
const html = renderMarkdownToSafeHtml(
|
|
129
|
+
'see https://github.com/other-owner/other-repo#123',
|
|
130
|
+
{
|
|
131
|
+
owner: 'owner',
|
|
132
|
+
repo: 'repo',
|
|
133
|
+
},
|
|
134
|
+
);
|
|
135
|
+
expect(html).toContain(
|
|
136
|
+
'href="https://github.com/other-owner/other-repo#123"',
|
|
137
|
+
);
|
|
138
|
+
expect(html).not.toContain(
|
|
139
|
+
'href="https://github.com/other-owner/other-repo/issues/123"',
|
|
140
|
+
);
|
|
141
|
+
});
|
|
94
142
|
});
|
|
95
143
|
|
|
96
144
|
describe('splitMarkdownSegments', () => {
|
|
@@ -9,19 +9,65 @@ export type { ConsoleRepoContext } from '../logic/references';
|
|
|
9
9
|
type IssueReferenceToken = Tokens.Generic & {
|
|
10
10
|
type: 'consoleIssueReference';
|
|
11
11
|
raw: string;
|
|
12
|
-
|
|
12
|
+
href: string;
|
|
13
|
+
label: string;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
const
|
|
16
|
+
const SAME_REPOSITORY_REFERENCE_PATTERN = /^#(\d+)\b/;
|
|
17
|
+
const CROSS_REPOSITORY_REFERENCE_PATTERN = /^([\w.-]+)\/([\w.-]+)#(\d+)\b/;
|
|
18
|
+
const REFERENCE_START_PATTERN = /[\w.-]+\/[\w.-]+#\d|#\d/g;
|
|
19
|
+
const REFERENCE_PRECEDING_CHARACTER_PATTERN = /[\w/:@-]/;
|
|
16
20
|
|
|
17
21
|
let activeRepoContext: ConsoleRepoContext | null = null;
|
|
18
22
|
|
|
19
|
-
const
|
|
23
|
+
const issuesUrl = (owner: string, repo: string, numberText: string): string =>
|
|
24
|
+
`https://github.com/${owner}/${repo}/issues/${numberText}`;
|
|
25
|
+
|
|
26
|
+
const isReferenceBoundary = (source: string, index: number): boolean =>
|
|
27
|
+
index === 0 || !REFERENCE_PRECEDING_CHARACTER_PATTERN.test(source[index - 1]);
|
|
28
|
+
|
|
29
|
+
const referenceStartIndex = (source: string): number | undefined => {
|
|
30
|
+
for (const match of source.matchAll(REFERENCE_START_PATTERN)) {
|
|
31
|
+
if (match.index !== undefined && isReferenceBoundary(source, match.index)) {
|
|
32
|
+
return match.index;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const matchIssueReference = (
|
|
39
|
+
source: string,
|
|
40
|
+
): IssueReferenceToken | undefined => {
|
|
41
|
+
const crossRepositoryMatch = CROSS_REPOSITORY_REFERENCE_PATTERN.exec(source);
|
|
42
|
+
if (crossRepositoryMatch !== null) {
|
|
43
|
+
return {
|
|
44
|
+
type: 'consoleIssueReference',
|
|
45
|
+
raw: crossRepositoryMatch[0],
|
|
46
|
+
href: issuesUrl(
|
|
47
|
+
crossRepositoryMatch[1],
|
|
48
|
+
crossRepositoryMatch[2],
|
|
49
|
+
crossRepositoryMatch[3],
|
|
50
|
+
),
|
|
51
|
+
label: crossRepositoryMatch[0],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
20
54
|
if (activeRepoContext === null) {
|
|
21
|
-
return
|
|
55
|
+
return undefined;
|
|
22
56
|
}
|
|
23
|
-
const
|
|
24
|
-
|
|
57
|
+
const sameRepositoryMatch = SAME_REPOSITORY_REFERENCE_PATTERN.exec(source);
|
|
58
|
+
if (sameRepositoryMatch === null) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
type: 'consoleIssueReference',
|
|
63
|
+
raw: sameRepositoryMatch[0],
|
|
64
|
+
href: issuesUrl(
|
|
65
|
+
activeRepoContext.owner,
|
|
66
|
+
activeRepoContext.repo,
|
|
67
|
+
sameRepositoryMatch[1],
|
|
68
|
+
),
|
|
69
|
+
label: sameRepositoryMatch[0],
|
|
70
|
+
};
|
|
25
71
|
};
|
|
26
72
|
|
|
27
73
|
marked.use(
|
|
@@ -37,30 +83,14 @@ marked.use({
|
|
|
37
83
|
name: 'consoleIssueReference',
|
|
38
84
|
level: 'inline',
|
|
39
85
|
start(src: string) {
|
|
40
|
-
|
|
41
|
-
return index === -1 ? undefined : index;
|
|
86
|
+
return referenceStartIndex(src);
|
|
42
87
|
},
|
|
43
88
|
tokenizer(src: string): IssueReferenceToken | undefined {
|
|
44
|
-
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
const match = ISSUE_REFERENCE_PATTERN.exec(src);
|
|
48
|
-
if (match === null) {
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
type: 'consoleIssueReference',
|
|
53
|
-
raw: match[0],
|
|
54
|
-
numberText: match[1],
|
|
55
|
-
};
|
|
89
|
+
return matchIssueReference(src);
|
|
56
90
|
},
|
|
57
91
|
renderer(token: Tokens.Generic): string {
|
|
58
92
|
const reference = token as IssueReferenceToken;
|
|
59
|
-
|
|
60
|
-
if (href === null) {
|
|
61
|
-
return reference.raw;
|
|
62
|
-
}
|
|
63
|
-
return `<a href="${href}">#${reference.numberText}</a>`;
|
|
93
|
+
return `<a href="${reference.href}">${reference.label}</a>`;
|
|
64
94
|
},
|
|
65
95
|
},
|
|
66
96
|
],
|