@glint/ember-tsc 1.8.2 → 1.8.4

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 (50) hide show
  1. package/lib/config/environment.d.ts +7 -6
  2. package/lib/config/environment.d.ts.map +1 -1
  3. package/lib/config/environment.js +8 -23
  4. package/lib/config/environment.js.map +1 -1
  5. package/lib/config/types.d.cts +8 -7
  6. package/lib/config/types.d.cts.map +1 -1
  7. package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +1 -1
  8. package/lib/environment-ember-template-imports/-private/environment/index.js +33 -28
  9. package/lib/environment-ember-template-imports/-private/environment/index.js.map +1 -1
  10. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +1 -1
  11. package/lib/environment-ember-template-imports/-private/environment/preprocess.js +18 -4
  12. package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +1 -1
  13. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +1 -1
  14. package/lib/environment-ember-template-imports/-private/environment/transform.js +39 -34
  15. package/lib/environment-ember-template-imports/-private/environment/transform.js.map +1 -1
  16. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +17 -1
  17. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +1 -1
  18. package/lib/transform/template/glimmer-ast-mapping-tree.js +10 -1
  19. package/lib/transform/template/glimmer-ast-mapping-tree.js.map +1 -1
  20. package/lib/transform/template/inlining/tagged-strings.js +16 -10
  21. package/lib/transform/template/inlining/tagged-strings.js.map +1 -1
  22. package/lib/transform/template/map-template-contents.d.ts +6 -1
  23. package/lib/transform/template/map-template-contents.d.ts.map +1 -1
  24. package/lib/transform/template/map-template-contents.js +4 -4
  25. package/lib/transform/template/map-template-contents.js.map +1 -1
  26. package/lib/transform/template/rewrite-module.js +6 -6
  27. package/lib/transform/template/rewrite-module.js.map +1 -1
  28. package/lib/transform/template/template-to-typescript.d.ts.map +1 -1
  29. package/lib/transform/template/template-to-typescript.js +39 -9
  30. package/lib/transform/template/template-to-typescript.js.map +1 -1
  31. package/lib/transform/template/transformed-module.d.ts.map +1 -1
  32. package/lib/transform/template/transformed-module.js +34 -0
  33. package/lib/transform/template/transformed-module.js.map +1 -1
  34. package/package.json +7 -3
  35. package/src/config/environment.ts +10 -29
  36. package/src/config/types.cts +8 -8
  37. package/src/environment-ember-template-imports/-private/environment/index.ts +33 -28
  38. package/src/environment-ember-template-imports/-private/environment/preprocess.ts +19 -4
  39. package/src/environment-ember-template-imports/-private/environment/transform.ts +39 -43
  40. package/src/transform/template/glimmer-ast-mapping-tree.ts +8 -0
  41. package/src/transform/template/inlining/tagged-strings.ts +21 -15
  42. package/src/transform/template/map-template-contents.ts +27 -3
  43. package/src/transform/template/rewrite-module.ts +6 -6
  44. package/src/transform/template/template-to-typescript.ts +49 -9
  45. package/src/transform/template/transformed-module.ts +42 -0
  46. package/types/-private/dsl/globals.d.ts +5 -10
  47. package/types/-private/intrinsics/comparison.d.ts +7 -14
  48. package/types/-private/intrinsics/element.d.ts +22 -2
  49. package/types/-private/intrinsics/get.d.ts +8 -4
  50. package/types/-private/intrinsics/truth-helpers.d.ts +26 -9
@@ -4,14 +4,7 @@ import * as VM from '@glint/template/-private/keywords';
4
4
 
5
5
  import { ActionKeyword } from '../intrinsics/action';
6
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';
7
+ import { GtHelper, GteHelper, LtHelper, LteHelper } from '../intrinsics/comparison';
15
8
  import { EachKeyword } from '../intrinsics/each';
16
9
  import { EachInKeyword } from '../intrinsics/each-in';
17
10
  import { ElementHelper } from '../intrinsics/element';
@@ -331,7 +324,8 @@ interface KeywordsForEmber71Members {
331
324
  *
332
325
  * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/eq
333
326
  */
334
- eq: EqHelper;
327
+ // `{{eq}}` is emitted as the native `===` operator in `ember-tsc`.
328
+ eq: void;
335
329
 
336
330
  /**
337
331
  * `{{fn}}` is a helper that receives a function and some arguments, and
@@ -459,7 +453,8 @@ interface KeywordsForEmber71Members {
459
453
  *
460
454
  * @see https://api.emberjs.com/ember/release/functions/@ember%2Fhelper/neq
461
455
  */
462
- neq: NeqHelper;
456
+ // `{{neq}}` is emitted as the native `!==` operator in `ember-tsc`.
457
+ neq: void;
463
458
 
464
459
  /**
465
460
  * The `{{not}}` helper returns the logical negation of its argument using
@@ -1,19 +1,12 @@
1
1
  import { DirectInvokable } from '@glint/template/-private/integration';
2
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
- }>;
3
+ // NOTE: `eq`/`neq` (RFC 561) are not represented here. Because their runtime is
4
+ // exactly `left === right` / `left !== right`, they are emitted as the native
5
+ // `===`/`!==` operators (see the `ember-template-imports` environment's
6
+ // `specialForms`) which, unlike a boolean-returning helper type, lets
7
+ // TypeScript narrow discriminated unions in `{{#if (eq foo.kind "a")}}`. The
8
+ // `lt`/`lte`/`gt`/`gte` keywords below have no narrowing benefit and remain
9
+ // ordinary helpers.
17
10
 
18
11
  /** `(lt a b)` — numeric less-than. Built-in keyword in ember-source >= 7.1. */
19
12
  export type LtHelper = DirectInvokable<{
@@ -6,8 +6,28 @@ import { DirectInvokable } from '@glint/template/-private/integration';
6
6
  * name. Built-in keyword in ember-source >= 7.1 (RFC 389).
7
7
  */
8
8
  export type ElementHelper = DirectInvokable<{
9
- (tagName: string): ComponentLike<{
10
- Element: Element;
9
+ // `const K` preserves the literal tag name (e.g. `"video"`) through Glint's
10
+ // `resolve()` inference; without it TypeScript widens the argument to `string`
11
+ // and narrowing collapses to the base `Element`. The `string & {}` member lets
12
+ // a genuinely dynamic (non-literal) tag name still match and fall back to
13
+ // `Element`, covering both HTML and SVG.
14
+ <const K extends keyof HTMLElementTagNameMap | keyof SVGElementTagNameMap | (string & {})>(
15
+ tagName: K,
16
+ ): ComponentLike<{
17
+ // A known HTML or SVG tag name narrows to the corresponding element type.
18
+ // When a name exists in both maps (e.g. `a`, `script`, `style`, `title`)
19
+ // the HTML element wins, matching the default (non-SVG) namespace at
20
+ // runtime. An empty string renders the block without a wrapping element, so
21
+ // there is no element to receive attributes (`null`, which makes applying
22
+ // any attribute a type error). Any other (dynamic) tag name falls back to
23
+ // the base `Element`, covering both HTML and SVG.
24
+ Element: K extends keyof HTMLElementTagNameMap
25
+ ? HTMLElementTagNameMap[K]
26
+ : K extends keyof SVGElementTagNameMap
27
+ ? SVGElementTagNameMap[K]
28
+ : K extends ''
29
+ ? null
30
+ : Element;
11
31
  Args: Record<string, unknown>;
12
32
  Blocks: { default: [] };
13
33
  }>;
@@ -1,12 +1,16 @@
1
1
  import { DirectInvokable } from '@glint/template/-private/integration';
2
2
  import ObjectProxy from '@ember/object/proxy';
3
- import '@ember/object/-private/types';
4
3
 
5
4
  // This hack lets us support both the stable/preview types from `ember-source`
6
5
  // and the classic types still live on DefinitelyTyped. If using the DT types,
7
- // this acts as a declaration merge for a module which is then integrated via
8
- // the rest of the DT types. If using the stable/preview types, this ends up
9
- // being a no-op.
6
+ // the `declare module` below acts as a declaration merge for a module which is
7
+ // then integrated via the rest of the DT types. If using the stable/preview
8
+ // types, the module does not exist and this ends up being a no-op.
9
+ //
10
+ // Note: we intentionally do *not* add a side-effect `import '@ember/object/-private/types'`
11
+ // here. TypeScript 6.0 errors (TS2882) on a side-effect import of a module that
12
+ // cannot be resolved, which is exactly the no-op (ember-source) case above. The
13
+ // `declare module` augmentation still merges into the DT module when it exists.
10
14
  declare const GetSetMarker: unique symbol;
11
15
  declare module '@ember/object/-private/types' {
12
16
  interface ComputedPropertyMarker<Get, Set = Get> {
@@ -1,32 +1,49 @@
1
1
  import { DirectInvokable } from '@glint/template/-private/integration';
2
2
 
3
- import type { FirstFalsy, FirstTruthy, MaybeTruthy, TruthConvert } from './truth-convert';
3
+ import type { Falsy, FirstFalsy, FirstTruthy, MaybeTruthy } from './truth-convert';
4
4
 
5
5
  /**
6
6
  * `(and a b ...)` — short-circuit logical AND. Returns the first falsy
7
7
  * positional argument or the last argument. Available as a built-in keyword
8
8
  * in ember-source >= 7.1 (RFC 560).
9
+ *
10
+ * The runtime requires **at least two** arguments (it throws otherwise), so the
11
+ * signature pins two leading positionals before the rest.
9
12
  */
10
13
  export type AndHelper = DirectInvokable<{
11
- <T extends MaybeTruthy[]>(...args: T): FirstFalsy<T>;
14
+ <A extends MaybeTruthy, B extends MaybeTruthy, Rest extends MaybeTruthy[]>(
15
+ a: A,
16
+ b: B,
17
+ ...rest: Rest
18
+ ): FirstFalsy<[A, B, ...Rest]>;
12
19
  }>;
13
20
 
14
21
  /**
15
22
  * `(or a b ...)` — short-circuit logical OR. Returns the first truthy
16
23
  * positional argument or the last argument. Available as a built-in keyword
17
24
  * in ember-source >= 7.1 (RFC 560).
25
+ *
26
+ * The runtime requires **at least two** arguments (it throws otherwise), so the
27
+ * signature pins two leading positionals before the rest.
18
28
  */
19
29
  export type OrHelper = DirectInvokable<{
20
- <T extends MaybeTruthy[]>(...args: T): FirstTruthy<T>;
30
+ <A extends MaybeTruthy, B extends MaybeTruthy, Rest extends MaybeTruthy[]>(
31
+ a: A,
32
+ b: B,
33
+ ...rest: Rest
34
+ ): FirstTruthy<[A, B, ...Rest]>;
21
35
  }>;
22
36
 
23
37
  /**
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).
38
+ * `(not value)` — boolean negation using Handlebars truthiness semantics.
39
+ * Built-in keyword in ember-source >= 7.1 (RFC 560).
40
+ *
41
+ * Typed as a type predicate over Ember's `Falsy` type so that using it as a
42
+ * condition narrows the operand: in `{{#if (not value)}}` the operand is
43
+ * narrowed to its falsy members, and in the `{{else}}` branch to its truthy
44
+ * members. (As a predicate its *value* is `boolean` rather than a `true`/
45
+ * `false` literal — narrowing in conditions is the more useful guarantee.)
27
46
  */
28
47
  export type NotHelper = DirectInvokable<{
29
- <T>(
30
- value: T,
31
- ): TruthConvert<T> extends true ? false : TruthConvert<T> extends false ? true : boolean;
48
+ <T>(value: T): value is Extract<T, Falsy>;
32
49
  }>;