Skip to content

Rename overloaded constructor bindings from numbered make* names to semantic from* names #236

@jderochervlk

Description

@jderochervlk

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 stayed make
  • VideoFrame: make2 through make10 were renamed, but the HTML image constructor stayed make and several names were shorter than the source-type names this issue wants (fromSvgImage, fromVideoElement, fromCanvasElement)
  • MediaStream: make2 -> fromStream, make3 -> fromTracks
  • Path2D: make2 -> fromString, but the default constructor and copy constructor were not split
  • DOMMatrix / DOMMatrixReadOnly: make2 -> fromFloatArray, but the string overload stayed merged into make
  • OfflineAudioContext: make2 -> makeWithParams
  • WebSocket: make2 -> makeWithProtocols
  • ReadableStream: make2 and make3 were 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, and fromArray
  • split optional-argument constructors into a true make() plus typed from* overloads
  • keep the non-constructor overload renames from PR Rename a few bindings with a proper descriptive naming #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 make plus typed from* overloads.

Scope

Rename pure overload families

  • src/CSSFontLoadingAPI/FontFace.res
    • fromString
    • fromDataView
    • fromArrayBuffer
  • src/DOMAPI/VideoFrame.res
    • fromHTMLImageElement
    • fromSVGImageElement
    • fromHTMLVideoElement
    • fromHTMLCanvasElement
    • fromImageBitmap
    • fromOffscreenCanvas
    • fromVideoFrame
    • fromArrayBuffer
    • fromSharedArrayBuffer
    • fromDataView
  • src/WebSocketsAPI/WebSocket.res
    • fromURL
    • fromURLWithProtocols
  • src/WebAudioAPI/OfflineAudioContext.res
    • fromOptions
    • fromChannelCountLengthAndSampleRate

Update mixed default-plus-typed families

  • src/MediaCaptureAndStreamsAPI/MediaStream.res
    • keep make() as the default constructor
    • rename typed overloads to fromMediaStream and fromTracks
  • src/FileAPI.res
    • add type underlyingSource<'t> = any near the existing stream support types
  • src/FileAPI/ReadableStream.res
    • make make generic: unit => readableStream<'t>
    • rename typed overloads to fromUnderlyingSource and fromUnderlyingSourceWithStrategy

Split constructor bindings that currently hide the default constructor

  • src/CanvasAPI/Path2D.res
    • split into make(), fromPath2D(~path), fromString(~path)
  • src/DOMAPI/DOMMatrix.res
    • split into make(), fromString(~init), fromArray(~init)
  • src/DOMAPI/DOMMatrixReadOnly.res
    • split into make(), fromString(~init), fromArray(~init)

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, or DataView.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.mdx with a constructor-overload subsection covering make vs from* naming and overload splitting.
  • Update docs/content/docs/contributing/documentation.mdx so 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.res
    • tests/DOMAPI/VideoFrame__test.res
    • tests/WebSocketsAPI/WebSocket__test.res
    • tests/WebAudioAPI/OfflineAudioContext__test.res
    • tests/MediaCaptureAndStreamsAPI/MediaStream__test.res
    • tests/FileAPI/ReadableStream__test.res
    • tests/CanvasAPI/Path2D__test.res
    • tests/DOMAPI/DOMMatrix__test.res
    • tests/DOMAPI/DOMMatrixReadOnly__test.res
  • Commit the generated tests/**/*.js snapshots 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 .js snapshots 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 ReadableStream support types in src/FileAPI.res first.
  • Rename the pure overload families.
  • Update the mixed default-plus-typed families.
  • Split the optional-argument constructor bindings into true default make plus typed from* 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions