@bitmagic/cli 0.1.83-dev.2 → 0.1.83-dev.4

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 (160) hide show
  1. package/README.md +34 -3
  2. package/assets/metahuman/src/work/metahuman/MetaHumanMaterials.ts +4 -0
  3. package/assets/metahuman/src/work/metahuman/StudioEnvironment.ts +4 -0
  4. package/assets/optimizing-assets/SKILL.md +3 -2
  5. package/assets/optimizing-assets/references/tools.md +1 -1
  6. package/dist/assets/vxl-summary.js +1 -1
  7. package/dist/assets/vxl-summary.js.map +1 -1
  8. package/dist/cli.d.ts +9 -0
  9. package/dist/commands/steam-upload.js +6 -4
  10. package/dist/commands/steam-upload.js.map +1 -1
  11. package/dist/commands/steam.js +4 -2
  12. package/dist/commands/steam.js.map +1 -1
  13. package/dist/commands/upgrade.d.ts +18 -0
  14. package/dist/commands/upgrade.js +94 -1
  15. package/dist/commands/upgrade.js.map +1 -1
  16. package/dist/config/environments.d.ts +1 -1
  17. package/dist/editor/animation-preview-page.js +20 -0
  18. package/dist/editor/animation-preview-page.js.map +1 -1
  19. package/dist/editor/asset-viewer.js +4 -0
  20. package/dist/editor/asset-viewer.js.map +1 -1
  21. package/dist/editor/design.d.ts +2 -2
  22. package/dist/editor/design.js +2 -2
  23. package/dist/editor/design.js.map +1 -1
  24. package/dist/editor/hud-replay-page.js +5 -0
  25. package/dist/editor/hud-replay-page.js.map +1 -1
  26. package/dist/editor/recording-sink.js +1 -1
  27. package/dist/editor/runtime-token.d.ts +61 -0
  28. package/dist/editor/runtime-token.js +74 -0
  29. package/dist/editor/runtime-token.js.map +1 -0
  30. package/dist/editor/save.d.ts +2 -2
  31. package/dist/editor/server.js +39 -12
  32. package/dist/editor/server.js.map +1 -1
  33. package/dist/editor/shell-page.d.ts +12 -8
  34. package/dist/editor/shell-page.js +69 -10
  35. package/dist/editor/shell-page.js.map +1 -1
  36. package/dist/forge/browser-host.d.ts +1 -1
  37. package/dist/forge/browser-host.js +14 -11
  38. package/dist/forge/browser-host.js.map +1 -1
  39. package/dist/generate/model.js +4 -1
  40. package/dist/generate/model.js.map +1 -1
  41. package/dist/generate/prop.js +4 -1
  42. package/dist/generate/prop.js.map +1 -1
  43. package/dist/http/signed-upload.d.ts +6 -4
  44. package/dist/http/signed-upload.js +37 -14
  45. package/dist/http/signed-upload.js.map +1 -1
  46. package/dist/mobile/rewrite-shim.js +1 -1
  47. package/dist/project/published-three.js +4 -6
  48. package/dist/project/published-three.js.map +1 -1
  49. package/dist/publish/game-exchange.js +9 -3
  50. package/dist/publish/game-exchange.js.map +1 -1
  51. package/dist/scaffold/blender-level-skill-files.js +2 -2
  52. package/dist/scaffold/game-migration.d.ts +88 -0
  53. package/dist/scaffold/game-migration.js +492 -0
  54. package/dist/scaffold/game-migration.js.map +1 -0
  55. package/dist/scaffold/import-codemod.d.ts +51 -0
  56. package/dist/scaffold/import-codemod.js +117 -0
  57. package/dist/scaffold/import-codemod.js.map +1 -0
  58. package/dist/scaffold/legacy-game-baselines.d.ts +14 -0
  59. package/dist/scaffold/legacy-game-baselines.js +218 -0
  60. package/dist/scaffold/legacy-game-baselines.js.map +1 -0
  61. package/dist/scaffold/project-files.d.ts +1 -1
  62. package/dist/scaffold/project-files.js +13 -47
  63. package/dist/scaffold/project-files.js.map +1 -1
  64. package/dist/scaffold/project.js +8 -17
  65. package/dist/scaffold/project.js.map +1 -1
  66. package/dist/smoke/run.js +8 -1
  67. package/dist/smoke/run.js.map +1 -1
  68. package/dist/steam/art-generate.js +2 -1
  69. package/dist/steam/art-generate.js.map +1 -1
  70. package/dist/steam/art-render.js.map +1 -1
  71. package/dist/steam/art.js +1 -1
  72. package/dist/steam/art.js.map +1 -1
  73. package/dist/steam/check.js.map +1 -1
  74. package/dist/steam/electron-cache.d.ts +1 -1
  75. package/dist/steam/electron-cache.js +2 -2
  76. package/dist/steam/electron-cache.js.map +1 -1
  77. package/dist/steam/fuses.js +1 -1
  78. package/dist/steam/fuses.js.map +1 -1
  79. package/dist/steam/media.js +6 -2
  80. package/dist/steam/media.js.map +1 -1
  81. package/dist/steam/package-windows.d.ts +1 -2
  82. package/dist/steam/package-windows.js +1 -2
  83. package/dist/steam/package-windows.js.map +1 -1
  84. package/dist/steam/paths.d.ts +0 -2
  85. package/dist/steam/paths.js +0 -1
  86. package/dist/steam/paths.js.map +1 -1
  87. package/dist/steam/portal.js +1 -1
  88. package/dist/steam/portal.js.map +1 -1
  89. package/dist/steam/raster.d.ts +0 -1
  90. package/dist/steam/raster.js +1 -1
  91. package/dist/steam/raster.js.map +1 -1
  92. package/dist/steam/store-copy.d.ts +0 -1
  93. package/dist/steam/store-copy.js +3 -10
  94. package/dist/steam/store-copy.js.map +1 -1
  95. package/dist/steam/tags.js +6 -3
  96. package/dist/steam/tags.js.map +1 -1
  97. package/dist/theme/kernel.d.ts +14 -0
  98. package/dist/theme/kernel.js +15 -0
  99. package/dist/theme/kernel.js.map +1 -0
  100. package/dist/theme/theme-io.js +11 -16
  101. package/dist/theme/theme-io.js.map +1 -1
  102. package/dist/trailer/record-session.d.ts +1 -1
  103. package/dist/trailer/record-session.js +5 -8
  104. package/dist/trailer/record-session.js.map +1 -1
  105. package/dist/trailer/vendored-recorder.d.ts +8 -0
  106. package/dist/trailer/vendored-recorder.js +26 -0
  107. package/dist/trailer/vendored-recorder.js.map +1 -0
  108. package/dist/vendor/hud-theme/catalog.js +71 -0
  109. package/dist/vendor/hud-theme/engine/hud/ThemeTokens.js +115 -0
  110. package/dist/{theme/theme-color-math.js → vendor/hud-theme/engine/hud/colorMath.js} +13 -14
  111. package/dist/vendor/hud-theme/engine/hud/decorations.js +179 -0
  112. package/dist/vendor/hud-theme/engine/hud/fonts.js +147 -0
  113. package/dist/vendor/hud-theme/engine/hud/presets.js +80 -0
  114. package/dist/vendor/hud-theme/engine/hud/resolveWorldTheme.js +66 -0
  115. package/dist/vendor/hud-theme/engine/hud/themes/bitmagic.js +29 -0
  116. package/dist/vendor/hud-theme/engine/hud/themes/nexus.js +69 -0
  117. package/dist/vendor/hud-theme/engine/hud/themes/racing.js +57 -0
  118. package/dist/vendor/hud-theme/engine/hud/themes/rift-raider.js +63 -0
  119. package/dist/vendor/hud-theme/engine/hud/themes/simulator.js +55 -0
  120. package/dist/vendor/hud-theme/engine/hud/themes/village-keep.js +108 -0
  121. package/dist/vendor/hud-theme/engine/hud/validateTheme.js +535 -0
  122. package/dist/vendor/hud-theme/index.js +26 -0
  123. package/dist/{theme/theme-merge.js → vendor/hud-theme/merge.js} +0 -1
  124. package/dist/{theme/theme-report.js → vendor/hud-theme/report.js} +8 -9
  125. package/dist/{theme/theme-stored.js → vendor/hud-theme/stored.js} +6 -9
  126. package/dist/{theme/theme-validate.js → vendor/hud-theme/validate-strict.js} +102 -164
  127. package/dist/verify/browser.d.ts +6 -0
  128. package/dist/verify/browser.js +30 -3
  129. package/dist/verify/browser.js.map +1 -1
  130. package/dist/verify/categories.d.ts +1 -1
  131. package/dist/verify/categories.js +1 -0
  132. package/dist/verify/categories.js.map +1 -1
  133. package/dist/verify/classify.d.ts +7 -0
  134. package/dist/verify/classify.js +7 -0
  135. package/dist/verify/classify.js.map +1 -1
  136. package/dist/verify/hud-theme.d.ts +19 -14
  137. package/dist/verify/hud-theme.js +23 -17
  138. package/dist/verify/hud-theme.js.map +1 -1
  139. package/dist/verify/mobile-parity.d.ts +1 -1
  140. package/dist/verify/mobile-parity.js +1 -1
  141. package/dist/verify/model-downloads.d.ts +47 -0
  142. package/dist/verify/model-downloads.js +127 -0
  143. package/dist/verify/model-downloads.js.map +1 -0
  144. package/dist/verify/start.d.ts +3 -2
  145. package/dist/verify/start.js +1 -1
  146. package/dist/verify/start.js.map +1 -1
  147. package/package.json +11 -7
  148. package/dist/theme/hud-theme-catalog.d.ts +0 -235
  149. package/dist/theme/hud-theme-catalog.js +0 -389
  150. package/dist/theme/hud-theme-catalog.js.map +0 -1
  151. package/dist/theme/theme-color-math.d.ts +0 -21
  152. package/dist/theme/theme-color-math.js.map +0 -1
  153. package/dist/theme/theme-merge.d.ts +0 -36
  154. package/dist/theme/theme-merge.js.map +0 -1
  155. package/dist/theme/theme-report.d.ts +0 -28
  156. package/dist/theme/theme-report.js.map +0 -1
  157. package/dist/theme/theme-stored.d.ts +0 -21
  158. package/dist/theme/theme-stored.js.map +0 -1
  159. package/dist/theme/theme-validate.d.ts +0 -41
  160. package/dist/theme/theme-validate.js.map +0 -1
@@ -0,0 +1,492 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { createHash } from 'crypto';
4
+ import { LEGACY_GAME_BODIES, LEGACY_GAME_MEMBERS } from './legacy-game-baselines.js';
5
+ /**
6
+ * `bitmagic upgrade --migrate-game`: turn a Game.ts written on the old baseline — a whole
7
+ * `class VoxelGame implements GameModule` that built its own Spawner, VehicleManager,
8
+ * VehicleSpawner and PlayerLoader and handed them to the engine with `setX()` — into the small
9
+ * `class VoxelGame extends VoxelGameBase` every game is now, keeping only what the creator changed.
10
+ *
11
+ * It only rewrites what it can prove:
12
+ *
13
+ * - a member identical (token for token, comments and layout ignored) to the same member in any
14
+ * released baseline is the default, and is dropped;
15
+ * - `constructor`, `load`, `update` and `dispose` may additionally carry the creator's own
16
+ * statements, but only inserted at a point a VoxelGameBase hook runs at — after the world
17
+ * (`onWorldLoaded`), after the camera (`onCameraReady`), after the player controller
18
+ * (`onPlayerReady`), at the end of a frame (`updateCamera`), beside the vehicles' disposal
19
+ * (`disposeGameplay`), or at the very start or end of the method — and each default statement
20
+ * must still be there, in order;
21
+ * - a modified `setupCamera` or `setupVoxelLighting` stays as an override (both are hooks now);
22
+ * - anything the creator added (fields, methods, top-level code) is kept as it is, with
23
+ * `this.spawner` / `this.vehicleSpawner` read through `getSpawner()` / `getVehicleSpawner()`.
24
+ *
25
+ * Anything else — a default statement removed or edited, a statement added where no hook runs,
26
+ * a changed member VoxelGameBase also declares — leaves the file unchanged and says why. The
27
+ * result is then type-checked with the project's own compiler and put back if it does not
28
+ * compile, so a migration that runs is one that compiles.
29
+ */
30
+ export const GAME_FILE = 'src/work/Game.ts';
31
+ export const BASE_FILE = 'src/work/VoxelGameBase.ts';
32
+ /** The new baseline, as the engine just vendored it. */
33
+ export const VENDORED_BASELINE_DIR = 'engine/baseline';
34
+ export const SEGMENTED_METHODS = ['constructor', 'load', 'update', 'dispose'];
35
+ /** Changed methods that are hooks now, kept as `protected` overrides. */
36
+ const HOOK_METHODS = new Set(['setupCamera', 'setupVoxelLighting']);
37
+ /** The text a node's tokens make, single-spaced: comments and layout never count. */
38
+ function tokenText(ts, node, sf) {
39
+ const tokens = [];
40
+ const walk = (n) => {
41
+ const children = n.getChildren(sf);
42
+ if (children.length === 0) {
43
+ // An empty syntax list (no arguments, no modifiers) is a leaf with no text.
44
+ const text = n.kind === ts.SyntaxKind.EndOfFileToken ? '' : n.getText(sf);
45
+ if (text.length > 0)
46
+ tokens.push(text);
47
+ return;
48
+ }
49
+ for (const child of children)
50
+ walk(child);
51
+ };
52
+ walk(node);
53
+ return tokens.join(' ');
54
+ }
55
+ /** A statement or member compared by its tokens alone, so comments and layout never matter. */
56
+ export function fingerprint(ts, node, sf) {
57
+ return createHash('sha1').update(tokenText(ts, node, sf)).digest('hex').slice(0, 16);
58
+ }
59
+ function memberName(ts, member, sf) {
60
+ if (ts.isConstructorDeclaration(member))
61
+ return 'constructor';
62
+ if (!member.name)
63
+ return null;
64
+ const name = member.name.getText(sf);
65
+ if (ts.isGetAccessorDeclaration(member))
66
+ return `get ${name}`;
67
+ if (ts.isSetAccessorDeclaration(member))
68
+ return `set ${name}`;
69
+ return name;
70
+ }
71
+ function findGameClass(ts, sf) {
72
+ for (const statement of sf.statements) {
73
+ if (ts.isClassDeclaration(statement) && statement.name?.text === 'VoxelGame')
74
+ return statement;
75
+ }
76
+ return null;
77
+ }
78
+ /** The statements a segmented body is compared on: a `load` wrapped in try/catch is its try block. */
79
+ function bodyStatements(ts, method) {
80
+ const body = (ts.isConstructorDeclaration(method) || ts.isMethodDeclaration(method)) ? method.body : undefined;
81
+ if (!body)
82
+ return null;
83
+ const only = body.statements.length === 1 ? body.statements[0] : undefined;
84
+ if (only && ts.isTryStatement(only) && only.catchClause && !only.finallyBlock) {
85
+ return { statements: only.tryBlock.statements, catchClause: only.catchClause };
86
+ }
87
+ return { statements: body.statements, catchClause: null };
88
+ }
89
+ /** The named gaps of a default body: where a hook (or the method's own start/end) runs. */
90
+ function anchorsFor(method, texts) {
91
+ const at = (pred) => texts.findIndex(pred);
92
+ const anchors = { start: 0, end: texts.length };
93
+ if (method === 'constructor')
94
+ delete anchors.start;
95
+ if (method === 'load') {
96
+ delete anchors.start;
97
+ const player = at((t) => t.startsWith('this . playerLoader . prefetchPlayerAnimations') || t.startsWith('this . player = await this . playerLoader . loadPlayer'));
98
+ if (player >= 0)
99
+ anchors.onWorldLoaded = player;
100
+ const camera = at((t) => t === 'this . setupCamera ( ) ;');
101
+ if (camera >= 0)
102
+ anchors.onCameraReady = camera + 1;
103
+ const controller = at((t) => t === 'await this . setupPlayerController ( ) ;');
104
+ if (controller >= 0)
105
+ anchors.onPlayerReady = controller + 1;
106
+ }
107
+ if (method === 'dispose') {
108
+ const vehicles = at((t) => t === 'this . vehicleManager . dispose ( ) ;');
109
+ if (vehicles >= 0)
110
+ anchors.disposeGameplay = vehicles + 1;
111
+ }
112
+ return anchors;
113
+ }
114
+ /**
115
+ * The fingerprints of a pre-VoxelGameBase Game.ts — every member, plus the statement list and
116
+ * hook gaps of each segmented method. Null when the file has no such class. Run over every
117
+ * released baseline by `scripts/gen-legacy-game-baselines.mjs` to produce the known defaults.
118
+ */
119
+ export function describeLegacyGame(ts, text) {
120
+ const sf = ts.createSourceFile('Game.ts', text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
121
+ const cls = findGameClass(ts, sf);
122
+ if (!cls || extendsClause(ts, cls))
123
+ return null;
124
+ const shape = { members: {}, bodies: {} };
125
+ for (const member of cls.members) {
126
+ const name = memberName(ts, member, sf);
127
+ if (name === null)
128
+ continue;
129
+ shape.members[name] = fingerprint(ts, member, sf);
130
+ if (SEGMENTED_METHODS.includes(name)) {
131
+ const body = bodyStatements(ts, member);
132
+ if (!body)
133
+ continue;
134
+ const texts = body.statements.map((s) => tokenText(ts, s, sf));
135
+ shape.bodies[name] = {
136
+ statements: body.statements.map((s) => fingerprint(ts, s, sf)),
137
+ ...(body.catchClause ? { catchClause: fingerprint(ts, body.catchClause, sf) } : {}),
138
+ anchors: anchorsFor(name, texts),
139
+ };
140
+ }
141
+ }
142
+ return shape;
143
+ }
144
+ function extendsClause(ts, cls) {
145
+ for (const clause of cls.heritageClauses ?? []) {
146
+ if (clause.token === ts.SyntaxKind.ExtendsKeyword)
147
+ return clause.types[0] ?? null;
148
+ }
149
+ return null;
150
+ }
151
+ function matchBody(ts, sf, method, statements, catchClause, version) {
152
+ const catchFp = catchClause ? fingerprint(ts, catchClause, sf) : undefined;
153
+ if (catchFp !== version.catchClause) {
154
+ return { ok: false, matched: 0, reason: `${method}() handles its errors differently from the baseline` };
155
+ }
156
+ const gaps = new Map();
157
+ let j = 0;
158
+ for (const statement of statements) {
159
+ if (j < version.statements.length && fingerprint(ts, statement, sf) === version.statements[j]) {
160
+ j++;
161
+ continue;
162
+ }
163
+ const list = gaps.get(j) ?? [];
164
+ list.push(statement);
165
+ gaps.set(j, list);
166
+ }
167
+ if (j < version.statements.length) {
168
+ return { ok: false, matched: j, reason: `${method}() no longer runs every statement the baseline's does (one was edited or removed)` };
169
+ }
170
+ const anchorAt = new Map(Object.entries(version.anchors).map(([name, gap]) => [gap, name]));
171
+ const byAnchor = new Map();
172
+ for (const [gap, added] of gaps) {
173
+ const anchor = anchorAt.get(gap);
174
+ if (anchor === undefined) {
175
+ const first = added[0];
176
+ const preview = first ? tokenText(ts, first, sf).slice(0, 60) : '';
177
+ return { ok: false, matched: j, reason: `${method}() has code added where no VoxelGameBase hook runs (\`${preview}\`)` };
178
+ }
179
+ byAnchor.set(anchor, added);
180
+ }
181
+ return { ok: true, insertions: { byAnchor } };
182
+ }
183
+ // ── Output ─────────────────────────────────────────────────────────────────────────────
184
+ const MEMBER_INDENT = ' ';
185
+ const BODY_INDENT = ' ';
186
+ /** A text block with its blank edges trimmed and its common indentation replaced by `indent`. */
187
+ function reindentText(text, indent) {
188
+ const lines = text.replace(/^\s*\n/, '').replace(/\s+$/, '').split('\n');
189
+ const widths = lines.filter((l) => l.trim().length > 0).map((l) => /^[ \t]*/.exec(l)?.[0].length ?? 0);
190
+ const strip = widths.length > 0 ? Math.min(...widths) : 0;
191
+ return lines.map((l) => (l.trim().length === 0 ? '' : indent + l.slice(strip))).join('\n');
192
+ }
193
+ /**
194
+ * A node's text with its leading comments, re-indented, with `this.spawner` /
195
+ * `this.vehicleSpawner` read through the getters VoxelGameBase keeps (the fields are gone: the
196
+ * engine owns both now) and a `private` modifier made `protected` when asked. Null when the node
197
+ * assigns one of those fields, which no rewrite can keep working.
198
+ */
199
+ function nodeText(ts, sf, node, indent, makeProtected = false) {
200
+ const offset = node.getFullStart();
201
+ const edits = [];
202
+ let assigned = false;
203
+ const visit = (n) => {
204
+ if (ts.isPropertyAccessExpression(n) && n.expression.kind === ts.SyntaxKind.ThisKeyword
205
+ && (n.name.text === 'spawner' || n.name.text === 'vehicleSpawner')) {
206
+ const parent = n.parent;
207
+ if (ts.isBinaryExpression(parent) && parent.left === n && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken)
208
+ assigned = true;
209
+ const getter = n.name.text === 'spawner' ? 'getSpawner' : 'getVehicleSpawner';
210
+ edits.push({ start: n.getStart(sf) - offset, end: n.end - offset, text: `this.${getter}()` });
211
+ }
212
+ ts.forEachChild(n, visit);
213
+ };
214
+ visit(node);
215
+ if (assigned)
216
+ return null;
217
+ if (makeProtected && ts.canHaveModifiers(node)) {
218
+ const modifier = ts.getModifiers(node)?.find((m) => m.kind === ts.SyntaxKind.PrivateKeyword);
219
+ if (modifier)
220
+ edits.push({ start: modifier.getStart(sf) - offset, end: modifier.end - offset, text: 'protected' });
221
+ }
222
+ let text = sf.text.slice(offset, node.end);
223
+ for (const e of edits.sort((x, y) => y.start - x.start))
224
+ text = text.slice(0, e.start) + e.text + text.slice(e.end);
225
+ return reindentText(text, indent);
226
+ }
227
+ function statementsText(ts, sf, statements, indent) {
228
+ const parts = [];
229
+ for (const statement of statements) {
230
+ const text = nodeText(ts, sf, statement, indent);
231
+ if (text === null)
232
+ return null;
233
+ parts.push(text);
234
+ }
235
+ return parts.join('\n');
236
+ }
237
+ /** The hook override a set of insertions becomes: its name and its signature, and whether the creator's code runs before `super`. */
238
+ function hookFor(method, anchor, param) {
239
+ switch (`${method}:${anchor}`) {
240
+ case 'load:onWorldLoaded':
241
+ return { name: 'onWorldLoaded', signature: 'protected onWorldLoaded(): void', superCall: 'super.onWorldLoaded();', before: false };
242
+ case 'load:onCameraReady':
243
+ return { name: 'onCameraReady', signature: 'protected onCameraReady(): void', superCall: 'super.onCameraReady();', before: false };
244
+ case 'load:onPlayerReady':
245
+ return { name: 'onPlayerReady', signature: 'protected onPlayerReady(): void', superCall: 'super.onPlayerReady();', before: false };
246
+ case 'load:end':
247
+ return { name: 'load', signature: `async load(${param}: string): Promise<void>`, superCall: `await super.load(${param});`, before: false };
248
+ case 'update:start':
249
+ return { name: 'update', signature: `update(${param}: number): void`, superCall: `super.update(${param});`, before: true };
250
+ case 'update:end':
251
+ return { name: 'updateCamera', signature: `protected updateCamera(${param}: number): void`, superCall: `super.updateCamera(${param});`, before: false };
252
+ case 'dispose:start':
253
+ return { name: 'dispose', signature: 'dispose(): void', superCall: 'super.dispose();', before: true };
254
+ case 'dispose:disposeGameplay':
255
+ return { name: 'disposeGameplay', signature: 'protected disposeGameplay(): void', superCall: 'super.disposeGameplay();', before: false };
256
+ case 'dispose:end':
257
+ return { name: 'dispose', signature: 'dispose(): void', superCall: 'super.dispose();', before: false };
258
+ default:
259
+ throw new Error(`no hook for ${method}:${anchor}`);
260
+ }
261
+ }
262
+ /** The names a class declares, read from the vendored VoxelGameBase. */
263
+ function baseMemberNames(ts, baseText) {
264
+ const sf = ts.createSourceFile('VoxelGameBase.ts', baseText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
265
+ const names = new Set();
266
+ for (const statement of sf.statements) {
267
+ if (!ts.isClassDeclaration(statement) || statement.name?.text !== 'VoxelGameBase')
268
+ continue;
269
+ for (const member of statement.members) {
270
+ const name = memberName(ts, member, sf);
271
+ if (name !== null)
272
+ names.add(name.replace(/^(get|set) /, ''));
273
+ }
274
+ }
275
+ return names;
276
+ }
277
+ /** Every identifier in a text, for pruning imports the new file no longer uses. */
278
+ function identifiersIn(ts, text) {
279
+ const sf = ts.createSourceFile('x.ts', text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
280
+ const out = new Set();
281
+ const visit = (n) => {
282
+ if (ts.isIdentifier(n))
283
+ out.add(n.text);
284
+ ts.forEachChild(n, visit);
285
+ };
286
+ visit(sf);
287
+ return out;
288
+ }
289
+ /** An import declaration with only the bindings `used` names, or null when none are left. */
290
+ function prunedImport(ts, sf, decl, used) {
291
+ const clause = decl.importClause;
292
+ if (!clause)
293
+ return decl.getText(sf); // a side-effect import is always kept
294
+ const keepDefault = clause.name !== undefined && used.has(clause.name.text);
295
+ const bindings = clause.namedBindings;
296
+ let named = null;
297
+ if (bindings && ts.isNamespaceImport(bindings)) {
298
+ named = used.has(bindings.name.text) ? bindings.getText(sf) : null;
299
+ }
300
+ else if (bindings && ts.isNamedImports(bindings)) {
301
+ const kept = bindings.elements.filter((e) => used.has(e.name.text)).map((e) => e.getText(sf));
302
+ named = kept.length > 0 ? `{ ${kept.join(', ')} }` : null;
303
+ }
304
+ if (!keepDefault && named === null)
305
+ return null;
306
+ if (keepDefault && named === null && bindings === undefined)
307
+ return decl.getText(sf);
308
+ const parts = [keepDefault && clause.name ? clause.name.text : null, named].filter((p) => p !== null);
309
+ const typeOnly = clause.isTypeOnly ? 'type ' : '';
310
+ return `import ${typeOnly}${parts.join(', ')} from ${decl.moduleSpecifier.getText(sf)};`;
311
+ }
312
+ const ASSIGNS_ENGINE_FIELD = 'assigns this.spawner or this.vehicleSpawner, which the engine owns now';
313
+ /**
314
+ * Plan the rewrite of one Game.ts against the new baseline: pure, reads nothing but its inputs.
315
+ *
316
+ * `newBaselineGame` is the vendored `engine/baseline/Game.ts` (the file a game with nothing of
317
+ * its own becomes, verbatim), `newBaseText` the vendored `VoxelGameBase.ts`.
318
+ */
319
+ export function planGameMigration(ts, oldText, newBaselineGame, newBaseText) {
320
+ const skip = (reason) => ({ outcome: { status: 'skipped', reason } });
321
+ const sf = ts.createSourceFile('Game.ts', oldText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
322
+ const cls = findGameClass(ts, sf);
323
+ if (!cls)
324
+ return skip('Game.ts has no `VoxelGame` class');
325
+ const heritage = extendsClause(ts, cls);
326
+ if (heritage) {
327
+ return heritage.expression.getText(sf) === 'VoxelGameBase'
328
+ ? { outcome: { status: 'already-migrated' } }
329
+ : skip(`VoxelGame extends ${heritage.expression.getText(sf)}, not the old baseline's class`);
330
+ }
331
+ const baseNames = baseMemberNames(ts, newBaseText);
332
+ if (baseNames.size === 0)
333
+ return skip('the vendored engine/baseline/VoxelGameBase.ts declares no VoxelGameBase class');
334
+ const fields = [];
335
+ const methods = [];
336
+ const kept = [];
337
+ const overrides = new Map();
338
+ let constructorTail = null;
339
+ for (const member of cls.members) {
340
+ const name = memberName(ts, member, sf);
341
+ if (name === null)
342
+ return skip('Game.ts has a class member this migration cannot name');
343
+ if (LEGACY_GAME_MEMBERS[name]?.includes(fingerprint(ts, member, sf)))
344
+ continue; // the default: VoxelGameBase has it
345
+ if (SEGMENTED_METHODS.includes(name)) {
346
+ const method = name;
347
+ const body = bodyStatements(ts, member);
348
+ if (!body)
349
+ return skip(`${method}() has no body to compare`);
350
+ let best = null;
351
+ for (const version of LEGACY_GAME_BODIES[method]) {
352
+ const match = matchBody(ts, sf, method, body.statements, body.catchClause, version);
353
+ if (match.ok) {
354
+ best = match;
355
+ break;
356
+ }
357
+ if (!best || (!best.ok && match.matched > best.matched))
358
+ best = match;
359
+ }
360
+ if (!best)
361
+ return skip(`${method}() matches no released baseline`);
362
+ if (!best.ok)
363
+ return skip(best.reason);
364
+ const declared = ts.isMethodDeclaration(member) ? member.parameters[0]?.name.getText(sf) : undefined;
365
+ const param = declared ?? (method === 'load' ? 'gameId' : 'deltaTime');
366
+ for (const [anchor, added] of best.insertions.byAnchor) {
367
+ const text = statementsText(ts, sf, added, BODY_INDENT);
368
+ if (text === null)
369
+ return skip(`${method}() ${ASSIGNS_ENGINE_FIELD}`);
370
+ if (method === 'constructor') {
371
+ constructorTail = text;
372
+ continue;
373
+ }
374
+ const hook = hookFor(method, anchor, param);
375
+ if (anchor !== 'end' && method === 'load' && added.some((s) => /\bawait\b/.test(s.getText(sf)))) {
376
+ return skip(`load() awaits inside code that would move into the synchronous ${hook.name}() hook`);
377
+ }
378
+ if (overrides.has(hook.name))
379
+ return skip(`two parts of the old Game.ts would both become ${hook.name}()`);
380
+ const superLine = `${BODY_INDENT}${hook.superCall}`;
381
+ const inner = hook.before ? `${text}\n${superLine}` : `${superLine}\n${text}`;
382
+ overrides.set(hook.name, `${MEMBER_INDENT}${hook.signature} {\n${inner}\n${MEMBER_INDENT}}`);
383
+ }
384
+ continue;
385
+ }
386
+ const isHook = HOOK_METHODS.has(name) && ts.isMethodDeclaration(member);
387
+ if (!isHook && baseNames.has(name)) {
388
+ return skip(`${name} is changed from the baseline and VoxelGameBase declares it too — move the change into a hook by hand`);
389
+ }
390
+ if (name === 'spawner' || name === 'vehicleSpawner') {
391
+ return skip(`the ${name} field is changed from the baseline; the engine owns it now`);
392
+ }
393
+ // A changed setupCamera/setupVoxelLighting is the same call in VoxelGameBase, now protected.
394
+ const text = nodeText(ts, sf, member, MEMBER_INDENT, isHook);
395
+ if (text === null)
396
+ return skip(`${name} ${ASSIGNS_ENGINE_FIELD}`);
397
+ if (ts.isPropertyDeclaration(member)) {
398
+ fields.push(text);
399
+ kept.push(`field ${name}`);
400
+ }
401
+ else {
402
+ methods.push(text);
403
+ kept.push(isHook ? `${name}() (kept as an override)` : `${name}()`);
404
+ }
405
+ }
406
+ // Everything outside the class (helpers, constants) stays, and so do the imports it and the kept members use.
407
+ const outside = [];
408
+ const imports = [];
409
+ for (const statement of sf.statements) {
410
+ if (statement === cls)
411
+ continue;
412
+ if (ts.isImportDeclaration(statement)) {
413
+ imports.push(statement);
414
+ continue;
415
+ }
416
+ const text = nodeText(ts, sf, statement, '');
417
+ if (text === null)
418
+ return skip(`code outside the class ${ASSIGNS_ENGINE_FIELD}`);
419
+ outside.push(text);
420
+ }
421
+ const hooks = [...overrides.keys()];
422
+ if (fields.length === 0 && methods.length === 0 && overrides.size === 0 && constructorTail === null && outside.length === 0) {
423
+ return { outcome: { status: 'migrated', kept: [], hooks: [], wroteBase: false }, gameText: newBaselineGame };
424
+ }
425
+ const ctorTail = constructorTail === null ? '' : `\n${constructorTail}`;
426
+ const constructorText = `${MEMBER_INDENT}constructor(engine: EngineLike, worldProfileData: WorldProfileData, gameData?: GameData) {\n`
427
+ + `${BODY_INDENT}super(engine, worldProfileData, gameData);${ctorTail}\n${MEMBER_INDENT}}`;
428
+ const classBody = [fields.join('\n'), constructorText, ...overrides.values(), ...methods].filter((p) => p.length > 0).join('\n\n');
429
+ // The new baseline's file comment and class comment, so a migrated file reads like a new one.
430
+ const newSf = ts.createSourceFile('Game.ts', newBaselineGame, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
431
+ const newClass = findGameClass(ts, newSf);
432
+ const firstStatement = newSf.statements[0];
433
+ const header = firstStatement ? newBaselineGame.slice(0, firstStatement.getStart(newSf)) : '';
434
+ const classDoc = newClass ? newBaselineGame.slice(newClass.pos, newClass.getStart(newSf)).trim() : '';
435
+ const classText = `${classDoc ? `${classDoc}\n` : ''}export class VoxelGame extends VoxelGameBase {\n${classBody}\n}`;
436
+ const body = [...outside, classText].join('\n\n');
437
+ const used = identifiersIn(ts, body);
438
+ const importLines = imports.map((d) => prunedImport(ts, sf, d, used)).filter((l) => l !== null);
439
+ const joined = importLines.join('\n');
440
+ if (!['WorldProfileData', 'EngineLike', 'GameData'].every((n) => new RegExp(`\\b${n}\\b`).test(joined))) {
441
+ importLines.unshift("import type { WorldProfileData, EngineLike, GameData } from 'types/game.js';");
442
+ }
443
+ importLines.push("import { VoxelGameBase } from './VoxelGameBase.js';");
444
+ const gameText = `${header}${[...new Set(importLines)].join('\n')}\n\n${body}\n`;
445
+ return { outcome: { status: 'migrated', kept, hooks, wroteBase: false }, gameText };
446
+ }
447
+ /**
448
+ * Migrate `src/work/Game.ts` onto VoxelGameBase in place: plan it, write the new Game.ts and the
449
+ * vendored `VoxelGameBase.ts` beside it, type-check, and put both files back as they were when the
450
+ * project no longer compiles. A project that did not compile before is not touched at all, since
451
+ * a failure afterwards could not be told apart from one it already had.
452
+ */
453
+ export function migrateGameFile(options) {
454
+ const { root, ts } = options;
455
+ const gamePath = path.join(root, GAME_FILE);
456
+ const basePath = path.join(root, BASE_FILE);
457
+ const vendoredGame = path.join(root, VENDORED_BASELINE_DIR, 'Game.ts');
458
+ const vendoredBase = path.join(root, VENDORED_BASELINE_DIR, 'VoxelGameBase.ts');
459
+ if (!fs.existsSync(gamePath))
460
+ return { status: 'skipped', reason: `${GAME_FILE} does not exist` };
461
+ if (!fs.existsSync(vendoredBase) || !fs.existsSync(vendoredGame)) {
462
+ return { status: 'skipped', reason: 'the vendored engine has no baseline/VoxelGameBase.ts — upgrade to an engine that has one first' };
463
+ }
464
+ const oldText = fs.readFileSync(gamePath, 'utf-8');
465
+ const baseText = fs.readFileSync(vendoredBase, 'utf-8');
466
+ const plan = planGameMigration(ts, oldText, fs.readFileSync(vendoredGame, 'utf-8'), baseText);
467
+ if (plan.outcome.status !== 'migrated' || plan.gameText === undefined)
468
+ return plan.outcome;
469
+ const existingBase = fs.existsSync(basePath) ? fs.readFileSync(basePath, 'utf-8') : null;
470
+ if (existingBase !== null && existingBase !== baseText) {
471
+ return { status: 'skipped', reason: `${BASE_FILE} already exists and differs from the engine's — merge it by hand first` };
472
+ }
473
+ const before = options.typeCheck();
474
+ if (!before.ok) {
475
+ return { status: 'skipped', reason: `the project does not type-check before the migration; fix that first (run \`bitmagic check\`):\n${firstLines(before.output)}` };
476
+ }
477
+ fs.writeFileSync(gamePath, plan.gameText);
478
+ if (existingBase === null)
479
+ fs.writeFileSync(basePath, baseText);
480
+ const after = options.typeCheck();
481
+ if (!after.ok) {
482
+ fs.writeFileSync(gamePath, oldText);
483
+ if (existingBase === null)
484
+ fs.rmSync(basePath);
485
+ return { status: 'skipped', reason: `the migrated Game.ts does not type-check, so it was put back:\n${firstLines(after.output)}` };
486
+ }
487
+ return { ...plan.outcome, wroteBase: existingBase === null };
488
+ }
489
+ function firstLines(text, count = 8) {
490
+ return text.split('\n').filter((l) => l.trim().length > 0).slice(0, count).map((l) => ` ${l}`).join('\n');
491
+ }
492
+ //# sourceMappingURL=game-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-migration.js","sourceRoot":"","sources":["../../src/scaffold/game-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type * as TS from 'typescript';
2
+ import { type SpecifierKind } from '@bitmagic/asset-core/engine-specifiers';
3
+ /**
4
+ * Where the vendored engine lists its moved modules: `engine/compat/aliases.ts` in the engine's
5
+ * own tree, which a project vendors under `engine/engine/`.
6
+ */
7
+ export declare const VENDORED_ALIASES_FILE = "engine/engine/compat/aliases.ts";
8
+ export interface ImportCodemodResult {
9
+ /** False when the vendored engine has no move list: an engine that predates it moved nothing. */
10
+ moveListFound: boolean;
11
+ /** How many modules the engine lists as moved. */
12
+ movedModules: number;
13
+ /** Files under src/ that were (or, with `write: false`, would be) rewritten, relative to the root, posix. */
14
+ filesChanged: string[];
15
+ /** Specifiers rewritten, per syntactic form. */
16
+ specifiers: Record<SpecifierKind, number>;
17
+ /** Sum of `specifiers`. */
18
+ total: number;
19
+ /** `file: import(<expr>)` for each dynamic import with a computed specifier — the codemod cannot see where those point. */
20
+ computedDynamic: string[];
21
+ }
22
+ export interface ImportCodemodOptions {
23
+ root: string;
24
+ /** The TypeScript compiler: the project's own (`loadProjectTypeScript`), or the test runner's. */
25
+ ts: typeof TS;
26
+ /** False reports what would change and writes nothing. */
27
+ write?: boolean;
28
+ }
29
+ /**
30
+ * Rewrite the creator's imports of moved engine modules to the modules' new paths.
31
+ *
32
+ * An upgraded engine keeps a shim at every old path (so nothing breaks the day it lands), and
33
+ * lists the shims in `engine/compat/aliases.ts`. This reads that list from the engine just
34
+ * vendored — the same fixed-format parse the engine's own lint rule uses — and rewrites every
35
+ * specifier under `src/` that resolves into the vendored engine and names a moved module, in
36
+ * every form a specifier takes (static and dynamic imports, inline `import()` types, re-exports,
37
+ * `jest.mock`, `require`, `new URL(…, import.meta.url)`, `declare module`), keeping each one's
38
+ * alias-or-relative style and extension. Specifiers that point anywhere else — a package, the
39
+ * creator's own files — are never touched, and a second run finds nothing to do.
40
+ *
41
+ * The scan and the spelling are the ones `game/scripts/engine-move.mjs` runs inside the engine
42
+ * repo (`@bitmagic/asset-core/engine-specifiers`), so a creator's import ends up exactly where the
43
+ * engine's own imports of the same module did.
44
+ */
45
+ export declare function runImportCodemod(options: ImportCodemodOptions): ImportCodemodResult;
46
+ /**
47
+ * The project's own TypeScript compiler, the one `bitmagic check` runs. The published CLI ships
48
+ * none (it would be a second ~20 MB copy of what every project already installs), so the codemods
49
+ * borrow it. Null when the project's dependencies are not installed.
50
+ */
51
+ export declare function loadProjectTypeScript(root: string): typeof TS | null;