@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.
- package/dist/commands/history-display.d.ts +1 -1
- package/dist/commands/history-display.d.ts.map +1 -1
- package/dist/commands/history-display.js +8 -28
- package/dist/commands/history-display.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +9 -2
- package/dist/commands/history.js.map +1 -1
- package/dist/types/commands.d.ts +1 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/utils/formatters/history-formatters.d.ts +8 -0
- package/dist/utils/formatters/history-formatters.d.ts.map +1 -0
- package/dist/utils/formatters/history-formatters.js +105 -0
- package/dist/utils/formatters/history-formatters.js.map +1 -0
- package/dist/utils/validators.d.ts +4 -0
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js +12 -0
- package/dist/utils/validators.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/history-display.ts +9 -28
- package/src/commands/history.ts +9 -2
- package/src/types/commands.ts +1 -0
- package/src/utils/formatters/history-formatters.ts +123 -0
- package/src/utils/validators.ts +13 -0
- package/tests/commands/history.test.ts +115 -0
|
@@ -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":"
|
|
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
|
|
8
|
-
|
|
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()
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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":"
|
|
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;
|
|
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"}
|
package/dist/commands/history.js
CHANGED
|
@@ -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)([
|
|
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,
|
|
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":";;
|
|
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"}
|
package/dist/types/commands.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/utils/validators.js
CHANGED
|
@@ -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":";;;AAoBA,4CAKC;AAKD,8DAaC;AAKD,wCASC;AAKD,sCAaC;AAKD,gDAMC;AAqCD,oDAcC;
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
1
|
import { Message } from '../utils/slack-api-client';
|
|
3
|
-
import {
|
|
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()
|
|
20
|
-
const timestamp = formatSlackTimestamp(message.ts);
|
|
21
|
-
let author = 'Unknown';
|
|
11
|
+
const orderedMessages = [...messages].reverse();
|
|
22
12
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
}
|
package/src/commands/history.ts
CHANGED
|
@@ -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([
|
|
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
|
-
|
|
55
|
+
const format = parseFormat(options.format);
|
|
56
|
+
displayHistoryResults(messages, users, options.channel, format);
|
|
50
57
|
})
|
|
51
58
|
);
|
|
52
59
|
|
package/src/types/commands.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/utils/validators.ts
CHANGED
|
@@ -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',
|