@urugus/slack-cli 0.2.6 → 0.2.7
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.d.ts.map +1 -1
- package/dist/commands/history.js +7 -7
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +5 -18
- package/dist/commands/send.js.map +1 -1
- package/dist/utils/profile-config.d.ts.map +1 -1
- package/dist/utils/profile-config.js +2 -6
- package/dist/utils/profile-config.js.map +1 -1
- package/dist/utils/slack-operations/channel-operations.d.ts +9 -0
- package/dist/utils/slack-operations/channel-operations.d.ts.map +1 -1
- package/dist/utils/slack-operations/channel-operations.js +77 -50
- package/dist/utils/slack-operations/channel-operations.js.map +1 -1
- package/dist/utils/token-utils.d.ts +7 -0
- package/dist/utils/token-utils.d.ts.map +1 -0
- package/dist/utils/token-utils.js +18 -0
- package/dist/utils/token-utils.js.map +1 -0
- package/dist/utils/validators.d.ts +79 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +175 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/history.ts +17 -12
- package/src/commands/send.ts +8 -19
- package/src/utils/profile-config.ts +3 -15
- package/src/utils/slack-operations/channel-operations.ts +91 -54
- package/src/utils/token-utils.ts +17 -0
- package/src/utils/validators.ts +212 -0
- package/tests/utils/option-parsers.test.ts +173 -0
- package/tests/utils/profile-config.test.ts +282 -0
- package/tests/utils/slack-operations/channel-operations-refactored.test.ts +179 -0
- package/tests/utils/token-utils.test.ts +33 -0
- package/tests/utils/validators.test.ts +307 -0
- package/src/utils/profile-config-refactored.ts +0 -161
|
@@ -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;AAWpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0C7C"}
|
package/dist/commands/history.js
CHANGED
|
@@ -5,6 +5,8 @@ const commander_1 = require("commander");
|
|
|
5
5
|
const command_wrapper_1 = require("../utils/command-wrapper");
|
|
6
6
|
const client_factory_1 = require("../utils/client-factory");
|
|
7
7
|
const constants_1 = require("../utils/constants");
|
|
8
|
+
const option_parsers_1 = require("../utils/option-parsers");
|
|
9
|
+
const validators_1 = require("../utils/validators");
|
|
8
10
|
const history_validators_1 = require("./history-validators");
|
|
9
11
|
const history_display_1 = require("./history-display");
|
|
10
12
|
function setupHistoryCommand() {
|
|
@@ -14,15 +16,13 @@ function setupHistoryCommand() {
|
|
|
14
16
|
.option('-n, --number <number>', 'Number of messages to retrieve', constants_1.API_LIMITS.DEFAULT_MESSAGE_COUNT.toString())
|
|
15
17
|
.option('--since <date>', 'Get messages since specific date (YYYY-MM-DD HH:MM:SS)')
|
|
16
18
|
.option('--profile <profile>', 'Use specific workspace profile')
|
|
17
|
-
.hook('preAction', (
|
|
18
|
-
const options = thisCommand.opts();
|
|
19
|
-
(0, history_validators_1.validateMessageCount)(options.number, thisCommand);
|
|
20
|
-
(0, history_validators_1.validateDateFormat)(options.since, thisCommand);
|
|
21
|
-
})
|
|
19
|
+
.hook('preAction', (0, validators_1.createValidationHook)([validators_1.optionValidators.messageCount, validators_1.optionValidators.sinceDate]))
|
|
22
20
|
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
23
|
-
const
|
|
21
|
+
const profile = (0, option_parsers_1.parseProfile)(options.profile);
|
|
22
|
+
const client = await (0, client_factory_1.createSlackClient)(profile);
|
|
23
|
+
const limit = (0, option_parsers_1.parseCount)(options.number, constants_1.API_LIMITS.DEFAULT_MESSAGE_COUNT, constants_1.API_LIMITS.MIN_MESSAGE_COUNT, constants_1.API_LIMITS.MAX_MESSAGE_COUNT);
|
|
24
24
|
const historyOptions = {
|
|
25
|
-
limit
|
|
25
|
+
limit,
|
|
26
26
|
};
|
|
27
27
|
const oldest = (0, history_validators_1.prepareSinceTimestamp)(options.since);
|
|
28
28
|
if (oldest) {
|
|
@@ -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":";;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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,gBAAgB,IAAI,OAAO,CAsC1C"}
|
package/dist/commands/send.js
CHANGED
|
@@ -44,12 +44,9 @@ const constants_1 = require("../utils/constants");
|
|
|
44
44
|
const client_factory_1 = require("../utils/client-factory");
|
|
45
45
|
const errors_1 = require("../utils/errors");
|
|
46
46
|
const error_utils_1 = require("../utils/error-utils");
|
|
47
|
+
const option_parsers_1 = require("../utils/option-parsers");
|
|
48
|
+
const validators_1 = require("../utils/validators");
|
|
47
49
|
const fs = __importStar(require("fs/promises"));
|
|
48
|
-
function isValidThreadTimestamp(timestamp) {
|
|
49
|
-
// Slack timestamp format: 1234567890.123456
|
|
50
|
-
const timestampRegex = /^\d{10}\.\d{6}$/;
|
|
51
|
-
return timestampRegex.test(timestamp);
|
|
52
|
-
}
|
|
53
50
|
function setupSendCommand() {
|
|
54
51
|
const sendCommand = new commander_1.Command('send')
|
|
55
52
|
.description('Send a message to a Slack channel')
|
|
@@ -58,18 +55,7 @@ function setupSendCommand() {
|
|
|
58
55
|
.option('-f, --file <file>', 'File containing message content')
|
|
59
56
|
.option('-t, --thread <thread>', 'Thread timestamp to reply to')
|
|
60
57
|
.option('--profile <profile>', 'Use specific workspace profile')
|
|
61
|
-
.hook('preAction', (
|
|
62
|
-
const options = thisCommand.opts();
|
|
63
|
-
if (!options.message && !options.file) {
|
|
64
|
-
thisCommand.error(`Error: ${constants_1.ERROR_MESSAGES.NO_MESSAGE_OR_FILE}`);
|
|
65
|
-
}
|
|
66
|
-
if (options.message && options.file) {
|
|
67
|
-
thisCommand.error(`Error: ${constants_1.ERROR_MESSAGES.BOTH_MESSAGE_AND_FILE}`);
|
|
68
|
-
}
|
|
69
|
-
if (options.thread && !isValidThreadTimestamp(options.thread)) {
|
|
70
|
-
thisCommand.error(`Error: ${constants_1.ERROR_MESSAGES.INVALID_THREAD_TIMESTAMP}`);
|
|
71
|
-
}
|
|
72
|
-
})
|
|
58
|
+
.hook('preAction', (0, validators_1.createValidationHook)([validators_1.optionValidators.messageOrFile, validators_1.optionValidators.threadTimestamp]))
|
|
73
59
|
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
74
60
|
// Get message content
|
|
75
61
|
let messageContent;
|
|
@@ -85,7 +71,8 @@ function setupSendCommand() {
|
|
|
85
71
|
messageContent = options.message; // This is safe because of preAction validation
|
|
86
72
|
}
|
|
87
73
|
// Send message
|
|
88
|
-
const
|
|
74
|
+
const profile = (0, option_parsers_1.parseProfile)(options.profile);
|
|
75
|
+
const client = await (0, client_factory_1.createSlackClient)(profile);
|
|
89
76
|
await client.sendMessage(options.channel, messageContent, options.thread);
|
|
90
77
|
console.log(chalk_1.default.green(`✓ ${constants_1.SUCCESS_MESSAGES.MESSAGE_SENT(options.channel)}`));
|
|
91
78
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,4CAsCC;AAlDD,yCAAoC;AACpC,kDAA0B;AAC1B,8DAAuD;AACvD,kDAAsE;AACtE,4DAA4D;AAC5D,4CAA4C;AAE5C,sDAA2D;AAC3D,4DAAuD;AACvD,oDAA6E;AAC7E,gDAAkC;AAElC,SAAgB,gBAAgB;IAC9B,MAAM,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SACpC,WAAW,CAAC,mCAAmC,CAAC;SAChD,cAAc,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;SACtE,MAAM,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;SACpD,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;SAC/D,IAAI,CACH,WAAW,EACX,IAAA,iCAAoB,EAAC,CAAC,6BAAgB,CAAC,aAAa,EAAE,6BAAgB,CAAC,eAAe,CAAC,CAAC,CACzF;SACA,MAAM,CACL,IAAA,6BAAW,EAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACzC,sBAAsB;QACtB,IAAI,cAAsB,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAS,CACjB,0BAAc,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAA,iCAAmB,EAAC,KAAK,CAAC,CAAC,CACzE,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,OAAO,CAAC,OAAQ,CAAC,CAAC,+CAA+C;QACpF,CAAC;QAED,eAAe;QACf,MAAM,OAAO,GAAG,IAAA,6BAAY,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAiB,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,4BAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-config.d.ts","sourceRoot":"","sources":["../../src/utils/profile-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"profile-config.d.ts","sourceRoot":"","sources":["../../src/utils/profile-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAInF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,aAAkB;IAKjC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxD,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOnD,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAWlC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BlD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;YAIlB,cAAc;IAsB5B,OAAO,CAAC,cAAc;YAKR,gBAAgB;YAiBhB,eAAe;CAO9B;AAED,eAAO,MAAM,aAAa;6BACD,MAAM;0BAGP,MAAM,KAAG,MAAM,GAAG,SAAS;CAKlD,CAAC"}
|
|
@@ -38,6 +38,7 @@ const fs = __importStar(require("fs/promises"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const os = __importStar(require("os"));
|
|
40
40
|
const constants_1 = require("./constants");
|
|
41
|
+
const token_utils_1 = require("./token-utils");
|
|
41
42
|
class ProfileConfigManager {
|
|
42
43
|
constructor(options = {}) {
|
|
43
44
|
const configDir = options.configDir || path.join(os.homedir(), '.slack-cli');
|
|
@@ -109,12 +110,7 @@ class ProfileConfigManager {
|
|
|
109
110
|
await this.saveConfigStore(store);
|
|
110
111
|
}
|
|
111
112
|
maskToken(token) {
|
|
112
|
-
|
|
113
|
-
return '****';
|
|
114
|
-
}
|
|
115
|
-
const prefix = token.substring(0, constants_1.TOKEN_MASK_LENGTH);
|
|
116
|
-
const suffix = token.substring(token.length - constants_1.TOKEN_MASK_LENGTH);
|
|
117
|
-
return `${prefix}-****-****-${suffix}`;
|
|
113
|
+
return (0, token_utils_1.maskToken)(token);
|
|
118
114
|
}
|
|
119
115
|
async getConfigStore() {
|
|
120
116
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-config.js","sourceRoot":"","sources":["../../src/utils/profile-config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAEzB,
|
|
1
|
+
{"version":3,"file":"profile-config.js","sourceRoot":"","sources":["../../src/utils/profile-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { BaseSlackClient } from './base-client';
|
|
2
2
|
import { Channel, ListChannelsOptions } from '../slack-api-client';
|
|
3
|
+
import { WebClient } from '@slack/web-api';
|
|
3
4
|
interface ChannelWithUnreadInfo extends Channel {
|
|
4
5
|
unread_count: number;
|
|
5
6
|
unread_count_display: number;
|
|
6
7
|
last_read?: string;
|
|
7
8
|
}
|
|
8
9
|
export declare class ChannelOperations extends BaseSlackClient {
|
|
10
|
+
constructor(tokenOrClient: string | WebClient);
|
|
9
11
|
listChannels(options: ListChannelsOptions): Promise<Channel[]>;
|
|
10
12
|
listUnreadChannels(): Promise<Channel[]>;
|
|
13
|
+
private fetchAllChannels;
|
|
14
|
+
private getChannelUnreadInfo;
|
|
15
|
+
private fetchChannelInfo;
|
|
16
|
+
private calculateUnreadCount;
|
|
17
|
+
private fetchLatestMessage;
|
|
18
|
+
private fetchUnreadMessageCount;
|
|
19
|
+
private fetchAllMessageCount;
|
|
11
20
|
getChannelInfo(channelNameOrId: string): Promise<ChannelWithUnreadInfo>;
|
|
12
21
|
}
|
|
13
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-operations.d.ts","sourceRoot":"","sources":["../../../src/utils/slack-operations/channel-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"channel-operations.d.ts","sourceRoot":"","sources":["../../../src/utils/slack-operations/channel-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,UAAU,qBAAsB,SAAQ,OAAO;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,aAAa,EAAE,MAAM,GAAG,SAAS;IASvC,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAuB9D,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAuBhC,gBAAgB;YAUhB,oBAAoB;YAgBpB,gBAAgB;YAQhB,oBAAoB;YAkBpB,kBAAkB;YAQlB,uBAAuB;YASvB,oBAAoB;IAQ5B,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAe9E"}
|
|
@@ -5,6 +5,15 @@ const base_client_1 = require("./base-client");
|
|
|
5
5
|
const channel_resolver_1 = require("../channel-resolver");
|
|
6
6
|
const constants_1 = require("../constants");
|
|
7
7
|
class ChannelOperations extends base_client_1.BaseSlackClient {
|
|
8
|
+
constructor(tokenOrClient) {
|
|
9
|
+
if (typeof tokenOrClient === 'string') {
|
|
10
|
+
super(tokenOrClient);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
super('dummy-token'); // Call parent constructor
|
|
14
|
+
this.client = tokenOrClient; // Override the client for testing
|
|
15
|
+
}
|
|
16
|
+
}
|
|
8
17
|
async listChannels(options) {
|
|
9
18
|
const channels = [];
|
|
10
19
|
let cursor;
|
|
@@ -24,60 +33,14 @@ class ChannelOperations extends base_client_1.BaseSlackClient {
|
|
|
24
33
|
return channels;
|
|
25
34
|
}
|
|
26
35
|
async listUnreadChannels() {
|
|
27
|
-
|
|
28
|
-
const response = await this.client.conversations.list({
|
|
29
|
-
types: 'public_channel,private_channel,im,mpim',
|
|
30
|
-
exclude_archived: true,
|
|
31
|
-
limit: 1000,
|
|
32
|
-
});
|
|
33
|
-
const channels = response.channels;
|
|
36
|
+
const channels = await this.fetchAllChannels();
|
|
34
37
|
const channelsWithUnread = [];
|
|
35
38
|
// Process channels one by one with delay to avoid rate limits
|
|
36
39
|
for (const channel of channels) {
|
|
37
40
|
try {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
const channelInfo = info.channel;
|
|
43
|
-
// Get the latest message in the channel
|
|
44
|
-
const history = await this.client.conversations.history({
|
|
45
|
-
channel: channel.id,
|
|
46
|
-
limit: 1,
|
|
47
|
-
});
|
|
48
|
-
// Always check for messages after last_read timestamp
|
|
49
|
-
if (channelInfo.last_read) {
|
|
50
|
-
// Fetch messages after last_read
|
|
51
|
-
const unreadHistory = await this.client.conversations.history({
|
|
52
|
-
channel: channel.id,
|
|
53
|
-
oldest: channelInfo.last_read,
|
|
54
|
-
limit: 100, // Get up to 100 unread messages
|
|
55
|
-
});
|
|
56
|
-
const unreadCount = unreadHistory.messages?.length || 0;
|
|
57
|
-
if (unreadCount > 0) {
|
|
58
|
-
channelsWithUnread.push({
|
|
59
|
-
...channel,
|
|
60
|
-
unread_count: unreadCount,
|
|
61
|
-
unread_count_display: unreadCount,
|
|
62
|
-
last_read: channelInfo.last_read,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
else if (history.messages && history.messages.length > 0) {
|
|
67
|
-
// If no last_read, all messages are unread
|
|
68
|
-
const allHistory = await this.client.conversations.history({
|
|
69
|
-
channel: channel.id,
|
|
70
|
-
limit: 100,
|
|
71
|
-
});
|
|
72
|
-
const unreadCount = allHistory.messages?.length || 0;
|
|
73
|
-
if (unreadCount > 0) {
|
|
74
|
-
channelsWithUnread.push({
|
|
75
|
-
...channel,
|
|
76
|
-
unread_count: unreadCount,
|
|
77
|
-
unread_count_display: unreadCount,
|
|
78
|
-
last_read: channelInfo.last_read,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
41
|
+
const unreadInfo = await this.getChannelUnreadInfo(channel);
|
|
42
|
+
if (unreadInfo) {
|
|
43
|
+
channelsWithUnread.push(unreadInfo);
|
|
81
44
|
}
|
|
82
45
|
// Add delay between API calls to avoid rate limiting
|
|
83
46
|
await this.delay(100);
|
|
@@ -89,6 +52,70 @@ class ChannelOperations extends base_client_1.BaseSlackClient {
|
|
|
89
52
|
}
|
|
90
53
|
return channelsWithUnread;
|
|
91
54
|
}
|
|
55
|
+
async fetchAllChannels() {
|
|
56
|
+
const response = await this.client.conversations.list({
|
|
57
|
+
types: 'public_channel,private_channel,im,mpim',
|
|
58
|
+
exclude_archived: true,
|
|
59
|
+
limit: 1000,
|
|
60
|
+
});
|
|
61
|
+
return response.channels;
|
|
62
|
+
}
|
|
63
|
+
async getChannelUnreadInfo(channel) {
|
|
64
|
+
const channelInfo = await this.fetchChannelInfo(channel.id);
|
|
65
|
+
const unreadCount = await this.calculateUnreadCount(channel.id, channelInfo);
|
|
66
|
+
if (unreadCount > 0) {
|
|
67
|
+
return {
|
|
68
|
+
...channel,
|
|
69
|
+
unread_count: unreadCount,
|
|
70
|
+
unread_count_display: unreadCount,
|
|
71
|
+
last_read: channelInfo.last_read,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
async fetchChannelInfo(channelId) {
|
|
77
|
+
const info = await this.client.conversations.info({
|
|
78
|
+
channel: channelId,
|
|
79
|
+
include_num_members: false,
|
|
80
|
+
});
|
|
81
|
+
return info.channel;
|
|
82
|
+
}
|
|
83
|
+
async calculateUnreadCount(channelId, channelInfo) {
|
|
84
|
+
// Get the latest message to check if channel has any messages
|
|
85
|
+
const latestMessage = await this.fetchLatestMessage(channelId);
|
|
86
|
+
if (!latestMessage) {
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
if (channelInfo.last_read) {
|
|
90
|
+
return await this.fetchUnreadMessageCount(channelId, channelInfo.last_read);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// If no last_read, all messages are unread
|
|
94
|
+
return await this.fetchAllMessageCount(channelId);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async fetchLatestMessage(channelId) {
|
|
98
|
+
const history = await this.client.conversations.history({
|
|
99
|
+
channel: channelId,
|
|
100
|
+
limit: 1,
|
|
101
|
+
});
|
|
102
|
+
return history.messages && history.messages.length > 0 ? history.messages[0] : null;
|
|
103
|
+
}
|
|
104
|
+
async fetchUnreadMessageCount(channelId, lastRead) {
|
|
105
|
+
const unreadHistory = await this.client.conversations.history({
|
|
106
|
+
channel: channelId,
|
|
107
|
+
oldest: lastRead,
|
|
108
|
+
limit: 100, // Get up to 100 unread messages
|
|
109
|
+
});
|
|
110
|
+
return unreadHistory.messages?.length || 0;
|
|
111
|
+
}
|
|
112
|
+
async fetchAllMessageCount(channelId) {
|
|
113
|
+
const allHistory = await this.client.conversations.history({
|
|
114
|
+
channel: channelId,
|
|
115
|
+
limit: 100,
|
|
116
|
+
});
|
|
117
|
+
return allHistory.messages?.length || 0;
|
|
118
|
+
}
|
|
92
119
|
async getChannelInfo(channelNameOrId) {
|
|
93
120
|
const channelId = await channel_resolver_1.channelResolver.resolveChannelId(channelNameOrId, () => this.listChannels({
|
|
94
121
|
types: 'public_channel,private_channel,im,mpim',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-operations.js","sourceRoot":"","sources":["../../../src/utils/slack-operations/channel-operations.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAChD,0DAAsD;AACtD,4CAAwC;
|
|
1
|
+
{"version":3,"file":"channel-operations.js","sourceRoot":"","sources":["../../../src/utils/slack-operations/channel-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Masks a token for display purposes, showing only first and last few characters
|
|
3
|
+
* @param token The token to mask
|
|
4
|
+
* @returns Masked token in format "xoxb-****-****-abcd"
|
|
5
|
+
*/
|
|
6
|
+
export declare function maskToken(token: string): string;
|
|
7
|
+
//# sourceMappingURL=token-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../../src/utils/token-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.maskToken = maskToken;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
/**
|
|
6
|
+
* Masks a token for display purposes, showing only first and last few characters
|
|
7
|
+
* @param token The token to mask
|
|
8
|
+
* @returns Masked token in format "xoxb-****-****-abcd"
|
|
9
|
+
*/
|
|
10
|
+
function maskToken(token) {
|
|
11
|
+
if (token.length <= constants_1.TOKEN_MIN_LENGTH) {
|
|
12
|
+
return '****';
|
|
13
|
+
}
|
|
14
|
+
const prefix = token.substring(0, constants_1.TOKEN_MASK_LENGTH);
|
|
15
|
+
const suffix = token.substring(token.length - constants_1.TOKEN_MASK_LENGTH);
|
|
16
|
+
return `${prefix}-****-****-${suffix}`;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=token-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../../src/utils/token-utils.ts"],"names":[],"mappings":";;AAOA,8BASC;AAhBD,2CAAkE;AAElE;;;;GAIG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,4BAAgB,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,6BAAiB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,6BAAiB,CAAC,CAAC;IAEjE,OAAO,GAAG,MAAM,cAAc,MAAM,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Common validation functions for CLI commands
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationRule<T = unknown> {
|
|
6
|
+
validate: (value: T) => boolean | string;
|
|
7
|
+
errorMessage?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ValidationOptions {
|
|
10
|
+
required?: boolean;
|
|
11
|
+
rules?: ValidationRule[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validates that a value exists (not undefined, null, or empty string)
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateRequired(value: unknown, fieldName: string): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Validates mutually exclusive options
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateMutuallyExclusive(options: Record<string, unknown>, fields: string[], errorMessage?: string): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Validates string format using regex
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateFormat(value: string, pattern: RegExp, errorMessage: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Validates numeric range
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateRange(value: number, min?: number, max?: number, fieldName?: string): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Validates date format
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateDateFormat(dateString: string): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Common format validators
|
|
35
|
+
*/
|
|
36
|
+
export declare const formatValidators: {
|
|
37
|
+
/**
|
|
38
|
+
* Validates Slack thread timestamp format (1234567890.123456)
|
|
39
|
+
*/
|
|
40
|
+
threadTimestamp: (value: string) => string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Validates Slack channel ID format (C1234567890, D1234567890, G1234567890)
|
|
43
|
+
*/
|
|
44
|
+
channelId: (value: string) => string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Validates output format options
|
|
47
|
+
*/
|
|
48
|
+
outputFormat: (value: string) => string | null;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Creates a preAction hook for command validation
|
|
52
|
+
*/
|
|
53
|
+
export declare function createValidationHook(validations: Array<(options: Record<string, unknown>, command: Command) => string | null>): (thisCommand: Command) => void;
|
|
54
|
+
/**
|
|
55
|
+
* Common command option validators
|
|
56
|
+
*/
|
|
57
|
+
export declare const optionValidators: {
|
|
58
|
+
/**
|
|
59
|
+
* Validates message/file options for send command
|
|
60
|
+
*/
|
|
61
|
+
messageOrFile: (options: Record<string, unknown>) => string | null;
|
|
62
|
+
/**
|
|
63
|
+
* Validates thread timestamp if provided
|
|
64
|
+
*/
|
|
65
|
+
threadTimestamp: (options: Record<string, unknown>) => string | null;
|
|
66
|
+
/**
|
|
67
|
+
* Validates message count for history command
|
|
68
|
+
*/
|
|
69
|
+
messageCount: (options: Record<string, unknown>) => string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Validates date format for history command
|
|
72
|
+
*/
|
|
73
|
+
sinceDate: (options: Record<string, unknown>) => string | null;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Creates a validated option parser
|
|
77
|
+
*/
|
|
78
|
+
export declare function createOptionParser<T>(parser: (value: string | undefined, defaultValue: T) => T, validator?: (value: T) => string | null): (value: string | undefined, defaultValue: T) => T;
|
|
79
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +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"}
|