Skip to content

[pull] main from swiftwasm:main#7

Open
pull[bot] wants to merge 1215 commits into
majacQ:mainfrom
swiftwasm:main
Open

[pull] main from swiftwasm:main#7
pull[bot] wants to merge 1215 commits into
majacQ:mainfrom
swiftwasm:main

Conversation

@pull

@pull pull Bot commented Jul 19, 2021

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot added ⤵️ pull merge-conflict Resolve conflicts manually labels Jul 19, 2021
@atomist atomist Bot added auto-branch-delete:on-close Delete branch when pull request gets closed auto-merge-method:merge Auto-merge with merge commit auto-merge:on-bpr-success Auto-merge on passed branch protection rule labels Jul 19, 2021
@pull pull Bot removed auto-branch-delete:on-close Delete branch when pull request gets closed auto-merge-method:merge Auto-merge with merge commit auto-merge:on-bpr-success Auto-merge on passed branch protection rule labels Jul 19, 2021
kateinoigakukun and others added 22 commits February 5, 2026 15:07
BridgeJS: Split out OptionalSupportTests.swift
BridgeJS: Fix optional String return handling in generated JS glue code
BridgeJS: Skip directories in generate input file processing
This is a preparation for unifying stacks for param/ret values to make
it direction agnostic.
[NFC] BridgeJS: Add push/pop JS codegen helpers
The SkeletonCollector was looking for BridgeJS.json at the wrong path
for build-time generated files. Since commit 91d2f06, BridgeJSTool
writes skeleton files to `destination/BridgeJS/JavaScript/BridgeJS.json`,
but PackageToJS was searching in `destination/BridgeJS/BridgeJS.json`
(missing the JavaScript/ subdirectory).

This caused projects using dynamic BridgeJS generation via the build
plugin to fail - PackageToJS couldn't find the skeleton files, resulting
in HAS_BRIDGE=false and stub implementations in instantiate.js.
PackageToJS: Fix skeleton file discovery path for build plugin output
[NFC] BridgeJS: Remove remaining explicit captures from enum/struct helpers
[NFC] BridgeJS: Make Stack ABI storage direction agnostic
* Doc comments from .d.ts JSDoc now flow into generated Swift DocC output.

- Added JSDoc parsing (description/@param/@returns) and DocC emission for callable/typed declarations, including classes/interfaces/enums, in `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/src/processor.js`, with guards to only read param/return tags on callable nodes.
- Added a documented fixture to cover the new behavior and updated the Vitest snapshot (`Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/fixtures/Documentation.d.ts`, `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/__snapshots__/ts2swift.test.js.snap`).

Tests:
- `npm test -- -u` (Plugins/BridgeJS/Sources/TS2Swift/JavaScript)

Next steps: optionally run `swift test --package-path ./Plugins/BridgeJS` to keep the Swift-side suite green.

* Added richer WebIDL-derived doc coverage using the bridgejs-development skill: new fixtures model lib.dom-style comments (MDN reference blocks, @param text) and updated Vitest snapshots to show how those JSDoc comments render into DocC. Key files: `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/fixtures/WebIDLDOMDocs.d.ts`, `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/fixtures/DOMLike.d.ts`, and the refreshed snapshot in `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/__snapshots__/ts2swift.test.js.snap`. Tests run: `npm test -- -u` (TS2Swift JavaScript).

* Removed the DOM-like fixture and refreshed snapshots to drop its output. Changes: deleted `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/fixtures/DOMLike.d.ts` and updated `Plugins/BridgeJS/Sources/TS2Swift/JavaScript/test/__snapshots__/ts2swift.test.js.snap`.

Tests: `npm test -- -u` (TS2Swift JavaScript).
Examples added/covered in this change:
- @JSFunction: enforce throws(JSException) (missing or wrong type) with note + fix-it ("Declare throws(JSException)").
- @JSFunction: instance members outside @jsclass emit a clear diagnostic.
- @JSGetter/@JSSetter: members (instance/static/class) outside @jsclass emit a clear diagnostic.
- @JSSetter: invalid setter names (e.g. updateFoo) emit a diagnostic and suggest a rename fix-it (e.g. setFoo).
- @JSSetter: missing value parameter emits a diagnostic and suggests adding a placeholder parameter.
- @jsclass: using @jsclass on non-struct declarations emits a diagnostic; for "class" also suggests "Change 'class' to 'struct'".
krodak and others added 30 commits April 24, 2026 21:16
feat: Add opt-in pointer identity mode for SwiftHeapObject wrappers
Wraps the manual steps already documented in CONTRIBUTING.md:

  - Verifies required tools (swiftly, swift, jq, npm, make, curl).
  - If a .swift-version file is present, installs the pinned toolchain via
    swiftly.
  - Resolves and installs a matching Wasm SDK from swift-sdk-index
    (idempotent — skipped if already installed).
  - Runs `make bootstrap` to install JS deps.
  - Prints SWIFT_SDK_ID for use with `make unittest`.

The script runs under bash via shebang; the export instructions it prints
work unchanged in zsh and bash. The repo does not track .swift-version;
contributors who want it ignored locally can add it to .git/info/exclude.
The original manual instructions are kept in CONTRIBUTING.md as a fallback.
* BridgeJS: Use `@JS` types from other modules in the same package

* BridgeJS: Improve diagnostics with multi-module AOT

* BridgeJS: Fix an issue where the skeleton was being treated as a resource

* Fix typo

* Documentation improvements
…ace (#709) (#727)

* [BridgeJS] Synthesize typed-closure init access from declaration surface

Resolves #709: a public `@JSClass` exposing a
`JSTypedClosure<...>` parameter could not be consumed from another target
because the synthesized `extension JSTypedClosure { init(...) }` was always
internal, leaving downstream callers no way to construct the closure value
without hand-rolling a public wrapper.

Imported skeleton entries now record the source access level
(`public`/`package`/`internal`); the closure-signature collector takes the
maximum across every surface that references a given signature, and
`ClosureCodegen` prefixes the synthesized init with the resulting modifier
(internal stays bare). This matches the pattern `JSClassMacro` already uses
for `init(unsafelyWrapping:)`.

* [BridgeJS] Address PR feedback and refresh generated artifacts

- Make `accessLevel` decode-tolerant on imported skeleton structs
  (`ImportedFunctionSkeleton`, `ImportedConstructorSkeleton`,
  `ImportedGetterSkeleton`, `ImportedSetterSkeleton`,
  `ImportedTypeSkeleton`) by writing explicit `init(from:)` decoders
  that fall back to `.internal` when the key is missing. Without this,
  any pre-existing skeleton JSON without the new field fails decoding —
  the `build-examples` CI job hit `DecodingError.keyNotFound` for
  `accessLevel` against externally consumed skeletons.
- Extract a private `recordSignature` helper so `visitClosure` and
  `recordInjectedSignature` share a single merge implementation.
- Assert in `withAccessLevel(rawLevel:)` so unknown access strings
  ("open", "private", future schema additions) surface in debug
  builds instead of silently inheriting the outer level.
- Document the `.internal` seeding assumption on
  `ClosureSignatureCollectorVisitor.init(moduleName:signatures:)`.
- Regenerate the BridgeJS pre-generated artifacts under Benchmarks/,
  Examples/PlayBridgeJS/, Tests/BridgeJSIdentityTests/, and
  Tests/BridgeJSRuntimeTests/ via `./Utilities/bridge-js-generate.sh`,
  per CONTRIBUTING.md. The runtime-tests Swift output now emits
  `public init` on three `JSTypedClosure` extensions whose signatures
  surface through public exported types.

* [BridgeJS] Refresh identity tests skeleton after merge with main

#731 added the GC lifecycle test (with new imported function entries)
to main while this branch was open. Re-running the BridgeJS regen
against the merged tree fills in the `accessLevel` field on the new
entries that were absent at merge time.

* ci: retry flaky JSPromiseTests.testPromiseAndTimer
BridgeJS: Add swift-format-ignore-file to generated Swift sources
BridgeJS: Support nested @js types inside structs and classes
BridgeJS: Diagnose struct initializer parameter order mismatch
Remove @_spi(BridgeJS) from _BridgedAsOptional protocol and its
Optional/JSUndefinedOr conformances so the conformances are visible
in Embedded Swift mode. The underscore-prefixed protocol name already
signals internal API, and all extension methods remain @_spi-gated.

Fixes #689
JSString.Guts previously held a raw JavaScriptObjectRef and released it
unconditionally on whatever thread ran deinit. In the multithreaded Wasm
runtime each thread has its own JSObjectSpace, so releasing a ref on the
wrong thread caused a TypeError crash (BugSnag: rc property of undefined).

JSObject already handles this correctly by capturing ownerTid at init time
and routing deinit through swjs_release_remote when destroyed off-thread.
This change makes Guts hold a JSObject instead of a raw ref, delegating the
correct cross-thread release behaviour to the existing JSObject.deinit path.

Adds a regression test testDeinitJSStringOnDifferentThread that reproduces
the crash deterministically: it forces JS ref allocation on the main thread
via asInternalJSRef(), then drops the last reference on a worker thread.

Fixes the crash seen in v292745-rc4 after upgrading to JavaScriptKit 0.50.2.

https://claude.ai/code/session_01Qhg5GLXZYNJtH63Gs1SwJH
BridgeJS: Fix closures with struct return
…ollision

BridgeJS: Fix name collision for same-named nested structs
BridgeJS: Add JSTypedArray convenience typealiases as recognized types

Add JSInt8Array, JSUint8Array, JSInt16Array, JSUint16Array, JSInt32Array,
JSUint32Array, JSFloat32Array, JSFloat64Array typealiases and pre-seed
them in SwiftToSkeleton so BridgeJS recognizes them in @js signatures.

Users can now write:
  @js func processData(_ data: JSUint8Array) -> JSUint8Array

Generated TypeScript uses native typed array names:
  processData(data: Uint8Array): Uint8Array

Bridging is reference-based (passes JSObject ID, no data copying).
Follows the existing JSPromise pre-seeding pattern.
Optional @js structs could not be used as parameters or return values of
imported (@JSFunction) signatures: the generator lowered Optional<Struct>
using the non-optional object-id ABI ([isSome, objectId] / a single Int32
return), for which no Optional lowering exists, so the generated thunk did
not compile.

Bridge optional @js structs through the stack ABI instead - an isSome
discriminator plus the struct fields - exactly like optional arrays and
dictionaries. Structs already conform to the stack-based bridging protocols,
so the existing _BridgedAsOptional/stack runtime extensions and the JS link's
stack handling already support this; only the import-side lowering/lifting in
the code generator needed to change.

Adds a jsRoundTripOptionalPoint runtime round-trip (some + none) and a
SwiftStructImports codegen snapshot.
BridgeJS: Support optional @js struct in imported function signatures
Case enums (enums without raw values or associated values) already bridged
across the export boundary as their Int32 tag, but the TypeScript import path
rejected them with "Enum types are not yet supported in TypeScript imports".
The JS glue already round-trips the tag in both directions, so enable case
enums as imported (@JSFunction) parameters and return values by lowering and
lifting that Int32 tag in the import context, matching the export side.

Adds a CaseEnumImports round-trip test and an EnumCaseImport codegen snapshot.
BridgeJS: Support case enums as imported function parameters and returns
A Wasm i64 parameter or return value is represented as a JavaScript BigInt.
The generated JS used a plain 0 as the placeholder for the absent case of an
optional i64 parameter (isSome ? v : 0) and for the error-path return of an
imported thunk, so calling such an export with null (or an imported i64
function throwing) raised "TypeError: Cannot convert 0 to a BigInt".

Emit 0n for i64 in both placeholders (jsZeroLiteral and the imported-thunk
return placeholder). This was latent because the optional Int64/UInt64
round-trip tests never exercised the none case; add those assertions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⤵️ pull merge-conflict Resolve conflicts manually

Projects

None yet

Development

Successfully merging this pull request may close these issues.