@norith/glimmer-component 1.0.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/README.md +42 -0
- package/addon/-private/base-component-manager.ts +35 -0
- package/addon/-private/component.ts +287 -0
- package/addon/-private/ember-component-manager.ts +99 -0
- package/addon/index.ts +34 -0
- package/config/environment.js +5 -0
- package/dist/commonjs/addon/-private/base-component-manager.d.ts +13 -0
- package/dist/commonjs/addon/-private/base-component-manager.js +20 -0
- package/dist/commonjs/addon/-private/component.d.ts +244 -0
- package/dist/commonjs/addon/-private/component.js +170 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +9 -0
- package/dist/commonjs/src/component-manager.d.ts +12 -0
- package/dist/commonjs/src/component-manager.js +30 -0
- package/dist/commonjs/src/component.d.ts +4 -0
- package/dist/commonjs/src/component.js +23 -0
- package/dist/commonjs/test/index.d.ts +1 -0
- package/dist/commonjs/test/index.js +4 -0
- package/dist/commonjs/test/interactive/args-test.d.ts +1 -0
- package/dist/commonjs/test/interactive/args-test.js +47 -0
- package/dist/commonjs/test/interactive/index.d.ts +2 -0
- package/dist/commonjs/test/interactive/index.js +5 -0
- package/dist/commonjs/test/interactive/lifecycle-hook-test.d.ts +1 -0
- package/dist/commonjs/test/interactive/lifecycle-hook-test.js +92 -0
- package/dist/modules/addon/-private/base-component-manager.d.ts +13 -0
- package/dist/modules/addon/-private/base-component-manager.js +17 -0
- package/dist/modules/addon/-private/component.d.ts +244 -0
- package/dist/modules/addon/-private/component.js +167 -0
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +2 -0
- package/dist/modules/src/component-manager.d.ts +12 -0
- package/dist/modules/src/component-manager.js +24 -0
- package/dist/modules/src/component.d.ts +4 -0
- package/dist/modules/src/component.js +17 -0
- package/dist/modules/test/index.d.ts +1 -0
- package/dist/modules/test/index.js +2 -0
- package/dist/modules/test/interactive/args-test.d.ts +1 -0
- package/dist/modules/test/interactive/args-test.js +42 -0
- package/dist/modules/test/interactive/index.d.ts +2 -0
- package/dist/modules/test/interactive/index.js +3 -0
- package/dist/modules/test/interactive/lifecycle-hook-test.d.ts +1 -0
- package/dist/modules/test/interactive/lifecycle-hook-test.js +87 -0
- package/ember-addon-main.js +5 -0
- package/index.ts +1 -0
- package/package.json +115 -0
- package/src/component-manager.ts +24 -0
- package/src/component.ts +22 -0
- package/test/ember/dummy/app/app.js +14 -0
- package/test/ember/dummy/app/components/conference-speakers.js +22 -0
- package/test/ember/dummy/app/config/environment.d.ts +16 -0
- package/test/ember/dummy/app/index.html +25 -0
- package/test/ember/dummy/app/resolver.js +3 -0
- package/test/ember/dummy/app/router.js +13 -0
- package/test/ember/dummy/app/styles/app.css +0 -0
- package/test/ember/dummy/app/templates/application.hbs +3 -0
- package/test/ember/dummy/app/templates/components/conference-speakers.hbs +14 -0
- package/test/ember/dummy/app/templates/conference-speakers.hbs +1 -0
- package/test/ember/dummy/config/environment.js +51 -0
- package/test/ember/dummy/config/optional-features.json +6 -0
- package/test/ember/dummy/config/targets.js +14 -0
- package/test/ember/dummy/public/robots.txt +3 -0
- package/test/ember/index.html +40 -0
- package/test/ember/integration/components/glimmer-component-guide-test.js +42 -0
- package/test/ember/integration/components/glimmer-component-test.js +288 -0
- package/test/ember/test-helper.js +12 -0
- package/test/index.ts +1 -0
- package/test/interactive/args-test.ts +49 -0
- package/test/interactive/index.ts +2 -0
- package/test/interactive/lifecycle-hook-test.ts +99 -0
- package/types/@ember/component.d.ts +11 -0
- package/types/ember/index.d.ts +9 -0
- package/types/ember-compatibility-helpers.d.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import Component from '@norith/glimmer-component';
|
|
8
|
+
import { tracked } from '@norith/glimmer-tracking';
|
|
9
|
+
import { setComponentTemplate, precompileTemplate } from '@norith/glimmer-core';
|
|
10
|
+
import { test, render, settled } from '@norith/glimmer-core/test/utils';
|
|
11
|
+
QUnit.module('[@glimmer/component] Component Arguments', () => {
|
|
12
|
+
test('Getters that depend on `args` re-render correctly', async function (assert) {
|
|
13
|
+
assert.expect(2);
|
|
14
|
+
let parent;
|
|
15
|
+
class ParentComponent extends Component {
|
|
16
|
+
constructor(owner, args) {
|
|
17
|
+
super(owner, args);
|
|
18
|
+
this.firstName = 'Tom';
|
|
19
|
+
this.status = 'is dope';
|
|
20
|
+
parent = this;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
__decorate([
|
|
24
|
+
tracked
|
|
25
|
+
], ParentComponent.prototype, "firstName", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
tracked
|
|
28
|
+
], ParentComponent.prototype, "status", void 0);
|
|
29
|
+
class ChildComponent extends Component {
|
|
30
|
+
get name() {
|
|
31
|
+
return `${this.args.firstName} Dale`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
setComponentTemplate(precompileTemplate('<ChildComponent @firstName={{this.firstName}} @status={{this.status}} />', { strictMode: true, scope: { ChildComponent } }), ParentComponent);
|
|
35
|
+
setComponentTemplate(precompileTemplate('{{this.name}} {{@status}}', { strictMode: true }), ChildComponent);
|
|
36
|
+
assert.equal(await render(ParentComponent), 'Tom Dale is dope');
|
|
37
|
+
parent.firstName = 'Thom';
|
|
38
|
+
parent.status = 'is dank';
|
|
39
|
+
assert.equal(await settled(), 'Thom Dale is dank');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy10ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvY29tcG9uZW50L3Rlc3QvaW50ZXJhY3RpdmUvYXJncy10ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sU0FBUyxNQUFNLDJCQUEyQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV4RSxLQUFLLENBQUMsTUFBTSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtJQUM1RCxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxXQUFXLE1BQU07UUFDOUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqQixJQUFJLE1BQXVCLENBQUM7UUFFNUIsTUFBTSxlQUFnQixTQUFRLFNBQVM7WUFJckMsWUFBWSxLQUFhLEVBQUUsSUFBUTtnQkFDakMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFKWixjQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixXQUFNLEdBQUcsU0FBUyxDQUFDO2dCQUkxQixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLENBQUM7U0FDRjtRQVBVO1lBQVIsT0FBTzswREFBbUI7UUFDbEI7WUFBUixPQUFPO3VEQUFvQjtRQVE5QixNQUFNLGNBQWUsU0FBUSxTQUFnQztZQUMzRCxJQUFJLElBQUk7Z0JBQ04sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxPQUFPLENBQUM7WUFDdkMsQ0FBQztTQUNGO1FBRUQsb0JBQW9CLENBQ2xCLGtCQUFrQixDQUNoQiwwRUFBMEUsRUFDMUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQ2hELEVBQ0QsZUFBZSxDQUNoQixDQUFDO1FBRUYsb0JBQW9CLENBQ2xCLGtCQUFrQixDQUFDLDJCQUEyQixFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3JFLGNBQWMsQ0FDZixDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWhFLE1BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQzNCLE1BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRTNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxPQUFPLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29tcG9uZW50IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci1jb21wb25lbnQnO1xuaW1wb3J0IHsgdHJhY2tlZCB9IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci10cmFja2luZyc7XG5cbmltcG9ydCB7IHNldENvbXBvbmVudFRlbXBsYXRlLCBwcmVjb21waWxlVGVtcGxhdGUgfSBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29yZSc7XG5pbXBvcnQgeyB0ZXN0LCByZW5kZXIsIHNldHRsZWQgfSBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29yZS90ZXN0L3V0aWxzJztcblxuUVVuaXQubW9kdWxlKCdbQGdsaW1tZXIvY29tcG9uZW50XSBDb21wb25lbnQgQXJndW1lbnRzJywgKCkgPT4ge1xuICB0ZXN0KCdHZXR0ZXJzIHRoYXQgZGVwZW5kIG9uIGBhcmdzYCByZS1yZW5kZXIgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKGFzc2VydCkge1xuICAgIGFzc2VydC5leHBlY3QoMik7XG5cbiAgICBsZXQgcGFyZW50OiBQYXJlbnRDb21wb25lbnQ7XG5cbiAgICBjbGFzcyBQYXJlbnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgICAgQHRyYWNrZWQgZmlyc3ROYW1lID0gJ1RvbSc7XG4gICAgICBAdHJhY2tlZCBzdGF0dXMgPSAnaXMgZG9wZSc7XG5cbiAgICAgIGNvbnN0cnVjdG9yKG93bmVyOiBvYmplY3QsIGFyZ3M6IHt9KSB7XG4gICAgICAgIHN1cGVyKG93bmVyLCBhcmdzKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzcyBDaGlsZENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudDx7IGZpcnN0TmFtZTogc3RyaW5nIH0+IHtcbiAgICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmFyZ3MuZmlyc3ROYW1lfSBEYWxlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgIHByZWNvbXBpbGVUZW1wbGF0ZShcbiAgICAgICAgJzxDaGlsZENvbXBvbmVudCBAZmlyc3ROYW1lPXt7dGhpcy5maXJzdE5hbWV9fSBAc3RhdHVzPXt7dGhpcy5zdGF0dXN9fSAvPicsXG4gICAgICAgIHsgc3RyaWN0TW9kZTogdHJ1ZSwgc2NvcGU6IHsgQ2hpbGRDb21wb25lbnQgfSB9XG4gICAgICApLFxuICAgICAgUGFyZW50Q29tcG9uZW50XG4gICAgKTtcblxuICAgIHNldENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgcHJlY29tcGlsZVRlbXBsYXRlKCd7e3RoaXMubmFtZX19IHt7QHN0YXR1c319JywgeyBzdHJpY3RNb2RlOiB0cnVlIH0pLFxuICAgICAgQ2hpbGRDb21wb25lbnRcbiAgICApO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHJlbmRlcihQYXJlbnRDb21wb25lbnQpLCAnVG9tIERhbGUgaXMgZG9wZScpO1xuXG4gICAgcGFyZW50IS5maXJzdE5hbWUgPSAnVGhvbSc7XG4gICAgcGFyZW50IS5zdGF0dXMgPSAnaXMgZGFuayc7XG5cbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgc2V0dGxlZCgpLCAnVGhvbSBEYWxlIGlzIGRhbmsnKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import './args-test';
|
|
2
|
+
import './lifecycle-hook-test';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9jb21wb25lbnQvdGVzdC9pbnRlcmFjdGl2ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGFBQWEsQ0FBQztBQUNyQixPQUFPLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL2FyZ3MtdGVzdCc7XG5pbXBvcnQgJy4vbGlmZWN5Y2xlLWhvb2stdGVzdCc7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import Component from '@norith/glimmer-component';
|
|
8
|
+
import { tracked } from '@norith/glimmer-tracking';
|
|
9
|
+
import { test, render, settled } from '@norith/glimmer-core/test/utils';
|
|
10
|
+
import { setComponentTemplate, precompileTemplate } from '@norith/glimmer-core';
|
|
11
|
+
QUnit.module('[@glimmer/component] Lifecycle Hooks', () => {
|
|
12
|
+
test('Lifecycle hook ordering', async function (assert) {
|
|
13
|
+
assert.expect(2);
|
|
14
|
+
let invocations = [];
|
|
15
|
+
let component1;
|
|
16
|
+
class HookLoggerComponent extends Component {
|
|
17
|
+
constructor(owner, args) {
|
|
18
|
+
super(owner, args);
|
|
19
|
+
invocations.push([this.args.name, 'constructor']);
|
|
20
|
+
}
|
|
21
|
+
willDestroy() {
|
|
22
|
+
invocations.push([this.args.name, 'willDestroy']);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
class Component1 extends HookLoggerComponent {
|
|
26
|
+
constructor(owner, args) {
|
|
27
|
+
super(owner, args);
|
|
28
|
+
this.firstName = 'Chirag';
|
|
29
|
+
this.showChildren = true;
|
|
30
|
+
component1 = this;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
__decorate([
|
|
34
|
+
tracked
|
|
35
|
+
], Component1.prototype, "firstName", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
tracked
|
|
38
|
+
], Component1.prototype, "showChildren", void 0);
|
|
39
|
+
class Component2 extends HookLoggerComponent {
|
|
40
|
+
}
|
|
41
|
+
class Component3 extends HookLoggerComponent {
|
|
42
|
+
}
|
|
43
|
+
class Component4 extends HookLoggerComponent {
|
|
44
|
+
}
|
|
45
|
+
class Component5 extends HookLoggerComponent {
|
|
46
|
+
}
|
|
47
|
+
setComponentTemplate(precompileTemplate(`
|
|
48
|
+
{{#if this.showChildren}}
|
|
49
|
+
<Component2 @name="component2" @firstName={{this.firstName}} />
|
|
50
|
+
<Component3 @name="component3"/>
|
|
51
|
+
{{/if}}
|
|
52
|
+
`, {
|
|
53
|
+
strictMode: true,
|
|
54
|
+
scope: { Component2, Component3 },
|
|
55
|
+
}), Component1);
|
|
56
|
+
setComponentTemplate(precompileTemplate(`
|
|
57
|
+
{{@firstName}}
|
|
58
|
+
<Component4 @name="component4"/>
|
|
59
|
+
<Component5 @name="component5"/>
|
|
60
|
+
`, {
|
|
61
|
+
strictMode: true,
|
|
62
|
+
scope: { Component4, Component5 },
|
|
63
|
+
}), Component2);
|
|
64
|
+
const emptyTemplate = precompileTemplate('');
|
|
65
|
+
setComponentTemplate(emptyTemplate, Component3);
|
|
66
|
+
setComponentTemplate(emptyTemplate, Component4);
|
|
67
|
+
setComponentTemplate(emptyTemplate, Component5);
|
|
68
|
+
await render(Component1, { args: { name: 'component1' } });
|
|
69
|
+
assert.deepEqual(invocations, [
|
|
70
|
+
['component1', 'constructor'],
|
|
71
|
+
['component2', 'constructor'],
|
|
72
|
+
['component4', 'constructor'],
|
|
73
|
+
['component5', 'constructor'],
|
|
74
|
+
['component3', 'constructor'],
|
|
75
|
+
]);
|
|
76
|
+
invocations = [];
|
|
77
|
+
component1.showChildren = false;
|
|
78
|
+
await settled();
|
|
79
|
+
assert.deepEqual(invocations, [
|
|
80
|
+
['component2', 'willDestroy'],
|
|
81
|
+
['component4', 'willDestroy'],
|
|
82
|
+
['component5', 'willDestroy'],
|
|
83
|
+
['component3', 'willDestroy'],
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWhvb2stdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBvbmVudC90ZXN0L2ludGVyYWN0aXZlL2xpZmVjeWNsZS1ob29rLXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxTQUFTLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWhGLEtBQUssQ0FBQyxNQUFNLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO0lBQ3hELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLFdBQVcsTUFBTTtRQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpCLElBQUksV0FBVyxHQUF1QixFQUFFLENBQUM7UUFDekMsSUFBSSxVQUFzQixDQUFDO1FBRTNCLE1BQWUsbUJBQW9CLFNBQVEsU0FBMkI7WUFDcEUsWUFBWSxLQUFhLEVBQUUsSUFBc0I7Z0JBQy9DLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxXQUFXO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7U0FDRjtRQUVELE1BQU0sVUFBVyxTQUFRLG1CQUFtQjtZQUkxQyxZQUFZLEtBQWEsRUFBRSxJQUFzQjtnQkFDL0MsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFKWixjQUFTLEdBQUcsUUFBUSxDQUFDO2dCQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztnQkFJM0IsVUFBVSxHQUFHLElBQUksQ0FBQztZQUNwQixDQUFDO1NBQ0Y7UUFQVTtZQUFSLE9BQU87cURBQXNCO1FBQ3JCO1lBQVIsT0FBTzt3REFBcUI7UUFPL0IsTUFBTSxVQUFXLFNBQVEsbUJBQW1CO1NBQUc7UUFDL0MsTUFBTSxVQUFXLFNBQVEsbUJBQW1CO1NBQUc7UUFDL0MsTUFBTSxVQUFXLFNBQVEsbUJBQW1CO1NBQUc7UUFDL0MsTUFBTSxVQUFXLFNBQVEsbUJBQW1CO1NBQUc7UUFFL0Msb0JBQW9CLENBQ2xCLGtCQUFrQixDQUNoQjs7Ozs7U0FLQyxFQUNEO1lBQ0UsVUFBVSxFQUFFLElBQUk7WUFDaEIsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRTtTQUNsQyxDQUNGLEVBQ0QsVUFBVSxDQUNYLENBQUM7UUFFRixvQkFBb0IsQ0FDbEIsa0JBQWtCLENBQ2hCOzs7O1NBSUMsRUFDRDtZQUNFLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUU7U0FDbEMsQ0FDRixFQUNELFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFN0Msb0JBQW9CLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEQsTUFBTSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUM1QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7WUFDN0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1lBQzdCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztZQUM3QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7WUFDN0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFakIsVUFBVyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFakMsTUFBTSxPQUFPLEVBQUUsQ0FBQztRQUVoQixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUM1QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7WUFDN0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1lBQzdCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztZQUM3QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21wb25lbnQgZnJvbSAnQG5vcml0aC9nbGltbWVyLWNvbXBvbmVudCc7XG5pbXBvcnQgeyB0cmFja2VkIH0gZnJvbSAnQG5vcml0aC9nbGltbWVyLXRyYWNraW5nJztcblxuaW1wb3J0IHsgdGVzdCwgcmVuZGVyLCBzZXR0bGVkIH0gZnJvbSAnQG5vcml0aC9nbGltbWVyLWNvcmUvdGVzdC91dGlscyc7XG5pbXBvcnQgeyBzZXRDb21wb25lbnRUZW1wbGF0ZSwgcHJlY29tcGlsZVRlbXBsYXRlIH0gZnJvbSAnQG5vcml0aC9nbGltbWVyLWNvcmUnO1xuXG5RVW5pdC5tb2R1bGUoJ1tAZ2xpbW1lci9jb21wb25lbnRdIExpZmVjeWNsZSBIb29rcycsICgpID0+IHtcbiAgdGVzdCgnTGlmZWN5Y2xlIGhvb2sgb3JkZXJpbmcnLCBhc3luYyBmdW5jdGlvbiAoYXNzZXJ0KSB7XG4gICAgYXNzZXJ0LmV4cGVjdCgyKTtcblxuICAgIGxldCBpbnZvY2F0aW9uczogW3N0cmluZywgc3RyaW5nXVtdID0gW107XG4gICAgbGV0IGNvbXBvbmVudDE6IENvbXBvbmVudDE7XG5cbiAgICBhYnN0cmFjdCBjbGFzcyBIb29rTG9nZ2VyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50PHsgbmFtZTogc3RyaW5nIH0+IHtcbiAgICAgIGNvbnN0cnVjdG9yKG93bmVyOiBvYmplY3QsIGFyZ3M6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAgICAgICAgc3VwZXIob3duZXIsIGFyZ3MpO1xuICAgICAgICBpbnZvY2F0aW9ucy5wdXNoKFt0aGlzLmFyZ3MubmFtZSwgJ2NvbnN0cnVjdG9yJ10pO1xuICAgICAgfVxuXG4gICAgICB3aWxsRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaW52b2NhdGlvbnMucHVzaChbdGhpcy5hcmdzLm5hbWUsICd3aWxsRGVzdHJveSddKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzcyBDb21wb25lbnQxIGV4dGVuZHMgSG9va0xvZ2dlckNvbXBvbmVudCB7XG4gICAgICBAdHJhY2tlZCBmaXJzdE5hbWUgPSAnQ2hpcmFnJztcbiAgICAgIEB0cmFja2VkIHNob3dDaGlsZHJlbiA9IHRydWU7XG5cbiAgICAgIGNvbnN0cnVjdG9yKG93bmVyOiBvYmplY3QsIGFyZ3M6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAgICAgICAgc3VwZXIob3duZXIsIGFyZ3MpO1xuICAgICAgICBjb21wb25lbnQxID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY2xhc3MgQ29tcG9uZW50MiBleHRlbmRzIEhvb2tMb2dnZXJDb21wb25lbnQge31cbiAgICBjbGFzcyBDb21wb25lbnQzIGV4dGVuZHMgSG9va0xvZ2dlckNvbXBvbmVudCB7fVxuICAgIGNsYXNzIENvbXBvbmVudDQgZXh0ZW5kcyBIb29rTG9nZ2VyQ29tcG9uZW50IHt9XG4gICAgY2xhc3MgQ29tcG9uZW50NSBleHRlbmRzIEhvb2tMb2dnZXJDb21wb25lbnQge31cblxuICAgIHNldENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgcHJlY29tcGlsZVRlbXBsYXRlKFxuICAgICAgICBgXG4gICAgICAgICAge3sjaWYgdGhpcy5zaG93Q2hpbGRyZW59fVxuICAgICAgICAgICAgPENvbXBvbmVudDIgQG5hbWU9XCJjb21wb25lbnQyXCIgQGZpcnN0TmFtZT17e3RoaXMuZmlyc3ROYW1lfX0gLz5cbiAgICAgICAgICAgIDxDb21wb25lbnQzIEBuYW1lPVwiY29tcG9uZW50M1wiLz5cbiAgICAgICAgICB7ey9pZn19XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHJpY3RNb2RlOiB0cnVlLFxuICAgICAgICAgIHNjb3BlOiB7IENvbXBvbmVudDIsIENvbXBvbmVudDMgfSxcbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIENvbXBvbmVudDFcbiAgICApO1xuXG4gICAgc2V0Q29tcG9uZW50VGVtcGxhdGUoXG4gICAgICBwcmVjb21waWxlVGVtcGxhdGUoXG4gICAgICAgIGBcbiAgICAgICAgICB7e0BmaXJzdE5hbWV9fVxuICAgICAgICAgIDxDb21wb25lbnQ0IEBuYW1lPVwiY29tcG9uZW50NFwiLz5cbiAgICAgICAgICA8Q29tcG9uZW50NSBAbmFtZT1cImNvbXBvbmVudDVcIi8+XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHJpY3RNb2RlOiB0cnVlLFxuICAgICAgICAgIHNjb3BlOiB7IENvbXBvbmVudDQsIENvbXBvbmVudDUgfSxcbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIENvbXBvbmVudDJcbiAgICApO1xuXG4gICAgY29uc3QgZW1wdHlUZW1wbGF0ZSA9IHByZWNvbXBpbGVUZW1wbGF0ZSgnJyk7XG5cbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShlbXB0eVRlbXBsYXRlLCBDb21wb25lbnQzKTtcbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShlbXB0eVRlbXBsYXRlLCBDb21wb25lbnQ0KTtcbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShlbXB0eVRlbXBsYXRlLCBDb21wb25lbnQ1KTtcblxuICAgIGF3YWl0IHJlbmRlcihDb21wb25lbnQxLCB7IGFyZ3M6IHsgbmFtZTogJ2NvbXBvbmVudDEnIH0gfSk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKGludm9jYXRpb25zLCBbXG4gICAgICBbJ2NvbXBvbmVudDEnLCAnY29uc3RydWN0b3InXSxcbiAgICAgIFsnY29tcG9uZW50MicsICdjb25zdHJ1Y3RvciddLFxuICAgICAgWydjb21wb25lbnQ0JywgJ2NvbnN0cnVjdG9yJ10sXG4gICAgICBbJ2NvbXBvbmVudDUnLCAnY29uc3RydWN0b3InXSxcbiAgICAgIFsnY29tcG9uZW50MycsICdjb25zdHJ1Y3RvciddLFxuICAgIF0pO1xuXG4gICAgaW52b2NhdGlvbnMgPSBbXTtcblxuICAgIGNvbXBvbmVudDEhLnNob3dDaGlsZHJlbiA9IGZhbHNlO1xuXG4gICAgYXdhaXQgc2V0dGxlZCgpO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbChpbnZvY2F0aW9ucywgW1xuICAgICAgWydjb21wb25lbnQyJywgJ3dpbGxEZXN0cm95J10sXG4gICAgICBbJ2NvbXBvbmVudDQnLCAnd2lsbERlc3Ryb3knXSxcbiAgICAgIFsnY29tcG9uZW50NScsICd3aWxsRGVzdHJveSddLFxuICAgICAgWydjb21wb25lbnQzJywgJ3dpbGxEZXN0cm95J10sXG4gICAgXSk7XG4gIH0pO1xufSk7XG4iXX0=
|
package/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './src/component';
|
package/package.json
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@norith/glimmer-component",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Glimmer component library",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ember-addon"
|
|
7
|
+
],
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"main": "dist/commonjs/index.js",
|
|
10
|
+
"module": "dist/modules/index.js",
|
|
11
|
+
"contributors": [
|
|
12
|
+
"Dan Gebhardt <dan@cerebris.com>",
|
|
13
|
+
"Robert Jackson <me@rwjblue.com>",
|
|
14
|
+
"Tom Dale <tom@tomdale.net>"
|
|
15
|
+
],
|
|
16
|
+
"directories": {
|
|
17
|
+
"doc": "doc",
|
|
18
|
+
"test": "tests"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/snorith/glimmer.js.git"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "ember build",
|
|
26
|
+
"lint:js": "eslint .",
|
|
27
|
+
"start": "ember serve",
|
|
28
|
+
"test": "ember test",
|
|
29
|
+
"test:all": "ember try:each"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@norith/glimmer-core": "1.0.0",
|
|
33
|
+
"@glimmer/env": "^0.1.7",
|
|
34
|
+
"@glimmer/util": "0.84.0",
|
|
35
|
+
"broccoli-file-creator": "^2.1.1",
|
|
36
|
+
"broccoli-merge-trees": "^3.0.2",
|
|
37
|
+
"ember-cli-babel": "^7.23.0",
|
|
38
|
+
"ember-cli-get-component-path-option": "^1.0.0",
|
|
39
|
+
"ember-cli-is-package-missing": "^1.0.0",
|
|
40
|
+
"ember-cli-normalize-entity-name": "^1.0.0",
|
|
41
|
+
"ember-cli-path-utils": "^1.0.0",
|
|
42
|
+
"ember-cli-string-utils": "^1.1.0",
|
|
43
|
+
"ember-cli-typescript": "^5.0.0",
|
|
44
|
+
"ember-compatibility-helpers": "^1.1.2"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@ember/optional-features": "^2.0.0",
|
|
48
|
+
"@ember/test-helpers": "^2.6.0",
|
|
49
|
+
"@embroider/test-setup": "^1.2.0",
|
|
50
|
+
"@glimmer/application-test-helpers": "^1.0.0",
|
|
51
|
+
"@glimmer/compiler": "0.84.0",
|
|
52
|
+
"@glimmer/interfaces": "0.84.0",
|
|
53
|
+
"@glimmer/resolver": "^0.4.3",
|
|
54
|
+
"@norith/glimmer-tracking": "1.0.0",
|
|
55
|
+
"@glimmer/wire-format": "0.84.0",
|
|
56
|
+
"@types/ember": "~4.0.0",
|
|
57
|
+
"@types/ember-qunit": "~5.0.0",
|
|
58
|
+
"@types/ember-testing-helpers": "^0.0.4",
|
|
59
|
+
"@types/ember__destroyable": "^4.0.0",
|
|
60
|
+
"@types/ember__test-helpers": "~2.6.1",
|
|
61
|
+
"@types/qunit": "^2.5.3",
|
|
62
|
+
"@types/rsvp": "^4.0.2",
|
|
63
|
+
"babel-eslint": "^10.1.0",
|
|
64
|
+
"broccoli-asset-rev": "^2.7.0",
|
|
65
|
+
"broccoli-funnel": "^2.0.1",
|
|
66
|
+
"ember-auto-import": "^2.4.0",
|
|
67
|
+
"ember-cli": "~3.27.0",
|
|
68
|
+
"ember-cli-blueprint-test-helpers": "^0.19.1",
|
|
69
|
+
"ember-cli-dependency-checker": "^3.2.0",
|
|
70
|
+
"ember-cli-htmlbars": "^6.0.0",
|
|
71
|
+
"ember-cli-inject-live-reload": "^2.0.2",
|
|
72
|
+
"ember-disable-prototype-extensions": "^1.1.3",
|
|
73
|
+
"ember-export-application-global": "^2.0.1",
|
|
74
|
+
"ember-load-initializers": "^2.1.2",
|
|
75
|
+
"ember-maybe-import-regenerator": "^0.1.6",
|
|
76
|
+
"ember-qunit": "^5.1.1",
|
|
77
|
+
"ember-resolver": "^8.0.2",
|
|
78
|
+
"ember-source": "~3.24.0",
|
|
79
|
+
"ember-source-channel-url": "^3.0.0",
|
|
80
|
+
"ember-try": "^1.3.0",
|
|
81
|
+
"eslint-config-prettier": "^7.1.0",
|
|
82
|
+
"eslint-plugin-ember": "^10.1.1",
|
|
83
|
+
"eslint-plugin-node": "^11.1.0",
|
|
84
|
+
"eslint-plugin-prettier": "^3.3.1",
|
|
85
|
+
"loader.js": "^4.7.0",
|
|
86
|
+
"npm-run-all": "^4.1.5",
|
|
87
|
+
"prettier": "^2.2.1",
|
|
88
|
+
"qunit": "^2.13.0",
|
|
89
|
+
"qunit-dom": "^2.0.0",
|
|
90
|
+
"typescript": "~4.2.3",
|
|
91
|
+
"webpack": "^5.69.0"
|
|
92
|
+
},
|
|
93
|
+
"typesVersions": {
|
|
94
|
+
"*": {
|
|
95
|
+
"-private/*": [
|
|
96
|
+
"dist/modules/addon/-private/*"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"engines": {
|
|
101
|
+
"node": "12.* || 14.* || >= 16"
|
|
102
|
+
},
|
|
103
|
+
"ember": {
|
|
104
|
+
"edition": "octane"
|
|
105
|
+
},
|
|
106
|
+
"ember-addon": {
|
|
107
|
+
"configPath": "tests/dummy/config",
|
|
108
|
+
"defaultBlueprint": "install-glimmer-component",
|
|
109
|
+
"main": "ember-addon-main.js"
|
|
110
|
+
},
|
|
111
|
+
"publishConfig": {
|
|
112
|
+
"access": "public",
|
|
113
|
+
"registry": "https://registry.npmjs.org"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { componentCapabilities } from '@norith/glimmer-core';
|
|
2
|
+
|
|
3
|
+
import BaseComponentManager from '../addon/-private/base-component-manager';
|
|
4
|
+
import GlimmerComponent, { setDestroying, setDestroyed } from '../addon/-private/component';
|
|
5
|
+
|
|
6
|
+
const CAPABILITIES = componentCapabilities('3.13', {
|
|
7
|
+
destructor: true,
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This component manager runs in Glimmer.js environments and extends the base component manager to:
|
|
12
|
+
*
|
|
13
|
+
* 1. Implement a lightweight destruction protocol (currently not deferred, like in Ember)
|
|
14
|
+
* 2. Invoke legacy component lifecycle hooks (didInsertElement and didUpdate)
|
|
15
|
+
*/
|
|
16
|
+
export default class GlimmerComponentManager extends BaseComponentManager<GlimmerComponent> {
|
|
17
|
+
capabilities = CAPABILITIES;
|
|
18
|
+
|
|
19
|
+
destroyComponent(component: GlimmerComponent): void {
|
|
20
|
+
setDestroying(component);
|
|
21
|
+
component.willDestroy();
|
|
22
|
+
setDestroyed(component);
|
|
23
|
+
}
|
|
24
|
+
}
|
package/src/component.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { setComponentManager, setOwner } from '@norith/glimmer-core';
|
|
2
|
+
import GlimmerComponentManager from './component-manager';
|
|
3
|
+
import _GlimmerComponent, { Args } from '../addon/-private/component';
|
|
4
|
+
import { DEBUG } from '@glimmer/env';
|
|
5
|
+
|
|
6
|
+
export default class GlimmerComponent<S = unknown> extends _GlimmerComponent<S> {
|
|
7
|
+
constructor(owner: object, args: Args<S>) {
|
|
8
|
+
super(owner, args);
|
|
9
|
+
|
|
10
|
+
if (DEBUG && !(owner !== null && typeof owner === 'object')) {
|
|
11
|
+
throw new Error(
|
|
12
|
+
`You must pass both the owner and args to super() in your component: ${this.constructor.name}. You can pass them directly, or use ...arguments to pass all arguments through.`
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
setOwner(this, owner);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
setComponentManager((owner: {}) => {
|
|
21
|
+
return new GlimmerComponentManager(owner);
|
|
22
|
+
}, GlimmerComponent);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Application from '@ember/application';
|
|
2
|
+
import Resolver from './resolver';
|
|
3
|
+
import loadInitializers from 'ember-load-initializers';
|
|
4
|
+
import config from './config/environment';
|
|
5
|
+
|
|
6
|
+
const App = Application.extend({
|
|
7
|
+
modulePrefix: config.modulePrefix,
|
|
8
|
+
podModulePrefix: config.podModulePrefix,
|
|
9
|
+
Resolver,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
loadInitializers(App, config.modulePrefix);
|
|
13
|
+
|
|
14
|
+
export default App;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Component from '@norith/glimmer-component';
|
|
2
|
+
import { action, set, computed } from '@ember/object';
|
|
3
|
+
|
|
4
|
+
export default class ConferenceSpeakers extends Component {
|
|
5
|
+
current = 0;
|
|
6
|
+
speakers = ['Tom', 'Yehuda', 'Ed'];
|
|
7
|
+
|
|
8
|
+
@computed('current')
|
|
9
|
+
get currentlySpeaking() {
|
|
10
|
+
return this.speakers[this.current];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@computed('current')
|
|
14
|
+
get moreSpeakers() {
|
|
15
|
+
return this.speakers.length - 1 > this.current;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@action
|
|
19
|
+
next() {
|
|
20
|
+
set(this, 'current', this.current + 1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for
|
|
3
|
+
* import config from './config/environment'
|
|
4
|
+
*
|
|
5
|
+
* For now these need to be managed by the developer
|
|
6
|
+
* since different ember addons can materialize new entries.
|
|
7
|
+
*/
|
|
8
|
+
declare const config: {
|
|
9
|
+
environment: unknown;
|
|
10
|
+
modulePrefix: string;
|
|
11
|
+
podModulePrefix: string;
|
|
12
|
+
locationType: string;
|
|
13
|
+
rootURL: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default config;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
6
|
+
<title>Dummy</title>
|
|
7
|
+
<meta name="description" content="">
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
|
+
|
|
10
|
+
{{content-for "head"}}
|
|
11
|
+
|
|
12
|
+
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
|
|
13
|
+
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/dummy.css">
|
|
14
|
+
|
|
15
|
+
{{content-for "head-footer"}}
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
{{content-for "body"}}
|
|
19
|
+
|
|
20
|
+
<script src="{{rootURL}}assets/vendor.js"></script>
|
|
21
|
+
<script src="{{rootURL}}assets/dummy.js"></script>
|
|
22
|
+
|
|
23
|
+
{{content-for "body-footer"}}
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import EmberRouter from '@ember/routing/router';
|
|
2
|
+
import config from './config/environment';
|
|
3
|
+
|
|
4
|
+
const Router = EmberRouter.extend({
|
|
5
|
+
location: config.locationType,
|
|
6
|
+
rootURL: config.rootURL,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
Router.map(function () {
|
|
10
|
+
this.route('conference-speakers');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export default Router;
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div>
|
|
2
|
+
<p>Speaking: {{this.currentlySpeaking}}</p>
|
|
3
|
+
<ul>
|
|
4
|
+
{{#each this.speakers key="@index" as |speaker|}}
|
|
5
|
+
<li>{{speaker}}</li>
|
|
6
|
+
{{/each}}
|
|
7
|
+
</ul>
|
|
8
|
+
|
|
9
|
+
{{#if this.moreSpeakers}}
|
|
10
|
+
<button onclick={{this.next}}>Next</button>
|
|
11
|
+
{{else}}
|
|
12
|
+
<p>All finished!</p>
|
|
13
|
+
{{/if}}
|
|
14
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<ConferenceSpeakers />
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = function (environment) {
|
|
4
|
+
const ENV = {
|
|
5
|
+
modulePrefix: 'dummy',
|
|
6
|
+
environment,
|
|
7
|
+
rootURL: '/',
|
|
8
|
+
locationType: 'auto',
|
|
9
|
+
EmberENV: {
|
|
10
|
+
FEATURES: {
|
|
11
|
+
// Here you can enable experimental features on an ember canary build
|
|
12
|
+
// e.g. 'with-controller': true
|
|
13
|
+
},
|
|
14
|
+
EXTEND_PROTOTYPES: {
|
|
15
|
+
// Prevent Ember Data from overriding Date.parse.
|
|
16
|
+
Date: false,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
APP: {
|
|
21
|
+
// Here you can pass flags/options to your application instance
|
|
22
|
+
// when it is created
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
if (environment === 'development') {
|
|
27
|
+
// ENV.APP.LOG_RESOLVER = true;
|
|
28
|
+
// ENV.APP.LOG_ACTIVE_GENERATION = true;
|
|
29
|
+
// ENV.APP.LOG_TRANSITIONS = true;
|
|
30
|
+
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
|
|
31
|
+
// ENV.APP.LOG_VIEW_LOOKUPS = true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (environment === 'test') {
|
|
35
|
+
// Testem prefers this...
|
|
36
|
+
ENV.locationType = 'none';
|
|
37
|
+
|
|
38
|
+
// keep test console output quieter
|
|
39
|
+
ENV.APP.LOG_ACTIVE_GENERATION = false;
|
|
40
|
+
ENV.APP.LOG_VIEW_LOOKUPS = false;
|
|
41
|
+
|
|
42
|
+
ENV.APP.rootElement = '#ember-testing';
|
|
43
|
+
ENV.APP.autoboot = false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (environment === 'production') {
|
|
47
|
+
// here you can enable a production-specific feature
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return ENV;
|
|
51
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions'];
|
|
4
|
+
|
|
5
|
+
const isCI = !!process.env.CI;
|
|
6
|
+
const isProduction = process.env.EMBER_ENV === 'production';
|
|
7
|
+
|
|
8
|
+
if (isCI || isProduction) {
|
|
9
|
+
browsers.push('ie 11');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
browsers,
|
|
14
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
6
|
+
<title>Dummy Tests</title>
|
|
7
|
+
<meta name="description" content="">
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
|
+
|
|
10
|
+
{{content-for "head"}}
|
|
11
|
+
{{content-for "test-head"}}
|
|
12
|
+
|
|
13
|
+
<link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
|
|
14
|
+
<link rel="stylesheet" href="{{rootURL}}assets/dummy.css">
|
|
15
|
+
<link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
|
|
16
|
+
|
|
17
|
+
{{content-for "head-footer"}}
|
|
18
|
+
{{content-for "test-head-footer"}}
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
{{content-for "body"}}
|
|
22
|
+
{{content-for "test-body"}}
|
|
23
|
+
|
|
24
|
+
<div id="qunit"></div>
|
|
25
|
+
<div id="qunit-fixture">
|
|
26
|
+
<div id="ember-testing-container">
|
|
27
|
+
<div id="ember-testing"></div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<script src="/testem.js" integrity="" data-embroider-ignore></script>
|
|
32
|
+
<script src="{{rootURL}}assets/vendor.js"></script>
|
|
33
|
+
<script src="{{rootURL}}assets/test-support.js"></script>
|
|
34
|
+
<script src="{{rootURL}}assets/dummy.js"></script>
|
|
35
|
+
<script src="{{rootURL}}assets/tests.js"></script>
|
|
36
|
+
|
|
37
|
+
{{content-for "body-footer"}}
|
|
38
|
+
{{content-for "test-body-footer"}}
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { module, test } from 'qunit';
|
|
2
|
+
import { setupRenderingTest } from 'ember-qunit';
|
|
3
|
+
import { render, click } from '@ember/test-helpers';
|
|
4
|
+
import { hbs } from 'ember-cli-htmlbars';
|
|
5
|
+
|
|
6
|
+
module('Integration | Component | glimmer.js guide example', function (hooks) {
|
|
7
|
+
setupRenderingTest(hooks);
|
|
8
|
+
|
|
9
|
+
hooks.beforeEach(function (assert) {
|
|
10
|
+
assert.validateSpeakers = (speakerNames, currentSpeaker) => {
|
|
11
|
+
const items = this.element.querySelectorAll('li');
|
|
12
|
+
assert.equal(items.length, speakerNames.length, 'correct number of entires found');
|
|
13
|
+
|
|
14
|
+
for (let i = 0; i < speakerNames.length; i++) {
|
|
15
|
+
assert.dom(items[i]).hasText(speakerNames[i]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
assert.dom('p').hasText(`Speaking: ${currentSpeaker}`);
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('renders', async function (assert) {
|
|
23
|
+
await render(hbs`<ConferenceSpeakers />`);
|
|
24
|
+
|
|
25
|
+
assert.validateSpeakers(['Tom', 'Yehuda', 'Ed'], 'Tom');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('cycles through speakers', async function (assert) {
|
|
29
|
+
await render(hbs`<ConferenceSpeakers />`);
|
|
30
|
+
|
|
31
|
+
assert.validateSpeakers(['Tom', 'Yehuda', 'Ed'], 'Tom');
|
|
32
|
+
|
|
33
|
+
await click('button');
|
|
34
|
+
|
|
35
|
+
assert.validateSpeakers(['Tom', 'Yehuda', 'Ed'], 'Yehuda');
|
|
36
|
+
|
|
37
|
+
await click('button');
|
|
38
|
+
|
|
39
|
+
assert.validateSpeakers(['Tom', 'Yehuda', 'Ed'], 'Ed');
|
|
40
|
+
assert.dom('button').doesNotExist();
|
|
41
|
+
});
|
|
42
|
+
});
|