UNPKG

5.43 kBJavaScriptView Raw
1import { Container } from 'aurelia-dependency-injection';
2import { bindable, customElement, processContent } from '../src/decorators';
3import { ModuleAnalyzer } from '../src/module-analyzer';
4import './setup';
5import { ViewResources } from '../src/view-resources';
6
7describe('ModuleAnalyzer', () => {
8 /**@type {Container} */
9 let container;
10 /**@type {ViewResources} */
11 let resources;
12 /**@type {ModuleAnalyzer} */
13 let moduleAnalyzer;
14
15 beforeEach(() => {
16 container = new Container();
17 resources = new ViewResources();
18 moduleAnalyzer = container.get(ModuleAnalyzer);
19 });
20
21 it('analyzes', () => {
22 let m = {
23 E: class E {
24 },
25 DCustomAttribute: class {
26 }
27 };
28 let result = moduleAnalyzer.analyze('a.js', m);
29 expect(result.mainResource.metadata.elementName).toBe('e');
30 expect(result.resources[0].metadata.attributeName).toBe('d');
31 });
32
33 it(`uses static resource convention,
34 which ignores export name and use class name / explicit config`, () => {
35
36 let m = {
37 E: class E {
38 static $resource() {
39 return 'e1';
40 }
41 },
42 DCustomAttribute: class {
43 static $resource() {
44 return {
45 type: 'attribute'
46 };
47 }
48 }
49 };
50
51 let analysis = moduleAnalyzer.analyze('a.js', m);
52 expect(analysis.mainResource.metadata.elementName).toBe('e1');
53 expect(analysis.resources[0].metadata.attributeName).toBe('d-custom-attribute');
54 });
55
56 it('combines metadata for HtmlBehaviorResource', () => {
57 @customElement('e1')
58 class E {
59 static $resource() {
60 return 'e1';
61 }
62 }
63 class D {
64 static $resource() {
65 return {
66 type: 'element'
67 };
68 }
69
70 @bindable() date = new Date()
71 }
72 class F {
73 static $resource() {
74 return { type: 'attribute' }
75 }
76 @bindable() f
77 }
78
79 let m = {
80 E: E,
81 DCustomAttribute: D,
82 FCustom: F
83 };
84 let analysis = moduleAnalyzer.analyze('a.js', m);
85 expect(analysis.mainResource.metadata.elementName).toBe('e1');
86 expect(analysis.resources[0].metadata.elementName).toBe('d');
87 expect(analysis.resources[1].metadata.attributeName).toBe('f');
88 });
89
90 describe('inheritance', () => {
91
92 it('analyzes', () => {
93 class BaseField {
94 static $resource() {
95 return {
96 bindables: [
97 'name',
98 {
99 name: 'value',
100 defaultBindingMode: 'twoWay'
101 }
102 ]
103 };
104 }
105 }
106
107 class TextField extends BaseField {
108
109 @bindable()
110 label
111 }
112
113 class DateField extends TextField {
114 @bindable()
115 format;
116 }
117
118 let m1 = {
119 a: TextField,
120
121 };
122 let m2 = {
123 b: DateField
124 }
125 let analysis1 = moduleAnalyzer.analyze('a.js', m1);
126 let analysis2 = moduleAnalyzer.analyze('b.js', m2);
127 expect(analysis1.mainResource.metadata.elementName).toBe('text-field');
128 expect(analysis2.mainResource.metadata.elementName).toBe('date-field');
129 });
130
131 // aurelia modules that go through module analyzer will be searched for metadata
132 // through the whole class hierarchy. So it's always advised to defined own metadata
133 // for inheritance scenario
134 it('analyses with base using static config and derived using metadata', () => {
135 class BaseField {
136 @bindable() name
137
138 @bindable({
139 primaryProperty: true,
140 defaultBindingMode: 'twoWay'
141 })
142 value;
143 }
144
145 @customElement('text-field')
146 class TextField extends BaseField {
147 static $resource = {
148 bindables: ['label']
149 };
150 }
151
152 class DateField extends TextField {
153 @bindable()
154 format;
155 }
156
157 @processContent(false)
158 class Field extends BaseField {
159 static $resource = {
160 bindables: ['fieldName']
161 }
162 }
163
164 class Readonly {
165 static $resource = {
166 type: 'attribute'
167 }
168 }
169
170 let m1 = {
171 a: TextField,
172 };
173 let m2 = {
174 b: DateField
175 };
176 let m3 = {
177 c: Field,
178 r: Readonly
179 };
180 let analysis1 = moduleAnalyzer.analyze('a.js', m1);
181 let analysis2 = moduleAnalyzer.analyze('b.js', m2);
182 let analysis3 = moduleAnalyzer.analyze('c.js', m3);
183 expect(analysis1.mainResource.metadata.elementName).toBe('text-field');
184 expect(analysis2.mainResource.metadata.elementName).toBe('date-field');
185 expect(analysis3.mainResource.metadata.elementName).toBe('field');
186 expect(analysis3.resources[0].metadata.attributeName).toBe('readonly');
187
188 // intergration with ViewResources test
189 // ensure that initialization / registration work with view resources
190 // -------------
191
192 analysis1.initialize(container);
193 analysis1.register(resources);
194 expect(analysis1.mainResource.metadata.properties.length).toBe(3);
195
196 analysis2.initialize(container);
197 analysis2.register(resources);
198 expect(analysis2.mainResource.metadata.properties.length).toBe(4);
199
200 analysis3.initialize(container);
201 analysis3.register(resources);
202 expect(analysis3.mainResource.metadata.properties.length).toBe(3);
203 expect(analysis3.resources[0].metadata.properties.length).toBe(1);
204 });
205 });
206});