@bitmagic/cli 0.1.83-dev.6 → 0.1.83

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 (61) hide show
  1. package/README.md +49 -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 +29 -0
  9. package/dist/cli.js +4 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/build.d.ts +4 -0
  12. package/dist/commands/build.js +20 -3
  13. package/dist/commands/build.js.map +1 -1
  14. package/dist/commands/pages.d.ts +25 -0
  15. package/dist/commands/pages.js +87 -0
  16. package/dist/commands/pages.js.map +1 -0
  17. package/dist/commands/report-bug.d.ts +42 -0
  18. package/dist/commands/report-bug.js +98 -0
  19. package/dist/commands/report-bug.js.map +1 -0
  20. package/dist/commands/upgrade.d.ts +9 -2
  21. package/dist/commands/upgrade.js +27 -6
  22. package/dist/commands/upgrade.js.map +1 -1
  23. package/dist/editor/bug-report-panel.d.ts +23 -0
  24. package/dist/editor/bug-report-panel.js +191 -0
  25. package/dist/editor/bug-report-panel.js.map +1 -0
  26. package/dist/editor/hud-replay-page.d.ts +9 -0
  27. package/dist/editor/hud-replay-page.js +11 -1
  28. package/dist/editor/hud-replay-page.js.map +1 -1
  29. package/dist/editor/server.js +54 -1
  30. package/dist/editor/server.js.map +1 -1
  31. package/dist/editor/shell-page.js +11 -0
  32. package/dist/editor/shell-page.js.map +1 -1
  33. package/dist/project/context.d.ts +7 -0
  34. package/dist/project/context.js.map +1 -1
  35. package/dist/publish/bundle.d.ts +43 -0
  36. package/dist/publish/bundle.js +133 -29
  37. package/dist/publish/bundle.js.map +1 -1
  38. package/dist/publish/source-zip.d.ts +6 -0
  39. package/dist/publish/source-zip.js +1 -1
  40. package/dist/publish/source-zip.js.map +1 -1
  41. package/dist/scaffold/engine-capabilities.d.ts +4 -0
  42. package/dist/scaffold/engine-capabilities.js.map +1 -1
  43. package/dist/scaffold/game-migration.d.ts +25 -63
  44. package/dist/scaffold/game-migration.js +30 -439
  45. package/dist/scaffold/game-migration.js.map +1 -1
  46. package/dist/scaffold/github-pages.d.ts +83 -0
  47. package/dist/scaffold/github-pages.js +200 -0
  48. package/dist/scaffold/github-pages.js.map +1 -0
  49. package/dist/scaffold/import-codemod.d.ts +4 -3
  50. package/dist/scaffold/import-codemod.js +16 -34
  51. package/dist/scaffold/import-codemod.js.map +1 -1
  52. package/dist/scaffold/project-files.d.ts +11 -0
  53. package/dist/scaffold/project-files.js +21 -8
  54. package/dist/scaffold/project-files.js.map +1 -1
  55. package/dist/scaffold/skill-files.js +34 -3
  56. package/dist/scaffold/skill-files.js.map +1 -1
  57. package/dist/vendor/hud-theme/engine/hud/fonts.js +6 -4
  58. package/package.json +6 -6
  59. package/dist/scaffold/legacy-game-baselines.d.ts +0 -14
  60. package/dist/scaffold/legacy-game-baselines.js +0 -218
  61. 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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"}
@@ -0,0 +1,83 @@
1
+ import type { PackageManager } from '../project/package-manager.js';
2
+ import { type EngineCapabilities } from './engine-capabilities.js';
3
+ /**
4
+ * The GitHub Pages target for a standalone project (engine OSS audit W5.6 §2.6, decision H-h):
5
+ * `bitmagic pages init` writes the workflow below, and the workflow runs `bitmagic build --pages`
6
+ * on every push to the default branch and deploys `.bitmagic/pages/` with GitHub's own Pages
7
+ * actions.
8
+ *
9
+ * What `build --pages` makes is a STATIC page: it boots through `bitmagic/boot-static.js`, which
10
+ * registers no platform services, so a `*.github.io` page never calls api-server, game-server or
11
+ * GTM. Only the engine's own files still come from Bitmagic: the Bitmagic CDN, until the open
12
+ * engine's asset site exists (`pagesHosting` in `bitmagic.json` switches that).
13
+ */
14
+ /** Where `bitmagic pages init` writes the workflow, relative to the project root. */
15
+ export declare const PAGES_WORKFLOW_PATH = ".github/workflows/bitmagic-pages.yml";
16
+ /** The directory `bitmagic build --pages` writes and the workflow uploads, relative to the root. */
17
+ export declare const PAGES_OUTPUT_DIR = ".bitmagic/pages";
18
+ /** The engine capability a vendored engine advertises once it carries `bitmagic/boot-static.ts`. */
19
+ export declare const STATIC_PAGE_CAPABILITY = "staticPage";
20
+ /** The `bm:platform` id the static page declares and `bitmagic/register-static.ts` registers. */
21
+ export declare const BITMAGIC_STATIC_PLATFORM_ID = "bitmagic-static";
22
+ /**
23
+ * Refuses an engine without the static page, before anything is written or built. The page boots
24
+ * `bitmagic/boot-static.js`; on an engine that has none, the build would compile clean and then
25
+ * fail in Vite on an unresolved entry, naming a file the creator never wrote.
26
+ */
27
+ export declare function requireStaticPageEngine(capabilities: EngineCapabilities): void;
28
+ /** The values `pagesHosting` in `bitmagic.json` takes, besides a root URL. */
29
+ export declare const PAGES_HOSTING_PRESETS: readonly ["bitmagic-cdn", "github-pages"];
30
+ export type PagesHostingPreset = (typeof PAGES_HOSTING_PRESETS)[number];
31
+ /** The default: the engine's files from the Bitmagic CDN, which is where they all are today. */
32
+ export declare const DEFAULT_PAGES_HOSTING: PagesHostingPreset;
33
+ /**
34
+ * The `<meta name="bm:asset-host">` content the static page carries for `bitmagic.json`'s
35
+ * `pagesHosting`, or null for none.
36
+ *
37
+ * - absent, or `"bitmagic-cdn"`: no meta. The static platform registers the Bitmagic CDN preset,
38
+ * and a page with no meta takes the platform's hosting (`resolveHosting` in the engine's
39
+ * `runtime/hosting.ts`).
40
+ * - `"github-pages"`: the meta `github-pages`, the open engine's own asset site. That site does
41
+ * not exist yet, so a page built this way loads no engine assets until it does.
42
+ * - a root URL (`https://…`, `http://…`, or a page-relative `./…`, `../…` or `/…` path): the meta
43
+ * names that root, which the engine reads as a self-hosted copy of the engine's files.
44
+ *
45
+ * Anything else is refused: the engine would read an unknown name as an unregistered provider and
46
+ * silently fall back to the platform's hosting, which is the opposite of what the creator asked.
47
+ */
48
+ export declare function pagesAssetHostMeta(pagesHosting: unknown): string | null;
49
+ export interface GithubPagesWorkflowOptions {
50
+ /**
51
+ * The CLI version the workflow runs, pinned: the version that scaffolded it. An unpinned `npx`
52
+ * would build with whatever was published last, against an engine this project may not have.
53
+ */
54
+ cliVersion: string;
55
+ /** The project's package manager, from its lockfile (`detectPackageManager`). */
56
+ packageManager: PackageManager;
57
+ /**
58
+ * The branch whose pushes deploy: the repository's default branch (`detectDefaultBranch`).
59
+ * Named literally, because `$default-branch` only works in GitHub's workflow templates; in a
60
+ * repository's own workflow file it is a branch called `$default-branch`, and nothing deploys.
61
+ */
62
+ branch: string;
63
+ }
64
+ /**
65
+ * `.github/workflows/bitmagic-pages.yml`.
66
+ *
67
+ * Action majors follow this repository's own workflows (`actions/checkout@v6`,
68
+ * `actions/setup-node@v6`, `pnpm/action-setup@v5`); the two Pages actions, which the repository
69
+ * does not otherwise use, are pinned to their current majors. Checkout fetches LFS objects,
70
+ * because a project may keep large models there and the bundle inlines nothing it cannot read.
71
+ */
72
+ export declare function renderGithubPagesWorkflow(options: GithubPagesWorkflowOptions): string;
73
+ /**
74
+ * What `bitmagic pages init` prints after writing the workflow: the one step only the creator can
75
+ * take, the limits GitHub sets, and the terms note. Lines, so `--json` can carry them as an array.
76
+ */
77
+ export declare function pagesSetupNotes(): string[];
78
+ /**
79
+ * The repository's default branch, for the workflow's push trigger: the remote's `HEAD` when the
80
+ * clone knows it, else the branch checked out now, else `main` (GitHub's default for a new
81
+ * repository). `bitmagic pages init --branch` overrides it.
82
+ */
83
+ export declare function detectDefaultBranch(root: string): string;