feat: select the TechLog Studio adapter from runtime configuration

Adds TECH_LOG_STUDIO_SOURCE (MOCK | HTTP, default MOCK) to the V2 runtime
config schema so a build can switch createTechLogFeatureInstalledInput
between the mock and HTTP Studio gateways without a rebuild. V1 documents
predate the key and always normalize to MOCK. The HTTP gateway is
constructed with only { operations } per Task 4's actual signature -
no CSRF provider is wired here; that lands with attachCredentials at a
later composition-root task.

Updates every existing Studio test call site to the new required
createTechLogFeatureInstalledInput(context) signature via a shared
tests/helpers/studio-install-context.ts MOCK fixture, so the whole
existing Studio suite keeps exercising the mock adapter unchanged.
This commit is contained in:
DongHyeonka
2026-08-18 01:57:15 +09:00
parent 7424ed4594
commit 3b641906b8
31 changed files with 169 additions and 47 deletions
+3 -2
View File
@@ -19,9 +19,10 @@ type InstalledFeatureInputs = Readonly<
>;
export function createInstalledFeatureInputs(
context: Parameters<typeof createReferenceFeatureInstalledInput>[0],
context: Parameters<typeof createReferenceFeatureInstalledInput>[0] &
Readonly<{ studioSource: "MOCK" | "HTTP" }>,
): InstalledFeatureInputs {
const techLogFeature = createTechLogFeatureInstalledInput();
const techLogFeature = createTechLogFeatureInstalledInput(context);
if (!INSTALLED_PRODUCT_FEATURE_IDS.includes(REFERENCE_FEATURE_ID)) {
// A build that narrowed the reference feature out still ships TechLog.
return Object.freeze({
@@ -2,13 +2,36 @@ import {
TECH_LOG_FEATURE_ID,
type TechLogFeatureInput,
} from "../application/tech-log-feature-input.ts";
import {
createHttpStudioGateway,
type StudioOperationExecutor,
} from "./http/http-studio-gateway.ts";
import { createMockStudioGateway } from "./mock/mock-studio-gateway.ts";
import { publicContentQueries } from "./static/public-query.ts";
export function createTechLogFeatureInstalledInput() {
/**
* The HTTP gateway builds no headers of its own — `Idempotency-Key` comes
* from the execution intent and credentials (including CSRF) come from the
* platform's `attachCredentials` collaborator at the composition root. This
* context only has to say which adapter to construct and hand it the
* composed contract executor.
*/
export type TechLogInstallContext = Readonly<{
studioSource: "MOCK" | "HTTP";
contractOperations: StudioOperationExecutor;
}>;
export function createTechLogFeatureInstalledInput(
context: TechLogInstallContext,
) {
const createStudioGateway = () =>
context.studioSource === "MOCK"
? createMockStudioGateway()
: createHttpStudioGateway({ operations: context.contractOperations });
const input: TechLogFeatureInput = Object.freeze({
publicContent: publicContentQueries,
createStudioGateway: () => createMockStudioGateway(),
createStudioGateway,
});
return Object.freeze({