@defold-typescript/types 0.50.1 → 0.52.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 (166) hide show
  1. package/api-availability.json +4 -58
  2. package/api-signatures.json +1128 -1552
  3. package/api-targets.json +15 -5
  4. package/examples/translations.json +19 -71
  5. package/fixtures/messages_doc.json +20 -39
  6. package/generated/b2d_world.d.ts +10 -10
  7. package/generated/buffer.d.ts +9 -9
  8. package/generated/builtin-messages.d.ts +16 -14
  9. package/generated/bullet3d_collision_object.d.ts +1 -1
  10. package/generated/bullet3d_constraint.d.ts +109 -7
  11. package/generated/bullet3d_shape.d.ts +2 -2
  12. package/generated/collectionfactory.d.ts +1 -1
  13. package/generated/collectionproxy.d.ts +2 -2
  14. package/generated/factory.d.ts +4 -2
  15. package/generated/go.d.ts +114 -220
  16. package/generated/graphics.d.ts +5 -0
  17. package/generated/gui.d.ts +148 -371
  18. package/generated/http.d.ts +4 -2
  19. package/generated/image.d.ts +56 -4
  20. package/generated/kinds/gui-script.d.ts +3 -0
  21. package/generated/kinds/render-script.d.ts +15 -15
  22. package/generated/kinds/script.d.ts +1 -0
  23. package/generated/liveupdate.d.ts +5 -1
  24. package/generated/material.d.ts +3 -3
  25. package/generated/model.d.ts +4 -5
  26. package/generated/particlefx.d.ts +20 -1
  27. package/generated/physics.d.ts +48 -4
  28. package/generated/render-script-modules/b2d.d.ts +711 -0
  29. package/generated/render-script-modules/bullet3d.d.ts +73 -0
  30. package/generated/render-script-modules/collectionfactory.d.ts +25 -0
  31. package/generated/render-script-modules/collectionproxy.d.ts +39 -0
  32. package/generated/render-script-modules/factory.d.ts +25 -0
  33. package/generated/render-script-modules/go.d.ts +436 -0
  34. package/generated/render-script-modules/label.d.ts +105 -0
  35. package/generated/render-script-modules/model.d.ts +89 -0
  36. package/generated/render-script-modules/particlefx.d.ts +59 -0
  37. package/generated/render-script-modules/physics.d.ts +333 -0
  38. package/generated/render-script-modules/resource.d.ts +1233 -0
  39. package/generated/render-script-modules/sound.d.ts +227 -0
  40. package/generated/render-script-modules/sprite.d.ts +68 -0
  41. package/generated/render-script-modules/tilemap.d.ts +43 -0
  42. package/generated/render.d.ts +175 -21
  43. package/generated/resource.d.ts +31 -10
  44. package/generated/sprite.d.ts +49 -1
  45. package/generated/sys.d.ts +78 -10
  46. package/generated/tilemap.d.ts +4 -4
  47. package/generated/versions/defold-1.12.4/buffer.d.ts +8 -8
  48. package/generated/versions/defold-1.12.4/collectionfactory.d.ts +1 -1
  49. package/generated/versions/defold-1.12.4/collectionproxy.d.ts +1 -1
  50. package/generated/versions/defold-1.12.4/factory.d.ts +4 -2
  51. package/generated/versions/defold-1.12.4/go.d.ts +115 -343
  52. package/generated/versions/defold-1.12.4/graphics.d.ts +1 -0
  53. package/generated/versions/defold-1.12.4/gui.d.ts +151 -513
  54. package/generated/versions/defold-1.12.4/http.d.ts +4 -2
  55. package/generated/versions/defold-1.12.4/image.d.ts +83 -3
  56. package/generated/versions/defold-1.12.4/index.d.ts +2 -0
  57. package/generated/versions/defold-1.12.4/liveupdate.d.ts +4 -0
  58. package/generated/versions/defold-1.12.4/model.d.ts +4 -5
  59. package/generated/versions/defold-1.12.4/particlefx.d.ts +22 -1
  60. package/generated/versions/defold-1.12.4/physics.d.ts +47 -3
  61. package/generated/versions/defold-1.12.4/render.d.ts +119 -15
  62. package/generated/versions/defold-1.12.4/resource.d.ts +43 -10
  63. package/generated/versions/defold-1.12.4/sprite.d.ts +58 -1
  64. package/generated/versions/defold-1.12.4/sys.d.ts +101 -6
  65. package/generated/versions/defold-1.12.4/tilemap.d.ts +4 -4
  66. package/generated/versions/defold-1.12.4/vmath.d.ts +0 -24
  67. package/generated/versions/defold-1.13.0/buffer.d.ts +8 -8
  68. package/generated/versions/defold-1.13.0/collectionfactory.d.ts +1 -1
  69. package/generated/versions/defold-1.13.0/collectionproxy.d.ts +1 -1
  70. package/generated/versions/defold-1.13.0/factory.d.ts +4 -2
  71. package/generated/versions/defold-1.13.0/go.d.ts +115 -370
  72. package/generated/versions/defold-1.13.0/graphics.d.ts +1 -0
  73. package/generated/versions/defold-1.13.0/gui.d.ts +151 -513
  74. package/generated/versions/defold-1.13.0/http.d.ts +4 -2
  75. package/generated/versions/defold-1.13.0/image.d.ts +83 -3
  76. package/generated/versions/defold-1.13.0/index.d.ts +2 -0
  77. package/generated/versions/defold-1.13.0/liveupdate.d.ts +4 -0
  78. package/generated/versions/defold-1.13.0/material.d.ts +3 -1
  79. package/generated/versions/defold-1.13.0/model.d.ts +4 -5
  80. package/generated/versions/defold-1.13.0/particlefx.d.ts +22 -1
  81. package/generated/versions/defold-1.13.0/physics.d.ts +47 -3
  82. package/generated/versions/defold-1.13.0/render.d.ts +182 -16
  83. package/generated/versions/defold-1.13.0/resource.d.ts +43 -10
  84. package/generated/versions/defold-1.13.0/sprite.d.ts +58 -1
  85. package/generated/versions/defold-1.13.0/sys.d.ts +101 -6
  86. package/generated/versions/defold-1.13.0/tilemap.d.ts +4 -4
  87. package/generated/versions/defold-1.13.0/vmath.d.ts +0 -24
  88. package/generated/versions/defold-1.13.1/buffer.d.ts +8 -8
  89. package/generated/versions/defold-1.13.1/collectionfactory.d.ts +1 -1
  90. package/generated/versions/defold-1.13.1/collectionproxy.d.ts +1 -1
  91. package/generated/versions/defold-1.13.1/factory.d.ts +4 -2
  92. package/generated/versions/defold-1.13.1/go.d.ts +115 -370
  93. package/generated/versions/defold-1.13.1/graphics.d.ts +1 -0
  94. package/generated/versions/defold-1.13.1/gui.d.ts +151 -529
  95. package/generated/versions/defold-1.13.1/http.d.ts +4 -2
  96. package/generated/versions/defold-1.13.1/image.d.ts +83 -3
  97. package/generated/versions/defold-1.13.1/index.d.ts +3 -0
  98. package/generated/versions/defold-1.13.1/liveupdate.d.ts +4 -0
  99. package/generated/versions/defold-1.13.1/material.d.ts +3 -1
  100. package/generated/versions/defold-1.13.1/model.d.ts +4 -5
  101. package/generated/versions/defold-1.13.1/particlefx.d.ts +22 -1
  102. package/generated/versions/defold-1.13.1/physics.d.ts +47 -3
  103. package/generated/versions/defold-1.13.1/render.d.ts +182 -16
  104. package/generated/versions/defold-1.13.1/resource.d.ts +43 -10
  105. package/generated/versions/defold-1.13.1/sprite.d.ts +58 -1
  106. package/generated/versions/defold-1.13.1/sys.d.ts +101 -6
  107. package/generated/versions/defold-1.13.1/tilemap.d.ts +4 -4
  108. package/generated/versions/defold-1.13.1/vmath.d.ts +0 -24
  109. package/generated/versions/defold-1.13.2/b2d_world.d.ts +10 -10
  110. package/generated/versions/defold-1.13.2/buffer.d.ts +9 -9
  111. package/generated/versions/defold-1.13.2/bullet3d_collision_object.d.ts +1 -1
  112. package/generated/versions/defold-1.13.2/bullet3d_constraint.d.ts +109 -7
  113. package/generated/versions/defold-1.13.2/bullet3d_shape.d.ts +2 -2
  114. package/generated/versions/defold-1.13.2/collectionfactory.d.ts +1 -1
  115. package/generated/versions/defold-1.13.2/collectionproxy.d.ts +2 -2
  116. package/generated/versions/defold-1.13.2/factory.d.ts +4 -2
  117. package/generated/versions/defold-1.13.2/go.d.ts +114 -220
  118. package/generated/versions/defold-1.13.2/graphics.d.ts +1 -0
  119. package/generated/versions/defold-1.13.2/gui.d.ts +148 -371
  120. package/generated/versions/defold-1.13.2/http.d.ts +4 -2
  121. package/generated/versions/defold-1.13.2/image.d.ts +56 -4
  122. package/generated/versions/defold-1.13.2/index.d.ts +3 -0
  123. package/generated/versions/defold-1.13.2/liveupdate.d.ts +5 -1
  124. package/generated/versions/defold-1.13.2/material.d.ts +3 -3
  125. package/generated/versions/defold-1.13.2/model.d.ts +4 -5
  126. package/generated/versions/defold-1.13.2/particlefx.d.ts +20 -1
  127. package/generated/versions/defold-1.13.2/physics.d.ts +48 -4
  128. package/generated/versions/defold-1.13.2/render.d.ts +164 -20
  129. package/generated/versions/defold-1.13.2/resource.d.ts +31 -10
  130. package/generated/versions/defold-1.13.2/sprite.d.ts +49 -1
  131. package/generated/versions/defold-1.13.2/sys.d.ts +78 -10
  132. package/generated/versions/defold-1.13.2/tilemap.d.ts +4 -4
  133. package/generated/versions/defold-1.13.2/vmath.d.ts +0 -24
  134. package/generated/versions/defold-1.13.2/window.d.ts +1 -1
  135. package/generated/vmath.d.ts +0 -24
  136. package/generated/window.d.ts +1 -1
  137. package/identity-vocabulary.json +98 -7
  138. package/index.d.ts +3 -0
  139. package/package.json +3 -1
  140. package/scripts/generate-api-availability.ts +6 -22
  141. package/scripts/generate-api-signatures.ts +87 -21
  142. package/scripts/materialize-version.ts +53 -6
  143. package/scripts/regen.ts +256 -44
  144. package/scripts/signature-store-fs.ts +1 -0
  145. package/scripts/target-version.ts +26 -0
  146. package/src/api-doc.ts +26 -0
  147. package/src/component-properties.d.ts +226 -6
  148. package/src/core-types.ts +82 -20
  149. package/src/doc-corrections.ts +53 -5
  150. package/src/emit-dts.ts +1300 -269
  151. package/src/emit-messages.ts +289 -0
  152. package/src/engine-globals.d.ts +8 -2
  153. package/src/go-overloads.d.ts +80 -15
  154. package/src/gui-overloads.d.ts +489 -0
  155. package/src/gui-texture-removal.d.ts +41 -0
  156. package/src/index.ts +2 -0
  157. package/src/lifecycle.ts +46 -37
  158. package/src/luals-type-expr.ts +6 -1
  159. package/src/msg-overloads.d.ts +25 -13
  160. package/src/physics-event-guard.d.ts +39 -0
  161. package/src/render-overloads.d.ts +2 -2
  162. package/src/return-correction-provenance.ts +36 -6
  163. package/src/signature-store.ts +50 -0
  164. package/src/timers.d.ts +2 -1
  165. package/src/vmath-overloads.d.ts +26 -0
  166. package/src/window-event-guard.d.ts +5 -3
@@ -28,37 +28,17 @@ import {
28
28
  } from "../src/emit-dts";
29
29
  import { splitTopLevel } from "../src/luals-type-expr";
30
30
  import { type ApiTarget, loadApiTargets, loadTargetModules } from "./regen";
31
+ import { compareVersions, versionOf } from "./target-version";
31
32
 
32
33
  const PACKAGE_ROOT = resolve(import.meta.dir, "..");
33
34
  const MIGRATIONS_PATH = resolve(PACKAGE_ROOT, "api-migrations.json");
34
35
  const AVAILABILITY_PATH = resolve(PACKAGE_ROOT, "api-availability.json");
35
36
 
36
- const VERSION_FROM_ID = /^defold-(\d+\.\d+\.\d+)$/;
37
-
38
37
  export interface AvailabilityArtifact {
39
38
  readonly versions: readonly string[];
40
39
  readonly records: readonly ApiAvailability[];
41
40
  }
42
41
 
43
- export function versionOf(target: ApiTarget): string {
44
- const match = VERSION_FROM_ID.exec(target.id);
45
- if (!match?.[1]) throw new Error(`cannot derive a release version from target id "${target.id}"`);
46
- return match[1];
47
- }
48
-
49
- function versionTuple(version: string): number[] {
50
- return version.split(".").map((part) => Number.parseInt(part, 10));
51
- }
52
-
53
- function compareVersions(a: string, b: string): number {
54
- const [ta, tb] = [versionTuple(a), versionTuple(b)];
55
- for (let index = 0; index < Math.max(ta.length, tb.length); index += 1) {
56
- const diff = (ta[index] ?? 0) - (tb[index] ?? 0);
57
- if (diff !== 0) return diff;
58
- }
59
- return 0;
60
- }
61
-
62
42
  // Every complete committed surface, newest first. The committed targets are the
63
43
  // `source == null` entries of `api-targets.json` (ref-doc-sourced historical
64
44
  // targets are resolved on demand and never a committed-derivation input). This
@@ -108,7 +88,11 @@ export function identityCorrections(): IdentityCorrections {
108
88
  element,
109
89
  {
110
90
  pins: correctionPins(correction),
111
- replaces: union(correction.ts),
91
+ ...(correction.ts !== undefined
92
+ ? { replaces: union(correction.ts) }
93
+ : correction.nullable
94
+ ? { adds: ["nil"] }
95
+ : { removes: ["nil"] }),
112
96
  ...(correction.slot === undefined ? {} : { slot: correction.slot }),
113
97
  },
114
98
  ]),
@@ -1,15 +1,18 @@
1
1
  import { resolve } from "node:path";
2
2
  import { symbolIdentityKey } from "../src/api-availability";
3
- import type { SlotTypes } from "../src/emit-dts";
4
- import { selectCompleteVersionSurfaces, versionOf } from "./generate-api-availability";
3
+ import type { SlotType, SlotTypes } from "../src/emit-dts";
4
+ import { signatureArmsFor } from "../src/signature-store";
5
+ import { selectCompleteVersionSurfaces } from "./generate-api-availability";
5
6
  import {
6
7
  type ApiTarget,
7
8
  generateModuleSignatures,
8
9
  loadApiTargets,
9
10
  loadTargetModules,
10
11
  type ModuleManifestEntry,
12
+ type TargetBindingOptions,
11
13
  } from "./regen";
12
14
  import { loadSignatureFile } from "./signature-store-fs";
15
+ import { versionOf } from "./target-version";
13
16
 
14
17
  const PACKAGE_ROOT = resolve(import.meta.dir, "..");
15
18
  const SIGNATURES_PATH = resolve(PACKAGE_ROOT, "api-signatures.json");
@@ -28,10 +31,13 @@ export interface SignaturesArtifact {
28
31
  export interface BuildSignaturesOptions {
29
32
  readonly packageRoot?: string;
30
33
  readonly registryPath?: string;
31
- // The constants each target's engine registers, which gate the undocumented
32
- // constant back-fill. Omitted, every target is emitted ungated. Supplied by the
33
- // in-repo callers only: the vendored bindings it reads are not published.
34
- readonly registeredConstantsOf?: (target: ApiTarget) => ReadonlySet<string> | undefined;
34
+ // What each target's engine source decides for its emit (`targetBindingOptions`):
35
+ // the constants it registers, which gate the undocumented constant back-fill,
36
+ // and the binding-pinned return corrections whose pin holds there. Omitted,
37
+ // every target is emitted ungated and with no binding-pinned correction.
38
+ // Supplied by the in-repo callers only: the vendored bindings it reads are not
39
+ // published.
40
+ readonly emitOptionsOf?: (target: ApiTarget) => TargetBindingOptions;
35
41
  }
36
42
 
37
43
  // The authored replacement for a symbol the skip filter withheld, read from the
@@ -39,22 +45,59 @@ export interface BuildSignaturesOptions {
39
45
  // One seam keeps all three artifacts consistent: `overloads-signature-parity`
40
46
  // pins the store to the `src/*-overloads.d.ts` declarations, so folding the
41
47
  // store in cannot drift from the surface a consumer actually compiles against.
42
- function authoredSignature(packageRoot: string, namespace: string, fqn: string): string | null {
48
+ // Only the arms the target's version declares are folded.
49
+ function authoredSignature(
50
+ packageRoot: string,
51
+ namespace: string,
52
+ fqn: string,
53
+ version: string,
54
+ ): string | null {
43
55
  const store = loadSignatureFile(resolve(packageRoot, "signatures", `${namespace}.json`));
44
- const forms = store[fqn]?.signatures ?? [];
56
+ const override = store[fqn];
57
+ const forms = override ? signatureArmsFor(override, version).signatures : [];
45
58
  return forms.length > 0 ? forms.join("\n") : null;
46
59
  }
47
60
 
61
+ interface UnfilteredSurface {
62
+ readonly entries: readonly ModuleManifestEntry[];
63
+ readonly of: ReadonlyMap<ModuleManifestEntry, ModuleManifestEntry>;
64
+ }
65
+
66
+ const unfilteredSurfaces = new WeakMap<readonly ModuleManifestEntry[], UnfilteredSurface>();
67
+
68
+ // The surface with every member's `skipFunctions` cleared, built once per
69
+ // surface: dropping functions moves no type declaration, so it routes exactly
70
+ // as the filtered one does.
71
+ function unfilteredSurfaceOf(surface: readonly ModuleManifestEntry[]): UnfilteredSurface {
72
+ let unfiltered = unfilteredSurfaces.get(surface);
73
+ if (unfiltered === undefined) {
74
+ const of = new Map(surface.map((member) => [member, { ...member, skipFunctions: [] }]));
75
+ unfiltered = { entries: [...of.values()], of };
76
+ unfilteredSurfaces.set(surface, unfiltered);
77
+ }
78
+ return unfiltered;
79
+ }
80
+
48
81
  // The symbols `skipFunctions` removed from this module, as the difference
49
82
  // between the unfiltered and filtered signature emits. Derived rather than
50
83
  // re-matched so the withholding rules stay owned by `prepareGeneratedModule`.
51
- export function withheldSymbols(entry: ModuleManifestEntry): { key: string; fqn: string }[] {
84
+ // Both emits route in `surface`, the modules the entry is emitted beside, so a
85
+ // slot naming a sibling's type resolves in the unfiltered emit too.
86
+ export function withheldSymbols(
87
+ entry: ModuleManifestEntry,
88
+ surface: readonly ModuleManifestEntry[],
89
+ ): { key: string; fqn: string }[] {
52
90
  if ((entry.skipFunctions ?? []).length === 0) return [];
53
91
  const kept = new Set(
54
- generateModuleSignatures(entry).map(({ identity }) => symbolIdentityKey(identity)),
92
+ generateModuleSignatures(entry, { surface }).map(({ identity }) => symbolIdentityKey(identity)),
55
93
  );
94
+ const unfiltered = unfilteredSurfaceOf(surface);
95
+ const self = unfiltered.of.get(entry);
96
+ if (self === undefined) {
97
+ throw new Error(`module "${entry.namespace}" is not a member of the surface it is emitted in`);
98
+ }
56
99
  const withheld: { key: string; fqn: string }[] = [];
57
- for (const { identity } of generateModuleSignatures({ ...entry, skipFunctions: [] })) {
100
+ for (const { identity } of generateModuleSignatures(self, { surface: unfiltered.entries })) {
58
101
  const key = symbolIdentityKey(identity);
59
102
  if (kept.has(key)) continue;
60
103
  const fqn = key.split("\0")[2] as string;
@@ -63,6 +106,18 @@ export function withheldSymbols(entry: ModuleManifestEntry): { key: string; fqn:
63
106
  return withheld;
64
107
  }
65
108
 
109
+ // The slots two arms record identically. One ledger cannot describe arms whose
110
+ // types differ at a slot, so that slot is dropped and its row falls back to the
111
+ // ref-doc token.
112
+ function commonSlots(a: SlotTypes, b: SlotTypes): SlotTypes {
113
+ const common: Record<string, SlotType> = {};
114
+ for (const [slot, record] of Object.entries(a)) {
115
+ const other = b[slot];
116
+ if (other?.type === record.type && other.optional === record.optional) common[slot] = record;
117
+ }
118
+ return common;
119
+ }
120
+
66
121
  function sortObjectKeys<T>(record: Record<string, T>): Record<string, T> {
67
122
  const sorted: Record<string, T> = {};
68
123
  for (const key of Object.keys(record).sort()) sorted[key] = record[key] as T;
@@ -79,13 +134,22 @@ export function buildSignaturesArtifact(options: BuildSignaturesOptions = {}): S
79
134
  const version = versionOf(target);
80
135
  const perSymbol: Record<string, string> = {};
81
136
  const perSymbolSlots: Record<string, SlotTypes> = {};
82
- const registeredConstants = options.registeredConstantsOf?.(target);
83
- for (const entry of loadTargetModules(target, packageRoot)) {
84
- for (const signature of generateModuleSignatures(
85
- entry,
86
- registeredConstants ? { registeredConstants } : undefined,
87
- )) {
137
+ const emitOptions = options.emitOptionsOf?.(target);
138
+ const surface = loadTargetModules(target, packageRoot);
139
+ for (const entry of surface) {
140
+ for (const signature of generateModuleSignatures(entry, emitOptions)) {
88
141
  const key = symbolIdentityKey(signature.identity);
142
+ // Two ref-doc elements can normalize to one identity (the Box2D backend
143
+ // forms of a `b2d.world` query), so each keeps its arms in fixture order
144
+ // and the key keeps only the slots every arm shares.
145
+ const earlier = perSymbol[key];
146
+ if (earlier !== undefined) {
147
+ perSymbol[key] = `${earlier}\n${signature.tsSignature}`;
148
+ const common = commonSlots(perSymbolSlots[key] ?? {}, signature.slotTypes);
149
+ if (Object.keys(common).length > 0) perSymbolSlots[key] = common;
150
+ else delete perSymbolSlots[key];
151
+ continue;
152
+ }
89
153
  perSymbol[key] = signature.tsSignature;
90
154
  if (Object.keys(signature.slotTypes).length > 0) {
91
155
  perSymbolSlots[key] = sortObjectKeys({ ...signature.slotTypes });
@@ -93,8 +157,8 @@ export function buildSignaturesArtifact(options: BuildSignaturesOptions = {}): S
93
157
  }
94
158
  // An authored fold replaces the declaration text wholesale, so whatever
95
159
  // slots the generated emit had recorded no longer describe it.
96
- for (const { key, fqn } of withheldSymbols(entry)) {
97
- const authored = authoredSignature(packageRoot, entry.namespace, fqn);
160
+ for (const { key, fqn } of withheldSymbols(entry, surface)) {
161
+ const authored = authoredSignature(packageRoot, entry.namespace, fqn, version);
98
162
  if (authored !== null) {
99
163
  perSymbol[key] = authored;
100
164
  delete perSymbolSlots[key];
@@ -129,8 +193,10 @@ export function serializeSignaturesArtifact(artifact: SignaturesArtifact): strin
129
193
  }
130
194
 
131
195
  if (import.meta.main) {
132
- const { registeredConstantFqns } = await import("./engine-binding-extract");
133
- const artifact = buildSignaturesArtifact({ registeredConstantsOf: registeredConstantFqns });
196
+ const { targetBindingOptions } = await import("./binding-pin");
197
+ const artifact = buildSignaturesArtifact({
198
+ emitOptionsOf: (target) => targetBindingOptions(target),
199
+ });
134
200
  if (process.argv.includes("--write")) {
135
201
  Bun.write(SIGNATURES_PATH, serializeSignaturesArtifact(artifact));
136
202
  const count = Object.values(artifact.versions).reduce((n, v) => n + Object.keys(v).length, 0);
@@ -2,18 +2,23 @@ import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
3
  import {
4
4
  type ApiTarget,
5
+ GO_INSTANCE_SRC_AUGMENTATIONS,
5
6
  generateBuiltinMessagesDeclaration,
6
7
  generateModuleDeclaration,
7
8
  generateVersionIndex,
9
+ goInstanceFreeSurface,
10
+ goInstanceWalls,
8
11
  KIND_MODULE_MANIFEST,
9
12
  type KindManifestEntry,
10
13
  kindStdlibReferences,
14
+ loadGoInstanceFunctions,
11
15
  loadSrcAugmentations,
12
16
  loadTargetEditorModules,
13
17
  MESSAGES_MANIFEST,
14
18
  type ModuleManifestEntry,
15
19
  type ResolveTargetOptions,
16
20
  resolveTargetModules,
21
+ type TargetBindingOptions,
17
22
  } from "./regen";
18
23
 
19
24
  export {
@@ -40,6 +45,11 @@ export interface RenderMaterializedKindIndexOptions {
40
45
  // the universal set outright — an editor kind is disjoint from the runtime
41
46
  // surface, not a narrowing of it.
42
47
  readonly editorModules?: readonly string[];
48
+ // The universal modules the surface also carries as copies without the
49
+ // functions that need a game object, set when the target records which those
50
+ // are. A kind with no game object imports the copies instead and drops the
51
+ // augmentations marked as needing one; every other kind ignores it.
52
+ readonly goInstanceFreeModules?: readonly string[];
43
53
  }
44
54
 
45
55
  // The installed subpath a materialized kind re-exports its factory from: the
@@ -56,11 +66,21 @@ function installedFactoryModule(entry: KindManifestEntry): string {
56
66
  export function renderMaterializedKindIndex(opts: RenderMaterializedKindIndexOptions): string {
57
67
  const entry = KIND_MODULE_MANIFEST.find((e) => e.kind === opts.kind);
58
68
  if (!entry) throw new Error(`unknown script kind: ${opts.kind}`);
69
+ const freeDir = entry.goInstanceFreeDir;
70
+ const copied =
71
+ freeDir === undefined || opts.goInstanceFreeModules === undefined
72
+ ? null
73
+ : new Set(opts.goInstanceFreeModules);
74
+ const universal = opts.universalModules.filter(
75
+ (mod) => copied === null || !GO_INSTANCE_SRC_AUGMENTATIONS.includes(mod),
76
+ );
59
77
  const modules =
60
78
  entry.only === undefined
61
- ? [...new Set(["engine-globals", ...opts.universalModules])].sort()
79
+ ? [...new Set(["engine-globals", ...universal])].sort()
62
80
  : [...(opts.editorModules ?? [])];
63
- const lines = modules.map((mod) => `import "../${mod}";`);
81
+ const lines = modules.map((mod) =>
82
+ copied?.has(mod) ? `import "../${freeDir}/${mod}";` : `import "../${mod}";`,
83
+ );
64
84
  if (entry.only === undefined && opts.restrictedModule) {
65
85
  lines.push(`import "../${opts.restrictedModule}";`);
66
86
  }
@@ -88,9 +108,15 @@ export interface BuildVersionedSurfaceOptions {
88
108
  // script kind without the generator knowing what a script kind is.
89
109
  readonly excludeModules?: readonly string[];
90
110
  // The hand-authored `src/*` augmentations to carry beside the modules.
91
- // Defaults to reading them from the types package on disk; a caller with no
92
- // filesystem (a Worker) supplies the bytes and gets an identical file map.
111
+ // Defaults to reading the target's set (`srcAugmentationModulesFor`) from the
112
+ // types package on disk; a caller with no filesystem (a Worker) supplies the
113
+ // same bytes and gets an identical file map.
93
114
  readonly augmentations?: readonly VersionedSurfaceFile[];
115
+ // What the target's own engine source decides for its emit
116
+ // (`targetBindingOptions`). Only an in-repo caller rebuilding a vendored
117
+ // target's committed surface passes it; a published install vendors no engine
118
+ // source, and the ref-doc targets it materializes have none to read.
119
+ readonly emitOptions?: TargetBindingOptions;
94
120
  }
95
121
 
96
122
  export interface MaterializeVersionedSurfaceOptions extends BuildVersionedSurfaceOptions {
@@ -136,7 +162,7 @@ export async function buildVersionedSurfaceFiles(
136
162
  ).filter((entry) => kept(entry.outFile));
137
163
 
138
164
  const augmentations = (
139
- opts.augmentations ?? loadSrcAugmentations(opts.resolveOpts?.packageRoot ?? undefined)
165
+ opts.augmentations ?? loadSrcAugmentations(opts.resolveOpts?.packageRoot ?? undefined, target)
140
166
  ).filter((file) => kept(file.path));
141
167
 
142
168
  // Re-rooting an entry makes it a new object no committed manifest holds, so
@@ -148,10 +174,31 @@ export async function buildVersionedSurfaceFiles(
148
174
  (surface) =>
149
175
  surface.map((entry) => ({
150
176
  path: entry.outFile,
151
- contents: generateModuleDeclaration(entry, { surface }).contents,
177
+ contents: generateModuleDeclaration(entry, { ...opts.emitOptions, surface }).contents,
152
178
  })),
153
179
  );
154
180
 
181
+ // A target whose engine source records the functions that need a game object
182
+ // carries, for each kind without one, copies of the modules declaring them
183
+ // with those functions withheld. Nothing else differs, so a target with no
184
+ // record writes no copy.
185
+ const walls = goInstanceWalls(
186
+ modules,
187
+ loadGoInstanceFunctions(target, opts.resolveOpts?.packageRoot ?? undefined),
188
+ );
189
+ for (const kind of KIND_MODULE_MANIFEST) {
190
+ const dir = kind.goInstanceFreeDir;
191
+ if (dir === undefined || walls.size === 0) continue;
192
+ const surface = rerooted(goInstanceFreeSurface(modules, walls, dir).surface);
193
+ for (const entry of surface) {
194
+ if (!entry.outFile.startsWith(`${dir}/`)) continue;
195
+ files.push({
196
+ path: entry.outFile,
197
+ contents: generateModuleDeclaration(entry, { ...opts.emitOptions, surface }).contents,
198
+ });
199
+ }
200
+ }
201
+
155
202
  files.push(...augmentations);
156
203
  files.push({ path: "core-types.d.ts", contents: CORE_TYPES_REEXPORT });
157
204