@combos-fun/plugin-development-tool 0.0.48 → 0.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/vite.cjs ADDED
@@ -0,0 +1,540 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var ts = require('typescript');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var ts__default = /*#__PURE__*/_interopDefault(ts);
10
+
11
+ const DEFAULT_HELPER_MODULE = '@combos-fun/plugin-development-tool';
12
+ const DEFAULT_HELPER_NAME = 'attachDevelopmentTarget';
13
+ const DEFAULT_SYSTEM_HELPER_NAME = 'ensureDevelopmentToolSystem';
14
+ const ENGINE_MODULE = '@combos-fun/engine';
15
+ const NO_TARGET_MARK = 'combos-no-target';
16
+ const NO_DEVTOOL_SYSTEM_MARK = 'combos-no-devtool-system';
17
+ function transformGameObjectTargets(code, options) {
18
+ const file = options.file;
19
+ const helperModule = options.helperModule ?? DEFAULT_HELPER_MODULE;
20
+ const helperName = options.helperName ?? DEFAULT_HELPER_NAME;
21
+ const systemHelperName = options.systemHelperName ?? DEFAULT_SYSTEM_HELPER_NAME;
22
+ if (!file || (!code.includes('GameObject') && !code.includes('Game'))) {
23
+ return { code, changed: false };
24
+ }
25
+ const sourceFile = ts__default.default.createSourceFile(file, code, ts__default.default.ScriptTarget.Latest, true, scriptKind(file));
26
+ const gameObjectRefs = collectConstructorRefs(sourceFile, 'GameObject');
27
+ const gameRefs = collectConstructorRefs(sourceFile, 'Game');
28
+ const helperRefs = collectHelperRefs(sourceFile, helperModule, helperName, systemHelperName);
29
+ const usedAnchors = new Set();
30
+ const edits = [];
31
+ const targetLocal = firstName(helperRefs.target) ?? helperName;
32
+ const systemLocal = firstName(helperRefs.system) ?? systemHelperName;
33
+ let addedTargetWrap = false;
34
+ let addedSystemWrap = false;
35
+ const visit = (node) => {
36
+ if (ts__default.default.isNewExpression(node) && isConstructorCall(node.expression, gameRefs)) {
37
+ const systemEdits = buildGameSystemEdits(code, sourceFile, node, systemLocal, helperRefs);
38
+ if (systemEdits.length > 0) {
39
+ edits.push(...systemEdits);
40
+ addedSystemWrap = true;
41
+ }
42
+ }
43
+ if (ts__default.default.isNewExpression(node) && isConstructorCall(node.expression, gameObjectRefs)) {
44
+ if (shouldSkipNew(sourceFile, node, helperRefs)) {
45
+ return;
46
+ }
47
+ const anchor = uniqueAnchor(usedAnchors, resolveNewAnchor(node));
48
+ edits.push({
49
+ start: node.getStart(sourceFile),
50
+ end: node.end,
51
+ text: wrapCall(code.slice(node.getStart(sourceFile), node.end), targetLocal, file, anchor),
52
+ });
53
+ addedTargetWrap = true;
54
+ return;
55
+ }
56
+ if (ts__default.default.isCallExpression(node) && node.expression.kind === ts__default.default.SyntaxKind.SuperKeyword) {
57
+ const cls = enclosingClass(node);
58
+ if (!cls || !classExtendsGameObject(cls, gameObjectRefs)) {
59
+ ts__default.default.forEachChild(node, visit);
60
+ return;
61
+ }
62
+ if (constructorAlreadyTagged(cls, helperRefs)) {
63
+ return;
64
+ }
65
+ const stmt = enclosingStatement(node);
66
+ if (!stmt) {
67
+ ts__default.default.forEachChild(node, visit);
68
+ return;
69
+ }
70
+ const anchor = uniqueAnchor(usedAnchors, resolveSuperAnchor(cls, node));
71
+ const indent = statementIndent(code, sourceFile, stmt);
72
+ edits.push({
73
+ start: stmt.end,
74
+ end: stmt.end,
75
+ text: `\n${indent}${targetLocal}(this, ${sourceLiteral(file, anchor)});`,
76
+ });
77
+ addedTargetWrap = true;
78
+ }
79
+ ts__default.default.forEachChild(node, visit);
80
+ };
81
+ ts__default.default.forEachChild(sourceFile, visit);
82
+ if (edits.length === 0) {
83
+ return { code, changed: false };
84
+ }
85
+ const neededImports = [];
86
+ if (addedTargetWrap && helperRefs.target.size === 0)
87
+ neededImports.push(helperName);
88
+ if (addedSystemWrap && helperRefs.system.size === 0)
89
+ neededImports.push(systemHelperName);
90
+ const importEdit = buildNamedImportEdit(sourceFile, helperModule, neededImports);
91
+ if (importEdit) {
92
+ edits.push(importEdit);
93
+ }
94
+ return { code: applyEdits(code, edits), changed: true };
95
+ }
96
+ function scriptKind(file) {
97
+ if (file.endsWith('.tsx'))
98
+ return ts__default.default.ScriptKind.TSX;
99
+ if (file.endsWith('.jsx'))
100
+ return ts__default.default.ScriptKind.JSX;
101
+ if (file.endsWith('.js') || file.endsWith('.mjs') || file.endsWith('.cjs')) {
102
+ return ts__default.default.ScriptKind.JS;
103
+ }
104
+ return ts__default.default.ScriptKind.TS;
105
+ }
106
+ function collectConstructorRefs(sourceFile, importedName) {
107
+ const names = new Set([importedName]);
108
+ const namespaces = new Set();
109
+ for (const stmt of sourceFile.statements) {
110
+ if (!ts__default.default.isImportDeclaration(stmt) || !isModule(stmt, ENGINE_MODULE))
111
+ continue;
112
+ const clause = stmt.importClause;
113
+ if (!clause || clause.isTypeOnly)
114
+ continue;
115
+ if (clause.namedBindings && ts__default.default.isNamespaceImport(clause.namedBindings)) {
116
+ namespaces.add(clause.namedBindings.name.text);
117
+ }
118
+ if (clause.namedBindings && ts__default.default.isNamedImports(clause.namedBindings)) {
119
+ for (const el of clause.namedBindings.elements) {
120
+ if (el.isTypeOnly)
121
+ continue;
122
+ const imported = (el.propertyName ?? el.name).text;
123
+ if (imported === importedName) {
124
+ names.add(el.name.text);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return { names, namespaces };
130
+ }
131
+ function collectHelperRefs(sourceFile, helperModule, targetName, systemName) {
132
+ const target = new Set();
133
+ const system = new Set();
134
+ for (const stmt of sourceFile.statements) {
135
+ if (!ts__default.default.isImportDeclaration(stmt) || !isModule(stmt, helperModule))
136
+ continue;
137
+ const clause = stmt.importClause;
138
+ if (!clause || clause.isTypeOnly)
139
+ continue;
140
+ if (!clause.namedBindings || !ts__default.default.isNamedImports(clause.namedBindings))
141
+ continue;
142
+ for (const el of clause.namedBindings.elements) {
143
+ if (el.isTypeOnly)
144
+ continue;
145
+ const imported = (el.propertyName ?? el.name).text;
146
+ if (imported === targetName) {
147
+ target.add(el.name.text);
148
+ }
149
+ if (imported === systemName) {
150
+ system.add(el.name.text);
151
+ }
152
+ }
153
+ }
154
+ return { target, system };
155
+ }
156
+ function firstName(names) {
157
+ return names.values().next().value;
158
+ }
159
+ function isModule(stmt, moduleName) {
160
+ return ts__default.default.isStringLiteral(stmt.moduleSpecifier) && stmt.moduleSpecifier.text === moduleName;
161
+ }
162
+ function isConstructorCall(expr, refs) {
163
+ if (ts__default.default.isIdentifier(expr)) {
164
+ return refs.names.has(expr.text);
165
+ }
166
+ if (ts__default.default.isPropertyAccessExpression(expr) &&
167
+ ts__default.default.isIdentifier(expr.expression) &&
168
+ ts__default.default.isIdentifier(expr.name) &&
169
+ refs.names.has(expr.name.text)) {
170
+ return refs.namespaces.has(expr.expression.text);
171
+ }
172
+ return false;
173
+ }
174
+ function classExtendsGameObject(cls, refs) {
175
+ const heritage = cls.heritageClauses?.find(h => h.token === ts__default.default.SyntaxKind.ExtendsKeyword);
176
+ const expr = heritage?.types[0]?.expression;
177
+ return !!expr && isConstructorCall(expr, refs);
178
+ }
179
+ function shouldSkipNew(sourceFile, node, helperRefs) {
180
+ if (isWrappedByHelper(node, helperRefs))
181
+ return true;
182
+ if (hasCommentMark(sourceFile, node, NO_TARGET_MARK))
183
+ return true;
184
+ if (isInternalNameArg(node.arguments?.[0]))
185
+ return true;
186
+ if (isPickableFalse(node.arguments?.[1]))
187
+ return true;
188
+ return false;
189
+ }
190
+ function isWrappedByHelper(node, helperRefs) {
191
+ let parent = node.parent;
192
+ while (parent && ts__default.default.isParenthesizedExpression(parent)) {
193
+ parent = parent.parent;
194
+ }
195
+ if (!parent || !ts__default.default.isCallExpression(parent))
196
+ return false;
197
+ const callee = parent.expression;
198
+ return ts__default.default.isIdentifier(callee) && helperRefs.target.has(callee.text);
199
+ }
200
+ function constructorAlreadyTagged(cls, helperRefs) {
201
+ const ctor = cls.members.find(ts__default.default.isConstructorDeclaration);
202
+ if (!ctor?.body)
203
+ return false;
204
+ return ctor.body.statements.some(stmt => {
205
+ if (!ts__default.default.isExpressionStatement(stmt) || !ts__default.default.isCallExpression(stmt.expression))
206
+ return false;
207
+ const callee = stmt.expression.expression;
208
+ return ts__default.default.isIdentifier(callee) && helperRefs.target.has(callee.text);
209
+ });
210
+ }
211
+ function hasCommentMark(sourceFile, node, mark) {
212
+ const targets = [node];
213
+ let parent = node.parent;
214
+ while (parent) {
215
+ targets.push(parent);
216
+ if (ts__default.default.isVariableStatement(parent) || ts__default.default.isExpressionStatement(parent) || ts__default.default.isSourceFile(parent)) {
217
+ break;
218
+ }
219
+ parent = parent.parent;
220
+ }
221
+ for (const target of targets) {
222
+ const ranges = [
223
+ ...(ts__default.default.getLeadingCommentRanges(sourceFile.text, target.getFullStart()) ?? []),
224
+ ...(ts__default.default.getTrailingCommentRanges(sourceFile.text, target.end) ?? []),
225
+ ];
226
+ for (const range of ranges) {
227
+ if (sourceFile.text.slice(range.pos, range.end).includes(mark)) {
228
+ return true;
229
+ }
230
+ }
231
+ }
232
+ return false;
233
+ }
234
+ function isInternalNameArg(arg) {
235
+ if (!arg)
236
+ return false;
237
+ if (ts__default.default.isStringLiteral(arg) || ts__default.default.isNoSubstitutionTemplateLiteral(arg)) {
238
+ return arg.text.startsWith('__');
239
+ }
240
+ return false;
241
+ }
242
+ function isPickableFalse(arg) {
243
+ if (!arg || !ts__default.default.isObjectLiteralExpression(arg))
244
+ return false;
245
+ const editor = findProp(arg, 'editor');
246
+ if (!editor || !ts__default.default.isObjectLiteralExpression(editor))
247
+ return false;
248
+ const pickable = findProp(editor, 'pickable');
249
+ return !!pickable && pickable.kind === ts__default.default.SyntaxKind.FalseKeyword;
250
+ }
251
+ function findProp(obj, name) {
252
+ for (const prop of obj.properties) {
253
+ if (!ts__default.default.isPropertyAssignment(prop))
254
+ continue;
255
+ const key = prop.name;
256
+ const keyText = ts__default.default.isIdentifier(key) || ts__default.default.isStringLiteral(key) ? key.text : undefined;
257
+ if (keyText === name)
258
+ return prop.initializer;
259
+ }
260
+ return undefined;
261
+ }
262
+ function resolveNewAnchor(node) {
263
+ const binding = variableBindingName(node);
264
+ if (binding)
265
+ return binding;
266
+ const literal = stringLiteralText(node.arguments?.[0]);
267
+ if (literal)
268
+ return literal;
269
+ return 'gameObject';
270
+ }
271
+ function resolveSuperAnchor(cls, superCall) {
272
+ const literal = stringLiteralText(superCall.arguments[0]);
273
+ if (literal)
274
+ return literal;
275
+ if (cls.name)
276
+ return cls.name.text;
277
+ return 'gameObject';
278
+ }
279
+ function variableBindingName(node) {
280
+ let parent = node.parent;
281
+ while (parent && ts__default.default.isParenthesizedExpression(parent)) {
282
+ parent = parent.parent;
283
+ }
284
+ if (parent && ts__default.default.isVariableDeclaration(parent) && ts__default.default.isIdentifier(parent.name)) {
285
+ return parent.name.text;
286
+ }
287
+ return undefined;
288
+ }
289
+ function stringLiteralText(node) {
290
+ if (!node)
291
+ return undefined;
292
+ if (ts__default.default.isStringLiteral(node) || ts__default.default.isNoSubstitutionTemplateLiteral(node)) {
293
+ return node.text;
294
+ }
295
+ return undefined;
296
+ }
297
+ function uniqueAnchor(used, base) {
298
+ const clean = base.trim() || 'gameObject';
299
+ if (!used.has(clean)) {
300
+ used.add(clean);
301
+ return clean;
302
+ }
303
+ let i = 2;
304
+ while (used.has(`${clean}-${i}`))
305
+ i += 1;
306
+ const next = `${clean}-${i}`;
307
+ used.add(next);
308
+ return next;
309
+ }
310
+ function wrapCall(original, helperName, file, anchor) {
311
+ return `${helperName}(${original}, ${sourceLiteral(file, anchor)})`;
312
+ }
313
+ function sourceLiteral(file, anchor) {
314
+ return `{ file: ${JSON.stringify(file)}, anchor: ${JSON.stringify(anchor)} }`;
315
+ }
316
+ function enclosingClass(node) {
317
+ let current = node.parent;
318
+ while (current) {
319
+ if (ts__default.default.isClassDeclaration(current) || ts__default.default.isClassExpression(current)) {
320
+ return current;
321
+ }
322
+ current = current.parent;
323
+ }
324
+ return undefined;
325
+ }
326
+ function enclosingStatement(node) {
327
+ let current = node.parent;
328
+ while (current) {
329
+ if (ts__default.default.isSourceFile(current))
330
+ return undefined;
331
+ if (isStatement(current))
332
+ return current;
333
+ current = current.parent;
334
+ }
335
+ return undefined;
336
+ }
337
+ function isStatement(node) {
338
+ return (ts__default.default.isExpressionStatement(node) ||
339
+ ts__default.default.isVariableStatement(node) ||
340
+ ts__default.default.isReturnStatement(node) ||
341
+ ts__default.default.isIfStatement(node));
342
+ }
343
+ function statementIndent(code, sourceFile, stmt) {
344
+ const start = stmt.getStart(sourceFile);
345
+ const lineStart = code.lastIndexOf('\n', start - 1) + 1;
346
+ const prefix = code.slice(lineStart, start);
347
+ const match = prefix.match(/^[ \t]*/);
348
+ return match ? match[0] : '';
349
+ }
350
+ function buildNamedImportEdit(sourceFile, helperModule, names) {
351
+ const unique = [...new Set(names.filter(Boolean))];
352
+ if (unique.length === 0)
353
+ return undefined;
354
+ const existing = sourceFile.statements.find((stmt) => ts__default.default.isImportDeclaration(stmt) && isModule(stmt, helperModule) && !stmt.importClause?.isTypeOnly);
355
+ if (existing?.importClause?.namedBindings && ts__default.default.isNamedImports(existing.importClause.namedBindings)) {
356
+ const named = existing.importClause.namedBindings;
357
+ const last = named.elements[named.elements.length - 1];
358
+ const text = last ? `, ${unique.join(', ')}` : unique.join(', ');
359
+ return {
360
+ start: last ? last.end : named.getStart(sourceFile) + 1,
361
+ end: last ? last.end : named.getStart(sourceFile) + 1,
362
+ text,
363
+ };
364
+ }
365
+ const imports = sourceFile.statements.filter(ts__default.default.isImportDeclaration);
366
+ const insertAfter = imports[imports.length - 1];
367
+ const insertPos = insertAfter ? insertAfter.end : 0;
368
+ const leading = insertPos === 0 ? '' : '\n';
369
+ return {
370
+ start: insertPos,
371
+ end: insertPos,
372
+ text: `${leading}import { ${unique.join(', ')} } from ${JSON.stringify(helperModule)};`,
373
+ };
374
+ }
375
+ function isHelperCall(expr, locals) {
376
+ return ts__default.default.isCallExpression(expr) && ts__default.default.isIdentifier(expr.expression) && locals.has(expr.expression.text);
377
+ }
378
+ function buildGameSystemEdits(code, sourceFile, node, helperName, helperRefs) {
379
+ if (hasCommentMark(sourceFile, node, NO_DEVTOOL_SYSTEM_MARK)) {
380
+ return [];
381
+ }
382
+ const ctor = code.slice(node.expression.getStart(sourceFile), node.expression.end);
383
+ const arg0 = node.arguments?.[0];
384
+ if (!arg0) {
385
+ return [
386
+ {
387
+ start: node.getStart(sourceFile),
388
+ end: node.end,
389
+ text: `new ${ctor}({ systems: ${helperName}() })`,
390
+ },
391
+ ];
392
+ }
393
+ if (!ts__default.default.isObjectLiteralExpression(arg0)) {
394
+ return [];
395
+ }
396
+ if (arg0.properties.length === 0) {
397
+ return [
398
+ {
399
+ start: arg0.getStart(sourceFile) + 1,
400
+ end: arg0.end - 1,
401
+ text: ` systems: ${helperName}() `,
402
+ },
403
+ ];
404
+ }
405
+ const systemsProp = arg0.properties.find(prop => {
406
+ if (ts__default.default.isSpreadAssignment(prop))
407
+ return false;
408
+ const name = prop.name;
409
+ if (!name)
410
+ return false;
411
+ return (ts__default.default.isIdentifier(name) || ts__default.default.isStringLiteral(name)) && name.text === 'systems';
412
+ });
413
+ if (!systemsProp) {
414
+ const last = arg0.properties[arg0.properties.length - 1];
415
+ const indent = propertyIndent(code, sourceFile, last);
416
+ const after = code.slice(last.end, arg0.end);
417
+ const comma = /^\s*,/.test(after) ? '' : ',';
418
+ return [
419
+ {
420
+ start: last.end,
421
+ end: last.end,
422
+ text: `${comma}\n${indent}systems: ${helperName}()`,
423
+ },
424
+ ];
425
+ }
426
+ if (ts__default.default.isShorthandPropertyAssignment(systemsProp)) {
427
+ return [
428
+ {
429
+ start: systemsProp.getStart(sourceFile),
430
+ end: systemsProp.end,
431
+ text: `systems: ${helperName}(systems)`,
432
+ },
433
+ ];
434
+ }
435
+ if (!ts__default.default.isPropertyAssignment(systemsProp)) {
436
+ return [];
437
+ }
438
+ const init = systemsProp.initializer;
439
+ if (isHelperCall(init, helperRefs.system)) {
440
+ return [];
441
+ }
442
+ const initStart = init.getStart(sourceFile);
443
+ return [
444
+ { start: initStart, end: initStart, text: `${helperName}(` },
445
+ { start: init.end, end: init.end, text: ')' },
446
+ ];
447
+ }
448
+ function propertyIndent(code, sourceFile, prop) {
449
+ const start = prop.getStart(sourceFile);
450
+ const lineStart = code.lastIndexOf('\n', start - 1) + 1;
451
+ const prefix = code.slice(lineStart, start);
452
+ const match = prefix.match(/^[ \t]*/);
453
+ return match ? match[0] : '';
454
+ }
455
+ function applyEdits(code, edits) {
456
+ const sorted = [...edits].sort((a, b) => b.start - a.start || b.end - a.end);
457
+ let out = code;
458
+ for (const edit of sorted) {
459
+ out = out.slice(0, edit.start) + edit.text + out.slice(edit.end);
460
+ }
461
+ return out;
462
+ }
463
+
464
+ const SOURCE_EXT = /\.[cm]?[jt]sx?$/;
465
+ function posixPath(value) {
466
+ return value.replace(/\\/g, '/');
467
+ }
468
+ function isInsideRoot(root, absFile) {
469
+ const normRoot = posixPath(root).replace(/\/+$/, '');
470
+ const normFile = posixPath(absFile);
471
+ if (!normRoot)
472
+ return false;
473
+ return normFile === normRoot || normFile.startsWith(`${normRoot}/`);
474
+ }
475
+ function posixRelative(root, absFile) {
476
+ const normRoot = posixPath(root).replace(/\/+$/, '');
477
+ const normFile = posixPath(absFile);
478
+ if (!normRoot)
479
+ return normFile.split('/').pop() || normFile;
480
+ if (normFile === normRoot)
481
+ return '';
482
+ const prefix = `${normRoot}/`;
483
+ if (normFile.startsWith(prefix))
484
+ return normFile.slice(prefix.length);
485
+ return normFile.split('/').pop() || normFile;
486
+ }
487
+ function shouldTransformId(id, root) {
488
+ if (!id || id.startsWith('\0'))
489
+ return false;
490
+ const [filepath] = id.split('?');
491
+ if (!filepath || filepath.includes('/node_modules/') || filepath.includes('\\node_modules\\')) {
492
+ return false;
493
+ }
494
+ if (root && !isInsideRoot(root, filepath)) {
495
+ return false;
496
+ }
497
+ return SOURCE_EXT.test(filepath);
498
+ }
499
+ /**
500
+ * Rewrites game `new GameObject(...)` (and `super(...)` in GameObject subclasses)
501
+ * to `attachDevelopmentTarget(..., { file, anchor })`, and wraps
502
+ * `new Game({ systems })` with `ensureDevelopmentToolSystem(...)`.
503
+ *
504
+ * Add this in the **game** Vite config (Creator host), not in game source.
505
+ */
506
+ function combosDevelopmentTargetPlugin(options = {}) {
507
+ let root = options.root ?? '';
508
+ return {
509
+ name: 'combos-development-target',
510
+ enforce: 'pre',
511
+ configResolved(config) {
512
+ if (!options.root) {
513
+ root = config.root;
514
+ }
515
+ },
516
+ transform(code, id) {
517
+ if (!shouldTransformId(id, root))
518
+ return null;
519
+ if (!code.includes('GameObject') && !code.includes('Game'))
520
+ return null;
521
+ const [filepath] = id.split('?');
522
+ const file = posixRelative(root, filepath);
523
+ const result = transformGameObjectTargets(code, {
524
+ file,
525
+ helperModule: options.helperModule,
526
+ });
527
+ if (!result.changed)
528
+ return null;
529
+ return { code: result.code, map: null };
530
+ },
531
+ };
532
+ }
533
+
534
+ exports.DEFAULT_HELPER_MODULE = DEFAULT_HELPER_MODULE;
535
+ exports.DEFAULT_HELPER_NAME = DEFAULT_HELPER_NAME;
536
+ exports.DEFAULT_SYSTEM_HELPER_NAME = DEFAULT_SYSTEM_HELPER_NAME;
537
+ exports.combosDevelopmentTargetPlugin = combosDevelopmentTargetPlugin;
538
+ exports.default = combosDevelopmentTargetPlugin;
539
+ exports.transformGameObjectTargets = transformGameObjectTargets;
540
+ //# sourceMappingURL=vite.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.cjs","sources":["../vite/transform.ts","../vite/plugin.ts"],"sourcesContent":["import ts from 'typescript';\n\nexport const DEFAULT_HELPER_MODULE = '@combos-fun/plugin-development-tool';\nexport const DEFAULT_HELPER_NAME = 'attachDevelopmentTarget';\nexport const DEFAULT_SYSTEM_HELPER_NAME = 'ensureDevelopmentToolSystem';\nconst ENGINE_MODULE = '@combos-fun/engine';\nconst NO_TARGET_MARK = 'combos-no-target';\nconst NO_DEVTOOL_SYSTEM_MARK = 'combos-no-devtool-system';\n\nexport interface TransformGameObjectTargetsOptions {\n /** Project-relative path stored on `payload.source.file`. */\n file: string;\n helperModule?: string;\n helperName?: string;\n systemHelperName?: string;\n}\n\nexport interface TransformGameObjectTargetsResult {\n code: string;\n changed: boolean;\n}\n\ninterface GameObjectRefs {\n /** Local identifiers that construct a Combos `GameObject`. */\n names: Set<string>;\n /** `import * as Engine` bindings whose `.GameObject` is the constructor. */\n namespaces: Set<string>;\n}\n\ninterface HelperRefs {\n /** Local identifiers for `attachDevelopmentTarget`. */\n target: Set<string>;\n /** Local identifiers for `ensureDevelopmentToolSystem`. */\n system: Set<string>;\n}\n\ninterface PendingEdit {\n start: number;\n end: number;\n text: string;\n}\n\nexport function transformGameObjectTargets(\n code: string,\n options: TransformGameObjectTargetsOptions,\n): TransformGameObjectTargetsResult {\n const file = options.file;\n const helperModule = options.helperModule ?? DEFAULT_HELPER_MODULE;\n const helperName = options.helperName ?? DEFAULT_HELPER_NAME;\n const systemHelperName = options.systemHelperName ?? DEFAULT_SYSTEM_HELPER_NAME;\n\n if (!file || (!code.includes('GameObject') && !code.includes('Game'))) {\n return { code, changed: false };\n }\n\n const sourceFile = ts.createSourceFile(\n file,\n code,\n ts.ScriptTarget.Latest,\n true,\n scriptKind(file),\n );\n\n const gameObjectRefs = collectConstructorRefs(sourceFile, 'GameObject');\n const gameRefs = collectConstructorRefs(sourceFile, 'Game');\n const helperRefs = collectHelperRefs(sourceFile, helperModule, helperName, systemHelperName);\n const usedAnchors = new Set<string>();\n const edits: PendingEdit[] = [];\n const targetLocal = firstName(helperRefs.target) ?? helperName;\n const systemLocal = firstName(helperRefs.system) ?? systemHelperName;\n let addedTargetWrap = false;\n let addedSystemWrap = false;\n\n const visit = (node: ts.Node) => {\n if (ts.isNewExpression(node) && isConstructorCall(node.expression, gameRefs)) {\n const systemEdits = buildGameSystemEdits(code, sourceFile, node, systemLocal, helperRefs);\n if (systemEdits.length > 0) {\n edits.push(...systemEdits);\n addedSystemWrap = true;\n }\n }\n\n if (ts.isNewExpression(node) && isConstructorCall(node.expression, gameObjectRefs)) {\n if (shouldSkipNew(sourceFile, node, helperRefs)) {\n return;\n }\n const anchor = uniqueAnchor(usedAnchors, resolveNewAnchor(node));\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: wrapCall(code.slice(node.getStart(sourceFile), node.end), targetLocal, file, anchor),\n });\n addedTargetWrap = true;\n return;\n }\n\n if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.SuperKeyword) {\n const cls = enclosingClass(node);\n if (!cls || !classExtendsGameObject(cls, gameObjectRefs)) {\n ts.forEachChild(node, visit);\n return;\n }\n if (constructorAlreadyTagged(cls, helperRefs)) {\n return;\n }\n const stmt = enclosingStatement(node);\n if (!stmt) {\n ts.forEachChild(node, visit);\n return;\n }\n const anchor = uniqueAnchor(usedAnchors, resolveSuperAnchor(cls, node));\n const indent = statementIndent(code, sourceFile, stmt);\n edits.push({\n start: stmt.end,\n end: stmt.end,\n text: `\\n${indent}${targetLocal}(this, ${sourceLiteral(file, anchor)});`,\n });\n addedTargetWrap = true;\n }\n\n ts.forEachChild(node, visit);\n };\n\n ts.forEachChild(sourceFile, visit);\n\n if (edits.length === 0) {\n return { code, changed: false };\n }\n\n const neededImports: string[] = [];\n if (addedTargetWrap && helperRefs.target.size === 0) neededImports.push(helperName);\n if (addedSystemWrap && helperRefs.system.size === 0) neededImports.push(systemHelperName);\n\n const importEdit = buildNamedImportEdit(sourceFile, helperModule, neededImports);\n if (importEdit) {\n edits.push(importEdit);\n }\n\n return { code: applyEdits(code, edits), changed: true };\n}\n\nfunction scriptKind(file: string): ts.ScriptKind {\n if (file.endsWith('.tsx')) return ts.ScriptKind.TSX;\n if (file.endsWith('.jsx')) return ts.ScriptKind.JSX;\n if (file.endsWith('.js') || file.endsWith('.mjs') || file.endsWith('.cjs')) {\n return ts.ScriptKind.JS;\n }\n return ts.ScriptKind.TS;\n}\n\nfunction collectConstructorRefs(sourceFile: ts.SourceFile, importedName: string): GameObjectRefs {\n const names = new Set<string>([importedName]);\n const namespaces = new Set<string>();\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt) || !isModule(stmt, ENGINE_MODULE)) continue;\n const clause = stmt.importClause;\n if (!clause || clause.isTypeOnly) continue;\n\n if (clause.namedBindings && ts.isNamespaceImport(clause.namedBindings)) {\n namespaces.add(clause.namedBindings.name.text);\n }\n\n if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const el of clause.namedBindings.elements) {\n if (el.isTypeOnly) continue;\n const imported = (el.propertyName ?? el.name).text;\n if (imported === importedName) {\n names.add(el.name.text);\n }\n }\n }\n }\n\n return { names, namespaces };\n}\n\nfunction collectHelperRefs(\n sourceFile: ts.SourceFile,\n helperModule: string,\n targetName: string,\n systemName: string,\n): HelperRefs {\n const target = new Set<string>();\n const system = new Set<string>();\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt) || !isModule(stmt, helperModule)) continue;\n const clause = stmt.importClause;\n if (!clause || clause.isTypeOnly) continue;\n if (!clause.namedBindings || !ts.isNamedImports(clause.namedBindings)) continue;\n for (const el of clause.namedBindings.elements) {\n if (el.isTypeOnly) continue;\n const imported = (el.propertyName ?? el.name).text;\n if (imported === targetName) {\n target.add(el.name.text);\n }\n if (imported === systemName) {\n system.add(el.name.text);\n }\n }\n }\n\n return { target, system };\n}\n\nfunction firstName(names: Set<string>): string | undefined {\n return names.values().next().value;\n}\n\nfunction isModule(stmt: ts.ImportDeclaration, moduleName: string): boolean {\n return ts.isStringLiteral(stmt.moduleSpecifier) && stmt.moduleSpecifier.text === moduleName;\n}\n\nfunction isConstructorCall(expr: ts.Expression, refs: GameObjectRefs): boolean {\n if (ts.isIdentifier(expr)) {\n return refs.names.has(expr.text);\n }\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.expression) &&\n ts.isIdentifier(expr.name) &&\n refs.names.has(expr.name.text)\n ) {\n return refs.namespaces.has(expr.expression.text);\n }\n return false;\n}\n\nfunction classExtendsGameObject(cls: ts.ClassLikeDeclaration, refs: GameObjectRefs): boolean {\n const heritage = cls.heritageClauses?.find(h => h.token === ts.SyntaxKind.ExtendsKeyword);\n const expr = heritage?.types[0]?.expression;\n return !!expr && isConstructorCall(expr, refs);\n}\n\nfunction shouldSkipNew(\n sourceFile: ts.SourceFile,\n node: ts.NewExpression,\n helperRefs: HelperRefs,\n): boolean {\n if (isWrappedByHelper(node, helperRefs)) return true;\n if (hasCommentMark(sourceFile, node, NO_TARGET_MARK)) return true;\n if (isInternalNameArg(node.arguments?.[0])) return true;\n if (isPickableFalse(node.arguments?.[1])) return true;\n return false;\n}\n\nfunction isWrappedByHelper(node: ts.Node, helperRefs: HelperRefs): boolean {\n let parent = node.parent;\n while (parent && ts.isParenthesizedExpression(parent)) {\n parent = parent.parent;\n }\n if (!parent || !ts.isCallExpression(parent)) return false;\n const callee = parent.expression;\n return ts.isIdentifier(callee) && helperRefs.target.has(callee.text);\n}\n\nfunction constructorAlreadyTagged(cls: ts.ClassLikeDeclaration, helperRefs: HelperRefs): boolean {\n const ctor = cls.members.find(ts.isConstructorDeclaration);\n if (!ctor?.body) return false;\n return ctor.body.statements.some(stmt => {\n if (!ts.isExpressionStatement(stmt) || !ts.isCallExpression(stmt.expression)) return false;\n const callee = stmt.expression.expression;\n return ts.isIdentifier(callee) && helperRefs.target.has(callee.text);\n });\n}\n\nfunction hasCommentMark(sourceFile: ts.SourceFile, node: ts.Node, mark: string): boolean {\n const targets: ts.Node[] = [node];\n let parent: ts.Node | undefined = node.parent;\n while (parent) {\n targets.push(parent);\n if (ts.isVariableStatement(parent) || ts.isExpressionStatement(parent) || ts.isSourceFile(parent)) {\n break;\n }\n parent = parent.parent;\n }\n\n for (const target of targets) {\n const ranges = [\n ...(ts.getLeadingCommentRanges(sourceFile.text, target.getFullStart()) ?? []),\n ...(ts.getTrailingCommentRanges(sourceFile.text, target.end) ?? []),\n ];\n for (const range of ranges) {\n if (sourceFile.text.slice(range.pos, range.end).includes(mark)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction isInternalNameArg(arg: ts.Expression | undefined): boolean {\n if (!arg) return false;\n if (ts.isStringLiteral(arg) || ts.isNoSubstitutionTemplateLiteral(arg)) {\n return arg.text.startsWith('__');\n }\n return false;\n}\n\nfunction isPickableFalse(arg: ts.Expression | undefined): boolean {\n if (!arg || !ts.isObjectLiteralExpression(arg)) return false;\n const editor = findProp(arg, 'editor');\n if (!editor || !ts.isObjectLiteralExpression(editor)) return false;\n const pickable = findProp(editor, 'pickable');\n return !!pickable && pickable.kind === ts.SyntaxKind.FalseKeyword;\n}\n\nfunction findProp(obj: ts.ObjectLiteralExpression, name: string): ts.Expression | undefined {\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const key = prop.name;\n const keyText = ts.isIdentifier(key) || ts.isStringLiteral(key) ? key.text : undefined;\n if (keyText === name) return prop.initializer;\n }\n return undefined;\n}\n\nfunction resolveNewAnchor(node: ts.NewExpression): string {\n const binding = variableBindingName(node);\n if (binding) return binding;\n const literal = stringLiteralText(node.arguments?.[0]);\n if (literal) return literal;\n return 'gameObject';\n}\n\nfunction resolveSuperAnchor(cls: ts.ClassLikeDeclaration, superCall: ts.CallExpression): string {\n const literal = stringLiteralText(superCall.arguments[0]);\n if (literal) return literal;\n if (cls.name) return cls.name.text;\n return 'gameObject';\n}\n\nfunction variableBindingName(node: ts.NewExpression): string | undefined {\n let parent: ts.Node | undefined = node.parent;\n while (parent && ts.isParenthesizedExpression(parent)) {\n parent = parent.parent;\n }\n if (parent && ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name)) {\n return parent.name.text;\n }\n return undefined;\n}\n\nfunction stringLiteralText(node: ts.Expression | undefined): string | undefined {\n if (!node) return undefined;\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n return node.text;\n }\n return undefined;\n}\n\nfunction uniqueAnchor(used: Set<string>, base: string): string {\n const clean = base.trim() || 'gameObject';\n if (!used.has(clean)) {\n used.add(clean);\n return clean;\n }\n let i = 2;\n while (used.has(`${clean}-${i}`)) i += 1;\n const next = `${clean}-${i}`;\n used.add(next);\n return next;\n}\n\nfunction wrapCall(original: string, helperName: string, file: string, anchor: string): string {\n return `${helperName}(${original}, ${sourceLiteral(file, anchor)})`;\n}\n\nfunction sourceLiteral(file: string, anchor: string): string {\n return `{ file: ${JSON.stringify(file)}, anchor: ${JSON.stringify(anchor)} }`;\n}\n\nfunction enclosingClass(node: ts.Node): ts.ClassLikeDeclaration | undefined {\n let current: ts.Node | undefined = node.parent;\n while (current) {\n if (ts.isClassDeclaration(current) || ts.isClassExpression(current)) {\n return current;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction enclosingStatement(node: ts.Node): ts.Statement | undefined {\n let current: ts.Node | undefined = node.parent;\n while (current) {\n if (ts.isSourceFile(current)) return undefined;\n if (isStatement(current)) return current;\n current = current.parent;\n }\n return undefined;\n}\n\nfunction isStatement(node: ts.Node): node is ts.Statement {\n return (\n ts.isExpressionStatement(node) ||\n ts.isVariableStatement(node) ||\n ts.isReturnStatement(node) ||\n ts.isIfStatement(node)\n );\n}\n\nfunction statementIndent(code: string, sourceFile: ts.SourceFile, stmt: ts.Statement): string {\n const start = stmt.getStart(sourceFile);\n const lineStart = code.lastIndexOf('\\n', start - 1) + 1;\n const prefix = code.slice(lineStart, start);\n const match = prefix.match(/^[ \\t]*/);\n return match ? match[0] : '';\n}\n\nfunction buildNamedImportEdit(\n sourceFile: ts.SourceFile,\n helperModule: string,\n names: string[],\n): PendingEdit | undefined {\n const unique = [...new Set(names.filter(Boolean))];\n if (unique.length === 0) return undefined;\n\n const existing = sourceFile.statements.find(\n (stmt): stmt is ts.ImportDeclaration =>\n ts.isImportDeclaration(stmt) && isModule(stmt, helperModule) && !stmt.importClause?.isTypeOnly,\n );\n\n if (existing?.importClause?.namedBindings && ts.isNamedImports(existing.importClause.namedBindings)) {\n const named = existing.importClause.namedBindings;\n const last = named.elements[named.elements.length - 1];\n const text = last ? `, ${unique.join(', ')}` : unique.join(', ');\n return {\n start: last ? last.end : named.getStart(sourceFile) + 1,\n end: last ? last.end : named.getStart(sourceFile) + 1,\n text,\n };\n }\n\n const imports = sourceFile.statements.filter(ts.isImportDeclaration);\n const insertAfter = imports[imports.length - 1];\n const insertPos = insertAfter ? insertAfter.end : 0;\n const leading = insertPos === 0 ? '' : '\\n';\n return {\n start: insertPos,\n end: insertPos,\n text: `${leading}import { ${unique.join(', ')} } from ${JSON.stringify(helperModule)};`,\n };\n}\n\nfunction isHelperCall(expr: ts.Expression, locals: Set<string>): boolean {\n return ts.isCallExpression(expr) && ts.isIdentifier(expr.expression) && locals.has(expr.expression.text);\n}\n\nfunction buildGameSystemEdits(\n code: string,\n sourceFile: ts.SourceFile,\n node: ts.NewExpression,\n helperName: string,\n helperRefs: HelperRefs,\n): PendingEdit[] {\n if (hasCommentMark(sourceFile, node, NO_DEVTOOL_SYSTEM_MARK)) {\n return [];\n }\n\n const ctor = code.slice(node.expression.getStart(sourceFile), node.expression.end);\n const arg0 = node.arguments?.[0];\n\n if (!arg0) {\n return [\n {\n start: node.getStart(sourceFile),\n end: node.end,\n text: `new ${ctor}({ systems: ${helperName}() })`,\n },\n ];\n }\n\n if (!ts.isObjectLiteralExpression(arg0)) {\n return [];\n }\n\n if (arg0.properties.length === 0) {\n return [\n {\n start: arg0.getStart(sourceFile) + 1,\n end: arg0.end - 1,\n text: ` systems: ${helperName}() `,\n },\n ];\n }\n\n const systemsProp = arg0.properties.find(prop => {\n if (ts.isSpreadAssignment(prop)) return false;\n const name = prop.name;\n if (!name) return false;\n return (ts.isIdentifier(name) || ts.isStringLiteral(name)) && name.text === 'systems';\n });\n\n if (!systemsProp) {\n const last = arg0.properties[arg0.properties.length - 1];\n const indent = propertyIndent(code, sourceFile, last);\n const after = code.slice(last.end, arg0.end);\n const comma = /^\\s*,/.test(after) ? '' : ',';\n return [\n {\n start: last.end,\n end: last.end,\n text: `${comma}\\n${indent}systems: ${helperName}()`,\n },\n ];\n }\n\n if (ts.isShorthandPropertyAssignment(systemsProp)) {\n return [\n {\n start: systemsProp.getStart(sourceFile),\n end: systemsProp.end,\n text: `systems: ${helperName}(systems)`,\n },\n ];\n }\n\n if (!ts.isPropertyAssignment(systemsProp)) {\n return [];\n }\n\n const init = systemsProp.initializer;\n if (isHelperCall(init, helperRefs.system)) {\n return [];\n }\n\n const initStart = init.getStart(sourceFile);\n return [\n { start: initStart, end: initStart, text: `${helperName}(` },\n { start: init.end, end: init.end, text: ')' },\n ];\n}\n\nfunction propertyIndent(code: string, sourceFile: ts.SourceFile, prop: ts.ObjectLiteralElementLike): string {\n const start = prop.getStart(sourceFile);\n const lineStart = code.lastIndexOf('\\n', start - 1) + 1;\n const prefix = code.slice(lineStart, start);\n const match = prefix.match(/^[ \\t]*/);\n return match ? match[0] : '';\n}\n\nfunction applyEdits(code: string, edits: PendingEdit[]): string {\n const sorted = [...edits].sort((a, b) => b.start - a.start || b.end - a.end);\n let out = code;\n for (const edit of sorted) {\n out = out.slice(0, edit.start) + edit.text + out.slice(edit.end);\n }\n return out;\n}\n","import { transformGameObjectTargets } from './transform';\n\nexport interface CombosDevelopmentTargetPluginOptions {\n /** Project root used to compute `source.file`. Defaults to Vite `config.root`. */\n root?: string;\n /** Import specifier for `attachDevelopmentTarget`. */\n helperModule?: string;\n}\n\nconst SOURCE_EXT = /\\.[cm]?[jt]sx?$/;\n\nfunction posixPath(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nfunction isInsideRoot(root: string, absFile: string): boolean {\n const normRoot = posixPath(root).replace(/\\/+$/, '');\n const normFile = posixPath(absFile);\n if (!normRoot) return false;\n return normFile === normRoot || normFile.startsWith(`${normRoot}/`);\n}\n\nfunction posixRelative(root: string, absFile: string): string {\n const normRoot = posixPath(root).replace(/\\/+$/, '');\n const normFile = posixPath(absFile);\n if (!normRoot) return normFile.split('/').pop() || normFile;\n if (normFile === normRoot) return '';\n const prefix = `${normRoot}/`;\n if (normFile.startsWith(prefix)) return normFile.slice(prefix.length);\n return normFile.split('/').pop() || normFile;\n}\n\nfunction shouldTransformId(id: string, root: string): boolean {\n if (!id || id.startsWith('\\0')) return false;\n const [filepath] = id.split('?');\n if (!filepath || filepath.includes('/node_modules/') || filepath.includes('\\\\node_modules\\\\')) {\n return false;\n }\n if (root && !isInsideRoot(root, filepath)) {\n return false;\n }\n return SOURCE_EXT.test(filepath);\n}\n\n/**\n * Rewrites game `new GameObject(...)` (and `super(...)` in GameObject subclasses)\n * to `attachDevelopmentTarget(..., { file, anchor })`, and wraps\n * `new Game({ systems })` with `ensureDevelopmentToolSystem(...)`.\n *\n * Add this in the **game** Vite config (Creator host), not in game source.\n */\nexport function combosDevelopmentTargetPlugin(\n options: CombosDevelopmentTargetPluginOptions = {},\n) {\n let root = options.root ?? '';\n\n return {\n name: 'combos-development-target',\n enforce: 'pre' as const,\n configResolved(config: { root: string }) {\n if (!options.root) {\n root = config.root;\n }\n },\n transform(code: string, id: string) {\n if (!shouldTransformId(id, root)) return null;\n if (!code.includes('GameObject') && !code.includes('Game')) return null;\n\n const [filepath] = id.split('?');\n const file = posixRelative(root, filepath);\n const result = transformGameObjectTargets(code, {\n file,\n helperModule: options.helperModule,\n });\n if (!result.changed) return null;\n return { code: result.code, map: null };\n },\n };\n}\n"],"names":["ts"],"mappings":"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"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ interface CombosDevelopmentTargetPluginOptions {
2
+ /** Project root used to compute `source.file`. Defaults to Vite `config.root`. */
3
+ root?: string;
4
+ /** Import specifier for `attachDevelopmentTarget`. */
5
+ helperModule?: string;
6
+ }
7
+ /**
8
+ * Rewrites game `new GameObject(...)` (and `super(...)` in GameObject subclasses)
9
+ * to `attachDevelopmentTarget(..., { file, anchor })`, and wraps
10
+ * `new Game({ systems })` with `ensureDevelopmentToolSystem(...)`.
11
+ *
12
+ * Add this in the **game** Vite config (Creator host), not in game source.
13
+ */
14
+ declare function combosDevelopmentTargetPlugin(options?: CombosDevelopmentTargetPluginOptions): {
15
+ name: string;
16
+ enforce: "pre";
17
+ configResolved(config: {
18
+ root: string;
19
+ }): void;
20
+ transform(code: string, id: string): {
21
+ code: string;
22
+ map: any;
23
+ };
24
+ };
25
+
26
+ declare const DEFAULT_HELPER_MODULE = "@combos-fun/plugin-development-tool";
27
+ declare const DEFAULT_HELPER_NAME = "attachDevelopmentTarget";
28
+ declare const DEFAULT_SYSTEM_HELPER_NAME = "ensureDevelopmentToolSystem";
29
+ interface TransformGameObjectTargetsOptions {
30
+ /** Project-relative path stored on `payload.source.file`. */
31
+ file: string;
32
+ helperModule?: string;
33
+ helperName?: string;
34
+ systemHelperName?: string;
35
+ }
36
+ interface TransformGameObjectTargetsResult {
37
+ code: string;
38
+ changed: boolean;
39
+ }
40
+ declare function transformGameObjectTargets(code: string, options: TransformGameObjectTargetsOptions): TransformGameObjectTargetsResult;
41
+
42
+ export { DEFAULT_HELPER_MODULE, DEFAULT_HELPER_NAME, DEFAULT_SYSTEM_HELPER_NAME, combosDevelopmentTargetPlugin, combosDevelopmentTargetPlugin as default, transformGameObjectTargets };
43
+ export type { CombosDevelopmentTargetPluginOptions, TransformGameObjectTargetsOptions, TransformGameObjectTargetsResult };