From ccffb8bcf6574840a2575842849ac5ee21fa1199 Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Mon, 13 Jul 2026 17:10:02 +0800 Subject: [PATCH 1/5] feat(builder): migrate web-desktop platform plugin Move the web-desktop platform into the package-style layout with package metadata for builder registration. Relocate config, hooks, and type definitions under src and update public build option exports to reference the new type path. --- src/core/builder/@types/public/options.ts | 2 +- .../platforms/web-desktop/package.json | 21 ++++++++ .../platforms/web-desktop/{ => src}/config.ts | 6 +-- .../platforms/web-desktop/{ => src}/hooks.ts | 50 ++++++++----------- .../platforms/web-desktop/{ => src}/type.ts | 4 +- 5 files changed, 47 insertions(+), 36 deletions(-) create mode 100644 src/core/builder/platforms/web-desktop/package.json rename src/core/builder/platforms/web-desktop/{ => src}/config.ts (93%) rename src/core/builder/platforms/web-desktop/{ => src}/hooks.ts (69%) rename src/core/builder/platforms/web-desktop/{ => src}/type.ts (83%) diff --git a/src/core/builder/@types/public/options.ts b/src/core/builder/@types/public/options.ts index 1719151f5..db612ae1f 100644 --- a/src/core/builder/@types/public/options.ts +++ b/src/core/builder/@types/public/options.ts @@ -338,7 +338,7 @@ export interface IBuildTaskItemJSON extends ITaskItemJSON { export type IOrientation = 'auto' | 'landscape' | 'portrait'; -import { IOptions as webDesktopOptions } from '../../platforms/web-desktop/type'; +import { IOptions as webDesktopOptions } from '../../platforms/web-desktop/src/type'; export { webDesktopOptions }; import { IOptions as webMobileOptions } from '../../platforms/web-mobile/src/type'; export { webMobileOptions }; diff --git a/src/core/builder/platforms/web-desktop/package.json b/src/core/builder/platforms/web-desktop/package.json new file mode 100644 index 000000000..c7d1c35a7 --- /dev/null +++ b/src/core/builder/platforms/web-desktop/package.json @@ -0,0 +1,21 @@ +{ + "name": "web-desktop", + "version": "1.0.0", + "author": "Cocos", + "description": "Web Desktop platform plugin", + "license": "ISC", + "type": "commonjs", + "contributes": { + "builder": { + "register": true, + "platform": "web-desktop", + "config": "./src/config", + "hooks": "./src/hooks" + }, + "pinkBuilder": { + "platform": "web-desktop", + "card": "./static/card.png", + "icon": "./static/icon.png" + } + } +} diff --git a/src/core/builder/platforms/web-desktop/config.ts b/src/core/builder/platforms/web-desktop/src/config.ts similarity index 93% rename from src/core/builder/platforms/web-desktop/config.ts rename to src/core/builder/platforms/web-desktop/src/config.ts index 794a17ef3..4b789db32 100644 --- a/src/core/builder/platforms/web-desktop/config.ts +++ b/src/core/builder/platforms/web-desktop/src/config.ts @@ -1,8 +1,8 @@ 'use strict'; import { join } from 'path'; -import { IPlatformBuildPluginConfig } from '../../@types/protected'; -import { GlobalPaths } from '../../../../global'; +import { IPlatformBuildPluginConfig } from '../../../@types/protected'; +import { GlobalPaths } from '../../../../../global'; const PLATFORM = 'web-desktop'; const buildTemplateDir = join(GlobalPaths.enginePath, `templates/${PLATFORM}`); @@ -56,7 +56,7 @@ const config: IPlatformBuildPluginConfig = { }, }, }, - hooks: './hooks', + hooks: './src/hooks', textureCompressConfig: { platformType: 'web', support: { diff --git a/src/core/builder/platforms/web-desktop/hooks.ts b/src/core/builder/platforms/web-desktop/src/hooks.ts similarity index 69% rename from src/core/builder/platforms/web-desktop/hooks.ts rename to src/core/builder/platforms/web-desktop/src/hooks.ts index d87877500..84216e5d5 100644 --- a/src/core/builder/platforms/web-desktop/hooks.ts +++ b/src/core/builder/platforms/web-desktop/src/hooks.ts @@ -1,23 +1,24 @@ 'use-strict'; -import { copyFileSync, existsSync, outputFileSync } from 'fs-extra'; -import { basename, join, relative } from 'path'; +import { copyFileSync, outputFileSync } from 'fs-extra'; +import { join } from 'path'; import Ejs from 'ejs'; -import { InternalBuildResult, BuilderCache, IBuilder, IBuildTaskOption, IBuildStageTask, IInterBuildTaskOption } from '../../@types/protected'; +import { InternalBuildResult, BuilderCache, IBuilder, IBuildStageTask, IInterBuildTaskOption } from '../../../@types/protected'; import { IBuildResult } from './type'; -import { relativeUrl, transformCode } from '../../worker/builder/utils'; -import * as commonUtils from '../web-common/utils'; +import { relativeUrl, transformCode } from '../../../worker/builder/utils'; +import * as commonUtils from '../../web-common/utils'; +import { ITaskOption } from '../../native-common/type'; export const throwError = true; -export function onAfterInit(options: IInterBuildTaskOption<'web-desktop'>, result: InternalBuildResult, cache: BuilderCache) { +export function onAfterInit(options:ITaskOption, result: InternalBuildResult, cache: BuilderCache) { options.buildEngineParam.assetURLFormat = 'runtime-resolved'; if (options.server && !options.server.endsWith('/')) { options.server += '/'; } } -export function onAfterBundleInit(options: IInterBuildTaskOption<'web-desktop'>) { +export function onAfterBundleInit(options:ITaskOption) { options.buildScriptParam.system = { preset: 'web' }; const useWebGPU = options.packages['web-desktop'].useWebGPU; options.buildScriptParam.flags['WEBGPU'] = useWebGPU; @@ -31,53 +32,43 @@ export function onAfterBundleInit(options: IInterBuildTaskOption<'web-desktop'>) options.includeModules.splice(index, 1); } } -/** - * 剔除不需要参与构建的资源 - * @param options - * @param settings - */ -export async function onBeforeCompressSettings(options: IInterBuildTaskOption<'web-desktop'>, result: InternalBuildResult, cache: BuilderCache) { + +export async function onBeforeCompressSettings(options:ITaskOption, result: InternalBuildResult, cache: BuilderCache) { if (!result.paths.dir) { return; } - const settings = result.settings; - settings.screen.exactFitScreen = false; + result.settings.screen.exactFitScreen = false; } -export async function onBeforeCopyBuildTemplate(this: IBuilder, options: IInterBuildTaskOption<'web-desktop'>, result: IBuildResult) { +export async function onBeforeCopyBuildTemplate(this: IBuilder, options:ITaskOption, result: IBuildResult) { const staticDir = join(options.engineInfo.typescript.path, 'templates/web-desktop'); const packageOptions = options.packages['web-desktop']; - // 拷贝内部提供的模板文件 const cssFilePath = join(result.paths.dir, 'style.css'); options.md5CacheOptions.includes.push('style.css'); if (!this.buildTemplate.findFile('style.css')) { - // 生成 style.css copyFileSync(join(staticDir, 'style.css'), cssFilePath); } if (!this.buildTemplate.findFile('favicon.ico')) { copyFileSync(join(staticDir, 'favicon.ico'), join(result.paths.dir, 'favicon.ico')); } - // index.js 模板生成 const indexJsTemplate = this.buildTemplate.initUrl('index.js.ejs', 'indexJs') || join(staticDir, 'index.js.ejs'); const indexJsContent: string = await Ejs.renderFile(indexJsTemplate, { applicationJS: './' + relativeUrl(result.paths.dir, result.paths.applicationJS), }); - // TODO 需要优化,不应该直接读到内存里 const indexJsSourceTransformedCode = await transformCode(indexJsContent, { importMapFormat: 'systemjs', }); if (!indexJsSourceTransformedCode) { throw new Error('Cannot generate index.js'); } - const indexJsDest = join(result.paths.dir, `index.js`); + const indexJsDest = join(result.paths.dir, 'index.js'); result.paths.indexJs = indexJsDest; - options.md5CacheOptions.includes.push(`index.js`); + options.md5CacheOptions.includes.push('index.js'); outputFileSync(indexJsDest, indexJsSourceTransformedCode, 'utf8'); - // index.html 模板生成 const indexEjsTemplate = this.buildTemplate.initUrl('index.ejs') || join(staticDir, 'index.ejs'); const data = { polyfillsBundleFile: (result.paths.polyfillsJs && relativeUrl(result.paths.dir, result.paths.polyfillsJs)) || false, @@ -94,24 +85,23 @@ export async function onBeforeCopyBuildTemplate(this: IBuilder, options: IInterB const content = await Ejs.renderFile(indexEjsTemplate, data); result.paths.indexHTML = join(result.paths.dir, 'index.html'); outputFileSync(result.paths.indexHTML, content, 'utf8'); - // 入口文件排除 md5 写入 options.md5CacheOptions.replaceOnly.push('index.html'); } -export async function onAfterBuild(this: IBuilder, options: IInterBuildTaskOption<'web-desktop'>, result: InternalBuildResult) { - // 放在最后处理 url ,否则会破坏 md5 的处理 + +export async function onAfterBuild(this: IBuilder, options:ITaskOption, result: InternalBuildResult) { result.settings.plugins.jsList.forEach((url: string, i: number) => { result.settings.plugins.jsList[i] = url.split('/').map(encodeURIComponent).join('/'); }); outputFileSync(result.paths.settings, JSON.stringify(result.settings, null, options.debug ? 4 : 0)); - const previewUrl = await commonUtils.getPreviewUrl(result.paths.dir, options.platform); + const previewUrl = await commonUtils.getPreviewUrl(result.paths.dir, options.platform, options.packages['web-desktop'].useWebGPU); this.buildExitRes.custom = { previewUrl, }; } -export async function run(this: IBuildStageTask, root: string) { - const previewUrl = await commonUtils.run('web-desktop', root); +export async function run(this: IBuildStageTask, root: string, options: ITaskOption) { + const previewUrl = await commonUtils.run('web-desktop', root, options.packages['web-desktop'].useWebGPU); this.buildExitRes.custom = { previewUrl, }; -}; +} diff --git a/src/core/builder/platforms/web-desktop/type.ts b/src/core/builder/platforms/web-desktop/src/type.ts similarity index 83% rename from src/core/builder/platforms/web-desktop/type.ts rename to src/core/builder/platforms/web-desktop/src/type.ts index a57d40c72..741f1d432 100644 --- a/src/core/builder/platforms/web-desktop/type.ts +++ b/src/core/builder/platforms/web-desktop/src/type.ts @@ -1,5 +1,5 @@ -import { IBuildPaths } from '../../@types'; -import { InternalBuildResult } from '../../@types/protected'; +import { IBuildPaths } from '../../../@types'; +import { InternalBuildResult } from '../../../@types/protected'; export interface IOptions { /** * 是否使用 WEBGPU 渲染后端 From 23e1481ac10bf9b84108660f035ea77ad715f9e3 Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Mon, 13 Jul 2026 17:55:39 +0800 Subject: [PATCH 2/5] modify web-common/utils.ts to adapt to open web view --- .../builder/platforms/web-common/utils.ts | 73 ++++++++++++++++--- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/src/core/builder/platforms/web-common/utils.ts b/src/core/builder/platforms/web-common/utils.ts index 4ee6700fb..82710e535 100644 --- a/src/core/builder/platforms/web-common/utils.ts +++ b/src/core/builder/platforms/web-common/utils.ts @@ -5,8 +5,32 @@ import builderConfig from '../../share/builder-config'; import { getBuildUrlPath, registerBuildPath } from '../../build.middleware'; import { exec } from 'child_process'; +interface VSCodeApi { + Uri?: { + parse(value: string): unknown; + }; + env?: { + openExternal(uri: unknown): Promise | boolean; + }; +} -export async function getPreviewUrl(dest: string, platform?: string) { +function normalizePreviewUrl(url: string, useLocalHost?: boolean) { + if (!useLocalHost) { + return url; + } + try { + const urlObj = new URL(url); + if (urlObj.protocol === 'http:') { + urlObj.hostname = 'localhost'; + return urlObj.toString(); + } + } catch (error) { + console.warn(`Failed to normalize preview url: ${url}`); + } + return url; +} + +export async function getPreviewUrl(dest: string, platform?: string, useLocalHost?: boolean) { const rawPath = utils.Path.resolveToRaw(dest); if (!existsSync(rawPath)) { throw new Error(`Build path not found: ${dest}`); @@ -14,18 +38,18 @@ export async function getPreviewUrl(dest: string, platform?: string) { const serverService = (await import('../../../../server/server')).serverService; const buildKey = getBuildUrlPath(rawPath); if (buildKey) { - return `${serverService.url}/build/${buildKey}/index.html`; + return normalizePreviewUrl(`${serverService.url}/build/${buildKey}/index.html`, useLocalHost); } if (rawPath.startsWith(builderConfig.projectRoot) && platform) { const registerName = basename(rawPath); registerBuildPath(platform, registerName, rawPath); - return `${serverService.url}/build/${platform}/${registerName}/index.html`; + return normalizePreviewUrl(`${serverService.url}/build/${platform}/${registerName}/index.html`, useLocalHost); } const buildRoot = join(builderConfig.projectRoot, 'build'); const relativePath = relative(buildRoot, rawPath); - return serverService.url + '/build/' + relativePath + '/index.html'; + return normalizePreviewUrl(serverService.url + '/build/' + relativePath + '/index.html', useLocalHost); } /** @@ -33,6 +57,37 @@ export async function getPreviewUrl(dest: string, platform?: string) { * @param url 要打开的 URL * @param completedCallback 浏览器打开完成后的回调函数 */ +async function openExternalWithVSCode(url: string): Promise { + let vscode: VSCodeApi | undefined; + try { + vscode = require('vscode') as VSCodeApi; + } catch { + return false; + } + + if (!vscode?.Uri?.parse || !vscode.env?.openExternal) { + return false; + } + + const opened = await Promise.resolve(vscode.env.openExternal(vscode.Uri.parse(url))); + if (!opened) { + console.warn(`VS Code failed to open url: ${url}`); + } + return opened; +} + +async function openUrlWithVSCodeFallback(url: string): Promise { + console.log(`正在打开 URL: ${url}`); + if (await openExternalWithVSCode(url)) { + console.log(`正在通过 VS Code 打开: ${url}`); + return; + } + + await new Promise((resolve) => { + openBrowser(url, resolve); + }); +} + function openBrowser(url: string, completedCallback?: () => void): void { const currentPlatform = process.platform; @@ -91,18 +146,14 @@ function openBrowser(url: string, completedCallback?: () => void): void { * @returns Promise,在浏览器打开完成时 resolve */ export function openUrlAsync(url: string): Promise { - return new Promise((resolve) => { - openBrowser(url, () => { - resolve(); - }); - }); + return openUrlWithVSCodeFallback(url); } -export async function run(platform: string, dest: string) { +export async function run(platform: string, dest: string, useLocalHost?: boolean) { // if (GlobalConfig.mode === 'simple') { // throw new Error('simple mode not support run in platform ' + platform); // } - const url = await getPreviewUrl(dest, platform); + const url = await getPreviewUrl(dest, platform, useLocalHost); // 打开浏览器 try { await openUrlAsync(url); From 04cfc03f6a5973b15de9c3fe0d342456b8177883 Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Mon, 13 Jul 2026 17:56:40 +0800 Subject: [PATCH 3/5] delete IInterBuildTaskOption --- src/core/builder/platforms/web-desktop/src/hooks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/builder/platforms/web-desktop/src/hooks.ts b/src/core/builder/platforms/web-desktop/src/hooks.ts index 84216e5d5..3fa3fade5 100644 --- a/src/core/builder/platforms/web-desktop/src/hooks.ts +++ b/src/core/builder/platforms/web-desktop/src/hooks.ts @@ -3,7 +3,7 @@ import { copyFileSync, outputFileSync } from 'fs-extra'; import { join } from 'path'; import Ejs from 'ejs'; -import { InternalBuildResult, BuilderCache, IBuilder, IBuildStageTask, IInterBuildTaskOption } from '../../../@types/protected'; +import { InternalBuildResult, BuilderCache, IBuilder, IBuildStageTask } from '../../../@types/protected'; import { IBuildResult } from './type'; import { relativeUrl, transformCode } from '../../../worker/builder/utils'; import * as commonUtils from '../../web-common/utils'; From f694cdf87c05a2faf7dce2854d13c0481b9f1045 Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Tue, 14 Jul 2026 19:11:13 +0800 Subject: [PATCH 4/5] =?UTF-8?q?useWebGPU=E6=97=A0=E6=B3=95=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=80=82=E6=89=80=E4=BB=A5=E5=8E=BB=E6=8E=89=E6=AD=A4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=9A=84=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/platforms/web-common/utils.ts | 73 +++---------------- .../platforms/web-desktop/src/config.ts | 1 + .../platforms/web-desktop/src/hooks.ts | 4 +- 3 files changed, 13 insertions(+), 65 deletions(-) diff --git a/src/core/builder/platforms/web-common/utils.ts b/src/core/builder/platforms/web-common/utils.ts index 82710e535..9f0c7e99f 100644 --- a/src/core/builder/platforms/web-common/utils.ts +++ b/src/core/builder/platforms/web-common/utils.ts @@ -5,32 +5,7 @@ import builderConfig from '../../share/builder-config'; import { getBuildUrlPath, registerBuildPath } from '../../build.middleware'; import { exec } from 'child_process'; -interface VSCodeApi { - Uri?: { - parse(value: string): unknown; - }; - env?: { - openExternal(uri: unknown): Promise | boolean; - }; -} - -function normalizePreviewUrl(url: string, useLocalHost?: boolean) { - if (!useLocalHost) { - return url; - } - try { - const urlObj = new URL(url); - if (urlObj.protocol === 'http:') { - urlObj.hostname = 'localhost'; - return urlObj.toString(); - } - } catch (error) { - console.warn(`Failed to normalize preview url: ${url}`); - } - return url; -} - -export async function getPreviewUrl(dest: string, platform?: string, useLocalHost?: boolean) { +export async function getPreviewUrl(dest: string, platform?: string) { const rawPath = utils.Path.resolveToRaw(dest); if (!existsSync(rawPath)) { throw new Error(`Build path not found: ${dest}`); @@ -38,18 +13,18 @@ export async function getPreviewUrl(dest: string, platform?: string, useLocalHos const serverService = (await import('../../../../server/server')).serverService; const buildKey = getBuildUrlPath(rawPath); if (buildKey) { - return normalizePreviewUrl(`${serverService.url}/build/${buildKey}/index.html`, useLocalHost); + return `${serverService.url}/build/${buildKey}/index.html`; } if (rawPath.startsWith(builderConfig.projectRoot) && platform) { const registerName = basename(rawPath); registerBuildPath(platform, registerName, rawPath); - return normalizePreviewUrl(`${serverService.url}/build/${platform}/${registerName}/index.html`, useLocalHost); + return `${serverService.url}/build/${registerName}/index.html`; } const buildRoot = join(builderConfig.projectRoot, 'build'); const relativePath = relative(buildRoot, rawPath); - return normalizePreviewUrl(serverService.url + '/build/' + relativePath + '/index.html', useLocalHost); + return serverService.url + '/build/' + relativePath + '/index.html'; } /** @@ -57,37 +32,6 @@ export async function getPreviewUrl(dest: string, platform?: string, useLocalHos * @param url 要打开的 URL * @param completedCallback 浏览器打开完成后的回调函数 */ -async function openExternalWithVSCode(url: string): Promise { - let vscode: VSCodeApi | undefined; - try { - vscode = require('vscode') as VSCodeApi; - } catch { - return false; - } - - if (!vscode?.Uri?.parse || !vscode.env?.openExternal) { - return false; - } - - const opened = await Promise.resolve(vscode.env.openExternal(vscode.Uri.parse(url))); - if (!opened) { - console.warn(`VS Code failed to open url: ${url}`); - } - return opened; -} - -async function openUrlWithVSCodeFallback(url: string): Promise { - console.log(`正在打开 URL: ${url}`); - if (await openExternalWithVSCode(url)) { - console.log(`正在通过 VS Code 打开: ${url}`); - return; - } - - await new Promise((resolve) => { - openBrowser(url, resolve); - }); -} - function openBrowser(url: string, completedCallback?: () => void): void { const currentPlatform = process.platform; @@ -146,14 +90,17 @@ function openBrowser(url: string, completedCallback?: () => void): void { * @returns Promise,在浏览器打开完成时 resolve */ export function openUrlAsync(url: string): Promise { - return openUrlWithVSCodeFallback(url); + console.log(`正在打开 URL: ${url}`); + return new Promise((resolve) => { + openBrowser(url, resolve); + }); } -export async function run(platform: string, dest: string, useLocalHost?: boolean) { +export async function run(platform: string, dest: string) { // if (GlobalConfig.mode === 'simple') { // throw new Error('simple mode not support run in platform ' + platform); // } - const url = await getPreviewUrl(dest, platform, useLocalHost); + const url = await getPreviewUrl(dest, platform); // 打开浏览器 try { await openUrlAsync(url); diff --git a/src/core/builder/platforms/web-desktop/src/config.ts b/src/core/builder/platforms/web-desktop/src/config.ts index 4b789db32..610a22c89 100644 --- a/src/core/builder/platforms/web-desktop/src/config.ts +++ b/src/core/builder/platforms/web-desktop/src/config.ts @@ -17,6 +17,7 @@ const config: IPlatformBuildPluginConfig = { default: false, description: 'i18n:web-desktop.tips.webgpu', experiment: true, + hidden: true, }, resolution: { type: 'object', diff --git a/src/core/builder/platforms/web-desktop/src/hooks.ts b/src/core/builder/platforms/web-desktop/src/hooks.ts index 3fa3fade5..e6a9033c3 100644 --- a/src/core/builder/platforms/web-desktop/src/hooks.ts +++ b/src/core/builder/platforms/web-desktop/src/hooks.ts @@ -93,14 +93,14 @@ export async function onAfterBuild(this: IBuilder, options:ITaskOption, result: result.settings.plugins.jsList[i] = url.split('/').map(encodeURIComponent).join('/'); }); outputFileSync(result.paths.settings, JSON.stringify(result.settings, null, options.debug ? 4 : 0)); - const previewUrl = await commonUtils.getPreviewUrl(result.paths.dir, options.platform, options.packages['web-desktop'].useWebGPU); + const previewUrl = await commonUtils.getPreviewUrl(result.paths.dir, options.platform); this.buildExitRes.custom = { previewUrl, }; } export async function run(this: IBuildStageTask, root: string, options: ITaskOption) { - const previewUrl = await commonUtils.run('web-desktop', root, options.packages['web-desktop'].useWebGPU); + const previewUrl = await commonUtils.run('web-desktop', root); this.buildExitRes.custom = { previewUrl, }; From 272516a67d8608c1ad5176e62ffc781e678fd236 Mon Sep 17 00:00:00 2001 From: tangkai <1944876319@qq.com> Date: Thu, 16 Jul 2026 19:50:14 +0800 Subject: [PATCH 5/5] update snapshot --- .../__tests__/__snapshots__/dts-snapshot.test.ts.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cocos-cli-types/__tests__/__snapshots__/dts-snapshot.test.ts.snap b/packages/cocos-cli-types/__tests__/__snapshots__/dts-snapshot.test.ts.snap index 75cf7973c..af9831023 100644 --- a/packages/cocos-cli-types/__tests__/__snapshots__/dts-snapshot.test.ts.snap +++ b/packages/cocos-cli-types/__tests__/__snapshots__/dts-snapshot.test.ts.snap @@ -1930,6 +1930,7 @@ export declare interface GetManualChunkApi { export declare type GetModuleInfo = (moduleId: string) => ModuleInfo | null; export declare function getPlatformBuildSchema(platform: Platform | string): Promise; export declare function getPreviewSettings

(options?: IBuildTaskOption

): Promise; +export declare function getPreviewUrl(dest: string, platform?: string): Promise; export declare function getRegisteredPlatforms(): Promise; export declare type GlobalsOption = { [name: string]: string } | ((name: string) => string); export declare interface GltfAnimationAssetUserData {