Skip to content

Player 1.0.0#865

Merged
KetanReddy merged 72 commits into
mainfrom
player-1-dot-zero
Jun 24, 2026
Merged

Player 1.0.0#865
KetanReddy merged 72 commits into
mainfrom
player-1-dot-zero

Conversation

@KetanReddy

@KetanReddy KetanReddy commented May 11, 2026

Copy link
Copy Markdown
Member

Change Type (required)

Indicate the type of change your pull request is:

  • patch
  • minor
  • major
  • N/A

Does your PR have any documentation updates?

  • Updated docs
  • No Update needed
  • Unable to update docs

Release Notes

Full release notes are available on the doc site

📦 Published PR as canary version: 1.0.0--canary.865.36825

Try this version out locally by upgrading relevant packages to 1.0.0--canary.865.36825

KetanReddy and others added 30 commits January 22, 2026 13:12
…rom core (#786)

<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
# What

1. Remove `set` and `delete` from core `ReadOnlyDataController`. They
previously just logged an error and did nothing. Omitting `set` and
`delete` is a cleaner API. This is outside the scope of the original
issue but was discussed with @KetanReddy
2. Introduce a `ReadOnlyDataController` on iOS. This wraps the core
version of the same. A `CompletedState` on iOS will now include this
controller.
3. For parity, add a public `makeReadOnly()` to the iOS
`DataController`. It's not used on iOS, however.

# Why
#219

We should have parity across all platforms. This updates ios to match
the same public API as the core for the Read-Only Data Controller. The
read-only version of the data controller was introduced to allow users
to access data / evaluate bindings after a flow has ended.

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A` (this is part of the major release)


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
---------

Co-authored-by: Jeremy Jessup <jeremy_jessup@intuit.com>
Closes #220 

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [ ] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
Closes #360 

Fixes this in a much less intensive way that originally proposed by just
forcing circular dependencies to resolve to the workspace version of the
package. For now this is going to have to be a manual process and only
works for JavaScript dependencies but solves for the current scope of
the issues.

This also technically isn't a breaking change so this could go out
separately not as part of the 1.0 work.

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
Closes #790 

All platforms now support registering plugins with a player after it has
been instantiated.

## JVM (HeadlessPlayer)
Added registerPlugin(plugin: Plugin) that appends to the plugins list
and applies the plugin appropriately (RuntimePlugin, JSPluginWrapper, or
PlayerPlugin).

## Android (AndroidPlayer)
- Added registerPlugin(plugin: Plugin) that delegates to the underlying
HeadlessPlayer for standard plugins, or stores and applies
AndroidPlayerPlugin instances directly.

## iOS (HeadlessPlayer / HeadlessPlayerImpl)
- Added registerPlugin(_ plugin: NativePlugin) as a protocol requirement
with a default implementation. Concrete implementations (e.g.
HeadlessPlayerImpl) track registered plugins in a mutable plugins list.

## React (ReactPlayer)
- Updated registerPlugin to accept both ReactPlayerPlugin and
PlayerPlugin, calling apply on the core player and applyReact on the
React player as appropriate.

TODO:

- [ ] Update Migration Guide

### Change Type (required)
Indicate the type of change your pull request is:

- [x] `patch`
- [ ] `minor`
- [ ] `major`
- [ ] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs
@KetanReddy KetanReddy added the major Increment the major version when merged label May 11, 2026
@codecov

codecov Bot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (563905d) to head (f8879e7).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@     Coverage Diff     @@
##   main   #865   +/-   ##
===========================
===========================

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

* GenericAsset

* collapse SuspendableAsset and AsyncHydrationTracker

* suspend render with ugly API

* Suspend render with a bunch of TODOs for tests and asyncHydrationTracker

* Scoped hydration + nested renders. Fixed all android tests, transitionAnimation remains

* fix some typing problems

* lint fixes

* revert pnpm-lock.yaml

* add hydration tracking to composable, fix assetTest

* fix assetTest set up

* lint fixes

* add guava dep to testutils

* drop robolectric explicit dependency

* exclude robolectric transitive

* separate out AssetTest to not poison demo test with robolectric

* non-suspend hydrate + some clean up

* replace GenericAsset interface with AnyAsset typealias

* remove no-op catch

* Fixed composable test

* lint

* fix compose passing down styling to xml

* input test

* info test use text

* lint

---------

Co-authored-by: Jeremiah Zucker <zucker.jeremiah@gmail.com>
@brocollie08

Copy link
Copy Markdown
Contributor

/canary

intuit-svc added a commit to player-ui/player-ui.github.io that referenced this pull request May 19, 2026
@intuit-svc

intuit-svc commented May 19, 2026

Copy link
Copy Markdown
Contributor

Build Preview

Your PR was deployed by CircleCI #36825 on Fri, 22 May 2026 17:35:59 GMT with this version:

1.0.0--canary.865.36825

📖 Docs (View site)

JunDangIntuit and others added 4 commits May 20, 2026 10:51
<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
Restores `SwiftUIPlayer.clearExceptionHandler()` on iOS, which was
removed in #864 as part of the unused-methods cleanup. This method will
still be used.

### Change Type (required)
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A`

### Does your PR have any documentation updates?
- [x] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs

<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
@KetanReddy

Copy link
Copy Markdown
Member Author

/canary

@KetanReddy KetanReddy changed the title Player 1.0 Player 1.0.0 May 22, 2026
intuit-svc added a commit to player-ui/player-ui.github.io that referenced this pull request May 22, 2026
KVSRoyal and others added 2 commits June 3, 2026 16:55
---------

Co-authored-by: Jeremiah Zucker <zucker.jeremiah@gmail.com>
@intuit-svc

intuit-svc commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Comparison against baseline from main. ⚠️ = regression (>10% slower), ✅ = improvement (>5% faster)

core/player ⚠️

Benchmark Current Baseline Change
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.bar 866.38K ops/s 829.55K ops/s +4.4%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.1.name 482.38K ops/s 471.95K ops/s +2.2%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.01.name 391.93K ops/s 449.85K ops/s -12.9% ⚠️
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets['01'].name 337.57K ops/s 455.97K ops/s -26.0% ⚠️
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[01].name 484.61K ops/s 525.67K ops/s -7.8%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[name = "frodo"].type 286.26K ops/s 285.08K ops/s +0.4%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 239.07K ops/s 225.22K ops/s +6.1% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = false].type 305.85K ops/s 293.51K ops/s +4.2%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = true].type 309.55K ops/s 285.82K ops/s +8.3% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.bar 517.22K ops/s 518.68K ops/s -0.3%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.1.name 372.08K ops/s 299.05K ops/s +24.4% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.01.name 376.21K ops/s 323.91K ops/s +16.1% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets['01'].name 334.85K ops/s 308.76K ops/s +8.4% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[01].name 378.91K ops/s 338.32K ops/s +12.0% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[name = "frodo"].type 213.07K ops/s 232.49K ops/s -8.4%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 173.43K ops/s 192.64K ops/s -10.0%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = false].type 224.99K ops/s 190.33K ops/s +18.2% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = true].type 230.08K ops/s 240.88K ops/s -4.5%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (sync) 482.49K ops/s 459.35K ops/s +5.0% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (async) 379.52K ops/s 357.97K ops/s +6.0% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (sync) 494.41K ops/s 454.15K ops/s +8.9% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (async) 430.45K ops/s 327.17K ops/s +31.6% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (sync) 211.03K ops/s 142.77K ops/s +47.8% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (async) 180.19K ops/s 158.33K ops/s +13.8% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (sync) 164.43K ops/s 132.58K ops/s +24.0% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (async) 155.46K ops/s 147.62K ops/s +5.3% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (sync) N/A N/A N/A
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (async) 260.57K ops/s 273.16K ops/s -4.6%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (sync) 326.38K ops/s 297.10K ops/s +9.9% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (async) 294.91K ops/s 257.57K ops/s +14.5% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (sync) 842.91K ops/s 816.45K ops/s +3.2%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (async) 692.02K ops/s 637.24K ops/s +8.6% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (sync) 178.89K ops/s 175.98K ops/s +1.7%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (async) 159.54K ops/s 155.42K ops/s +2.7%
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > initial resolve 615.87 ops/s 620.93 ops/s -0.8%
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > Resolving from cache 15.92K ops/s 17.85K ops/s -10.8% ⚠️
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes 2.83K ops/s 2.83K ops/s -0.1%
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes slow 646.42 ops/s 632.89 ops/s +2.1%

plugins/async-node/core ⚠️

Benchmark Current Baseline Change
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 1 times 11.75K ops/s 11.72K ops/s +0.3%
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 5 times 10.65K ops/s 12.07K ops/s -11.8% ⚠️
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 10 times 9.39K ops/s 9.77K ops/s -3.9%
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 50 times 2.68K ops/s 2.77K ops/s -3.0%
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 100 times 1.34K ops/s 1.54K ops/s -12.8% ⚠️
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 1 times 7.13K ops/s 6.84K ops/s +4.3%
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 5 times 7.38K ops/s 6.97K ops/s +5.9% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 10 times 6.60K ops/s 6.83K ops/s -3.5%
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 50 times 2.65K ops/s 2.28K ops/s +16.2% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 100 times 1.54K ops/s 1.44K ops/s +6.4% ✅

react/player ⚠️

Benchmark Current Baseline Change
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 1 ReactAssets 584.28 ops/s 584.03 ops/s +0.0%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 1 ReactAssets 1.11K ops/s 1.01K ops/s +9.6% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 5 ReactAssets 575.79 ops/s 548.63 ops/s +5.0%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 5 ReactAssets 1.08K ops/s 912.95 ops/s +17.9% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 10 ReactAssets 559.52 ops/s 557.96 ops/s +0.3%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 10 ReactAssets 851.65 ops/s 754.95 ops/s +12.8% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 50 ReactAssets 465.54 ops/s 465.45 ops/s +0.0%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 50 ReactAssets 223.57 ops/s 256.40 ops/s -12.8% ⚠️
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 100 ReactAssets 384.40 ops/s 357.18 ops/s +7.6% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 100 ReactAssets 115.90 ops/s 86.54 ops/s +33.9% ✅

KVSRoyal and others added 4 commits June 16, 2026 11:03
* Pass started flow back via Managed Player

* Update android .api files

* Update input asset to fix test

* Update 1.0 guide
* viewApply function for inflate API

* better overloading for vararg styles inflates

* lint
@KetanReddy KetanReddy marked this pull request as ready for review June 24, 2026 20:16
@KetanReddy KetanReddy requested review from a team as code owners June 24, 2026 20:16
@KetanReddy KetanReddy merged commit 4e7da1d into main Jun 24, 2026
15 of 17 checks passed
@KetanReddy KetanReddy deleted the player-1-dot-zero branch June 24, 2026 20:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

major Increment the major version when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants