File tree Expand file tree Collapse file tree 8 files changed +94
-7
lines changed 
unpublished-development-types Expand file tree Collapse file tree 8 files changed +94
-7
lines changed Original file line number Diff line number Diff line change 1+ --- 
2+ ' @hashicorp/design-system-components '  : patch 
3+ --- 
4+ 
5+ Introduce the ` hds-resolve-link-to-component `  utility to correctly resolve the LinkTo component when ` @isRouteExternal `  is set on ` HdsBreadcrumbItem `  or ` HdsInteractive ` . Consumers are now required to install ` ember-engines `  when ` @isRouteExternal `  is ` true ` .
Original file line number Diff line number Diff line change 118118    "typescript-eslint" : " ^8.29.0"  ,
119119    "webpack" : " ^5.97.1" 
120120  },
121+   "peerDependencies" : {
122+     "ember-engines" : " >= 0.11.0" 
123+   },
124+   "peerDependenciesMeta" : {
125+     "ember-engines" : {
126+       "optional" : true 
127+     }
128+   },
121129  "ember" : {
122130    "edition" : " octane" 
123131  },
Original file line number Diff line number Diff line change 1414    </div >
1515  {{ else }} 
1616    {{ #if  @isRouteExternal }} 
17-       <LinkToExternal 
17+       <this .linkToExternal 
1818        class =" hds-breadcrumb__link" 
1919        @current-when ={{ @current-when }} 
2020        @models ={{ hds-link-to-models  @model   @models }} 
2828          </div >
2929        {{ /if }} 
3030        <span  class =" hds-breadcrumb__text"  >{{ @text }} </span >
31-       </LinkToExternal >
31+       </this .linkToExternal >
3232    {{ else }} 
3333      <LinkTo 
3434        class =" hds-breadcrumb__link" 
Original file line number Diff line number Diff line change 44 */ 
55
66import  Component  from  '@glimmer/component' ; 
7+ import  {  tracked  }  from  '@glimmer/tracking' ; 
78import  {  htmlSafe  }  from  '@ember/template' ; 
89import  {  assert  }  from  '@ember/debug' ; 
10+ 
11+ import  {  hdsResolveLinkToExternal  }  from  '../../../utils/hds-resolve-link-to-external.ts' ; 
12+ 
13+ import  type  Owner  from  '@ember/owner' ; 
14+ import  type  {  LinkTo  }  from  '@ember/routing' ; 
915import  type  {  SafeString  }  from  '@ember/template' ; 
10- import  type  {  HdsIconSignature  }  from  '../icon' ; 
16+ import  type  {  HdsIconSignature  }  from  '../icon/index ' ; 
1117
1218export  interface  HdsBreadcrumbItemSignature  { 
1319  Args : { 
@@ -27,6 +33,23 @@ export interface HdsBreadcrumbItemSignature {
2733} 
2834
2935export  default  class  HdsBreadcrumbItem  extends  Component < HdsBreadcrumbItemSignature >  { 
36+   @tracked  linkToExternal : LinkTo  |  null  =  null ; 
37+ 
38+   constructor ( owner : Owner ,  args : HdsBreadcrumbItemSignature [ 'Args' ] )  { 
39+     super ( owner ,  args ) ; 
40+ 
41+     // we want to avoid resolving the component if it's not needed 
42+     if  ( args . isRouteExternal )  { 
43+       void  this . resolveLinkToExternal ( ) ; 
44+     } 
45+   } 
46+ 
47+   async  resolveLinkToExternal ( )  { 
48+     this . linkToExternal  =  await  hdsResolveLinkToExternal ( 
49+       this . args . isRouteExternal 
50+     ) ; 
51+   } 
52+ 
3053  /** 
3154   * @param  maxWidth 
3255   * @type  {string } 
Original file line number Diff line number Diff line change 33{{! 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 }} 
44{{ ~#if  @route ~}} 
55  {{ ~#if  this.isRouteExternal ~}} 
6-     <LinkToExternal 
6+     <this .linkToExternal 
77      @current-when ={{ @current-when }} 
88      @models ={{ hds-link-to-models  @model   @models }} 
99      @query ={{ hds-link-to-query  @query }} 
1010      @replace ={{ @replace }} 
1111      @route ={{ @route }} 
1212      ...attributes
13-     >{{ yield }} </LinkToExternal >
13+     >{{ yield }} </this .linkToExternal >
1414  {{ ~else ~}} 
1515    <LinkTo 
1616      @current-when ={{ @current-when }} 
Original file line number Diff line number Diff line change 44 */ 
55
66import  Component  from  '@glimmer/component' ; 
7+ import  {  tracked  }  from  '@glimmer/tracking' ; 
78import  {  action  }  from  '@ember/object' ; 
89
10+ import  {  hdsResolveLinkToExternal  }  from  '../../../utils/hds-resolve-link-to-external.ts' ; 
11+ 
12+ import  type  Owner  from  '@ember/owner' ; 
13+ import  type  {  LinkTo  }  from  '@ember/routing' ; 
14+ 
915export  interface  HdsInteractiveSignature  { 
1016  Args : { 
1117    href ?: string ; 
@@ -27,6 +33,22 @@ export interface HdsInteractiveSignature {
2733} 
2834
2935export  default  class  HdsInteractive  extends  Component < HdsInteractiveSignature >  { 
36+   @tracked  linkToExternal : LinkTo  |  null  =  null ; 
37+ 
38+   constructor ( owner : Owner ,  args : HdsInteractiveSignature [ 'Args' ] )  { 
39+     super ( owner ,  args ) ; 
40+ 
41+     // we want to avoid resolving the component if it's not needed 
42+     if  ( args . isRouteExternal )  { 
43+       void  this . resolveLinkToExternal ( ) ; 
44+     } 
45+   } 
46+ 
47+   async  resolveLinkToExternal ( )  { 
48+     this . linkToExternal  =  await  hdsResolveLinkToExternal ( 
49+       this . args . isRouteExternal 
50+     ) ; 
51+   } 
3052  /** 
3153   * Determines if a @href value is "external" (it adds target="_blank" rel="noopener noreferrer") 
3254   * 
Original file line number Diff line number Diff line change 1+ import  {  LinkTo  }  from  '@ember/routing' ; 
2+ import  {  assert  }  from  '@ember/debug' ; 
3+ 
4+ /** 
5+  * Resolves the correct component to use for the `LinkTo`. 
6+  * 
7+  * @param  isRouteExternal - If true, will return the `LinkToExternal` component. If `ember-engines` is not installed, an assertion will be thrown. 
8+  * @returns  A promise resolving to the correct component to use for the `LinkTo`. 
9+  */ 
10+ export  async  function  hdsResolveLinkToExternal ( 
11+   isRouteExternal ?: boolean 
12+ ) : Promise < typeof  LinkTo >  { 
13+   if  ( isRouteExternal )  { 
14+     try  { 
15+       // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment 
16+       const  mod  =  await  import ( 
17+         // @ts -expect-error: we list this as optional peer dependency 
18+         'ember-engines/components/link-to-external-component' 
19+       ) ; 
20+       // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access 
21+       return  mod . default  as  typeof  LinkTo ; 
22+     }  catch  { 
23+       assert ( 
24+         `@isRouteExternal is only available when using the "ember-engines" addon. Please install it to use this feature.` , 
25+         false 
26+       ) ; 
27+     } 
28+   } 
29+ 
30+   return  LinkTo ; 
31+ } 
Original file line number Diff line number Diff line change 11import  '@glint/environment-ember-loose' ; 
22import  '@glint/environment-ember-template-imports' ; 
33
4- import  {  LinkTo  }  from  '@ember/routing' ; 
54import  {  Portal ,  PortalTarget  }  from  'ember-stargate' ; 
65
76import  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    Portal : typeof  Portal ; 
3028    PortalTarget : typeof  PortalTarget ; 
3129    'sort-by' : HelperLike < { 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments