redmine-devrelay-client 0.3.0 → 0.3.2
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/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/textile.d.ts +14 -0
- package/dist/textile.js +51 -0
- package/dist/textile.js.map +1 -0
- package/dist/writes.js +9 -5
- package/dist/writes.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export { buildIssueQuery } from "./issues.js";
|
|
|
7
7
|
export { addComment, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
8
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
9
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
|
+
export { formatNotesForRedmine, formatDescriptionForRedmine } from "./textile.js";
|
|
10
11
|
export type * from "./types.js";
|
package/dist/index.js
CHANGED
|
@@ -7,4 +7,5 @@ export { buildIssueQuery } from "./issues.js";
|
|
|
7
7
|
export { addComment, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
8
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
9
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
|
+
export { formatNotesForRedmine, formatDescriptionForRedmine } from "./textile.js";
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Redmine instance stores issue bodies as HTML (not Textile).
|
|
3
|
+
* Plain-text newlines are collapsed; convert to HTML so multi-line text renders.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Comments/journals: append <br /> per line (works when notes accept HTML breaks).
|
|
7
|
+
* Idempotent if a line already ends with <br>.
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatNotesForRedmine(notes: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Issue description: wrap each non-empty line in <p>...</p>.
|
|
12
|
+
* Leaves content unchanged when it already looks like HTML.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatDescriptionForRedmine(description: string): string;
|
package/dist/textile.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Redmine instance stores issue bodies as HTML (not Textile).
|
|
3
|
+
* Plain-text newlines are collapsed; convert to HTML so multi-line text renders.
|
|
4
|
+
*/
|
|
5
|
+
function normalizeNewlines(text) {
|
|
6
|
+
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
7
|
+
}
|
|
8
|
+
function looksLikeHtml(text) {
|
|
9
|
+
return /<\/?[a-z][\s\S]*>/i.test(text.trim());
|
|
10
|
+
}
|
|
11
|
+
function escapeHtml(text) {
|
|
12
|
+
return text
|
|
13
|
+
.replace(/&/g, "&")
|
|
14
|
+
.replace(/</g, "<")
|
|
15
|
+
.replace(/>/g, ">")
|
|
16
|
+
.replace(/"/g, """);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Comments/journals: append <br /> per line (works when notes accept HTML breaks).
|
|
20
|
+
* Idempotent if a line already ends with <br>.
|
|
21
|
+
*/
|
|
22
|
+
export function formatNotesForRedmine(notes) {
|
|
23
|
+
const normalized = normalizeNewlines(notes);
|
|
24
|
+
return normalized
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map((line) => {
|
|
27
|
+
const trimmedEnd = line.replace(/\s+$/u, "");
|
|
28
|
+
if (/<br\s*\/?>\s*$/i.test(trimmedEnd))
|
|
29
|
+
return trimmedEnd;
|
|
30
|
+
return `${trimmedEnd}<br />`;
|
|
31
|
+
})
|
|
32
|
+
.join("\n");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Issue description: wrap each non-empty line in <p>...</p>.
|
|
36
|
+
* Leaves content unchanged when it already looks like HTML.
|
|
37
|
+
*/
|
|
38
|
+
export function formatDescriptionForRedmine(description) {
|
|
39
|
+
const normalized = normalizeNewlines(description);
|
|
40
|
+
if (!normalized.trim())
|
|
41
|
+
return normalized;
|
|
42
|
+
if (looksLikeHtml(normalized))
|
|
43
|
+
return normalized;
|
|
44
|
+
return normalized
|
|
45
|
+
.split("\n")
|
|
46
|
+
.map((line) => line.replace(/\s+$/u, ""))
|
|
47
|
+
.filter((line) => line.trim().length > 0)
|
|
48
|
+
.map((line) => `<p>${escapeHtml(line.trim())}</p>`)
|
|
49
|
+
.join("\n");
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=textile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textile.js","sourceRoot":"","sources":["../src/textile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,UAAU;SACd,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAC1D,OAAO,GAAG,UAAU,QAAQ,CAAC;IAC/B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAC7D,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IAC1C,IAAI,aAAa,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAEjD,OAAO,UAAU;SACd,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
package/dist/writes.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { formatDescriptionForRedmine, formatNotesForRedmine } from "./textile.js";
|
|
1
2
|
function applyOptionalIssueFields(issue, input, opts = {}) {
|
|
2
|
-
if (input.description !== undefined)
|
|
3
|
-
issue.description = input.description;
|
|
3
|
+
if (input.description !== undefined) {
|
|
4
|
+
issue.description = formatDescriptionForRedmine(input.description);
|
|
5
|
+
}
|
|
4
6
|
if (input.trackerId !== undefined)
|
|
5
7
|
issue.tracker_id = input.trackerId;
|
|
6
8
|
if (input.statusId !== undefined)
|
|
@@ -24,7 +26,7 @@ function applyOptionalIssueFields(issue, input, opts = {}) {
|
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
if (input.notes !== undefined)
|
|
27
|
-
issue.notes = input.notes;
|
|
29
|
+
issue.notes = formatNotesForRedmine(input.notes);
|
|
28
30
|
}
|
|
29
31
|
export async function createIssue(http, input) {
|
|
30
32
|
const issue = {
|
|
@@ -58,13 +60,15 @@ export async function updateIssue(http, input) {
|
|
|
58
60
|
};
|
|
59
61
|
}
|
|
60
62
|
export async function addComment(http, issueId, notes) {
|
|
61
|
-
await http.putJson(`/issues/${issueId}.json`, {
|
|
63
|
+
await http.putJson(`/issues/${issueId}.json`, {
|
|
64
|
+
issue: { notes: formatNotesForRedmine(notes) },
|
|
65
|
+
});
|
|
62
66
|
return { issueId, updated: true };
|
|
63
67
|
}
|
|
64
68
|
export async function updateIssueStatus(http, issueId, statusId, notes) {
|
|
65
69
|
const issue = { status_id: statusId };
|
|
66
70
|
if (notes !== undefined)
|
|
67
|
-
issue.notes = notes;
|
|
71
|
+
issue.notes = formatNotesForRedmine(notes);
|
|
68
72
|
const data = await http.putJson(`/issues/${issueId}.json`, {
|
|
69
73
|
issue,
|
|
70
74
|
});
|
package/dist/writes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED