@defold-typescript/types 0.40.0 → 0.41.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 +13 -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 +85 -24
  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 +16 -5
  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,6 +1,6 @@
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,
@@ -13,7 +13,8 @@ import {
13
13
  } from "./sync-api-docs";
14
14
 
15
15
  const EXACT_VERSION = /^\d+\.\d+\.\d+$/;
16
- const LUA_NAMESPACE = /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/;
16
+ const LUA_NAMESPACE = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/;
17
+ const DECLARED_NAME_KINDS = new Set(["CONSTANT", "ENUM", "STRUCT", "TYPEDEF", "CLASS"]);
17
18
  const PACKAGE_ROOT = resolve(import.meta.dir, "..");
18
19
 
19
20
  // Editor-scripting namespaces are mapped, but not by `api-targets.json`: they
@@ -24,19 +25,48 @@ const PACKAGE_ROOT = resolve(import.meta.dir, "..");
24
25
  // excusing their bare names would suppress a real runtime namespace instead.
25
26
  const EDITOR_MAPPED_NAMESPACES = new Set(EDITOR_MANIFEST.map((source) => source.namespace));
26
27
 
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
28
+ // Namespaces promoted into the generated surface for the first time at a given
29
+ // release. Held here rather than derived from the root release model because the
29
30
  // per-package `rootDir` boundary forbids importing outside this package tree;
30
31
  // `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;
32
+ export const PROMOTED_NAMESPACES_BY_VERSION: Readonly<Record<string, readonly string[]>> = {
33
+ "1.13.0": [
34
+ "b2d.chain",
35
+ "b2d.fixture",
36
+ "b2d.joint",
37
+ "b2d.shape",
38
+ "b2d.world",
39
+ "compute",
40
+ "material",
41
+ ],
42
+ "1.13.2": [
43
+ "bullet3d",
44
+ "bullet3d.collision_object",
45
+ "bullet3d.constraint",
46
+ "bullet3d.rigid_body",
47
+ "bullet3d.shape",
48
+ "bullet3d.world",
49
+ ],
50
+ };
51
+
52
+ function compareVersions(a: string, b: string): number {
53
+ const pa = a.split(".").map(Number);
54
+ const pb = b.split(".").map(Number);
55
+ for (let index = 0; index < Math.max(pa.length, pb.length); index += 1) {
56
+ const delta = (pa[index] ?? 0) - (pb[index] ?? 0);
57
+ if (delta !== 0) return delta;
58
+ }
59
+ return 0;
60
+ }
61
+
62
+ // A baseline that predates a promotion has no fixture for the promoted namespace,
63
+ // so the import of the promoting release, and of every later one, seeds it empty.
64
+ export function promotedNamespacesThrough(version: string): string[] {
65
+ return Object.keys(PROMOTED_NAMESPACES_BY_VERSION)
66
+ .filter((release) => compareVersions(release, version) <= 0)
67
+ .sort(compareVersions)
68
+ .flatMap((release) => PROMOTED_NAMESPACES_BY_VERSION[release] ?? []);
69
+ }
40
70
 
41
71
  interface RawElement extends Record<string, unknown> {
42
72
  type?: string;
@@ -159,12 +189,26 @@ function elementsOf(doc: unknown): RawElement[] {
159
189
  return doc.elements.filter(isRecord) as RawElement[];
160
190
  }
161
191
 
192
+ // An ENUM's members are the constants 1.13.1 and earlier documented as
193
+ // top-level CONSTANT elements, so each counts as a symbol beside the enum itself.
162
194
  function symbolNames(doc: unknown): string[] {
163
195
  return [
164
- ...new Set(elementsOf(doc).flatMap((element) => (element.name ? [element.name] : []))),
196
+ ...new Set(
197
+ elementsOf(doc).flatMap((element) => [
198
+ ...(element.name ? [element.name] : []),
199
+ ...enumMemberNames(element),
200
+ ]),
201
+ ),
165
202
  ].sort();
166
203
  }
167
204
 
205
+ function enumMemberNames(element: RawElement): string[] {
206
+ if (element.type !== "ENUM" || !Array.isArray(element.members)) return [];
207
+ return element.members.flatMap((member) =>
208
+ isRecord(member) && typeof member.name === "string" ? [member.name] : [],
209
+ );
210
+ }
211
+
168
212
  function expectedSourceEntries(module: ReleaseBaselineModule): string[] {
169
213
  if (module.sourceEntries) return [...module.sourceEntries].sort();
170
214
  const mapped = SYNC_MANIFEST.find((entry) => entry.namespace === module.namespace);
@@ -180,22 +224,35 @@ function typeTokens(value: unknown, out: Set<string>): void {
180
224
  if (!isRecord(value)) return;
181
225
  if (Array.isArray(value.types)) {
182
226
  for (const token of value.types) {
183
- if (typeof token === "string" && !isKnownDefoldTypeToken(token)) out.add(token);
227
+ if (typeof token === "string") addUnknownLeaves(token, out);
228
+ }
229
+ }
230
+ // A STRUCT member carries one `type` string rather than a `types[]` list; an
231
+ // ENUM member's is empty.
232
+ if (Array.isArray(value.members)) {
233
+ for (const member of value.members) {
234
+ if (isRecord(member) && typeof member.type === "string" && member.type !== "") {
235
+ addUnknownLeaves(member.type, out);
236
+ }
184
237
  }
185
238
  }
186
239
  for (const nested of Object.values(value)) typeTokens(nested, out);
187
240
  }
188
241
 
242
+ function addUnknownLeaves(token: string, out: Set<string>): void {
243
+ for (const leaf of unknownDefoldTypeLeaves(token)) out.add(leaf);
244
+ }
245
+
189
246
  function unknownTypeBlockers(
190
247
  namespace: string,
191
248
  doc: unknown,
192
- knownConstants: ReadonlySet<string>,
249
+ knownNames: ReadonlySet<string>,
193
250
  ): UnknownTypeBlocker[] {
194
251
  const out: UnknownTypeBlocker[] = [];
195
252
  for (const element of elementsOf(doc)) {
196
253
  const tokens = new Set<string>();
197
254
  typeTokens(element, tokens);
198
- for (const token of knownConstants) tokens.delete(token);
255
+ for (const token of tokens) if (knownNames.has(token)) tokens.delete(token);
199
256
  if (tokens.size === 0) continue;
200
257
  out.push({ namespace, symbol: element.name ?? "<unnamed>", tokens: [...tokens].sort() });
201
258
  }
@@ -264,13 +321,17 @@ export function buildReleaseImportPlan(input: {
264
321
  };
265
322
  });
266
323
 
267
- const knownConstants = new Set<string>();
324
+ // Every constant and declared type name in any of the release's Lua docs, so a
325
+ // token naming one declared in another namespace, or only in a doc no namespace
326
+ // maps (`builtins`), is not an unknown type.
327
+ const knownNames = new Set<string>();
268
328
  for (const group of grouped.values()) {
269
329
  for (const { doc } of group) {
270
330
  for (const element of elementsOf(doc)) {
271
- if (element.type === "CONSTANT" && typeof element.name === "string") {
272
- knownConstants.add(element.name);
331
+ if (typeof element.name === "string" && DECLARED_NAME_KINDS.has(element.type ?? "")) {
332
+ knownNames.add(element.name);
273
333
  }
334
+ for (const member of enumMemberNames(element)) knownNames.add(member);
274
335
  }
275
336
  }
276
337
  }
@@ -325,7 +386,7 @@ export function buildReleaseImportPlan(input: {
325
386
  if (added.length > 0 || removed.length > 0)
326
387
  symbols.push({ namespace: module.namespace, added, removed });
327
388
  if (generatedNamespaces.has(module.namespace)) {
328
- unknownTypes.push(...unknownTypeBlockers(module.namespace, doc, knownConstants));
389
+ unknownTypes.push(...unknownTypeBlockers(module.namespace, doc, knownNames));
329
390
  }
330
391
  }
331
392
 
@@ -442,7 +503,7 @@ export function parseReleaseImportArgs(args: readonly string[]): ReleaseImportAr
442
503
  return { version, check, json, ...(zipPath ? { zipPath } : {}) };
443
504
  }
444
505
 
445
- function loadBaseline(packageRoot = PACKAGE_ROOT): ReleaseBaseline {
506
+ function loadBaseline(version: string, packageRoot = PACKAGE_ROOT): ReleaseBaseline {
446
507
  const registry = JSON.parse(readFileSync(resolve(packageRoot, "api-targets.json"), "utf8")) as {
447
508
  targets: Array<{
448
509
  id: string;
@@ -461,7 +522,7 @@ function loadBaseline(packageRoot = PACKAGE_ROOT): ReleaseBaseline {
461
522
  const modules = target.modules
462
523
  .filter((module) => SYNC_MANIFEST.some((source) => source.namespace === module.namespace))
463
524
  .map(load);
464
- for (const namespace of DEFOLD_1_13_PROMOTED_NAMESPACES) {
525
+ for (const namespace of promotedNamespacesThrough(version)) {
465
526
  if (modules.some((module) => module.namespace === namespace)) continue;
466
527
  modules.push({
467
528
  namespace,
@@ -485,7 +546,7 @@ if (import.meta.main) {
485
546
  const plan = buildReleaseImportPlan({
486
547
  version: args.version,
487
548
  zip: resolved.zip,
488
- baseline: loadBaseline(),
549
+ baseline: loadBaseline(args.version),
489
550
  });
490
551
  if (args.json) process.stdout.write(releaseImportReportJson(plan));
491
552
  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;