@urugus/slack-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.claude/settings.local.json +53 -0
  2. package/.eslintrc.json +25 -0
  3. package/.github/dependabot.yml +18 -0
  4. package/.github/workflows/ci.yml +70 -0
  5. package/.github/workflows/pr-validation.yml +51 -0
  6. package/.prettierignore +11 -0
  7. package/.prettierrc +10 -0
  8. package/CLAUDE.md +16 -0
  9. package/README.md +161 -0
  10. package/dist/commands/channels.d.ts +3 -0
  11. package/dist/commands/channels.d.ts.map +1 -0
  12. package/dist/commands/channels.js +50 -0
  13. package/dist/commands/channels.js.map +1 -0
  14. package/dist/commands/config.d.ts +3 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +87 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/history.d.ts +3 -0
  19. package/dist/commands/history.d.ts.map +1 -0
  20. package/dist/commands/history.js +79 -0
  21. package/dist/commands/history.js.map +1 -0
  22. package/dist/commands/send.d.ts +3 -0
  23. package/dist/commands/send.d.ts.map +1 -0
  24. package/dist/commands/send.js +85 -0
  25. package/dist/commands/send.js.map +1 -0
  26. package/dist/commands/unread.d.ts +3 -0
  27. package/dist/commands/unread.d.ts.map +1 -0
  28. package/dist/commands/unread.js +104 -0
  29. package/dist/commands/unread.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/types/commands.d.ts +40 -0
  35. package/dist/types/commands.d.ts.map +1 -0
  36. package/dist/types/commands.js +3 -0
  37. package/dist/types/commands.js.map +1 -0
  38. package/dist/types/config.d.ts +18 -0
  39. package/dist/types/config.d.ts.map +1 -0
  40. package/dist/types/config.js +3 -0
  41. package/dist/types/config.js.map +1 -0
  42. package/dist/utils/channel-formatter.d.ts +16 -0
  43. package/dist/utils/channel-formatter.d.ts.map +1 -0
  44. package/dist/utils/channel-formatter.js +77 -0
  45. package/dist/utils/channel-formatter.js.map +1 -0
  46. package/dist/utils/client-factory.d.ts +6 -0
  47. package/dist/utils/client-factory.d.ts.map +1 -0
  48. package/dist/utils/client-factory.js +13 -0
  49. package/dist/utils/client-factory.js.map +1 -0
  50. package/dist/utils/command-wrapper.d.ts +6 -0
  51. package/dist/utils/command-wrapper.d.ts.map +1 -0
  52. package/dist/utils/command-wrapper.js +27 -0
  53. package/dist/utils/command-wrapper.js.map +1 -0
  54. package/dist/utils/config-helper.d.ts +8 -0
  55. package/dist/utils/config-helper.d.ts.map +1 -0
  56. package/dist/utils/config-helper.js +19 -0
  57. package/dist/utils/config-helper.js.map +1 -0
  58. package/dist/utils/config.d.ts +10 -0
  59. package/dist/utils/config.d.ts.map +1 -0
  60. package/dist/utils/config.js +94 -0
  61. package/dist/utils/config.js.map +1 -0
  62. package/dist/utils/constants.d.ts +32 -0
  63. package/dist/utils/constants.d.ts.map +1 -0
  64. package/dist/utils/constants.js +42 -0
  65. package/dist/utils/constants.js.map +1 -0
  66. package/dist/utils/date-utils.d.ts +3 -0
  67. package/dist/utils/date-utils.d.ts.map +1 -0
  68. package/dist/utils/date-utils.js +12 -0
  69. package/dist/utils/date-utils.js.map +1 -0
  70. package/dist/utils/error-utils.d.ts +2 -0
  71. package/dist/utils/error-utils.d.ts.map +1 -0
  72. package/dist/utils/error-utils.js +10 -0
  73. package/dist/utils/error-utils.js.map +1 -0
  74. package/dist/utils/errors.d.ts +17 -0
  75. package/dist/utils/errors.d.ts.map +1 -0
  76. package/dist/utils/errors.js +40 -0
  77. package/dist/utils/errors.js.map +1 -0
  78. package/dist/utils/profile-config.d.ts +21 -0
  79. package/dist/utils/profile-config.d.ts.map +1 -0
  80. package/dist/utils/profile-config.js +173 -0
  81. package/dist/utils/profile-config.js.map +1 -0
  82. package/dist/utils/slack-api-client.d.ts +74 -0
  83. package/dist/utils/slack-api-client.d.ts.map +1 -0
  84. package/dist/utils/slack-api-client.js +132 -0
  85. package/dist/utils/slack-api-client.js.map +1 -0
  86. package/package.json +56 -0
  87. package/src/commands/channels.ts +65 -0
  88. package/src/commands/config.ts +104 -0
  89. package/src/commands/history.ts +96 -0
  90. package/src/commands/send.ts +52 -0
  91. package/src/commands/unread.ts +118 -0
  92. package/src/index.ts +19 -0
  93. package/src/types/commands.ts +46 -0
  94. package/src/types/config.ts +20 -0
  95. package/src/utils/channel-formatter.ts +89 -0
  96. package/src/utils/client-factory.ts +10 -0
  97. package/src/utils/command-wrapper.ts +27 -0
  98. package/src/utils/config-helper.ts +21 -0
  99. package/src/utils/constants.ts +47 -0
  100. package/src/utils/date-utils.ts +8 -0
  101. package/src/utils/error-utils.ts +6 -0
  102. package/src/utils/errors.ts +37 -0
  103. package/src/utils/profile-config.ts +171 -0
  104. package/src/utils/slack-api-client.ts +218 -0
  105. package/tests/commands/channels.test.ts +250 -0
  106. package/tests/commands/config.test.ts +158 -0
  107. package/tests/commands/history.test.ts +250 -0
  108. package/tests/commands/send.test.ts +156 -0
  109. package/tests/commands/unread.test.ts +248 -0
  110. package/tests/test-utils.ts +28 -0
  111. package/tests/utils/config.test.ts +400 -0
  112. package/tests/utils/date-utils.test.ts +30 -0
  113. package/tests/utils/error-utils.test.ts +34 -0
  114. package/tests/utils/slack-api-client.test.ts +170 -0
  115. package/tsconfig.json +22 -0
  116. package/vitest.config.ts +27 -0
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConfigOrThrow = getConfigOrThrow;
4
+ const profile_config_1 = require("./profile-config");
5
+ const errors_1 = require("./errors");
6
+ const constants_1 = require("./constants");
7
+ /**
8
+ * Helper function to get configuration with proper error handling
9
+ */
10
+ async function getConfigOrThrow(profile, configManager = new profile_config_1.ProfileConfigManager()) {
11
+ const config = await configManager.getConfig(profile);
12
+ if (!config) {
13
+ const profiles = await configManager.listProfiles();
14
+ const profileName = profile || profiles.find((p) => p.isDefault)?.name || 'default';
15
+ throw new errors_1.ConfigurationError(constants_1.ERROR_MESSAGES.NO_CONFIG(profileName));
16
+ }
17
+ return config;
18
+ }
19
+ //# sourceMappingURL=config-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-helper.js","sourceRoot":"","sources":["../../src/utils/config-helper.ts"],"names":[],"mappings":";;AAOA,4CAaC;AApBD,qDAAwD;AACxD,qCAA8C;AAC9C,2CAA6C;AAE7C;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAAgB,EAChB,gBAAsC,IAAI,qCAAoB,EAAE;IAEhE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,SAAS,CAAC;QACpF,MAAM,IAAI,2BAAkB,CAAC,0BAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Config, ConfigOptions } from '../types/config';
2
+ export declare class ConfigManager {
3
+ private configPath;
4
+ constructor(options?: ConfigOptions);
5
+ setToken(token: string): Promise<void>;
6
+ getConfig(): Promise<Config | null>;
7
+ clearConfig(): Promise<void>;
8
+ maskToken(token: string): string;
9
+ }
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE7D,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,aAAkB;IAKjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBnC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAUjC"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ConfigManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ class ConfigManager {
41
+ constructor(options = {}) {
42
+ const configDir = options.configDir || path.join(os.homedir(), '.slack-cli');
43
+ this.configPath = path.join(configDir, 'config.json');
44
+ }
45
+ async setToken(token) {
46
+ const config = {
47
+ token,
48
+ updatedAt: new Date().toISOString(),
49
+ };
50
+ const configDir = path.dirname(this.configPath);
51
+ await fs.mkdir(configDir, { recursive: true });
52
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
53
+ await fs.chmod(this.configPath, 0o600);
54
+ }
55
+ async getConfig() {
56
+ try {
57
+ const data = await fs.readFile(this.configPath, 'utf-8');
58
+ const config = JSON.parse(data);
59
+ if (!config.token || !config.updatedAt) {
60
+ throw new Error('Invalid config file format');
61
+ }
62
+ return config;
63
+ }
64
+ catch (error) {
65
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
66
+ return null;
67
+ }
68
+ if (error instanceof SyntaxError) {
69
+ throw new Error('Invalid config file format');
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ async clearConfig() {
75
+ try {
76
+ await fs.unlink(this.configPath);
77
+ }
78
+ catch (error) {
79
+ if (error && typeof error === 'object' && 'code' in error && error.code !== 'ENOENT') {
80
+ throw error;
81
+ }
82
+ }
83
+ }
84
+ maskToken(token) {
85
+ if (token.length <= 9) {
86
+ return '****';
87
+ }
88
+ const prefix = token.substring(0, 4);
89
+ const suffix = token.substring(token.length - 4);
90
+ return `${prefix}-****-****-${suffix}`;
91
+ }
92
+ }
93
+ exports.ConfigManager = ConfigManager;
94
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAGzB,MAAa,aAAa;IAGxB,YAAY,UAAyB,EAAE;QACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,MAAM,GAAW;YACrB,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,OAAO,MAAgB,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrF,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjD,OAAO,GAAG,MAAM,cAAc,MAAM,EAAE,CAAC;IACzC,CAAC;CACF;AA9DD,sCA8DC"}
@@ -0,0 +1,32 @@
1
+ export declare const TOKEN_MASK_LENGTH = 4;
2
+ export declare const TOKEN_MIN_LENGTH = 9;
3
+ export declare const DEFAULT_PROFILE_NAME = "default";
4
+ export declare const ERROR_MESSAGES: {
5
+ readonly NO_CONFIG: (profileName: string) => string;
6
+ readonly PROFILE_NOT_FOUND: (profileName: string) => string;
7
+ readonly NO_PROFILES_FOUND: "No profiles found. Use \"slack-cli config set --token <token>\" to create one.";
8
+ readonly INVALID_CONFIG_FORMAT: "Invalid config file format";
9
+ readonly NO_MESSAGE_OR_FILE: "You must specify either --message or --file";
10
+ readonly BOTH_MESSAGE_AND_FILE: "Cannot use both --message and --file";
11
+ readonly API_ERROR: (error: string) => string;
12
+ readonly CHANNEL_NOT_FOUND: (channel: string) => string;
13
+ readonly FILE_READ_ERROR: (file: string, error: string) => string;
14
+ readonly FILE_NOT_FOUND: (file: string) => string;
15
+ readonly NO_CHANNELS_FOUND: "No channels found";
16
+ readonly ERROR_LISTING_CHANNELS: (error: string) => string;
17
+ };
18
+ export declare const SUCCESS_MESSAGES: {
19
+ readonly TOKEN_SAVED: (profileName: string) => string;
20
+ readonly PROFILE_SWITCHED: (profileName: string) => string;
21
+ readonly PROFILE_CLEARED: (profileName: string) => string;
22
+ readonly MESSAGE_SENT: (channel: string) => string;
23
+ };
24
+ export declare const FILE_PERMISSIONS: {
25
+ CONFIG_FILE: number;
26
+ };
27
+ export declare const API_LIMITS: {
28
+ MAX_MESSAGE_COUNT: number;
29
+ MIN_MESSAGE_COUNT: number;
30
+ DEFAULT_MESSAGE_COUNT: number;
31
+ };
32
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,eAAO,MAAM,cAAc;sCAEA,MAAM;8CAEE,MAAM;;;;;gCASpB,MAAM;0CACI,MAAM;qCAGX,MAAM,SAAS,MAAM;oCACtB,MAAM;;6CAIG,MAAM;CAC9B,CAAC;AAEX,eAAO,MAAM,gBAAgB;wCACA,MAAM;6CACD,MAAM;4CACP,MAAM;qCACb,MAAM;CACtB,CAAC;AAGX,eAAO,MAAM,gBAAgB;;CAE5B,CAAC;AAGF,eAAO,MAAM,UAAU;;;;CAItB,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.API_LIMITS = exports.FILE_PERMISSIONS = exports.SUCCESS_MESSAGES = exports.ERROR_MESSAGES = exports.DEFAULT_PROFILE_NAME = exports.TOKEN_MIN_LENGTH = exports.TOKEN_MASK_LENGTH = void 0;
4
+ exports.TOKEN_MASK_LENGTH = 4;
5
+ exports.TOKEN_MIN_LENGTH = 9;
6
+ exports.DEFAULT_PROFILE_NAME = 'default';
7
+ exports.ERROR_MESSAGES = {
8
+ // Configuration errors
9
+ NO_CONFIG: (profileName) => `No configuration found for profile "${profileName}". Use "slack-cli config set --token <token> --profile ${profileName}" to set up.`,
10
+ PROFILE_NOT_FOUND: (profileName) => `Profile "${profileName}" not found`,
11
+ NO_PROFILES_FOUND: 'No profiles found. Use "slack-cli config set --token <token>" to create one.',
12
+ INVALID_CONFIG_FORMAT: 'Invalid config file format',
13
+ // Validation errors
14
+ NO_MESSAGE_OR_FILE: 'You must specify either --message or --file',
15
+ BOTH_MESSAGE_AND_FILE: 'Cannot use both --message and --file',
16
+ // API errors
17
+ API_ERROR: (error) => `API Error: ${error}`,
18
+ CHANNEL_NOT_FOUND: (channel) => `Channel not found: ${channel}`,
19
+ // File errors
20
+ FILE_READ_ERROR: (file, error) => `Error reading file ${file}: ${error}`,
21
+ FILE_NOT_FOUND: (file) => `File not found: ${file}`,
22
+ // Channels command errors
23
+ NO_CHANNELS_FOUND: 'No channels found',
24
+ ERROR_LISTING_CHANNELS: (error) => `Error listing channels: ${error}`,
25
+ };
26
+ exports.SUCCESS_MESSAGES = {
27
+ TOKEN_SAVED: (profileName) => `Token saved successfully for profile "${profileName}"`,
28
+ PROFILE_SWITCHED: (profileName) => `Switched to profile "${profileName}"`,
29
+ PROFILE_CLEARED: (profileName) => `Profile "${profileName}" cleared successfully`,
30
+ MESSAGE_SENT: (channel) => `Message sent successfully to #${channel}`,
31
+ };
32
+ // File and system constants
33
+ exports.FILE_PERMISSIONS = {
34
+ CONFIG_FILE: 0o600, // Read/write for owner only
35
+ };
36
+ // API limits
37
+ exports.API_LIMITS = {
38
+ MAX_MESSAGE_COUNT: 1000,
39
+ MIN_MESSAGE_COUNT: 1,
40
+ DEFAULT_MESSAGE_COUNT: 10,
41
+ };
42
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG,CAAC,CAAC;AACtB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAEjC,QAAA,cAAc,GAAG;IAC5B,uBAAuB;IACvB,SAAS,EAAE,CAAC,WAAmB,EAAE,EAAE,CACjC,uCAAuC,WAAW,0DAA0D,WAAW,cAAc;IACvI,iBAAiB,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,YAAY,WAAW,aAAa;IAChF,iBAAiB,EAAE,8EAA8E;IACjG,qBAAqB,EAAE,4BAA4B;IAEnD,oBAAoB;IACpB,kBAAkB,EAAE,6CAA6C;IACjE,qBAAqB,EAAE,sCAAsC;IAE7D,aAAa;IACb,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,cAAc,KAAK,EAAE;IACnD,iBAAiB,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,sBAAsB,OAAO,EAAE;IAEvE,cAAc;IACd,eAAe,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,sBAAsB,IAAI,KAAK,KAAK,EAAE;IACxF,cAAc,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,mBAAmB,IAAI,EAAE;IAE3D,0BAA0B;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,2BAA2B,KAAK,EAAE;CACrE,CAAC;AAEE,QAAA,gBAAgB,GAAG;IAC9B,WAAW,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,yCAAyC,WAAW,GAAG;IAC7F,gBAAgB,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,wBAAwB,WAAW,GAAG;IACjF,eAAe,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,YAAY,WAAW,wBAAwB;IACzF,YAAY,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,iCAAiC,OAAO,EAAE;CACrE,CAAC;AAEX,4BAA4B;AACf,QAAA,gBAAgB,GAAG;IAC9B,WAAW,EAAE,KAAK,EAAE,4BAA4B;CACjD,CAAC;AAEF,aAAa;AACA,QAAA,UAAU,GAAG;IACxB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,CAAC;IACpB,qBAAqB,EAAE,EAAE;CAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function formatUnixTimestamp(timestamp: number): string;
2
+ export declare function formatSlackTimestamp(slackTimestamp: string): string;
3
+ //# sourceMappingURL=date-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAGnE"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatUnixTimestamp = formatUnixTimestamp;
4
+ exports.formatSlackTimestamp = formatSlackTimestamp;
5
+ function formatUnixTimestamp(timestamp) {
6
+ return new Date(timestamp * 1000).toISOString().split('T')[0];
7
+ }
8
+ function formatSlackTimestamp(slackTimestamp) {
9
+ const timestamp = parseFloat(slackTimestamp);
10
+ return new Date(timestamp * 1000).toLocaleString();
11
+ }
12
+ //# sourceMappingURL=date-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.js","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":";;AAAA,kDAEC;AAED,oDAGC;AAPD,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,oBAAoB,CAAC,cAAsB;IACzD,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractErrorMessage(error: unknown): string;
2
+ //# sourceMappingURL=error-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK1D"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractErrorMessage = extractErrorMessage;
4
+ function extractErrorMessage(error) {
5
+ if (error instanceof Error) {
6
+ return error.message;
7
+ }
8
+ return String(error);
9
+ }
10
+ //# sourceMappingURL=error-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":";;AAAA,kDAKC;AALD,SAAgB,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare class SlackCliError extends Error {
2
+ code?: string | undefined;
3
+ constructor(message: string, code?: string | undefined);
4
+ }
5
+ export declare class ConfigurationError extends SlackCliError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class ValidationError extends SlackCliError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class ApiError extends SlackCliError {
12
+ constructor(message: string);
13
+ }
14
+ export declare class FileError extends SlackCliError {
15
+ constructor(message: string);
16
+ }
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;IAG7B,IAAI,CAAC,EAAE,MAAM;gBADpB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA;CAKvB;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,QAAS,SAAQ,aAAa;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,SAAU,SAAQ,aAAa;gBAC9B,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileError = exports.ApiError = exports.ValidationError = exports.ConfigurationError = exports.SlackCliError = void 0;
4
+ class SlackCliError extends Error {
5
+ constructor(message, code) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = 'SlackCliError';
9
+ }
10
+ }
11
+ exports.SlackCliError = SlackCliError;
12
+ class ConfigurationError extends SlackCliError {
13
+ constructor(message) {
14
+ super(message, 'CONFIGURATION_ERROR');
15
+ this.name = 'ConfigurationError';
16
+ }
17
+ }
18
+ exports.ConfigurationError = ConfigurationError;
19
+ class ValidationError extends SlackCliError {
20
+ constructor(message) {
21
+ super(message, 'VALIDATION_ERROR');
22
+ this.name = 'ValidationError';
23
+ }
24
+ }
25
+ exports.ValidationError = ValidationError;
26
+ class ApiError extends SlackCliError {
27
+ constructor(message) {
28
+ super(message, 'API_ERROR');
29
+ this.name = 'ApiError';
30
+ }
31
+ }
32
+ exports.ApiError = ApiError;
33
+ class FileError extends SlackCliError {
34
+ constructor(message) {
35
+ super(message, 'FILE_ERROR');
36
+ this.name = 'FileError';
37
+ }
38
+ }
39
+ exports.FileError = FileError;
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IACtC,YACE,OAAe,EACR,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AARD,sCAQC;AAED,MAAa,kBAAmB,SAAQ,aAAa;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,MAAa,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAa,QAAS,SAAQ,aAAa;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AALD,4BAKC;AAED,MAAa,SAAU,SAAQ,aAAa;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AALD,8BAKC"}
@@ -0,0 +1,21 @@
1
+ import type { Config, ConfigOptions, Profile } from '../types/config';
2
+ export declare class ProfileConfigManager {
3
+ private configPath;
4
+ constructor(options?: ConfigOptions);
5
+ setToken(token: string, profile?: string): Promise<void>;
6
+ getConfig(profile?: string): Promise<Config | null>;
7
+ listProfiles(): Promise<Profile[]>;
8
+ useProfile(profile: string): Promise<void>;
9
+ getCurrentProfile(): Promise<string>;
10
+ clearConfig(profile?: string): Promise<void>;
11
+ maskToken(token: string): string;
12
+ private getConfigStore;
13
+ private needsMigration;
14
+ private migrateOldConfig;
15
+ private saveConfigStore;
16
+ }
17
+ export declare const profileConfig: {
18
+ getCurrentProfile: () => string;
19
+ getToken: (_profile?: string) => string | undefined;
20
+ };
21
+ //# sourceMappingURL=profile-config.d.ts.map
@@ -0,0 +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;AASnF,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;YAWlB,cAAc;IAsB5B,OAAO,CAAC,cAAc;YAIR,gBAAgB;YAgBhB,eAAe;CAO9B;AAED,eAAO,MAAM,aAAa;6BACD,MAAM;0BAGP,MAAM,KAAG,MAAM,GAAG,SAAS;CAKlD,CAAC"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.profileConfig = exports.ProfileConfigManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const constants_1 = require("./constants");
41
+ class ProfileConfigManager {
42
+ constructor(options = {}) {
43
+ const configDir = options.configDir || path.join(os.homedir(), '.slack-cli');
44
+ this.configPath = path.join(configDir, 'config.json');
45
+ }
46
+ async setToken(token, profile) {
47
+ const store = await this.getConfigStore();
48
+ const profileName = profile || store.defaultProfile || constants_1.DEFAULT_PROFILE_NAME;
49
+ const config = {
50
+ token,
51
+ updatedAt: new Date().toISOString(),
52
+ };
53
+ store.profiles[profileName] = config;
54
+ // Set as default profile if it's the first one or explicitly setting default
55
+ if (!store.defaultProfile || profileName === constants_1.DEFAULT_PROFILE_NAME) {
56
+ store.defaultProfile = profileName;
57
+ }
58
+ await this.saveConfigStore(store);
59
+ }
60
+ async getConfig(profile) {
61
+ const store = await this.getConfigStore();
62
+ const profileName = profile || store.defaultProfile || constants_1.DEFAULT_PROFILE_NAME;
63
+ return store.profiles[profileName] || null;
64
+ }
65
+ async listProfiles() {
66
+ const store = await this.getConfigStore();
67
+ const currentProfile = store.defaultProfile || constants_1.DEFAULT_PROFILE_NAME;
68
+ return Object.entries(store.profiles).map(([name, config]) => ({
69
+ name,
70
+ config,
71
+ isDefault: name === currentProfile,
72
+ }));
73
+ }
74
+ async useProfile(profile) {
75
+ const store = await this.getConfigStore();
76
+ if (!store.profiles[profile]) {
77
+ throw new Error(`Profile "${profile}" does not exist`);
78
+ }
79
+ store.defaultProfile = profile;
80
+ await this.saveConfigStore(store);
81
+ }
82
+ async getCurrentProfile() {
83
+ const store = await this.getConfigStore();
84
+ return store.defaultProfile || constants_1.DEFAULT_PROFILE_NAME;
85
+ }
86
+ async clearConfig(profile) {
87
+ const store = await this.getConfigStore();
88
+ const profileName = profile || store.defaultProfile || constants_1.DEFAULT_PROFILE_NAME;
89
+ delete store.profiles[profileName];
90
+ // If we deleted the default profile, set a new default
91
+ if (store.defaultProfile === profileName) {
92
+ const remainingProfiles = Object.keys(store.profiles);
93
+ if (remainingProfiles.length > 0) {
94
+ store.defaultProfile = remainingProfiles[0];
95
+ }
96
+ else {
97
+ // No profiles left, delete the config file
98
+ try {
99
+ await fs.unlink(this.configPath);
100
+ }
101
+ catch (error) {
102
+ if (error && typeof error === 'object' && 'code' in error && error.code !== 'ENOENT') {
103
+ throw error;
104
+ }
105
+ }
106
+ return;
107
+ }
108
+ }
109
+ await this.saveConfigStore(store);
110
+ }
111
+ maskToken(token) {
112
+ if (token.length <= constants_1.TOKEN_MIN_LENGTH) {
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}`;
118
+ }
119
+ async getConfigStore() {
120
+ try {
121
+ const data = await fs.readFile(this.configPath, 'utf-8');
122
+ const parsed = JSON.parse(data);
123
+ // Handle migration from old format
124
+ if (this.needsMigration(parsed)) {
125
+ return await this.migrateOldConfig(parsed);
126
+ }
127
+ return parsed;
128
+ }
129
+ catch (error) {
130
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
131
+ return { profiles: {} };
132
+ }
133
+ if (error instanceof SyntaxError) {
134
+ throw new Error(constants_1.ERROR_MESSAGES.INVALID_CONFIG_FORMAT);
135
+ }
136
+ throw error;
137
+ }
138
+ }
139
+ needsMigration(data) {
140
+ return data.token && !data.profiles;
141
+ }
142
+ async migrateOldConfig(oldData) {
143
+ const oldConfig = {
144
+ token: oldData.token,
145
+ updatedAt: oldData.updatedAt,
146
+ };
147
+ const newStore = {
148
+ profiles: { [constants_1.DEFAULT_PROFILE_NAME]: oldConfig },
149
+ defaultProfile: constants_1.DEFAULT_PROFILE_NAME,
150
+ };
151
+ // Save migrated config
152
+ await this.saveConfigStore(newStore);
153
+ return newStore;
154
+ }
155
+ async saveConfigStore(store) {
156
+ const configDir = path.dirname(this.configPath);
157
+ await fs.mkdir(configDir, { recursive: true });
158
+ await fs.writeFile(this.configPath, JSON.stringify(store, null, 2));
159
+ await fs.chmod(this.configPath, constants_1.FILE_PERMISSIONS.CONFIG_FILE);
160
+ }
161
+ }
162
+ exports.ProfileConfigManager = ProfileConfigManager;
163
+ exports.profileConfig = {
164
+ getCurrentProfile: () => {
165
+ return constants_1.DEFAULT_PROFILE_NAME;
166
+ },
167
+ getToken: (_profile) => {
168
+ // This is a simplified version for testing
169
+ // In real usage, it would need to be async
170
+ return undefined;
171
+ },
172
+ };
173
+ //# sourceMappingURL=profile-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-config.js","sourceRoot":"","sources":["../../src/utils/profile-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { ChatPostMessageResponse } from '@slack/web-api';
2
+ export interface Channel {
3
+ id: string;
4
+ name: string;
5
+ is_channel?: boolean;
6
+ is_group?: boolean;
7
+ is_im?: boolean;
8
+ is_mpim?: boolean;
9
+ is_private: boolean;
10
+ created: number;
11
+ is_archived?: boolean;
12
+ is_general?: boolean;
13
+ unlinked?: number;
14
+ name_normalized?: string;
15
+ is_shared?: boolean;
16
+ is_ext_shared?: boolean;
17
+ is_org_shared?: boolean;
18
+ is_member?: boolean;
19
+ num_members?: number;
20
+ unread_count?: number;
21
+ unread_count_display?: number;
22
+ last_read?: string;
23
+ topic?: {
24
+ value: string;
25
+ creator?: string;
26
+ last_set?: number;
27
+ };
28
+ purpose?: {
29
+ value: string;
30
+ creator?: string;
31
+ last_set?: number;
32
+ };
33
+ }
34
+ export interface ListChannelsOptions {
35
+ types: string;
36
+ exclude_archived: boolean;
37
+ limit: number;
38
+ }
39
+ export interface HistoryOptions {
40
+ limit: number;
41
+ oldest?: string;
42
+ }
43
+ export interface Message {
44
+ type: string;
45
+ text?: string;
46
+ user?: string;
47
+ bot_id?: string;
48
+ ts: string;
49
+ thread_ts?: string;
50
+ attachments?: unknown[];
51
+ blocks?: unknown[];
52
+ }
53
+ export interface HistoryResult {
54
+ messages: Message[];
55
+ users: Map<string, string>;
56
+ }
57
+ export interface ChannelUnreadResult {
58
+ channel: Channel;
59
+ messages: Message[];
60
+ users: Map<string, string>;
61
+ }
62
+ export declare class SlackApiClient {
63
+ private client;
64
+ constructor(token: string);
65
+ sendMessage(channel: string, text: string): Promise<ChatPostMessageResponse>;
66
+ listChannels(options: ListChannelsOptions): Promise<Channel[]>;
67
+ getHistory(channel: string, options: HistoryOptions): Promise<HistoryResult>;
68
+ listUnreadChannels(): Promise<Channel[]>;
69
+ getChannelUnread(channelNameOrId: string): Promise<ChannelUnreadResult>;
70
+ }
71
+ export declare const slackApiClient: {
72
+ listChannels: (token: string, options: ListChannelsOptions) => Promise<Channel[]>;
73
+ };
74
+ //# sourceMappingURL=slack-api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-api-client.d.ts","sourceRoot":"","sources":["../../src/utils/slack-api-client.ts"],"names":[],"mappings":"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"}