Player 1.0.0#865
Draft
KetanReddy wants to merge 70 commits into
Draft
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
This reverts commit ebbac1b.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
<!-- Describe what's changing, why, and any other background info. Make sure to add: - Tests - Documentation Updates --> Merge latest `main` into `player-1-dot-zero` ### 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(...) ``` -->
<!-- Describe what's changing, why, and any other background info. Make sure to add: - Tests - Documentation Updates --> SwiftUIPlayer.swift Removed redundant clearExceptionHandler() method — cleanup already handled in unload() Removed unnecessary ctx.setObject(nil, forKeyedSubscript: "player") call Added inline comments clarifying the purpose of each nullification step in unload() ### 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. --> - [x] `patch` - [ ] `minor` - [ ] `major` - [ ] `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(...) ``` -->
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 |
839.93K ops/s | 814.11K ops/s | +3.2% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.1.name |
513.06K ops/s | 520.99K ops/s | -1.5% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.01.name |
438.57K ops/s | 484.39K ops/s | -9.5% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets['01'].name |
422.15K ops/s | 443.70K ops/s | -4.9% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[01].name |
502.18K ops/s | 448.52K ops/s | +12.0% ✅ |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[name = "frodo"].type |
277.03K ops/s | 229.59K ops/s | +20.7% ✅ |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type |
214.69K ops/s | 236.56K ops/s | -9.2% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = false].type |
248.04K ops/s | 293.76K ops/s | -15.6% |
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = true].type |
160.45K ops/s | 291.77K ops/s | -45.0% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.bar |
540.71K ops/s | 585.10K ops/s | -7.6% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.1.name |
392.98K ops/s | 362.44K ops/s | +8.4% ✅ |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.01.name |
358.80K ops/s | 365.41K ops/s | -1.8% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets['01'].name |
327.99K ops/s | 337.57K ops/s | -2.8% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[01].name |
327.48K ops/s | 360.75K ops/s | -9.2% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[name = "frodo"].type |
227.78K ops/s | 231.82K ops/s | -1.7% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type |
186.42K ops/s | 195.10K ops/s | -4.4% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = false].type |
216.57K ops/s | 234.64K ops/s | -7.7% |
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = true].type |
227.11K ops/s | 233.18K ops/s | -2.6% |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (sync) |
489.18K ops/s | 386.32K ops/s | +26.6% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (async) |
386.64K ops/s | 355.63K ops/s | +8.7% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (sync) |
499.72K ops/s | 467.51K ops/s | +6.9% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (async) |
429.77K ops/s | 427.69K ops/s | +0.5% |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (sync) |
194.92K ops/s | 141.47K ops/s | +37.8% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (async) |
189.18K ops/s | 146.09K ops/s | +29.5% ✅ |
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) |
163.49K ops/s | 140.98K ops/s | +16.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) |
115.08K ops/s | 151.43K ops/s | -24.0% |
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) |
287.16K ops/s | 261.47K ops/s | +9.8% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (sync) |
317.90K ops/s | 345.63K ops/s | -8.0% |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (async) |
288.75K ops/s | 269.48K ops/s | +7.2% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (sync) |
820.18K ops/s | 834.09K ops/s | -1.7% |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (async) |
702.21K ops/s | 640.68K ops/s | +9.6% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (sync) |
178.54K ops/s | 161.30K ops/s | +10.7% ✅ |
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (async) |
151.25K ops/s | 158.47K ops/s | -4.6% |
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > initial resolve |
683.72 ops/s | 545.34 ops/s | +25.4% ✅ |
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > Resolving from cache |
19.73K ops/s | 15.42K ops/s | +28.0% ✅ |
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes |
3.00K ops/s | 2.13K ops/s | +40.9% ✅ |
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes slow |
647.43 ops/s | 406.30 ops/s | +59.3% ✅ |
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 |
9.50K ops/s | 8.39K ops/s | +13.2% ✅ |
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 5 times |
9.23K ops/s | 10.87K ops/s | -15.0% |
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 10 times |
8.16K ops/s | 8.74K ops/s | -6.6% |
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 50 times |
2.87K ops/s | 2.48K ops/s | +16.0% ✅ |
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 100 times |
1.43K ops/s | 1.40K ops/s | +2.2% |
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 1 times |
7.01K ops/s | 7.81K ops/s | -10.3% |
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 5 times |
7.97K ops/s | 7.80K ops/s | +2.2% |
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 10 times |
6.47K ops/s | 7.66K ops/s | -15.5% |
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 50 times |
2.23K ops/s | 2.53K ops/s | -12.1% |
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 100 times |
1.47K ops/s | 1.43K ops/s | +2.8% |
react/player ⚠️
| Benchmark | Current | Baseline | Change |
|---|---|---|---|
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 1 ReactAssets |
539.71 ops/s | 572.33 ops/s | -5.7% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 1 ReactAssets |
847.84 ops/s | 895.15 ops/s | -5.3% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 5 ReactAssets |
534.61 ops/s | 564.93 ops/s | -5.4% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 5 ReactAssets |
894.18 ops/s | 888.75 ops/s | +0.6% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 10 ReactAssets |
529.73 ops/s | 536.68 ops/s | -1.3% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 10 ReactAssets |
684.49 ops/s | 805.32 ops/s | -15.0% |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 50 ReactAssets |
425.92 ops/s | 389.77 ops/s | +9.3% ✅ |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 50 ReactAssets |
238.08 ops/s | 208.73 ops/s | +14.1% ✅ |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 100 ReactAssets |
329.37 ops/s | 282.34 ops/s | +16.7% ✅ |
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 100 ReactAssets |
94.25 ops/s | 92.51 ops/s | +1.9% |
* Pass started flow back via Managed Player * Update android .api files * Update input asset to fix test * Update 1.0 guide
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