Skip to content

Commit 4888db2

Browse files
authored
fix(webapi): expose concrete public module types [Codex] (#402)
Concrete public modules now expose their primary type as `t`, including the missing canvas, geometry, font, storage, file, media, device, worker, and audio interfaces. Record-backed aliases explicitly re-export their existing shapes without changing privacy: private records remain private, and public records remain public. Generic and inherited types are preserved. Packed consumer fixtures check public field access, constructor results, generic types, and rejection of a private record. The broader native-type privacy plan is tracked in #403 and is outside this change. Closes #237.
1 parent 844c32a commit 4888db2

98 files changed

Lines changed: 333 additions & 14 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎scripts/check-consumer.mjs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,11 @@ const checkConsumers = async () => {
188188
if (!negativeOnly) {
189189
const scenarios = [
190190
{ name: "default", fixture: "scripts/consumer-default.res", features: null },
191+
{
192+
name: "concrete public types",
193+
fixture: "scripts/consumer-concrete-types.res",
194+
features: null,
195+
},
191196
{
192197
name: "Fetch-only",
193198
fixture: "scripts/consumer-fetch.res",
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
let path2D: WebAPI.Path2D.t => WebAPI.Path2D.t = value => value
2+
let fontFace: WebAPI.FontFace.t => WebAPI.FontFace.t = value => value
3+
let domMatrix: WebAPI.DOMMatrix.t => WebAPI.DOMMatrix.t = value => value
4+
let domMatrixReadOnly: WebAPI.DOMMatrixReadOnly.t => WebAPI.DOMMatrixReadOnly.t = value => value
5+
let domPoint: WebAPI.DOMPoint.t => WebAPI.DOMPoint.t = value => value
6+
let domPointReadOnly: WebAPI.DOMPointReadOnly.t => WebAPI.DOMPointReadOnly.t = value => value
7+
let domRect: WebAPI.DOMRect.t => WebAPI.DOMRect.t = value => value
8+
let domRectReadOnly: WebAPI.DOMRectReadOnly.t => WebAPI.DOMRectReadOnly.t = value => value
9+
let domRectList: WebAPI.DOMRectList.t => WebAPI.DOMRectList.t = value => value
10+
let domTokenList: WebAPI.DOMTokenList.t => WebAPI.DOMTokenList.t = value => value
11+
let caretPosition: WebAPI.CaretPosition.t => WebAPI.CaretPosition.t = value => value
12+
let namedNodeMap: WebAPI.NamedNodeMap.t => WebAPI.NamedNodeMap.t = value => value
13+
let nodeList: WebAPI.NodeList.t<'node> => WebAPI.NodeList.t<'node> = value => value
14+
let documentTimeline: WebAPI.DocumentTimeline.t => WebAPI.DocumentTimeline.t = value => value
15+
let cssRuleList: WebAPI.CSSRuleList.t => WebAPI.CSSRuleList.t = value => value
16+
let canvasGradient: WebAPI.CanvasGradient.t => WebAPI.CanvasGradient.t = value => value
17+
let canvasPattern: WebAPI.CanvasPattern.t => WebAPI.CanvasPattern.t = value => value
18+
let canvasRenderingContext2D: WebAPI.CanvasRenderingContext2D.t => WebAPI.CanvasRenderingContext2D.t = value =>
19+
value
20+
let imageBitmap: WebAPI.ImageBitmap.t => WebAPI.ImageBitmap.t = value => value
21+
let imageBitmapRenderingContext: WebAPI.ImageBitmapRenderingContext.t => WebAPI.ImageBitmapRenderingContext.t = value =>
22+
value
23+
let imageData: WebAPI.ImageData.t => WebAPI.ImageData.t = value => value
24+
let videoColorSpace: WebAPI.VideoColorSpace.t => WebAPI.VideoColorSpace.t = value => value
25+
let videoFrame: WebAPI.VideoFrame.t => WebAPI.VideoFrame.t = value => value
26+
let abortController: WebAPI.AbortController.t => WebAPI.AbortController.t = value => value
27+
let headers: WebAPI.Headers.t = WebAPI.Headers.make()
28+
let pushManager: WebAPI.PushManager.t => WebAPI.PushManager.t = value => value
29+
let pushSubscription: WebAPI.PushSubscription.t => WebAPI.PushSubscription.t = value => value
30+
let clipboardItem: WebAPI.ClipboardItem.t => WebAPI.ClipboardItem.t = value => value
31+
let credentialsContainer: WebAPI.CredentialsContainer.t => WebAPI.CredentialsContainer.t = value =>
32+
value
33+
let permissions: WebAPI.Permissions.t => WebAPI.Permissions.t = value => value
34+
let customElementRegistry: WebAPI.CustomElementRegistry.t => WebAPI.CustomElementRegistry.t = value =>
35+
value
36+
let history: WebAPI.History.t => WebAPI.History.t = value => value
37+
let idleDeadline: WebAPI.IdleDeadline.t => WebAPI.IdleDeadline.t = value => value
38+
let gamepadHapticActuator: WebAPI.GamepadHapticActuator.t => WebAPI.GamepadHapticActuator.t = value =>
39+
value
40+
let geolocation: WebAPI.Geolocation.t => WebAPI.Geolocation.t = value => value
41+
let geolocationCoordinates: WebAPI.GeolocationCoordinates.t => WebAPI.GeolocationCoordinates.t = value =>
42+
value
43+
let geolocationPosition: WebAPI.GeolocationPosition.t => WebAPI.GeolocationPosition.t = value =>
44+
value
45+
let wakeLock: WebAPI.WakeLock.t => WebAPI.WakeLock.t = value => value
46+
let fileList: WebAPI.FileList.t => WebAPI.FileList.t = value => value
47+
let fileSystemDirectoryEntry: WebAPI.FileSystemDirectoryEntry.t => WebAPI.FileSystemDirectoryEntry.t = value =>
48+
value
49+
let fileSystemDirectoryHandle: WebAPI.FileSystemDirectoryHandle.t => WebAPI.FileSystemDirectoryHandle.t = value =>
50+
value
51+
let fileSystemDirectoryReader: WebAPI.FileSystemDirectoryReader.t => WebAPI.FileSystemDirectoryReader.t = value =>
52+
value
53+
let fileSystemEntry: WebAPI.FileSystemEntry.t => WebAPI.FileSystemEntry.t = value => value
54+
let fileSystemFileHandle: WebAPI.FileSystemFileHandle.t => WebAPI.FileSystemFileHandle.t = value =>
55+
value
56+
let fileSystemHandle: WebAPI.FileSystemHandle.t => WebAPI.FileSystemHandle.t = value => value
57+
let fileSystemWritableFileStream: WebAPI.FileSystemWritableFileStream.t => WebAPI.FileSystemWritableFileStream.t = value =>
58+
value
59+
let writableStream: WebAPI.WritableStream.t<'writer> => WebAPI.WritableStream.t<'writer> = value =>
60+
value
61+
let writableStreamDefaultController: WebAPI.WritableStreamDefaultController.t => WebAPI.WritableStreamDefaultController.t = value =>
62+
value
63+
let lockManager: WebAPI.LockManager.t => WebAPI.LockManager.t = value => value
64+
let cache: WebAPI.Cache.t => WebAPI.Cache.t = value => value
65+
let cacheStorage: WebAPI.CacheStorage.t => WebAPI.CacheStorage.t = value => value
66+
let idbFactory: WebAPI.IDBFactory.t => WebAPI.IDBFactory.t = value => value
67+
let idbIndex: WebAPI.IDBIndex.t => WebAPI.IDBIndex.t = value => value
68+
let idbObjectStore: WebAPI.IDBObjectStore.t => WebAPI.IDBObjectStore.t = value => value
69+
let storage: WebAPI.Storage.t => WebAPI.Storage.t = value => value
70+
let storageManager: WebAPI.StorageManager.t => WebAPI.StorageManager.t = value => value
71+
let intersectionObserver: WebAPI.IntersectionObserver.t => WebAPI.IntersectionObserver.t = value =>
72+
value
73+
let resizeObserver: WebAPI.ResizeObserver.t => WebAPI.ResizeObserver.t = value => value
74+
let mediaCapabilities: WebAPI.MediaCapabilities.t => WebAPI.MediaCapabilities.t = value => value
75+
let mediaKeyStatusMap: WebAPI.MediaKeyStatusMap.t => WebAPI.MediaKeyStatusMap.t = value => value
76+
let mediaKeySystemAccess: WebAPI.MediaKeySystemAccess.t => WebAPI.MediaKeySystemAccess.t = value =>
77+
value
78+
let mediaKeys: WebAPI.MediaKeys.t => WebAPI.MediaKeys.t = value => value
79+
let textTrackCueList: WebAPI.TextTrackCueList.t => WebAPI.TextTrackCueList.t = value => value
80+
let performanceEntry: WebAPI.PerformanceEntry.t => WebAPI.PerformanceEntry.t = value => value
81+
let performanceMark: WebAPI.PerformanceMark.t => WebAPI.PerformanceMark.t = value => value
82+
let clients: WebAPI.Clients.t => WebAPI.Clients.t = value => value
83+
let navigationPreloadManager: WebAPI.NavigationPreloadManager.t => WebAPI.NavigationPreloadManager.t = value =>
84+
value
85+
let dataTransfer: WebAPI.DataTransfer.t => WebAPI.DataTransfer.t = value => value
86+
let dataTransferItem: WebAPI.DataTransferItem.t => WebAPI.DataTransferItem.t = value => value
87+
let dataTransferItemList: WebAPI.DataTransferItemList.t => WebAPI.DataTransferItemList.t = value =>
88+
value
89+
let touch: WebAPI.Touch.t => WebAPI.Touch.t = value => value
90+
let touchList: WebAPI.TouchList.t => WebAPI.TouchList.t = value => value
91+
let url: WebAPI.URL.t => WebAPI.URL.t = value => value
92+
let viewTransition: WebAPI.ViewTransition.t => WebAPI.ViewTransition.t = value => value
93+
let svgGraphicsElement: WebAPI.SVGGraphicsElement.t => WebAPI.SVGGraphicsElement.t = value => value
94+
let svgLength: WebAPI.SVGLength.t => WebAPI.SVGLength.t = value => value
95+
let audioBuffer: WebAPI.AudioBuffer.t => WebAPI.AudioBuffer.t = value => value
96+
let audioParam: WebAPI.AudioParam.t => WebAPI.AudioParam.t = value => value
97+
let audioNode: WebAPI.AudioNode.t => WebAPI.AudioNode.t = value => value
98+
let baseAudioContext: WebAPI.BaseAudioContext.t => WebAPI.BaseAudioContext.t = value => value
99+
let periodicWave: WebAPI.PeriodicWave.t => WebAPI.PeriodicWave.t = value => value
100+
let worklet: WebAPI.Worklet.t => WebAPI.Worklet.t = value => value
101+
102+
let makePublicUrl = () => {
103+
let url: WebAPI.URL.t = WebAPI.URL.make(~url="https://example.invalid")
104+
url.href = "https://example.com"
105+
url.href
106+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let imageBitmap: WebAPI.ImageBitmap.t = {width: 1, height: 1}

‎scripts/negative-fixtures.json‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@
5353
"features": ["WebAPI.Storage"],
5454
"expectedDiagnostic": "This has type:"
5555
},
56+
{
57+
"name": "private public-module records cannot be constructed",
58+
"fixture": "scripts/fixtures/negative/PrivatePublicModuleRecordCannotBeConstructed.res",
59+
"features": ["WebAPI.Canvas"],
60+
"expectedDiagnostic": "Cannot create values of the"
61+
},
5662
{
5763
"name": "Web Locks callback accepts nullable Lock",
5864
"fixture": "scripts/fixtures/negative/WebLocksRejectsNonNullableCallback.res",

‎src/animation/DocumentTimeline.res‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
type t = DOM.documentTimeline = private {...DOM.documentTimeline}
2+
13
/**
24
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DocumentTimeline)
35
*/

‎src/canvas/CanvasGradient.res‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
type t = CanvasTypes.canvasGradient = private {...CanvasTypes.canvasGradient}
2+
13
/**
24
Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
35

‎src/canvas/CanvasPattern.res‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
type domMatrix2DInit = DOM.domMatrix2DInit
22

3+
type t = CanvasTypes.canvasPattern = private {...CanvasTypes.canvasPattern}
4+
35
/**
46
Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation.
57
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/CanvasPattern/setTransform)

‎src/canvas/CanvasRenderingContext2D.res‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
type t = DOM.canvasRenderingContext2D
2+
13
/**
24
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fillStyle)
35
*/

‎src/canvas/ImageBitmap.res‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
type t = CanvasTypes.imageBitmap = private {...CanvasTypes.imageBitmap}
2+
13
/**
24
Releases imageBitmap's underlying bitmap data.
35
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/ImageBitmap/close)

‎src/canvas/ImageBitmapRenderingContext.res‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
type t = CanvasTypes.imageBitmapRenderingContext = private {
2+
...CanvasTypes.imageBitmapRenderingContext,
3+
}
4+
15
/**
26
Transfers the underlying bitmap data from imageBitmap to context, and the bitmap becomes the contents of the canvas element to which context is bound.
37
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/ImageBitmapRenderingContext/transferFromImageBitmap)

0 commit comments

Comments
 (0)