1 | import { Container } from 'aurelia-dependency-injection';
|
2 | import { bindable, customElement, processContent } from '../src/decorators';
|
3 | import { ModuleAnalyzer } from '../src/module-analyzer';
|
4 | import './setup';
|
5 | import { ViewResources } from '../src/view-resources';
|
6 |
|
7 | describe('ModuleAnalyzer', () => {
|
8 |
|
9 | let container;
|
10 |
|
11 | let resources;
|
12 |
|
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 |
|
132 |
|
133 |
|
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 |
|
189 |
|
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 | });
|