rescript-lang / rescript-lang/experimental-rescript-webapi
Rename overloaded constructor bindings from numbered make* names to semantic from* names
Nobody has claimed this yet.
- Dominant language
- ReScript
- Stars
- 40
- Forks
- 11
- Avg merge
- 3d 12h
- Merged PRs (30d)
- 12
Description
Summary
Rename overloaded constructor bindings from numbered make* names to semantic from* names, while keeping singleton and true default constructors named make. This pass should also update constructor source comments so generated API docs describe each overload's input shape, add compile-coverage tests for every renamed constructor, and update contributor docs with the constructor naming and documentation rules.
Plan source: docs/superpowers/plans/2026-04-18-constructor-make-rename-plan.md
Context from PR #234
PR #234 (Rename a few bindings with a proper descriptive naming) is the prior rename pass for this area. It was authored against the pre-*API module layout, so treat paths like src/DOM/* and src/WebSockets/* in that PR as earlier equivalents of the current src/DOMAPI/* and src/WebSocketsAPI/* files.
Use PR #234 as source material only for the overlapping constructor families in this issue:
FontFace:make2->fromDataView,make3->fromArrayBuffer, but the string constructor stayedmakeVideoFrame:make2throughmake10were renamed, but the HTML image constructor stayedmakeand several names were shorter than the source-type names this issue wants (fromSvgImage,fromVideoElement,fromCanvasElement)MediaStream:make2->fromStream,make3->fromTracksPath2D:make2->fromString, but the default constructor and copy constructor were not splitDOMMatrix/DOMMatrixReadOnly:make2->fromFloatArray, but the string overload stayed merged intomakeOfflineAudioContext:make2->makeWithParamsWebSocket:make2->makeWithProtocolsReadableStream:make2andmake3were removed instead of being remodeled as typed constructors
This issue intentionally supersedes the constructor naming choices from PR #234 where they do not match the make / from* rules:
- rename non-default constructors still called
make - prefer source-type names such as
fromMediaStream,fromURL,fromURLWithProtocols,fromHTMLVideoElement,fromString, andfromArray - split optional-argument constructors into a true
make()plus typedfrom*overloads - keep the non-constructor overload renames from PR #234 out of scope here
Rules to enforce
- Keep singleton constructors named
make. - Keep true default constructors named
make, even inside overloaded families. - Rename typed constructor overloads in overloaded families to
from*names based on the source input type. - Do not change existing
makeWith*constructors in this pass. - If an optional labeled argument currently hides the default constructor, split it into a real
makeplus typedfrom*overloads.
Scope
Rename pure overload families
-
src/CSSFontLoadingAPI/FontFace.resfromStringfromDataViewfromArrayBuffer
-
src/DOMAPI/VideoFrame.resfromHTMLImageElementfromSVGImageElementfromHTMLVideoElementfromHTMLCanvasElementfromImageBitmapfromOffscreenCanvasfromVideoFramefromArrayBufferfromSharedArrayBufferfromDataView
-
src/WebSocketsAPI/WebSocket.resfromURLfromURLWithProtocols
-
src/WebAudioAPI/OfflineAudioContext.resfromOptionsfromChannelCountLengthAndSampleRate
Update mixed default-plus-typed families
-
src/MediaCaptureAndStreamsAPI/MediaStream.res- keep
make()as the default constructor - rename typed overloads to
fromMediaStreamandfromTracks
- keep
-
src/FileAPI.res- add
type underlyingSource<'t> = anynear the existing stream support types
- add
-
src/FileAPI/ReadableStream.res- make
makegeneric:unit => readableStream<'t> - rename typed overloads to
fromUnderlyingSourceandfromUnderlyingSourceWithStrategy
- make
Split constructor bindings that currently hide the default constructor
-
src/CanvasAPI/Path2D.res- split into
make(),fromPath2D(~path),fromString(~path)
- split into
-
src/DOMAPI/DOMMatrix.res- split into
make(),fromString(~init),fromArray(~init)
- split into
-
src/DOMAPI/DOMMatrixReadOnly.res- split into
make(),fromString(~init),fromArray(~init)
- split into
Documentation
- Rewrite every touched constructor comment to use the final function name in the signature line and example.
- Add a
Source shape:block for every touched constructor comment. - Include MDN links for the input type.
- Include ReScript stdlib links when the source input is a stdlib type such as
string,array<'a>,ArrayBuffer.t, orDataView.t. - Include local source links when the shape is a project-local record or alias.
- Preserve the existing constructor-level MDN link in each comment.
- Update
docs/content/docs/contributing/api-modelling.mdxwith a constructor-overload subsection coveringmakevsfrom*naming and overload splitting. - Update
docs/content/docs/contributing/documentation.mdxso the documented comment structure explicitly includes source-shape links and shows a constructor overload example. - Do not hand-edit
docs/pages/apidocs/**; those pages are template-driven from source comments.
Tests and generated artifacts
- Add compile-coverage test modules for:
tests/CSSFontLoadingAPI/FontFace__test.restests/DOMAPI/VideoFrame__test.restests/WebSocketsAPI/WebSocket__test.restests/WebAudioAPI/OfflineAudioContext__test.restests/MediaCaptureAndStreamsAPI/MediaStream__test.restests/FileAPI/ReadableStream__test.restests/CanvasAPI/Path2D__test.restests/DOMAPI/DOMMatrix__test.restests/DOMAPI/DOMMatrixReadOnly__test.res
- Commit the generated
tests/**/*.jssnapshots for those new coverage modules. - Do not hand-edit
lib/**; it should be regenerated through the normal build.
Verification
-
npm run build -
npm run test -
npm run build:docs -
npm run format:check
Expected results:
- build succeeds with the renamed constructors and overload splits
- tests succeed with the new committed
.jssnapshots and no leftover snapshot diffs - docs build succeeds with the updated source comments and contributor docs
- format check succeeds after formatting
Out of scope
- adopting Vitest in this pass
- adopting happy-dom in this pass
- replacing the current compile-and-snapshot test flow
- runtime browser-behavior assertions
- updating contributor testing docs for a future runtime harness before that harness exists
Rollout order
- Update
ReadableStreamsupport types insrc/FileAPI.resfirst. - Rename the pure overload families.
- Update the mixed default-plus-typed families.
- Split the optional-argument constructor bindings into true default
makeplus typedfrom*overloads. - Rewrite all touched constructor comments.
- Add compile-coverage tests and generated JS snapshots.
- Update contributor docs.
- Leave a clear note that runtime verification will be handled later via Vitest and happy-dom.
- Run build, test, docs, and format verification.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with docs/superpowers/plans/2026-04-18-constructor-make-rename-plan.md and the rollout order, beginning with src/FileAPI.res and src/FileAPI/ReadableStream.res. Work through the named constructor source files and add the corresponding compile-coverage modules under tests/, including committed JavaScript snapshots. Done means npm run build, npm run test, npm run build:docs, and npm run format:check succeed without generated-artifact diffs.
Written by the indexing model from the issue text.
Assessment
- Domain
- api, documentation, testing
- Issue type
- Refactor
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100