@defold-typescript/types 0.39.0 → 0.40.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 (87) hide show
  1. package/api-availability.json +117 -0
  2. package/api-signatures.json +262 -237
  3. package/examples/translations.json +81 -81
  4. package/generated/b2d_shape.d.ts +23 -1
  5. package/generated/buffer.d.ts +18 -15
  6. package/generated/camera.d.ts +2 -2
  7. package/generated/collectionfactory.d.ts +12 -10
  8. package/generated/collectionproxy.d.ts +1 -1
  9. package/generated/compute.d.ts +1 -1
  10. package/generated/go.d.ts +9 -5
  11. package/generated/graphics.d.ts +52 -0
  12. package/generated/gui.d.ts +53 -32
  13. package/generated/html5.d.ts +3 -1
  14. package/generated/http.d.ts +4 -2
  15. package/generated/image.d.ts +24 -15
  16. package/generated/kinds/gui-script.d.ts +1 -0
  17. package/generated/kinds/render-script.d.ts +1 -0
  18. package/generated/kinds/script.d.ts +1 -0
  19. package/generated/material.d.ts +1 -1
  20. package/generated/model.d.ts +32 -3
  21. package/generated/physics.d.ts +13 -11
  22. package/generated/profiler.d.ts +1 -1
  23. package/generated/render.d.ts +72 -15
  24. package/generated/resource.d.ts +100 -69
  25. package/generated/socket.d.ts +23 -13
  26. package/generated/sound.d.ts +3 -3
  27. package/generated/sprite.d.ts +9 -1
  28. package/generated/sys.d.ts +34 -23
  29. package/generated/versions/defold-1.12.4/buffer.d.ts +18 -15
  30. package/generated/versions/defold-1.12.4/camera.d.ts +2 -2
  31. package/generated/versions/defold-1.12.4/collectionfactory.d.ts +12 -10
  32. package/generated/versions/defold-1.12.4/go.d.ts +9 -5
  33. package/generated/versions/defold-1.12.4/gui.d.ts +47 -31
  34. package/generated/versions/defold-1.12.4/html5.d.ts +3 -1
  35. package/generated/versions/defold-1.12.4/http.d.ts +4 -2
  36. package/generated/versions/defold-1.12.4/image.d.ts +24 -15
  37. package/generated/versions/defold-1.12.4/index.d.ts +1 -0
  38. package/generated/versions/defold-1.12.4/model.d.ts +32 -3
  39. package/generated/versions/defold-1.12.4/physics.d.ts +13 -11
  40. package/generated/versions/defold-1.12.4/profiler.d.ts +1 -1
  41. package/generated/versions/defold-1.12.4/render.d.ts +72 -15
  42. package/generated/versions/defold-1.12.4/resource.d.ts +100 -69
  43. package/generated/versions/defold-1.12.4/socket.d.ts +23 -13
  44. package/generated/versions/defold-1.12.4/sound.d.ts +3 -3
  45. package/generated/versions/defold-1.12.4/sprite.d.ts +9 -1
  46. package/generated/versions/defold-1.12.4/sys.d.ts +34 -23
  47. package/generated/versions/defold-1.12.4/vmath.d.ts +5 -5
  48. package/generated/versions/defold-1.13.0/b2d_shape.d.ts +23 -1
  49. package/generated/versions/defold-1.13.0/buffer.d.ts +18 -15
  50. package/generated/versions/defold-1.13.0/camera.d.ts +2 -2
  51. package/generated/versions/defold-1.13.0/collectionfactory.d.ts +12 -10
  52. package/generated/versions/defold-1.13.0/compute.d.ts +1 -1
  53. package/generated/versions/defold-1.13.0/go.d.ts +9 -5
  54. package/generated/versions/defold-1.13.0/graphics.d.ts +48 -0
  55. package/generated/versions/defold-1.13.0/gui.d.ts +47 -31
  56. package/generated/versions/defold-1.13.0/html5.d.ts +3 -1
  57. package/generated/versions/defold-1.13.0/http.d.ts +4 -2
  58. package/generated/versions/defold-1.13.0/image.d.ts +24 -15
  59. package/generated/versions/defold-1.13.0/index.d.ts +1 -0
  60. package/generated/versions/defold-1.13.0/material.d.ts +1 -1
  61. package/generated/versions/defold-1.13.0/model.d.ts +32 -3
  62. package/generated/versions/defold-1.13.0/physics.d.ts +13 -11
  63. package/generated/versions/defold-1.13.0/profiler.d.ts +1 -1
  64. package/generated/versions/defold-1.13.0/render.d.ts +72 -15
  65. package/generated/versions/defold-1.13.0/resource.d.ts +100 -69
  66. package/generated/versions/defold-1.13.0/socket.d.ts +23 -13
  67. package/generated/versions/defold-1.13.0/sound.d.ts +3 -3
  68. package/generated/versions/defold-1.13.0/sprite.d.ts +9 -1
  69. package/generated/versions/defold-1.13.0/sys.d.ts +34 -23
  70. package/generated/versions/defold-1.13.0/vmath.d.ts +5 -5
  71. package/generated/vmath.d.ts +5 -5
  72. package/index.d.ts +1 -0
  73. package/package.json +1 -1
  74. package/scripts/generate-api-signatures.ts +2 -1
  75. package/scripts/prose-constants.ts +96 -0
  76. package/scripts/regen.ts +6 -2
  77. package/src/component-properties.d.ts +33 -0
  78. package/src/core-types.ts +4 -2
  79. package/src/custom-messages.d.ts +4 -3
  80. package/src/doc-comment.ts +35 -12
  81. package/src/emit-dts.ts +457 -47
  82. package/src/engine-globals.d.ts +2 -2
  83. package/src/go-overloads.d.ts +11 -10
  84. package/src/index.ts +4 -0
  85. package/src/param-correction-provenance.ts +67 -0
  86. package/src/render-overloads.d.ts +15 -0
  87. package/src/script-api.ts +3 -1
@@ -49,7 +49,7 @@ declare global {
49
49
  function conj(q1: Quaternion): Quaternion;
50
50
  /**
51
51
  * Given two linearly independent vectors P and Q, the cross product,
52
- * P × Q, is a vector that is perpendicular to both P and Q and
52
+ * P × Q, is a vector that is perpendicular to both P and Q and
53
53
  * therefore normal to the plane containing them.
54
54
  * If the two vectors have the same direction (or have the exact
55
55
  * opposite direction from one another, i.e. are not linearly independent)
@@ -70,8 +70,8 @@ declare global {
70
70
  function cross(v1: Vector3, v2: Vector3): Vector3;
71
71
  /**
72
72
  * The returned value is a scalar defined as:
73
- * `P ⋅ Q = |P| |Q| cos θ`
74
- * where θ is the angle between the vectors P and Q.
73
+ * `P ⋅ Q = |P| |Q| cos θ`
74
+ * where θ is the angle between the vectors P and Q.
75
75
  *
76
76
  * - If the dot product is positive then the angle between the vectors is below 90 degrees.
77
77
  *
@@ -437,8 +437,8 @@ declare global {
437
437
  /**
438
438
  * Calculates the extent the projection of the first vector onto the second.
439
439
  * The returned value is a scalar p defined as:
440
- * `p = |P| cos θ / |Q|`
441
- * where θ is the angle between the vectors P and Q.
440
+ * `p = |P| cos θ / |Q|`
441
+ * where θ is the angle between the vectors P and Q.
442
442
  *
443
443
  * @param v1 - vector to be projected on the second
444
444
  * @param v2 - vector onto which the first will be projected, must not have zero length
package/index.d.ts CHANGED
@@ -25,6 +25,7 @@ import "./generated/factory";
25
25
  import "./generated/font";
26
26
  import "./generated/go";
27
27
  import "./src/go-overloads";
28
+ import "./src/component-properties";
28
29
  import "./generated/graphics";
29
30
  import "./generated/gui";
30
31
  import "./generated/html5";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defold-typescript/types",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "TypeScript types for the Defold engine's Lua APIs.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -14,7 +14,8 @@ const PACKAGE_ROOT = resolve(import.meta.dir, "..");
14
14
  const SIGNATURES_PATH = resolve(PACKAGE_ROOT, "api-signatures.json");
15
15
 
16
16
  export interface SignaturesArtifact {
17
- // version -> symbolIdentityKey -> authoritative TS signature text
17
+ // version -> symbolIdentityKey -> authoritative TS signature text; a symbol
18
+ // with several declared arms carries one arm per line, primary first
18
19
  readonly versions: Record<string, Record<string, string>>;
19
20
  // The same axis and keys, carrying each documented slot's rendered type. Kept
20
21
  // parallel rather than folded into `versions` because three consumers
@@ -0,0 +1,96 @@
1
+ import type { ModuleManifestEntry } from "./regen";
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.
6
+ interface ProseConstantFamily {
7
+ readonly namespace: string;
8
+ readonly prefix: string;
9
+ readonly describes: string;
10
+ readonly evidence: {
11
+ readonly namespace: string;
12
+ readonly function: string;
13
+ readonly parameter: string;
14
+ };
15
+ }
16
+
17
+ const PROSE_CONSTANT_FAMILIES: readonly ProseConstantFamily[] = [
18
+ {
19
+ namespace: "graphics",
20
+ prefix: "SEMANTIC_TYPE_",
21
+ describes: "Vertex attribute semantic type",
22
+ evidence: {
23
+ namespace: "material",
24
+ function: "material.set_vertex_attributes",
25
+ parameter: "attributes",
26
+ },
27
+ },
28
+ ];
29
+
30
+ interface DocElement {
31
+ readonly type: string;
32
+ readonly name: string;
33
+ readonly parameters?: readonly { readonly name: string; readonly doc?: string }[];
34
+ }
35
+
36
+ interface ApiDoc {
37
+ readonly elements: readonly DocElement[];
38
+ }
39
+
40
+ function escapeRegExp(text: string): string {
41
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
42
+ }
43
+
44
+ function evidencedNames(family: ProseConstantFamily, modules: readonly ModuleManifestEntry[]) {
45
+ const source = modules.find((m) => m.namespace === family.evidence.namespace);
46
+ if (!source) return [];
47
+ const fn = (source.doc as ApiDoc).elements.find(
48
+ (e) => e.type === "FUNCTION" && e.name === family.evidence.function,
49
+ );
50
+ const prose = fn?.parameters?.find((p) => p.name === family.evidence.parameter)?.doc ?? "";
51
+ const item = new RegExp(
52
+ `<li><code>(${escapeRegExp(`${family.namespace}.${family.prefix}`)}\\w+)</code></li>`,
53
+ "g",
54
+ );
55
+ return [...new Set(Array.from(prose.matchAll(item), (m) => m[1] as string))];
56
+ }
57
+
58
+ function constantElement(name: string, brief: string) {
59
+ return {
60
+ type: "CONSTANT",
61
+ name,
62
+ brief,
63
+ description: "",
64
+ returnvalues: [],
65
+ parameters: [],
66
+ examples: "",
67
+ replaces: "",
68
+ error: "",
69
+ tparams: [],
70
+ members: [],
71
+ notes: [],
72
+ language: "",
73
+ };
74
+ }
75
+
76
+ export function synthesizeProseConstants(
77
+ modules: readonly ModuleManifestEntry[],
78
+ ): ModuleManifestEntry[] {
79
+ let out = [...modules];
80
+ for (const family of PROSE_CONSTANT_FAMILIES) {
81
+ const names = evidencedNames(family, out);
82
+ if (names.length === 0) continue;
83
+ const index = out.findIndex((m) => m.namespace === family.namespace);
84
+ const target = out[index];
85
+ if (!target) continue;
86
+ const doc = target.doc as ApiDoc;
87
+ const declared = new Set(doc.elements.map((e) => e.name));
88
+ const brief = `${family.describes}, for \`${family.evidence.function}\`.`;
89
+ const added = names.filter((n) => !declared.has(n)).map((n) => constantElement(n, brief));
90
+ if (added.length === 0) continue;
91
+ out = out.map((m, i) =>
92
+ i === index ? { ...m, doc: { ...doc, elements: [...doc.elements, ...added] } } : m,
93
+ );
94
+ }
95
+ return out;
96
+ }
package/scripts/regen.ts CHANGED
@@ -26,6 +26,7 @@ import {
26
26
  resolveRefDoc,
27
27
  } from "./doc-source";
28
28
  import { loadTranslations } from "./example-store-io";
29
+ import { synthesizeProseConstants } from "./prose-constants";
29
30
  import { type readZip, SYNC_MANIFEST, type SyncManifestEntry } from "./sync-api-docs";
30
31
 
31
32
  export interface ApiTargetModule {
@@ -99,7 +100,7 @@ export function loadTargetModules(
99
100
  target: ApiTarget,
100
101
  packageRoot: string = PACKAGE_ROOT,
101
102
  ): ModuleManifestEntry[] {
102
- return target.modules.map((module) => {
103
+ const modules = target.modules.map((module) => {
103
104
  const path = resolve(packageRoot, target.fixturesDir, module.fixture);
104
105
  let raw: string;
105
106
  try {
@@ -117,6 +118,7 @@ export function loadTargetModules(
117
118
  };
118
119
  return module.skipFunctions ? { ...entry, skipFunctions: module.skipFunctions } : entry;
119
120
  });
121
+ return synthesizeProseConstants(modules);
120
122
  }
121
123
 
122
124
  export interface ModuleManifestEntry {
@@ -168,7 +170,7 @@ export async function resolveTargetModules(
168
170
  ...(opts.fetchChannelInfo ? { fetchChannelInfo: opts.fetchChannelInfo } : {}),
169
171
  });
170
172
  const syncManifest = opts.syncManifest ?? SYNC_MANIFEST;
171
- return target.modules.map((module) => {
173
+ const modules = target.modules.map((module) => {
172
174
  const sync = syncManifest.find((s) => s.namespace === module.namespace);
173
175
  if (!sync) {
174
176
  throw new Error(
@@ -184,6 +186,7 @@ export async function resolveTargetModules(
184
186
  };
185
187
  return module.skipFunctions ? { ...entry, skipFunctions: module.skipFunctions } : entry;
186
188
  });
189
+ return synthesizeProseConstants(modules);
187
190
  }
188
191
 
189
192
  const API_TARGETS = loadApiTargets();
@@ -556,6 +559,7 @@ const UNIVERSAL_EXTRA_IMPORTS: readonly UniversalExtraImport[] = [
556
559
  { specifier: "../../src/window-event-guard" },
557
560
  { specifier: "../../src/scene-addresses" },
558
561
  { specifier: "../../src/go-overloads" },
562
+ { specifier: "../../src/component-properties" },
559
563
  { specifier: "../../src/render-overloads", restrictedTo: "render" },
560
564
  { specifier: "../../src/vmath-overloads" },
561
565
  ];
@@ -0,0 +1,33 @@
1
+ /** @noSelfInFile */
2
+
3
+ import type { Hash } from "./core-types";
4
+
5
+ // Component property keys upstream examples read through `go.get` while no
6
+ // ref-doc catalog declares them. Only evidenced keys belong here.
7
+ declare global {
8
+ namespace sprite {
9
+ interface properties {
10
+ /**
11
+ * The texture bound to the sprite's first sampler. Not in the sprite
12
+ * ref-doc; `resource.set`'s example reads it with
13
+ * `go.get("#sprite", "texture0")`.
14
+ */
15
+ texture0: Hash;
16
+ }
17
+ }
18
+
19
+ /**
20
+ * Mesh component properties. Upstream ships no mesh API module, so this
21
+ * catalog holds only the keys upstream examples read.
22
+ */
23
+ namespace mesh {
24
+ interface properties {
25
+ /**
26
+ * The buffer resource holding the mesh's vertex data.
27
+ * `resource.get_buffer` and `resource.set_buffer` read it with
28
+ * `go.get("#mesh", "vertices")`.
29
+ */
30
+ vertices: Hash;
31
+ }
32
+ }
33
+ }
package/src/core-types.ts CHANGED
@@ -214,9 +214,11 @@ export const DEFOLD_TYPE_MAP: Readonly<Record<string, string>> = {
214
214
  texture: 'Opaque<"texture">',
215
215
  render_target: 'Opaque<"render_target">',
216
216
  constant: 'Opaque<"constant">',
217
- constant_buffer: 'Opaque<"constant_buffer">',
217
+ constant_buffer:
218
+ 'Opaque<"constant_buffer"> & { [name: string]: Vector4 | Matrix4 | Vector4[] | Matrix4[] }',
218
219
  buffer: 'Opaque<"buffer">',
219
- bufferstream: 'Opaque<"bufferstream"> & { [index: number]: number }',
220
+ bufferstream:
221
+ 'Opaque<"bufferstream"> & { [index: number]: number; length: LuaLengthMethod<number> }',
220
222
  userdata: 'Opaque<"userdata">',
221
223
  // Vocabulary, not a shipped brand: no current ref-doc fixture types a slot
222
224
  // `resource`, so nothing hand-written may name `Opaque<"resource">`. Kept so a
@@ -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,19 +1,42 @@
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
 
19
42
  /**