@defold-typescript/types 0.40.0 → 0.42.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 (224) hide show
  1. package/api-availability.json +3963 -772
  2. package/api-migrations.json +27 -0
  3. package/api-signatures.json +18069 -10240
  4. package/api-targets.json +448 -11
  5. package/examples/translations.json +560 -89
  6. package/fixtures/messages_doc.json +96 -0
  7. package/generated/b2d.d.ts +680 -4
  8. package/generated/b2d_body.d.ts +29 -103
  9. package/generated/b2d_chain.d.ts +5 -6
  10. package/generated/b2d_fixture.d.ts +34 -38
  11. package/generated/b2d_joint.d.ts +503 -25
  12. package/generated/b2d_shape.d.ts +183 -20
  13. package/generated/b2d_world.d.ts +57 -63
  14. package/generated/buffer.d.ts +16 -15
  15. package/generated/builtin-messages.d.ts +7 -1
  16. package/generated/bullet3d.d.ts +91 -0
  17. package/generated/bullet3d_collision_object.d.ts +433 -0
  18. package/generated/bullet3d_constraint.d.ts +818 -0
  19. package/generated/bullet3d_rigid_body.d.ts +429 -0
  20. package/generated/bullet3d_shape.d.ts +123 -0
  21. package/generated/bullet3d_world.d.ts +492 -0
  22. package/generated/camera.d.ts +29 -32
  23. package/generated/collectionfactory.d.ts +15 -18
  24. package/generated/collectionproxy.d.ts +22 -6
  25. package/generated/compute.d.ts +12 -238
  26. package/generated/crash.d.ts +24 -10
  27. package/generated/editor-vm/http.d.ts +90 -7
  28. package/generated/editor-vm/image.d.ts +7 -7
  29. package/generated/editor-vm/json.d.ts +11 -0
  30. package/generated/editor-vm/localization.d.ts +7 -7
  31. package/generated/editor-vm/tilemap_tiles.d.ts +56 -10
  32. package/generated/editor-vm/zip.d.ts +28 -0
  33. package/generated/editor.d.ts +1496 -430
  34. package/generated/factory.d.ts +21 -25
  35. package/generated/font.d.ts +64 -22
  36. package/generated/go.d.ts +235 -182
  37. package/generated/graphics.d.ts +335 -97
  38. package/generated/gui.d.ts +240 -471
  39. package/generated/html5.d.ts +2 -2
  40. package/generated/http.d.ts +28 -35
  41. package/generated/image.d.ts +105 -72
  42. package/generated/json.d.ts +34 -16
  43. package/generated/kinds/gui-script.d.ts +7 -0
  44. package/generated/kinds/render-script.d.ts +7 -0
  45. package/generated/kinds/script.d.ts +7 -0
  46. package/generated/label.d.ts +77 -7
  47. package/generated/liveupdate.d.ts +13 -10
  48. package/generated/material.d.ts +312 -360
  49. package/generated/model.d.ts +40 -39
  50. package/generated/particlefx.d.ts +19 -28
  51. package/generated/physics.d.ts +365 -133
  52. package/generated/profiler.d.ts +13 -23
  53. package/generated/render.d.ts +237 -297
  54. package/generated/resource.d.ts +664 -583
  55. package/generated/socket.d.ts +120 -133
  56. package/generated/sound.d.ts +62 -31
  57. package/generated/sprite.d.ts +31 -17
  58. package/generated/sys.d.ts +234 -190
  59. package/generated/tilemap.d.ts +21 -16
  60. package/generated/timer.d.ts +34 -21
  61. package/generated/versions/defold-1.12.4/b2d_body.d.ts +0 -7
  62. package/generated/versions/defold-1.12.4/buffer.d.ts +1 -3
  63. package/generated/versions/defold-1.12.4/camera.d.ts +21 -21
  64. package/generated/versions/defold-1.12.4/collectionfactory.d.ts +9 -9
  65. package/generated/versions/defold-1.12.4/collectionproxy.d.ts +2 -2
  66. package/generated/versions/defold-1.12.4/crash.d.ts +2 -2
  67. package/generated/versions/defold-1.12.4/factory.d.ts +15 -16
  68. package/generated/versions/defold-1.12.4/go.d.ts +6 -12
  69. package/generated/versions/defold-1.12.4/gui.d.ts +77 -175
  70. package/generated/versions/defold-1.12.4/html5.d.ts +1 -1
  71. package/generated/versions/defold-1.12.4/http.d.ts +0 -13
  72. package/generated/versions/defold-1.12.4/image.d.ts +16 -33
  73. package/generated/versions/defold-1.12.4/index.d.ts +1 -0
  74. package/generated/versions/defold-1.12.4/json.d.ts +10 -6
  75. package/generated/versions/defold-1.12.4/label.d.ts +2 -3
  76. package/generated/versions/defold-1.12.4/liveupdate.d.ts +5 -3
  77. package/generated/versions/defold-1.12.4/model.d.ts +2 -10
  78. package/generated/versions/defold-1.12.4/particlefx.d.ts +2 -5
  79. package/generated/versions/defold-1.12.4/physics.d.ts +69 -67
  80. package/generated/versions/defold-1.12.4/profiler.d.ts +2 -5
  81. package/generated/versions/defold-1.12.4/render.d.ts +99 -128
  82. package/generated/versions/defold-1.12.4/resource.d.ts +120 -148
  83. package/generated/versions/defold-1.12.4/socket.d.ts +34 -60
  84. package/generated/versions/defold-1.12.4/sound.d.ts +8 -8
  85. package/generated/versions/defold-1.12.4/sprite.d.ts +15 -5
  86. package/generated/versions/defold-1.12.4/sys.d.ts +37 -71
  87. package/generated/versions/defold-1.12.4/tilemap.d.ts +18 -11
  88. package/generated/versions/defold-1.12.4/timer.d.ts +5 -3
  89. package/generated/versions/defold-1.12.4/vmath.d.ts +0 -21
  90. package/generated/versions/defold-1.12.4/window.d.ts +1 -16
  91. package/generated/versions/defold-1.13.0/b2d_body.d.ts +10 -55
  92. package/generated/versions/defold-1.13.0/b2d_fixture.d.ts +25 -25
  93. package/generated/versions/defold-1.13.0/b2d_shape.d.ts +169 -8
  94. package/generated/versions/defold-1.13.0/b2d_world.d.ts +16 -10
  95. package/generated/versions/defold-1.13.0/buffer.d.ts +1 -3
  96. package/generated/versions/defold-1.13.0/camera.d.ts +25 -25
  97. package/generated/versions/defold-1.13.0/collectionfactory.d.ts +9 -9
  98. package/generated/versions/defold-1.13.0/collectionproxy.d.ts +2 -2
  99. package/generated/versions/defold-1.13.0/compute.d.ts +0 -69
  100. package/generated/versions/defold-1.13.0/crash.d.ts +2 -2
  101. package/generated/versions/defold-1.13.0/editor-vm/tilemap_tiles.d.ts +3 -3
  102. package/generated/versions/defold-1.13.0/editor.d.ts +34 -24
  103. package/generated/versions/defold-1.13.0/factory.d.ts +15 -16
  104. package/generated/versions/defold-1.13.0/go.d.ts +6 -12
  105. package/generated/versions/defold-1.13.0/graphics.d.ts +73 -37
  106. package/generated/versions/defold-1.13.0/gui.d.ts +77 -175
  107. package/generated/versions/defold-1.13.0/html5.d.ts +1 -1
  108. package/generated/versions/defold-1.13.0/http.d.ts +0 -13
  109. package/generated/versions/defold-1.13.0/image.d.ts +16 -33
  110. package/generated/versions/defold-1.13.0/index.d.ts +1 -0
  111. package/generated/versions/defold-1.13.0/json.d.ts +10 -6
  112. package/generated/versions/defold-1.13.0/label.d.ts +2 -3
  113. package/generated/versions/defold-1.13.0/liveupdate.d.ts +7 -5
  114. package/generated/versions/defold-1.13.0/material.d.ts +68 -106
  115. package/generated/versions/defold-1.13.0/model.d.ts +2 -10
  116. package/generated/versions/defold-1.13.0/particlefx.d.ts +2 -5
  117. package/generated/versions/defold-1.13.0/physics.d.ts +69 -67
  118. package/generated/versions/defold-1.13.0/profiler.d.ts +2 -5
  119. package/generated/versions/defold-1.13.0/render.d.ts +99 -128
  120. package/generated/versions/defold-1.13.0/resource.d.ts +126 -150
  121. package/generated/versions/defold-1.13.0/socket.d.ts +34 -60
  122. package/generated/versions/defold-1.13.0/sound.d.ts +8 -8
  123. package/generated/versions/defold-1.13.0/sprite.d.ts +15 -5
  124. package/generated/versions/defold-1.13.0/sys.d.ts +37 -71
  125. package/generated/versions/defold-1.13.0/tilemap.d.ts +18 -11
  126. package/generated/versions/defold-1.13.0/timer.d.ts +5 -3
  127. package/generated/versions/defold-1.13.0/vmath.d.ts +0 -21
  128. package/generated/versions/defold-1.13.0/window.d.ts +1 -16
  129. package/generated/versions/defold-1.13.1/b2d.d.ts +33 -0
  130. package/generated/versions/defold-1.13.1/b2d_body.d.ts +636 -0
  131. package/generated/versions/defold-1.13.1/b2d_chain.d.ts +106 -0
  132. package/generated/versions/defold-1.13.1/b2d_fixture.d.ts +157 -0
  133. package/generated/versions/defold-1.13.1/b2d_joint.d.ts +823 -0
  134. package/generated/versions/defold-1.13.1/b2d_shape.d.ts +400 -0
  135. package/generated/versions/defold-1.13.1/b2d_world.d.ts +320 -0
  136. package/generated/versions/defold-1.13.1/buffer.d.ts +189 -0
  137. package/generated/versions/defold-1.13.1/camera.d.ts +303 -0
  138. package/generated/versions/defold-1.13.1/collectionfactory.d.ts +151 -0
  139. package/generated/versions/defold-1.13.1/collectionproxy.d.ts +93 -0
  140. package/generated/versions/defold-1.13.1/compute.d.ts +237 -0
  141. package/generated/versions/defold-1.13.1/crash.d.ts +143 -0
  142. package/generated/versions/defold-1.13.1/editor-vm/http.d.ts +56 -0
  143. package/generated/versions/defold-1.13.1/editor-vm/image.d.ts +48 -0
  144. package/generated/versions/defold-1.13.1/editor-vm/json.d.ts +10 -0
  145. package/generated/versions/defold-1.13.1/editor-vm/localization.d.ts +42 -0
  146. package/generated/versions/defold-1.13.1/editor-vm/tilemap_tiles.d.ts +80 -0
  147. package/generated/versions/defold-1.13.1/editor-vm/zip.d.ts +10 -0
  148. package/generated/versions/defold-1.13.1/editor-vm/zlib.d.ts +24 -0
  149. package/generated/versions/defold-1.13.1/editor.d.ts +1121 -0
  150. package/generated/versions/defold-1.13.1/factory.d.ts +124 -0
  151. package/generated/versions/defold-1.13.1/font.d.ts +81 -0
  152. package/generated/versions/defold-1.13.1/go.d.ts +1107 -0
  153. package/generated/versions/defold-1.13.1/graphics.d.ts +411 -0
  154. package/generated/versions/defold-1.13.1/gui.d.ts +2353 -0
  155. package/generated/versions/defold-1.13.1/html5.d.ts +55 -0
  156. package/generated/versions/defold-1.13.1/http.d.ts +77 -0
  157. package/generated/versions/defold-1.13.1/image.d.ts +131 -0
  158. package/generated/versions/defold-1.13.1/index.d.ts +57 -0
  159. package/generated/versions/defold-1.13.1/json.d.ts +80 -0
  160. package/generated/versions/defold-1.13.1/kinds/editor-script.d.ts +14 -0
  161. package/generated/versions/defold-1.13.1/label.d.ts +93 -0
  162. package/generated/versions/defold-1.13.1/liveupdate.d.ts +142 -0
  163. package/generated/versions/defold-1.13.1/material.d.ts +408 -0
  164. package/generated/versions/defold-1.13.1/model.d.ts +272 -0
  165. package/generated/versions/defold-1.13.1/msg.d.ts +10 -0
  166. package/generated/versions/defold-1.13.1/particlefx.d.ts +163 -0
  167. package/generated/versions/defold-1.13.1/physics.d.ts +559 -0
  168. package/generated/versions/defold-1.13.1/profiler.d.ts +235 -0
  169. package/generated/versions/defold-1.13.1/render.d.ts +1190 -0
  170. package/generated/versions/defold-1.13.1/resource.d.ts +1523 -0
  171. package/generated/versions/defold-1.13.1/socket.d.ts +784 -0
  172. package/generated/versions/defold-1.13.1/sound.d.ts +292 -0
  173. package/generated/versions/defold-1.13.1/sprite.d.ts +175 -0
  174. package/generated/versions/defold-1.13.1/sys.d.ts +678 -0
  175. package/generated/versions/defold-1.13.1/tilemap.d.ts +208 -0
  176. package/generated/versions/defold-1.13.1/timer.d.ts +125 -0
  177. package/generated/versions/defold-1.13.1/types.d.ts +61 -0
  178. package/generated/versions/defold-1.13.1/vmath.d.ts +774 -0
  179. package/generated/versions/defold-1.13.1/window.d.ts +183 -0
  180. package/generated/versions/defold-1.13.1/zlib.d.ts +41 -0
  181. package/generated/vmath.d.ts +1 -21
  182. package/generated/window.d.ts +71 -71
  183. package/identity-vocabulary.json +561 -0
  184. package/index.d.ts +7 -0
  185. package/package.json +18 -2
  186. package/scripts/example-store-io.ts +12 -1
  187. package/scripts/extension-goldens.ts +1 -0
  188. package/scripts/fidelity-baseline.json +146 -46
  189. package/scripts/generate-api-availability.ts +90 -12
  190. package/scripts/generate-api-signatures.ts +12 -2
  191. package/scripts/import-defold-release.ts +106 -26
  192. package/scripts/prose-constants.ts +77 -16
  193. package/scripts/regen.ts +391 -77
  194. package/scripts/shared-handle-methods.ts +53 -0
  195. package/scripts/signature-store-fs.ts +1 -0
  196. package/scripts/sync-api-docs.ts +48 -10
  197. package/src/api-availability.ts +0 -0
  198. package/src/api-doc.ts +201 -3
  199. package/src/api-identity.ts +252 -0
  200. package/src/core-types.ts +26 -3
  201. package/src/correction-pins.ts +49 -0
  202. package/src/doc-comment.ts +104 -11
  203. package/src/doc-corrections.ts +108 -0
  204. package/src/editor-vm-globals.d.ts +5 -2
  205. package/src/emit-dts.ts +2064 -281
  206. package/src/emit-messages.ts +52 -0
  207. package/src/example-store.ts +125 -14
  208. package/src/field-correction-coverage.ts +204 -0
  209. package/src/fnv1a.ts +16 -0
  210. package/src/go-overloads.d.ts +25 -6
  211. package/src/index-base-table.ts +145 -0
  212. package/src/index-slot-classifications.ts +588 -0
  213. package/src/index.ts +38 -5
  214. package/src/library-index-slot-classifications.ts +332 -0
  215. package/src/lifecycle.ts +61 -199
  216. package/src/luals-type-expr.ts +354 -0
  217. package/src/msg-overloads.d.ts +0 -1
  218. package/src/param-correction-provenance.ts +8 -11
  219. package/src/render-overloads.d.ts +0 -15
  220. package/src/return-correction-provenance.ts +58 -16
  221. package/src/sys-overloads.d.ts +48 -0
  222. package/src/vmath-overloads.d.ts +27 -1
  223. package/src/window-event-guard.d.ts +6 -9
  224. package/url-parameters.json +1 -2
@@ -1,10 +1,12 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
- import { isKnownDefoldTypeToken } from "../src/emit-dts";
3
+ import { unknownDefoldTypeLeaves } from "../src/emit-dts";
4
4
  import { refDocCacheDir, resolveRefDoc } from "./doc-source";
5
5
  import {
6
6
  apiElementIdentity,
7
7
  EDITOR_MANIFEST,
8
+ type ExtractedFixture,
9
+ extractAnnotationFixtures,
8
10
  IGNORED_UPSTREAM,
9
11
  mergeApiDocs,
10
12
  readZip,
@@ -13,7 +15,8 @@ import {
13
15
  } from "./sync-api-docs";
14
16
 
15
17
  const EXACT_VERSION = /^\d+\.\d+\.\d+$/;
16
- const LUA_NAMESPACE = /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/;
18
+ const LUA_NAMESPACE = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/;
19
+ const DECLARED_NAME_KINDS = new Set(["CONSTANT", "ENUM", "STRUCT", "TYPEDEF", "CLASS"]);
17
20
  const PACKAGE_ROOT = resolve(import.meta.dir, "..");
18
21
 
19
22
  // Editor-scripting namespaces are mapped, but not by `api-targets.json`: they
@@ -24,19 +27,48 @@ const PACKAGE_ROOT = resolve(import.meta.dir, "..");
24
27
  // excusing their bare names would suppress a real runtime namespace instead.
25
28
  const EDITOR_MAPPED_NAMESPACES = new Set(EDITOR_MANIFEST.map((source) => source.namespace));
26
29
 
27
- // The set of namespaces promoted into the generated surface at Defold 1.13.0.
28
- // Held here rather than derived from the root release model because the
30
+ // Namespaces promoted into the generated surface for the first time at a given
31
+ // release. Held here rather than derived from the root release model because the
29
32
  // per-package `rootDir` boundary forbids importing outside this package tree;
30
33
  // `scripts/release-model.test.ts` correspondence-guards this against the model.
31
- export const DEFOLD_1_13_PROMOTED_NAMESPACES = [
32
- "b2d.chain",
33
- "b2d.fixture",
34
- "b2d.joint",
35
- "b2d.shape",
36
- "b2d.world",
37
- "compute",
38
- "material",
39
- ] as const;
34
+ export const PROMOTED_NAMESPACES_BY_VERSION: Readonly<Record<string, readonly string[]>> = {
35
+ "1.13.0": [
36
+ "b2d.chain",
37
+ "b2d.fixture",
38
+ "b2d.joint",
39
+ "b2d.shape",
40
+ "b2d.world",
41
+ "compute",
42
+ "material",
43
+ ],
44
+ "1.13.2": [
45
+ "bullet3d",
46
+ "bullet3d.collision_object",
47
+ "bullet3d.constraint",
48
+ "bullet3d.rigid_body",
49
+ "bullet3d.shape",
50
+ "bullet3d.world",
51
+ ],
52
+ };
53
+
54
+ function compareVersions(a: string, b: string): number {
55
+ const pa = a.split(".").map(Number);
56
+ const pb = b.split(".").map(Number);
57
+ for (let index = 0; index < Math.max(pa.length, pb.length); index += 1) {
58
+ const delta = (pa[index] ?? 0) - (pb[index] ?? 0);
59
+ if (delta !== 0) return delta;
60
+ }
61
+ return 0;
62
+ }
63
+
64
+ // A baseline that predates a promotion has no fixture for the promoted namespace,
65
+ // so the import of the promoting release, and of every later one, seeds it empty.
66
+ export function promotedNamespacesThrough(version: string): string[] {
67
+ return Object.keys(PROMOTED_NAMESPACES_BY_VERSION)
68
+ .filter((release) => compareVersions(release, version) <= 0)
69
+ .sort(compareVersions)
70
+ .flatMap((release) => PROMOTED_NAMESPACES_BY_VERSION[release] ?? []);
71
+ }
40
72
 
41
73
  interface RawElement extends Record<string, unknown> {
42
74
  type?: string;
@@ -123,6 +155,9 @@ export interface ReleaseImportManifest {
123
155
  readonly unknownTypes: UnknownTypeBlocker[];
124
156
  readonly unmappedFunctionNamespaces: UnmappedNamespaceBlocker[];
125
157
  };
158
+ // The file names vendored under `annotations/`, which `loadAnnotations` holds
159
+ // the directory to. Empty before 1.13.2; absent from manifests written earlier.
160
+ readonly annotationFiles: readonly string[];
126
161
  readonly snapshots: Array<{
127
162
  readonly namespace: string;
128
163
  readonly fixture: string;
@@ -134,6 +169,8 @@ export interface ReleaseImportManifest {
134
169
  export type ReleaseImportPlan = Omit<ReleaseImportManifest, "snapshots"> & {
135
170
  readonly manifest: ReleaseImportManifest;
136
171
  readonly snapshots: ReleaseImportSnapshot[];
172
+ // The release's LuaLS annotation files, vendored verbatim. Empty before 1.13.2.
173
+ readonly annotations: ExtractedFixture[];
137
174
  };
138
175
 
139
176
  function isRecord(value: unknown): value is Record<string, unknown> {
@@ -159,12 +196,26 @@ function elementsOf(doc: unknown): RawElement[] {
159
196
  return doc.elements.filter(isRecord) as RawElement[];
160
197
  }
161
198
 
199
+ // An ENUM's members are the constants 1.13.1 and earlier documented as
200
+ // top-level CONSTANT elements, so each counts as a symbol beside the enum itself.
162
201
  function symbolNames(doc: unknown): string[] {
163
202
  return [
164
- ...new Set(elementsOf(doc).flatMap((element) => (element.name ? [element.name] : []))),
203
+ ...new Set(
204
+ elementsOf(doc).flatMap((element) => [
205
+ ...(element.name ? [element.name] : []),
206
+ ...enumMemberNames(element),
207
+ ]),
208
+ ),
165
209
  ].sort();
166
210
  }
167
211
 
212
+ function enumMemberNames(element: RawElement): string[] {
213
+ if (element.type !== "ENUM" || !Array.isArray(element.members)) return [];
214
+ return element.members.flatMap((member) =>
215
+ isRecord(member) && typeof member.name === "string" ? [member.name] : [],
216
+ );
217
+ }
218
+
168
219
  function expectedSourceEntries(module: ReleaseBaselineModule): string[] {
169
220
  if (module.sourceEntries) return [...module.sourceEntries].sort();
170
221
  const mapped = SYNC_MANIFEST.find((entry) => entry.namespace === module.namespace);
@@ -180,29 +231,44 @@ function typeTokens(value: unknown, out: Set<string>): void {
180
231
  if (!isRecord(value)) return;
181
232
  if (Array.isArray(value.types)) {
182
233
  for (const token of value.types) {
183
- if (typeof token === "string" && !isKnownDefoldTypeToken(token)) out.add(token);
234
+ if (typeof token === "string") addUnknownLeaves(token, out);
235
+ }
236
+ }
237
+ // A STRUCT member carries one `type` string rather than a `types[]` list; an
238
+ // ENUM member's is empty.
239
+ if (Array.isArray(value.members)) {
240
+ for (const member of value.members) {
241
+ if (isRecord(member) && typeof member.type === "string" && member.type !== "") {
242
+ addUnknownLeaves(member.type, out);
243
+ }
184
244
  }
185
245
  }
186
246
  for (const nested of Object.values(value)) typeTokens(nested, out);
187
247
  }
188
248
 
249
+ function addUnknownLeaves(token: string, out: Set<string>): void {
250
+ for (const leaf of unknownDefoldTypeLeaves(token)) out.add(leaf);
251
+ }
252
+
189
253
  function unknownTypeBlockers(
190
254
  namespace: string,
191
255
  doc: unknown,
192
- knownConstants: ReadonlySet<string>,
256
+ knownNames: ReadonlySet<string>,
193
257
  ): UnknownTypeBlocker[] {
194
258
  const out: UnknownTypeBlocker[] = [];
195
259
  for (const element of elementsOf(doc)) {
196
260
  const tokens = new Set<string>();
197
261
  typeTokens(element, tokens);
198
- for (const token of knownConstants) tokens.delete(token);
262
+ for (const token of tokens) if (knownNames.has(token)) tokens.delete(token);
199
263
  if (tokens.size === 0) continue;
200
264
  out.push({ namespace, symbol: element.name ?? "<unnamed>", tokens: [...tokens].sort() });
201
265
  }
202
266
  return out;
203
267
  }
204
268
 
205
- function reportWithoutSnapshots(plan: Omit<ReleaseImportPlan, "manifest">): ReleaseImportManifest {
269
+ function reportWithoutSnapshots(
270
+ plan: Omit<ReleaseImportPlan, "manifest" | "annotations">,
271
+ ): ReleaseImportManifest {
206
272
  return {
207
273
  version: plan.version,
208
274
  baseline: plan.baseline,
@@ -212,6 +278,7 @@ function reportWithoutSnapshots(plan: Omit<ReleaseImportPlan, "manifest">): Rele
212
278
  moved: plan.moved,
213
279
  symbols: plan.symbols,
214
280
  blockers: plan.blockers,
281
+ annotationFiles: plan.annotationFiles,
215
282
  snapshots: plan.snapshots.map(({ namespace, fixture, sourceEntries, symbolSources }) => ({
216
283
  namespace,
217
284
  fixture,
@@ -264,13 +331,17 @@ export function buildReleaseImportPlan(input: {
264
331
  };
265
332
  });
266
333
 
267
- const knownConstants = new Set<string>();
334
+ // Every constant and declared type name in any of the release's Lua docs, so a
335
+ // token naming one declared in another namespace, or only in a doc no namespace
336
+ // maps (`builtins`), is not an unknown type.
337
+ const knownNames = new Set<string>();
268
338
  for (const group of grouped.values()) {
269
339
  for (const { doc } of group) {
270
340
  for (const element of elementsOf(doc)) {
271
- if (element.type === "CONSTANT" && typeof element.name === "string") {
272
- knownConstants.add(element.name);
341
+ if (typeof element.name === "string" && DECLARED_NAME_KINDS.has(element.type ?? "")) {
342
+ knownNames.add(element.name);
273
343
  }
344
+ for (const member of enumMemberNames(element)) knownNames.add(member);
274
345
  }
275
346
  }
276
347
  }
@@ -325,7 +396,7 @@ export function buildReleaseImportPlan(input: {
325
396
  if (added.length > 0 || removed.length > 0)
326
397
  symbols.push({ namespace: module.namespace, added, removed });
327
398
  if (generatedNamespaces.has(module.namespace)) {
328
- unknownTypes.push(...unknownTypeBlockers(module.namespace, doc, knownConstants));
399
+ unknownTypes.push(...unknownTypeBlockers(module.namespace, doc, knownNames));
329
400
  }
330
401
  }
331
402
 
@@ -356,6 +427,7 @@ export function buildReleaseImportPlan(input: {
356
427
  (a, b) => a.namespace.localeCompare(b.namespace) || a.symbol.localeCompare(b.symbol),
357
428
  );
358
429
  const ready = unknownTypes.length === 0 && unmappedFunctionNamespaces.length === 0;
430
+ const annotations = extractAnnotationFixtures(input.zip);
359
431
  const planBase = {
360
432
  version: input.version,
361
433
  baseline: input.baseline.id,
@@ -365,10 +437,11 @@ export function buildReleaseImportPlan(input: {
365
437
  moved,
366
438
  symbols,
367
439
  blockers: { unknownTypes, unmappedFunctionNamespaces },
440
+ annotationFiles: annotations.map((annotation) => annotation.namespace).sort(),
368
441
  snapshots,
369
442
  };
370
443
  const manifest = reportWithoutSnapshots(planBase);
371
- return { ...planBase, manifest };
444
+ return { ...planBase, manifest, annotations };
372
445
  }
373
446
 
374
447
  export function releaseImportReportJson(plan: ReleaseImportPlan): string {
@@ -387,6 +460,13 @@ export function applyReleaseImport(plan: ReleaseImportPlan, packageRoot = PACKAG
387
460
  writeFileSync(path, `${JSON.stringify(snapshot.doc, null, 2)}\n`);
388
461
  written.push(relative);
389
462
  }
463
+ for (const annotation of plan.annotations) {
464
+ const relative = `${relativeRoot}/${annotation.fixture}`;
465
+ const path = resolve(packageRoot, relative);
466
+ mkdirSync(dirname(path), { recursive: true });
467
+ writeFileSync(path, annotation.contents);
468
+ written.push(relative);
469
+ }
390
470
  // The prefixless builtins (`hash`, `pprint`, ...) are hand-vendored rather than
391
471
  // generated, so no upstream snapshot carries them. Seeding the canonical copy
392
472
  // here is what keeps a newly imported target from being born without a globals
@@ -442,7 +522,7 @@ export function parseReleaseImportArgs(args: readonly string[]): ReleaseImportAr
442
522
  return { version, check, json, ...(zipPath ? { zipPath } : {}) };
443
523
  }
444
524
 
445
- function loadBaseline(packageRoot = PACKAGE_ROOT): ReleaseBaseline {
525
+ function loadBaseline(version: string, packageRoot = PACKAGE_ROOT): ReleaseBaseline {
446
526
  const registry = JSON.parse(readFileSync(resolve(packageRoot, "api-targets.json"), "utf8")) as {
447
527
  targets: Array<{
448
528
  id: string;
@@ -461,7 +541,7 @@ function loadBaseline(packageRoot = PACKAGE_ROOT): ReleaseBaseline {
461
541
  const modules = target.modules
462
542
  .filter((module) => SYNC_MANIFEST.some((source) => source.namespace === module.namespace))
463
543
  .map(load);
464
- for (const namespace of DEFOLD_1_13_PROMOTED_NAMESPACES) {
544
+ for (const namespace of promotedNamespacesThrough(version)) {
465
545
  if (modules.some((module) => module.namespace === namespace)) continue;
466
546
  modules.push({
467
547
  namespace,
@@ -485,7 +565,7 @@ if (import.meta.main) {
485
565
  const plan = buildReleaseImportPlan({
486
566
  version: args.version,
487
567
  zip: resolved.zip,
488
- baseline: loadBaseline(),
568
+ baseline: loadBaseline(args.version),
489
569
  });
490
570
  if (args.json) process.stdout.write(releaseImportReportJson(plan));
491
571
  else {
@@ -1,8 +1,10 @@
1
1
  import type { ModuleManifestEntry } from "./regen";
2
2
 
3
- // A constant family the engine registers and one function's parameter prose
4
- // lists, but no ref-doc element declares. Each release's own list is the
5
- // evidence, so a surface declares exactly the members its release documents.
3
+ // A constant family the engine registers and one function's prose names, but no
4
+ // ref-doc element declares. Each release's own prose is the evidence, so a
5
+ // surface declares exactly the members its release documents; the engine-binding
6
+ // diff keeps every member registered. The prose is a parameter's `<li>` list, or,
7
+ // with no `parameter`, a `<code>` mention in the function's description.
6
8
  interface ProseConstantFamily {
7
9
  readonly namespace: string;
8
10
  readonly prefix: string;
@@ -10,27 +12,55 @@ interface ProseConstantFamily {
10
12
  readonly evidence: {
11
13
  readonly namespace: string;
12
14
  readonly function: string;
13
- readonly parameter: string;
15
+ readonly parameter?: string;
14
16
  };
15
17
  }
16
18
 
19
+ const VERTEX_ATTRIBUTES = {
20
+ namespace: "material",
21
+ function: "material.set_vertex_attributes",
22
+ parameter: "attributes",
23
+ } as const;
24
+
17
25
  const PROSE_CONSTANT_FAMILIES: readonly ProseConstantFamily[] = [
18
26
  {
19
27
  namespace: "graphics",
20
28
  prefix: "SEMANTIC_TYPE_",
21
29
  describes: "Vertex attribute semantic type",
22
- evidence: {
23
- namespace: "material",
24
- function: "material.set_vertex_attributes",
25
- parameter: "attributes",
26
- },
30
+ evidence: VERTEX_ATTRIBUTES,
31
+ },
32
+ {
33
+ namespace: "graphics",
34
+ prefix: "DATA_TYPE_",
35
+ describes: "Vertex attribute data type",
36
+ evidence: VERTEX_ATTRIBUTES,
37
+ },
38
+ {
39
+ namespace: "graphics",
40
+ prefix: "COORDINATE_SPACE_",
41
+ describes: "Vertex attribute coordinate space",
42
+ evidence: VERTEX_ATTRIBUTES,
43
+ },
44
+ {
45
+ namespace: "material",
46
+ prefix: "CONSTANT_TYPE_",
47
+ describes: "Material constant type",
48
+ evidence: { namespace: "material", function: "material.set_constants", parameter: "constants" },
49
+ },
50
+ {
51
+ namespace: "render",
52
+ prefix: "TEXTURE_BIT",
53
+ describes: "Render target buffer flag that samples a depth or stencil buffer as a texture",
54
+ evidence: { namespace: "render", function: "render.render_target" },
27
55
  },
28
56
  ];
29
57
 
30
58
  interface DocElement {
31
59
  readonly type: string;
32
60
  readonly name: string;
61
+ readonly description?: string;
33
62
  readonly parameters?: readonly { readonly name: string; readonly doc?: string }[];
63
+ readonly members?: readonly { readonly name: string }[];
34
64
  }
35
65
 
36
66
  interface ApiDoc {
@@ -41,15 +71,36 @@ function escapeRegExp(text: string): string {
41
71
  return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
42
72
  }
43
73
 
44
- function evidencedNames(family: ProseConstantFamily, modules: readonly ModuleManifestEntry[]) {
74
+ function evidenceFunction(
75
+ family: ProseConstantFamily,
76
+ modules: readonly ModuleManifestEntry[],
77
+ ): DocElement | undefined {
45
78
  const source = modules.find((m) => m.namespace === family.evidence.namespace);
46
- if (!source) return [];
47
- const fn = (source.doc as ApiDoc).elements.find(
79
+ return (source?.doc as ApiDoc | undefined)?.elements.find(
48
80
  (e) => e.type === "FUNCTION" && e.name === family.evidence.function,
49
81
  );
50
- const prose = fn?.parameters?.find((p) => p.name === family.evidence.parameter)?.doc ?? "";
82
+ }
83
+
84
+ // A release may declare the family itself, as `CONSTANT`s or `ENUM` members.
85
+ function declaresFamily(family: ProseConstantFamily, modules: readonly ModuleManifestEntry[]) {
86
+ const target = modules.find((m) => m.namespace === family.namespace);
87
+ const prefix = `${family.namespace}.${family.prefix}`;
88
+ return ((target?.doc as ApiDoc | undefined)?.elements ?? []).some(
89
+ (e) =>
90
+ e.name.startsWith(prefix) ||
91
+ (e.members ?? []).some((member) => member.name.startsWith(prefix)),
92
+ );
93
+ }
94
+
95
+ function evidencedNames(family: ProseConstantFamily, fn: DocElement | undefined) {
96
+ const { parameter } = family.evidence;
97
+ const prose =
98
+ parameter === undefined
99
+ ? (fn?.description ?? "")
100
+ : (fn?.parameters?.find((p) => p.name === parameter)?.doc ?? "");
101
+ const name = escapeRegExp(`${family.namespace}.${family.prefix}`);
51
102
  const item = new RegExp(
52
- `<li><code>(${escapeRegExp(`${family.namespace}.${family.prefix}`)}\\w+)</code></li>`,
103
+ parameter === undefined ? `<code>(${name}\\w*)</code>` : `<li><code>(${name}\\w+)</code></li>`,
53
104
  "g",
54
105
  );
55
106
  return [...new Set(Array.from(prose.matchAll(item), (m) => m[1] as string))];
@@ -78,8 +129,18 @@ export function synthesizeProseConstants(
78
129
  ): ModuleManifestEntry[] {
79
130
  let out = [...modules];
80
131
  for (const family of PROSE_CONSTANT_FAMILIES) {
81
- const names = evidencedNames(family, out);
82
- if (names.length === 0) continue;
132
+ const fn = evidenceFunction(family, out);
133
+ const names = evidencedNames(family, fn);
134
+ if (names.length === 0) {
135
+ // The evidence function survives but its prose lists no member: unless the
136
+ // release declares the family itself, the constants would vanish unannounced.
137
+ if (fn !== undefined && !declaresFamily(family, out)) {
138
+ throw new Error(
139
+ `prose constant family ${family.namespace}.${family.prefix}*: ${family.evidence.function} lists no member and ${family.namespace} declares none`,
140
+ );
141
+ }
142
+ continue;
143
+ }
83
144
  const index = out.findIndex((m) => m.namespace === family.namespace);
84
145
  const target = out[index];
85
146
  if (!target) continue;