@bitmagic/cli 0.1.83-dev.7 → 0.1.84-dev.0

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