@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.
Files changed (102) hide show
  1. package/dist/analyzers/__tests__/optimization-analyzer.test.d.ts +1 -0
  2. package/dist/analyzers/__tests__/optimization-analyzer.test.js +169 -0
  3. package/dist/analyzers/playable-analyzer.js +3 -2
  4. package/dist/analyzers/scene-asset-collector.js +99 -9
  5. package/dist/base-builder.d.ts +15 -78
  6. package/dist/base-builder.js +34 -735
  7. package/dist/engines/engine-detector.d.ts +38 -0
  8. package/dist/engines/engine-detector.js +201 -0
  9. package/dist/engines/generic-adapter.d.ts +71 -0
  10. package/dist/engines/generic-adapter.js +378 -0
  11. package/dist/engines/index.d.ts +7 -0
  12. package/dist/engines/index.js +7 -0
  13. package/dist/engines/playcanvas-adapter.d.ts +85 -0
  14. package/dist/engines/playcanvas-adapter.js +813 -0
  15. package/dist/generators/config-generator.js +59 -1
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.js +4 -0
  18. package/dist/loaders/playcraft-loader.js +240 -5
  19. package/dist/platforms/adikteev.d.ts +1 -1
  20. package/dist/platforms/adikteev.js +30 -34
  21. package/dist/platforms/applovin.d.ts +1 -1
  22. package/dist/platforms/applovin.js +34 -33
  23. package/dist/platforms/base.d.ts +27 -5
  24. package/dist/platforms/base.js +79 -181
  25. package/dist/platforms/bigo.d.ts +1 -1
  26. package/dist/platforms/bigo.js +28 -28
  27. package/dist/platforms/facebook.d.ts +1 -1
  28. package/dist/platforms/facebook.js +21 -10
  29. package/dist/platforms/google.d.ts +1 -1
  30. package/dist/platforms/google.js +28 -21
  31. package/dist/platforms/index.d.ts +1 -0
  32. package/dist/platforms/index.js +4 -0
  33. package/dist/platforms/inmobi.d.ts +1 -1
  34. package/dist/platforms/inmobi.js +27 -32
  35. package/dist/platforms/ironsource.d.ts +1 -1
  36. package/dist/platforms/ironsource.js +37 -37
  37. package/dist/platforms/liftoff.d.ts +1 -1
  38. package/dist/platforms/liftoff.js +24 -27
  39. package/dist/platforms/mintegral.d.ts +10 -0
  40. package/dist/platforms/mintegral.js +65 -0
  41. package/dist/platforms/moloco.d.ts +1 -1
  42. package/dist/platforms/moloco.js +18 -20
  43. package/dist/platforms/playcraft.d.ts +1 -1
  44. package/dist/platforms/playcraft.js +2 -2
  45. package/dist/platforms/remerge.d.ts +1 -1
  46. package/dist/platforms/remerge.js +19 -20
  47. package/dist/platforms/snapchat.d.ts +1 -1
  48. package/dist/platforms/snapchat.js +35 -23
  49. package/dist/platforms/tiktok.d.ts +1 -1
  50. package/dist/platforms/tiktok.js +28 -24
  51. package/dist/platforms/unity.d.ts +1 -1
  52. package/dist/platforms/unity.js +32 -32
  53. package/dist/playable-builder.d.ts +1 -0
  54. package/dist/playable-builder.js +19 -3
  55. package/dist/templates/__loading__.js +100 -0
  56. package/dist/templates/__modules__.js +47 -0
  57. package/dist/templates/__settings__.template.js +20 -0
  58. package/dist/templates/__start__.js +332 -0
  59. package/dist/templates/index.html +18 -0
  60. package/dist/templates/logo.png +0 -0
  61. package/dist/templates/manifest.json +1 -0
  62. package/dist/templates/patches/cannon.min.js +28 -0
  63. package/dist/templates/patches/lz4.js +10 -0
  64. package/dist/templates/patches/one-page-http-get.js +20 -0
  65. package/dist/templates/patches/one-page-inline-game-scripts.js +52 -0
  66. package/dist/templates/patches/one-page-mraid-resize-canvas.js +46 -0
  67. package/dist/templates/patches/p2.min.js +27 -0
  68. package/dist/templates/patches/playcraft-no-xhr.js +76 -0
  69. package/dist/templates/playcanvas-stable.min.js +16363 -0
  70. package/dist/templates/styles.css +43 -0
  71. package/dist/types.d.ts +114 -1
  72. package/dist/types.js +77 -1
  73. package/dist/utils/ammo-detector.d.ts +9 -0
  74. package/dist/utils/ammo-detector.js +76 -0
  75. package/dist/utils/build-mode-detector.js +2 -0
  76. package/dist/utils/minify.d.ts +32 -0
  77. package/dist/utils/minify.js +82 -0
  78. package/dist/vite/config-builder-generic.d.ts +70 -0
  79. package/dist/vite/config-builder-generic.js +251 -0
  80. package/dist/vite/config-builder.d.ts +8 -0
  81. package/dist/vite/config-builder.js +56 -16
  82. package/dist/vite/platform-configs.d.ts +1 -0
  83. package/dist/vite/platform-configs.js +30 -1
  84. package/dist/vite/plugin-build-state.d.ts +2 -0
  85. package/dist/vite/plugin-build-state.js +5 -3
  86. package/dist/vite/plugin-compress-js.d.ts +21 -0
  87. package/dist/vite/plugin-compress-js.js +213 -0
  88. package/dist/vite/plugin-esm-html-generator.js +15 -2
  89. package/dist/vite/plugin-platform.d.ts +5 -0
  90. package/dist/vite/plugin-platform.js +502 -36
  91. package/dist/vite/plugin-playcanvas.d.ts +1 -0
  92. package/dist/vite/plugin-playcanvas.js +181 -88
  93. package/dist/vite/plugin-source-builder.js +102 -21
  94. package/dist/vite-builder.d.ts +25 -7
  95. package/dist/vite-builder.js +141 -52
  96. package/package.json +4 -2
  97. package/physics/cannon-rigidbody-adapter.js +243 -22
  98. package/templates/__loading__.js +0 -12
  99. package/templates/index.esm.mjs +0 -11
  100. package/templates/patches/one-page-mraid-resize-canvas.js +18 -4
  101. package/templates/patches/playcraft-cta-adapter.js +129 -31
  102. package/templates/patches/scene-physics-defaults.js +49 -0
@@ -10,37 +10,55 @@ export interface ViteBuildOutput {
10
10
  *
11
11
  * 职责:
12
12
  * 1. 验证输入是有效的基础构建
13
- * 2. 创建 Vite 配置
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
- * 将 Vite 输出复制到最终目录
34
+ * 读取构建元数据
30
35
  */
31
- private copyOutputToFinalDir;
36
+ private readBuildMetadata;
32
37
  /**
33
- * 递归复制所有文件
38
+ * 验证基础构建
39
+ * 根据引擎类型使用不同的验证规则
34
40
  */
35
- private copyAllFiles;
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 validateBaseBuild;
57
+ private copyOutputToFinalDir;
58
+ /**
59
+ * 递归复制所有文件
60
+ */
61
+ private copyAllFiles;
44
62
  /**
45
63
  * 获取输出路径
46
64
  */
@@ -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. 创建 Vite 配置
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.validateBaseBuild();
35
- // 2. 创建 Vite 配置
36
- const configBuilder = new ViteConfigBuilder(this.baseBuildDir, this.options.platform, this.options);
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
- // 3. 执行 Vite 构建
39
- await viteBuild(viteConfig);
40
- // 4. 将输出从临时目录复制到最终目录
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
- // 5. 验证输出大小
90
+ // 6. 验证输出大小
47
91
  const outputPath = this.getOutputPath();
48
92
  await this.validateSize(outputPath);
49
- // 6. 生成报告
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.11",
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.33.5",
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
  }