Player 1.0.0#865
Merged
Merged
Conversation
…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
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #865 +/- ##
===========================
===========================
☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
* 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>
Contributor
|
/canary |
intuit-svc
added a commit
to player-ui/player-ui.github.io
that referenced
this pull request
May 19, 2026
<!-- 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(...) ``` -->
Member
Author
|
/canary |
intuit-svc
added a commit
to player-ui/player-ui.github.io
that referenced
this pull request
May 22, 2026
--------- Co-authored-by: Jeremiah Zucker <zucker.jeremiah@gmail.com>
Contributor
Benchmark ResultsComparison against baseline from
|
| 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% ✅ |
* 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
brocollie08
approved these changes
Jun 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Change Type (required)
Indicate the type of change your pull request is:
patchminormajorN/ADoes your PR have any documentation updates?
Release Notes
Full release notes are available on the doc site
📦 Published PR as canary version:
1.0.0--canary.865.36825Try this version out locally by upgrading relevant packages to 1.0.0--canary.865.36825