-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
Copy path-proxy.js
116 lines (95 loc) · 2.59 KB
/
-proxy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
@module ember
*/
import { meta } from '@ember/-internals/meta';
import {
get,
set,
defineProperty,
Mixin,
tagForObject,
computed,
tagForProperty,
} from '@ember/-internals/metal';
import { setProxy, setupMandatorySetter, isObject } from '@ember/-internals/utils';
import { assert } from '@ember/debug';
import { DEBUG } from '@glimmer/env';
import { setCustomTagFor } from '@glimmer/manager';
import { combine, updateTag, tagFor, tagMetaFor } from '@glimmer/validator';
export function contentFor(proxy) {
let content = get(proxy, 'content');
updateTag(tagForObject(proxy), tagForObject(content));
return content;
}
function customTagForProxy(proxy, key, addMandatorySetter) {
let meta = tagMetaFor(proxy);
let tag = tagFor(proxy, key, meta);
if (DEBUG) {
// TODO: Replace this with something more first class for tracking tags in DEBUG
tag._propertyKey = key;
}
if (key in proxy) {
if (DEBUG && addMandatorySetter) {
setupMandatorySetter(tag, proxy, key);
}
return tag;
} else {
let tags = [tag, tagFor(proxy, 'content', meta)];
let content = contentFor(proxy);
if (isObject(content)) {
tags.push(tagForProperty(content, key, addMandatorySetter));
}
return combine(tags);
}
}
/**
`Ember.ProxyMixin` forwards all properties not defined by the proxy itself
to a proxied `content` object. See ObjectProxy for more details.
@class ProxyMixin
@namespace Ember
@private
*/
export default Mixin.create({
/**
The object whose properties will be forwarded.
@property content
@type {unknown}
@default null
@public
*/
content: null,
init() {
this._super(...arguments);
setProxy(this);
tagForObject(this);
setCustomTagFor(this, customTagForProxy);
},
willDestroy() {
this.set('content', null);
this._super(...arguments);
},
isTruthy: computed('content', function () {
return Boolean(get(this, 'content'));
}),
unknownProperty(key) {
let content = contentFor(this);
if (content) {
return get(content, key);
}
},
setUnknownProperty(key, value) {
let m = meta(this);
if (m.isInitializing() || m.isPrototypeMeta(this)) {
// if marked as prototype or object is initializing then just
// defineProperty rather than delegate
defineProperty(this, key, null, value);
return value;
}
let content = contentFor(this);
assert(
`Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`,
content
);
return set(content, key, value);
},
});