@playcraft/build 0.0.11 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzers/__tests__/optimization-analyzer.test.d.ts +1 -0
- package/dist/analyzers/__tests__/optimization-analyzer.test.js +169 -0
- package/dist/analyzers/playable-analyzer.js +3 -2
- package/dist/analyzers/scene-asset-collector.js +99 -9
- package/dist/base-builder.d.ts +15 -78
- package/dist/base-builder.js +34 -735
- package/dist/engines/engine-detector.d.ts +38 -0
- package/dist/engines/engine-detector.js +201 -0
- package/dist/engines/generic-adapter.d.ts +71 -0
- package/dist/engines/generic-adapter.js +378 -0
- package/dist/engines/index.d.ts +7 -0
- package/dist/engines/index.js +7 -0
- package/dist/engines/playcanvas-adapter.d.ts +85 -0
- package/dist/engines/playcanvas-adapter.js +813 -0
- package/dist/generators/config-generator.js +59 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/loaders/playcraft-loader.js +240 -5
- package/dist/platforms/adikteev.d.ts +1 -1
- package/dist/platforms/adikteev.js +30 -34
- package/dist/platforms/applovin.d.ts +1 -1
- package/dist/platforms/applovin.js +34 -33
- package/dist/platforms/base.d.ts +27 -5
- package/dist/platforms/base.js +79 -181
- package/dist/platforms/bigo.d.ts +1 -1
- package/dist/platforms/bigo.js +28 -28
- package/dist/platforms/facebook.d.ts +1 -1
- package/dist/platforms/facebook.js +21 -10
- package/dist/platforms/google.d.ts +1 -1
- package/dist/platforms/google.js +28 -21
- package/dist/platforms/index.d.ts +1 -0
- package/dist/platforms/index.js +4 -0
- package/dist/platforms/inmobi.d.ts +1 -1
- package/dist/platforms/inmobi.js +27 -32
- package/dist/platforms/ironsource.d.ts +1 -1
- package/dist/platforms/ironsource.js +37 -37
- package/dist/platforms/liftoff.d.ts +1 -1
- package/dist/platforms/liftoff.js +24 -27
- package/dist/platforms/mintegral.d.ts +10 -0
- package/dist/platforms/mintegral.js +65 -0
- package/dist/platforms/moloco.d.ts +1 -1
- package/dist/platforms/moloco.js +18 -20
- package/dist/platforms/playcraft.d.ts +1 -1
- package/dist/platforms/playcraft.js +2 -2
- package/dist/platforms/remerge.d.ts +1 -1
- package/dist/platforms/remerge.js +19 -20
- package/dist/platforms/snapchat.d.ts +1 -1
- package/dist/platforms/snapchat.js +35 -23
- package/dist/platforms/tiktok.d.ts +1 -1
- package/dist/platforms/tiktok.js +28 -24
- package/dist/platforms/unity.d.ts +1 -1
- package/dist/platforms/unity.js +32 -32
- package/dist/playable-builder.d.ts +1 -0
- package/dist/playable-builder.js +19 -3
- package/dist/templates/__loading__.js +100 -0
- package/dist/templates/__modules__.js +47 -0
- package/dist/templates/__settings__.template.js +20 -0
- package/dist/templates/__start__.js +332 -0
- package/dist/templates/index.html +18 -0
- package/dist/templates/logo.png +0 -0
- package/dist/templates/manifest.json +1 -0
- package/dist/templates/patches/cannon.min.js +28 -0
- package/dist/templates/patches/lz4.js +10 -0
- package/dist/templates/patches/one-page-http-get.js +20 -0
- package/dist/templates/patches/one-page-inline-game-scripts.js +52 -0
- package/dist/templates/patches/one-page-mraid-resize-canvas.js +46 -0
- package/dist/templates/patches/p2.min.js +27 -0
- package/dist/templates/patches/playcraft-no-xhr.js +76 -0
- package/dist/templates/playcanvas-stable.min.js +16363 -0
- package/dist/templates/styles.css +43 -0
- package/dist/types.d.ts +114 -1
- package/dist/types.js +77 -1
- package/dist/utils/ammo-detector.d.ts +9 -0
- package/dist/utils/ammo-detector.js +76 -0
- package/dist/utils/build-mode-detector.js +2 -0
- package/dist/utils/minify.d.ts +32 -0
- package/dist/utils/minify.js +82 -0
- package/dist/vite/config-builder-generic.d.ts +70 -0
- package/dist/vite/config-builder-generic.js +251 -0
- package/dist/vite/config-builder.d.ts +8 -0
- package/dist/vite/config-builder.js +56 -16
- package/dist/vite/platform-configs.d.ts +1 -0
- package/dist/vite/platform-configs.js +30 -1
- package/dist/vite/plugin-build-state.d.ts +2 -0
- package/dist/vite/plugin-build-state.js +5 -3
- package/dist/vite/plugin-compress-js.d.ts +21 -0
- package/dist/vite/plugin-compress-js.js +213 -0
- package/dist/vite/plugin-esm-html-generator.js +15 -2
- package/dist/vite/plugin-platform.d.ts +5 -0
- package/dist/vite/plugin-platform.js +502 -36
- package/dist/vite/plugin-playcanvas.d.ts +1 -0
- package/dist/vite/plugin-playcanvas.js +181 -88
- package/dist/vite/plugin-source-builder.js +102 -21
- package/dist/vite-builder.d.ts +25 -7
- package/dist/vite-builder.js +141 -52
- package/package.json +4 -2
- package/physics/cannon-rigidbody-adapter.js +243 -22
- package/templates/__loading__.js +0 -12
- package/templates/index.esm.mjs +0 -11
- package/templates/patches/one-page-mraid-resize-canvas.js +18 -4
- package/templates/patches/playcraft-cta-adapter.js +129 -31
- package/templates/patches/scene-physics-defaults.js +49 -0
package/dist/vite-builder.d.ts
CHANGED
|
@@ -10,37 +10,55 @@ export interface ViteBuildOutput {
|
|
|
10
10
|
*
|
|
11
11
|
* 职责:
|
|
12
12
|
* 1. 验证输入是有效的基础构建
|
|
13
|
-
* 2.
|
|
13
|
+
* 2. 根据引擎类型创建对应的 Vite 配置
|
|
14
14
|
* 3. 执行 Vite 构建
|
|
15
15
|
* 4. 将输出复制到最终目录
|
|
16
16
|
* 5. 验证输出大小
|
|
17
17
|
* 6. 生成报告
|
|
18
|
+
*
|
|
19
|
+
* 引擎路由:
|
|
20
|
+
* - PlayCanvas:使用 ViteConfigBuilder(处理 config.json、__start__.js 等)
|
|
21
|
+
* - 其他引擎:使用 GenericViteConfigBuilder(通用 HTML 内联 + 平台 SDK 注入)
|
|
18
22
|
*/
|
|
19
23
|
export declare class ViteBuilder {
|
|
20
24
|
private baseBuildDir;
|
|
21
25
|
private options;
|
|
22
26
|
private sizeReport;
|
|
27
|
+
private engine;
|
|
23
28
|
constructor(baseBuildDir: string, options: BuildOptions);
|
|
24
29
|
/**
|
|
25
30
|
* 执行构建
|
|
26
31
|
*/
|
|
27
32
|
build(): Promise<string>;
|
|
28
33
|
/**
|
|
29
|
-
*
|
|
34
|
+
* 读取构建元数据
|
|
30
35
|
*/
|
|
31
|
-
private
|
|
36
|
+
private readBuildMetadata;
|
|
32
37
|
/**
|
|
33
|
-
*
|
|
38
|
+
* 验证基础构建
|
|
39
|
+
* 根据引擎类型使用不同的验证规则
|
|
34
40
|
*/
|
|
35
|
-
private
|
|
41
|
+
private validateBaseBuild;
|
|
42
|
+
/**
|
|
43
|
+
* 验证 PlayCanvas 构建
|
|
44
|
+
*/
|
|
45
|
+
private validatePlayCanvasBuild;
|
|
46
|
+
/**
|
|
47
|
+
* 验证通用构建(外部引擎)
|
|
48
|
+
*/
|
|
49
|
+
private validateGenericBuild;
|
|
36
50
|
/**
|
|
37
51
|
* 检测是否为 ESM 格式
|
|
38
52
|
*/
|
|
39
53
|
private detectESMFormat;
|
|
40
54
|
/**
|
|
41
|
-
*
|
|
55
|
+
* 将 Vite 输出复制到最终目录
|
|
42
56
|
*/
|
|
43
|
-
private
|
|
57
|
+
private copyOutputToFinalDir;
|
|
58
|
+
/**
|
|
59
|
+
* 递归复制所有文件
|
|
60
|
+
*/
|
|
61
|
+
private copyAllFiles;
|
|
44
62
|
/**
|
|
45
63
|
* 获取输出路径
|
|
46
64
|
*/
|
package/dist/vite-builder.js
CHANGED
|
@@ -2,20 +2,26 @@ import { build as viteBuild } from 'vite';
|
|
|
2
2
|
import fs from 'fs/promises';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { ViteConfigBuilder } from './vite/config-builder.js';
|
|
5
|
+
import { GenericViteConfigBuilder } from './vite/config-builder-generic.js';
|
|
5
6
|
import { PLATFORM_CONFIGS } from './vite/platform-configs.js';
|
|
6
7
|
/**
|
|
7
8
|
* Vite 构建器 - 使用 Vite 构建 Playable Ads
|
|
8
9
|
*
|
|
9
10
|
* 职责:
|
|
10
11
|
* 1. 验证输入是有效的基础构建
|
|
11
|
-
* 2.
|
|
12
|
+
* 2. 根据引擎类型创建对应的 Vite 配置
|
|
12
13
|
* 3. 执行 Vite 构建
|
|
13
14
|
* 4. 将输出复制到最终目录
|
|
14
15
|
* 5. 验证输出大小
|
|
15
16
|
* 6. 生成报告
|
|
17
|
+
*
|
|
18
|
+
* 引擎路由:
|
|
19
|
+
* - PlayCanvas:使用 ViteConfigBuilder(处理 config.json、__start__.js 等)
|
|
20
|
+
* - 其他引擎:使用 GenericViteConfigBuilder(通用 HTML 内联 + 平台 SDK 注入)
|
|
16
21
|
*/
|
|
17
22
|
export class ViteBuilder {
|
|
18
23
|
constructor(baseBuildDir, options) {
|
|
24
|
+
this.engine = 'playcanvas';
|
|
19
25
|
this.baseBuildDir = baseBuildDir;
|
|
20
26
|
this.options = options;
|
|
21
27
|
const platformConfig = PLATFORM_CONFIGS[options.platform];
|
|
@@ -30,26 +36,151 @@ export class ViteBuilder {
|
|
|
30
36
|
* 执行构建
|
|
31
37
|
*/
|
|
32
38
|
async build() {
|
|
33
|
-
// 1.
|
|
34
|
-
await this.
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
// 1. 读取构建元数据获取引擎类型
|
|
40
|
+
const metadata = await this.readBuildMetadata();
|
|
41
|
+
this.engine = this.options.engine ?? metadata?.engine ?? 'playcanvas';
|
|
42
|
+
console.log(`[ViteBuilder] 使用引擎: ${this.engine}`);
|
|
43
|
+
// 2. 验证输入
|
|
44
|
+
await this.validateBaseBuild(metadata);
|
|
45
|
+
// 3. 根据引擎类型创建对应的配置构建器
|
|
46
|
+
let configBuilder;
|
|
47
|
+
if (this.engine === 'playcanvas') {
|
|
48
|
+
console.log('[ViteBuilder] 使用 PlayCanvas 配置构建器');
|
|
49
|
+
configBuilder = new ViteConfigBuilder(this.baseBuildDir, this.options.platform, this.options);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log('[ViteBuilder] 使用通用配置构建器(外部引擎)');
|
|
53
|
+
configBuilder = new GenericViteConfigBuilder(this.baseBuildDir, this.options.platform, this.options, metadata);
|
|
54
|
+
}
|
|
37
55
|
const viteConfig = await configBuilder.create();
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
56
|
+
// 4. 执行 Vite 构建
|
|
57
|
+
try {
|
|
58
|
+
await viteBuild(viteConfig);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// 打印完整的 Vite/Rollup 错误信息,便于定位构建失败原因
|
|
62
|
+
console.error('[ViteBuilder] Vite 构建失败:');
|
|
63
|
+
if (error.id) {
|
|
64
|
+
console.error(` - 问题文件: ${error.id}`);
|
|
65
|
+
}
|
|
66
|
+
if (error.loc) {
|
|
67
|
+
console.error(` - 位置: 行 ${error.loc.line}, 列 ${error.loc.column}`);
|
|
68
|
+
}
|
|
69
|
+
if (error.frame) {
|
|
70
|
+
console.error(` - 代码片段:\n${error.frame}`);
|
|
71
|
+
}
|
|
72
|
+
if (error.plugin) {
|
|
73
|
+
console.error(` - 插件: ${error.plugin}`);
|
|
74
|
+
}
|
|
75
|
+
if (error.pluginCode) {
|
|
76
|
+
console.error(` - 插件错误码: ${error.pluginCode}`);
|
|
77
|
+
}
|
|
78
|
+
if (error.cause) {
|
|
79
|
+
console.error(` - 原因:`, error.cause);
|
|
80
|
+
}
|
|
81
|
+
console.error(` - 完整错误:`, error.stack || error.message || error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
// 5. 将输出从临时目录复制到最终目录
|
|
41
85
|
const viteOutputDir = configBuilder.getViteOutputDir();
|
|
42
86
|
const finalOutputDir = configBuilder.getFinalOutputDir();
|
|
43
87
|
if (viteOutputDir && finalOutputDir && viteOutputDir !== finalOutputDir) {
|
|
44
88
|
await this.copyOutputToFinalDir(viteOutputDir, finalOutputDir);
|
|
45
89
|
}
|
|
46
|
-
//
|
|
90
|
+
// 6. 验证输出大小
|
|
47
91
|
const outputPath = this.getOutputPath();
|
|
48
92
|
await this.validateSize(outputPath);
|
|
49
|
-
//
|
|
93
|
+
// 7. 生成报告
|
|
50
94
|
this.generateReport(outputPath);
|
|
51
95
|
return outputPath;
|
|
52
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* 读取构建元数据
|
|
99
|
+
*/
|
|
100
|
+
async readBuildMetadata() {
|
|
101
|
+
const metadataPath = path.join(this.baseBuildDir, '.build-metadata.json');
|
|
102
|
+
try {
|
|
103
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
104
|
+
const metadata = JSON.parse(content);
|
|
105
|
+
console.log(`[ViteBuilder] 读取构建元数据: engine=${metadata.engine}, mode=${metadata.mode}`);
|
|
106
|
+
return metadata;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.warn('[ViteBuilder] 无法读取构建元数据,假设为 PlayCanvas');
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 验证基础构建
|
|
115
|
+
* 根据引擎类型使用不同的验证规则
|
|
116
|
+
*/
|
|
117
|
+
async validateBaseBuild(metadata) {
|
|
118
|
+
const engine = this.options.engine ?? metadata?.engine ?? 'playcanvas';
|
|
119
|
+
if (engine === 'playcanvas') {
|
|
120
|
+
await this.validatePlayCanvasBuild();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await this.validateGenericBuild();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 验证 PlayCanvas 构建
|
|
128
|
+
*/
|
|
129
|
+
async validatePlayCanvasBuild() {
|
|
130
|
+
const isESM = await this.detectESMFormat();
|
|
131
|
+
const requiredFiles = isESM
|
|
132
|
+
? ['index.html', 'config.json']
|
|
133
|
+
: ['index.html', 'config.json', '__start__.js'];
|
|
134
|
+
const missingFiles = [];
|
|
135
|
+
for (const file of requiredFiles) {
|
|
136
|
+
try {
|
|
137
|
+
await fs.access(path.join(this.baseBuildDir, file));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
missingFiles.push(file);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (missingFiles.length > 0) {
|
|
144
|
+
const formatType = isESM ? 'ESM' : 'Classic';
|
|
145
|
+
throw new Error(`PlayCanvas 基础构建产物缺少必需文件: ${missingFiles.join(', ')}\n` +
|
|
146
|
+
`检测到 ${formatType} 格式,请确保输入目录包含完整的构建产物。`);
|
|
147
|
+
}
|
|
148
|
+
console.log('[ViteBuilder] PlayCanvas 构建验证通过');
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 验证通用构建(外部引擎)
|
|
152
|
+
*/
|
|
153
|
+
async validateGenericBuild() {
|
|
154
|
+
// 外部引擎只需要 index.html
|
|
155
|
+
try {
|
|
156
|
+
await fs.access(path.join(this.baseBuildDir, 'index.html'));
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
throw new Error(`外部引擎构建产物缺少 index.html\n` +
|
|
160
|
+
`构建目录: ${this.baseBuildDir}\n` +
|
|
161
|
+
`请确保 Base Build 成功生成了有效的 HTML 入口文件。`);
|
|
162
|
+
}
|
|
163
|
+
console.log('[ViteBuilder] 外部引擎构建验证通过');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 检测是否为 ESM 格式
|
|
167
|
+
*/
|
|
168
|
+
async detectESMFormat() {
|
|
169
|
+
const esmIndicators = [
|
|
170
|
+
path.join(this.baseBuildDir, 'js/index.mjs'),
|
|
171
|
+
path.join(this.baseBuildDir, 'esm-scripts'),
|
|
172
|
+
];
|
|
173
|
+
for (const indicator of esmIndicators) {
|
|
174
|
+
try {
|
|
175
|
+
await fs.access(indicator);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// 继续检查
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
53
184
|
/**
|
|
54
185
|
* 将 Vite 输出复制到最终目录
|
|
55
186
|
*/
|
|
@@ -116,48 +247,6 @@ export class ViteBuilder {
|
|
|
116
247
|
}
|
|
117
248
|
console.log(`[ViteBuilder] 已将输出复制到: ${destDir}`);
|
|
118
249
|
}
|
|
119
|
-
/**
|
|
120
|
-
* 检测是否为 ESM 格式
|
|
121
|
-
*/
|
|
122
|
-
async detectESMFormat() {
|
|
123
|
-
const esmIndicators = [
|
|
124
|
-
path.join(this.baseBuildDir, 'js/index.mjs'),
|
|
125
|
-
path.join(this.baseBuildDir, 'esm-scripts'),
|
|
126
|
-
];
|
|
127
|
-
for (const indicator of esmIndicators) {
|
|
128
|
-
try {
|
|
129
|
-
await fs.access(indicator);
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// 继续检查
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* 验证基础构建
|
|
140
|
-
*/
|
|
141
|
-
async validateBaseBuild() {
|
|
142
|
-
const isESM = await this.detectESMFormat();
|
|
143
|
-
const requiredFiles = isESM
|
|
144
|
-
? ['index.html', 'config.json']
|
|
145
|
-
: ['index.html', 'config.json', '__start__.js'];
|
|
146
|
-
const missingFiles = [];
|
|
147
|
-
for (const file of requiredFiles) {
|
|
148
|
-
try {
|
|
149
|
-
await fs.access(path.join(this.baseBuildDir, file));
|
|
150
|
-
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
missingFiles.push(file);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (missingFiles.length > 0) {
|
|
156
|
-
const formatType = isESM ? 'ESM' : 'Classic';
|
|
157
|
-
throw new Error(`基础构建产物缺少必需文件: ${missingFiles.join(', ')}\n` +
|
|
158
|
-
`检测到 ${formatType} 格式,请确保输入目录包含完整的构建产物。`);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
250
|
/**
|
|
162
251
|
* 获取输出路径
|
|
163
252
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@playcraft/build",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
"lightningcss": "^1.31.1",
|
|
40
40
|
"mime-types": "^2.1.35",
|
|
41
41
|
"rollup-plugin-visualizer": "^6.0.5",
|
|
42
|
-
"sharp": "^0.
|
|
42
|
+
"sharp": "^0.34.5",
|
|
43
|
+
"javascript-obfuscator": "^5.3.0",
|
|
43
44
|
"terser": "^5.46.0",
|
|
44
45
|
"vite": "^6.4.1",
|
|
45
46
|
"vite-plugin-singlefile": "^2.3.0"
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"@types/archiver": "^6.0.4",
|
|
49
50
|
"@types/mime-types": "^2.1.4",
|
|
50
51
|
"@types/node": "^22.19.8",
|
|
52
|
+
"fflate": "^0.8.2",
|
|
51
53
|
"typescript": "^5.9.3"
|
|
52
54
|
}
|
|
53
55
|
}
|