@glint/ember-tsc 1.5.0 → 1.6.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 (136) hide show
  1. package/package.json +14 -3
  2. package/src/environment-ember-template-imports/-private/environment/index.ts +48 -20
  3. package/types/-private/dsl/globals.d.ts +316 -1
  4. package/types/-private/intrinsics/array-hash.d.ts +17 -0
  5. package/types/-private/intrinsics/comparison.d.ts +36 -0
  6. package/types/-private/intrinsics/element.d.ts +14 -0
  7. package/types/-private/intrinsics/truth-convert.d.ts +86 -0
  8. package/types/-private/intrinsics/truth-helpers.d.ts +32 -0
  9. package/lib/cli/run-volar-tsc.d.ts +0 -2
  10. package/lib/cli/run-volar-tsc.d.ts.map +0 -1
  11. package/lib/cli/run-volar-tsc.js +0 -32
  12. package/lib/cli/run-volar-tsc.js.map +0 -1
  13. package/lib/config/config.d.ts +0 -15
  14. package/lib/config/config.d.ts.map +0 -1
  15. package/lib/config/config.js +0 -21
  16. package/lib/config/config.js.map +0 -1
  17. package/lib/config/environment.d.ts +0 -26
  18. package/lib/config/environment.d.ts.map +0 -1
  19. package/lib/config/environment.js +0 -96
  20. package/lib/config/environment.js.map +0 -1
  21. package/lib/config/index.d.ts +0 -24
  22. package/lib/config/index.d.ts.map +0 -1
  23. package/lib/config/index.js +0 -37
  24. package/lib/config/index.js.map +0 -1
  25. package/lib/config/loader.d.ts +0 -28
  26. package/lib/config/loader.d.ts.map +0 -1
  27. package/lib/config/loader.js +0 -121
  28. package/lib/config/loader.js.map +0 -1
  29. package/lib/config/types.cjs +0 -3
  30. package/lib/config/types.cjs.map +0 -1
  31. package/lib/config/types.d.cts +0 -60
  32. package/lib/config/types.d.cts.map +0 -1
  33. package/lib/environment-ember-template-imports/-private/environment/common.d.ts +0 -13
  34. package/lib/environment-ember-template-imports/-private/environment/common.d.ts.map +0 -1
  35. package/lib/environment-ember-template-imports/-private/environment/common.js +0 -2
  36. package/lib/environment-ember-template-imports/-private/environment/common.js.map +0 -1
  37. package/lib/environment-ember-template-imports/-private/environment/index.d.ts +0 -3
  38. package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +0 -1
  39. package/lib/environment-ember-template-imports/-private/environment/index.js +0 -76
  40. package/lib/environment-ember-template-imports/-private/environment/index.js.map +0 -1
  41. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts +0 -4
  42. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +0 -1
  43. package/lib/environment-ember-template-imports/-private/environment/preprocess.js +0 -42
  44. package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +0 -1
  45. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts +0 -4
  46. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +0 -1
  47. package/lib/environment-ember-template-imports/-private/environment/transform.js +0 -134
  48. package/lib/environment-ember-template-imports/-private/environment/transform.js.map +0 -1
  49. package/lib/index.d.ts +0 -7
  50. package/lib/index.d.ts.map +0 -1
  51. package/lib/index.js +0 -6
  52. package/lib/index.js.map +0 -1
  53. package/lib/plugins/g-compiler-errors.d.ts +0 -12
  54. package/lib/plugins/g-compiler-errors.d.ts.map +0 -1
  55. package/lib/plugins/g-compiler-errors.js +0 -58
  56. package/lib/plugins/g-compiler-errors.js.map +0 -1
  57. package/lib/plugins/g-component-hover.d.ts +0 -24
  58. package/lib/plugins/g-component-hover.d.ts.map +0 -1
  59. package/lib/plugins/g-component-hover.js +0 -135
  60. package/lib/plugins/g-component-hover.js.map +0 -1
  61. package/lib/plugins/g-template-tag-symbols.d.ts +0 -11
  62. package/lib/plugins/g-template-tag-symbols.d.ts.map +0 -1
  63. package/lib/plugins/g-template-tag-symbols.js +0 -48
  64. package/lib/plugins/g-template-tag-symbols.js.map +0 -1
  65. package/lib/plugins/utils.d.ts +0 -25
  66. package/lib/plugins/utils.d.ts.map +0 -1
  67. package/lib/plugins/utils.js +0 -63
  68. package/lib/plugins/utils.js.map +0 -1
  69. package/lib/transform/diagnostics/augmentation.d.ts +0 -4
  70. package/lib/transform/diagnostics/augmentation.d.ts.map +0 -1
  71. package/lib/transform/diagnostics/augmentation.js +0 -249
  72. package/lib/transform/diagnostics/augmentation.js.map +0 -1
  73. package/lib/transform/diagnostics/index.d.ts +0 -5
  74. package/lib/transform/diagnostics/index.d.ts.map +0 -1
  75. package/lib/transform/diagnostics/index.js +0 -2
  76. package/lib/transform/diagnostics/index.js.map +0 -1
  77. package/lib/transform/index.d.ts +0 -4
  78. package/lib/transform/index.d.ts.map +0 -1
  79. package/lib/transform/index.js +0 -2
  80. package/lib/transform/index.js.map +0 -1
  81. package/lib/transform/template/code-features.d.ts +0 -30
  82. package/lib/transform/template/code-features.d.ts.map +0 -1
  83. package/lib/transform/template/code-features.js +0 -26
  84. package/lib/transform/template/code-features.js.map +0 -1
  85. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +0 -80
  86. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +0 -1
  87. package/lib/transform/template/glimmer-ast-mapping-tree.js +0 -132
  88. package/lib/transform/template/glimmer-ast-mapping-tree.js.map +0 -1
  89. package/lib/transform/template/inlining/index.d.ts +0 -16
  90. package/lib/transform/template/inlining/index.d.ts.map +0 -1
  91. package/lib/transform/template/inlining/index.js +0 -21
  92. package/lib/transform/template/inlining/index.js.map +0 -1
  93. package/lib/transform/template/inlining/tagged-strings.d.ts +0 -8
  94. package/lib/transform/template/inlining/tagged-strings.d.ts.map +0 -1
  95. package/lib/transform/template/inlining/tagged-strings.js +0 -140
  96. package/lib/transform/template/inlining/tagged-strings.js.map +0 -1
  97. package/lib/transform/template/map-template-contents.d.ts +0 -121
  98. package/lib/transform/template/map-template-contents.d.ts.map +0 -1
  99. package/lib/transform/template/map-template-contents.js +0 -287
  100. package/lib/transform/template/map-template-contents.js.map +0 -1
  101. package/lib/transform/template/rewrite-module.d.ts +0 -22
  102. package/lib/transform/template/rewrite-module.d.ts.map +0 -1
  103. package/lib/transform/template/rewrite-module.js +0 -265
  104. package/lib/transform/template/rewrite-module.js.map +0 -1
  105. package/lib/transform/template/scope-stack.d.ts +0 -13
  106. package/lib/transform/template/scope-stack.d.ts.map +0 -1
  107. package/lib/transform/template/scope-stack.js +0 -28
  108. package/lib/transform/template/scope-stack.js.map +0 -1
  109. package/lib/transform/template/template-to-typescript.d.ts +0 -19
  110. package/lib/transform/template/template-to-typescript.d.ts.map +0 -1
  111. package/lib/transform/template/template-to-typescript.js +0 -1125
  112. package/lib/transform/template/template-to-typescript.js.map +0 -1
  113. package/lib/transform/template/transformed-module.d.ts +0 -111
  114. package/lib/transform/template/transformed-module.d.ts.map +0 -1
  115. package/lib/transform/template/transformed-module.js +0 -287
  116. package/lib/transform/template/transformed-module.js.map +0 -1
  117. package/lib/transform/util.d.ts +0 -7
  118. package/lib/transform/util.d.ts.map +0 -1
  119. package/lib/transform/util.js +0 -15
  120. package/lib/transform/util.js.map +0 -1
  121. package/lib/volar/ember-language-plugin.d.ts +0 -14
  122. package/lib/volar/ember-language-plugin.d.ts.map +0 -1
  123. package/lib/volar/ember-language-plugin.js +0 -91
  124. package/lib/volar/ember-language-plugin.js.map +0 -1
  125. package/lib/volar/gts-virtual-code.d.ts +0 -83
  126. package/lib/volar/gts-virtual-code.d.ts.map +0 -1
  127. package/lib/volar/gts-virtual-code.js +0 -210
  128. package/lib/volar/gts-virtual-code.js.map +0 -1
  129. package/lib/volar/language-server.d.ts +0 -2
  130. package/lib/volar/language-server.d.ts.map +0 -1
  131. package/lib/volar/language-server.js +0 -180
  132. package/lib/volar/language-server.js.map +0 -1
  133. package/lib/volar/script-snapshot.d.ts +0 -17
  134. package/lib/volar/script-snapshot.d.ts.map +0 -1
  135. package/lib/volar/script-snapshot.js +0 -24
  136. package/lib/volar/script-snapshot.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glint/ember-tsc",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "repository": "typed-ember/glint",
5
5
  "description": "A CLI for performing typechecking on Glimmer templates",
6
6
  "license": "MIT",
@@ -24,9 +24,12 @@
24
24
  "./types": "./types/-private/dsl/integration-declarations.d.ts",
25
25
  "./-private/dsl/globals": "./types/-private/dsl/globals.d.ts",
26
26
  "./-private/intrinsics/action": "./types/-private/intrinsics/action.d.ts",
27
+ "./-private/intrinsics/array-hash": "./types/-private/intrinsics/array-hash.d.ts",
28
+ "./-private/intrinsics/comparison": "./types/-private/intrinsics/comparison.d.ts",
27
29
  "./-private/intrinsics/concat": "./types/-private/intrinsics/concat.d.ts",
28
30
  "./-private/intrinsics/each": "./types/-private/intrinsics/each.d.ts",
29
31
  "./-private/intrinsics/each-in": "./types/-private/intrinsics/each-in.d.ts",
32
+ "./-private/intrinsics/element": "./types/-private/intrinsics/element.d.ts",
30
33
  "./-private/intrinsics/fn": "./types/-private/intrinsics/fn.d.ts",
31
34
  "./-private/intrinsics/get": "./types/-private/intrinsics/get.d.ts",
32
35
  "./-private/intrinsics/log": "./types/-private/intrinsics/log.d.ts",
@@ -34,6 +37,8 @@
34
37
  "./-private/intrinsics/mut": "./types/-private/intrinsics/mut.d.ts",
35
38
  "./-private/intrinsics/on": "./types/-private/intrinsics/on.d.ts",
36
39
  "./-private/intrinsics/outlet": "./types/-private/intrinsics/outlet.d.ts",
40
+ "./-private/intrinsics/truth-convert": "./types/-private/intrinsics/truth-convert.d.ts",
41
+ "./-private/intrinsics/truth-helpers": "./types/-private/intrinsics/truth-helpers.d.ts",
37
42
  "./-private/intrinsics/unbound": "./types/-private/intrinsics/unbound.d.ts",
38
43
  "./-private/intrinsics/unique-id": "./types/-private/intrinsics/unique-id.d.ts",
39
44
  "./*": {
@@ -53,8 +58,14 @@
53
58
  "glint-language-server": "bin/glint-language-server.js"
54
59
  },
55
60
  "peerDependencies": {
61
+ "ember-source": ">=7.1.0",
56
62
  "typescript": ">=5.6.0"
57
63
  },
64
+ "peerDependenciesMeta": {
65
+ "ember-source": {
66
+ "optional": true
67
+ }
68
+ },
58
69
  "dependencies": {
59
70
  "@glimmer/syntax": "^0.95.0",
60
71
  "@volar/kit": "~2.4.28",
@@ -86,8 +97,8 @@
86
97
  "execa": "^4.0.1",
87
98
  "strip-ansi": "^6.0.0",
88
99
  "typescript": "^5.9.3",
89
- "@glint/type-test": "2.0.1",
90
- "glint-monorepo-test-utils": "0.0.0"
100
+ "glint-monorepo-test-utils": "0.0.0",
101
+ "@glint/type-test": "2.0.1"
91
102
  },
92
103
  "publishConfig": {
93
104
  "access": "public"
@@ -16,6 +16,52 @@ export default function emberTemplateImportsEnvironment(
16
16
  ? options['additionalGlobals']
17
17
  : [];
18
18
 
19
+ const globalsForEmber = [
20
+ 'action',
21
+ 'component',
22
+ 'debugger',
23
+ 'each',
24
+ 'each-in',
25
+ 'has-block',
26
+ 'has-block-params',
27
+ 'helper',
28
+ 'if',
29
+ 'in-element',
30
+ 'let',
31
+ 'log',
32
+ 'modifier',
33
+ 'mount',
34
+ 'mut',
35
+ 'outlet',
36
+ 'unbound',
37
+ 'unless',
38
+ 'with',
39
+ 'yield',
40
+ ];
41
+
42
+ /*
43
+ Ember 7.1+ built-in keywords (RFCs 389, 470, 560, 561, 562, 997, 998, 999,
44
+ 1000). Their template-side signatures live in `KeywordsForEmber71` in
45
+ `types/-private/dsl/globals.d.ts` and are gated on `ember-source >= 7.1.0`
46
+ via the `HasEmber71BuiltIns` probe.
47
+ */
48
+ const globalsForEmber71 = [
49
+ 'and',
50
+ 'array',
51
+ 'element',
52
+ 'eq',
53
+ 'fn',
54
+ 'gt',
55
+ 'gte',
56
+ 'hash',
57
+ 'lt',
58
+ 'lte',
59
+ 'neq',
60
+ 'not',
61
+ 'on',
62
+ 'or',
63
+ ];
64
+
19
65
  return {
20
66
  tags: {
21
67
  '@glint/ember-tsc/environment-ember-template-imports/-private/tag': {
@@ -41,26 +87,8 @@ export default function emberTemplateImportsEnvironment(
41
87
  },
42
88
  },
43
89
  globals: [
44
- 'action',
45
- 'component',
46
- 'debugger',
47
- 'each',
48
- 'each-in',
49
- 'has-block',
50
- 'has-block-params',
51
- 'helper',
52
- 'if',
53
- 'in-element',
54
- 'let',
55
- 'log',
56
- 'modifier',
57
- 'mount',
58
- 'mut',
59
- 'outlet',
60
- 'unbound',
61
- 'unless',
62
- 'with',
63
- 'yield',
90
+ ...globalsForEmber,
91
+ ...globalsForEmber71,
64
92
  ...Object.keys(additionalGlobalSpecialForms),
65
93
  ...additionalGlobals,
66
94
  ],
@@ -3,19 +3,59 @@ import Globals from '../../globals';
3
3
  import * as VM from '@glint/template/-private/keywords';
4
4
 
5
5
  import { ActionKeyword } from '../intrinsics/action';
6
+ import { ArrayHelper, HashHelper } from '../intrinsics/array-hash';
7
+ import {
8
+ EqHelper,
9
+ GtHelper,
10
+ GteHelper,
11
+ LtHelper,
12
+ LteHelper,
13
+ NeqHelper,
14
+ } from '../intrinsics/comparison';
6
15
  import { EachKeyword } from '../intrinsics/each';
7
16
  import { EachInKeyword } from '../intrinsics/each-in';
17
+ import { ElementHelper } from '../intrinsics/element';
18
+ import { FnHelper } from '../intrinsics/fn';
8
19
  import { LogHelper } from '../intrinsics/log';
9
20
  import { MountKeyword } from '../intrinsics/mount';
10
21
  import { MutKeyword } from '../intrinsics/mut';
22
+ import { OnModifier } from '../intrinsics/on';
11
23
  import { OutletKeyword } from '../intrinsics/outlet';
24
+ import { AndHelper, NotHelper, OrHelper } from '../intrinsics/truth-helpers';
12
25
  import { UnboundKeyword } from '../intrinsics/unbound';
13
26
  import { UniqueIdHelper } from '../intrinsics/unique-id';
14
27
 
28
+ // ---- ember-source 7.1 detection -------------------------------------------
29
+ //
30
+ // The keywords introduced by RFCs 562, 470, 997, 998, 999, 1000, 560, 561 and
31
+ // 389 are only available at runtime when consumers are on ember-source >= 7.1.
32
+ // We probe for the `eq` value re-export added by RFC 561 to decide whether to
33
+ // expose the new keyword types. On older versions the probe collapses to the
34
+ // empty type, so referencing e.g. `{{eq}}` falls back to whatever the user
35
+ // has imported (or surfaces as an "unknown identifier" diagnostic), keeping
36
+ // behaviour identical to today.
37
+ //
38
+ // We probe a value export (`eq`) rather than the matching `EqHelper`
39
+ // interface because `typeof import(...)` only surfaces the module's value
40
+ // exports; type-only exports never appear as keys, so an interface probe
41
+ // would always collapse to `false`.
42
+ //
43
+ // `@ember/helper` is an optional peer dependency at the type level: the
44
+ // `@ts-ignore` ensures Glint still type-checks in environments that haven't
45
+ // installed it.
46
+ //
47
+ // @ts-ignore — `@ember/helper` is an optional peer dependency
48
+ type EmberHelperExports = typeof import('@ember/helper');
49
+
50
+ type HasEmber71BuiltIns = [EmberHelperExports] extends [{ eq: unknown }] ? true : false;
51
+
52
+ /** Resolves to `T` only when ember-source >= 7.1 ships the new keyword set. */
53
+ type Ember71Only<T> = HasEmber71BuiltIns extends true ? T : never;
54
+
15
55
  // The keyword vs global breakdown here is loosely matched with
16
56
  // the listing in http://emberjs.github.io/rfcs/0496-handlebars-strict-mode.html
17
57
 
18
- interface Keywords {
58
+ interface KeywordsForEmber {
19
59
  /**
20
60
  The {{action}} helper provides a way to pass triggers for behavior (usually just a function)
21
61
  between components, and into components from controllers.
@@ -201,4 +241,279 @@ interface Keywords {
201
241
  yield: void;
202
242
  }
203
243
 
244
+ /**
245
+ * Built-in template keywords introduced by ember-source 7.1
246
+ * (RFCs 389, 470, 560, 561, 562, 997, 998, 999, 1000). Each entry is gated by
247
+ * `Ember71Only<T>` so the keyword resolves to `never` (and is therefore
248
+ * effectively absent) when the consumer is on ember-source < 7.1. See the
249
+ * `HasEmber71BuiltIns` probe at the top of this file.
250
+ */
251
+ interface KeywordsForEmber71 {
252
+ /**
253
+ * The `{{and}}` helper evaluates arguments left to right, returning the first
254
+ * falsy value (using Handlebars truthiness) or the right-most value if all
255
+ * are truthy. Requires at least two arguments.
256
+ *
257
+ * ```gjs
258
+ * <template>
259
+ * {{if (and @isAdmin @isLoggedIn) "Welcome, admin!" "Access denied"}}
260
+ * </template>
261
+ * ```
262
+ *
263
+ * In strict-mode (`.gjs`/`.gts`) templates, `and` is available as a keyword
264
+ * and does not need to be imported from `@ember/helper`.
265
+ *
266
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/and
267
+ */
268
+ and: Ember71Only<AndHelper>;
269
+
270
+ /**
271
+ * Using the `{{array}}` helper, you can pass arrays directly from the
272
+ * template as an argument to your components.
273
+ *
274
+ * ```gjs
275
+ * <template>
276
+ * <ul>
277
+ * {{#each (array "Tom Dale" "Yehuda Katz" @anotherPerson) as |person|}}
278
+ * <li>{{person}}</li>
279
+ * {{/each}}
280
+ * </ul>
281
+ * </template>
282
+ * ```
283
+ *
284
+ * In strict-mode (`.gjs`/`.gts`) templates, `array` is available as a
285
+ * keyword and does not need to be imported from `@ember/helper`.
286
+ *
287
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/array
288
+ */
289
+ array: Ember71Only<ArrayHelper>;
290
+
291
+ /**
292
+ * The `{{element}}` helper lets you dynamically set the tag name of an
293
+ * element.
294
+ *
295
+ * ```gjs
296
+ * <template>
297
+ * {{#let (element @tagName) as |Tag|}}
298
+ * <Tag class="my-element">Hello</Tag>
299
+ * {{/let}}
300
+ * </template>
301
+ * ```
302
+ *
303
+ * When `@tagName` is `"h1"`, this renders `<h1 class="my-element">Hello</h1>`.
304
+ * When `@tagName` is an empty string, the block content is rendered without
305
+ * a wrapping element. When `@tagName` is `null` or `undefined`, nothing is
306
+ * rendered.
307
+ *
308
+ * In strict-mode (`.gjs`/`.gts`) templates, `element` is available as a
309
+ * keyword and does not need to be imported from `@ember/helper`.
310
+ *
311
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/element
312
+ */
313
+ element: Ember71Only<ElementHelper>;
314
+
315
+ /**
316
+ * The `{{eq}}` helper returns `true` if its two arguments are strictly equal
317
+ * (`===`). Takes exactly two arguments.
318
+ *
319
+ * ```gjs
320
+ * <template>
321
+ * {{if (eq @status "active") "Active" "Inactive"}}
322
+ * </template>
323
+ * ```
324
+ *
325
+ * In strict-mode (`.gjs`/`.gts`) templates, `eq` is available as a keyword
326
+ * and does not need to be imported from `@ember/helper`.
327
+ *
328
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/eq
329
+ */
330
+ eq: Ember71Only<EqHelper>;
331
+
332
+ /**
333
+ * `{{fn}}` is a helper that receives a function and some arguments, and
334
+ * returns a new function that combines them. This allows you to pass
335
+ * parameters along to functions in your templates:
336
+ *
337
+ * ```gjs
338
+ * function showAlert(message) {
339
+ * alert(`The message is: '${message}'`);
340
+ * }
341
+ *
342
+ * <template>
343
+ * <button type="button" {{on "click" (fn showAlert "Hello!")}}>
344
+ * Click me!
345
+ * </button>
346
+ * </template>
347
+ * ```
348
+ *
349
+ * In strict-mode (`.gjs`/`.gts`) templates, `fn` is available as a keyword
350
+ * and does not need to be imported from `@ember/helper`.
351
+ *
352
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/fn
353
+ */
354
+ fn: Ember71Only<FnHelper>;
355
+
356
+ /**
357
+ * The `{{gt}}` helper returns `true` if the first argument is greater than
358
+ * the second argument.
359
+ *
360
+ * ```gjs
361
+ * <template>
362
+ * {{if (gt @score 100) "High score!" "Keep trying"}}
363
+ * </template>
364
+ * ```
365
+ *
366
+ * In strict-mode (`.gjs`/`.gts`) templates, `gt` is available as a keyword
367
+ * and does not need to be imported from `@ember/helper`.
368
+ *
369
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/gt
370
+ */
371
+ gt: Ember71Only<GtHelper>;
372
+
373
+ /**
374
+ * The `{{gte}}` helper returns `true` if the first argument is greater than
375
+ * or equal to the second argument.
376
+ *
377
+ * ```gjs
378
+ * <template>
379
+ * {{if (gte @age 18) "Adult" "Minor"}}
380
+ * </template>
381
+ * ```
382
+ *
383
+ * In strict-mode (`.gjs`/`.gts`) templates, `gte` is available as a keyword
384
+ * and does not need to be imported from `@ember/helper`.
385
+ *
386
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/gte
387
+ */
388
+ gte: Ember71Only<GteHelper>;
389
+
390
+ /**
391
+ * Using the `{{hash}}` helper, you can pass objects directly from the
392
+ * template as an argument to your components.
393
+ *
394
+ * ```gjs
395
+ * <template>
396
+ * {{#each-in (hash givenName="Jen" familyName="Weber") as |key value|}}
397
+ * <p>{{key}}: {{value}}</p>
398
+ * {{/each-in}}
399
+ * </template>
400
+ * ```
401
+ *
402
+ * In strict-mode (`.gjs`/`.gts`) templates, `hash` is available as a
403
+ * keyword and does not need to be imported from `@ember/helper`.
404
+ *
405
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/hash
406
+ */
407
+ hash: Ember71Only<HashHelper>;
408
+
409
+ /**
410
+ * The `{{lt}}` helper returns `true` if the first argument is less than the
411
+ * second argument.
412
+ *
413
+ * ```gjs
414
+ * <template>
415
+ * {{if (lt @temperature 0) "Freezing" "Above zero"}}
416
+ * </template>
417
+ * ```
418
+ *
419
+ * In strict-mode (`.gjs`/`.gts`) templates, `lt` is available as a keyword
420
+ * and does not need to be imported from `@ember/helper`.
421
+ *
422
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/lt
423
+ */
424
+ lt: Ember71Only<LtHelper>;
425
+
426
+ /**
427
+ * The `{{lte}}` helper returns `true` if the first argument is less than or
428
+ * equal to the second argument.
429
+ *
430
+ * ```gjs
431
+ * <template>
432
+ * {{if (lte @count 0) "Empty" "Has items"}}
433
+ * </template>
434
+ * ```
435
+ *
436
+ * In strict-mode (`.gjs`/`.gts`) templates, `lte` is available as a keyword
437
+ * and does not need to be imported from `@ember/helper`.
438
+ *
439
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/lte
440
+ */
441
+ lte: Ember71Only<LteHelper>;
442
+
443
+ /**
444
+ * The `{{neq}}` helper returns `true` if its two arguments are strictly not
445
+ * equal (`!==`). Takes exactly two arguments.
446
+ *
447
+ * ```gjs
448
+ * <template>
449
+ * {{if (neq @status "active") "Not active" "Active"}}
450
+ * </template>
451
+ * ```
452
+ *
453
+ * In strict-mode (`.gjs`/`.gts`) templates, `neq` is available as a keyword
454
+ * and does not need to be imported from `@ember/helper`.
455
+ *
456
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/neq
457
+ */
458
+ neq: Ember71Only<NeqHelper>;
459
+
460
+ /**
461
+ * The `{{not}}` helper returns the logical negation of its argument using
462
+ * Handlebars truthiness. Takes exactly one argument.
463
+ *
464
+ * ```gjs
465
+ * <template>
466
+ * {{if (not @isDisabled) "Enabled" "Disabled"}}
467
+ * </template>
468
+ * ```
469
+ *
470
+ * In strict-mode (`.gjs`/`.gts`) templates, `not` is available as a keyword
471
+ * and does not need to be imported from `@ember/helper`.
472
+ *
473
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/not
474
+ */
475
+ not: Ember71Only<NotHelper>;
476
+
477
+ /**
478
+ * The `{{on}}` element modifier attaches an event listener to an element.
479
+ *
480
+ * ```gjs
481
+ * <template>
482
+ * <button type="button" {{on "click" this.handleClick}}>
483
+ * Click me!
484
+ * </button>
485
+ * </template>
486
+ * ```
487
+ *
488
+ * It accepts the same options as `addEventListener` via named arguments
489
+ * (`capture`, `once`, `passive`).
490
+ *
491
+ * In strict-mode (`.gjs`/`.gts`) templates, `on` is available as a keyword
492
+ * and does not need to be imported from `@ember/modifier`.
493
+ *
494
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fmodifier/on
495
+ */
496
+ on: Ember71Only<OnModifier>;
497
+
498
+ /**
499
+ * The `{{or}}` helper evaluates arguments left to right, returning the first
500
+ * truthy value (using Handlebars truthiness) or the right-most value if all
501
+ * are falsy. Requires at least two arguments.
502
+ *
503
+ * ```gjs
504
+ * <template>
505
+ * {{if (or @hasAccess @isAdmin) "Welcome!" "No access"}}
506
+ * </template>
507
+ * ```
508
+ *
509
+ * In strict-mode (`.gjs`/`.gts`) templates, `or` is available as a keyword
510
+ * and does not need to be imported from `@ember/helper`.
511
+ *
512
+ * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/or
513
+ */
514
+ or: Ember71Only<OrHelper>;
515
+ }
516
+
517
+ interface Keywords extends KeywordsForEmber, KeywordsForEmber71 {}
518
+
204
519
  export const Globals: Keywords & Globals;
@@ -0,0 +1,17 @@
1
+ import { DirectInvokable } from '@glint/template/-private/integration';
2
+
3
+ /**
4
+ * `(array a b ...)` — packs the positional arguments into a typed tuple.
5
+ * Built-in keyword in ember-source >= 7.1 (RFC 1000).
6
+ */
7
+ export type ArrayHelper = DirectInvokable<{
8
+ <T extends unknown[]>(...args: T): T;
9
+ }>;
10
+
11
+ /**
12
+ * `(hash key=value ...)` — packs the named arguments into a typed object.
13
+ * Built-in keyword in ember-source >= 7.1 (RFC 999).
14
+ */
15
+ export type HashHelper = DirectInvokable<{
16
+ <T extends Record<string, unknown>>(args: T): T;
17
+ }>;
@@ -0,0 +1,36 @@
1
+ import { DirectInvokable } from '@glint/template/-private/integration';
2
+
3
+ /**
4
+ * `(eq a b)` — strict equality of two values. Built-in keyword in
5
+ * ember-source >= 7.1 (RFC 561). The result is narrowed when both sides are
6
+ * literal types so templates such as `{{#if (eq this.kind "primary")}}` get
7
+ * accurate type information.
8
+ */
9
+ export type EqHelper = DirectInvokable<{
10
+ <A, B>(a: A, b: B): [A] extends [B] ? ([B] extends [A] ? true : boolean) : boolean;
11
+ }>;
12
+
13
+ /** `(neq a b)` — strict inequality. Built-in keyword in ember-source >= 7.1. */
14
+ export type NeqHelper = DirectInvokable<{
15
+ <A, B>(a: A, b: B): [A] extends [B] ? ([B] extends [A] ? false : boolean) : boolean;
16
+ }>;
17
+
18
+ /** `(lt a b)` — numeric less-than. Built-in keyword in ember-source >= 7.1. */
19
+ export type LtHelper = DirectInvokable<{
20
+ (a: number, b: number): boolean;
21
+ }>;
22
+
23
+ /** `(lte a b)` — numeric less-than-or-equal. Built-in keyword in ember-source >= 7.1. */
24
+ export type LteHelper = DirectInvokable<{
25
+ (a: number, b: number): boolean;
26
+ }>;
27
+
28
+ /** `(gt a b)` — numeric greater-than. Built-in keyword in ember-source >= 7.1. */
29
+ export type GtHelper = DirectInvokable<{
30
+ (a: number, b: number): boolean;
31
+ }>;
32
+
33
+ /** `(gte a b)` — numeric greater-than-or-equal. Built-in keyword in ember-source >= 7.1. */
34
+ export type GteHelper = DirectInvokable<{
35
+ (a: number, b: number): boolean;
36
+ }>;
@@ -0,0 +1,14 @@
1
+ import { ComponentLike } from '@glint/template';
2
+ import { DirectInvokable } from '@glint/template/-private/integration';
3
+
4
+ /**
5
+ * `(element "tag-name")` — yields a component bound to a dynamic HTML tag
6
+ * name. Built-in keyword in ember-source >= 7.1 (RFC 389).
7
+ */
8
+ export type ElementHelper = DirectInvokable<{
9
+ (tagName: string): ComponentLike<{
10
+ Element: Element;
11
+ Args: Record<string, unknown>;
12
+ Blocks: { default: [] };
13
+ }>;
14
+ }>;
@@ -0,0 +1,86 @@
1
+ // Adapted from `ember-truth-helpers` to give Glint exact return-type inference
2
+ // for the `(and ...)` and `(or ...)` built-in keywords introduced in
3
+ // ember-source 7.1 (RFC 560). The runtime semantics in Ember intentionally
4
+ // match `ember-truth-helpers`, so the type-level rules here mirror that
5
+ // package's published types.
6
+ //
7
+ // See: https://github.com/jmurphyau/ember-truth-helpers/blob/master/src/utils/truth-convert.ts
8
+
9
+ export type Falsy = { isTruthy: false } | undefined | null | false | 0 | 0n | '' | never[];
10
+
11
+ export type MaybeTruthy =
12
+ | { isTruthy: boolean }
13
+ | undefined
14
+ | null
15
+ | boolean
16
+ | number
17
+ | bigint
18
+ | string
19
+ | unknown[]
20
+ | object;
21
+
22
+ export type TruthConvert<T> = T extends { isTruthy: true }
23
+ ? true
24
+ : T extends { isTruthy: false }
25
+ ? false
26
+ : T extends { isTruthy: boolean }
27
+ ? boolean
28
+ : T extends undefined | null
29
+ ? false
30
+ : T extends boolean
31
+ ? T
32
+ : T extends number
33
+ ? T extends 0
34
+ ? false
35
+ : number extends T
36
+ ? boolean
37
+ : true
38
+ : T extends bigint
39
+ ? T extends 0n
40
+ ? false
41
+ : bigint extends T
42
+ ? boolean
43
+ : true
44
+ : T extends string
45
+ ? T extends ''
46
+ ? false
47
+ : string extends T
48
+ ? boolean
49
+ : true
50
+ : T extends never[]
51
+ ? false
52
+ : T extends ArrayLike<unknown>
53
+ ? boolean
54
+ : T extends object
55
+ ? true
56
+ : boolean;
57
+
58
+ /**
59
+ * Walks the positional argument tuple and returns the type of the first
60
+ * element whose `TruthConvert` resolves to `false`, falling back to the last
61
+ * element. Mirrors the runtime short-circuit behaviour of `(and ...)`.
62
+ */
63
+ export type FirstFalsy<T> = T extends [infer Item]
64
+ ? Item
65
+ : T extends [infer Head, ...infer Tail]
66
+ ? TruthConvert<Head> extends false
67
+ ? Head
68
+ : TruthConvert<Head> extends true
69
+ ? FirstFalsy<Tail>
70
+ : Head | FirstFalsy<Tail>
71
+ : undefined;
72
+
73
+ /**
74
+ * Walks the positional argument tuple and returns the type of the first
75
+ * element whose `TruthConvert` resolves to `true`, falling back to the last
76
+ * element. Mirrors the runtime short-circuit behaviour of `(or ...)`.
77
+ */
78
+ export type FirstTruthy<T> = T extends [infer Item]
79
+ ? Item
80
+ : T extends [infer Head, ...infer Tail]
81
+ ? TruthConvert<Head> extends true
82
+ ? Head
83
+ : TruthConvert<Head> extends false
84
+ ? FirstTruthy<Tail>
85
+ : Exclude<Head, Falsy> | FirstTruthy<Tail>
86
+ : undefined;
@@ -0,0 +1,32 @@
1
+ import { DirectInvokable } from '@glint/template/-private/integration';
2
+
3
+ import type { FirstFalsy, FirstTruthy, MaybeTruthy, TruthConvert } from './truth-convert';
4
+
5
+ /**
6
+ * `(and a b ...)` — short-circuit logical AND. Returns the first falsy
7
+ * positional argument or the last argument. Available as a built-in keyword
8
+ * in ember-source >= 7.1 (RFC 560).
9
+ */
10
+ export type AndHelper = DirectInvokable<{
11
+ <T extends MaybeTruthy[]>(...args: T): FirstFalsy<T>;
12
+ }>;
13
+
14
+ /**
15
+ * `(or a b ...)` — short-circuit logical OR. Returns the first truthy
16
+ * positional argument or the last argument. Available as a built-in keyword
17
+ * in ember-source >= 7.1 (RFC 560).
18
+ */
19
+ export type OrHelper = DirectInvokable<{
20
+ <T extends MaybeTruthy[]>(...args: T): FirstTruthy<T>;
21
+ }>;
22
+
23
+ /**
24
+ * `(not value)` — boolean negation using truthy semantics matching the rest
25
+ * of Ember's template-side helpers. Built-in keyword in ember-source >= 7.1
26
+ * (RFC 560).
27
+ */
28
+ export type NotHelper = DirectInvokable<{
29
+ <T>(
30
+ value: T,
31
+ ): TruthConvert<T> extends true ? false : TruthConvert<T> extends false ? true : boolean;
32
+ }>;
@@ -1,2 +0,0 @@
1
- export declare function run(): void;
2
- //# sourceMappingURL=run-volar-tsc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-volar-tsc.d.ts","sourceRoot":"","sources":["../../src/cli/run-volar-tsc.ts"],"names":[],"mappings":"AAOA,wBAAgB,GAAG,IAAI,IAAI,CA6B1B"}