ember-source 7.3.0-alpha.5 → 7.4.0-alpha.1

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 (159) hide show
  1. package/build-metadata.json +3 -3
  2. package/dist/dev/packages/@ember/-internals/deprecations/index.js +9 -0
  3. package/dist/dev/packages/@ember/-internals/glimmer/index.js +7 -7
  4. package/dist/dev/packages/@ember/-internals/routing/index.js +2 -2
  5. package/dist/dev/packages/@ember/-internals/runtime/index.js +1 -1
  6. package/dist/dev/packages/@ember/-internals/runtime/lib/ext/rsvp.js +1 -1
  7. package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -0
  8. package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +3 -0
  9. package/dist/dev/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -0
  10. package/dist/dev/packages/@ember/application/index.js +3 -3
  11. package/dist/dev/packages/@ember/application/instance.js +9 -9
  12. package/dist/dev/packages/@ember/component/helper.js +2 -2
  13. package/dist/dev/packages/@ember/component/index.js +3 -3
  14. package/dist/dev/packages/@ember/engine/index.js +3 -3
  15. package/dist/dev/packages/@ember/engine/instance.js +1 -1
  16. package/dist/dev/packages/@ember/helper/index.js +1132 -79
  17. package/dist/dev/packages/@ember/modifier/on.js +1 -1
  18. package/dist/dev/packages/@ember/object/compat.js +0 -32
  19. package/dist/dev/packages/@ember/renderer/index.js +1 -1
  20. package/dist/dev/packages/@ember/routing/-internals.js +2 -2
  21. package/dist/dev/packages/@ember/routing/index.js +11 -28
  22. package/dist/dev/packages/@ember/routing/lib/utils.js +2 -2
  23. package/dist/dev/packages/@ember/routing/route.js +2 -2
  24. package/dist/dev/packages/@ember/routing/router-service.js +9 -9
  25. package/dist/dev/packages/@ember/routing/router.js +2 -2
  26. package/dist/dev/packages/@ember/template-compiler/lib/compile-options.js +3 -3
  27. package/dist/dev/packages/@ember/template-compiler/lib/template.js +2 -2
  28. package/dist/dev/packages/@ember/template-factory/index.js +1 -1
  29. package/dist/dev/packages/@glimmer/opcode-compiler/index.js +2 -2
  30. package/dist/dev/packages/@glimmer/program/index.js +3 -3
  31. package/dist/dev/packages/@glimmer/runtime/index.js +7 -7
  32. package/dist/dev/packages/@glimmer/wire-format/index.js +2 -5
  33. package/dist/dev/packages/ember/version.js +1 -1
  34. package/dist/dev/packages/ember-template-compiler/index.js +2 -2
  35. package/dist/dev/packages/router_js/index.js +2 -2
  36. package/dist/dev/packages/rsvp/index.js +1 -2281
  37. package/dist/dev/packages/shared-chunks/{arguments-CDkbOqTS.js → arguments-DniR8eF2.js} +5 -18
  38. package/dist/dev/packages/shared-chunks/{compiler-QUSl_urU.js → compiler-BHFFl-fv.js} +1 -1
  39. package/dist/dev/packages/shared-chunks/{curly-BbL6STF2.js → curly-BCD_vyHq.js} +1 -1
  40. package/dist/dev/packages/shared-chunks/{element-BYLB-q7a.js → element-Cgoi4ldD.js} +0 -24
  41. package/dist/dev/packages/shared-chunks/get-zsePWrJL.js +40 -0
  42. package/dist/dev/packages/shared-chunks/hash-BFu91gtE.js +57 -0
  43. package/dist/dev/packages/shared-chunks/{index-DaFzpTIE.js → index-BYUSIu_W.js} +3 -3
  44. package/dist/dev/packages/shared-chunks/{index-Czn34wUZ.js → index-Bv9SQpEx.js} +218 -78
  45. package/dist/dev/packages/shared-chunks/{invoke-d9sqa50M.js → invoke-CgF42joE.js} +1 -1
  46. package/dist/dev/packages/shared-chunks/{not-DYh6AY9Z.js → not-0cVb-rLf.js} +1 -1
  47. package/dist/dev/packages/shared-chunks/{on-DlF0Wy7P.js → on-CVIjn2C-.js} +22 -11
  48. package/dist/dev/packages/shared-chunks/{opcodes-CplRyHl_.js → opcodes-DDajoGhq.js} +0 -4
  49. package/dist/dev/packages/shared-chunks/{outlet-B4qORyui.js → outlet-BO5-QFmm.js} +3 -3
  50. package/dist/dev/packages/shared-chunks/{program-context-Dq8xN2HI.js → program-context-BBB1Ga5h.js} +2 -2
  51. package/dist/dev/packages/shared-chunks/{render-CtH73XOv.js → render-D_Rawf-r.js} +2 -2
  52. package/dist/{prod/packages/shared-chunks/rsvp.es-DR7yS7qg.js → dev/packages/shared-chunks/rsvp-aLN_pQtn.js} +152 -148
  53. package/dist/dev/packages/shared-chunks/{setup-registry-h519ZsHS.js → setup-registry-Ci8Af2Bz.js} +35 -13
  54. package/dist/{prod/packages/shared-chunks/syscall-ops-CN7STuUn.js → dev/packages/shared-chunks/syscall-ops-CkPT1Kfx.js} +1 -2
  55. package/dist/dev/packages/shared-chunks/{textarea-DEvw4ezm.js → textarea-DvS6Xmdh.js} +3 -23
  56. package/dist/dev/packages/shared-chunks/{unique-id-DQOhouG1.js → unique-id-Csxuh1I7.js} +0 -4
  57. package/dist/dev/packages/shared-chunks/{unrecognized-url-error-B8loxkay.js → unrecognized-url-error-cXUp-SK3.js} +1 -1
  58. package/dist/prod/packages/@ember/-internals/deprecations/index.js +9 -0
  59. package/dist/prod/packages/@ember/-internals/glimmer/index.js +7 -7
  60. package/dist/prod/packages/@ember/-internals/routing/index.js +2 -2
  61. package/dist/prod/packages/@ember/-internals/runtime/index.js +1 -1
  62. package/dist/prod/packages/@ember/-internals/runtime/lib/ext/rsvp.js +1 -1
  63. package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -0
  64. package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +3 -0
  65. package/dist/prod/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -0
  66. package/dist/prod/packages/@ember/application/index.js +3 -3
  67. package/dist/prod/packages/@ember/application/instance.js +9 -9
  68. package/dist/prod/packages/@ember/component/helper.js +2 -2
  69. package/dist/prod/packages/@ember/component/index.js +3 -3
  70. package/dist/prod/packages/@ember/engine/index.js +3 -3
  71. package/dist/prod/packages/@ember/engine/instance.js +1 -1
  72. package/dist/prod/packages/@ember/helper/index.js +1132 -79
  73. package/dist/prod/packages/@ember/modifier/on.js +1 -1
  74. package/dist/prod/packages/@ember/object/compat.js +0 -32
  75. package/dist/prod/packages/@ember/renderer/index.js +1 -1
  76. package/dist/prod/packages/@ember/routing/index.js +10 -27
  77. package/dist/prod/packages/@ember/routing/lib/utils.js +2 -2
  78. package/dist/prod/packages/@ember/routing/route.js +2 -2
  79. package/dist/prod/packages/@ember/routing/router-service.js +9 -9
  80. package/dist/prod/packages/@ember/routing/router.js +2 -2
  81. package/dist/prod/packages/@ember/template-compiler/lib/compile-options.js +3 -3
  82. package/dist/prod/packages/@ember/template-compiler/lib/template.js +2 -2
  83. package/dist/prod/packages/@ember/template-factory/index.js +1 -1
  84. package/dist/prod/packages/@glimmer/opcode-compiler/index.js +2 -2
  85. package/dist/prod/packages/@glimmer/program/index.js +3 -3
  86. package/dist/prod/packages/@glimmer/runtime/index.js +7 -7
  87. package/dist/prod/packages/@glimmer/wire-format/index.js +2 -5
  88. package/dist/prod/packages/ember/version.js +1 -1
  89. package/dist/prod/packages/ember-template-compiler/index.js +2 -2
  90. package/dist/prod/packages/router_js/index.js +2 -2
  91. package/dist/prod/packages/rsvp/index.js +1 -2281
  92. package/dist/prod/packages/shared-chunks/{arguments-BzAkZVBa.js → arguments-CCYATlEH.js} +1 -18
  93. package/dist/prod/packages/shared-chunks/{compiler-lBSssiWp.js → compiler-Wt5SWcrF.js} +1 -1
  94. package/dist/prod/packages/shared-chunks/{curly-CU2jYOtm.js → curly-CdvJuTyW.js} +1 -1
  95. package/dist/prod/packages/shared-chunks/{element-DgHdPZ8u.js → element-BmBjPjkQ.js} +0 -24
  96. package/dist/prod/packages/shared-chunks/get-CEjFJzGs.js +40 -0
  97. package/dist/prod/packages/shared-chunks/hash-BitfXhCx.js +57 -0
  98. package/dist/prod/packages/shared-chunks/{index-XmtQRWbX.js → index-D8cl-pfl.js} +218 -78
  99. package/dist/prod/packages/shared-chunks/{index-Bf53M8eS.js → index-kwuZeaNz.js} +3 -3
  100. package/dist/prod/packages/shared-chunks/{invoke-DhQ5QRp2.js → invoke-4JGJYH7Z.js} +1 -1
  101. package/dist/prod/packages/shared-chunks/{not-BOIVROuv.js → not-Dn5s9qVZ.js} +1 -1
  102. package/dist/prod/packages/shared-chunks/{on-BZHAxzdq.js → on-ov4KAucw.js} +22 -11
  103. package/dist/prod/packages/shared-chunks/{opcodes-CplRyHl_.js → opcodes-DDajoGhq.js} +0 -4
  104. package/dist/prod/packages/shared-chunks/{outlet-CsNMfeOj.js → outlet-BWnaVOrA.js} +3 -3
  105. package/dist/prod/packages/shared-chunks/{program-context-COSioH46.js → program-context-WVlzpPdi.js} +2 -2
  106. package/dist/prod/packages/shared-chunks/{render-Bf7GviCY.js → render-BAVl5E6X.js} +2 -2
  107. package/dist/{dev/packages/shared-chunks/rsvp.es-DR7yS7qg.js → prod/packages/shared-chunks/rsvp-aLN_pQtn.js} +152 -148
  108. package/dist/prod/packages/shared-chunks/{setup-registry-DFSQHIUs.js → setup-registry-DeyoFe6Q.js} +35 -13
  109. package/dist/{dev/packages/shared-chunks/syscall-ops-CN7STuUn.js → prod/packages/shared-chunks/syscall-ops-CkPT1Kfx.js} +1 -2
  110. package/dist/prod/packages/shared-chunks/{textarea-DMmdvgk2.js → textarea-B-sssXGa.js} +3 -23
  111. package/dist/prod/packages/shared-chunks/{unique-id-o2pS74go.js → unique-id-BJb1p8EG.js} +0 -4
  112. package/dist/prod/packages/shared-chunks/{unrecognized-url-error-jjQ-FqKB.js → unrecognized-url-error-xC654tCo.js} +1 -1
  113. package/docs/data.json +1237 -1395
  114. package/package.json +52 -47
  115. package/types/stable/@ember/-internals/deprecations/index.d.ts +6 -0
  116. package/types/stable/@ember/-internals/glimmer/index.d.ts +7 -380
  117. package/types/stable/@ember/-internals/glimmer/lib/component.d.ts +1 -1
  118. package/types/stable/@ember/-internals/glimmer/lib/helper.d.ts +2 -2
  119. package/types/stable/@ember/-internals/glimmer/lib/helpers/each-in.d.ts +196 -63
  120. package/types/stable/@ember/-internals/glimmer/lib/helpers/element.d.ts +0 -24
  121. package/types/stable/@ember/-internals/glimmer/lib/helpers/mut.d.ts +3 -2
  122. package/types/stable/@ember/-internals/glimmer/lib/helpers/readonly.d.ts +3 -1
  123. package/types/stable/@ember/-internals/glimmer/lib/helpers/unbound.d.ts +6 -2
  124. package/types/stable/@ember/-internals/glimmer/lib/helpers/unique-id.d.ts +0 -3
  125. package/types/stable/@ember/-internals/glimmer/lib/syntax/mount.d.ts +4 -2
  126. package/types/stable/@ember/-internals/glimmer/lib/syntax/outlet.d.ts +7 -2
  127. package/types/stable/@ember/helper/index.d.ts +1113 -73
  128. package/types/stable/@ember/object/compat.d.ts +0 -32
  129. package/types/stable/@ember/object/core.d.ts +1 -1
  130. package/types/stable/@ember/routing/router-service.d.ts +9 -9
  131. package/types/stable/@glimmer/interfaces/lib/compile/wire-format/api.d.ts +1 -9
  132. package/types/stable/@glimmer/interfaces/lib/compile/wire-format/opcodes.d.ts +0 -4
  133. package/types/stable/@glimmer/interfaces/lib/vm-opcodes.d.ts +0 -4
  134. package/types/stable/@glimmer/opcode-compiler/lib/opcode-builder/helpers/conditional.d.ts +1 -1
  135. package/types/stable/@glimmer/opcode-compiler/lib/syntax/statements.d.ts +1 -1
  136. package/types/stable/@glimmer/runtime/lib/helpers/array.d.ts +0 -33
  137. package/types/stable/@glimmer/runtime/lib/helpers/concat.d.ts +0 -25
  138. package/types/stable/@glimmer/runtime/lib/helpers/fn.d.ts +0 -70
  139. package/types/stable/@glimmer/runtime/lib/helpers/get.d.ts +0 -69
  140. package/types/stable/@glimmer/runtime/lib/helpers/hash.d.ts +0 -36
  141. package/types/stable/index.d.ts +0 -14
  142. package/dist/dev/packages/shared-chunks/get-6I3sjd-I.js +0 -135
  143. package/dist/dev/packages/shared-chunks/hash-6NDs_5_f.js +0 -198
  144. package/dist/prod/packages/shared-chunks/get-Dago5uGl.js +0 -135
  145. package/dist/prod/packages/shared-chunks/hash-gEXIsSO4.js +0 -198
  146. package/types/stable/@ember/-internals/glimmer/lib/helpers/array.d.ts +0 -43
  147. package/types/stable/@ember/-internals/glimmer/lib/helpers/component.d.ts +0 -93
  148. package/types/stable/@ember/-internals/glimmer/lib/helpers/concat.d.ts +0 -32
  149. package/types/stable/@ember/-internals/glimmer/lib/helpers/fn.d.ts +0 -77
  150. package/types/stable/@ember/-internals/glimmer/lib/helpers/get.d.ts +0 -94
  151. package/types/stable/@ember/-internals/glimmer/lib/helpers/hash.d.ts +0 -46
  152. package/types/stable/@ember/-internals/glimmer/lib/helpers/helper.d.ts +0 -43
  153. package/types/stable/@ember/-internals/glimmer/lib/helpers/if-unless.d.ts +0 -228
  154. package/types/stable/@ember/-internals/glimmer/lib/helpers/log.d.ts +0 -19
  155. package/types/stable/@ember/-internals/glimmer/lib/helpers/modifier.d.ts +0 -42
  156. package/types/stable/@ember/-internals/glimmer/lib/helpers/page-title.d.ts +0 -24
  157. package/types/stable/@ember/-internals/glimmer/lib/modifiers/on.d.ts +0 -95
  158. package/types/stable/@ember/-internals/glimmer/lib/syntax/in-element.d.ts +0 -49
  159. package/types/stable/@ember/-internals/glimmer/lib/syntax/let.d.ts +0 -43
@@ -6,45 +6,90 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
6
6
  The default behavior of `{{#each}}` is to yield its inner block once for every
7
7
  item in an array passing the item as the first block parameter.
8
8
 
9
- Assuming the `@developers` argument contains this array:
9
+ ```gjs {data-filename="app/components/developer-list.gjs"}
10
+ import Component from '@glimmer/component';
10
11
 
11
- ```javascript
12
- [{ name: 'Yehuda' },{ name: 'Tom' }, { name: 'Paul' }];
13
- ```
12
+ export default class DeveloperList extends Component {
13
+ developers = [
14
+ { name: 'Yehuda' },
15
+ { name: 'Tom' },
16
+ { name: 'Paul' },
17
+ ];
14
18
 
15
- ```handlebars
16
- <ul>
17
- {{#each @developers as |person|}}
18
- <li>Hello, {{person.name}}!</li>
19
- {{/each}}
20
- </ul>
19
+ <template>
20
+ <ul>
21
+ {{#each this.developers as |person|}}
22
+ <li>Hello, {{person.name}}!</li>
23
+ {{/each}}
24
+ </ul>
25
+ </template>
26
+ }
21
27
  ```
22
28
 
23
- The same rules apply to arrays of primitives.
29
+ The same rules apply to arrays of primitives:
30
+
31
+ ```gjs {data-filename="app/components/developer-names.gjs"}
32
+ import Component from '@glimmer/component';
33
+
34
+ export default class DeveloperNames extends Component {
35
+ developerNames = ['Yehuda', 'Tom', 'Paul'];
24
36
 
25
- ```javascript
26
- ['Yehuda', 'Tom', 'Paul']
37
+ <template>
38
+ <ul>
39
+ {{#each this.developerNames as |name|}}
40
+ <li>Hello, {{name}}!</li>
41
+ {{/each}}
42
+ </ul>
43
+ </template>
44
+ }
27
45
  ```
28
46
 
29
- ```handlebars
30
- <ul>
31
- {{#each @developerNames as |name|}}
32
- <li>Hello, {{name}}!</li>
33
- {{/each}}
34
- </ul>
47
+ `{{#each}}` also supports native JavaScript [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)
48
+ values and other iterables:
49
+
50
+ ```gjs {data-filename="app/components/developer-set.gjs"}
51
+ import Component from '@glimmer/component';
52
+
53
+ export default class DeveloperSet extends Component {
54
+ developers = new Set([
55
+ { name: 'Yehuda' },
56
+ { name: 'Tom' },
57
+ { name: 'Paul' },
58
+ ]);
59
+
60
+ <template>
61
+ <ul>
62
+ {{#each this.developers as |person|}}
63
+ <li>Hello, {{person.name}}!</li>
64
+ {{/each}}
65
+ </ul>
66
+ </template>
67
+ }
35
68
  ```
36
69
 
37
- During iteration, the index of each item in the array is provided as a second block
38
- parameter.
70
+ During iteration, the index of each item in the array is provided as a second
71
+ block parameter:
39
72
 
40
- ```handlebars
41
- <ul>
42
- {{#each @developers as |person index|}}
43
- <li>Hello, {{person.name}}! You're number {{index}} in line</li>
44
- {{/each}}
45
- </ul>
73
+ ```gjs {data-filename="app/components/developer-list-with-index.gjs"}
74
+ import Component from '@glimmer/component';
75
+
76
+ export default class DeveloperListWithIndex extends Component {
77
+ developers = [
78
+ { name: 'Yehuda' },
79
+ { name: 'Tom' },
80
+ { name: 'Paul' },
81
+ ];
82
+
83
+ <template>
84
+ <ul>
85
+ {{#each this.developers as |person index|}}
86
+ <li>Hello, {{person.name}}! You're number {{index}} in line</li>
87
+ {{/each}}
88
+ </ul>
89
+ </template>
90
+ }
46
91
  ```
47
-
92
+
48
93
  `#each` is a keyword and does not need to be imported.
49
94
 
50
95
  ### Specifying Keys
@@ -61,71 +106,90 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
61
106
  needed. However, in some rare cases, the objects' identities may change even
62
107
  though they represent the same underlying data.
63
108
 
64
- For example:
109
+ For example, mapping over `people` produces a new array of new objects on each
110
+ render. Use `key` so Ember can match items across those renders:
65
111
 
66
- ```javascript
67
- people.map(person => {
68
- return { ...person, type: 'developer' };
69
- });
70
- ```
112
+ ```gjs {data-filename="app/components/mapped-developers.gjs"}
113
+ import Component from '@glimmer/component';
71
114
 
72
- In this case, each time the `people` array is `map`-ed over, it will produce
73
- an new array with completely different objects between renders. In these cases,
74
- you can help Ember determine how these objects related to each other with the
75
- `key` option:
115
+ export default class MappedDevelopers extends Component {
116
+ people = [
117
+ { name: 'Yehuda' },
118
+ { name: 'Tom' },
119
+ { name: 'Paul' },
120
+ ];
76
121
 
77
- ```handlebars
78
- <ul>
79
- {{#each @developers key="name" as |person|}}
80
- <li>Hello, {{person.name}}!</li>
81
- {{/each}}
82
- </ul>
122
+ get developers() {
123
+ return this.people.map((person) => {
124
+ return { ...person, type: 'developer' };
125
+ });
126
+ }
127
+
128
+ <template>
129
+ <ul>
130
+ {{#each this.developers key="name" as |person|}}
131
+ <li>Hello, {{person.name}}!</li>
132
+ {{/each}}
133
+ </ul>
134
+ </template>
135
+ }
83
136
  ```
84
137
 
85
138
  By doing so, Ember will use the value of the property specified (`person.name`
86
139
  in the example) to find a "match" from the previous render. That is, if Ember
87
- has previously seen an object from the `@developers` array with a matching
140
+ has previously seen an object from the `developers` array with a matching
88
141
  name, its DOM elements will be re-used.
89
142
 
90
143
  There are two special values for `key`:
91
144
 
145
+ * `@identity` - The item in the array itself. This is the default.
92
146
  * `@index` - The index of the item in the array.
93
- * `@identity` - The item in the array itself.
94
147
 
95
148
  ### {{else}} condition
96
149
 
97
150
  `{{#each}}` can have a matching `{{else}}`. The contents of this block will render
98
151
  if the collection is empty.
99
152
 
100
- ```handlebars
101
- <ul>
102
- {{#each @developers as |person|}}
103
- <li>{{person.name}} is available!</li>
104
- {{else}}
105
- <li>Sorry, nobody is available for this task.</li>
106
- {{/each}}
107
- </ul>
153
+ ```gjs {data-filename="app/components/available-developers.gjs"}
154
+ import Component from '@glimmer/component';
155
+
156
+ export default class AvailableDevelopers extends Component {
157
+ developers = [];
158
+
159
+ <template>
160
+ <ul>
161
+ {{#each this.developers as |person|}}
162
+ <li>{{person.name}} is available!</li>
163
+ {{else}}
164
+ <li>Sorry, nobody is available for this task.</li>
165
+ {{/each}}
166
+ </ul>
167
+ </template>
168
+ }
108
169
  ```
109
170
 
110
171
  @method each
111
- @for Ember.Templates.helpers
172
+ @for Keywords
173
+ @static
174
+ @noimport
112
175
  @public
113
176
  */
114
177
  /**
115
- The `{{#each-in}}` keyword loops over properties on an object.
178
+ The `{{#each-in}}` keyword loops over properties on an object, or entries in a
179
+ native JavaScript [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map).
116
180
 
117
181
  For example, given this component definition:
118
182
 
119
- ```app/components/developer-details.gjs
183
+ ```gjs {data-filename="app/components/developer-details.gjs"}
120
184
  import Component from '@glimmer/component';
121
185
  import { tracked } from '@glimmer/tracking';
122
186
 
123
- export default class extends Component {
187
+ export default class DeveloperDetails extends Component {
124
188
  @tracked developer = {
125
- "name": "Shelly Sails",
126
- "age": 42
189
+ name: 'Shelly Sails',
190
+ age: 42,
127
191
  };
128
-
192
+
129
193
  <template>
130
194
  <ul>
131
195
  {{#each-in this.developer as |key value|}}
@@ -145,11 +209,80 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
145
209
  <li>age: 42</li>
146
210
  </ul>
147
211
  ```
148
-
212
+
213
+ The same pattern works with a `Map`:
214
+
215
+ ```gjs {data-filename="app/components/developer-map.gjs"}
216
+ import Component from '@glimmer/component';
217
+
218
+ export default class DeveloperMap extends Component {
219
+ map = new Map([
220
+ ['name', 'Shelly Sails'],
221
+ ['age', 42],
222
+ ]);
223
+
224
+ <template>
225
+ <ul>
226
+ {{#each-in this.map as |key value|}}
227
+ <li>{{key}}: {{value}}</li>
228
+ {{/each-in}}
229
+ </ul>
230
+ </template>
231
+ }
232
+ ```
233
+
234
+ When a `Map` uses object keys, you can pass `key="@identity"` to explicitly
235
+ track entries across re-renders using the JavaScript identity of each key:
236
+
237
+ ```gjs {data-filename="app/components/object-keyed-map.gjs"}
238
+ import Component from '@glimmer/component';
239
+
240
+ export default class ObjectKeyedMap extends Component {
241
+ map = new Map([
242
+ [{ name: 'one' }, 'foo'],
243
+ [{ name: 'two' }, 'bar'],
244
+ ]);
245
+
246
+ <template>
247
+ <ul>
248
+ {{#each-in this.map key="@identity" as |key value|}}
249
+ <li>{{key.name}}: {{value}}</li>
250
+ {{/each-in}}
251
+ </ul>
252
+ </template>
253
+ }
254
+ ```
255
+
149
256
  `#each-in` is a keyword and does not need to be imported.
150
257
 
258
+ ### Specifying Keys
259
+
260
+ Like `{{#each}}`, `{{#each-in}}` accepts a `key` option to decide which DOM
261
+ elements can be reused between renders. Since `{{#each-in}}` yields two block
262
+ params, the special values pick which one is used:
263
+
264
+ * `@identity` - The second block param: the property's value. This is the
265
+ default. Changing a value replaces that entry's DOM instead of updating it
266
+ in place.
267
+ * `@key` - The first block param: the property name, or for a `Map`, its key.
268
+
269
+ Any other string is a path, looked up on the value: `key="id"` keys each entry
270
+ by its `value.id`.
271
+
272
+ For example, `@key` keeps each entry's DOM as its score changes, so anything
273
+ stateful inside it — focus, a running transition, a component instance — survives
274
+ the update:
275
+
276
+ ```handlebars
277
+ {{#each-in this.scores key="@key" as |player score|}}
278
+ <PlayerScore @name={{player}} @score={{score}} />
279
+ {{/each-in}}
280
+ ```
281
+
151
282
  @method each-in
152
- @for Ember.Templates.helpers
283
+ @static
284
+ @noimport
285
+ @for Keywords
153
286
  @public
154
287
  @since 2.1.0
155
288
  */
@@ -2,30 +2,6 @@ declare module '@ember/-internals/glimmer/lib/helpers/element' {
2
2
  /**
3
3
  @module @ember/helper
4
4
  */
5
- /**
6
- The `element` helper lets you dynamically set the tag name of an element.
7
-
8
- ```handlebars
9
- {{#let (element @tagName) as |Tag|}}
10
- <Tag class="my-element">Hello</Tag>
11
- {{/let}}
12
- ```
13
-
14
- When `@tagName` is `"h1"`, this renders `<h1 class="my-element">Hello</h1>`.
15
-
16
- When `@tagName` is an empty string `""`, the block content is rendered without
17
- a wrapping element.
18
-
19
- Passing `null`, `undefined`, or non-string values will throw an assertion error.
20
-
21
- Changing the tag name will tear down and recreate the element and its contents.
22
-
23
- The `element` helper is built-in and does not need to be imported.
24
-
25
- @method element
26
- @for Ember.Templates.helpers
27
- @public
28
- */
29
5
  const _default: object;
30
6
  export default _default;
31
7
  }
@@ -16,7 +16,7 @@ declare module '@ember/-internals/glimmer/lib/helpers/mut' {
16
16
 
17
17
  The child `Component` would invoke the function with the new click count:
18
18
 
19
- ```app/components/my-child.gjs
19
+ ```gjs {data-filename="app/components/my-child.gjs"}
20
20
  import Component from '@glimmer/component';
21
21
  import { action } from '@ember/object';
22
22
 
@@ -38,7 +38,8 @@ declare module '@ember/-internals/glimmer/lib/helpers/mut' {
38
38
 
39
39
  @method mut
40
40
  @param {Object} [attr] the "two-way" attribute that can be modified.
41
- @for Ember.Templates.helpers
41
+ @static
42
+ @for Keywords
42
43
  @public
43
44
  */
44
45
  const _default: object;
@@ -107,7 +107,9 @@ declare module '@ember/-internals/glimmer/lib/helpers/readonly' {
107
107
 
108
108
  @method readonly
109
109
  @param {Object} [attr] the read-only attribute.
110
- @for Ember.Templates.helpers
110
+ @for Keywords
111
+ @noimport
112
+ @static
111
113
  @private
112
114
  */
113
115
  const _default: object;
@@ -1,6 +1,6 @@
1
1
  declare module '@ember/-internals/glimmer/lib/helpers/unbound' {
2
2
  /**
3
- @module ember
3
+ @module @ember/helper
4
4
  */
5
5
  /**
6
6
  The `{{unbound}}` helper disconnects the one-way binding of a property,
@@ -24,9 +24,13 @@ declare module '@ember/-internals/glimmer/lib/helpers/unbound' {
24
24
 
25
25
  The `unbound` helper only accepts a single argument, and it return an
26
26
  unbound value.
27
+
28
+ `unbound` is a template keyword and does not need to be imported.
27
29
 
28
30
  @method unbound
29
- @for Ember.Templates.helpers
31
+ @static
32
+ @noimport
33
+ @for Keywords
30
34
  @public
31
35
  */
32
36
  const _default: object;
@@ -1,7 +1,4 @@
1
1
  declare module '@ember/-internals/glimmer/lib/helpers/unique-id' {
2
- /**
3
- @module ember
4
- */
5
2
  const _default: object;
6
3
  export default _default;
7
4
  export function uniqueId(): string;
@@ -6,7 +6,7 @@ declare module '@ember/-internals/glimmer/lib/syntax/mount' {
6
6
 
7
7
  For example, the following template mounts the `ember-chat` engine:
8
8
 
9
- ```app/templates/application.gjs
9
+ ```gjs {data-filename="app/templates/application.gjs"}
10
10
  {{mount "ember-chat"}}
11
11
  ```
12
12
 
@@ -40,7 +40,9 @@ declare module '@ember/-internals/glimmer/lib/syntax/mount' {
40
40
  @param {String} name Name of the engine to mount.
41
41
  @param {Object} [model] Object that will be set as
42
42
  the model of the engine.
43
- @for Ember.Templates.helpers
43
+ @for Keywords
44
+ @static
45
+ @noimport
44
46
  @public
45
47
  */
46
48
  export const mountHelper: object;
@@ -1,10 +1,13 @@
1
1
  declare module '@ember/-internals/glimmer/lib/syntax/outlet' {
2
+ /**
3
+ @module @ember/helper
4
+ */
2
5
  /**
3
6
  The `{{outlet}}` helper lets you specify where a child route will render in
4
7
  your template. An important use of the `{{outlet}}` helper is in your
5
8
  application's `application.gjs` file:
6
9
 
7
- ```app/templates/application.gjs
10
+ ```gjs {data-filename="app/templates/application.gjs"}
8
11
  import MyHeader from '../components/my-header';
9
12
  import MyFooter from '../components/my-footer';
10
13
 
@@ -27,7 +30,9 @@ declare module '@ember/-internals/glimmer/lib/syntax/outlet' {
27
30
  `outlet` is built-in and does not need to be imported.
28
31
 
29
32
  @method outlet
30
- @for Ember.Templates.helpers
33
+ @for Keywords
34
+ @static
35
+ @noimport
31
36
  @public
32
37
  */
33
38
  export const outletHelper: object;