@symbiote-native/angular 3.2.0 → 3.3.0
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/babel-register-composed.cjs +1 -0
- package/build/angular/components/checkbox-props.d.ts +2 -0
- package/build/angular/components/checkbox-props.js +2 -0
- package/build/angular/components/checkbox-props.js.map +1 -0
- package/build/angular/components.d.ts +1 -0
- package/build/angular/components.js.map +1 -1
- package/build/angular/descriptor-to-angular/descriptor-host.d.ts +8 -0
- package/build/angular/descriptor-to-angular/descriptor-host.js +38 -0
- package/build/angular/descriptor-to-angular/descriptor-host.js.map +1 -0
- package/build/angular/descriptor-to-angular/index.d.ts +1 -0
- package/build/angular/descriptor-to-angular/index.js +4 -0
- package/build/angular/descriptor-to-angular/index.js.map +1 -1
- package/build/angular/element-base.d.ts +153 -0
- package/build/angular/element-base.js +272 -0
- package/build/angular/element-base.js.map +1 -0
- package/build/angular/elements-controls.d.ts +165 -0
- package/build/angular/elements-controls.js +382 -0
- package/build/angular/elements-controls.js.map +1 -0
- package/build/angular/elements-layout.d.ts +122 -0
- package/build/angular/elements-layout.js +242 -0
- package/build/angular/elements-layout.js.map +1 -0
- package/build/angular/elements-press.d.ts +96 -0
- package/build/angular/elements-press.js +227 -0
- package/build/angular/elements-press.js.map +1 -0
- package/build/angular/elements.d.ts +6 -516
- package/build/angular/elements.js +8 -1091
- package/build/angular/elements.js.map +1 -1
- package/build/angular/host-instance/index.d.ts +2 -0
- package/build/angular/host-instance/index.js +4 -4
- package/build/angular/host-instance/index.js.map +1 -1
- package/build/angular/index.d.ts +5 -4
- package/build/angular/index.js +4 -3
- package/build/angular/index.js.map +1 -1
- package/build/angular/native-view-base.d.ts +10 -2
- package/build/angular/native-view-base.js +23 -2
- package/build/angular/native-view-base.js.map +1 -1
- package/build/angular/services/index.d.ts +1 -0
- package/build/angular/services/index.js +1 -0
- package/build/angular/services/index.js.map +1 -1
- package/build/angular/services/inject-event.d.ts +6 -0
- package/build/angular/services/inject-event.js +24 -0
- package/build/angular/services/inject-event.js.map +1 -0
- package/package.json +6 -6
- package/src/components/checkbox-props.ts +12 -0
- package/src/components.ts +1 -0
- package/src/descriptor-to-angular/descriptor-host.ts +27 -0
- package/src/descriptor-to-angular/index.ts +5 -0
- package/src/element-base.ts +272 -0
- package/src/elements-controls.ts +282 -0
- package/src/elements-layout.ts +141 -0
- package/src/elements-press.ts +145 -0
- package/src/elements.ts +73 -788
- package/src/host-instance/index.ts +4 -4
- package/src/index.ts +6 -1
- package/src/native-view-base.ts +37 -2
- package/src/services/index.ts +1 -0
- package/src/services/inject-event.ts +52 -0
|
@@ -26,6 +26,7 @@ const PRIMITIVE_SELECTORS = new Set([
|
|
|
26
26
|
// The second anchor-backed primitive, same shape (TouchableWithoutFeedback.js:286).
|
|
27
27
|
'touchable-without-feedback',
|
|
28
28
|
'button',
|
|
29
|
+
'checkbox',
|
|
29
30
|
'text',
|
|
30
31
|
'image',
|
|
31
32
|
// The box RN wraps the background image in — the tag an app writes. The image itself is built by
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox-props.js","sourceRoot":"","sources":["../../../src/components/checkbox-props.ts"],"names":[],"mappings":""}
|
|
@@ -22,6 +22,7 @@ export type { IAngularTouchableHighlightProps, IAngularTouchableOpacityProps, }
|
|
|
22
22
|
export type { IAngularTouchableWithoutFeedbackProps } from './components/touchable-without-feedback/touchable-without-feedback-props';
|
|
23
23
|
export type { IAngularScrollViewProps, IScrollViewHandle, } from './components/scroll-view-props';
|
|
24
24
|
export type { IButtonProps } from './components/button-props';
|
|
25
|
+
export type { ICheckboxProps } from './components/checkbox-props';
|
|
25
26
|
export { VirtualizedList, VListEmptyDirective, VListFooterDirective, VListHeaderDirective, VListItemDirective, VListSeparatorDirective, } from './components/virtualized-list';
|
|
26
27
|
export type { ICellLayout, ISeparatorProps, ISeparators, IViewabilityConfig, IViewabilityConfigCallbackPair, IViewableItemsChangedInfo, IViewToken, IVirtualizedListHandle, IVirtualizedListProps, IVListItemContext, IVListSeparatorContext, } from './components/virtualized-list';
|
|
27
28
|
export { FlatList } from './components/flat-list';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,kFAAkF;AAMlF,gGAAgG;AAChG,gGAAgG;AAChG,sFAAsF;AACtF,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAMrE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA0C3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAuB3E,kGAAkG;AAClG,kGAAkG;AAClG,8EAA8E;AAC9E,kGAAkG;AAClG,+CAA+C;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,kFAAkF;AAMlF,gGAAgG;AAChG,gGAAgG;AAChG,sFAAsF;AACtF,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAMrE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA0C3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAuB3E,kGAAkG;AAClG,kGAAkG;AAClG,8EAA8E;AAC9E,kGAAkG;AAClG,+CAA+C;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAmCtE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAcvC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,+FAA+F;AAC/F,OAAO,EACL,QAAQ,EACR,QAAQ,IAAI,IAAI,EAChB,QAAQ,EACR,QAAQ,IAAI,IAAI,EAChB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B;AAC1B,+FAA+F;AAC/F,8FAA8F;AAC9F,iGAAiG;AACjG,MAAM;AACN,2BAA2B;AAC3B,oGAAoG;AACpG,+FAA+F;AAC/F,6FAA6F;AAC7F,eAAe;AACf,4FAA4F;AAC5F,0FAA0F;AAC1F,oDAAoD;AACpD,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,sFAAsF;AACtF,wFAAwF;AACxF,4CAA4C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IDescriptor } from '@symbiote-native/components';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class DescriptorHost {
|
|
4
|
+
node: IDescriptor;
|
|
5
|
+
leafOf(descriptor: IDescriptor): IDescriptor | undefined;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DescriptorHost, never>;
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DescriptorHost, "symbiote-descriptor-host", never, { "node": { "alias": "node"; "required": true; }; }, {}, never, ["*"], true, never>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
|
+
import { SymbioteHostPropsDirective, ViewHost } from '../primitives';
|
|
3
|
+
import { DescriptorOutlet } from './index';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
// Angular cannot project content into a node a Renderer2 loop built, so the root is a template
|
|
6
|
+
// `<view>` that takes the descriptor's props, and only the native leaf goes through the outlet
|
|
7
|
+
export class DescriptorHost {
|
|
8
|
+
// A native wrapper descriptor carries one own child at most, its absolute-fill native leaf
|
|
9
|
+
leafOf(descriptor) {
|
|
10
|
+
return descriptor.children.find(child => typeof child !== 'string');
|
|
11
|
+
}
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DescriptorHost, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: DescriptorHost, isStandalone: true, selector: "symbiote-descriptor-host", inputs: { node: "node" }, ngImport: i0, template: `<view [symbioteHostProps]="node.props">
|
|
14
|
+
@if (leafOf(node); as leaf) {
|
|
15
|
+
<symbiote-descriptor-outlet [node]="leaf" />
|
|
16
|
+
}
|
|
17
|
+
<ng-content />
|
|
18
|
+
</view>`, isInline: true, dependencies: [{ kind: "component", type: DescriptorOutlet, selector: "symbiote-descriptor-outlet", inputs: ["node"] }, { kind: "directive", type: SymbioteHostPropsDirective, selector: "[symbioteHostProps]", inputs: ["symbioteHostProps"], exportAs: ["symbioteHost"] }, { kind: "component", type: ViewHost, selector: "view" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DescriptorHost, decorators: [{
|
|
21
|
+
type: Component,
|
|
22
|
+
args: [{
|
|
23
|
+
selector: 'symbiote-descriptor-host',
|
|
24
|
+
standalone: true,
|
|
25
|
+
imports: [DescriptorOutlet, SymbioteHostPropsDirective, ViewHost],
|
|
26
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
27
|
+
template: `<view [symbioteHostProps]="node.props">
|
|
28
|
+
@if (leafOf(node); as leaf) {
|
|
29
|
+
<symbiote-descriptor-outlet [node]="leaf" />
|
|
30
|
+
}
|
|
31
|
+
<ng-content />
|
|
32
|
+
</view>`,
|
|
33
|
+
}]
|
|
34
|
+
}], propDecorators: { node: [{
|
|
35
|
+
type: Input,
|
|
36
|
+
args: [{ required: true }]
|
|
37
|
+
}] } });
|
|
38
|
+
//# sourceMappingURL=descriptor-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-host.js","sourceRoot":"","sources":["../../../src/descriptor-to-angular/descriptor-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;;AAE3C,+FAA+F;AAC/F,+FAA+F;AAa/F,MAAM,OAAO,cAAc;IAGzB,2FAA2F;IAC3F,MAAM,CAAC,UAAuB;QAC5B,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;IACtE,CAAC;8GANU,cAAc;kGAAd,cAAc,8GAPf;;;;;UAKF,4DAPE,gBAAgB,yFAAE,0BAA0B,2HAAE,QAAQ;;2FASrD,cAAc;kBAZ1B,SAAS;mBAAC;oBACT,QAAQ,EAAE,0BAA0B;oBACpC,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,QAAQ,CAAC;oBACjE,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,QAAQ,EAAE;;;;;UAKF;iBACT;;sBAEE,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE"}
|
|
@@ -6,6 +6,7 @@ export declare class DescriptorOutlet implements OnChanges, OnDestroy {
|
|
|
6
6
|
private readonly renderer;
|
|
7
7
|
private readonly hostNode;
|
|
8
8
|
private rendered;
|
|
9
|
+
get rootNode(): unknown;
|
|
9
10
|
ngOnChanges(changes: SimpleChanges): void;
|
|
10
11
|
ngOnDestroy(): void;
|
|
11
12
|
private patchRoot;
|
|
@@ -10,6 +10,10 @@ export class DescriptorOutlet {
|
|
|
10
10
|
this.renderer = inject(Renderer2);
|
|
11
11
|
this.hostNode = inject(ElementRef).nativeElement;
|
|
12
12
|
}
|
|
13
|
+
// The host node of the root element, for a component that calls a function of its native view
|
|
14
|
+
get rootNode() {
|
|
15
|
+
return this.rendered?.node ?? null;
|
|
16
|
+
}
|
|
13
17
|
ngOnChanges(changes) {
|
|
14
18
|
if (!('node' in changes) || this.node === undefined)
|
|
15
19
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/descriptor-to-angular/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,4FAA4F;AAC5F,6FAA6F;AAC7F,+FAA+F;AAC/F,oCAAoC;AAEpC,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,SAAS,GAIV,MAAM,eAAe,CAAC;;AA4BvB,MAAM,OAAO,gBAAgB;IAN7B;QASmB,aAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,aAAQ,GACvB,MAAM,CAAsB,UAAU,CAAC,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/descriptor-to-angular/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { ElementRef } from '@angular/core';
|
|
2
|
+
import type { OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
|
|
3
|
+
import type { IElementProps } from './element-props';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* The shared half of every element directive: the prop surface all tags accept, and the ONE
|
|
7
|
+
* generic forward that puts a claimed binding back on the engine node.
|
|
8
|
+
*
|
|
9
|
+
* The forward is the deciding fact of this whole route. A binding claimed by a directive input
|
|
10
|
+
* never reaches `Renderer2.setProperty` on its own — Angular writes it to the directive instance
|
|
11
|
+
* — so without this loop a bare tag commits nothing at all. It stays generic on purpose: per-prop
|
|
12
|
+
* forwarding code is a component wrapper by another name, which is what this migration removes.
|
|
13
|
+
* `renderer.setProperty` lands in the adapter's own renderer, which routes the value through the
|
|
14
|
+
* engine's `routeProp` and applies the `id` -> `nativeID` alias.
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class SymbioteElement implements OnChanges {
|
|
17
|
+
private readonly renderer;
|
|
18
|
+
protected readonly host: ElementRef<any>;
|
|
19
|
+
testID?: IElementProps['testID'];
|
|
20
|
+
nativeID?: IElementProps['nativeID'];
|
|
21
|
+
id?: IElementProps['id'];
|
|
22
|
+
accessible?: IElementProps['accessible'];
|
|
23
|
+
accessibilityLabel?: IElementProps['accessibilityLabel'];
|
|
24
|
+
accessibilityHint?: IElementProps['accessibilityHint'];
|
|
25
|
+
accessibilityRole?: IElementProps['accessibilityRole'];
|
|
26
|
+
accessibilityState?: IElementProps['accessibilityState'];
|
|
27
|
+
accessibilityValue?: IElementProps['accessibilityValue'];
|
|
28
|
+
accessibilityActions?: IElementProps['accessibilityActions'];
|
|
29
|
+
accessibilityLabelledBy?: IElementProps['accessibilityLabelledBy'];
|
|
30
|
+
importantForAccessibility?: IElementProps['importantForAccessibility'];
|
|
31
|
+
accessibilityLiveRegion?: IElementProps['accessibilityLiveRegion'];
|
|
32
|
+
screenReaderFocusable?: IElementProps['screenReaderFocusable'];
|
|
33
|
+
accessibilityViewIsModal?: IElementProps['accessibilityViewIsModal'];
|
|
34
|
+
accessibilityElementsHidden?: IElementProps['accessibilityElementsHidden'];
|
|
35
|
+
accessibilityIgnoresInvertColors?: IElementProps['accessibilityIgnoresInvertColors'];
|
|
36
|
+
accessibilityLanguage?: IElementProps['accessibilityLanguage'];
|
|
37
|
+
accessibilityRespondsToUserInteraction?: IElementProps['accessibilityRespondsToUserInteraction'];
|
|
38
|
+
accessibilityShowsLargeContentViewer?: IElementProps['accessibilityShowsLargeContentViewer'];
|
|
39
|
+
accessibilityLargeContentTitle?: IElementProps['accessibilityLargeContentTitle'];
|
|
40
|
+
onAccessibilityAction?: IElementProps['onAccessibilityAction'];
|
|
41
|
+
onAccessibilityTap?: IElementProps['onAccessibilityTap'];
|
|
42
|
+
onMagicTap?: IElementProps['onMagicTap'];
|
|
43
|
+
onAccessibilityEscape?: IElementProps['onAccessibilityEscape'];
|
|
44
|
+
role?: IElementProps['role'];
|
|
45
|
+
'aria-label'?: IElementProps['aria-label'];
|
|
46
|
+
'aria-labelledby'?: IElementProps['aria-labelledby'];
|
|
47
|
+
'aria-live'?: IElementProps['aria-live'];
|
|
48
|
+
'aria-hidden'?: IElementProps['aria-hidden'];
|
|
49
|
+
'aria-busy'?: IElementProps['aria-busy'];
|
|
50
|
+
'aria-checked'?: IElementProps['aria-checked'];
|
|
51
|
+
'aria-disabled'?: IElementProps['aria-disabled'];
|
|
52
|
+
'aria-expanded'?: IElementProps['aria-expanded'];
|
|
53
|
+
'aria-selected'?: IElementProps['aria-selected'];
|
|
54
|
+
'aria-modal'?: IElementProps['aria-modal'];
|
|
55
|
+
'aria-valuemax'?: IElementProps['aria-valuemax'];
|
|
56
|
+
'aria-valuemin'?: IElementProps['aria-valuemin'];
|
|
57
|
+
'aria-valuenow'?: IElementProps['aria-valuenow'];
|
|
58
|
+
'aria-valuetext'?: IElementProps['aria-valuetext'];
|
|
59
|
+
onStartShouldSetResponder?: IElementProps['onStartShouldSetResponder'];
|
|
60
|
+
onStartShouldSetResponderCapture?: IElementProps['onStartShouldSetResponderCapture'];
|
|
61
|
+
onMoveShouldSetResponder?: IElementProps['onMoveShouldSetResponder'];
|
|
62
|
+
onMoveShouldSetResponderCapture?: IElementProps['onMoveShouldSetResponderCapture'];
|
|
63
|
+
onResponderGrant?: IElementProps['onResponderGrant'];
|
|
64
|
+
onResponderReject?: IElementProps['onResponderReject'];
|
|
65
|
+
onResponderStart?: IElementProps['onResponderStart'];
|
|
66
|
+
onResponderMove?: IElementProps['onResponderMove'];
|
|
67
|
+
onResponderEnd?: IElementProps['onResponderEnd'];
|
|
68
|
+
onResponderRelease?: IElementProps['onResponderRelease'];
|
|
69
|
+
onResponderTerminate?: IElementProps['onResponderTerminate'];
|
|
70
|
+
onResponderTerminationRequest?: IElementProps['onResponderTerminationRequest'];
|
|
71
|
+
pointerEvents?: IElementProps['pointerEvents'];
|
|
72
|
+
hitSlop?: IElementProps['hitSlop'];
|
|
73
|
+
focusable?: IElementProps['focusable'];
|
|
74
|
+
collapsable?: IElementProps['collapsable'];
|
|
75
|
+
removeClippedSubviews?: IElementProps['removeClippedSubviews'];
|
|
76
|
+
renderToHardwareTextureAndroid?: IElementProps['renderToHardwareTextureAndroid'];
|
|
77
|
+
shouldRasterizeIOS?: IElementProps['shouldRasterizeIOS'];
|
|
78
|
+
needsOffscreenAlphaCompositing?: IElementProps['needsOffscreenAlphaCompositing'];
|
|
79
|
+
style?: IElementProps['style'];
|
|
80
|
+
styleProp?: IElementProps['styleProp'];
|
|
81
|
+
class?: string;
|
|
82
|
+
onPress?: IElementProps['onPress'];
|
|
83
|
+
onPressIn?: IElementProps['onPressIn'];
|
|
84
|
+
onPressOut?: IElementProps['onPressOut'];
|
|
85
|
+
onPressMove?: IElementProps['onPressMove'];
|
|
86
|
+
onLongPress?: IElementProps['onLongPress'];
|
|
87
|
+
onLayout?: IElementProps['onLayout'];
|
|
88
|
+
onFocus?: IElementProps['onFocus'];
|
|
89
|
+
onBlur?: IElementProps['onBlur'];
|
|
90
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
91
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SymbioteElement, never>;
|
|
92
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SymbioteElement, never, never, { "testID": { "alias": "testID"; "required": false; }; "nativeID": { "alias": "nativeID"; "required": false; }; "id": { "alias": "id"; "required": false; }; "accessible": { "alias": "accessible"; "required": false; }; "accessibilityLabel": { "alias": "accessibilityLabel"; "required": false; }; "accessibilityHint": { "alias": "accessibilityHint"; "required": false; }; "accessibilityRole": { "alias": "accessibilityRole"; "required": false; }; "accessibilityState": { "alias": "accessibilityState"; "required": false; }; "accessibilityValue": { "alias": "accessibilityValue"; "required": false; }; "accessibilityActions": { "alias": "accessibilityActions"; "required": false; }; "accessibilityLabelledBy": { "alias": "accessibilityLabelledBy"; "required": false; }; "importantForAccessibility": { "alias": "importantForAccessibility"; "required": false; }; "accessibilityLiveRegion": { "alias": "accessibilityLiveRegion"; "required": false; }; "screenReaderFocusable": { "alias": "screenReaderFocusable"; "required": false; }; "accessibilityViewIsModal": { "alias": "accessibilityViewIsModal"; "required": false; }; "accessibilityElementsHidden": { "alias": "accessibilityElementsHidden"; "required": false; }; "accessibilityIgnoresInvertColors": { "alias": "accessibilityIgnoresInvertColors"; "required": false; }; "accessibilityLanguage": { "alias": "accessibilityLanguage"; "required": false; }; "accessibilityRespondsToUserInteraction": { "alias": "accessibilityRespondsToUserInteraction"; "required": false; }; "accessibilityShowsLargeContentViewer": { "alias": "accessibilityShowsLargeContentViewer"; "required": false; }; "accessibilityLargeContentTitle": { "alias": "accessibilityLargeContentTitle"; "required": false; }; "onAccessibilityAction": { "alias": "onAccessibilityAction"; "required": false; }; "onAccessibilityTap": { "alias": "onAccessibilityTap"; "required": false; }; "onMagicTap": { "alias": "onMagicTap"; "required": false; }; "onAccessibilityEscape": { "alias": "onAccessibilityEscape"; "required": false; }; "role": { "alias": "role"; "required": false; }; "aria-label": { "alias": "aria-label"; "required": false; }; "aria-labelledby": { "alias": "aria-labelledby"; "required": false; }; "aria-live": { "alias": "aria-live"; "required": false; }; "aria-hidden": { "alias": "aria-hidden"; "required": false; }; "aria-busy": { "alias": "aria-busy"; "required": false; }; "aria-checked": { "alias": "aria-checked"; "required": false; }; "aria-disabled": { "alias": "aria-disabled"; "required": false; }; "aria-expanded": { "alias": "aria-expanded"; "required": false; }; "aria-selected": { "alias": "aria-selected"; "required": false; }; "aria-modal": { "alias": "aria-modal"; "required": false; }; "aria-valuemax": { "alias": "aria-valuemax"; "required": false; }; "aria-valuemin": { "alias": "aria-valuemin"; "required": false; }; "aria-valuenow": { "alias": "aria-valuenow"; "required": false; }; "aria-valuetext": { "alias": "aria-valuetext"; "required": false; }; "onStartShouldSetResponder": { "alias": "onStartShouldSetResponder"; "required": false; }; "onStartShouldSetResponderCapture": { "alias": "onStartShouldSetResponderCapture"; "required": false; }; "onMoveShouldSetResponder": { "alias": "onMoveShouldSetResponder"; "required": false; }; "onMoveShouldSetResponderCapture": { "alias": "onMoveShouldSetResponderCapture"; "required": false; }; "onResponderGrant": { "alias": "onResponderGrant"; "required": false; }; "onResponderReject": { "alias": "onResponderReject"; "required": false; }; "onResponderStart": { "alias": "onResponderStart"; "required": false; }; "onResponderMove": { "alias": "onResponderMove"; "required": false; }; "onResponderEnd": { "alias": "onResponderEnd"; "required": false; }; "onResponderRelease": { "alias": "onResponderRelease"; "required": false; }; "onResponderTerminate": { "alias": "onResponderTerminate"; "required": false; }; "onResponderTerminationRequest": { "alias": "onResponderTerminationRequest"; "required": false; }; "pointerEvents": { "alias": "pointerEvents"; "required": false; }; "hitSlop": { "alias": "hitSlop"; "required": false; }; "focusable": { "alias": "focusable"; "required": false; }; "collapsable": { "alias": "collapsable"; "required": false; }; "removeClippedSubviews": { "alias": "removeClippedSubviews"; "required": false; }; "renderToHardwareTextureAndroid": { "alias": "renderToHardwareTextureAndroid"; "required": false; }; "shouldRasterizeIOS": { "alias": "shouldRasterizeIOS"; "required": false; }; "needsOffscreenAlphaCompositing": { "alias": "needsOffscreenAlphaCompositing"; "required": false; }; "style": { "alias": "style"; "required": false; }; "styleProp": { "alias": "styleProp"; "required": false; }; "class": { "alias": "class"; "required": false; }; "onPress": { "alias": "onPress"; "required": false; }; "onPressIn": { "alias": "onPressIn"; "required": false; }; "onPressOut": { "alias": "onPressOut"; "required": false; }; "onPressMove": { "alias": "onPressMove"; "required": false; }; "onLongPress": { "alias": "onLongPress"; "required": false; }; "onLayout": { "alias": "onLayout"; "required": false; }; "onFocus": { "alias": "onFocus"; "required": false; }; "onBlur": { "alias": "onBlur"; "required": false; }; }, {}, never, never, true, never>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The base for a tag whose app callback an engine behavior READS BACK inside the same microtask
|
|
96
|
+
* turn — `<text-input>`, `<switch>`, `<refresh-control>`. Zoneless change detection is a macrotask,
|
|
97
|
+
* so without this the behavior sees the PRE-event value and undoes the user; the full mechanism,
|
|
98
|
+
* and why this is `detectChanges()` on one view rather than `ApplicationRef.tick()`, is in
|
|
99
|
+
* `./change-detection-flush`.
|
|
100
|
+
*
|
|
101
|
+
* The directive is the only thing in the adapter that owns a `ChangeDetectorRef` for the view
|
|
102
|
+
* holding the binding, so it hands one to the renderer keyed on its own node.
|
|
103
|
+
*/
|
|
104
|
+
export declare abstract class ReadBackElement extends SymbioteElement implements OnDestroy {
|
|
105
|
+
private readonly detector;
|
|
106
|
+
private readonly errorHandler;
|
|
107
|
+
constructor();
|
|
108
|
+
private flush;
|
|
109
|
+
ngOnDestroy(): void;
|
|
110
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReadBackElement, never>;
|
|
111
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ReadBackElement, never, never, {}, {}, never, never, true, never>;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The `[(value)]` half of a controlled tag — `<switch>` and `<text-input>`.
|
|
115
|
+
*
|
|
116
|
+
* The one `@Output` in this file, and it is FORCED rather than chosen. `[(value)]` desugars to
|
|
117
|
+
* `[value]` + `(valueChange)`, and ngtsc requires both halves to resolve to the SAME target: a
|
|
118
|
+
* declared `value` input beside an event no directive claims is NG8007, "the property and event
|
|
119
|
+
* halves are not bound to the same target". So the sugar this adapter documents cannot work without
|
|
120
|
+
* the output existing, whatever the file header says about events in general.
|
|
121
|
+
*
|
|
122
|
+
* The bridge below is NOT what makes the binding work today, and the comment says so because the
|
|
123
|
+
* obvious reading is wrong: the file header's "an `@Output` CONSUMES the binding" holds for a
|
|
124
|
+
* COMPONENT, and an element is the other case — Angular attaches the renderer listener for the
|
|
125
|
+
* event as well, so `Renderer2.listen` still runs and the engine still hears the change. Measured
|
|
126
|
+
* under JIT by deleting this whole hook: every case in `renderer/two-way-value.test.ts` stayed
|
|
127
|
+
* green, delivery included, and exactly ONCE (nothing double-fires when both paths exist).
|
|
128
|
+
*
|
|
129
|
+
* It is kept because the measurement is JIT-only and this adapter has a recorded case of JIT and
|
|
130
|
+
* AOT resolving a binding differently (`test-harness-false-greens.md` §21). If AOT routes the event
|
|
131
|
+
* exclusively to the output, this hook is the only thing keeping `[(value)]` alive; if it routes to
|
|
132
|
+
* both, it is one extra listener on a control an app explicitly bound. Delete it once something
|
|
133
|
+
* executes the LINKED artifact and shows the renderer listener is attached there too.
|
|
134
|
+
*
|
|
135
|
+
* Opened only when something is SUBSCRIBED: the prop's PRESENCE is what a behavior reads to decide
|
|
136
|
+
* it is controlled, so a `<switch>` given a handler nobody asked for changes how it snaps back.
|
|
137
|
+
* `.observed` is readable from `ngOnInit` because Angular subscribes outputs in the creation pass,
|
|
138
|
+
* before the update pass runs the hook — observed directly (true for the two bound tags, false for
|
|
139
|
+
* an unbound one), not assumed.
|
|
140
|
+
*/
|
|
141
|
+
export declare abstract class ValueChangeElement extends ReadBackElement implements OnInit, OnDestroy {
|
|
142
|
+
private readonly valueRenderer;
|
|
143
|
+
private readonly valueHost;
|
|
144
|
+
private unlistenValue?;
|
|
145
|
+
/** `this.valueChange.observed` — the subclass owns the emitter so its payload type stays exact. */
|
|
146
|
+
protected abstract hasValueSubscriber(): boolean;
|
|
147
|
+
/** Narrows the engine's unwrapped value to the type THIS tag emits, then emits it. */
|
|
148
|
+
protected abstract emitValue(value: unknown): void;
|
|
149
|
+
ngOnInit(): void;
|
|
150
|
+
ngOnDestroy(): void;
|
|
151
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ValueChangeElement, never>;
|
|
152
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ValueChangeElement, never, never, {}, {}, never, never, true, never>;
|
|
153
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, ElementRef, ErrorHandler, Input, Renderer2, inject, } from '@angular/core';
|
|
2
|
+
import { VALUE_CHANGE_EVENT } from './renderer/value-change';
|
|
3
|
+
import { registerViewFlush, unregisterViewFlush, } from './change-detection-flush';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* The shared half of every element directive: the prop surface all tags accept, and the ONE
|
|
7
|
+
* generic forward that puts a claimed binding back on the engine node.
|
|
8
|
+
*
|
|
9
|
+
* The forward is the deciding fact of this whole route. A binding claimed by a directive input
|
|
10
|
+
* never reaches `Renderer2.setProperty` on its own — Angular writes it to the directive instance
|
|
11
|
+
* — so without this loop a bare tag commits nothing at all. It stays generic on purpose: per-prop
|
|
12
|
+
* forwarding code is a component wrapper by another name, which is what this migration removes.
|
|
13
|
+
* `renderer.setProperty` lands in the adapter's own renderer, which routes the value through the
|
|
14
|
+
* engine's `routeProp` and applies the `id` -> `nativeID` alias.
|
|
15
|
+
*/
|
|
16
|
+
export class SymbioteElement {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.renderer = inject(Renderer2);
|
|
19
|
+
this.host = inject(ElementRef);
|
|
20
|
+
}
|
|
21
|
+
ngOnChanges(changes) {
|
|
22
|
+
for (const name of Object.keys(changes)) {
|
|
23
|
+
this.renderer.setProperty(this.host.nativeElement, name,
|
|
24
|
+
// Unwrapped on purpose: `SymbioteRenderer.setProperty` is where an `on*` value is wrapped
|
|
25
|
+
// now, and it is the call this line makes.
|
|
26
|
+
changes[name]?.currentValue);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
30
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SymbioteElement, isStandalone: true, inputs: { testID: "testID", nativeID: "nativeID", id: "id", accessible: "accessible", accessibilityLabel: "accessibilityLabel", accessibilityHint: "accessibilityHint", accessibilityRole: "accessibilityRole", accessibilityState: "accessibilityState", accessibilityValue: "accessibilityValue", accessibilityActions: "accessibilityActions", accessibilityLabelledBy: "accessibilityLabelledBy", importantForAccessibility: "importantForAccessibility", accessibilityLiveRegion: "accessibilityLiveRegion", screenReaderFocusable: "screenReaderFocusable", accessibilityViewIsModal: "accessibilityViewIsModal", accessibilityElementsHidden: "accessibilityElementsHidden", accessibilityIgnoresInvertColors: "accessibilityIgnoresInvertColors", accessibilityLanguage: "accessibilityLanguage", accessibilityRespondsToUserInteraction: "accessibilityRespondsToUserInteraction", accessibilityShowsLargeContentViewer: "accessibilityShowsLargeContentViewer", accessibilityLargeContentTitle: "accessibilityLargeContentTitle", onAccessibilityAction: "onAccessibilityAction", onAccessibilityTap: "onAccessibilityTap", onMagicTap: "onMagicTap", onAccessibilityEscape: "onAccessibilityEscape", role: "role", "aria-label": "aria-label", "aria-labelledby": "aria-labelledby", "aria-live": "aria-live", "aria-hidden": "aria-hidden", "aria-busy": "aria-busy", "aria-checked": "aria-checked", "aria-disabled": "aria-disabled", "aria-expanded": "aria-expanded", "aria-selected": "aria-selected", "aria-modal": "aria-modal", "aria-valuemax": "aria-valuemax", "aria-valuemin": "aria-valuemin", "aria-valuenow": "aria-valuenow", "aria-valuetext": "aria-valuetext", onStartShouldSetResponder: "onStartShouldSetResponder", onStartShouldSetResponderCapture: "onStartShouldSetResponderCapture", onMoveShouldSetResponder: "onMoveShouldSetResponder", onMoveShouldSetResponderCapture: "onMoveShouldSetResponderCapture", onResponderGrant: "onResponderGrant", onResponderReject: "onResponderReject", onResponderStart: "onResponderStart", onResponderMove: "onResponderMove", onResponderEnd: "onResponderEnd", onResponderRelease: "onResponderRelease", onResponderTerminate: "onResponderTerminate", onResponderTerminationRequest: "onResponderTerminationRequest", pointerEvents: "pointerEvents", hitSlop: "hitSlop", focusable: "focusable", collapsable: "collapsable", removeClippedSubviews: "removeClippedSubviews", renderToHardwareTextureAndroid: "renderToHardwareTextureAndroid", shouldRasterizeIOS: "shouldRasterizeIOS", needsOffscreenAlphaCompositing: "needsOffscreenAlphaCompositing", style: "style", styleProp: "styleProp", class: "class", onPress: "onPress", onPressIn: "onPressIn", onPressOut: "onPressOut", onPressMove: "onPressMove", onLongPress: "onLongPress", onLayout: "onLayout", onFocus: "onFocus", onBlur: "onBlur" }, usesOnChanges: true, ngImport: i0 }); }
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SymbioteElement, decorators: [{
|
|
33
|
+
type: Directive
|
|
34
|
+
}], propDecorators: { testID: [{
|
|
35
|
+
type: Input
|
|
36
|
+
}], nativeID: [{
|
|
37
|
+
type: Input
|
|
38
|
+
}], id: [{
|
|
39
|
+
type: Input
|
|
40
|
+
}], accessible: [{
|
|
41
|
+
type: Input
|
|
42
|
+
}], accessibilityLabel: [{
|
|
43
|
+
type: Input
|
|
44
|
+
}], accessibilityHint: [{
|
|
45
|
+
type: Input
|
|
46
|
+
}], accessibilityRole: [{
|
|
47
|
+
type: Input
|
|
48
|
+
}], accessibilityState: [{
|
|
49
|
+
type: Input
|
|
50
|
+
}], accessibilityValue: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], accessibilityActions: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], accessibilityLabelledBy: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], importantForAccessibility: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], accessibilityLiveRegion: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}], screenReaderFocusable: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], accessibilityViewIsModal: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], accessibilityElementsHidden: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], accessibilityIgnoresInvertColors: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], accessibilityLanguage: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], accessibilityRespondsToUserInteraction: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], accessibilityShowsLargeContentViewer: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], accessibilityLargeContentTitle: [{
|
|
75
|
+
type: Input
|
|
76
|
+
}], onAccessibilityAction: [{
|
|
77
|
+
type: Input
|
|
78
|
+
}], onAccessibilityTap: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}], onMagicTap: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], onAccessibilityEscape: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], role: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}], "aria-label": [{
|
|
87
|
+
type: Input
|
|
88
|
+
}], "aria-labelledby": [{
|
|
89
|
+
type: Input
|
|
90
|
+
}], "aria-live": [{
|
|
91
|
+
type: Input
|
|
92
|
+
}], "aria-hidden": [{
|
|
93
|
+
type: Input
|
|
94
|
+
}], "aria-busy": [{
|
|
95
|
+
type: Input
|
|
96
|
+
}], "aria-checked": [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], "aria-disabled": [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], "aria-expanded": [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], "aria-selected": [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], "aria-modal": [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], "aria-valuemax": [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], "aria-valuemin": [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], "aria-valuenow": [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], "aria-valuetext": [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], onStartShouldSetResponder: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], onStartShouldSetResponderCapture: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], onMoveShouldSetResponder: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], onMoveShouldSetResponderCapture: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], onResponderGrant: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], onResponderReject: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], onResponderStart: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], onResponderMove: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], onResponderEnd: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], onResponderRelease: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], onResponderTerminate: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], onResponderTerminationRequest: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], pointerEvents: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], hitSlop: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], focusable: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], collapsable: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], removeClippedSubviews: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], renderToHardwareTextureAndroid: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], shouldRasterizeIOS: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], needsOffscreenAlphaCompositing: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], style: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], styleProp: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], class: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], onPress: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], onPressIn: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], onPressOut: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], onPressMove: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], onLongPress: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], onLayout: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], onFocus: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], onBlur: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}] } });
|
|
177
|
+
/**
|
|
178
|
+
* The base for a tag whose app callback an engine behavior READS BACK inside the same microtask
|
|
179
|
+
* turn — `<text-input>`, `<switch>`, `<refresh-control>`. Zoneless change detection is a macrotask,
|
|
180
|
+
* so without this the behavior sees the PRE-event value and undoes the user; the full mechanism,
|
|
181
|
+
* and why this is `detectChanges()` on one view rather than `ApplicationRef.tick()`, is in
|
|
182
|
+
* `./change-detection-flush`.
|
|
183
|
+
*
|
|
184
|
+
* The directive is the only thing in the adapter that owns a `ChangeDetectorRef` for the view
|
|
185
|
+
* holding the binding, so it hands one to the renderer keyed on its own node.
|
|
186
|
+
*/
|
|
187
|
+
export class ReadBackElement extends SymbioteElement {
|
|
188
|
+
constructor() {
|
|
189
|
+
super();
|
|
190
|
+
// ITS OWN, now that the base has none. Three tags reach this class, so the injection is paid where
|
|
191
|
+
// it is read instead of on every element of a screen.
|
|
192
|
+
this.detector = inject(ChangeDetectorRef);
|
|
193
|
+
this.errorHandler = inject(ErrorHandler);
|
|
194
|
+
const node = this.host.nativeElement;
|
|
195
|
+
if (typeof node === 'object' && node !== null) {
|
|
196
|
+
registerViewFlush(node, () => this.flush());
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// REPORTED, NOT RETHROWN — Angular's own contract. Every other change detection runs inside
|
|
200
|
+
// `ApplicationRef.tick()`, caught by `ErrorHandler` (`SymbioteErrorHandler`); this flush instead
|
|
201
|
+
// runs from a native event dispatch, where an uncaught throw has nowhere to go but `RCTFatal`.
|
|
202
|
+
flush() {
|
|
203
|
+
try {
|
|
204
|
+
this.detector.detectChanges();
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
this.errorHandler.handleError(error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
ngOnDestroy() {
|
|
211
|
+
const node = this.host.nativeElement;
|
|
212
|
+
if (typeof node === 'object' && node !== null)
|
|
213
|
+
unregisterViewFlush(node);
|
|
214
|
+
}
|
|
215
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadBackElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
216
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ReadBackElement, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
|
|
217
|
+
}
|
|
218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadBackElement, decorators: [{
|
|
219
|
+
type: Directive
|
|
220
|
+
}], ctorParameters: () => [] });
|
|
221
|
+
/**
|
|
222
|
+
* The `[(value)]` half of a controlled tag — `<switch>` and `<text-input>`.
|
|
223
|
+
*
|
|
224
|
+
* The one `@Output` in this file, and it is FORCED rather than chosen. `[(value)]` desugars to
|
|
225
|
+
* `[value]` + `(valueChange)`, and ngtsc requires both halves to resolve to the SAME target: a
|
|
226
|
+
* declared `value` input beside an event no directive claims is NG8007, "the property and event
|
|
227
|
+
* halves are not bound to the same target". So the sugar this adapter documents cannot work without
|
|
228
|
+
* the output existing, whatever the file header says about events in general.
|
|
229
|
+
*
|
|
230
|
+
* The bridge below is NOT what makes the binding work today, and the comment says so because the
|
|
231
|
+
* obvious reading is wrong: the file header's "an `@Output` CONSUMES the binding" holds for a
|
|
232
|
+
* COMPONENT, and an element is the other case — Angular attaches the renderer listener for the
|
|
233
|
+
* event as well, so `Renderer2.listen` still runs and the engine still hears the change. Measured
|
|
234
|
+
* under JIT by deleting this whole hook: every case in `renderer/two-way-value.test.ts` stayed
|
|
235
|
+
* green, delivery included, and exactly ONCE (nothing double-fires when both paths exist).
|
|
236
|
+
*
|
|
237
|
+
* It is kept because the measurement is JIT-only and this adapter has a recorded case of JIT and
|
|
238
|
+
* AOT resolving a binding differently (`test-harness-false-greens.md` §21). If AOT routes the event
|
|
239
|
+
* exclusively to the output, this hook is the only thing keeping `[(value)]` alive; if it routes to
|
|
240
|
+
* both, it is one extra listener on a control an app explicitly bound. Delete it once something
|
|
241
|
+
* executes the LINKED artifact and shows the renderer listener is attached there too.
|
|
242
|
+
*
|
|
243
|
+
* Opened only when something is SUBSCRIBED: the prop's PRESENCE is what a behavior reads to decide
|
|
244
|
+
* it is controlled, so a `<switch>` given a handler nobody asked for changes how it snaps back.
|
|
245
|
+
* `.observed` is readable from `ngOnInit` because Angular subscribes outputs in the creation pass,
|
|
246
|
+
* before the update pass runs the hook — observed directly (true for the two bound tags, false for
|
|
247
|
+
* an unbound one), not assumed.
|
|
248
|
+
*/
|
|
249
|
+
export class ValueChangeElement extends ReadBackElement {
|
|
250
|
+
constructor() {
|
|
251
|
+
super(...arguments);
|
|
252
|
+
this.valueRenderer = inject(Renderer2);
|
|
253
|
+
this.valueHost = inject(ElementRef);
|
|
254
|
+
}
|
|
255
|
+
ngOnInit() {
|
|
256
|
+
if (!this.hasValueSubscriber())
|
|
257
|
+
return;
|
|
258
|
+
this.unlistenValue = this.valueRenderer.listen(this.valueHost.nativeElement, VALUE_CHANGE_EVENT, (value) => {
|
|
259
|
+
this.emitValue(value);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
ngOnDestroy() {
|
|
263
|
+
super.ngOnDestroy();
|
|
264
|
+
this.unlistenValue?.();
|
|
265
|
+
}
|
|
266
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValueChangeElement, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
267
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ValueChangeElement, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
|
|
268
|
+
}
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ValueChangeElement, decorators: [{
|
|
270
|
+
type: Directive
|
|
271
|
+
}] });
|
|
272
|
+
//# sourceMappingURL=element-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-base.js","sourceRoot":"","sources":["../../src/element-base.ts"],"names":[],"mappings":"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"}
|