@symbiote-native/angular 3.0.2 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -30
- package/build/angular/callback-host.d.ts +2 -5
- package/build/angular/callback-host.js +11 -36
- package/build/angular/callback-host.js.map +1 -1
- package/build/angular/change-detection-flush.d.ts +1 -0
- package/build/angular/change-detection-flush.js +58 -14
- package/build/angular/change-detection-flush.js.map +1 -1
- package/build/angular/components/flat-list/index.d.ts +4 -2
- package/build/angular/components/flat-list/index.js +28 -78
- package/build/angular/components/flat-list/index.js.map +1 -1
- package/build/angular/components/image-shared.d.ts +8 -2
- package/build/angular/components/modal/index.d.ts +1 -0
- package/build/angular/components/modal/index.js +23 -16
- package/build/angular/components/modal/index.js.map +1 -1
- package/build/angular/components/section-list/index.d.ts +3 -1
- package/build/angular/components/section-list/index.js +10 -2
- package/build/angular/components/section-list/index.js.map +1 -1
- package/build/angular/components/virtualized-list/directives.js +7 -4
- package/build/angular/components/virtualized-list/directives.js.map +1 -1
- package/build/angular/components/virtualized-list/index.d.ts +10 -2
- package/build/angular/components/virtualized-list/index.js +45 -25
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.d.ts +5 -1
- package/build/angular/components/virtualized-section-list/index.js +10 -2
- package/build/angular/components/virtualized-section-list/index.js.map +1 -1
- package/build/angular/element-props.d.ts +16 -5
- package/build/angular/elements.d.ts +5 -21
- package/build/angular/elements.js +18 -26
- package/build/angular/elements.js.map +1 -1
- package/build/angular/index.d.ts +0 -1
- package/build/angular/index.js +5 -7
- package/build/angular/index.js.map +1 -1
- package/build/angular/renderer/index.d.ts +11 -0
- package/build/angular/renderer/index.js +97 -12
- package/build/angular/renderer/index.js.map +1 -1
- package/build/angular/runtime-matching.d.ts +0 -1
- package/build/angular/runtime-matching.js +6 -29
- package/build/angular/runtime-matching.js.map +1 -1
- package/package.json +6 -6
- package/src/callback-host.ts +10 -43
- package/src/change-detection-flush.ts +67 -14
- package/src/components/flat-list/index.ts +22 -54
- package/src/components/modal/index.ts +22 -16
- package/src/components/section-list/index.ts +4 -1
- package/src/components/virtualized-list/directives.ts +10 -8
- package/src/components/virtualized-list/index.ts +38 -13
- package/src/components/virtualized-section-list/index.ts +6 -1
- package/src/element-props.ts +22 -13
- package/src/elements.ts +21 -56
- package/src/index.ts +5 -7
- package/src/renderer/index.ts +107 -11
- package/src/runtime-matching.ts +6 -30
- package/build/angular/style-host.d.ts +0 -11
- package/build/angular/style-host.js +0 -86
- package/build/angular/style-host.js.map +0 -1
- package/src/style-host.ts +0 -94
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @symbiote-native/angular
|
|
2
2
|
|
|
3
3
|
The **Angular adapter** for [SymbioteNative](../../README.md) — render real native iOS/Android views
|
|
4
|
-
from Angular, on the _same_ untouched core as React and
|
|
4
|
+
from Angular, on the _same_ untouched core as React, Vue, Svelte, and Solid, with React Native's own renderer
|
|
5
5
|
never in the path. It is a `Renderer2`/`RendererFactory2` whose calls map onto the engine's
|
|
6
6
|
four-call mutation API; `@symbiote-native/engine` does the clone-on-write commit into Fabric.
|
|
7
7
|
|
|
@@ -22,57 +22,57 @@ already-validated engine with zero changes to it.
|
|
|
22
22
|
## Install
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
|
|
25
|
+
npx @symbiote-native/cli new my-app --framework angular
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
One command, nothing to wire by hand: this adapter needs the most build wiring of the five (the
|
|
29
|
+
AOT pipeline, `ngc --watch` alongside Metro, the static-block Babel plugin below) — the generator
|
|
30
|
+
sets up all of it, plus `@symbiote-native/angular`/`react-native`/`@angular/core`/`@angular/forms`
|
|
31
|
+
as your app's own dependencies.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
<details>
|
|
34
|
+
<summary>Manual install (no generator — an existing app, or you want to wire it yourself)</summary>
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
```bash
|
|
37
|
+
npm install @symbiote-native/angular react-native @angular/core @angular/forms
|
|
38
|
+
```
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
`react-native`, `@angular/core`, and `@angular/forms` (all **>=20**, for stable zoneless change
|
|
41
|
+
detection) stay your app's own top-level dependencies. `@angular/forms` is a real peer, not
|
|
42
|
+
boilerplate — `text-input`'s `NG_VALUE_ACCESSOR` registration (for `ngModel`/`formControl*`
|
|
43
|
+
binding) imports `ControlValueAccessor` from it. Follow [`examples/angular`](../../examples/angular)
|
|
44
|
+
for the AOT pipeline (`ngc --watch` alongside Metro — see [Run it](#run-it)) and the Metro config;
|
|
45
|
+
there is no wiring script for an existing app.
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
// index.js
|
|
43
|
-
import { AppRegistry as RNAppRegistry } from 'react-native';
|
|
44
|
-
import { mount } from '@symbiote-native/angular';
|
|
45
|
-
import { AppComponent } from './App';
|
|
46
|
-
import { name as appName } from './app.json';
|
|
47
|
+
</details>
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
mount(rootTag, AppComponent);
|
|
52
|
-
});
|
|
53
|
-
```
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Use it
|
|
54
52
|
|
|
55
53
|
The app is ordinary standalone Angular. The native primitives are lowercase intrinsic tags, same as
|
|
56
54
|
every other adapter — Angular still needs them declared in the component's `imports:` array (an
|
|
57
55
|
Angular "element directive" is what makes `ngtsc` accept the tag with typed props), so
|
|
58
56
|
`SYMBIOTE_ELEMENTS` from `@symbiote-native/angular` covers the whole primitive surface in one import.
|
|
59
|
-
|
|
57
|
+
Styling is a CSS class against a plain `.css` file — the convention every example app here
|
|
58
|
+
follows. A tap→increment counter:
|
|
60
59
|
|
|
61
60
|
```ts
|
|
62
61
|
import { Component, signal } from '@angular/core';
|
|
63
62
|
import { SYMBIOTE_ELEMENTS } from '@symbiote-native/angular';
|
|
63
|
+
import './App.css';
|
|
64
64
|
|
|
65
65
|
@Component({
|
|
66
66
|
selector: 'app-root',
|
|
67
67
|
standalone: true,
|
|
68
68
|
imports: [SYMBIOTE_ELEMENTS],
|
|
69
69
|
template: `
|
|
70
|
-
<view
|
|
70
|
+
<safe-area-view class="screen">
|
|
71
71
|
<text>Taps: {{ count() }}</text>
|
|
72
72
|
<pressable (press)="count.set(count() + 1)">
|
|
73
73
|
<text>Tap me</text>
|
|
74
74
|
</pressable>
|
|
75
|
-
</view>
|
|
75
|
+
</safe-area-view>
|
|
76
76
|
`,
|
|
77
77
|
})
|
|
78
78
|
export class AppComponent {
|
|
@@ -80,6 +80,57 @@ export class AppComponent {
|
|
|
80
80
|
}
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
+
```css
|
|
84
|
+
/* App.css */
|
|
85
|
+
.screen {
|
|
86
|
+
flex: 1;
|
|
87
|
+
align-items: center;
|
|
88
|
+
justify-content: center;
|
|
89
|
+
padding: 24px;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
<details>
|
|
94
|
+
<summary>Native entry point (index.js) — already scaffolded by <code>npx @symbiote-native/cli new --framework angular</code></summary>
|
|
95
|
+
|
|
96
|
+
The zero-config entry mirrors real Angular's own `bootstrapApplication(RootComponent, config)`
|
|
97
|
+
idiom and wires the same RN-backed host seams the other adapters' entries do — this is what
|
|
98
|
+
[`examples/angular`](../../examples/angular) actually uses:
|
|
99
|
+
|
|
100
|
+
```js
|
|
101
|
+
// index.js
|
|
102
|
+
|
|
103
|
+
// Registers host behaviors (Image, Pressable, Switch, ...) that /bootstrap alone doesn't
|
|
104
|
+
// reach; deleting this breaks them silently (Metro's production inlineRequires makes a
|
|
105
|
+
// side-effect-only barrel import go lazy, see register.ts).
|
|
106
|
+
import '@symbiote-native/angular';
|
|
107
|
+
import { bootstrapApplication } from '@symbiote-native/angular/bootstrap';
|
|
108
|
+
import { AppComponent } from './App';
|
|
109
|
+
import { name as appName } from './app.json';
|
|
110
|
+
|
|
111
|
+
bootstrapApplication(AppComponent, { appName });
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For anything the defaults don't cover, drive the lower-level seam directly — the same
|
|
115
|
+
`registerRunnable` seam React and Vue use, with `mount` from `@symbiote-native/angular` driving the
|
|
116
|
+
engine through Angular's `Renderer2`:
|
|
117
|
+
|
|
118
|
+
```js
|
|
119
|
+
// index.js
|
|
120
|
+
import { AppRegistry as RNAppRegistry } from 'react-native';
|
|
121
|
+
import { mount } from '@symbiote-native/angular';
|
|
122
|
+
import { AppComponent } from './App';
|
|
123
|
+
import { name as appName } from './app.json';
|
|
124
|
+
|
|
125
|
+
// registerRunnable (not registerComponent): RN stores a raw mount callback and never renders
|
|
126
|
+
// it with its own renderer. We mount the Angular app onto the surface's rootTag.
|
|
127
|
+
RNAppRegistry.registerRunnable(appName, ({ rootTag }) => {
|
|
128
|
+
mount(rootTag, AppComponent);
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
</details>
|
|
133
|
+
|
|
83
134
|
The full canary is [`examples/angular`](../../examples/angular) — a stock RN 0.86 app whose
|
|
84
135
|
[`App.ts`](../../examples/angular/src/App.ts) exercises the same surface as the React and Vue
|
|
85
136
|
reference canaries, standalone components, zoneless change detection.
|
|
@@ -89,8 +140,8 @@ reference canaries, standalone components, zoneless change detection.
|
|
|
89
140
|
## Parity — and the one gap
|
|
90
141
|
|
|
91
142
|
Angular reaches the same 21+ primitives, runtime modules, `Animated` on both drivers, gestures,
|
|
92
|
-
accessibility, and the `VirtualizedList` family as React
|
|
93
|
-
Android. That parity is **structural, not
|
|
143
|
+
accessibility, and the `VirtualizedList` family as React, Vue, Svelte, and Solid, verified
|
|
144
|
+
on-device on iOS and Android. That parity is **structural, not
|
|
94
145
|
hand-copied**: the component logic (state machines + render functions) is written **once** in
|
|
95
146
|
`@symbiote-native/components`, and Angular supplies only its lifecycle (`Renderer2` + zoneless change
|
|
96
147
|
detection + the descriptor→`createElement` bridge).
|
|
@@ -122,13 +173,23 @@ Angular also requires **zoneless change detection** (`provideZonelessChangeDetec
|
|
|
122
173
|
`@angular/core >=20`) — zone.js fights Hermes, and versions before 20 don't offer a stable
|
|
123
174
|
zoneless API. This is the version floor for the whole adapter, not a suggestion.
|
|
124
175
|
|
|
176
|
+
`babel.config.js` needs `@babel/plugin-transform-class-static-block`, listed **first**, before
|
|
177
|
+
`@symbiote-native/angular`'s own `babel-register-composed` and linker plugins. `ngc` emits static
|
|
178
|
+
blocks (`tsconfig.angular.base.json`'s `useDefineForClassFields: false` at ES2022 lowers a static
|
|
179
|
+
property initializer to one), and RN's preset doesn't enable that transform — the class-features
|
|
180
|
+
plugin then refuses the class outright. This only surfaces in a **Release** build (where that
|
|
181
|
+
transform actually runs) and is invisible to every headless check, so a hand-wired app missing it
|
|
182
|
+
builds and tests clean right up until the first release build. `npx @symbiote-native/cli new
|
|
183
|
+
--framework angular` already includes it; wiring Angular into an existing app by hand needs it
|
|
184
|
+
copied from [`examples/angular`](../../examples/angular)'s own `babel.config.js`.
|
|
185
|
+
|
|
125
186
|
---
|
|
126
187
|
|
|
127
188
|
## Run it
|
|
128
189
|
|
|
129
190
|
[`examples/angular`](../../examples/angular) is a stock React Native 0.86 app. Requires Node ≥
|
|
130
|
-
22.13 and the [RN environment
|
|
131
|
-
CocoaPods):
|
|
191
|
+
22.13 (react-native 0.86's own `package.json#engines`) and the [RN environment
|
|
192
|
+
setup](https://reactnative.dev/docs/set-up-your-environment) (Xcode, CocoaPods):
|
|
132
193
|
|
|
133
194
|
```bash
|
|
134
195
|
cd examples/angular
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type OnChanges, type
|
|
1
|
+
import { type OnChanges, type SimpleChanges } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
/**
|
|
4
4
|
* THE SAME NAMES AS A LITERAL, and the duplication is forced rather than chosen.
|
|
@@ -13,13 +13,10 @@ import * as i0 from "@angular/core";
|
|
|
13
13
|
export declare const CALLBACK_ATTRIBUTE_SELECTOR: string;
|
|
14
14
|
/** Exported for the guard alone — the decorator below must spell its own list for ngtsc. */
|
|
15
15
|
export declare const CALLBACK_INPUT_NAMES: readonly string[];
|
|
16
|
-
export declare class SymbioteCallbackHost implements OnChanges
|
|
16
|
+
export declare class SymbioteCallbackHost implements OnChanges {
|
|
17
17
|
private readonly renderer;
|
|
18
18
|
private readonly host;
|
|
19
|
-
private readonly detector;
|
|
20
|
-
constructor();
|
|
21
19
|
ngOnChanges(changes: SimpleChanges): void;
|
|
22
|
-
ngOnDestroy(): void;
|
|
23
20
|
static ɵfac: i0.ɵɵFactoryDeclaration<SymbioteCallbackHost, never>;
|
|
24
21
|
static ɵdir: i0.ɵɵDirectiveDeclaration<SymbioteCallbackHost, "[onAccessibilityAction],[onAccessibilityEscape],[onAccessibilityTap],[onBlur],[onContentSizeChange],[onEndEditing],[onError],[onFocus],[onHoverIn],[onHoverOut],[onKeyPress],[onLayout],[onLoad],[onLoadEnd],[onLoadStart],[onLongPress],[onMagicTap],[onMomentumScrollBegin],[onMomentumScrollEnd],[onMoveShouldSetResponder],[onMoveShouldSetResponderCapture],[onPartialLoad],[onPress],[onPressIn],[onPressMove],[onPressOut],[onProgress],[onRefresh],[onResponderEnd],[onResponderGrant],[onResponderMove],[onResponderReject],[onResponderRelease],[onResponderStart],[onResponderTerminate],[onResponderTerminationRequest],[onScrollBeginDrag],[onScrollEndDrag],[onScrollToTop],[onSelectionChange],[onStartShouldSetResponder],[onStartShouldSetResponderCapture],[onSubmitEditing],[onValueChange]", never, { "onAccessibilityAction": { "alias": "onAccessibilityAction"; "required": false; }; "onAccessibilityEscape": { "alias": "onAccessibilityEscape"; "required": false; }; "onAccessibilityTap": { "alias": "onAccessibilityTap"; "required": false; }; "onBlur": { "alias": "onBlur"; "required": false; }; "onContentSizeChange": { "alias": "onContentSizeChange"; "required": false; }; "onEndEditing": { "alias": "onEndEditing"; "required": false; }; "onError": { "alias": "onError"; "required": false; }; "onFocus": { "alias": "onFocus"; "required": false; }; "onHoverIn": { "alias": "onHoverIn"; "required": false; }; "onHoverOut": { "alias": "onHoverOut"; "required": false; }; "onKeyPress": { "alias": "onKeyPress"; "required": false; }; "onLayout": { "alias": "onLayout"; "required": false; }; "onLoad": { "alias": "onLoad"; "required": false; }; "onLoadEnd": { "alias": "onLoadEnd"; "required": false; }; "onLoadStart": { "alias": "onLoadStart"; "required": false; }; "onLongPress": { "alias": "onLongPress"; "required": false; }; "onMagicTap": { "alias": "onMagicTap"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "onMoveShouldSetResponder": { "alias": "onMoveShouldSetResponder"; "required": false; }; "onMoveShouldSetResponderCapture": { "alias": "onMoveShouldSetResponderCapture"; "required": false; }; "onPartialLoad": { "alias": "onPartialLoad"; "required": false; }; "onPress": { "alias": "onPress"; "required": false; }; "onPressIn": { "alias": "onPressIn"; "required": false; }; "onPressMove": { "alias": "onPressMove"; "required": false; }; "onPressOut": { "alias": "onPressOut"; "required": false; }; "onProgress": { "alias": "onProgress"; "required": false; }; "onRefresh": { "alias": "onRefresh"; "required": false; }; "onResponderEnd": { "alias": "onResponderEnd"; "required": false; }; "onResponderGrant": { "alias": "onResponderGrant"; "required": false; }; "onResponderMove": { "alias": "onResponderMove"; "required": false; }; "onResponderReject": { "alias": "onResponderReject"; "required": false; }; "onResponderRelease": { "alias": "onResponderRelease"; "required": false; }; "onResponderStart": { "alias": "onResponderStart"; "required": false; }; "onResponderTerminate": { "alias": "onResponderTerminate"; "required": false; }; "onResponderTerminationRequest": { "alias": "onResponderTerminationRequest"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onScrollToTop": { "alias": "onScrollToTop"; "required": false; }; "onSelectionChange": { "alias": "onSelectionChange"; "required": false; }; "onStartShouldSetResponder": { "alias": "onStartShouldSetResponder"; "required": false; }; "onStartShouldSetResponderCapture": { "alias": "onStartShouldSetResponderCapture"; "required": false; }; "onSubmitEditing": { "alias": "onSubmitEditing"; "required": false; }; "onValueChange": { "alias": "onValueChange"; "required": false; }; }, {}, never, never, true, never>;
|
|
25
22
|
}
|
|
@@ -1,29 +1,14 @@
|
|
|
1
|
-
// The directive that
|
|
1
|
+
// The directive that CLAIMS an `on*` prop binding on a tag, and nothing more.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// Unclaimed, `[onPress]="fn"` on an element is NG0306 in dev mode (`setDomProperty` refuses `on*`
|
|
4
|
+
// DOM properties, `render3/instructions/shared.ts:296-298`), so something has to own the name. The
|
|
5
|
+
// renderer wraps the value on its way through and marks the view with `markForCheck` when the engine
|
|
6
|
+
// calls it. That view is found from the node when the callback FIRES (`change-detection-flush.ts`),
|
|
7
|
+
// so this directive injects no `ChangeDetectorRef`.
|
|
7
8
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts
|
|
11
|
-
//
|
|
12
|
-
// MATCHING IS THE CHEAPER QUESTION THAN INJECTING, and that had to be measured rather than assumed,
|
|
13
|
-
// because the selector below is dozens of alternatives and Angular tries a component's whole
|
|
14
|
-
// directive list against every element it creates. The ladder's `cb-probe` arm carries this exact
|
|
15
|
-
// string WITHOUT matching anything — the state of every element on the benchmark row — so the two
|
|
16
|
-
// halves are priced against each other in one process, rotated, with a resolution bar:
|
|
17
|
-
//
|
|
18
|
-
// carrying the selector 4.3 5.9 -2.0 5.7 -1.5 ms inside the bar in four of five
|
|
19
|
-
// the ChangeDetectorRef 9.7 23.5 13.6 31.3 23.8 ms
|
|
20
|
-
// the CALLBACK HOST -3.9 -9.3 -25.5 -25.6 -25.3 ms all five negative, three outside
|
|
21
|
-
//
|
|
22
|
-
// WHAT IS NOT VERIFIED, said plainly: the ladder's arm carries ONE element directive beside this one,
|
|
23
|
-
// where a real screen carries two dozen, and the `ng-elements` bench arm could not confirm the change
|
|
24
|
-
// at app scale — the machine it was measured on swung its untouched CONTROL from 229 to 566 ms, so
|
|
25
|
-
// nothing quoted off it would have carried a verdict either way. The controlled A/B is the evidence
|
|
26
|
-
// here; the bench-arm confirmation is owed.
|
|
9
|
+
// Carrying the selector is free: Angular tries it against every element it creates, and the
|
|
10
|
+
// ladder's `cb-probe` arm priced that inside the resolution bar in four runs of five
|
|
11
|
+
// (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts`).
|
|
27
12
|
//
|
|
28
13
|
// IT HOLDS NO INPUTS, which is what keeps the change off the public surface. The `on*` props stay
|
|
29
14
|
// declared on `SymbioteElement` and its subclasses, so every type and every forward is unchanged;
|
|
@@ -33,8 +18,7 @@
|
|
|
33
18
|
//
|
|
34
19
|
// A LEAF, like `change-detection-flush` and `renderer/value-change`: importing `elements.ts` from
|
|
35
20
|
// here would close a cycle, since that file is what puts this directive in `SYMBIOTE_ELEMENTS`.
|
|
36
|
-
import {
|
|
37
|
-
import { registerViewMarker, unregisterViewMarker, } from './change-detection-flush';
|
|
21
|
+
import { Directive, ElementRef, Renderer2, inject, } from '@angular/core';
|
|
38
22
|
import * as i0 from "@angular/core";
|
|
39
23
|
/**
|
|
40
24
|
* Every `on*` input any element directive declares, except the one that fires per FRAME.
|
|
@@ -116,10 +100,6 @@ export class SymbioteCallbackHost {
|
|
|
116
100
|
constructor() {
|
|
117
101
|
this.renderer = inject(Renderer2);
|
|
118
102
|
this.host = inject(ElementRef);
|
|
119
|
-
this.detector = inject(ChangeDetectorRef);
|
|
120
|
-
const node = this.host.nativeElement;
|
|
121
|
-
if (typeof node === 'object' && node !== null)
|
|
122
|
-
registerViewMarker(node, this.detector);
|
|
123
103
|
}
|
|
124
104
|
ngOnChanges(changes) {
|
|
125
105
|
// The renderer wraps the value on its way through, so this forwards it raw — same shape as the
|
|
@@ -127,11 +107,6 @@ export class SymbioteCallbackHost {
|
|
|
127
107
|
for (const name of Object.keys(changes))
|
|
128
108
|
this.renderer.setProperty(this.host.nativeElement, name, changes[name]?.currentValue);
|
|
129
109
|
}
|
|
130
|
-
ngOnDestroy() {
|
|
131
|
-
const node = this.host.nativeElement;
|
|
132
|
-
if (typeof node === 'object' && node !== null)
|
|
133
|
-
unregisterViewMarker(node);
|
|
134
|
-
}
|
|
135
110
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteCallbackHost, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
136
111
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteCallbackHost, isStandalone: true, selector: "[onAccessibilityAction],[onAccessibilityEscape],[onAccessibilityTap],[onBlur],[onContentSizeChange],[onEndEditing],[onError],[onFocus],[onHoverIn],[onHoverOut],[onKeyPress],[onLayout],[onLoad],[onLoadEnd],[onLoadStart],[onLongPress],[onMagicTap],[onMomentumScrollBegin],[onMomentumScrollEnd],[onMoveShouldSetResponder],[onMoveShouldSetResponderCapture],[onPartialLoad],[onPress],[onPressIn],[onPressMove],[onPressOut],[onProgress],[onRefresh],[onResponderEnd],[onResponderGrant],[onResponderMove],[onResponderReject],[onResponderRelease],[onResponderStart],[onResponderTerminate],[onResponderTerminationRequest],[onScrollBeginDrag],[onScrollEndDrag],[onScrollToTop],[onSelectionChange],[onStartShouldSetResponder],[onStartShouldSetResponderCapture],[onSubmitEditing],[onValueChange]", inputs: { onAccessibilityAction: "onAccessibilityAction", onAccessibilityEscape: "onAccessibilityEscape", onAccessibilityTap: "onAccessibilityTap", onBlur: "onBlur", onContentSizeChange: "onContentSizeChange", onEndEditing: "onEndEditing", onError: "onError", onFocus: "onFocus", onHoverIn: "onHoverIn", onHoverOut: "onHoverOut", onKeyPress: "onKeyPress", onLayout: "onLayout", onLoad: "onLoad", onLoadEnd: "onLoadEnd", onLoadStart: "onLoadStart", onLongPress: "onLongPress", onMagicTap: "onMagicTap", onMomentumScrollBegin: "onMomentumScrollBegin", onMomentumScrollEnd: "onMomentumScrollEnd", onMoveShouldSetResponder: "onMoveShouldSetResponder", onMoveShouldSetResponderCapture: "onMoveShouldSetResponderCapture", onPartialLoad: "onPartialLoad", onPress: "onPress", onPressIn: "onPressIn", onPressMove: "onPressMove", onPressOut: "onPressOut", onProgress: "onProgress", onRefresh: "onRefresh", onResponderEnd: "onResponderEnd", onResponderGrant: "onResponderGrant", onResponderMove: "onResponderMove", onResponderReject: "onResponderReject", onResponderRelease: "onResponderRelease", onResponderStart: "onResponderStart", onResponderTerminate: "onResponderTerminate", onResponderTerminationRequest: "onResponderTerminationRequest", onScrollBeginDrag: "onScrollBeginDrag", onScrollEndDrag: "onScrollEndDrag", onScrollToTop: "onScrollToTop", onSelectionChange: "onSelectionChange", onStartShouldSetResponder: "onStartShouldSetResponder", onStartShouldSetResponderCapture: "onStartShouldSetResponderCapture", onSubmitEditing: "onSubmitEditing", onValueChange: "onValueChange" }, usesOnChanges: true, ngImport: i0 }); }
|
|
137
112
|
}
|
|
@@ -207,5 +182,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
207
182
|
],
|
|
208
183
|
standalone: true,
|
|
209
184
|
}]
|
|
210
|
-
}]
|
|
185
|
+
}] });
|
|
211
186
|
//# sourceMappingURL=callback-host.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-host.js","sourceRoot":"","sources":["../../src/callback-host.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"callback-host.js","sourceRoot":"","sources":["../../src/callback-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,16 +32,50 @@
|
|
|
32
32
|
// notification, so it cannot open that window at all. It is also the narrower answer — the only
|
|
33
33
|
// view that has to be re-checked is the one holding the binding.
|
|
34
34
|
//
|
|
35
|
-
//
|
|
36
|
-
// `
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
35
|
+
// THE VIEW IS FOUND FROM THE NODE, at the moment an event needs it, not injected per element. Ivy
|
|
36
|
+
// patches `__ngContext__` onto every view's root elements and every directive host, so the nearest
|
|
37
|
+
// patched ancestor names the LView that declares the element - the one holding its `[value]`. A
|
|
38
|
+
// `ViewRef` over that LView is what `inject(ChangeDetectorRef)` would have handed out, built only
|
|
39
|
+
// for the element that fired, which is what let the read-back tags drop their directive instance
|
|
40
|
+
// (`element-directive-free.test.ts`). Projected content resolves to the view it is PROJECTED into,
|
|
41
|
+
// Angular's own discovery limit; the listener's `markForCheck` still reaches the declaring view.
|
|
40
42
|
//
|
|
41
43
|
// When a fourth behavior starts reading an app value back, it needs a name in the renderer's
|
|
42
44
|
// `READ_BACK_*` sets — the census is `queueMicrotask` / `afterCommit` in
|
|
43
45
|
// `core/components/src/behaviors`.
|
|
46
|
+
import { ɵViewRef as ViewRef, ɵgetLContext as getLContext, } from '@angular/core';
|
|
47
|
+
import { isSymbioteNode, parentOf, reportUncaughtError, } from '@symbiote-native/engine';
|
|
44
48
|
const viewFlushes = new WeakMap();
|
|
49
|
+
// Nodes whose view is found lazily when they flush. Anything else keeps the no-op an unregistered
|
|
50
|
+
// node always had - `flushViewFor` also runs after every wrapped `on*` prop, and a press must not
|
|
51
|
+
// start paying a synchronous re-check it never needed.
|
|
52
|
+
const readBackNodes = new WeakSet();
|
|
53
|
+
export function markReadBackNode(node) {
|
|
54
|
+
readBackNodes.add(node);
|
|
55
|
+
}
|
|
56
|
+
// Ivy's monkey-patch key (`render3/interfaces/context.ts`, `MONKEY_PATCH_KEY_NAME`).
|
|
57
|
+
const NG_CONTEXT = '__ngContext__';
|
|
58
|
+
/** The LView-backed ref for the view that declares `node`, or undefined outside any view. */
|
|
59
|
+
function viewRefOf(node) {
|
|
60
|
+
let patched = node;
|
|
61
|
+
while (patched !== undefined && !(NG_CONTEXT in patched))
|
|
62
|
+
patched = isSymbioteNode(patched) ? parentOf(patched) : undefined;
|
|
63
|
+
if (patched === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
const lView = getLContext(patched)?.lView;
|
|
66
|
+
return lView === undefined || lView === null ? undefined : new ViewRef(lView);
|
|
67
|
+
}
|
|
68
|
+
// REPORTED, NOT RETHROWN: this is the one change detection outside `ApplicationRef.tick()`'s error
|
|
69
|
+
// boundary, called from inside a native event dispatch where a throw becomes `RCTFatal`. Same
|
|
70
|
+
// channel `SymbioteErrorHandler` reports through.
|
|
71
|
+
function detectChangesReported(view) {
|
|
72
|
+
try {
|
|
73
|
+
view.detectChanges();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
reportUncaughtError(error, { origin: 'angular flush' });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
45
79
|
const ON_PREFIX = /^on[A-Z]/;
|
|
46
80
|
// The one `onX` that fires per FRAME rather than per gesture — with sticky headers RN pins
|
|
47
81
|
// `scrollEventThrottle` to 1, i.e. 60 times a second. `markForCheck` walks to the ROOT, so wrapping
|
|
@@ -123,14 +157,12 @@ export function createCallbackWrapper(node) {
|
|
|
123
157
|
* element on JavaScriptCore (`core/engine/cpp/tests/js/angular-directive-cost.itest.ts`), so a
|
|
124
158
|
* thousand-row screen paid for ten thousand `ViewRef`s to serve none.
|
|
125
159
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
160
|
+
* Only a composed component's host directive registers here (`primitives/shared.ts`); a TAG's
|
|
161
|
+
* view is found from the node when its callback fires (`markViewFor`), so no element pays an
|
|
162
|
+
* injection for a callback it may never carry.
|
|
129
163
|
*
|
|
130
|
-
* Separate from `viewFlushes` deliberately
|
|
131
|
-
*
|
|
132
|
-
* ancestor, that one re-checks ONE view synchronously. Collapsing them into a single entry would make
|
|
133
|
-
* whichever directive registered last decide which of the two an element gets.
|
|
164
|
+
* Separate from `viewFlushes` deliberately: this one SCHEDULES and reaches every ancestor, that one
|
|
165
|
+
* re-checks ONE view synchronously.
|
|
134
166
|
*/
|
|
135
167
|
const viewMarkers = new WeakMap();
|
|
136
168
|
export function registerViewMarker(node, marker) {
|
|
@@ -142,7 +174,10 @@ export function unregisterViewMarker(node) {
|
|
|
142
174
|
export function markViewFor(node) {
|
|
143
175
|
if (typeof node !== 'object' || node === null)
|
|
144
176
|
return;
|
|
145
|
-
|
|
177
|
+
// A composed component's host directive registers its own ref; a TAG registers nothing and has its
|
|
178
|
+
// view found here, only when a callback actually fires (see the header).
|
|
179
|
+
const marker = viewMarkers.get(node) ?? viewRefOf(node);
|
|
180
|
+
marker?.markForCheck();
|
|
146
181
|
}
|
|
147
182
|
export function registerViewFlush(node, flush) {
|
|
148
183
|
viewFlushes.set(node, flush);
|
|
@@ -153,6 +188,15 @@ export function unregisterViewFlush(node) {
|
|
|
153
188
|
export function flushViewFor(node) {
|
|
154
189
|
if (typeof node !== 'object' || node === null)
|
|
155
190
|
return;
|
|
156
|
-
viewFlushes.get(node)
|
|
191
|
+
const registered = viewFlushes.get(node);
|
|
192
|
+
if (registered !== undefined) {
|
|
193
|
+
registered();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!readBackNodes.has(node))
|
|
197
|
+
return;
|
|
198
|
+
const view = viewRefOf(node);
|
|
199
|
+
if (view !== undefined)
|
|
200
|
+
detectChangesReported(view);
|
|
157
201
|
}
|
|
158
202
|
//# sourceMappingURL=change-detection-flush.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-detection-flush.js","sourceRoot":"","sources":["../../src/change-detection-flush.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,kGAAkG;AAClG,kCAAkC;AAClC,EAAE;AACF,sEAAsE;AACtE,kFAAkF;AAClF,6FAA6F;AAC7F,iGAAiG;AACjG,oGAAoG;AACpG,6DAA6D;AAC7D,EAAE;AACF,+FAA+F;AAC/F,iFAAiF;AACjF,sFAAsF;AACtF,EAAE;AACF,mGAAmG;AACnG,2FAA2F;AAC3F,qGAAqG;AACrG,0DAA0D;AAC1D,EAAE;AACF,gGAAgG;AAChG,4FAA4F;AAC5F,kGAAkG;AAClG,mGAAmG;AACnG,oGAAoG;AACpG,iGAAiG;AACjG,6FAA6F;AAC7F,oGAAoG;AACpG,oGAAoG;AACpG,kFAAkF;AAClF,yFAAyF;AACzF,gGAAgG;AAChG,iEAAiE;AACjE,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"change-detection-flush.js","sourceRoot":"","sources":["../../src/change-detection-flush.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,8 +65,11 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
|
|
|
65
65
|
scrollEventThrottle?: number;
|
|
66
66
|
keyboardShouldPersistTaps?: boolean | 'always' | 'never' | 'handled';
|
|
67
67
|
keyboardDismissMode?: 'none' | 'on-drag' | 'interactive';
|
|
68
|
+
removeClippedSubviews?: boolean;
|
|
69
|
+
nestedScrollEnabled?: boolean;
|
|
68
70
|
style?: IStyleProp<IViewStyle>;
|
|
69
71
|
contentContainerStyle?: IStyleProp<IViewStyle>;
|
|
72
|
+
get resolvedRemoveClippedSubviews(): boolean;
|
|
70
73
|
itemDir?: VListItemDirective<ItemT>;
|
|
71
74
|
headerDir?: VListHeaderDirective;
|
|
72
75
|
footerDir?: VListFooterDirective;
|
|
@@ -95,7 +98,6 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
|
|
|
95
98
|
context: IVListItemContext<ItemT>;
|
|
96
99
|
}[];
|
|
97
100
|
rowSeparatorContext(highlighted: unknown, leadingRow: unknown, trailingRow: unknown): IVListSeparatorContext<ItemT>;
|
|
98
|
-
itemSeparatorContext(highlighted: unknown, leadingItem: unknown, trailingItem: unknown): IVListSeparatorContext<ItemT>;
|
|
99
101
|
scrollToOffset(params: {
|
|
100
102
|
offset: number;
|
|
101
103
|
animated?: boolean;
|
|
@@ -121,5 +123,5 @@ export declare class FlatList<ItemT = unknown> implements IFlatListInputs<ItemT>
|
|
|
121
123
|
getScrollNode(): ISymbioteNode | null;
|
|
122
124
|
recordInteraction(): void;
|
|
123
125
|
static ɵfac: i0.ɵɵFactoryDeclaration<FlatList<any>, never>;
|
|
124
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FlatList<any>, "FlatList", never, { "data": { "alias": "data"; "required": true; }; "testID": { "alias": "testID"; "required": false; }; "numColumns": { "alias": "numColumns"; "required": false; }; "columnWrapperStyle": { "alias": "columnWrapperStyle"; "required": false; }; "keyExtractor": { "alias": "keyExtractor"; "required": false; }; "getItemLayout": { "alias": "getItemLayout"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "inverted": { "alias": "inverted"; "required": false; }; "extraData": { "alias": "extraData"; "required": false; }; "onEndReachedThreshold": { "alias": "onEndReachedThreshold"; "required": false; }; "onStartReachedThreshold": { "alias": "onStartReachedThreshold"; "required": false; }; "refreshing": { "alias": "refreshing"; "required": false; }; "progressViewOffset": { "alias": "progressViewOffset"; "required": false; }; "viewabilityConfig": { "alias": "viewabilityConfig"; "required": false; }; "viewabilityConfigCallbackPairs": { "alias": "viewabilityConfigCallbackPairs"; "required": false; }; "initialNumToRender": { "alias": "initialNumToRender"; "required": false; }; "initialScrollIndex": { "alias": "initialScrollIndex"; "required": false; }; "maxToRenderPerBatch": { "alias": "maxToRenderPerBatch"; "required": false; }; "updateCellsBatchingPeriod": { "alias": "updateCellsBatchingPeriod"; "required": false; }; "windowSize": { "alias": "windowSize"; "required": false; }; "stickyHeaderIndices": { "alias": "stickyHeaderIndices"; "required": false; }; "maintainVisibleContentPosition": { "alias": "maintainVisibleContentPosition"; "required": false; }; "onScroll": { "alias": "onScroll"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "scrollEventThrottle": { "alias": "scrollEventThrottle"; "required": false; }; "keyboardShouldPersistTaps": { "alias": "keyboardShouldPersistTaps"; "required": false; }; "keyboardDismissMode": { "alias": "keyboardDismissMode"; "required": false; }; "style": { "alias": "style"; "required": false; }; "contentContainerStyle": { "alias": "contentContainerStyle"; "required": false; }; }, { "endReached": "endReached"; "startReached": "startReached"; "refresh": "refresh"; "viewableItemsChanged": "viewableItemsChanged"; "scrollToIndexFailed": "scrollToIndexFailed"; }, ["itemDir", "headerDir", "footerDir", "emptyDir", "separatorDir"], never, true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
|
|
126
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FlatList<any>, "FlatList", never, { "data": { "alias": "data"; "required": true; }; "testID": { "alias": "testID"; "required": false; }; "numColumns": { "alias": "numColumns"; "required": false; }; "columnWrapperStyle": { "alias": "columnWrapperStyle"; "required": false; }; "keyExtractor": { "alias": "keyExtractor"; "required": false; }; "getItemLayout": { "alias": "getItemLayout"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "inverted": { "alias": "inverted"; "required": false; }; "extraData": { "alias": "extraData"; "required": false; }; "onEndReachedThreshold": { "alias": "onEndReachedThreshold"; "required": false; }; "onStartReachedThreshold": { "alias": "onStartReachedThreshold"; "required": false; }; "refreshing": { "alias": "refreshing"; "required": false; }; "progressViewOffset": { "alias": "progressViewOffset"; "required": false; }; "viewabilityConfig": { "alias": "viewabilityConfig"; "required": false; }; "viewabilityConfigCallbackPairs": { "alias": "viewabilityConfigCallbackPairs"; "required": false; }; "initialNumToRender": { "alias": "initialNumToRender"; "required": false; }; "initialScrollIndex": { "alias": "initialScrollIndex"; "required": false; }; "maxToRenderPerBatch": { "alias": "maxToRenderPerBatch"; "required": false; }; "updateCellsBatchingPeriod": { "alias": "updateCellsBatchingPeriod"; "required": false; }; "windowSize": { "alias": "windowSize"; "required": false; }; "stickyHeaderIndices": { "alias": "stickyHeaderIndices"; "required": false; }; "maintainVisibleContentPosition": { "alias": "maintainVisibleContentPosition"; "required": false; }; "onScroll": { "alias": "onScroll"; "required": false; }; "onScrollBeginDrag": { "alias": "onScrollBeginDrag"; "required": false; }; "onScrollEndDrag": { "alias": "onScrollEndDrag"; "required": false; }; "onMomentumScrollBegin": { "alias": "onMomentumScrollBegin"; "required": false; }; "onMomentumScrollEnd": { "alias": "onMomentumScrollEnd"; "required": false; }; "scrollEventThrottle": { "alias": "scrollEventThrottle"; "required": false; }; "keyboardShouldPersistTaps": { "alias": "keyboardShouldPersistTaps"; "required": false; }; "keyboardDismissMode": { "alias": "keyboardDismissMode"; "required": false; }; "removeClippedSubviews": { "alias": "removeClippedSubviews"; "required": false; }; "nestedScrollEnabled": { "alias": "nestedScrollEnabled"; "required": false; }; "style": { "alias": "style"; "required": false; }; "contentContainerStyle": { "alias": "contentContainerStyle"; "required": false; }; }, { "endReached": "endReached"; "startReached": "startReached"; "refresh": "refresh"; "viewableItemsChanged": "viewableItemsChanged"; "scrollToIndexFailed": "scrollToIndexFailed"; }, ["itemDir", "headerDir", "footerDir", "emptyDir", "separatorDir"], never, true, [{ directive: typeof i1.SymbioteStyleInputDirective; inputs: { "style": "style"; }; outputs: {}; }]>;
|
|
125
127
|
}
|