Files
openclaw/extensions/slack/src/resolve-allowlist-common.ts
scoootscooob 8746362f5e refactor(slack): move Slack channel code to extensions/slack/src/ (#45621)
Move all Slack channel implementation files from src/slack/ to
extensions/slack/src/ and replace originals with shim re-exports.
This follows the extension migration pattern for channel plugins.

- Copy all .ts files to extensions/slack/src/ (preserving directory
  structure: monitor/, http/, monitor/events/, monitor/message-handler/)
- Transform import paths: external src/ imports use relative paths
  back to src/, internal slack imports stay relative within extension
- Replace all src/slack/ files with shim re-exports pointing to
  the extension copies
- Update tsconfig.plugin-sdk.dts.json rootDir from "src" to "." so
  the DTS build can follow shim chains into extensions/
- Update write-plugin-sdk-entry-dts.ts re-export path accordingly
- Preserve extensions/slack/index.ts, package.json, openclaw.plugin.json,
  src/channel.ts, src/runtime.ts, src/channel.test.ts (untouched)
2026-03-14 02:47:04 -07:00

69 lines
1.8 KiB
TypeScript

type SlackCursorResponse = {
response_metadata?: { next_cursor?: string };
};
function readSlackNextCursor(response: SlackCursorResponse): string | undefined {
const next = response.response_metadata?.next_cursor?.trim();
return next ? next : undefined;
}
export async function collectSlackCursorItems<
TItem,
TResponse extends SlackCursorResponse,
>(params: {
fetchPage: (cursor?: string) => Promise<TResponse>;
collectPageItems: (response: TResponse) => TItem[];
}): Promise<TItem[]> {
const items: TItem[] = [];
let cursor: string | undefined;
do {
const response = await params.fetchPage(cursor);
items.push(...params.collectPageItems(response));
cursor = readSlackNextCursor(response);
} while (cursor);
return items;
}
export function resolveSlackAllowlistEntries<
TParsed extends { id?: string },
TLookup,
TResult,
>(params: {
entries: string[];
lookup: TLookup[];
parseInput: (input: string) => TParsed;
findById: (lookup: TLookup[], id: string) => TLookup | undefined;
buildIdResolved: (params: { input: string; parsed: TParsed; match?: TLookup }) => TResult;
resolveNonId: (params: {
input: string;
parsed: TParsed;
lookup: TLookup[];
}) => TResult | undefined;
buildUnresolved: (input: string) => TResult;
}): TResult[] {
const results: TResult[] = [];
for (const input of params.entries) {
const parsed = params.parseInput(input);
if (parsed.id) {
const match = params.findById(params.lookup, parsed.id);
results.push(params.buildIdResolved({ input, parsed, match }));
continue;
}
const resolved = params.resolveNonId({
input,
parsed,
lookup: params.lookup,
});
if (resolved) {
results.push(resolved);
continue;
}
results.push(params.buildUnresolved(input));
}
return results;
}