@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.
- package/api-availability.json +3963 -772
- package/api-migrations.json +27 -0
- package/api-signatures.json +18069 -10240
- package/api-targets.json +448 -11
- package/examples/translations.json +560 -89
- package/fixtures/messages_doc.json +96 -0
- package/generated/b2d.d.ts +680 -4
- package/generated/b2d_body.d.ts +29 -103
- package/generated/b2d_chain.d.ts +5 -6
- package/generated/b2d_fixture.d.ts +34 -38
- package/generated/b2d_joint.d.ts +503 -25
- package/generated/b2d_shape.d.ts +183 -20
- package/generated/b2d_world.d.ts +57 -63
- package/generated/buffer.d.ts +16 -15
- package/generated/builtin-messages.d.ts +7 -1
- package/generated/bullet3d.d.ts +91 -0
- package/generated/bullet3d_collision_object.d.ts +433 -0
- package/generated/bullet3d_constraint.d.ts +818 -0
- package/generated/bullet3d_rigid_body.d.ts +429 -0
- package/generated/bullet3d_shape.d.ts +123 -0
- package/generated/bullet3d_world.d.ts +492 -0
- package/generated/camera.d.ts +29 -32
- package/generated/collectionfactory.d.ts +15 -18
- package/generated/collectionproxy.d.ts +22 -6
- package/generated/compute.d.ts +12 -238
- package/generated/crash.d.ts +24 -10
- package/generated/editor-vm/http.d.ts +90 -7
- package/generated/editor-vm/image.d.ts +7 -7
- package/generated/editor-vm/json.d.ts +11 -0
- package/generated/editor-vm/localization.d.ts +7 -7
- package/generated/editor-vm/tilemap_tiles.d.ts +56 -10
- package/generated/editor-vm/zip.d.ts +28 -0
- package/generated/editor.d.ts +1496 -430
- package/generated/factory.d.ts +21 -25
- package/generated/font.d.ts +64 -22
- package/generated/go.d.ts +235 -182
- package/generated/graphics.d.ts +335 -97
- package/generated/gui.d.ts +240 -471
- package/generated/html5.d.ts +2 -2
- package/generated/http.d.ts +28 -35
- package/generated/image.d.ts +105 -72
- package/generated/json.d.ts +34 -16
- package/generated/kinds/gui-script.d.ts +7 -0
- package/generated/kinds/render-script.d.ts +7 -0
- package/generated/kinds/script.d.ts +7 -0
- package/generated/label.d.ts +77 -7
- package/generated/liveupdate.d.ts +13 -10
- package/generated/material.d.ts +312 -360
- package/generated/model.d.ts +40 -39
- package/generated/particlefx.d.ts +19 -28
- package/generated/physics.d.ts +365 -133
- package/generated/profiler.d.ts +13 -23
- package/generated/render.d.ts +237 -297
- package/generated/resource.d.ts +664 -583
- package/generated/socket.d.ts +120 -133
- package/generated/sound.d.ts +62 -31
- package/generated/sprite.d.ts +31 -17
- package/generated/sys.d.ts +234 -190
- package/generated/tilemap.d.ts +21 -16
- package/generated/timer.d.ts +34 -21
- package/generated/versions/defold-1.12.4/b2d_body.d.ts +0 -7
- package/generated/versions/defold-1.12.4/buffer.d.ts +1 -3
- package/generated/versions/defold-1.12.4/camera.d.ts +21 -21
- package/generated/versions/defold-1.12.4/collectionfactory.d.ts +9 -9
- package/generated/versions/defold-1.12.4/collectionproxy.d.ts +2 -2
- package/generated/versions/defold-1.12.4/crash.d.ts +2 -2
- package/generated/versions/defold-1.12.4/factory.d.ts +15 -16
- package/generated/versions/defold-1.12.4/go.d.ts +6 -12
- package/generated/versions/defold-1.12.4/gui.d.ts +77 -175
- package/generated/versions/defold-1.12.4/html5.d.ts +1 -1
- package/generated/versions/defold-1.12.4/http.d.ts +0 -13
- package/generated/versions/defold-1.12.4/image.d.ts +16 -33
- package/generated/versions/defold-1.12.4/index.d.ts +1 -0
- package/generated/versions/defold-1.12.4/json.d.ts +10 -6
- package/generated/versions/defold-1.12.4/label.d.ts +2 -3
- package/generated/versions/defold-1.12.4/liveupdate.d.ts +5 -3
- package/generated/versions/defold-1.12.4/model.d.ts +2 -10
- package/generated/versions/defold-1.12.4/particlefx.d.ts +2 -5
- package/generated/versions/defold-1.12.4/physics.d.ts +69 -67
- package/generated/versions/defold-1.12.4/profiler.d.ts +2 -5
- package/generated/versions/defold-1.12.4/render.d.ts +99 -128
- package/generated/versions/defold-1.12.4/resource.d.ts +120 -148
- package/generated/versions/defold-1.12.4/socket.d.ts +34 -60
- package/generated/versions/defold-1.12.4/sound.d.ts +8 -8
- package/generated/versions/defold-1.12.4/sprite.d.ts +15 -5
- package/generated/versions/defold-1.12.4/sys.d.ts +37 -71
- package/generated/versions/defold-1.12.4/tilemap.d.ts +18 -11
- package/generated/versions/defold-1.12.4/timer.d.ts +5 -3
- package/generated/versions/defold-1.12.4/vmath.d.ts +0 -21
- package/generated/versions/defold-1.12.4/window.d.ts +1 -16
- package/generated/versions/defold-1.13.0/b2d_body.d.ts +10 -55
- package/generated/versions/defold-1.13.0/b2d_fixture.d.ts +25 -25
- package/generated/versions/defold-1.13.0/b2d_shape.d.ts +169 -8
- package/generated/versions/defold-1.13.0/b2d_world.d.ts +16 -10
- package/generated/versions/defold-1.13.0/buffer.d.ts +1 -3
- package/generated/versions/defold-1.13.0/camera.d.ts +25 -25
- package/generated/versions/defold-1.13.0/collectionfactory.d.ts +9 -9
- package/generated/versions/defold-1.13.0/collectionproxy.d.ts +2 -2
- package/generated/versions/defold-1.13.0/compute.d.ts +0 -69
- package/generated/versions/defold-1.13.0/crash.d.ts +2 -2
- package/generated/versions/defold-1.13.0/editor-vm/tilemap_tiles.d.ts +3 -3
- package/generated/versions/defold-1.13.0/editor.d.ts +34 -24
- package/generated/versions/defold-1.13.0/factory.d.ts +15 -16
- package/generated/versions/defold-1.13.0/go.d.ts +6 -12
- package/generated/versions/defold-1.13.0/graphics.d.ts +73 -37
- package/generated/versions/defold-1.13.0/gui.d.ts +77 -175
- package/generated/versions/defold-1.13.0/html5.d.ts +1 -1
- package/generated/versions/defold-1.13.0/http.d.ts +0 -13
- package/generated/versions/defold-1.13.0/image.d.ts +16 -33
- package/generated/versions/defold-1.13.0/index.d.ts +1 -0
- package/generated/versions/defold-1.13.0/json.d.ts +10 -6
- package/generated/versions/defold-1.13.0/label.d.ts +2 -3
- package/generated/versions/defold-1.13.0/liveupdate.d.ts +7 -5
- package/generated/versions/defold-1.13.0/material.d.ts +68 -106
- package/generated/versions/defold-1.13.0/model.d.ts +2 -10
- package/generated/versions/defold-1.13.0/particlefx.d.ts +2 -5
- package/generated/versions/defold-1.13.0/physics.d.ts +69 -67
- package/generated/versions/defold-1.13.0/profiler.d.ts +2 -5
- package/generated/versions/defold-1.13.0/render.d.ts +99 -128
- package/generated/versions/defold-1.13.0/resource.d.ts +126 -150
- package/generated/versions/defold-1.13.0/socket.d.ts +34 -60
- package/generated/versions/defold-1.13.0/sound.d.ts +8 -8
- package/generated/versions/defold-1.13.0/sprite.d.ts +15 -5
- package/generated/versions/defold-1.13.0/sys.d.ts +37 -71
- package/generated/versions/defold-1.13.0/tilemap.d.ts +18 -11
- package/generated/versions/defold-1.13.0/timer.d.ts +5 -3
- package/generated/versions/defold-1.13.0/vmath.d.ts +0 -21
- package/generated/versions/defold-1.13.0/window.d.ts +1 -16
- package/generated/versions/defold-1.13.1/b2d.d.ts +33 -0
- package/generated/versions/defold-1.13.1/b2d_body.d.ts +636 -0
- package/generated/versions/defold-1.13.1/b2d_chain.d.ts +106 -0
- package/generated/versions/defold-1.13.1/b2d_fixture.d.ts +157 -0
- package/generated/versions/defold-1.13.1/b2d_joint.d.ts +823 -0
- package/generated/versions/defold-1.13.1/b2d_shape.d.ts +400 -0
- package/generated/versions/defold-1.13.1/b2d_world.d.ts +320 -0
- package/generated/versions/defold-1.13.1/buffer.d.ts +189 -0
- package/generated/versions/defold-1.13.1/camera.d.ts +303 -0
- package/generated/versions/defold-1.13.1/collectionfactory.d.ts +151 -0
- package/generated/versions/defold-1.13.1/collectionproxy.d.ts +93 -0
- package/generated/versions/defold-1.13.1/compute.d.ts +237 -0
- package/generated/versions/defold-1.13.1/crash.d.ts +143 -0
- package/generated/versions/defold-1.13.1/editor-vm/http.d.ts +56 -0
- package/generated/versions/defold-1.13.1/editor-vm/image.d.ts +48 -0
- package/generated/versions/defold-1.13.1/editor-vm/json.d.ts +10 -0
- package/generated/versions/defold-1.13.1/editor-vm/localization.d.ts +42 -0
- package/generated/versions/defold-1.13.1/editor-vm/tilemap_tiles.d.ts +80 -0
- package/generated/versions/defold-1.13.1/editor-vm/zip.d.ts +10 -0
- package/generated/versions/defold-1.13.1/editor-vm/zlib.d.ts +24 -0
- package/generated/versions/defold-1.13.1/editor.d.ts +1121 -0
- package/generated/versions/defold-1.13.1/factory.d.ts +124 -0
- package/generated/versions/defold-1.13.1/font.d.ts +81 -0
- package/generated/versions/defold-1.13.1/go.d.ts +1107 -0
- package/generated/versions/defold-1.13.1/graphics.d.ts +411 -0
- package/generated/versions/defold-1.13.1/gui.d.ts +2353 -0
- package/generated/versions/defold-1.13.1/html5.d.ts +55 -0
- package/generated/versions/defold-1.13.1/http.d.ts +77 -0
- package/generated/versions/defold-1.13.1/image.d.ts +131 -0
- package/generated/versions/defold-1.13.1/index.d.ts +57 -0
- package/generated/versions/defold-1.13.1/json.d.ts +80 -0
- package/generated/versions/defold-1.13.1/kinds/editor-script.d.ts +14 -0
- package/generated/versions/defold-1.13.1/label.d.ts +93 -0
- package/generated/versions/defold-1.13.1/liveupdate.d.ts +142 -0
- package/generated/versions/defold-1.13.1/material.d.ts +408 -0
- package/generated/versions/defold-1.13.1/model.d.ts +272 -0
- package/generated/versions/defold-1.13.1/msg.d.ts +10 -0
- package/generated/versions/defold-1.13.1/particlefx.d.ts +163 -0
- package/generated/versions/defold-1.13.1/physics.d.ts +559 -0
- package/generated/versions/defold-1.13.1/profiler.d.ts +235 -0
- package/generated/versions/defold-1.13.1/render.d.ts +1190 -0
- package/generated/versions/defold-1.13.1/resource.d.ts +1523 -0
- package/generated/versions/defold-1.13.1/socket.d.ts +784 -0
- package/generated/versions/defold-1.13.1/sound.d.ts +292 -0
- package/generated/versions/defold-1.13.1/sprite.d.ts +175 -0
- package/generated/versions/defold-1.13.1/sys.d.ts +678 -0
- package/generated/versions/defold-1.13.1/tilemap.d.ts +208 -0
- package/generated/versions/defold-1.13.1/timer.d.ts +125 -0
- package/generated/versions/defold-1.13.1/types.d.ts +61 -0
- package/generated/versions/defold-1.13.1/vmath.d.ts +774 -0
- package/generated/versions/defold-1.13.1/window.d.ts +183 -0
- package/generated/versions/defold-1.13.1/zlib.d.ts +41 -0
- package/generated/vmath.d.ts +1 -21
- package/generated/window.d.ts +71 -71
- package/identity-vocabulary.json +561 -0
- package/index.d.ts +7 -0
- package/package.json +18 -2
- package/scripts/example-store-io.ts +12 -1
- package/scripts/extension-goldens.ts +1 -0
- package/scripts/fidelity-baseline.json +146 -46
- package/scripts/generate-api-availability.ts +90 -12
- package/scripts/generate-api-signatures.ts +12 -2
- package/scripts/import-defold-release.ts +106 -26
- package/scripts/prose-constants.ts +77 -16
- package/scripts/regen.ts +391 -77
- package/scripts/shared-handle-methods.ts +53 -0
- package/scripts/signature-store-fs.ts +1 -0
- package/scripts/sync-api-docs.ts +48 -10
- package/src/api-availability.ts +0 -0
- package/src/api-doc.ts +201 -3
- package/src/api-identity.ts +252 -0
- package/src/core-types.ts +26 -3
- package/src/correction-pins.ts +49 -0
- package/src/doc-comment.ts +104 -11
- package/src/doc-corrections.ts +108 -0
- package/src/editor-vm-globals.d.ts +5 -2
- package/src/emit-dts.ts +2064 -281
- package/src/emit-messages.ts +52 -0
- package/src/example-store.ts +125 -14
- package/src/field-correction-coverage.ts +204 -0
- package/src/fnv1a.ts +16 -0
- package/src/go-overloads.d.ts +25 -6
- package/src/index-base-table.ts +145 -0
- package/src/index-slot-classifications.ts +588 -0
- package/src/index.ts +38 -5
- package/src/library-index-slot-classifications.ts +332 -0
- package/src/lifecycle.ts +61 -199
- package/src/luals-type-expr.ts +354 -0
- package/src/msg-overloads.d.ts +0 -1
- package/src/param-correction-provenance.ts +8 -11
- package/src/render-overloads.d.ts +0 -15
- package/src/return-correction-provenance.ts +58 -16
- package/src/sys-overloads.d.ts +48 -0
- package/src/vmath-overloads.d.ts +27 -1
- package/src/window-event-guard.d.ts +6 -9
- 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 {
|
|
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-
|
|
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
|
-
//
|
|
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
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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(
|
|
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"
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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.
|
|
272
|
-
|
|
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,
|
|
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
|
|
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
|
|
4
|
-
//
|
|
5
|
-
//
|
|
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
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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>(${
|
|
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
|
|
82
|
-
|
|
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;
|