Files
oh-my-pi-telegram/tests/public-api.test.ts
T
Evandro Fonseca Junior d1d04001d0
Release / release (push) Failing after 5s
Validate / validate (push) Failing after 5m21s
chore: fork @llblab/[email protected] as @evandrodevbr/oh-my-pi-telegram
Fork of upstream llblab/[email protected].0 (SHA afe09c5) repackaged as a
drop-in extension for can1357/oh-my-pi (omp >= 16.5.2).

Changes vs upstream:
- Rename package: @llblab/pi-telegram -> @evandrodevbr/oh-my-pi-telegram
- Bump version: 0.22.0 -> 0.22.0-evandro.1
- Update repository/homepage/bugs URLs to evandrodevbr
- Add omp field in package.json (displayName + compatibleWith)
- README: prepend 'Oh My Pi (omp) Compatibility' section with install
  commands, verified-components table, upstream lineage, and rationale
- CHANGELOG: add '0.22.0-evandro.1' entry under Unreleased
- docs/: rename @llblab/pi-telegram imports to @evandrodevbr/oh-my-pi-telegram
- tests/public-api.test.ts: rename package import paths

Gates re-run on the fork:
- npm run typecheck  -> tsc --noEmit (success)
- npm test           -> 1229 pass / 0 fail / 1 platform-only skip
- npm run audit      -> found 0 vulnerabilities
- npm run pack:check -> evandrodevbr-oh-my-pi-telegram-0.22.0-evandro.1.tgz

Verified:
- omp install --link ./pi-telegram -> Linked OK
- omp plugin list -> @evandrodevbr/[email protected].0-evandro.1

Upstream lineage: badlogic/pi-telegram -> llblab/pi-telegram (0.22.0) -> evandrodevbr/oh-my-pi-telegram (this fork)
2026-07-15 14:18:16 -03:00

113 lines
3.6 KiB
TypeScript

/**
* Regression tests for public package API exports
* Zones: package boundary, extension interop
* Guards stable public subpaths and the removal of deep lib wildcard exports
*/
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
async function assertPackagePathNotExported(specifier: string): Promise<void> {
await assert.rejects(
() => import(specifier),
(error: unknown) =>
error instanceof Error &&
"code" in error &&
error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED",
);
}
test("Public package subpaths expose the stable extension API", async () => {
const [
root,
inbound,
outbound,
delivery,
activity,
updates,
commands,
sections,
status,
voice,
keyboard,
] = await Promise.all([
import("@evandrodevbr/oh-my-pi-telegram"),
import("@evandrodevbr/oh-my-pi-telegram/inbound"),
import("@evandrodevbr/oh-my-pi-telegram/outbound"),
import("@evandrodevbr/oh-my-pi-telegram/delivery"),
import("@evandrodevbr/oh-my-pi-telegram/activity"),
import("@evandrodevbr/oh-my-pi-telegram/updates"),
import("@evandrodevbr/oh-my-pi-telegram/commands"),
import("@evandrodevbr/oh-my-pi-telegram/sections"),
import("@evandrodevbr/oh-my-pi-telegram/status"),
import("@evandrodevbr/oh-my-pi-telegram/voice"),
import("@evandrodevbr/oh-my-pi-telegram/keyboard"),
]);
assert.deepEqual(Object.keys(root), ["default"]);
assert.deepEqual(Object.keys(inbound).sort(), [
"registerTelegramInboundHandler",
]);
assert.deepEqual(Object.keys(outbound).sort(), [
"recordTelegramRuntimeEvent",
"registerTelegramOutboundHandler",
]);
assert.deepEqual(Object.keys(delivery).sort(), [
"deleteTelegramView",
"editTelegramView",
"sendTelegramChatAction",
"sendTelegramView",
]);
assert.deepEqual(Object.keys(activity).sort(), [
"registerTelegramActivityHandler",
]);
assert.deepEqual(Object.keys(updates).sort(), [
"registerTelegramUpdateHandler",
]);
assert.deepEqual(Object.keys(commands).sort(), ["registerTelegramCommand"]);
assert.deepEqual(Object.keys(sections).sort(), [
"getTelegramSectionDiagnostics",
"registerTelegramSection",
]);
assert.deepEqual(Object.keys(status).sort(), [
"registerTelegramStatusLineProvider",
]);
assert.deepEqual(Object.keys(voice).sort(), [
"TELEGRAM_VOICE_REPLY_MODES",
"computeVoicePromptContribution",
"computeVoiceTurnFlags",
"getTelegramVoiceReplyMode",
"getTelegramVoiceSendTranscript",
"isVoiceTurn",
"registerTelegramVoiceSynthesisProvider",
"registerTelegramVoiceTranscriptionProvider",
"shouldSuppressPreviewForVoice",
]);
assert.deepEqual(Object.keys(keyboard), []);
});
test("Activity API declares the Pi lifecycle compatibility floor", async () => {
const packageJson = JSON.parse(
await readFile(new URL("../package.json", import.meta.url), "utf8"),
) as { peerDependencies?: Record<string, string> };
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-coding-agent"],
">=0.80.6",
);
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-agent-core"],
">=0.80.6",
);
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-ai"],
">=0.80.6",
);
});
test("Package-private lib implementation paths are not exported", async () => {
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/lib/updates.ts");
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/lib/sections.ts");
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/api/updates.ts");
});