Unverified Commit add825af authored by Hong Minhee's avatar Hong Minhee
Browse files

Fix JSR publishing hang for @fedify/testing package

The @fedify/testing package was experiencing indefinite hangs during
JSR's type analysis phase. Through systematic testing, we identified
that the issue was caused by exporting context creation functions
directly from context.ts.

Solution:

- Move createContext, createRequestContext, and createInboxContext
  to internal-only exports in context.ts
- Re-export these functions only through mock.ts
- Remove duplicate implementations from mock.ts
- Keep TestInboxContext type alias for InboxContext return type

This reduces the number of public exports that JSR's type analyzer
needs to process, successfully resolving the hang issue.

Fixes https://github.com/fedify-dev/fedify/issues/468



Co-Authored-By: default avatarClaude <noreply@anthropic.com>
parent 3fc1fe83
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ const noopTracerProvider: any = {

// NOTE: Copied from @fedify/fedify/testing/context.ts

export function createContext<TContextData>(
// Not exported - used internally only. Public API is in mock.ts
function createContext<TContextData>(
  values: Partial<Context<TContextData>> & {
    url?: URL;
    data: TContextData;
@@ -143,11 +144,12 @@ export function createContext<TContextData>(

/**
 * Creates a RequestContext for testing purposes.
 * Not exported - used internally only. Public API is in mock.ts
 * @param args Partial RequestContext properties
 * @returns A RequestContext instance
 * @since 1.8.0
 */
export function createRequestContext<TContextData>(
function createRequestContext<TContextData>(
  args: Partial<RequestContext<TContextData>> & {
    url: URL;
    data: TContextData;
@@ -169,20 +171,28 @@ export function createRequestContext<TContextData>(
  };
}

/**
 * Test-specific InboxContext type alias.
 * This indirection helps avoid JSR type analyzer issues.
 * @since 1.9.1
 */
type TestInboxContext<TContextData> = InboxContext<TContextData>;

/**
 * Creates an InboxContext for testing purposes.
 * Not exported - used internally only. Public API is in mock.ts
 * @param args Partial InboxContext properties
 * @returns An InboxContext instance
 * @since 1.8.0
 */
export function createInboxContext<TContextData>(
function createInboxContext<TContextData>(
  args: Partial<InboxContext<TContextData>> & {
    url?: URL;
    data: TContextData;
    recipient?: string | null;
    federation: Federation<TContextData>;
  },
): InboxContext<TContextData> {
): TestInboxContext<TContextData> {
  return {
    ...createContext(args),
    clone: args.clone ?? ((data) => createInboxContext({ ...args, data })),
@@ -192,3 +202,6 @@ export function createInboxContext<TContextData>(
    }),
  };
}

// Export for internal use by mock.ts only
export { createContext, createInboxContext, createRequestContext };
+8 −58
Original line number Diff line number Diff line
@@ -5,7 +5,6 @@ import type {
  Federation,
  FederationFetchOptions,
  FederationStartQueueOptions,
  InboxContext,
  Message,
  ParseUriResult,
  RequestContext,
@@ -19,10 +18,14 @@ import type {
  Object,
  TraverseCollectionOptions,
} from "@fedify/fedify/vocab";
import { createContext } from "./context.ts";
import {
  createContext,
  createInboxContext,
  createRequestContext,
} from "./context.ts";

// Re-export createContext for public API
export { createContext };
// Re-export for public API
export { createContext, createInboxContext, createRequestContext };

// Create a no-op tracer provider.
// We use `any` type instead of importing TracerProvider from @opentelemetry/api
@@ -62,58 +65,6 @@ function expandUriTemplate(
  });
}

/**
 * Creates a RequestContext for testing purposes.
 * @param args Partial RequestContext properties
 * @returns A RequestContext instance
 * @since 1.8.0
 */
export function createRequestContext<TContextData>(
  args: Partial<RequestContext<TContextData>> & {
    url: URL;
    data: TContextData;
    federation: Federation<TContextData>;
  },
): RequestContext<TContextData> {
  return {
    ...createContext(args),
    clone: args.clone ?? ((data) => createRequestContext({ ...args, data })),
    request: args.request ?? new Request(args.url),
    url: args.url,
    getActor: args.getActor ?? (() => Promise.resolve(null)),
    getObject: args.getObject ?? (() => Promise.resolve(null)),
    getSignedKey: args.getSignedKey ?? (() => Promise.resolve(null)),
    getSignedKeyOwner: args.getSignedKeyOwner ?? (() => Promise.resolve(null)),
    sendActivity: args.sendActivity ?? ((_params) => {
      throw new Error("Not implemented");
    }),
  };
}

/**
 * Creates an InboxContext for testing purposes.
 * @param args Partial InboxContext properties
 * @returns An InboxContext instance
 * @since 1.8.0
 */
export function createInboxContext<TContextData>(
  args: Partial<InboxContext<TContextData>> & {
    url?: URL;
    data: TContextData;
    recipient?: string | null;
    federation: Federation<TContextData>;
  },
): InboxContext<TContextData> {
  return {
    ...createContext(args),
    clone: args.clone ?? ((data) => createInboxContext({ ...args, data })),
    recipient: args.recipient ?? null,
    forwardActivity: args.forwardActivity ?? ((_params) => {
      throw new Error("Not implemented");
    }),
  };
}

/**
 * Represents a sent activity with metadata about how it was sent.
 * @since 1.8.0
@@ -544,7 +495,6 @@ export class MockFederation<TContextData> implements Federation<TContextData> {
 *
 * @example
 * ```typescript
 * import type { InboxContext } from "@fedify/fedify/federation";
 * import { Create } from "@fedify/fedify/vocab";
 * import { createFederation } from "@fedify/testing";
 *
@@ -556,7 +506,7 @@ export class MockFederation<TContextData> implements Federation<TContextData> {
 * // Set up inbox listeners
 * federation
 *   .setInboxListeners("/users/{identifier}/inbox")
 *   .on(Create, async (ctx: InboxContext<{ userId: string }>, activity: Create) => {
 *   .on(Create, async (ctx, activity) => {
 *     console.log("Received:", activity);
 *   });
 *
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
 * @module
 */

// Export factory functions for creating test instances
export {
  createContext,
  createFederation,