@defold-typescript/types 0.39.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 (227) hide show
  1. package/api-availability.json +4024 -716
  2. package/api-migrations.json +27 -0
  3. package/api-signatures.json +18118 -10264
  4. package/api-targets.json +448 -11
  5. package/examples/translations.json +619 -148
  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 +199 -14
  13. package/generated/b2d_world.d.ts +57 -63
  14. package/generated/buffer.d.ts +33 -29
  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 +31 -34
  23. package/generated/collectionfactory.d.ts +26 -27
  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 +243 -186
  37. package/generated/graphics.d.ts +374 -84
  38. package/generated/gui.d.ts +282 -492
  39. package/generated/html5.d.ts +5 -3
  40. package/generated/http.d.ts +31 -36
  41. package/generated/image.d.ts +127 -85
  42. package/generated/json.d.ts +34 -16
  43. package/generated/kinds/gui-script.d.ts +8 -0
  44. package/generated/kinds/render-script.d.ts +8 -0
  45. package/generated/kinds/script.d.ts +8 -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 +72 -42
  50. package/generated/particlefx.d.ts +19 -28
  51. package/generated/physics.d.ts +378 -144
  52. package/generated/profiler.d.ts +14 -24
  53. package/generated/render.d.ts +294 -297
  54. package/generated/resource.d.ts +753 -641
  55. package/generated/socket.d.ts +131 -134
  56. package/generated/sound.d.ts +65 -34
  57. package/generated/sprite.d.ts +39 -17
  58. package/generated/sys.d.ts +237 -182
  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 +18 -17
  63. package/generated/versions/defold-1.12.4/camera.d.ts +23 -23
  64. package/generated/versions/defold-1.12.4/collectionfactory.d.ts +21 -19
  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 +15 -17
  69. package/generated/versions/defold-1.12.4/gui.d.ts +111 -193
  70. package/generated/versions/defold-1.12.4/html5.d.ts +4 -2
  71. package/generated/versions/defold-1.12.4/http.d.ts +4 -15
  72. package/generated/versions/defold-1.12.4/image.d.ts +38 -46
  73. package/generated/versions/defold-1.12.4/index.d.ts +2 -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 +34 -13
  78. package/generated/versions/defold-1.12.4/particlefx.d.ts +2 -5
  79. package/generated/versions/defold-1.12.4/physics.d.ts +82 -78
  80. package/generated/versions/defold-1.12.4/profiler.d.ts +3 -6
  81. package/generated/versions/defold-1.12.4/render.d.ts +160 -132
  82. package/generated/versions/defold-1.12.4/resource.d.ts +212 -209
  83. package/generated/versions/defold-1.12.4/socket.d.ts +45 -61
  84. package/generated/versions/defold-1.12.4/sound.d.ts +11 -11
  85. package/generated/versions/defold-1.12.4/sprite.d.ts +24 -6
  86. package/generated/versions/defold-1.12.4/sys.d.ts +45 -68
  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 +5 -26
  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 +188 -5
  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 +18 -17
  96. package/generated/versions/defold-1.13.0/camera.d.ts +27 -27
  97. package/generated/versions/defold-1.13.0/collectionfactory.d.ts +21 -19
  98. package/generated/versions/defold-1.13.0/collectionproxy.d.ts +2 -2
  99. package/generated/versions/defold-1.13.0/compute.d.ts +1 -70
  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 +15 -17
  105. package/generated/versions/defold-1.13.0/graphics.d.ts +121 -37
  106. package/generated/versions/defold-1.13.0/gui.d.ts +111 -193
  107. package/generated/versions/defold-1.13.0/html5.d.ts +4 -2
  108. package/generated/versions/defold-1.13.0/http.d.ts +4 -15
  109. package/generated/versions/defold-1.13.0/image.d.ts +38 -46
  110. package/generated/versions/defold-1.13.0/index.d.ts +2 -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 +69 -107
  115. package/generated/versions/defold-1.13.0/model.d.ts +34 -13
  116. package/generated/versions/defold-1.13.0/particlefx.d.ts +2 -5
  117. package/generated/versions/defold-1.13.0/physics.d.ts +82 -78
  118. package/generated/versions/defold-1.13.0/profiler.d.ts +3 -6
  119. package/generated/versions/defold-1.13.0/render.d.ts +160 -132
  120. package/generated/versions/defold-1.13.0/resource.d.ts +217 -210
  121. package/generated/versions/defold-1.13.0/socket.d.ts +45 -61
  122. package/generated/versions/defold-1.13.0/sound.d.ts +11 -11
  123. package/generated/versions/defold-1.13.0/sprite.d.ts +24 -6
  124. package/generated/versions/defold-1.13.0/sys.d.ts +45 -68
  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 +5 -26
  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 +6 -26
  182. package/generated/window.d.ts +71 -71
  183. package/identity-vocabulary.json +561 -0
  184. package/index.d.ts +8 -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 +14 -3
  191. package/scripts/import-defold-release.ts +85 -24
  192. package/scripts/prose-constants.ts +157 -0
  193. package/scripts/regen.ts +396 -78
  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/component-properties.d.ts +33 -0
  201. package/src/core-types.ts +28 -3
  202. package/src/correction-pins.ts +49 -0
  203. package/src/custom-messages.d.ts +4 -3
  204. package/src/doc-comment.ts +139 -23
  205. package/src/doc-corrections.ts +108 -0
  206. package/src/editor-vm-globals.d.ts +5 -2
  207. package/src/emit-dts.ts +2474 -281
  208. package/src/emit-messages.ts +52 -0
  209. package/src/engine-globals.d.ts +2 -2
  210. package/src/example-store.ts +125 -14
  211. package/src/field-correction-coverage.ts +204 -0
  212. package/src/fnv1a.ts +16 -0
  213. package/src/go-overloads.d.ts +33 -13
  214. package/src/index-base-table.ts +145 -0
  215. package/src/index-slot-classifications.ts +588 -0
  216. package/src/index.ts +39 -2
  217. package/src/library-index-slot-classifications.ts +332 -0
  218. package/src/lifecycle.ts +61 -199
  219. package/src/luals-type-expr.ts +354 -0
  220. package/src/msg-overloads.d.ts +0 -1
  221. package/src/param-correction-provenance.ts +64 -0
  222. package/src/return-correction-provenance.ts +58 -16
  223. package/src/script-api.ts +3 -1
  224. package/src/sys-overloads.d.ts +48 -0
  225. package/src/vmath-overloads.d.ts +27 -1
  226. package/src/window-event-guard.d.ts +6 -9
  227. package/url-parameters.json +1 -2
package/src/core-types.ts CHANGED
@@ -188,6 +188,10 @@ export interface Url {
188
188
  readonly fragment: Hash | undefined;
189
189
  }
190
190
 
191
+ const BUFFER_TYPE = 'Opaque<"buffer">';
192
+ const BUFFERSTREAM_TYPE =
193
+ 'Opaque<"bufferstream"> & { [index: number]: number; length: LuaLengthMethod<number> }';
194
+
191
195
  export const DEFOLD_TYPE_MAP: Readonly<Record<string, string>> = {
192
196
  number: "number",
193
197
  int: "number",
@@ -214,9 +218,10 @@ export const DEFOLD_TYPE_MAP: Readonly<Record<string, string>> = {
214
218
  texture: 'Opaque<"texture">',
215
219
  render_target: 'Opaque<"render_target">',
216
220
  constant: 'Opaque<"constant">',
217
- constant_buffer: 'Opaque<"constant_buffer">',
218
- buffer: 'Opaque<"buffer">',
219
- bufferstream: 'Opaque<"bufferstream"> & { [index: number]: number }',
221
+ constant_buffer:
222
+ 'Opaque<"constant_buffer"> & { [name: string]: Vector4 | Matrix4 | Vector4[] | Matrix4[] }',
223
+ buffer: BUFFER_TYPE,
224
+ bufferstream: BUFFERSTREAM_TYPE,
220
225
  userdata: 'Opaque<"userdata">',
221
226
  // Vocabulary, not a shipped brand: no current ref-doc fixture types a slot
222
227
  // `resource`, so nothing hand-written may name `Opaque<"resource">`. Kept so a
@@ -230,6 +235,10 @@ export const DEFOLD_TYPE_MAP: Readonly<Record<string, string>> = {
230
235
  b2ContactEdge: 'Opaque<"b2ContactEdge">',
231
236
  b2MassData: 'Opaque<"b2MassData">',
232
237
  b2Transform: 'Opaque<"b2Transform">',
238
+ // bullet3d's collision-object functions also take a rigid body (its docs say
239
+ // so), so that handle's brand admits both; a rigid-body slot keeps its own.
240
+ btCollisionObject: 'Opaque<"btCollisionObject" | "btRigidBody">',
241
+ btRigidBody: 'Opaque<"btRigidBody">',
233
242
  b2BodyType:
234
243
  '(number & { readonly __brand: "b2d.body.B2_DYNAMIC_BODY" }) | (number & { readonly __brand: "b2d.body.B2_KINEMATIC_BODY" }) | (number & { readonly __brand: "b2d.body.B2_STATIC_BODY" })',
235
244
  // socket handle types resolve to the method-bearing `interface <receiver>`
@@ -241,4 +250,20 @@ export const DEFOLD_TYPE_MAP: Readonly<Record<string, string>> = {
241
250
  server: "server",
242
251
  unconnected: "unconnected",
243
252
  any: "unknown",
253
+ // 1.13.2 renames of the leaves above, same slots. Upstream declares each only as
254
+ // a `userdata`/`number` handle TYPEDEF, so each keeps its 1.13.1 mapping, with
255
+ // two exceptions: `script_instance` is the untyped `self` a callback recovery
256
+ // emits, and `resource_data` (1.13.1 `resource`, only in the hand-authored
257
+ // `go.get`/`go.set`/`go.property` slots) is a path hash.
258
+ buffer_data: BUFFER_TYPE,
259
+ buffer_stream: BUFFERSTREAM_TYPE,
260
+ script_instance: "unknown",
261
+ resource_data: "Hash",
262
+ timer_handle: "number",
263
+ render_predicate: "number",
264
+ socket_client: "client",
265
+ socket_connected: "connected",
266
+ socket_master: "master",
267
+ socket_server: "server",
268
+ socket_unconnected: "unconnected",
244
269
  } as const;
@@ -0,0 +1,49 @@
1
+ // A slot-level type correction records the upstream spelling it contradicts
2
+ // (`upstream`) and any later spelling of the same defect a newer release
3
+ // declares (`retypedUpstream`). The emitter applies the correction only while
4
+ // the slot being emitted still declares one of them, and the provenance tests
5
+ // ask the same question of every retained target, so one table serves every
6
+ // release and neither side can drift from the other.
7
+ export interface PinnedCorrection {
8
+ readonly upstream: readonly string[];
9
+ readonly retypedUpstream?: readonly (readonly string[])[];
10
+ }
11
+
12
+ // `nil` is optionality, which `isDocOptional` owns (and, for a return, the
13
+ // return lane's own `nil` verdict); a correction rewrites only the concrete
14
+ // tokens, so only those are evidence.
15
+ export function baseTokens(tokens: readonly string[]): string {
16
+ return tokens.filter((token) => token !== "nil").join("|");
17
+ }
18
+
19
+ export function correctionPins(correction: PinnedCorrection): readonly (readonly string[])[] {
20
+ return [correction.upstream, ...(correction.retypedUpstream ?? [])];
21
+ }
22
+
23
+ export function pinMatches(
24
+ declared: readonly string[],
25
+ pins: readonly (readonly string[])[],
26
+ ): boolean {
27
+ const base = baseTokens(declared);
28
+ return pins.some((pin) => baseTokens(pin) === base);
29
+ }
30
+
31
+ // A property pins the text of its `<span class="type">`, split the way
32
+ // `parseProperty` splits it.
33
+ export function spanTokens(span: string): string[] {
34
+ return span
35
+ .split("|")
36
+ .map((token) => token.trim())
37
+ .filter((token) => token.length > 0);
38
+ }
39
+
40
+ export interface PinnedPropertyCorrection {
41
+ readonly upstream: string;
42
+ readonly retypedUpstream?: readonly string[];
43
+ }
44
+
45
+ export function propertyCorrectionPins(
46
+ correction: PinnedPropertyCorrection,
47
+ ): readonly (readonly string[])[] {
48
+ return [correction.upstream, ...(correction.retypedUpstream ?? [])].map(spanTokens);
49
+ }
@@ -41,14 +41,15 @@ declare global {
41
41
  // diagnostic at the call site rather than the declaration.
42
42
  /**
43
43
  * The payload declared for a message id: its `BuiltinMessages` entry, else
44
- * its `CustomMessages` entry, else the open record an undeclared id keeps.
45
- * An id declared in both resolves to the built-in payload.
44
+ * its `CustomMessages` entry, else the open table an undeclared id keeps: a
45
+ * record or a Lua sequence. An id declared in both resolves to the built-in
46
+ * payload.
46
47
  */
47
48
  type MessagePayload<K> = K extends BuiltinMessageId
48
49
  ? BuiltinMessages[K]
49
50
  : K extends keyof CustomMessages
50
51
  ? CustomMessages[K]
51
- : Record<string | number, unknown>;
52
+ : Record<string | number, unknown> | readonly unknown[];
52
53
  }
53
54
 
54
55
  export {};
@@ -1,21 +1,50 @@
1
1
  const NAMED_ENTITIES: Record<string, string> = {
2
- "&lt;": "<",
3
- "&gt;": ">",
4
- "&quot;": '"',
5
- "&#39;": "'",
6
- "&apos;": "'",
2
+ amp: "&",
3
+ lt: "<",
4
+ gt: ">",
5
+ quot: '"',
6
+ apos: "'",
7
+ // A non-breaking space in JSDoc is invisible noise; a plain space reads the same.
8
+ nbsp: " ",
9
+ times: "×",
10
+ copy: "©",
11
+ mdash: "—",
12
+ ndash: "–",
13
+ hellip: "…",
14
+ middot: "·",
15
+ deg: "°",
16
+ plusmn: "±",
17
+ le: "≤",
18
+ ge: "≥",
19
+ ne: "≠",
20
+ rarr: "→",
21
+ larr: "←",
22
+ lsquo: "‘",
23
+ rsquo: "’",
24
+ ldquo: "“",
25
+ rdquo: "”",
7
26
  };
8
27
 
28
+ // One pass over the text, so a character an entity decodes to (`&amp;` -> `&`)
29
+ // is never read as the start of another entity.
9
30
  function decodeEntities(text: string): string {
10
- let out = text;
11
- for (const [entity, char] of Object.entries(NAMED_ENTITIES)) {
12
- out = out.split(entity).join(char);
13
- }
14
- out = out.replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code)));
15
- // `&amp;` last so an already-decoded `&` is never re-interpreted.
16
- return out.split("&amp;").join("&");
31
+ return text.replace(/&(?:#[xX]([0-9a-fA-F]+)|#(\d+)|([a-zA-Z]+));/g, (entity, hex, dec, name) => {
32
+ if (hex !== undefined) return codePointOr(Number.parseInt(hex, 16), entity);
33
+ if (dec !== undefined) return codePointOr(Number(dec), entity);
34
+ return Object.hasOwn(NAMED_ENTITIES, name) ? (NAMED_ENTITIES[name] ?? entity) : entity;
35
+ });
36
+ }
37
+
38
+ function codePointOr(code: number, fallback: string): string {
39
+ return code <= 0x10ffff ? String.fromCodePoint(code) : fallback;
17
40
  }
18
41
 
42
+ // One level of list nesting while `htmlToDocText` runs its whitespace pass,
43
+ // which would otherwise strip leading spaces.
44
+ const LIST_INDENT = "";
45
+ const STRANDED_MARKER = /^(*)-$/;
46
+ const LIST_ITEM = /^*- /;
47
+
19
48
  /**
20
49
  * Join a list marker left alone on its line back onto the item's first content
21
50
  * line. Upstream prose puts a newline between `<li>` and the item's first word,
@@ -34,7 +63,8 @@ function weldStrandedListMarkers(text: string): string {
34
63
  out.push(line);
35
64
  continue;
36
65
  }
37
- if (inFence || line !== "-") {
66
+ const stranded = STRANDED_MARKER.exec(line);
67
+ if (inFence || !stranded) {
38
68
  out.push(line);
39
69
  continue;
40
70
  }
@@ -43,35 +73,90 @@ function weldStrandedListMarkers(text: string): string {
43
73
  const content = lines[ahead];
44
74
  if (
45
75
  content === undefined ||
46
- content === "-" ||
47
- content.startsWith("- ") ||
76
+ STRANDED_MARKER.test(content) ||
77
+ LIST_ITEM.test(content) ||
48
78
  content.startsWith("```")
49
79
  ) {
50
80
  // No value to weld onto — drop the marker and the blank run behind it.
51
81
  index = ahead - 1;
52
82
  continue;
53
83
  }
54
- out.push(`- ${content}`);
84
+ out.push(`${stranded[1]}- ${content}`);
55
85
  index = ahead;
56
86
  }
57
87
  return out.join("\n").trim();
58
88
  }
59
89
 
90
+ // Upstream Markdown indented one level too deep is highlighted as code while
91
+ // still reading as Markdown: every line opens on a backtick-quoted name, as in
92
+ // the field table `graphics.get_adapter_info` documents under `limits`. That
93
+ // doc is replaced whole by a `DOC_CORRECTIONS` entry, so no vendored ref-doc
94
+ // reaches this rule today. It is the fallback for when upstream rewords such a
95
+ // doc without fixing it — the correction's hash stops matching and this still
96
+ // yields a readable list, not a mislabelled `lua` fence — and for any other doc
97
+ // that repeats the mistake.
98
+ const MISREAD_MARKDOWN_LINE = /^\s*`[^`]+`/;
99
+
100
+ // A `<pre>` body as Markdown. Misread Markdown becomes a bullet per line, its
101
+ // `[type:X]` marker reduced to the bare type the way a `<span class="type">` is.
102
+ // Otherwise it is a fence: a `<code>` inside marks highlighted source, Lua
103
+ // unless its class names another language, and a bare `<pre>` is a
104
+ // preformatted diagram. Upstream indents some samples by a uniform margin,
105
+ // which is dropped.
106
+ function preToMarkdown(inner: string): string {
107
+ const lines = htmlToCodeText(inner).split("\n");
108
+ const filled = lines.filter((line) => line.trim() !== "");
109
+ if (filled.every((line) => MISREAD_MARKDOWN_LINE.test(line))) {
110
+ return filled
111
+ .map(
112
+ (line) =>
113
+ `- ${line
114
+ .trim()
115
+ .replace(/\[type:([^\]]+)\]/g, "$1")
116
+ .replace(/\s+/g, " ")}`,
117
+ )
118
+ .join("\n");
119
+ }
120
+ const lang =
121
+ inner.match(/class="language-([A-Za-z0-9_+-]+)"/)?.[1] ??
122
+ (/<code\b/i.test(inner) ? "lua" : "text");
123
+ const margin = Math.min(
124
+ ...lines.filter((line) => line.trim() !== "").map((line) => line.match(/^ */)?.[0].length ?? 0),
125
+ );
126
+ const body = lines.map((line) => line.slice(Number.isFinite(margin) ? margin : 0)).join("\n");
127
+ return `\`\`\`${lang}\n${body}\n\`\`\``;
128
+ }
129
+
60
130
  /**
61
131
  * Convert a ref-doc HTML fragment to clean Markdown/plain text suitable for a
62
132
  * JSDoc comment body. Pure and free of any `ApiModule` dependency so the emit
63
133
  * slices and any future surface can reuse it.
64
134
  */
65
135
  export function htmlToDocText(html: string): string {
136
+ // Lift each `<pre>` out before the whitespace pass, which would flatten an
137
+ // ASCII diagram or a code sample into one line, and put it back as Markdown.
138
+ const fences: string[] = [];
139
+ // A list item's marker carries one `LIST_INDENT` per enclosing list beyond
140
+ // the first, which the whitespace pass leaves alone; each becomes two spaces,
141
+ // the content column of the parent `- ` marker, once that pass is done.
142
+ let listDepth = 0;
66
143
  let text = html
144
+ .replace(/<pre\b[^>]*>([\s\S]*?)<\/pre>/gi, (_, inner: string) => {
145
+ fences.push(preToMarkdown(inner));
146
+ return `\n\n\uE000${fences.length - 1}\uE000\n\n`;
147
+ })
67
148
  .replace(/<code>([\s\S]*?)<\/code>/gi, "`$1`")
68
149
  .replace(/<(?:em|i)>([\s\S]*?)<\/(?:em|i)>/gi, "*$1*")
69
150
  .replace(/<a\b[^>]*>([\s\S]*?)<\/a>/gi, "$1")
70
- .replace(/<li>/gi, "\n- ")
71
- .replace(/<\/li>/gi, "")
151
+ .replace(/<(\/?)(ul|ol|li)\b[^>]*>/gi, (_, close: string, tag: string) => {
152
+ if (tag.toLowerCase() !== "li") {
153
+ listDepth = Math.max(0, listDepth + (close ? -1 : 1));
154
+ return "";
155
+ }
156
+ return close ? "" : `\n${LIST_INDENT.repeat(Math.max(0, listDepth - 1))}- `;
157
+ })
72
158
  .replace(/<br\s*\/?>/gi, "\n")
73
159
  .replace(/<\/p>/gi, "\n\n")
74
- .replace(/<\/?pre>/gi, "\n")
75
160
  .replace(/<[^>]+>/g, "");
76
161
 
77
162
  text = decodeEntities(text);
@@ -86,7 +171,12 @@ export function htmlToDocText(html: string): string {
86
171
  .replace(/\n{3,}/g, "\n\n")
87
172
  .trim();
88
173
 
89
- text = weldStrandedListMarkers(text);
174
+ // A blank line between two items would make the list loose, spacing every
175
+ // item apart like a paragraph.
176
+ text = weldStrandedListMarkers(text)
177
+ .replace(/(?<=^*- .*)\n\n(?=*- )/gm, "\n")
178
+ .replaceAll(LIST_INDENT, " ")
179
+ .replace(/\uE000(\d+)\uE000/g, (_, i: string) => fences[Number(i)] ?? "");
90
180
 
91
181
  // Upstream prose can open a fence and end mid-body; left open it swallows the
92
182
  // rest of the JSDoc block and everything after it on the rendered page.
@@ -138,7 +228,7 @@ function scanExampleRegions(html: string): { matched: boolean; regions: ExampleR
138
228
  let matched = false;
139
229
  for (let match = blocks.exec(html); match !== null; match = blocks.exec(html)) {
140
230
  matched = true;
141
- regions.push({ kind: "prose", html: html.slice(lastIndex, match.index), lang: "lua" });
231
+ regions.push(...proseRegions(html.slice(lastIndex, match.index)));
142
232
  const inner = match[1] ?? "";
143
233
  regions.push({
144
234
  kind: "code",
@@ -148,10 +238,28 @@ function scanExampleRegions(html: string): { matched: boolean; regions: ExampleR
148
238
  lastIndex = match.index + match[0].length;
149
239
  }
150
240
  if (!matched) return { matched: false, regions: [{ kind: "code", html, lang: "lua" }] };
151
- regions.push({ kind: "prose", html: html.slice(lastIndex), lang: "lua" });
241
+ regions.push(...proseRegions(html.slice(lastIndex)));
152
242
  return { matched: true, regions };
153
243
  }
154
244
 
245
+ // Upstream Markdown ```` ```lua ```` fences sometimes reach the ref-doc as
246
+ // `<code>lua\n...</code>`: a language token, a newline, then source. Read as
247
+ // prose it welds the code into the surrounding sentences, so each one is lifted
248
+ // into a code region of its own. Inline `<code>` spans carry no such newline.
249
+ const MANGLED_FENCE = /<code>([A-Za-z0-9_+-]+)\n([\s\S]*?)<\/code>/g;
250
+
251
+ function proseRegions(html: string): ExampleRegion[] {
252
+ const regions: ExampleRegion[] = [];
253
+ let lastIndex = 0;
254
+ for (const match of html.matchAll(MANGLED_FENCE)) {
255
+ regions.push({ kind: "prose", html: html.slice(lastIndex, match.index), lang: "lua" });
256
+ regions.push({ kind: "code", html: match[2] ?? "", lang: match[1] ?? "lua" });
257
+ lastIndex = match.index + match[0].length;
258
+ }
259
+ regions.push({ kind: "prose", html: html.slice(lastIndex), lang: "lua" });
260
+ return regions;
261
+ }
262
+
155
263
  /**
156
264
  * Convert a ref-doc `examples` HTML fragment — prose interleaved with one or
157
265
  * more `<div class="codehilite">…</div>` syntax-highlight blocks — into Markdown,
@@ -200,7 +308,8 @@ export interface ExampleSegmentation {
200
308
  * Carve an `examples` HTML fragment into one segment per example it carries.
201
309
  *
202
310
  * A `<div class="codehilite">` block is a code region and the markup between
203
- * two of them is a prose region; inside either, a ` ``` ` line switches between
311
+ * two of them is a prose region, less any mangled `<code>lang\n...</code>`
312
+ * fence lifted out of it as a code region; inside either, a ` ``` ` line switches between
204
313
  * code and prose, and an opener reached while already in code ends the running
205
314
  * example and starts the next. Upstream writes several examples both ways — as
206
315
  * several blocks, and as its own Markdown fences inside one block — so both
@@ -280,6 +389,13 @@ function trimBlankEdges(lines: readonly string[]): string[] {
280
389
  return out;
281
390
  }
282
391
 
392
+ // Prefer the full `description`; fall back to the one-line `brief` when prose is
393
+ // absent. Shared by every documented member kind so the summary source is
394
+ // consistent across functions, constants, variables, and properties.
395
+ export function summaryFor(brief: string, description: string): string {
396
+ return description.trim() !== "" ? description : brief;
397
+ }
398
+
283
399
  export interface DocCommentParts {
284
400
  summary: string;
285
401
  // Present exactly when the source carried a deprecation tag; `""` is the bare
@@ -0,0 +1,108 @@
1
+ import { fnv1a64 } from "./fnv1a";
2
+
3
+ // A function slot whose upstream doc HTML is malformed badly enough to misread,
4
+ // replaced wholesale with authored HTML that keeps upstream's wording, or a
5
+ // property description that contradicts what the engine does. Each
6
+ // entry is pinned by the FNV-1a hash of the exact upstream HTML it replaces: the
7
+ // parse applies it only while the vendored doc still hashes to that value, so a
8
+ // fixed or reworded upstream doc wins by itself, and
9
+ // `doc-correction-provenance.test.ts` reds until the stale entry is deleted.
10
+ //
11
+ // Keyed `<function>#param:<name>`, `<function>#return:<name>`, or
12
+ // `<namespace>#property:<name>` (the ref-doc `PROPERTY` element's bare name).
13
+ export interface DocCorrection {
14
+ readonly upstreamHash: string;
15
+ readonly html: string;
16
+ readonly reason: string;
17
+ }
18
+
19
+ const li = (name: string, type: string, doc: string) =>
20
+ `<li><code>${name}</code> <span class="type">${type}</span> ${doc}</li>`;
21
+
22
+ export const DOC_CORRECTIONS: ReadonlyMap<string, DocCorrection> = new Map([
23
+ [
24
+ "graphics.get_adapter_info#return:info",
25
+ {
26
+ upstreamHash: "77028e82ec2d15bd",
27
+ reason:
28
+ "script_graphics.cpp indents the field table as preformatted text: the top-level fields run together as one paragraph, and the `limits` and `features` sub-tables are highlighted as code",
29
+ html: [
30
+ "table with the following fields:",
31
+ "<ul>",
32
+ li("family", "string", 'adapter family name (e.g. "opengl", "vulkan")'),
33
+ li("version_major", "number", "adapter API major version (e.g. 1 for Vulkan 1.4)"),
34
+ li("version_minor", "number", "adapter API minor version (e.g. 4 for Vulkan 1.4)"),
35
+ `<li><code>limits</code> <span class="type">table</span> hardware/driver limits:<ul>`,
36
+ li("max_texture_size_2d", "number", "max 2D texture dimension in texels"),
37
+ li("max_texture_size_3d", "number", "max 3D (volume) texture dimension in texels"),
38
+ li("max_texture_size_cube", "number", "max cube map face dimension in texels"),
39
+ li("max_texture_array_layers", "number", "max layers in an array texture"),
40
+ li("max_framebuffer_width", "number", "max framebuffer width in pixels"),
41
+ li("max_framebuffer_height", "number", "max framebuffer height in pixels"),
42
+ li("max_color_attachments", "number", "max simultaneous color attachments"),
43
+ li("max_samplers_per_stage", "number", "max texture samplers per shader stage"),
44
+ li("max_textures_per_stage", "number", "max sampled textures per shader stage"),
45
+ li("max_vertex_attributes", "number", "max vertex attributes"),
46
+ li("max_vertex_buffers", "number", "max vertex buffer bindings"),
47
+ li("max_compute_workgroup_size_x", "number", "max compute workgroup size (X)"),
48
+ li("max_compute_workgroup_size_y", "number", "max compute workgroup size (Y)"),
49
+ li("max_compute_workgroup_size_z", "number", "max compute workgroup size (Z)"),
50
+ li("max_compute_workgroup_invocations", "number", "max invocations per compute workgroup"),
51
+ li(
52
+ "max_compute_shared_memory_size",
53
+ "number",
54
+ "max shared memory per compute workgroup (bytes)",
55
+ ),
56
+ li("max_uniform_buffer_range", "number", "max bindable uniform buffer range (bytes)"),
57
+ li("max_storage_buffer_range", "number", "max bindable storage buffer range (bytes)"),
58
+ "</ul></li>",
59
+ li("extensions", "table", "array of driver-reported extension name strings"),
60
+ `<li><code>features</code> <span class="type">table</span> array of supported context feature ids:<ul>`,
61
+ "<li><code>graphics.CONTEXT_FEATURE_MULTI_TARGET_RENDERING</code> multi-target rendering</li>",
62
+ "<li><code>graphics.CONTEXT_FEATURE_TEXTURE_ARRAY</code> texture arrays</li>",
63
+ "<li><code>graphics.CONTEXT_FEATURE_COMPUTE_SHADER</code> compute shaders</li>",
64
+ "<li><code>graphics.CONTEXT_FEATURE_STORAGE_BUFFER</code> storage buffers</li>",
65
+ "<li><code>graphics.CONTEXT_FEATURE_VSYNC</code> vertical sync</li>",
66
+ "<li><code>graphics.CONTEXT_FEATURE_INSTANCING</code> hardware instancing</li>",
67
+ "<li><code>graphics.CONTEXT_FEATURE_3D_TEXTURES</code> 3D (volume) textures</li>",
68
+ "<li><code>graphics.CONTEXT_FEATURE_ASTC_ARRAY_TEXTURES</code> ASTC compressed 2D array textures</li>",
69
+ "<li><code>graphics.CONTEXT_FEATURE_BLEND_EQUATION_MIN_MAX</code> min/max blend equations</li>",
70
+ "</ul></li>",
71
+ "</ul>",
72
+ ].join("\n"),
73
+ },
74
+ ],
75
+ [
76
+ "go#property:scale",
77
+ {
78
+ upstreamHash: "a7f5ba1b125d1fae",
79
+ reason:
80
+ "upstream calls it a uniform number, but the engine reads a vector3 back from `go.get` and applies a written number as a uniform scale",
81
+ html: "The scale of the game object. <code>go.get</code> returns a vector3; <code>go.set</code> and <code>go.animate</code> also take a number, which sets a uniform scale.",
82
+ },
83
+ ],
84
+ [
85
+ "label#property:scale",
86
+ {
87
+ upstreamHash: "5a15760073a8629d",
88
+ reason:
89
+ 'upstream says a number is accepted, but `go.set` raises "must be a vmath.vector3" on one; only `go.animate` takes a number',
90
+ html: "The scale of the label. <code>go.get</code> returns and <code>go.set</code> takes a vector3; <code>go.animate</code> also takes a number, which sets a uniform scale.",
91
+ },
92
+ ],
93
+ ]);
94
+
95
+ export function docCorrectionKey(
96
+ owner: string,
97
+ slot: "param" | "return" | "property",
98
+ name: string,
99
+ ): string {
100
+ return `${owner}#${slot}:${name}`;
101
+ }
102
+
103
+ // The slot's doc with its correction applied, or `doc` itself when the slot has
104
+ // no entry or upstream no longer matches the pinned hash.
105
+ export function correctedDoc(key: string, doc: string): string {
106
+ const correction = DOC_CORRECTIONS.get(key);
107
+ return correction && fnv1a64(doc) === correction.upstreamHash ? correction.html : doc;
108
+ }
@@ -19,6 +19,9 @@ import type {
19
19
  // sitting before a required one, or an empty `returnvalues` on a function
20
20
  // upstream's own prose says returns a value — are written out here as overload
21
21
  // sets. All three are withheld from the emit by `EDITOR_VM_SKIP_FUNCTIONS`. The
22
+ // constant tables are VARIABLEs in 1.13.1; in 1.13.2 `zip.METHOD.*` and
23
+ // `zip.ON_CONFLICT.*` are ENUM members and `http.server.*` are CONSTANTs, and the
24
+ // entry's skip rules withhold them in every one of those shapes. The
22
25
  // contract is unchanged and still derived: this file declares exactly what the
23
26
  // emit leaves behind. The namespaces below merge with the emitted
24
27
  // `generated/editor-vm/` bodies rather than replacing them. Upstream records no
@@ -26,9 +29,9 @@ import type {
26
29
 
27
30
  declare global {
28
31
  /**
29
- * Pretty-print a Lua value
32
+ * Pretty-print Lua values
30
33
  */
31
- function pprint(value: unknown): void;
34
+ function pprint(...values: unknown[]): void;
32
35
 
33
36
  namespace http {
34
37
  namespace server {