Skip to content

Commit 32a9f43

Browse files
committed
fix(components): make ember-engines optional
1 parent 5f7693a commit 32a9f43

File tree

5 files changed

+88
-196
lines changed

5 files changed

+88
-196
lines changed

packages/components/package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
"ember-cli-sass": "^11.0.1",
6464
"ember-concurrency": "^4.0.2",
6565
"ember-element-helper": "^0.8.6",
66-
"ember-engines": "^0.12.0",
6766
"ember-focus-trap": "^1.1.1",
6867
"ember-get-config": "^2.1.1",
6968
"ember-modifier": "^4.2.0",
@@ -122,6 +121,11 @@
122121
"peerDependencies": {
123122
"ember-source": "^3.28.0 || ^4.0.0 || ^5.3.0"
124123
},
124+
"peerDependenciesMeta": {
125+
"ember-engines": {
126+
"optional": true
127+
}
128+
},
125129
"ember": {
126130
"edition": "octane"
127131
},

packages/components/src/components/hds/breadcrumb/item.gts

+47-35
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import Component from '@glimmer/component';
77
import { htmlSafe } from '@ember/template';
88
import { assert } from '@ember/debug';
99
import { LinkTo } from '@ember/routing';
10-
// @ts-expect-error: no types
11-
import LinkToExternal from 'ember-engines/components/link-to-external-component.js';
10+
import { dependencySatisfies, importSync } from '@embroider/macros';
1211
import HdsIcon from '../icon/index.gts';
1312
import hdsLinkToModels from '../../../helpers/hds-link-to-models.ts';
1413
import hdsLinkToQuery from '../../../helpers/hds-link-to-query.ts';
1514

1615
import type { SafeString } from '@ember/template';
1716
import type { HdsIconSignature } from '../icon';
17+
import type Owner from '@ember/owner';
1818

1919
export interface HdsBreadcrumbItemSignature {
2020
Args: {
@@ -34,6 +34,26 @@ export interface HdsBreadcrumbItemSignature {
3434
}
3535

3636
export default class HdsBreadcrumbItem extends Component<HdsBreadcrumbItemSignature> {
37+
linkToComponent = LinkTo;
38+
39+
constructor(owner: Owner, args: HdsBreadcrumbItemSignature['Args']) {
40+
super(owner, args);
41+
42+
if (this.args.isRouteExternal) {
43+
if (dependencySatisfies('ember-engines', '*')) {
44+
// @ts-expect-error: shape is unknown
45+
this.linkToComponent = importSync(
46+
'ember-engines/components/link-to-external-component.js'
47+
).default as LinkTo;
48+
} else {
49+
assert(
50+
`@isRouteExternal is only available when using the "ember-engines" addon. Please install it to use this feature.`,
51+
false
52+
);
53+
}
54+
}
55+
}
56+
3757
/**
3858
* @param maxWidth
3959
* @type {string}
@@ -79,6 +99,16 @@ export default class HdsBreadcrumbItem extends Component<HdsBreadcrumbItemSignat
7999
return classes.join(' ');
80100
}
81101

102+
get isRouteExternal(): boolean {
103+
const { isRouteExternal } = this.args;
104+
105+
if (isRouteExternal && dependencySatisfies('ember-engines', '*')) {
106+
return isRouteExternal;
107+
} else {
108+
return false;
109+
}
110+
}
111+
82112
<template>
83113
<li class="hds-breadcrumb__item" style={{this.itemStyle}} ...attributes>
84114
{{#if @current}}
@@ -91,39 +121,21 @@ export default class HdsBreadcrumbItem extends Component<HdsBreadcrumbItemSignat
91121
<span class="hds-breadcrumb__text">{{@text}}</span>
92122
</div>
93123
{{else}}
94-
{{#if @isRouteExternal}}
95-
<LinkToExternal
96-
class="hds-breadcrumb__link"
97-
@current-when={{@current-when}}
98-
@models={{hdsLinkToModels @model @models}}
99-
@query={{hdsLinkToQuery @query}}
100-
@replace={{@replace}}
101-
@route={{@route}}
102-
>
103-
{{#if @icon}}
104-
<div class="hds-breadcrumb__icon">
105-
<HdsIcon @name={{@icon}} @size="16" @stretched={{true}} />
106-
</div>
107-
{{/if}}
108-
<span class="hds-breadcrumb__text">{{@text}}</span>
109-
</LinkToExternal>
110-
{{else}}
111-
<LinkTo
112-
class="hds-breadcrumb__link"
113-
@current-when={{@current-when}}
114-
@models={{hdsLinkToModels @model @models}}
115-
@query={{hdsLinkToQuery @query}}
116-
@replace={{@replace}}
117-
@route={{@route}}
118-
>
119-
{{#if @icon}}
120-
<div class="hds-breadcrumb__icon">
121-
<HdsIcon @name={{@icon}} @size="16" @stretched={{true}} />
122-
</div>
123-
{{/if}}
124-
<span class="hds-breadcrumb__text">{{@text}}</span>
125-
</LinkTo>
126-
{{/if}}
124+
<this.linkToComponent
125+
class="hds-breadcrumb__link"
126+
@current-when={{@current-when}}
127+
@models={{hdsLinkToModels @model @models}}
128+
@query={{hdsLinkToQuery @query}}
129+
@replace={{@replace}}
130+
@route={{@route}}
131+
>
132+
{{#if @icon}}
133+
<div class="hds-breadcrumb__icon">
134+
<HdsIcon @name={{@icon}} @size="16" @stretched={{true}} />
135+
</div>
136+
{{/if}}
137+
<span class="hds-breadcrumb__text">{{@text}}</span>
138+
</this.linkToComponent>
127139
{{/if}}
128140
</li>
129141
</template>

packages/components/src/components/hds/interactive/index.gts

+32-21
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
import Component from '@glimmer/component';
77
import { LinkTo } from '@ember/routing';
88
import { on } from '@ember/modifier';
9-
// @ts-expect-error: no types
10-
import LinkToExternal from 'ember-engines/components/link-to-external-component.js';
9+
import { assert } from '@ember/debug';
10+
import { dependencySatisfies, importSync } from '@embroider/macros';
1111
import hdsLinkToModels from '../../../helpers/hds-link-to-models.ts';
1212
import hdsLinkToQuery from '../../../helpers/hds-link-to-query.ts';
1313

14+
import type Owner from '@ember/owner';
15+
1416
export interface HdsInteractiveSignature {
1517
Args: {
1618
href?: string;
@@ -32,6 +34,26 @@ export interface HdsInteractiveSignature {
3234
}
3335

3436
export default class HdsInteractive extends Component<HdsInteractiveSignature> {
37+
linkToComponent = LinkTo;
38+
39+
constructor(owner: Owner, args: HdsInteractiveSignature['Args']) {
40+
super(owner, args);
41+
42+
if (this.args.isRouteExternal) {
43+
if (dependencySatisfies('ember-engines', '*')) {
44+
// @ts-expect-error: shape is unknown
45+
this.linkToComponent = importSync(
46+
'ember-engines/components/link-to-external-component.js'
47+
).default as LinkTo;
48+
} else {
49+
assert(
50+
`@isRouteExternal is only available when using the "ember-engines" addon. Please install it to use this feature.`,
51+
false
52+
);
53+
}
54+
}
55+
}
56+
3557
/**
3658
* Determines if a @href value is "external" (it adds target="_blank" rel="noopener noreferrer")
3759
*
@@ -65,25 +87,14 @@ export default class HdsInteractive extends Component<HdsInteractiveSignature> {
6587
{{! IMPORTANT: we need to add "squishies" here (~) because otherwise the whitespace added by Ember becomes visible in the link (being an inline element) - See https://handlebarsjs.com/guide/expressions.html#whitespace-control }}
6688
{{! NOTICE: we can't support the direct use of the "href" HTML attribute via ...attributes in the <a> elements, because we need to rely on the "@href" Ember argument to differentiate between different types of generated output }}
6789
{{~#if @route~}}
68-
{{~#if this.isRouteExternal~}}
69-
<LinkToExternal
70-
@current-when={{@current-when}}
71-
@models={{hdsLinkToModels @model @models}}
72-
@query={{hdsLinkToQuery @query}}
73-
@replace={{@replace}}
74-
@route={{@route}}
75-
...attributes
76-
>{{yield}}</LinkToExternal>
77-
{{~else~}}
78-
<LinkTo
79-
@current-when={{@current-when}}
80-
@models={{hdsLinkToModels @model @models}}
81-
@query={{hdsLinkToQuery @query}}
82-
@replace={{@replace}}
83-
@route={{@route}}
84-
...attributes
85-
>{{yield}}</LinkTo>
86-
{{~/if~}}
90+
<this.linkToComponent
91+
@current-when={{@current-when}}
92+
@models={{hdsLinkToModels @model @models}}
93+
@query={{hdsLinkToQuery @query}}
94+
@replace={{@replace}}
95+
@route={{@route}}
96+
...attributes
97+
>{{yield}}</this.linkToComponent>
8798
{{~else if @href~}}
8899
{{~#if this.isHrefExternal~}}
89100
<a

packages/components/unpublished-development-types/global.d.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import '@glint/environment-ember-loose';
22
import '@glint/environment-ember-template-imports';
33

4-
import { LinkTo } from '@ember/routing';
54
import { Portal, PortalTarget } from 'ember-stargate';
65

76
import type HdsComponentsRegistry from '../src/template-registry';
@@ -25,7 +24,6 @@ declare module '@glint/environment-ember-loose/registry' {
2524
RenderModifiersRegistry,
2625
EmbroiderUtilRegistry /*, other addon registries */ {
2726
// local entries
28-
LinkToExternal: typeof LinkTo;
2927
// we have to use `ember-stargate` version `0.4.3` because version `0.5.0` causes a break in the tests for `ember-lts-3.28`
3028
Portal: typeof Portal;
3129
PortalTarget: typeof PortalTarget;

0 commit comments

Comments
 (0)