github-issue-tower-defence-management 1.73.0 → 1.73.1
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 +7 -0
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +1 -1
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -1
- package/bin/domain/usecases/utils.js +1 -1
- package/bin/domain/usecases/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +66 -0
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +1 -1
- package/src/domain/usecases/utils.test.ts +35 -0
- package/src/domain/usecases/utils.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.73.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.73.0...v1.73.1) (2026-06-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **security:** use global regex replace to fully sanitize URI characters and quote characters ([e06dbd6](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/e06dbd69a124101761e1357405e4c72668a37241)), closes [#720](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/720)
|
|
7
|
+
|
|
1
8
|
# [1.73.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.72.0...v1.73.0) (2026-06-06)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyzeProblemByIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/AnalyzeProblemByIssueUseCase.ts"],"names":[],"mappings":";;;AAKA,MAAa,4BAA4B;IACvC,YACW,eAAuD,EACvD,cAGR;QAJQ,oBAAe,GAAf,eAAe,CAAwC;QACvD,mBAAc,GAAd,cAAc,CAGtB;QAGH,QAAG,GAAG,KAAK,EAAE,KAIZ,EAAiB,EAAE;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,IACE,CAAC,KAAK;gBACN,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CACrB,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/D,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;gBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CACtC,UAAU,EACV,IAAI,CAAC,wBAAwB,CAAC,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,CAAC,CAC9D,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QACF,6BAAwB,GAAG,CACzB,WAEC,EACO,EAAE;YACV,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;gBAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC,CAAC;YACF,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE;gBAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"AnalyzeProblemByIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/AnalyzeProblemByIssueUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ const encodeForURI = (url) => {
|
|
|
5
5
|
if (!url) {
|
|
6
6
|
return '';
|
|
7
7
|
}
|
|
8
|
-
return encodeURI(url).replace(
|
|
8
|
+
return encodeURI(url).replace(/#/g, '%23').replace(/&/g, '%26');
|
|
9
9
|
};
|
|
10
10
|
exports.encodeForURI = encodeForURI;
|
|
11
11
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/domain/usecases/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,GAAmB,EAAU,EAAE;IAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/domain/usecases/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,GAAmB,EAAU,EAAE;IAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC,CAAC;AALW,QAAA,YAAY,gBAKvB"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mock } from 'jest-mock-extended';
|
|
2
|
+
import { AnalyzeProblemByIssueUseCase } from './AnalyzeProblemByIssueUseCase';
|
|
3
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
4
|
+
import { DateRepository } from './adapter-interfaces/DateRepository';
|
|
5
|
+
import { Issue } from '../entities/Issue';
|
|
6
|
+
import { StoryObject } from '../entities/StoryObjectMap';
|
|
7
|
+
import { StoryOption } from '../entities/Project';
|
|
8
|
+
|
|
9
|
+
describe('AnalyzeProblemByIssueUseCase', () => {
|
|
10
|
+
const mockIssueRepository = mock<IssueRepository>();
|
|
11
|
+
const mockDateRepository = mock<DateRepository>();
|
|
12
|
+
const useCase = new AnalyzeProblemByIssueUseCase(
|
|
13
|
+
mockIssueRepository,
|
|
14
|
+
mockDateRepository,
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
describe('createSummaryCommentBody', () => {
|
|
18
|
+
const createIssueWithTitle = (title: string): Issue => {
|
|
19
|
+
const issue = mock<Issue>();
|
|
20
|
+
issue.url = 'https://github.com/org/repo/issues/1';
|
|
21
|
+
issue.number = 1;
|
|
22
|
+
issue.title = title;
|
|
23
|
+
issue.isClosed = false;
|
|
24
|
+
issue.assignees = [];
|
|
25
|
+
issue.dependedIssueUrls = [];
|
|
26
|
+
issue.estimationMinutes = null;
|
|
27
|
+
issue.completionDate50PercentConfidence = null;
|
|
28
|
+
return issue;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const createStoryIssue = (): Issue => {
|
|
32
|
+
const issue = mock<Issue>();
|
|
33
|
+
issue.url = 'https://github.com/org/repo/issues/100';
|
|
34
|
+
issue.number = 100;
|
|
35
|
+
issue.title = 'Story';
|
|
36
|
+
return issue;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
it('should replace all double-quote characters in the issue title with single quotes', () => {
|
|
40
|
+
const titleWithMultipleQuotes = 'a"b"c"d';
|
|
41
|
+
const storyObject: StoryObject & { storyIssue: Issue } = {
|
|
42
|
+
story: mock<StoryOption>(),
|
|
43
|
+
storyIssue: createStoryIssue(),
|
|
44
|
+
issues: [createIssueWithTitle(titleWithMultipleQuotes)],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const result = useCase.createSummaryCommentBody(storyObject);
|
|
48
|
+
|
|
49
|
+
expect(result).toContain("a'b'c'd");
|
|
50
|
+
expect(result).not.toContain('a"b');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should leave titles without double-quote characters unchanged', () => {
|
|
54
|
+
const plainTitle = 'plain title';
|
|
55
|
+
const storyObject: StoryObject & { storyIssue: Issue } = {
|
|
56
|
+
story: mock<StoryOption>(),
|
|
57
|
+
storyIssue: createStoryIssue(),
|
|
58
|
+
issues: [createIssueWithTitle(plainTitle)],
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const result = useCase.createSummaryCommentBody(storyObject);
|
|
62
|
+
|
|
63
|
+
expect(result).toContain(plainTitle);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -52,7 +52,7 @@ export class AnalyzeProblemByIssueUseCase {
|
|
|
52
52
|
return url.split('/').slice(-3).join('/');
|
|
53
53
|
};
|
|
54
54
|
const issueTitleForFlowchart = (title: string) => {
|
|
55
|
-
return title.replace(
|
|
55
|
+
return title.replace(/"/g, "'");
|
|
56
56
|
};
|
|
57
57
|
const flowChart = `
|
|
58
58
|
\`\`\`mermaid
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { encodeForURI } from './utils';
|
|
2
|
+
|
|
3
|
+
describe('encodeForURI', () => {
|
|
4
|
+
it('should return empty string when url is undefined', () => {
|
|
5
|
+
expect(encodeForURI(undefined)).toBe('');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
it('should return empty string when url is null', () => {
|
|
9
|
+
expect(encodeForURI(null)).toBe('');
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should return empty string when url is empty', () => {
|
|
13
|
+
expect(encodeForURI('')).toBe('');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should encode a single # character', () => {
|
|
17
|
+
expect(encodeForURI('foo#bar')).toBe('foo%23bar');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should encode all occurrences of # in the input', () => {
|
|
21
|
+
expect(encodeForURI('foo#bar#baz#qux')).toBe('foo%23bar%23baz%23qux');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should encode a single & character', () => {
|
|
25
|
+
expect(encodeForURI('foo&bar')).toBe('foo%26bar');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should encode all occurrences of & in the input', () => {
|
|
29
|
+
expect(encodeForURI('foo&bar&baz&qux')).toBe('foo%26bar%26baz%26qux');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should encode all occurrences of both # and & together', () => {
|
|
33
|
+
expect(encodeForURI('a#b&c#d&e')).toBe('a%23b%26c%23d%26e');
|
|
34
|
+
});
|
|
35
|
+
});
|