@urugus/slack-cli 0.2.7 → 0.2.8

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.
@@ -1,3 +1,3 @@
1
1
  import { Message } from '../utils/slack-api-client';
2
- export declare function displayHistoryResults(messages: Message[], users: Map<string, string>, channelName: string): void;
2
+ export declare function displayHistoryResults(messages: Message[], users: Map<string, string>, channelName: string, format?: string): void;
3
3
  //# sourceMappingURL=history-display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-display.d.ts","sourceRoot":"","sources":["../../src/commands/history-display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAIpD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,WAAW,EAAE,MAAM,GAClB,IAAI,CA4BN"}
1
+ {"version":3,"file":"history-display.d.ts","sourceRoot":"","sources":["../../src/commands/history-display.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGpD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,SAAU,GACf,IAAI,CAUN"}
@@ -1,35 +1,15 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.displayHistoryResults = displayHistoryResults;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const date_utils_1 = require("../utils/date-utils");
9
- const format_utils_1 = require("../utils/format-utils");
10
- function displayHistoryResults(messages, users, channelName) {
11
- if (messages.length === 0) {
12
- console.log(chalk_1.default.yellow('No messages found in the specified channel.'));
13
- return;
14
- }
15
- console.log(chalk_1.default.bold(`\nMessage History for #${channelName}:\n`));
4
+ const history_formatters_1 = require("../utils/formatters/history-formatters");
5
+ function displayHistoryResults(messages, users, channelName, format = 'table') {
16
6
  // Display messages in reverse order (oldest first)
17
- messages.reverse().forEach((message) => {
18
- const timestamp = (0, date_utils_1.formatSlackTimestamp)(message.ts);
19
- let author = 'Unknown';
20
- if (message.user && users.has(message.user)) {
21
- author = users.get(message.user);
22
- }
23
- else if (message.bot_id) {
24
- author = 'Bot';
25
- }
26
- console.log(chalk_1.default.gray(`[${timestamp}]`) + ' ' + chalk_1.default.cyan(author));
27
- if (message.text) {
28
- const formattedText = (0, format_utils_1.formatMessageWithMentions)(message.text, users);
29
- console.log(formattedText);
30
- }
31
- console.log(''); // Empty line between messages
7
+ const orderedMessages = [...messages].reverse();
8
+ const formatter = (0, history_formatters_1.createHistoryFormatter)(format);
9
+ formatter.format({
10
+ channelName,
11
+ messages: orderedMessages,
12
+ users,
32
13
  });
33
- console.log(chalk_1.default.green(`✓ Displayed ${messages.length} message(s)`));
34
14
  }
35
15
  //# sourceMappingURL=history-display.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-display.js","sourceRoot":"","sources":["../../src/commands/history-display.ts"],"names":[],"mappings":";;;;;AAKA,sDAgCC;AArCD,kDAA0B;AAE1B,oDAA2D;AAC3D,wDAAkE;AAElE,SAAgB,qBAAqB,CACnC,QAAmB,EACnB,KAA0B,EAC1B,WAAmB;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,WAAW,KAAK,CAAC,CAAC,CAAC;IAEpE,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,EAAE;QAC9C,MAAM,SAAS,GAAG,IAAA,iCAAoB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,SAAS,CAAC;QAEvB,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;QACpC,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,IAAA,wCAAyB,EAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,8BAA8B;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"history-display.js","sourceRoot":"","sources":["../../src/commands/history-display.ts"],"names":[],"mappings":";;AAGA,sDAeC;AAjBD,+EAAgF;AAEhF,SAAgB,qBAAqB,CACnC,QAAmB,EACnB,KAA0B,EAC1B,WAAmB,EACnB,MAAM,GAAG,OAAO;IAEhB,mDAAmD;IACnD,MAAM,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IAEhD,MAAM,SAAS,GAAG,IAAA,2CAAsB,EAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC;QACf,WAAW;QACX,QAAQ,EAAE,eAAe;QACzB,KAAK;KACN,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0C7C"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,IAAI,OAAO,CAgD7C"}
@@ -7,6 +7,7 @@ const client_factory_1 = require("../utils/client-factory");
7
7
  const constants_1 = require("../utils/constants");
8
8
  const option_parsers_1 = require("../utils/option-parsers");
9
9
  const validators_1 = require("../utils/validators");
10
+ const option_parsers_2 = require("../utils/option-parsers");
10
11
  const history_validators_1 = require("./history-validators");
11
12
  const history_display_1 = require("./history-display");
12
13
  function setupHistoryCommand() {
@@ -15,8 +16,13 @@ function setupHistoryCommand() {
15
16
  .requiredOption('-c, --channel <channel>', 'Target channel name or ID')
16
17
  .option('-n, --number <number>', 'Number of messages to retrieve', constants_1.API_LIMITS.DEFAULT_MESSAGE_COUNT.toString())
17
18
  .option('--since <date>', 'Get messages since specific date (YYYY-MM-DD HH:MM:SS)')
19
+ .option('--format <format>', 'Output format: table, simple, json', 'table')
18
20
  .option('--profile <profile>', 'Use specific workspace profile')
19
- .hook('preAction', (0, validators_1.createValidationHook)([validators_1.optionValidators.messageCount, validators_1.optionValidators.sinceDate]))
21
+ .hook('preAction', (0, validators_1.createValidationHook)([
22
+ validators_1.optionValidators.messageCount,
23
+ validators_1.optionValidators.sinceDate,
24
+ validators_1.optionValidators.format,
25
+ ]))
20
26
  .action((0, command_wrapper_1.wrapCommand)(async (options) => {
21
27
  const profile = (0, option_parsers_1.parseProfile)(options.profile);
22
28
  const client = await (0, client_factory_1.createSlackClient)(profile);
@@ -29,7 +35,8 @@ function setupHistoryCommand() {
29
35
  historyOptions.oldest = oldest;
30
36
  }
31
37
  const { messages, users } = await client.getHistory(options.channel, historyOptions);
32
- (0, history_display_1.displayHistoryResults)(messages, users, options.channel);
38
+ const format = (0, option_parsers_2.parseFormat)(options.format);
39
+ (0, history_display_1.displayHistoryResults)(messages, users, options.channel, format);
33
40
  }));
34
41
  return historyCommand;
35
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":";;AAWA,kDA0CC;AArDD,yCAAoC;AAEpC,8DAAuD;AACvD,4DAA4D;AAE5D,kDAAgD;AAChD,4DAAmE;AACnE,oDAA6E;AAC7E,6DAA6D;AAC7D,uDAA0D;AAE1D,SAAgB,mBAAmB;IACjC,MAAM,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;SAC1C,WAAW,CAAC,0CAA0C,CAAC;SACvD,cAAc,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;SACtE,MAAM,CACL,uBAAuB,EACvB,gCAAgC,EAChC,sBAAU,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAC5C;SACA,MAAM,CAAC,gBAAgB,EAAE,wDAAwD,CAAC;SAClF,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;SAC/D,IAAI,CACH,WAAW,EACX,IAAA,iCAAoB,EAAC,CAAC,6BAAgB,CAAC,YAAY,EAAE,6BAAgB,CAAC,SAAS,CAAC,CAAC,CAClF;SACA,MAAM,CACL,IAAA,6BAAW,EAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAA,6BAAY,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAiB,EAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,IAAA,2BAAU,EACtB,OAAO,CAAC,MAAM,EACd,sBAAU,CAAC,qBAAqB,EAChC,sBAAU,CAAC,iBAAiB,EAC5B,sBAAU,CAAC,iBAAiB,CAC7B,CAAC;QAEF,MAAM,cAAc,GAAsB;YACxC,KAAK;SACN,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,0CAAqB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;QACjC,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrF,IAAA,uCAAqB,EAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,cAAc,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":";;AAYA,kDAgDC;AA5DD,yCAAoC;AAEpC,8DAAuD;AACvD,4DAA4D;AAE5D,kDAAgD;AAChD,4DAAmE;AACnE,oDAA6E;AAC7E,4DAAsD;AACtD,6DAA6D;AAC7D,uDAA0D;AAE1D,SAAgB,mBAAmB;IACjC,MAAM,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;SAC1C,WAAW,CAAC,0CAA0C,CAAC;SACvD,cAAc,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;SACtE,MAAM,CACL,uBAAuB,EACvB,gCAAgC,EAChC,sBAAU,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAC5C;SACA,MAAM,CAAC,gBAAgB,EAAE,wDAAwD,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,OAAO,CAAC;SAC1E,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;SAC/D,IAAI,CACH,WAAW,EACX,IAAA,iCAAoB,EAAC;QACnB,6BAAgB,CAAC,YAAY;QAC7B,6BAAgB,CAAC,SAAS;QAC1B,6BAAgB,CAAC,MAAM;KACxB,CAAC,CACH;SACA,MAAM,CACL,IAAA,6BAAW,EAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAA,6BAAY,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAiB,EAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,IAAA,2BAAU,EACtB,OAAO,CAAC,MAAM,EACd,sBAAU,CAAC,qBAAqB,EAChC,sBAAU,CAAC,iBAAiB,EAC5B,sBAAU,CAAC,iBAAiB,CAC7B,CAAC;QAEF,MAAM,cAAc,GAAsB;YACxC,KAAK;SACN,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,0CAAqB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;QACjC,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,IAAA,4BAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAA,uCAAqB,EAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -29,6 +29,7 @@ export interface HistoryOptions {
29
29
  channel: string;
30
30
  number?: string;
31
31
  since?: string;
32
+ format?: 'table' | 'simple' | 'json';
32
33
  profile?: string;
33
34
  }
34
35
  export interface UnreadOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/types/commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/types/commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,8 @@
1
+ import { Message as SlackMessage } from '../slack-api-client';
2
+ export interface HistoryFormatterOptions {
3
+ channelName: string;
4
+ messages: SlackMessage[];
5
+ users: Map<string, string>;
6
+ }
7
+ export declare function createHistoryFormatter(format: string): import("./base-formatter").BaseFormatter<HistoryFormatterOptions>;
8
+ //# sourceMappingURL=history-formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-formatters.d.ts","sourceRoot":"","sources":["../../../src/utils/formatters/history-formatters.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAkGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,qEAEpD"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createHistoryFormatter = createHistoryFormatter;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const base_formatter_1 = require("./base-formatter");
9
+ function formatTimestampFixed(slackTimestamp) {
10
+ const timestamp = parseFloat(slackTimestamp);
11
+ const date = new Date(timestamp * 1000);
12
+ const year = date.getUTCFullYear();
13
+ const month = String(date.getUTCMonth() + 1).padStart(2, '0');
14
+ const day = String(date.getUTCDate()).padStart(2, '0');
15
+ const hours = String(date.getUTCHours()).padStart(2, '0');
16
+ const minutes = String(date.getUTCMinutes()).padStart(2, '0');
17
+ const seconds = String(date.getUTCSeconds()).padStart(2, '0');
18
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
19
+ }
20
+ const format_utils_1 = require("../format-utils");
21
+ class TableHistoryFormatter extends base_formatter_1.AbstractFormatter {
22
+ format(options) {
23
+ const { channelName, messages, users } = options;
24
+ console.log(chalk_1.default.bold(`\nMessage History for #${channelName}:`));
25
+ if (messages.length === 0) {
26
+ console.log(chalk_1.default.yellow('No messages found'));
27
+ return;
28
+ }
29
+ console.log('');
30
+ messages.forEach((message) => {
31
+ const timestamp = formatTimestampFixed(message.ts);
32
+ const username = this.getUsername(message, users);
33
+ console.log(`${chalk_1.default.gray(`[${timestamp}]`)} ${chalk_1.default.cyan(username)}`);
34
+ const text = message.text ? (0, format_utils_1.formatMessageWithMentions)(message.text, users) : '(no text)';
35
+ console.log(text);
36
+ console.log('');
37
+ });
38
+ console.log(chalk_1.default.green(`✓ Displayed ${messages.length} message(s)`));
39
+ }
40
+ getUsername(message, users) {
41
+ if (message.user) {
42
+ return users.get(message.user) || 'Unknown User';
43
+ }
44
+ if (message.bot_id) {
45
+ return 'Bot';
46
+ }
47
+ return 'Unknown';
48
+ }
49
+ }
50
+ class SimpleHistoryFormatter extends base_formatter_1.AbstractFormatter {
51
+ format(options) {
52
+ const { messages, users } = options;
53
+ if (messages.length === 0) {
54
+ console.log('No messages found');
55
+ return;
56
+ }
57
+ messages.forEach((message) => {
58
+ const timestamp = formatTimestampFixed(message.ts);
59
+ const username = this.getUsername(message, users);
60
+ const text = message.text ? (0, format_utils_1.formatMessageWithMentions)(message.text, users) : '(no text)';
61
+ console.log(`[${timestamp}] ${username}: ${text}`);
62
+ });
63
+ }
64
+ getUsername(message, users) {
65
+ if (message.user) {
66
+ return users.get(message.user) || 'Unknown User';
67
+ }
68
+ if (message.bot_id) {
69
+ return 'Bot';
70
+ }
71
+ return 'Unknown';
72
+ }
73
+ }
74
+ class JsonHistoryFormatter extends base_formatter_1.JsonFormatter {
75
+ transform(options) {
76
+ const { channelName, messages, users } = options;
77
+ return {
78
+ channel: channelName,
79
+ messages: messages.map((message) => ({
80
+ timestamp: formatTimestampFixed(message.ts),
81
+ user: this.getUsername(message, users),
82
+ text: message.text || '(no text)',
83
+ })),
84
+ total: messages.length,
85
+ };
86
+ }
87
+ getUsername(message, users) {
88
+ if (message.user) {
89
+ return users.get(message.user) || 'Unknown User';
90
+ }
91
+ if (message.bot_id) {
92
+ return 'Bot';
93
+ }
94
+ return 'Unknown';
95
+ }
96
+ }
97
+ const historyFormatterFactory = (0, base_formatter_1.createFormatterFactory)({
98
+ table: new TableHistoryFormatter(),
99
+ simple: new SimpleHistoryFormatter(),
100
+ json: new JsonHistoryFormatter(),
101
+ });
102
+ function createHistoryFormatter(format) {
103
+ return historyFormatterFactory.create(format);
104
+ }
105
+ //# sourceMappingURL=history-formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-formatters.js","sourceRoot":"","sources":["../../../src/utils/formatters/history-formatters.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,10 @@ export declare const optionValidators: {
71
71
  * Validates date format for history command
72
72
  */
73
73
  sinceDate: (options: Record<string, unknown>) => string | null;
74
+ /**
75
+ * Validates format option
76
+ */
77
+ format: (options: Record<string, unknown>) => string | null;
74
78
  };
75
79
  /**
76
80
  * Creates a validated option parser
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AAEH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CASf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAKf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,SAAU,GAClB,MAAM,GAAG,IAAI,CAQf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMpE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;6BACsB,MAAM,KAAG,MAAM,GAAG,IAAI;IAK/C;;OAEG;uBACgB,MAAM,KAAG,MAAM,GAAG,IAAI;IAKzC;;OAEG;0BACmB,MAAM,KAAG,MAAM,GAAG,IAAI;CAO7C,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,GACxF,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAYhC;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;6BACsB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAUhE;;OAEG;+BACwB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAOlE;;OAEG;4BACqB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAW/D;;OAEG;yBACkB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;CAS7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,EACzD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GACtC,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,CAWnD"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AAEH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CASf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAKf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,SAAU,GAClB,MAAM,GAAG,IAAI,CAQf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMpE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;6BACsB,MAAM,KAAG,MAAM,GAAG,IAAI;IAK/C;;OAEG;uBACgB,MAAM,KAAG,MAAM,GAAG,IAAI;IAKzC;;OAEG;0BACmB,MAAM,KAAG,MAAM,GAAG,IAAI;CAO7C,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,GACxF,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAYhC;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;6BACsB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAUhE;;OAEG;+BACwB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAOlE;;OAEG;4BACqB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAW/D;;OAEG;yBACkB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;IAU5D;;OAEG;sBACe,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAAI;CAS1D,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,EACzD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GACtC,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,CAWnD"}
@@ -156,6 +156,18 @@ exports.optionValidators = {
156
156
  }
157
157
  return null;
158
158
  },
159
+ /**
160
+ * Validates format option
161
+ */
162
+ format: (options) => {
163
+ if (options.format) {
164
+ const validFormats = ['table', 'simple', 'json'];
165
+ if (!validFormats.includes(options.format)) {
166
+ return `Invalid format '${options.format}'. Must be one of: ${validFormats.join(', ')}`;
167
+ }
168
+ }
169
+ return null;
170
+ },
159
171
  };
160
172
  /**
161
173
  * Creates a validated option parser
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urugus/slack-cli",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "A command-line tool for sending messages to Slack",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,38 +1,19 @@
1
- import chalk from 'chalk';
2
1
  import { Message } from '../utils/slack-api-client';
3
- import { formatSlackTimestamp } from '../utils/date-utils';
4
- import { formatMessageWithMentions } from '../utils/format-utils';
2
+ import { createHistoryFormatter } from '../utils/formatters/history-formatters';
5
3
 
6
4
  export function displayHistoryResults(
7
5
  messages: Message[],
8
6
  users: Map<string, string>,
9
- channelName: string
7
+ channelName: string,
8
+ format = 'table'
10
9
  ): void {
11
- if (messages.length === 0) {
12
- console.log(chalk.yellow('No messages found in the specified channel.'));
13
- return;
14
- }
15
-
16
- console.log(chalk.bold(`\nMessage History for #${channelName}:\n`));
17
-
18
10
  // Display messages in reverse order (oldest first)
19
- messages.reverse().forEach((message: Message) => {
20
- const timestamp = formatSlackTimestamp(message.ts);
21
- let author = 'Unknown';
11
+ const orderedMessages = [...messages].reverse();
22
12
 
23
- if (message.user && users.has(message.user)) {
24
- author = users.get(message.user)!;
25
- } else if (message.bot_id) {
26
- author = 'Bot';
27
- }
28
-
29
- console.log(chalk.gray(`[${timestamp}]`) + ' ' + chalk.cyan(author));
30
- if (message.text) {
31
- const formattedText = formatMessageWithMentions(message.text, users);
32
- console.log(formattedText);
33
- }
34
- console.log(''); // Empty line between messages
13
+ const formatter = createHistoryFormatter(format);
14
+ formatter.format({
15
+ channelName,
16
+ messages: orderedMessages,
17
+ users,
35
18
  });
36
-
37
- console.log(chalk.green(`✓ Displayed ${messages.length} message(s)`));
38
19
  }
@@ -6,6 +6,7 @@ import { HistoryOptions } from '../types/commands';
6
6
  import { API_LIMITS } from '../utils/constants';
7
7
  import { parseCount, parseProfile } from '../utils/option-parsers';
8
8
  import { createValidationHook, optionValidators } from '../utils/validators';
9
+ import { parseFormat } from '../utils/option-parsers';
9
10
  import { prepareSinceTimestamp } from './history-validators';
10
11
  import { displayHistoryResults } from './history-display';
11
12
 
@@ -19,10 +20,15 @@ export function setupHistoryCommand(): Command {
19
20
  API_LIMITS.DEFAULT_MESSAGE_COUNT.toString()
20
21
  )
21
22
  .option('--since <date>', 'Get messages since specific date (YYYY-MM-DD HH:MM:SS)')
23
+ .option('--format <format>', 'Output format: table, simple, json', 'table')
22
24
  .option('--profile <profile>', 'Use specific workspace profile')
23
25
  .hook(
24
26
  'preAction',
25
- createValidationHook([optionValidators.messageCount, optionValidators.sinceDate])
27
+ createValidationHook([
28
+ optionValidators.messageCount,
29
+ optionValidators.sinceDate,
30
+ optionValidators.format,
31
+ ])
26
32
  )
27
33
  .action(
28
34
  wrapCommand(async (options: HistoryOptions) => {
@@ -46,7 +52,8 @@ export function setupHistoryCommand(): Command {
46
52
  }
47
53
 
48
54
  const { messages, users } = await client.getHistory(options.channel, historyOptions);
49
- displayHistoryResults(messages, users, options.channel);
55
+ const format = parseFormat(options.format);
56
+ displayHistoryResults(messages, users, options.channel, format);
50
57
  })
51
58
  );
52
59
 
@@ -35,6 +35,7 @@ export interface HistoryOptions {
35
35
  channel: string;
36
36
  number?: string;
37
37
  since?: string;
38
+ format?: 'table' | 'simple' | 'json';
38
39
  profile?: string;
39
40
  }
40
41
 
@@ -0,0 +1,123 @@
1
+ import chalk from 'chalk';
2
+ import { AbstractFormatter, JsonFormatter, createFormatterFactory } from './base-formatter';
3
+ import { formatSlackTimestamp } from '../date-utils';
4
+
5
+ function formatTimestampFixed(slackTimestamp: string): string {
6
+ const timestamp = parseFloat(slackTimestamp);
7
+ const date = new Date(timestamp * 1000);
8
+ const year = date.getUTCFullYear();
9
+ const month = String(date.getUTCMonth() + 1).padStart(2, '0');
10
+ const day = String(date.getUTCDate()).padStart(2, '0');
11
+ const hours = String(date.getUTCHours()).padStart(2, '0');
12
+ const minutes = String(date.getUTCMinutes()).padStart(2, '0');
13
+ const seconds = String(date.getUTCSeconds()).padStart(2, '0');
14
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
15
+ }
16
+ import { formatMessageWithMentions } from '../format-utils';
17
+ import { Message as SlackMessage } from '../slack-api-client';
18
+
19
+ export interface HistoryFormatterOptions {
20
+ channelName: string;
21
+ messages: SlackMessage[];
22
+ users: Map<string, string>;
23
+ }
24
+
25
+ class TableHistoryFormatter extends AbstractFormatter<HistoryFormatterOptions> {
26
+ format(options: HistoryFormatterOptions): void {
27
+ const { channelName, messages, users } = options;
28
+
29
+ console.log(chalk.bold(`\nMessage History for #${channelName}:`));
30
+
31
+ if (messages.length === 0) {
32
+ console.log(chalk.yellow('No messages found'));
33
+ return;
34
+ }
35
+
36
+ console.log('');
37
+ messages.forEach((message) => {
38
+ const timestamp = formatTimestampFixed(message.ts);
39
+ const username = this.getUsername(message, users);
40
+
41
+ console.log(`${chalk.gray(`[${timestamp}]`)} ${chalk.cyan(username)}`);
42
+ const text = message.text ? formatMessageWithMentions(message.text, users) : '(no text)';
43
+ console.log(text);
44
+ console.log('');
45
+ });
46
+
47
+ console.log(chalk.green(`✓ Displayed ${messages.length} message(s)`));
48
+ }
49
+
50
+ private getUsername(message: SlackMessage, users: Map<string, string>): string {
51
+ if (message.user) {
52
+ return users.get(message.user) || 'Unknown User';
53
+ }
54
+ if (message.bot_id) {
55
+ return 'Bot';
56
+ }
57
+ return 'Unknown';
58
+ }
59
+ }
60
+
61
+ class SimpleHistoryFormatter extends AbstractFormatter<HistoryFormatterOptions> {
62
+ format(options: HistoryFormatterOptions): void {
63
+ const { messages, users } = options;
64
+
65
+ if (messages.length === 0) {
66
+ console.log('No messages found');
67
+ return;
68
+ }
69
+
70
+ messages.forEach((message) => {
71
+ const timestamp = formatTimestampFixed(message.ts);
72
+ const username = this.getUsername(message, users);
73
+ const text = message.text ? formatMessageWithMentions(message.text, users) : '(no text)';
74
+ console.log(`[${timestamp}] ${username}: ${text}`);
75
+ });
76
+ }
77
+
78
+ private getUsername(message: SlackMessage, users: Map<string, string>): string {
79
+ if (message.user) {
80
+ return users.get(message.user) || 'Unknown User';
81
+ }
82
+ if (message.bot_id) {
83
+ return 'Bot';
84
+ }
85
+ return 'Unknown';
86
+ }
87
+ }
88
+
89
+ class JsonHistoryFormatter extends JsonFormatter<HistoryFormatterOptions> {
90
+ protected transform(options: HistoryFormatterOptions) {
91
+ const { channelName, messages, users } = options;
92
+
93
+ return {
94
+ channel: channelName,
95
+ messages: messages.map((message) => ({
96
+ timestamp: formatTimestampFixed(message.ts),
97
+ user: this.getUsername(message, users),
98
+ text: message.text || '(no text)',
99
+ })),
100
+ total: messages.length,
101
+ };
102
+ }
103
+
104
+ private getUsername(message: SlackMessage, users: Map<string, string>): string {
105
+ if (message.user) {
106
+ return users.get(message.user) || 'Unknown User';
107
+ }
108
+ if (message.bot_id) {
109
+ return 'Bot';
110
+ }
111
+ return 'Unknown';
112
+ }
113
+ }
114
+
115
+ const historyFormatterFactory = createFormatterFactory<HistoryFormatterOptions>({
116
+ table: new TableHistoryFormatter(),
117
+ simple: new SimpleHistoryFormatter(),
118
+ json: new JsonHistoryFormatter(),
119
+ });
120
+
121
+ export function createHistoryFormatter(format: string) {
122
+ return historyFormatterFactory.create(format);
123
+ }
@@ -190,6 +190,19 @@ export const optionValidators = {
190
190
  }
191
191
  return null;
192
192
  },
193
+
194
+ /**
195
+ * Validates format option
196
+ */
197
+ format: (options: Record<string, unknown>): string | null => {
198
+ if (options.format) {
199
+ const validFormats = ['table', 'simple', 'json'];
200
+ if (!validFormats.includes(options.format as string)) {
201
+ return `Invalid format '${options.format}'. Must be one of: ${validFormats.join(', ')}`;
202
+ }
203
+ }
204
+ return null;
205
+ },
193
206
  };
194
207
 
195
208
  /**
@@ -217,6 +217,121 @@ describe('history command', () => {
217
217
  });
218
218
 
219
219
  describe('output formatting', () => {
220
+ describe('format options', () => {
221
+ it('should display messages in JSON format when --format json is specified', async () => {
222
+ vi.mocked(mockConfigManager.getConfig).mockResolvedValue({
223
+ token: 'test-token',
224
+ updatedAt: new Date().toISOString()
225
+ });
226
+
227
+ const mockMessages = [
228
+ {
229
+ type: 'message',
230
+ text: 'Hello world',
231
+ user: 'U123456',
232
+ ts: '1609459200.000100',
233
+ },
234
+ {
235
+ type: 'message',
236
+ text: 'Another message',
237
+ user: 'U789012',
238
+ ts: '1609459300.000200',
239
+ },
240
+ ];
241
+
242
+ vi.mocked(mockSlackClient.getHistory).mockResolvedValue({
243
+ messages: mockMessages,
244
+ users: new Map([
245
+ ['U123456', 'john.doe'],
246
+ ['U789012', 'jane.smith']
247
+ ])
248
+ });
249
+
250
+ await program.parseAsync(['node', 'slack-cli', 'history', '-c', 'general', '--format', 'json']);
251
+
252
+ const expectedOutput = {
253
+ channel: 'general',
254
+ messages: [
255
+ {
256
+ timestamp: '2021-01-01 00:01:40',
257
+ user: 'jane.smith',
258
+ text: 'Another message'
259
+ },
260
+ {
261
+ timestamp: '2021-01-01 00:00:00',
262
+ user: 'john.doe',
263
+ text: 'Hello world'
264
+ }
265
+ ],
266
+ total: 2
267
+ };
268
+
269
+ expect(mockConsole.logSpy).toHaveBeenCalledWith(JSON.stringify(expectedOutput, null, 2));
270
+ });
271
+
272
+ it('should display messages in simple format when --format simple is specified', async () => {
273
+ vi.mocked(mockConfigManager.getConfig).mockResolvedValue({
274
+ token: 'test-token',
275
+ updatedAt: new Date().toISOString()
276
+ });
277
+
278
+ const mockMessages = [
279
+ {
280
+ type: 'message',
281
+ text: 'Hello world',
282
+ user: 'U123456',
283
+ ts: '1609459200.000100',
284
+ },
285
+ ];
286
+
287
+ vi.mocked(mockSlackClient.getHistory).mockResolvedValue({
288
+ messages: mockMessages,
289
+ users: new Map([['U123456', 'john.doe']])
290
+ });
291
+
292
+ await program.parseAsync(['node', 'slack-cli', 'history', '-c', 'general', '--format', 'simple']);
293
+
294
+ expect(mockConsole.logSpy).toHaveBeenCalledWith('[2021-01-01 00:00:00] john.doe: Hello world');
295
+ });
296
+
297
+ it('should display messages in table format by default', async () => {
298
+ vi.mocked(mockConfigManager.getConfig).mockResolvedValue({
299
+ token: 'test-token',
300
+ updatedAt: new Date().toISOString()
301
+ });
302
+
303
+ const mockMessages = [
304
+ {
305
+ type: 'message',
306
+ text: 'Hello world',
307
+ user: 'U123456',
308
+ ts: '1609459200.000100',
309
+ },
310
+ ];
311
+
312
+ vi.mocked(mockSlackClient.getHistory).mockResolvedValue({
313
+ messages: mockMessages,
314
+ users: new Map([['U123456', 'john.doe']])
315
+ });
316
+
317
+ await program.parseAsync(['node', 'slack-cli', 'history', '-c', 'general']);
318
+
319
+ // Should display in table format (current format)
320
+ expect(mockConsole.logSpy).toHaveBeenCalledWith(expect.stringContaining('Message History for #general'));
321
+ expect(mockConsole.logSpy).toHaveBeenCalledWith(expect.stringContaining('john.doe'));
322
+ expect(mockConsole.logSpy).toHaveBeenCalledWith(expect.stringContaining('Hello world'));
323
+ });
324
+
325
+ it('should handle invalid format option', async () => {
326
+ const historyCommand = setupHistoryCommand();
327
+ historyCommand.exitOverride();
328
+
329
+ await expect(
330
+ historyCommand.parseAsync(['-c', 'general', '--format', 'invalid'], { from: 'user' })
331
+ ).rejects.toThrow();
332
+ });
333
+ });
334
+
220
335
  it('should format messages with user names and timestamps', async () => {
221
336
  vi.mocked(mockConfigManager.getConfig).mockResolvedValue({
222
337
  token: 'test-token',