Skip to content
This repository was archived by the owner on Aug 2, 2024. It is now read-only.

Commit a7c2478

Browse files
authored
Merge pull request #697 from smile-io/fix/broken-glimmer-component-detection
Fix broken Glimmer component detection
2 parents 479e933 + e3a9f90 commit a7c2478

File tree

2 files changed

+49
-10
lines changed

2 files changed

+49
-10
lines changed

addon/helpers/is-component-definition.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,23 @@ export function isComponentDefinition(content) {
77
return false;
88
}
99

10+
// Glimmer now uses Symbol keys in its component definitions so we check those first.
11+
let symbolPropKeys = Object.getOwnPropertySymbols?.(content);
12+
if (symbolPropKeys?.length) {
13+
let isGlimmerComponentDefinition = symbolPropKeys.some((symbolPropKey) => {
14+
let propValue = content[symbolPropKey];
15+
return (
16+
propValue &&
17+
Object.keys(propValue).some((key) => key === 'ComponentClass')
18+
);
19+
});
20+
21+
if (isGlimmerComponentDefinition) {
22+
return true;
23+
}
24+
}
25+
1026
let contentPropNames = Object.keys(content);
11-
// This stopped working in Ember 3.17 when it was switched to use a Symbol instead
12-
// See https://github.com/glimmerjs/glimmer-vm/blob/master/CHANGELOG.md#v0450-2019-12-18 and
13-
// https://github.com/glimmerjs/glimmer-vm/pull/993 for more
1427
let isPreOctaneComponentDefinition = contentPropNames.some(
1528
(propName) => propName.indexOf('COMPONENT DEFINITION') > -1
1629
);

tests/integration/helpers/is-component-definition-test.js

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,49 @@ import { module, test } from 'qunit';
33
import { setupRenderingTest } from 'ember-qunit';
44
import { render } from '@ember/test-helpers';
55

6+
function createMockGlimmerComponentDefinition() {
7+
return {
8+
[Symbol('INNER')]: {
9+
name: 'mock-component',
10+
ComponentClass: {},
11+
template: {},
12+
manager: {},
13+
state: {},
14+
},
15+
};
16+
}
17+
618
module('Integration | Helper | is-component-definition', function (hooks) {
719
setupRenderingTest(hooks);
820

9-
// Replace this with your real tests.
10-
test('it renders', async function (assert) {
11-
this.set('inputValue', '1234');
12-
13-
await render(hbs`{{if (is-component-definition inputValue) "yes" "no"}}`);
21+
test('it detects component definitions correctly', async function (assert) {
22+
await render(hbs`{{if (is-component-definition "1234") "yes" "no"}}`);
1423
assert
1524
.dom(this.element)
16-
.hasText('no', "returns false when it's not a component definition");
25+
.hasText(
26+
'no',
27+
'returns false when passed something other than a component definition'
28+
);
1729

1830
await render(
1931
hbs`{{if (is-component-definition (component "polaris-heading" text="Text")) "yes" "no"}}`
2032
);
2133
assert
2234
.dom(this.element)
23-
.hasText('yes', "returns true when it's a component definition");
35+
.hasText('yes', 'returns true when passed a component definition');
36+
37+
this.set(
38+
'glimmerComponentDefinition',
39+
createMockGlimmerComponentDefinition()
40+
);
41+
await render(
42+
hbs`{{if (is-component-definition this.glimmerComponentDefinition) "yes" "no"}}`
43+
);
44+
assert
45+
.dom(this.element)
46+
.hasText(
47+
'yes',
48+
'returns true when passed a Glimmer component definition'
49+
);
2450
});
2551
});

0 commit comments

Comments
 (0)