Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .sampo/changesets/target-bundle-purity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@mpgd/cli": minor
---

Generate target-isolated platform gateway entrypoints so production bundles include only the selected platform adapter.
5 changes: 5 additions & 0 deletions examples/phaser-starter/src/platform/buildGatewayModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
declare module '#mpgd-platform-gateway' {
export function createBuildGateway(
runtime: import('./runtimeDetector').RuntimeConfig,
): Promise<import('@mpgd/platform').PlatformGateway>;
}
11 changes: 11 additions & 0 deletions examples/phaser-starter/src/platform/buildGateways/ait.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { createAitPlatformGateway } from '@mpgd/adapter-ait';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createAitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
12 changes: 12 additions & 0 deletions examples/phaser-starter/src/platform/buildGateways/aitSandbox.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createAitPlatformGateway, createAitSandboxBridge } from '@mpgd/adapter-ait';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createAitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
fallbackBridge: createAitSandboxBridge(),
});
}
8 changes: 8 additions & 0 deletions examples/phaser-starter/src/platform/buildGateways/browser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { createBrowserPlatformGateway } from '@mpgd/adapter-browser';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(_runtime: RuntimeConfig): Promise<PlatformGateway> {
return createBrowserPlatformGateway();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createCapacitorPlatformGateway } from '@mpgd/adapter-capacitor';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createCapacitorPlatformGateway({
target: 'android',
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
12 changes: 12 additions & 0 deletions examples/phaser-starter/src/platform/buildGateways/capacitorIos.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createCapacitorPlatformGateway } from '@mpgd/adapter-capacitor';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createCapacitorPlatformGateway({
target: 'ios',
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
11 changes: 11 additions & 0 deletions examples/phaser-starter/src/platform/buildGateways/reddit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { createDevvitPlatformGateway } from '@mpgd/adapter-devvit';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createDevvitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {
createDevvitPlatformGateway,
createDevvitSandboxBridge,
} from '@mpgd/adapter-devvit';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createDevvitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
fallbackBridge: createDevvitSandboxBridge(),
});
}
61 changes: 3 additions & 58 deletions examples/phaser-starter/src/platform/installStarterPlatform.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createBuildGateway } from '#mpgd-platform-gateway';

import type { AdPlacements, ProductCatalog } from '@mpgd/catalog';
import adPlacementsJson from '@mpgd/catalog/placements.json';
import type { PlatformGateway } from '@mpgd/platform';
import productCatalogJson from '@mpgd/catalog/catalog.json';
import {
createEffectiveTargetConfig,
Expand All @@ -14,7 +15,6 @@ import targetConfigMatrixJson from '@mpgd/target-config/targets.json';

import type { RuntimeConfig } from './runtimeDetector';

const devvitSandboxBuildId = 'devvit-sandbox';
const targetConfigMatrix = targetConfigMatrixJson as TargetConfigMatrix;
const productCatalog = productCatalogJson as ProductCatalog;
const adPlacements = adPlacementsJson as AdPlacements;
Expand All @@ -29,7 +29,7 @@ const adPlacementTypes = new Map<string, 'rewarded' | 'interstitial'>(
export async function installStarterPlatform(
runtime: RuntimeConfig,
): Promise<TargetConfiguredGateway> {
const gateway = await createPlatformGateway(runtime);
const gateway = await createBuildGateway(runtime);
const configTarget = runtime.configTarget || targetConfigKeyForPlatform(runtime.target);
const targetConfig = getTargetConfig(targetConfigMatrix, configTarget);
const effectiveConfig = createEffectiveTargetConfig({
Expand All @@ -52,58 +52,3 @@ export async function installStarterPlatform(
},
});
}

async function createPlatformGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
try {
switch (runtime.target) {
case 'android':
case 'ios': {
const { createCapacitorPlatformGateway } = await import('@mpgd/adapter-capacitor');
return createCapacitorPlatformGateway({
target: runtime.target,
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}

case 'ait': {
const { createAitPlatformGateway, createAitSandboxBridge } = await import(
'@mpgd/adapter-ait'
);
return createAitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
...(runtime.debug ? { fallbackBridge: createAitSandboxBridge() } : {}),
});
}

case 'reddit': {
const { createDevvitPlatformGateway, createDevvitSandboxBridge } = await import(
'@mpgd/adapter-devvit'
);
return createDevvitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
...(shouldUseDevvitSandbox(runtime) ? { fallbackBridge: createDevvitSandboxBridge() } : {}),
});
}

default: {
const { createBrowserPlatformGateway } = await import('@mpgd/adapter-browser');
return createBrowserPlatformGateway();
}
}
} catch (error) {
throw new Error(
`Failed to initialize platform gateway for target "${runtime.target}": ${formatError(error)}`,
);
}
}

function shouldUseDevvitSandbox(runtime: RuntimeConfig): boolean {
return runtime.debug && runtime.buildId === devvitSandboxBuildId;
}

function formatError(error: unknown): string {
return error instanceof Error ? error.message : String(error);
}
33 changes: 32 additions & 1 deletion examples/phaser-starter/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ export default defineConfig(({ mode }) => {
const platformTarget = readRuntimePlatformTarget();
const appTarget = process.env.APP_TARGET ?? 'browser';
const isDevvitBuild = appTarget === 'reddit';
const buildGatewayModule = resolveBuildGatewayModule({
target: appTarget,
debug: !isProduction,
buildId: process.env.BUILD_ID ?? 'local',
});

return {
base: './',
Expand All @@ -25,7 +30,10 @@ export default defineConfig(({ mode }) => {
}),
],
resolve: {
alias: createCatalogAliases(),
alias: {
...createCatalogAliases(),
'#mpgd-platform-gateway': resolve(buildGatewayModule),
},
},
define: {
__APP_TARGET__: JSON.stringify(appTarget),
Expand Down Expand Up @@ -62,6 +70,29 @@ export default defineConfig(({ mode }) => {
};
});

export function resolveBuildGatewayModule(input: {
readonly target: string;
readonly debug: boolean;
readonly buildId: string;
}): string {
switch (input.target) {
case 'android':
return 'src/platform/buildGateways/capacitorAndroid.ts';
case 'ios':
return 'src/platform/buildGateways/capacitorIos.ts';
case 'ait':
return input.debug
? 'src/platform/buildGateways/aitSandbox.ts'
: 'src/platform/buildGateways/ait.ts';
case 'reddit':
return input.debug && input.buildId === 'devvit-sandbox'
? 'src/platform/buildGateways/redditSandbox.ts'
: 'src/platform/buildGateways/reddit.ts';
default:
return 'src/platform/buildGateways/browser.ts';
}
}

function createCatalogAliases(): Record<string, string> {
const productCatalogFile = readConfiguredPath(process.env.MPGD_PRODUCT_CATALOG_FILE);
const adPlacementsFile = readConfiguredPath(process.env.MPGD_AD_PLACEMENTS_FILE);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
declare module '#mpgd-platform-gateway' {
export function createBuildGateway(
runtime: import('./runtimeDetector').RuntimeConfig,
): Promise<import('@mpgd/platform').PlatformGateway>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { createAitPlatformGateway } from '@mpgd/adapter-ait';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createAitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createAitPlatformGateway, createAitSandboxBridge } from '@mpgd/adapter-ait';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createAitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
fallbackBridge: createAitSandboxBridge(),
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { createBrowserPlatformGateway } from '@mpgd/adapter-browser';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(_runtime: RuntimeConfig): Promise<PlatformGateway> {
return createBrowserPlatformGateway();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createCapacitorPlatformGateway } from '@mpgd/adapter-capacitor';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createCapacitorPlatformGateway({
target: 'android',
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createCapacitorPlatformGateway } from '@mpgd/adapter-capacitor';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createCapacitorPlatformGateway({
target: 'ios',
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { createDevvitPlatformGateway } from '@mpgd/adapter-devvit';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createDevvitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {
createDevvitPlatformGateway,
createDevvitSandboxBridge,
} from '@mpgd/adapter-devvit';
import type { PlatformGateway } from '@mpgd/platform';

import type { RuntimeConfig } from '../runtimeDetector';

export async function createBuildGateway(runtime: RuntimeConfig): Promise<PlatformGateway> {
return createDevvitPlatformGateway({
appVersion: runtime.appVersion,
buildId: runtime.buildId,
fallbackBridge: createDevvitSandboxBridge(),
});
}
Loading