@eyeauras/youtrack-cli 0.5.6 → 0.6.0

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.
Files changed (94) hide show
  1. package/README.md +78 -72
  2. package/dist/src/agile-commands.d.ts.map +1 -1
  3. package/dist/src/agile-commands.js +8 -9
  4. package/dist/src/agile-commands.js.map +1 -1
  5. package/dist/src/agile.d.ts.map +1 -1
  6. package/dist/src/agile.js +9 -15
  7. package/dist/src/agile.js.map +1 -1
  8. package/dist/src/article-extras-commands.d.ts.map +1 -1
  9. package/dist/src/article-extras-commands.js +13 -12
  10. package/dist/src/article-extras-commands.js.map +1 -1
  11. package/dist/src/articles-commands.d.ts.map +1 -1
  12. package/dist/src/articles-commands.js +15 -13
  13. package/dist/src/articles-commands.js.map +1 -1
  14. package/dist/src/articles.d.ts +3 -3
  15. package/dist/src/articles.d.ts.map +1 -1
  16. package/dist/src/articles.js +19 -19
  17. package/dist/src/articles.js.map +1 -1
  18. package/dist/src/attachment-download-commands.d.ts.map +1 -1
  19. package/dist/src/attachment-download-commands.js +10 -9
  20. package/dist/src/attachment-download-commands.js.map +1 -1
  21. package/dist/src/attachment-download.d.ts +7 -3
  22. package/dist/src/attachment-download.d.ts.map +1 -1
  23. package/dist/src/attachment-download.js +33 -40
  24. package/dist/src/attachment-download.js.map +1 -1
  25. package/dist/src/attachment-form.js +3 -3
  26. package/dist/src/attachment-form.js.map +1 -1
  27. package/dist/src/bundle-values-commands.d.ts.map +1 -1
  28. package/dist/src/bundle-values-commands.js +21 -18
  29. package/dist/src/bundle-values-commands.js.map +1 -1
  30. package/dist/src/cli-support.d.ts +5 -5
  31. package/dist/src/cli-support.d.ts.map +1 -1
  32. package/dist/src/cli-support.js +28 -26
  33. package/dist/src/cli-support.js.map +1 -1
  34. package/dist/src/cli.d.ts.map +1 -1
  35. package/dist/src/cli.js +55 -39
  36. package/dist/src/cli.js.map +1 -1
  37. package/dist/src/client.d.ts +5 -2
  38. package/dist/src/client.d.ts.map +1 -1
  39. package/dist/src/client.js +66 -49
  40. package/dist/src/client.js.map +1 -1
  41. package/dist/src/field-catalog-commands.d.ts.map +1 -1
  42. package/dist/src/field-catalog-commands.js +19 -16
  43. package/dist/src/field-catalog-commands.js.map +1 -1
  44. package/dist/src/group-directory-commands.d.ts.map +1 -1
  45. package/dist/src/group-directory-commands.js +17 -16
  46. package/dist/src/group-directory-commands.js.map +1 -1
  47. package/dist/src/issue-attachments-commands.d.ts.map +1 -1
  48. package/dist/src/issue-attachments-commands.js +9 -8
  49. package/dist/src/issue-attachments-commands.js.map +1 -1
  50. package/dist/src/issue-batch.d.ts +3 -1
  51. package/dist/src/issue-batch.d.ts.map +1 -1
  52. package/dist/src/issue-batch.js +19 -14
  53. package/dist/src/issue-batch.js.map +1 -1
  54. package/dist/src/issue-context-commands.d.ts.map +1 -1
  55. package/dist/src/issue-context-commands.js +13 -12
  56. package/dist/src/issue-context-commands.js.map +1 -1
  57. package/dist/src/issue-context.d.ts.map +1 -1
  58. package/dist/src/issue-context.js +9 -13
  59. package/dist/src/issue-context.js.map +1 -1
  60. package/dist/src/issue-fields-commands.d.ts.map +1 -1
  61. package/dist/src/issue-fields-commands.js +10 -9
  62. package/dist/src/issue-fields-commands.js.map +1 -1
  63. package/dist/src/issue-fields.d.ts +2 -4
  64. package/dist/src/issue-fields.d.ts.map +1 -1
  65. package/dist/src/issue-fields.js +39 -100
  66. package/dist/src/issue-fields.js.map +1 -1
  67. package/dist/src/issue-query-commands.d.ts.map +1 -1
  68. package/dist/src/issue-query-commands.js +15 -14
  69. package/dist/src/issue-query-commands.js.map +1 -1
  70. package/dist/src/issue-query.d.ts.map +1 -1
  71. package/dist/src/issue-query.js +7 -10
  72. package/dist/src/issue-query.js.map +1 -1
  73. package/dist/src/issue-relations-commands.d.ts.map +1 -1
  74. package/dist/src/issue-relations-commands.js +17 -16
  75. package/dist/src/issue-relations-commands.js.map +1 -1
  76. package/dist/src/issue-relations.js +2 -2
  77. package/dist/src/issue-relations.js.map +1 -1
  78. package/dist/src/issue-time-commands.d.ts.map +1 -1
  79. package/dist/src/issue-time-commands.js +12 -11
  80. package/dist/src/issue-time-commands.js.map +1 -1
  81. package/dist/src/issue-time.d.ts.map +1 -1
  82. package/dist/src/issue-time.js +16 -19
  83. package/dist/src/issue-time.js.map +1 -1
  84. package/dist/src/presentation.d.ts +59 -0
  85. package/dist/src/presentation.d.ts.map +1 -0
  86. package/dist/src/presentation.js +467 -0
  87. package/dist/src/presentation.js.map +1 -0
  88. package/dist/src/time-settings-commands.d.ts.map +1 -1
  89. package/dist/src/time-settings-commands.js +13 -11
  90. package/dist/src/time-settings-commands.js.map +1 -1
  91. package/dist/src/user-directory-commands.d.ts.map +1 -1
  92. package/dist/src/user-directory-commands.js +14 -12
  93. package/dist/src/user-directory-commands.js.map +1 -1
  94. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import { saveProfileFile } from "@eyeauras/cli-factory";
1
+ import { saveFile } from "@eyeauras/cli-factory";
2
2
  import { encodedID, fields, mutate, mutationBody, narrative, nullableText, readCollectionAt, readObjectAt, } from "./client.js";
3
3
  const articleListFields = "id,idReadable,summary,project(id,shortName),updated";
4
4
  const articleDetailFields = `${articleListFields},content,parentArticle(id,idReadable),created`;
@@ -13,48 +13,48 @@ export const getArticle = readObjectAt(articlePath, articleDetailFields);
13
13
  * Save the scrubbed article content as a profile-owned file for a fetch/edit/update workflow.
14
14
  * `redacted` warns that URL placeholders would replace the originals if the file were sent back.
15
15
  */
16
- export async function exportArticle(connection, articleID, appDataDirectory, name) {
16
+ export async function exportArticle(connection, articleID, cwd, output) {
17
17
  const article = await getArticle(connection, articleID, { fields: "id,idReadable,content" });
18
18
  const id = typeof article.idReadable === "string" ? article.idReadable : article.id;
19
19
  if (typeof id !== "string" || !id || (article.content !== null && typeof article.content !== "string")) {
20
- throw new Error("YouTrack returned an invalid article for export.");
20
+ throw new Error("Invalid article for export from YouTrack.");
21
21
  }
22
- const saved = await saveProfileFile({
23
- appDataDirectory,
24
- name: name ?? `${id.replace(/[^a-zA-Z0-9._-]/g, "_")}.md`,
22
+ const saved = await saveFile({
23
+ cwd,
24
+ name: `${id}.md`,
25
+ output,
25
26
  content: article.content ?? "",
26
27
  signal: connection.signal,
27
28
  });
28
29
  return { id, ...saved, redacted: article.content?.includes("[redacted]") ?? false };
29
30
  }
30
31
  export async function createArticle(connection, input, options = {}) {
31
- const body = mutationBody(input, ["project", "summary", "content"]);
32
- const project = mutationBody(body.project, ["id"]);
32
+ const body = mutationBody(input);
33
+ const project = mutationBody(body.project);
33
34
  return mutate(connection, "api/articles", {
34
- project: { id: narrative(project.id, "project.id") },
35
- summary: narrative(body.summary, "summary"),
35
+ ...body,
36
+ project: { ...project, id: narrative(project.id, "project.id") },
37
+ ...(Object.hasOwn(body, "summary") ? { summary: nullableText(body.summary, "summary") } : {}),
36
38
  ...(Object.hasOwn(body, "content") ? { content: nullableText(body.content, "article content") } : {}),
37
39
  }, fields(options, articleWriteFields));
38
40
  }
39
41
  export async function updateArticle(connection, articleID, input, options = {}) {
40
- const body = mutationBody(input, ["summary", "content"]);
41
- if (Object.keys(body).length === 0) {
42
- throw new Error("YouTrack article update requires summary or content.");
43
- }
42
+ const body = mutationBody(input);
44
43
  return mutate(connection, articlePath(articleID), {
45
- ...(Object.hasOwn(body, "summary") ? { summary: narrative(body.summary, "summary") } : {}),
44
+ ...body,
45
+ ...(Object.hasOwn(body, "summary") ? { summary: nullableText(body.summary, "summary") } : {}),
46
46
  ...(Object.hasOwn(body, "content") ? { content: nullableText(body.content, "article content") } : {}),
47
47
  }, fields(options, articleWriteFields));
48
48
  }
49
49
  export const listArticleComments = readCollectionAt((articleID) => `${articlePath(articleID)}/comments`, articleCommentFields);
50
50
  export const getArticleComment = readObjectAt((articleID, commentID) => `${articlePath(articleID)}/comments/${encodedID(commentID, "comment ID")}`, articleCommentFields);
51
51
  export async function addArticleComment(connection, articleID, input, options = {}) {
52
- const body = mutationBody(input, ["text"]);
53
- return mutate(connection, `${articlePath(articleID)}/comments`, { text: narrative(body.text, "text") }, fields(options, articleCommentFields));
52
+ const body = mutationBody(input);
53
+ return mutate(connection, `${articlePath(articleID)}/comments`, { ...body, text: nullableText(body.text, "text") }, fields(options, articleCommentFields));
54
54
  }
55
55
  export async function updateArticleComment(connection, articleID, commentID, input, options = {}) {
56
- const body = mutationBody(input, ["text"]);
57
- return mutate(connection, `${articlePath(articleID)}/comments/${encodedID(commentID, "comment ID")}`, { text: narrative(body.text, "text") }, fields(options, articleCommentFields));
56
+ const body = mutationBody(input);
57
+ return mutate(connection, `${articlePath(articleID)}/comments/${encodedID(commentID, "comment ID")}`, { ...body, ...(Object.hasOwn(body, "text") ? { text: nullableText(body.text, "text") } : {}) }, fields(options, articleCommentFields));
58
58
  }
59
59
  export const listProjectArticles = readCollectionAt((projectID) => `api/admin/projects/${encodedID(projectID, "project ID")}/articles`, articleListFields);
60
60
  //# sourceMappingURL=articles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"articles.js","sourceRoot":"","sources":["../../src/articles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"articles.js","sourceRoot":"","sources":["../../src/articles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,YAAY,GAIb,MAAM,aAAa,CAAC;AAErB,MAAM,iBAAiB,GAAG,qDAAqD,CAAC;AAChF,MAAM,mBAAmB,GAAG,GAAG,iBAAiB,+CAA+C,CAAC;AAChG,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAC3D,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AAExE,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,gBAAgB,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,SAAiB,EACjB,GAAW,EACX,MAAe;IAEf,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC7F,MAAM,EAAE,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpF,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;QAC3B,GAAG;QACH,IAAI,EAAE,GAAG,EAAE,KAAK;QAChB,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC,CAAC;IACH,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,KAAc,EACd,OAAO,GAAsB,EAAE;IAE/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,MAAM,CACX,UAAU,EACV,cAAc,EACd;QACE,GAAG,IAAI;QACP,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE;QAChE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtG,EACD,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,SAAiB,EACjB,KAAc,EACd,OAAO,GAAsB,EAAE;IAE/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CACX,UAAU,EACV,WAAW,CAAC,SAAS,CAAC,EACtB;QACE,GAAG,IAAI;QACP,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtG,EACD,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CACjD,CAAC,SAAiB,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,EAC3D,oBAAoB,CACrB,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAC3C,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE,CACvC,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAC5E,oBAAoB,CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAsB,EACtB,SAAiB,EACjB,KAAc,EACd,OAAO,GAAsB,EAAE;IAE/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CACX,UAAU,EACV,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,EACpC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAClD,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAsB,EACtB,SAAiB,EACjB,SAAiB,EACjB,KAAc,EACd,OAAO,GAAsB,EAAE;IAE/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CACX,UAAU,EACV,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAC1E,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAC9F,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CACjD,CAAC,SAAiB,EAAE,EAAE,CAAC,sBAAsB,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,WAAW,EAC1F,iBAAiB,CAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-download-commands.d.ts","sourceRoot":"","sources":["../../src/attachment-download-commands.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,yBAAyB,mDAWrC,CAAC;AAEF,eAAO,MAAM,gCAAgC,mDAW5C,CAAC"}
1
+ {"version":3,"file":"attachment-download-commands.d.ts","sourceRoot":"","sources":["../../src/attachment-download-commands.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,yBAAyB,mDAWpC,CAAC;AAEH,eAAO,MAAM,gCAAgC,mDAW3C,CAAC"}
@@ -1,23 +1,24 @@
1
1
  import { readCommand } from "./cli-support.js";
2
- import { downloadArticleAttachment, downloadIssueAttachment, downloadLimit, downloadName, } from "./attachment-download.js";
2
+ import { downloadArticleAttachment, downloadIssueAttachment, downloadLimit, } from "./attachment-download.js";
3
+ import { savedAttachment, withView } from "./presentation.js";
3
4
  const downloadOptions = [
4
5
  {
5
- flags: "--name <basename>",
6
- description: "Optional safe filename; an existing name is never overwritten",
7
- parse: downloadName,
6
+ flags: "--output <path>",
7
+ description: "Save to a relative or absolute path",
8
8
  },
9
9
  {
10
10
  flags: "--max-bytes <n>",
11
- description: "Optional maximum transfer size in bytes (positive safe integer)",
11
+ description: "Fail above this many bytes",
12
12
  parse: downloadLimit,
13
13
  },
14
14
  ];
15
- function downloadInput(options) {
15
+ function downloadInput(options, progress) {
16
16
  return {
17
- ...(typeof options.name === "string" ? { name: options.name } : {}),
17
+ progress,
18
+ ...(typeof options.output === "string" ? { output: options.output } : {}),
18
19
  ...(typeof options.maxBytes === "number" ? { maxBytes: options.maxBytes } : {}),
19
20
  };
20
21
  }
21
- export const attachmentDownloadCommand = readCommand("download <issueID> <attachmentID>", "Download one attachment into this profile's downloads directory without overwriting files", async (connection, { args, options }, context) => downloadIssueAttachment(connection, args.issueID, args.attachmentID, context.appArguments.AppDataDirectory, downloadInput(options)), downloadOptions);
22
- export const articleAttachmentDownloadCommand = readCommand("download <article> <attachment>", "Download one article attachment into this profile's downloads directory without overwriting files", async (connection, { args, options }, context) => downloadArticleAttachment(connection, args.article, args.attachment, context.appArguments.AppDataDirectory, downloadInput(options)), downloadOptions);
22
+ export const attachmentDownloadCommand = withView(savedAttachment, readCommand("download <issueID> <attachmentID>", "Download an attachment", async (connection, { args, options }, context) => downloadIssueAttachment(connection, args.issueID, args.attachmentID, context.cwd, downloadInput(options, context.progress)), downloadOptions));
23
+ export const articleAttachmentDownloadCommand = withView(savedAttachment, readCommand("download <article> <attachment>", "Download an attachment", async (connection, { args, options }, context) => downloadArticleAttachment(connection, args.article, args.attachment, context.cwd, downloadInput(options, context.progress)), downloadOptions));
23
24
  //# sourceMappingURL=attachment-download-commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-download-commands.js","sourceRoot":"","sources":["../../src/attachment-download-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,YAAY,GAEb,MAAM,0BAA0B,CAAC;AAElC,MAAM,eAAe,GAAG;IACtB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,+DAA+D;QAC5E,KAAK,EAAE,YAAY;KACpB;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iEAAiE;QAC9E,KAAK,EAAE,aAAa;KACrB;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,OAAgC;IACrD,OAAO;QACL,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAClD,mCAAmC,EACnC,2FAA2F,EAC3F,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,uBAAuB,CACvE,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,OAAO,CAAC,YAAY,CAAC,gBAAgB,EACrC,aAAa,CAAC,OAAO,CAAC,CACvB,EACD,eAAe,CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,WAAW,CACzD,iCAAiC,EACjC,mGAAmG,EACnG,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,yBAAyB,CACzE,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,OAAO,CAAC,YAAY,CAAC,gBAAgB,EACrC,aAAa,CAAC,OAAO,CAAC,CACvB,EACD,eAAe,CAChB,CAAC"}
1
+ {"version":3,"file":"attachment-download-commands.js","sourceRoot":"","sources":["../../src/attachment-download-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,GAEd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,eAAe,GAAG;IACtB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,aAAa;KACrB;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,OAAgC,EAAE,QAAmC;IAC1F,OAAO;QACL,QAAQ;QACR,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC,eAAe,EAAE,WAAW,CAC5E,mCAAmC,EACnC,wBAAwB,EACxB,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,uBAAuB,CACvE,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,OAAO,CAAC,GAAG,EACX,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CACzC,EACD,eAAe,CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gCAAgC,GAAG,QAAQ,CAAC,eAAe,EAAE,WAAW,CACnF,iCAAiC,EACjC,wBAAwB,EACxB,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,yBAAyB,CACzE,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,OAAO,CAAC,GAAG,EACX,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CACzC,EACD,eAAe,CAChB,CAAC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { type Connection } from "./client.js";
2
+ /** User output path and optional streaming budget; no profile storage ownership. */
2
3
  export interface DownloadOptions {
3
- name?: string;
4
+ output?: string;
4
5
  maxBytes?: number;
6
+ progress?: (message: string) => void;
5
7
  }
6
8
  export interface AttachmentDownloadResult {
7
9
  id: string;
@@ -12,6 +14,8 @@ export interface AttachmentDownloadResult {
12
14
  }
13
15
  export declare function downloadName(value: string): string;
14
16
  export declare function downloadLimit(value: number | string): number;
15
- export declare function downloadIssueAttachment(connection: Connection, issueID: string, attachmentID: string, appDataDirectory: string, options?: DownloadOptions): Promise<AttachmentDownloadResult>;
16
- export declare function downloadArticleAttachment(connection: Connection, articleID: string, attachmentID: string, appDataDirectory: string, options?: DownloadOptions): Promise<AttachmentDownloadResult>;
17
+ /** Download using captured cwd, metadata basename and optional explicit output path. */
18
+ export declare function downloadIssueAttachment(connection: Connection, issueID: string, attachmentID: string, cwd: string, options?: DownloadOptions): Promise<AttachmentDownloadResult>;
19
+ /** Download using captured cwd, metadata basename and optional explicit output path. */
20
+ export declare function downloadArticleAttachment(connection: Connection, articleID: string, attachmentID: string, cwd: string, options?: DownloadOptions): Promise<AttachmentDownloadResult>;
17
21
  //# sourceMappingURL=attachment-download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-download.d.ts","sourceRoot":"","sources":["../../src/attachment-download.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAM5D;AAiED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAGnC;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAGnC"}
1
+ {"version":3,"file":"attachment-download.d.ts","sourceRoot":"","sources":["../../src/attachment-download.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AAErB,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAM5D;AAwDD,wFAAwF;AACxF,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAGnC;AAED,wFAAwF;AACxF,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAGnC"}
@@ -1,50 +1,39 @@
1
- import { diagnosticCause, fetchWithRedirects, ProfileFileError, publishProfileFile } from "@eyeauras/cli-factory";
1
+ import { diagnosticCause, fetchWithRedirects, FilePublicationError, publishFile } from "@eyeauras/cli-factory";
2
2
  import { encodedID, getAttachmentDownloadMetadata, issuePath, youTrackUrl, } from "./client.js";
3
- class DownloadError extends ProfileFileError {
3
+ class DownloadError extends FilePublicationError {
4
4
  }
5
5
  export function downloadName(value) {
6
6
  if (!value || value === "." || value === ".." ||
7
7
  /[<>:"/\\|?*\u0000-\u001f\u007f-\u009f\p{Cf}]/u.test(value) || /[. ]$/.test(value) ||
8
8
  /^(?:con|prn|aux|nul|conin\$|conout\$|clock\$|com[1-9¹²³]|lpt[1-9¹²³])(?:[ .]|$)/i.test(value)) {
9
- throw new Error("YouTrack download name must be one safe basename, without reserved paths or characters.");
9
+ throw new Error("The file name must be one safe basename without reserved characters.");
10
10
  }
11
11
  return value;
12
12
  }
13
13
  export function downloadLimit(value) {
14
14
  const number = typeof value === "string" && /^\d+$/.test(value) ? Number(value) : value;
15
15
  if (typeof number !== "number" || !Number.isSafeInteger(number) || number < 1) {
16
- throw new Error("YouTrack max-bytes must be a positive safe integer.");
16
+ throw new Error("--max-bytes must be a positive integer.");
17
17
  }
18
18
  return number;
19
19
  }
20
20
  function attachmentUrl(connection, value) {
21
- const invalid = new DownloadError("YouTrack attachment URL must use the profile origin and documented attachment path; " +
22
- "external/CDN downloads are unsupported.");
21
+ const invalid = new DownloadError("The attachment URL must be HTTP(S), without embedded credentials or raw controls.");
23
22
  try {
24
- if (/[\\\u0000-\u0020\u007f]/.test(value) || value.includes("#")) {
23
+ if (/[\\\u0000-\u0020\u007f]/.test(value)) {
25
24
  throw invalid;
26
25
  }
27
26
  const base = new URL(youTrackUrl(connection.baseUrl));
28
27
  const rawPath = value.split("?", 1)[0];
29
28
  const originPath = rawPath.replace(/^(?:https?:)?\/\/[^/]*/, "");
30
- const prefix = originPath.startsWith("/") ? `${base.pathname}api/files/` : "api/files/";
31
- if (!originPath.startsWith(prefix)) {
32
- throw invalid;
33
- }
34
- const segments = originPath.slice(prefix.length).split("/");
35
- const fileID = decodeURIComponent(segments[0] ?? "");
36
- if (!fileID || fileID === "." || fileID === ".." || /[/\\%?#\u0000-\u0020\u007f]/.test(fileID) ||
37
- segments.length > 2 || (segments.length === 2 && !/^sign=.+$/.test(segments[1]))) {
38
- throw invalid;
39
- }
29
+ const segments = originPath.split("/");
40
30
  const url = new URL(value, base);
41
- if (url.origin !== base.origin || url.protocol !== base.protocol || url.username || url.password || url.hash ||
42
- !url.pathname.startsWith(`${base.pathname}api/files/`)) {
31
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password) {
43
32
  throw invalid;
44
33
  }
45
- const pathSignature = segments[1]?.slice(5);
34
+ const pathSignature = segments.find(part => /^sign=/.test(part))?.slice(5);
46
35
  const querySignatures = url.search.slice(1).split("&")
47
- .filter((part) => part && part.split("=", 1)[0] !== "updated")
36
+ .filter((part) => /(?:^sign$|^sig$|(?:signature|token|password|passwd|secret|credentials?(?:JSON)?|authorization|cookie|(?:api|access|private|secret)[-_]?key|(?:^|[-_])key)(?:[-_]?(?:value|hash|digest|header))?$)/i.test(decodeURIComponent(part.split("=", 1)[0].replace(/\+/g, " "))))
48
37
  .map((part) => part.slice(part.indexOf("=") + 1));
49
38
  const signatures = [
50
39
  ...(pathSignature === undefined ? [] : [pathSignature, decodeURIComponent(pathSignature)]),
@@ -55,7 +44,7 @@ function attachmentUrl(connection, value) {
55
44
  [...url.searchParams].some(([key, part]) => key.includes(token) || part.includes(token))) {
56
45
  throw invalid;
57
46
  }
58
- return { url, secrets: [token, ...signatures].filter(Boolean) };
47
+ return { url, secrets: [token, url.href, decodeURIComponent(url.href), ...signatures].filter(Boolean) };
59
48
  }
60
49
  catch {
61
50
  throw invalid;
@@ -72,38 +61,42 @@ function filenamePart(value, fallback) {
72
61
  }
73
62
  function contentType(value, secrets) {
74
63
  const type = value?.split(";", 1)[0]?.trim() ?? "";
75
- return type && redact(type, secrets) === type && /^[a-zA-Z0-9!#$&^_.+-]+\/[a-zA-Z0-9!#$&^_.+-]+$/.test(type)
64
+ return type && redact(type, secrets) === type && /^[!#$%&'*+.^_`|~a-zA-Z0-9-]+\/[!#$%&'*+.^_`|~a-zA-Z0-9-]+$/.test(type)
76
65
  ? type : "application/octet-stream";
77
66
  }
78
- export async function downloadIssueAttachment(connection, issueID, attachmentID, appDataDirectory, options = {}) {
67
+ /** Download using captured cwd, metadata basename and optional explicit output path. */
68
+ export async function downloadIssueAttachment(connection, issueID, attachmentID, cwd, options = {}) {
79
69
  const path = `${issuePath(issueID)}/attachments/${encodedID(attachmentID, "attachment ID")}`;
80
- return downloadAttachment(connection, path, attachmentID, appDataDirectory, options);
70
+ return downloadAttachment(connection, path, attachmentID, cwd, options);
81
71
  }
82
- export async function downloadArticleAttachment(connection, articleID, attachmentID, appDataDirectory, options = {}) {
72
+ /** Download using captured cwd, metadata basename and optional explicit output path. */
73
+ export async function downloadArticleAttachment(connection, articleID, attachmentID, cwd, options = {}) {
83
74
  const path = `api/articles/${encodedID(articleID, "article ID")}/attachments/${encodedID(attachmentID, "attachment ID")}`;
84
- return downloadAttachment(connection, path, attachmentID, appDataDirectory, options);
75
+ return downloadAttachment(connection, path, attachmentID, cwd, options);
85
76
  }
86
- async function downloadAttachment(connection, attachmentPath, attachmentID, appDataDirectory, options) {
87
- const requestedName = options.name === undefined ? undefined : downloadName(options.name);
77
+ async function downloadAttachment(connection, attachmentPath, attachmentID, cwd, options) {
78
+ const requestedName = options.output;
88
79
  const maxBytes = options.maxBytes === undefined ? undefined : downloadLimit(options.maxBytes);
89
80
  const diagnosticSecrets = [connection.token];
90
81
  try {
91
82
  const metadata = await getAttachmentDownloadMetadata(connection, attachmentPath);
92
83
  if (metadata.id !== attachmentID) {
93
- throw new DownloadError("YouTrack returned a different attachment identity for the download.");
84
+ throw new DownloadError("The download metadata names a different attachment.");
94
85
  }
95
86
  const { url, secrets } = attachmentUrl(connection, metadata.url);
96
87
  diagnosticSecrets.push(...secrets);
97
88
  const id = filenamePart(redact(metadata.id, secrets), "attachment");
98
89
  const name = requestedName ??
99
- downloadName(`${id}-${filenamePart(redact(metadata.name, secrets), "attachment")}`);
100
- if (redact(name, secrets) !== name || redact(appDataDirectory, secrets) !== appDataDirectory) {
101
- throw new DownloadError("YouTrack download destination must not contain reflected credentials or signatures.");
90
+ downloadName(metadata.name);
91
+ if (redact(name, secrets) !== name || redact(cwd, secrets) !== cwd) {
92
+ throw new DownloadError("The download destination must not contain reflected credentials or signatures.");
102
93
  }
94
+ options.progress?.(`Downloading ${name}…`);
103
95
  let type = "application/octet-stream";
104
- const saved = await publishProfileFile({
105
- appDataDirectory,
106
- name,
96
+ const saved = await publishFile({
97
+ cwd,
98
+ name: metadata.name,
99
+ output: requestedName,
107
100
  maxBytes,
108
101
  signal: connection.signal,
109
102
  openResponse: () => fetchWithRedirects(connection.fetch ?? globalThis.fetch, url, {
@@ -119,10 +112,10 @@ async function downloadAttachment(connection, attachmentPath, attachmentID, appD
119
112
  const length = response.headers.get("content-length");
120
113
  const declared = length === null ? undefined : Number(length);
121
114
  if (length !== null && (!/^\d+$/.test(length) || !Number.isSafeInteger(declared))) {
122
- throw new DownloadError("YouTrack attachment has an invalid Content-Length.");
115
+ throw new DownloadError("The attachment has an invalid Content-Length.");
123
116
  }
124
117
  if (maxBytes !== undefined && declared !== undefined && declared > maxBytes) {
125
- throw new DownloadError("YouTrack attachment exceeds the configured byte limit.");
118
+ throw new DownloadError("The attachment exceeds --max-bytes.");
126
119
  }
127
120
  type = contentType(response.headers.get("content-type") ?? metadata.mimeType, secrets);
128
121
  },
@@ -130,9 +123,9 @@ async function downloadAttachment(connection, attachmentPath, attachmentID, appD
130
123
  return { id, name, path: saved.path, bytes: saved.bytes, contentType: type };
131
124
  }
132
125
  catch (error) {
133
- if (error instanceof ProfileFileError && error.cause !== undefined)
126
+ if (error instanceof FilePublicationError && error.cause !== undefined)
134
127
  error.cause = diagnosticCause(error.cause, diagnosticSecrets);
135
- throw error instanceof ProfileFileError ? error : new DownloadError("YouTrack attachment download failed; check cancellation, connectivity and profile filesystem access.", false, false, { cause: diagnosticCause(error, diagnosticSecrets) });
128
+ throw error instanceof FilePublicationError ? error : new DownloadError("The attachment download failed; check connectivity and the output directory.", false, false, { cause: diagnosticCause(error, diagnosticSecrets) });
136
129
  }
137
130
  }
138
131
  //# sourceMappingURL=attachment-download.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-download.js","sourceRoot":"","sources":["../../src/attachment-download.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-download.js","sourceRoot":"","sources":["../../src/attachment-download.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import { basename } from "node:path";
3
- import { requiredText } from "./client.js";
3
+ import { inputFilePath } from "./client.js";
4
4
  export async function attachmentForm(filePath) {
5
- requiredText(filePath, "file path");
5
+ inputFilePath(filePath);
6
6
  let file;
7
7
  try {
8
8
  if (!(await fs.promises.stat(filePath)).isFile()) {
@@ -11,7 +11,7 @@ export async function attachmentForm(filePath) {
11
11
  file = await fs.openAsBlob(filePath);
12
12
  }
13
13
  catch {
14
- throw new Error("YouTrack upload requires a readable regular file.");
14
+ throw new Error("The upload requires a readable regular file.");
15
15
  }
16
16
  const form = new FormData();
17
17
  form.append("upload1", file, basename(filePath));
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-form.js","sourceRoot":"","sources":["../../src/attachment-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,IAAU,CAAC;IACf,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"attachment-form.js","sourceRoot":"","sources":["../../src/attachment-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,IAAU,CAAC;IACf,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bundle-values-commands.d.ts","sourceRoot":"","sources":["../../src/bundle-values-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAiBxE,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAqE5D,CAAC"}
1
+ {"version":3,"file":"bundle-values-commands.d.ts","sourceRoot":"","sources":["../../src/bundle-values-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAqBxE,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAyB5D,CAAC"}
@@ -1,29 +1,32 @@
1
1
  import { command } from "@eyeauras/cli-factory";
2
2
  import { pagedRead, projectedRead } from "./cli-support.js";
3
3
  import { getBuildBundle, getBuildValue, getOwnedBundle, getOwnedValue, getVersionBundle, getVersionValue, listBuildBundles, listBuildValues, listOwnedBundles, listOwnedValues, listVersionBundles, listVersionValues, } from "./bundle-values.js";
4
+ import { namedTable } from "./presentation.js";
5
+ const bundleTable = namedTable("BUNDLE", "No bundles.");
6
+ const valueTable = namedTable("VALUE", "No values.");
4
7
  export const bundleValuesChildren = [
5
- command("build", "Inspect build bundles and their values", [
6
- pagedRead("list", "List one page of build bundles without expanding values", listBuildBundles),
7
- projectedRead("get <bundle>", "Show a build bundle by database ID without expanding values", getBuildBundle),
8
- command("value", "Inspect values in a build bundle", [
9
- pagedRead("list <bundle>", "List one page of build values, preserving archived entries", listBuildValues),
10
- projectedRead("get <bundle> <value>", "Show a build value and its assembly timestamp", getBuildValue),
8
+ command("build", "Inspect build bundles", [
9
+ pagedRead("list", "List build bundles", listBuildBundles, bundleTable),
10
+ projectedRead("get <bundle>", "Show a build bundle", getBuildBundle),
11
+ command("value", "Inspect build values", [
12
+ pagedRead("list <bundle>", "List the bundle's values", listBuildValues, valueTable),
13
+ projectedRead("get <bundle> <value>", "Show a build value", getBuildValue),
11
14
  ]),
12
15
  ]),
13
- command("owned", "Inspect owned-field bundles and their values", [
14
- pagedRead("list", "List one page of owned-field bundles without expanding values", listOwnedBundles),
15
- projectedRead("get <bundle>", "Show an owned-field bundle by database ID without expanding values", getOwnedBundle),
16
- command("value", "Inspect values in an owned-field bundle", [
17
- pagedRead("list <bundle>", "List one page of owned values, preserving archived entries", listOwnedValues),
18
- projectedRead("get <bundle> <value>", "Show an owned value and its associated user", getOwnedValue),
16
+ command("owned", "Inspect owned-field bundles", [
17
+ pagedRead("list", "List owned-field bundles", listOwnedBundles, bundleTable),
18
+ projectedRead("get <bundle>", "Show an owned-field bundle", getOwnedBundle),
19
+ command("value", "Inspect owned values", [
20
+ pagedRead("list <bundle>", "List the bundle's values", listOwnedValues, valueTable),
21
+ projectedRead("get <bundle> <value>", "Show an owned value", getOwnedValue),
19
22
  ]),
20
23
  ]),
21
- command("version", "Inspect version bundles and their values", [
22
- pagedRead("list", "List one page of version bundles without expanding values", listVersionBundles),
23
- projectedRead("get <bundle>", "Show a version bundle by database ID without expanding values", getVersionBundle),
24
- command("value", "Inspect version values; default startDate requires YouTrack 2023.1+", [
25
- pagedRead("list <bundle>", "List one page of version values, preserving archived entries", listVersionValues),
26
- projectedRead("get <bundle> <value>", "Show a version value with raw release/start dates", getVersionValue),
24
+ command("version", "Inspect version bundles", [
25
+ pagedRead("list", "List version bundles", listVersionBundles, bundleTable),
26
+ projectedRead("get <bundle>", "Show a version bundle", getVersionBundle),
27
+ command("value", "Inspect version values", [
28
+ pagedRead("list <bundle>", "List the bundle's values", listVersionValues, valueTable),
29
+ projectedRead("get <bundle> <value>", "Show a version value", getVersionValue),
27
30
  ]),
28
31
  ]),
29
32
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"bundle-values-commands.js","sourceRoot":"","sources":["../../src/bundle-values-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA0B,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,OAAO,CAAC,OAAO,EAAE,wCAAwC,EAAE;QACzD,SAAS,CAAC,MAAM,EAAE,yDAAyD,EAAE,gBAAgB,CAAC;QAC9F,aAAa,CACX,cAAc,EACd,6DAA6D,EAC7D,cAAc,CACf;QACD,OAAO,CAAC,OAAO,EAAE,kCAAkC,EAAE;YACnD,SAAS,CACP,eAAe,EACf,4DAA4D,EAC5D,eAAe,CAChB;YACD,aAAa,CACX,sBAAsB,EACtB,+CAA+C,EAC/C,aAAa,CACd;SACF,CAAC;KACH,CAAC;IACF,OAAO,CAAC,OAAO,EAAE,8CAA8C,EAAE;QAC/D,SAAS,CACP,MAAM,EACN,+DAA+D,EAC/D,gBAAgB,CACjB;QACD,aAAa,CACX,cAAc,EACd,oEAAoE,EACpE,cAAc,CACf;QACD,OAAO,CAAC,OAAO,EAAE,yCAAyC,EAAE;YAC1D,SAAS,CACP,eAAe,EACf,4DAA4D,EAC5D,eAAe,CAChB;YACD,aAAa,CACX,sBAAsB,EACtB,6CAA6C,EAC7C,aAAa,CACd;SACF,CAAC;KACH,CAAC;IACF,OAAO,CAAC,SAAS,EAAE,0CAA0C,EAAE;QAC7D,SAAS,CACP,MAAM,EACN,2DAA2D,EAC3D,kBAAkB,CACnB;QACD,aAAa,CACX,cAAc,EACd,+DAA+D,EAC/D,gBAAgB,CACjB;QACD,OAAO,CAAC,OAAO,EAAE,qEAAqE,EAAE;YACtF,SAAS,CACP,eAAe,EACf,8DAA8D,EAC9D,iBAAiB,CAClB;YACD,aAAa,CACX,sBAAsB,EACtB,mDAAmD,EACnD,eAAe,CAChB;SACF,CAAC;KACH,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"bundle-values-commands.js","sourceRoot":"","sources":["../../src/bundle-values-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA0B,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACxD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,OAAO,CAAC,OAAO,EAAE,uBAAuB,EAAE;QACxC,SAAS,CAAC,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,WAAW,CAAC;QACtE,aAAa,CAAC,cAAc,EAAE,qBAAqB,EAAE,cAAc,CAAC;QACpE,OAAO,CAAC,OAAO,EAAE,sBAAsB,EAAE;YACvC,SAAS,CAAC,eAAe,EAAE,0BAA0B,EAAE,eAAe,EAAE,UAAU,CAAC;YACnF,aAAa,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,aAAa,CAAC;SAC3E,CAAC;KACH,CAAC;IACF,OAAO,CAAC,OAAO,EAAE,6BAA6B,EAAE;QAC9C,SAAS,CAAC,MAAM,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,WAAW,CAAC;QAC5E,aAAa,CAAC,cAAc,EAAE,4BAA4B,EAAE,cAAc,CAAC;QAC3E,OAAO,CAAC,OAAO,EAAE,sBAAsB,EAAE;YACvC,SAAS,CAAC,eAAe,EAAE,0BAA0B,EAAE,eAAe,EAAE,UAAU,CAAC;YACnF,aAAa,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,aAAa,CAAC;SAC5E,CAAC;KACH,CAAC;IACF,OAAO,CAAC,SAAS,EAAE,yBAAyB,EAAE;QAC5C,SAAS,CAAC,MAAM,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,CAAC;QAC1E,aAAa,CAAC,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,CAAC;QACxE,OAAO,CAAC,OAAO,EAAE,wBAAwB,EAAE;YACzC,SAAS,CAAC,eAAe,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,UAAU,CAAC;YACrF,aAAa,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,CAAC;SAC/E,CAAC;KACH,CAAC;CACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type CommandContext, type CommandDefinition, type GatedTargetCommand, type OptionDefinition } from "@eyeauras/cli-factory";
1
+ import { type CommandContext, type CommandDefinition, type GatedTargetCommand, type HumanView, type OptionDefinition } from "@eyeauras/cli-factory";
2
2
  import { type Connection, type IssueSearchOptions } from "./client.js";
3
3
  export declare const bodyOptions: readonly OptionDefinition[];
4
4
  export declare const fileOption: (flags: string, description: string, required?: boolean) => OptionDefinition;
@@ -13,10 +13,10 @@ type CommandValues<Syntax extends string> = Syntax extends `${string} ${infer Ar
13
13
  type ReadOperation<Syntax extends string> = (connection: Connection, ...arguments_: [...CommandValues<Syntax>, IssueSearchOptions]) => unknown;
14
14
  type BodyOperation<Syntax extends string> = (connection: Connection, ...arguments_: [...CommandValues<Syntax>, unknown]) => unknown;
15
15
  type ProjectedBodyOperation<Syntax extends string> = (connection: Connection, ...arguments_: [...CommandValues<Syntax>, unknown, IssueSearchOptions]) => unknown;
16
- export declare function pagedRead<const Syntax extends string>(syntax: Syntax, description: string, operation: ReadOperation<Syntax>): CommandDefinition;
17
- export declare function projectedRead<const Syntax extends string>(syntax: Syntax, description: string, operation: ReadOperation<Syntax>): CommandDefinition;
18
- export declare function bodyUpdate<const Syntax extends string>(syntax: Syntax, description: string, operation: BodyOperation<Syntax>, textField?: string): CommandDefinition;
19
- export declare function projectedBodyUpdate<const Syntax extends string>(syntax: Syntax, description: string, operation: ProjectedBodyOperation<Syntax>, textField?: string): CommandDefinition;
16
+ export declare function pagedRead<const Syntax extends string>(syntax: Syntax, description: string, operation: ReadOperation<Syntax>, view?: HumanView): CommandDefinition;
17
+ export declare function projectedRead<const Syntax extends string>(syntax: Syntax, description: string, operation: ReadOperation<Syntax>, view?: HumanView): CommandDefinition;
18
+ export declare function bodyUpdate<const Syntax extends string>(syntax: Syntax, description: string, operation: BodyOperation<Syntax>, textField?: string, view?: HumanView): CommandDefinition;
19
+ export declare function projectedBodyUpdate<const Syntax extends string>(syntax: Syntax, description: string, operation: ProjectedBodyOperation<Syntax>, textField?: string, view?: HumanView): CommandDefinition;
20
20
  export declare function readOptions(options: Record<string, unknown>): IssueSearchOptions;
21
21
  export {};
22
22
  //# sourceMappingURL=cli-support.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-support.d.ts","sourceRoot":"","sources":["../../src/cli-support.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-support.d.ts","sourceRoot":"","sources":["../../src/cli-support.ts"],"names":[],"mappings":"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"}