@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.
Files changed (72) hide show
  1. package/README.md +42 -0
  2. package/addon/-private/base-component-manager.ts +35 -0
  3. package/addon/-private/component.ts +287 -0
  4. package/addon/-private/ember-component-manager.ts +99 -0
  5. package/addon/index.ts +34 -0
  6. package/config/environment.js +5 -0
  7. package/dist/commonjs/addon/-private/base-component-manager.d.ts +13 -0
  8. package/dist/commonjs/addon/-private/base-component-manager.js +20 -0
  9. package/dist/commonjs/addon/-private/component.d.ts +244 -0
  10. package/dist/commonjs/addon/-private/component.js +170 -0
  11. package/dist/commonjs/index.d.ts +1 -0
  12. package/dist/commonjs/index.js +9 -0
  13. package/dist/commonjs/src/component-manager.d.ts +12 -0
  14. package/dist/commonjs/src/component-manager.js +30 -0
  15. package/dist/commonjs/src/component.d.ts +4 -0
  16. package/dist/commonjs/src/component.js +23 -0
  17. package/dist/commonjs/test/index.d.ts +1 -0
  18. package/dist/commonjs/test/index.js +4 -0
  19. package/dist/commonjs/test/interactive/args-test.d.ts +1 -0
  20. package/dist/commonjs/test/interactive/args-test.js +47 -0
  21. package/dist/commonjs/test/interactive/index.d.ts +2 -0
  22. package/dist/commonjs/test/interactive/index.js +5 -0
  23. package/dist/commonjs/test/interactive/lifecycle-hook-test.d.ts +1 -0
  24. package/dist/commonjs/test/interactive/lifecycle-hook-test.js +92 -0
  25. package/dist/modules/addon/-private/base-component-manager.d.ts +13 -0
  26. package/dist/modules/addon/-private/base-component-manager.js +17 -0
  27. package/dist/modules/addon/-private/component.d.ts +244 -0
  28. package/dist/modules/addon/-private/component.js +167 -0
  29. package/dist/modules/index.d.ts +1 -0
  30. package/dist/modules/index.js +2 -0
  31. package/dist/modules/src/component-manager.d.ts +12 -0
  32. package/dist/modules/src/component-manager.js +24 -0
  33. package/dist/modules/src/component.d.ts +4 -0
  34. package/dist/modules/src/component.js +17 -0
  35. package/dist/modules/test/index.d.ts +1 -0
  36. package/dist/modules/test/index.js +2 -0
  37. package/dist/modules/test/interactive/args-test.d.ts +1 -0
  38. package/dist/modules/test/interactive/args-test.js +42 -0
  39. package/dist/modules/test/interactive/index.d.ts +2 -0
  40. package/dist/modules/test/interactive/index.js +3 -0
  41. package/dist/modules/test/interactive/lifecycle-hook-test.d.ts +1 -0
  42. package/dist/modules/test/interactive/lifecycle-hook-test.js +87 -0
  43. package/ember-addon-main.js +5 -0
  44. package/index.ts +1 -0
  45. package/package.json +115 -0
  46. package/src/component-manager.ts +24 -0
  47. package/src/component.ts +22 -0
  48. package/test/ember/dummy/app/app.js +14 -0
  49. package/test/ember/dummy/app/components/conference-speakers.js +22 -0
  50. package/test/ember/dummy/app/config/environment.d.ts +16 -0
  51. package/test/ember/dummy/app/index.html +25 -0
  52. package/test/ember/dummy/app/resolver.js +3 -0
  53. package/test/ember/dummy/app/router.js +13 -0
  54. package/test/ember/dummy/app/styles/app.css +0 -0
  55. package/test/ember/dummy/app/templates/application.hbs +3 -0
  56. package/test/ember/dummy/app/templates/components/conference-speakers.hbs +14 -0
  57. package/test/ember/dummy/app/templates/conference-speakers.hbs +1 -0
  58. package/test/ember/dummy/config/environment.js +51 -0
  59. package/test/ember/dummy/config/optional-features.json +6 -0
  60. package/test/ember/dummy/config/targets.js +14 -0
  61. package/test/ember/dummy/public/robots.txt +3 -0
  62. package/test/ember/index.html +40 -0
  63. package/test/ember/integration/components/glimmer-component-guide-test.js +42 -0
  64. package/test/ember/integration/components/glimmer-component-test.js +288 -0
  65. package/test/ember/test-helper.js +12 -0
  66. package/test/index.ts +1 -0
  67. package/test/interactive/args-test.ts +49 -0
  68. package/test/interactive/index.ts +2 -0
  69. package/test/interactive/lifecycle-hook-test.ts +99 -0
  70. package/types/@ember/component.d.ts +11 -0
  71. package/types/ember/index.d.ts +9 -0
  72. 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,2 @@
1
+ import './args-test';
2
+ import './lifecycle-hook-test';
@@ -0,0 +1,3 @@
1
+ import './args-test';
2
+ import './lifecycle-hook-test';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9jb21wb25lbnQvdGVzdC9pbnRlcmFjdGl2ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGFBQWEsQ0FBQztBQUNyQixPQUFPLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL2FyZ3MtdGVzdCc7XG5pbXBvcnQgJy4vbGlmZWN5Y2xlLWhvb2stdGVzdCc7XG4iXX0=
@@ -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=
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ name: '@norith/glimmer-component',
5
+ };
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
+ }
@@ -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,3 @@
1
+ import Resolver from 'ember-resolver';
2
+
3
+ export default Resolver;
@@ -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,3 @@
1
+ <h2 id="title">Welcome to Ember</h2>
2
+
3
+ {{outlet}}
@@ -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,6 @@
1
+ {
2
+ "application-template-wrapper": false,
3
+ "default-async-observers": true,
4
+ "jquery-integration": false,
5
+ "template-only-glimmer-components": true
6
+ }
@@ -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,3 @@
1
+ # http://www.robotstxt.org
2
+ User-agent: *
3
+ Disallow:
@@ -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
+ });