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
23 changes: 17 additions & 6 deletions scripts/vite-plugin-miniapps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { resolve, join } from 'node:path';
import { readdirSync, existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from 'node:fs';
import detectPort from 'detect-port';
import https from 'node:https';
import { getRemoteMiniappsForEcosystem } from './vite-plugin-remote-miniapps';
import { getRemoteMiniappsForEcosystem, type RemoteMiniappConfig } from './vite-plugin-remote-miniapps';
import type { WujieRuntimeConfig } from '../src/services/ecosystem/types';

// ==================== Types ====================
Expand Down Expand Up @@ -75,12 +75,13 @@ interface MiniappServer {
interface MiniappsPluginOptions {
miniappsDir?: string;
apps?: Record<string, MiniappRuntimeConfig>;
remoteMiniapps?: RemoteMiniappConfig[];
}

// ==================== Plugin ====================

export function miniappsPlugin(options: MiniappsPluginOptions = {}): Plugin {
const { miniappsDir = 'miniapps', apps = {} } = options;
const { miniappsDir = 'miniapps', apps = {}, remoteMiniapps = [] } = options;

let root: string;
let isBuild = false;
Expand All @@ -98,7 +99,7 @@ export function miniappsPlugin(options: MiniappsPluginOptions = {}): Plugin {
if (isBuild && options.dir) {
await buildAllMiniapps(root, miniappsDir, options.dir);

const ecosystem = generateEcosystemDataForBuild(root, miniappsDir, apps);
const ecosystem = generateEcosystemDataForBuild(root, miniappsDir, apps, remoteMiniapps);
const miniappsOutputDir = resolve(options.dir, 'miniapps');
mkdirSync(miniappsOutputDir, { recursive: true });
const outputPath = resolve(miniappsOutputDir, 'ecosystem.json');
Expand Down Expand Up @@ -283,6 +284,7 @@ function generateEcosystemDataForBuild(
root: string,
miniappsDir: string,
apps: Record<string, MiniappRuntimeConfig>,
remoteConfigs: RemoteMiniappConfig[],
): EcosystemJson {
const miniappsPath = resolve(root, miniappsDir);
const manifests = scanMiniapps(miniappsPath);
Expand All @@ -305,7 +307,7 @@ function generateEcosystemDataForBuild(
};
});

const remoteApps = scanRemoteMiniappsForBuild(miniappsPath);
const remoteApps = scanRemoteMiniappsForBuild(miniappsPath, remoteConfigs);

return {
name: 'Bio 官方生态',
Expand All @@ -316,10 +318,16 @@ function generateEcosystemDataForBuild(
};
}

function scanRemoteMiniappsForBuild(miniappsPath: string): Array<MiniappManifest & { url: string }> {
function scanRemoteMiniappsForBuild(
miniappsPath: string,
remoteConfigs: RemoteMiniappConfig[],
): Array<MiniappManifest & { url: string; runtime?: MiniappRuntime; wujieConfig?: WujieRuntimeConfig }> {
if (!existsSync(miniappsPath)) return [];

const remoteApps: Array<MiniappManifest & { url: string }> = [];
const configByDirName = new Map(remoteConfigs.map((c) => [c.dirName, c]));
const remoteApps: Array<
MiniappManifest & { url: string; runtime?: MiniappRuntime; wujieConfig?: WujieRuntimeConfig }
> = [];
const entries = readdirSync(miniappsPath, { withFileTypes: true });

for (const entry of entries) {
Expand All @@ -334,12 +342,15 @@ function scanRemoteMiniappsForBuild(miniappsPath: string): Array<MiniappManifest
try {
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as MiniappManifest;
const baseUrl = `./${entry.name}/`;
const config = configByDirName.get(entry.name);
remoteApps.push({
...manifest,
dirName: entry.name,
url: baseUrl,
icon: manifest.icon.startsWith('http') ? manifest.icon : new URL(manifest.icon, baseUrl).href,
screenshots: manifest.screenshots?.map((s) => (s.startsWith('http') ? s : new URL(s, baseUrl).href)) ?? [],
runtime: config?.build?.runtime ?? 'wujie',
wujieConfig: config?.build?.wujieConfig,
});
} catch {
console.warn(`[miniapps] ${entry.name}: invalid remote manifest.json, skipping`);
Expand Down
2 changes: 1 addition & 1 deletion scripts/vite-plugin-remote-miniapps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ interface MiniappBuildConfig {
injectBaseTag?: boolean | string;
}

interface RemoteMiniappConfig {
export interface RemoteMiniappConfig {
metadataUrl: string;
dirName: string;
server?: MiniappServerConfig;
Expand Down
35 changes: 19 additions & 16 deletions vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,24 @@ import { networkInterfaces } from 'node:os';
import { resolve } from 'node:path';
import { mockDevToolsPlugin } from './scripts/vite-plugin-mock-devtools';
import { miniappsPlugin } from './scripts/vite-plugin-miniapps';
import { remoteMiniappsPlugin } from './scripts/vite-plugin-remote-miniapps';
import { remoteMiniappsPlugin, type RemoteMiniappConfig } from './scripts/vite-plugin-remote-miniapps';
import { buildCheckPlugin } from './scripts/vite-plugin-build-check';

const remoteMiniappsConfig: RemoteMiniappConfig[] = [
{
metadataUrl: 'https://iweb.xin/rwahub.bfmeta.com.miniapp/metadata.json',
dirName: 'rwa-hub',
server: {
runtime: 'wujie',
wujieConfig: { rewriteAbsolutePaths: true },
},
build: {
runtime: 'wujie',
wujieConfig: { rewriteAbsolutePaths: true },
},
},
];

function getPreferredLanIPv4(): string | undefined {
const ifaces = networkInterfaces();
const ips: string[] = [];
Expand Down Expand Up @@ -93,34 +108,22 @@ export default defineConfig(({ mode }) => {
mockDevToolsPlugin(),
// 远程 miniapps (必须在 miniappsPlugin 之前,以便注册到全局状态)
remoteMiniappsPlugin({
miniapps: [
{
metadataUrl: 'https://iweb.xin/rwahub.bfmeta.com.miniapp/metadata.json',
dirName: 'rwa-hub',
server: {
runtime: 'wujie',
wujieConfig: { rewriteAbsolutePaths: true },
},
build: {
runtime: 'wujie',
wujieConfig: { rewriteAbsolutePaths: true },
},
},
],
miniapps: remoteMiniappsConfig,
timeout: 60000,
retries: 3,
}),
miniappsPlugin({
apps: {
'xin.dweb.teleport': {
server: 'iframe',
server: 'wujie',
build: 'wujie',
},
'xin.dweb.biobridge': {
server: 'wujie',
build: 'wujie',
},
},
remoteMiniapps: remoteMiniappsConfig,
}),
buildCheckPlugin(),
],
Expand Down