@glint/ember-tsc 1.4.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 (139) hide show
  1. package/package.json +14 -3
  2. package/src/config/index.ts +12 -0
  3. package/src/environment-ember-template-imports/-private/environment/index.ts +48 -20
  4. package/src/index.ts +9 -2
  5. package/src/volar/language-server.ts +23 -11
  6. package/types/-private/dsl/globals.d.ts +316 -1
  7. package/types/-private/intrinsics/array-hash.d.ts +17 -0
  8. package/types/-private/intrinsics/comparison.d.ts +36 -0
  9. package/types/-private/intrinsics/element.d.ts +14 -0
  10. package/types/-private/intrinsics/truth-convert.d.ts +86 -0
  11. package/types/-private/intrinsics/truth-helpers.d.ts +32 -0
  12. package/lib/cli/run-volar-tsc.d.ts +0 -2
  13. package/lib/cli/run-volar-tsc.d.ts.map +0 -1
  14. package/lib/cli/run-volar-tsc.js +0 -32
  15. package/lib/cli/run-volar-tsc.js.map +0 -1
  16. package/lib/config/config.d.ts +0 -15
  17. package/lib/config/config.d.ts.map +0 -1
  18. package/lib/config/config.js +0 -21
  19. package/lib/config/config.js.map +0 -1
  20. package/lib/config/environment.d.ts +0 -26
  21. package/lib/config/environment.d.ts.map +0 -1
  22. package/lib/config/environment.js +0 -96
  23. package/lib/config/environment.js.map +0 -1
  24. package/lib/config/index.d.ts +0 -17
  25. package/lib/config/index.d.ts.map +0 -1
  26. package/lib/config/index.js +0 -26
  27. package/lib/config/index.js.map +0 -1
  28. package/lib/config/loader.d.ts +0 -28
  29. package/lib/config/loader.d.ts.map +0 -1
  30. package/lib/config/loader.js +0 -121
  31. package/lib/config/loader.js.map +0 -1
  32. package/lib/config/types.cjs +0 -3
  33. package/lib/config/types.cjs.map +0 -1
  34. package/lib/config/types.d.cts +0 -60
  35. package/lib/config/types.d.cts.map +0 -1
  36. package/lib/environment-ember-template-imports/-private/environment/common.d.ts +0 -13
  37. package/lib/environment-ember-template-imports/-private/environment/common.d.ts.map +0 -1
  38. package/lib/environment-ember-template-imports/-private/environment/common.js +0 -2
  39. package/lib/environment-ember-template-imports/-private/environment/common.js.map +0 -1
  40. package/lib/environment-ember-template-imports/-private/environment/index.d.ts +0 -3
  41. package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +0 -1
  42. package/lib/environment-ember-template-imports/-private/environment/index.js +0 -76
  43. package/lib/environment-ember-template-imports/-private/environment/index.js.map +0 -1
  44. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts +0 -4
  45. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +0 -1
  46. package/lib/environment-ember-template-imports/-private/environment/preprocess.js +0 -42
  47. package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +0 -1
  48. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts +0 -4
  49. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +0 -1
  50. package/lib/environment-ember-template-imports/-private/environment/transform.js +0 -134
  51. package/lib/environment-ember-template-imports/-private/environment/transform.js.map +0 -1
  52. package/lib/index.d.ts +0 -7
  53. package/lib/index.d.ts.map +0 -1
  54. package/lib/index.js +0 -6
  55. package/lib/index.js.map +0 -1
  56. package/lib/plugins/g-compiler-errors.d.ts +0 -12
  57. package/lib/plugins/g-compiler-errors.d.ts.map +0 -1
  58. package/lib/plugins/g-compiler-errors.js +0 -58
  59. package/lib/plugins/g-compiler-errors.js.map +0 -1
  60. package/lib/plugins/g-component-hover.d.ts +0 -24
  61. package/lib/plugins/g-component-hover.d.ts.map +0 -1
  62. package/lib/plugins/g-component-hover.js +0 -135
  63. package/lib/plugins/g-component-hover.js.map +0 -1
  64. package/lib/plugins/g-template-tag-symbols.d.ts +0 -11
  65. package/lib/plugins/g-template-tag-symbols.d.ts.map +0 -1
  66. package/lib/plugins/g-template-tag-symbols.js +0 -48
  67. package/lib/plugins/g-template-tag-symbols.js.map +0 -1
  68. package/lib/plugins/utils.d.ts +0 -25
  69. package/lib/plugins/utils.d.ts.map +0 -1
  70. package/lib/plugins/utils.js +0 -63
  71. package/lib/plugins/utils.js.map +0 -1
  72. package/lib/transform/diagnostics/augmentation.d.ts +0 -4
  73. package/lib/transform/diagnostics/augmentation.d.ts.map +0 -1
  74. package/lib/transform/diagnostics/augmentation.js +0 -249
  75. package/lib/transform/diagnostics/augmentation.js.map +0 -1
  76. package/lib/transform/diagnostics/index.d.ts +0 -5
  77. package/lib/transform/diagnostics/index.d.ts.map +0 -1
  78. package/lib/transform/diagnostics/index.js +0 -2
  79. package/lib/transform/diagnostics/index.js.map +0 -1
  80. package/lib/transform/index.d.ts +0 -4
  81. package/lib/transform/index.d.ts.map +0 -1
  82. package/lib/transform/index.js +0 -2
  83. package/lib/transform/index.js.map +0 -1
  84. package/lib/transform/template/code-features.d.ts +0 -30
  85. package/lib/transform/template/code-features.d.ts.map +0 -1
  86. package/lib/transform/template/code-features.js +0 -26
  87. package/lib/transform/template/code-features.js.map +0 -1
  88. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +0 -80
  89. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +0 -1
  90. package/lib/transform/template/glimmer-ast-mapping-tree.js +0 -132
  91. package/lib/transform/template/glimmer-ast-mapping-tree.js.map +0 -1
  92. package/lib/transform/template/inlining/index.d.ts +0 -16
  93. package/lib/transform/template/inlining/index.d.ts.map +0 -1
  94. package/lib/transform/template/inlining/index.js +0 -21
  95. package/lib/transform/template/inlining/index.js.map +0 -1
  96. package/lib/transform/template/inlining/tagged-strings.d.ts +0 -8
  97. package/lib/transform/template/inlining/tagged-strings.d.ts.map +0 -1
  98. package/lib/transform/template/inlining/tagged-strings.js +0 -140
  99. package/lib/transform/template/inlining/tagged-strings.js.map +0 -1
  100. package/lib/transform/template/map-template-contents.d.ts +0 -121
  101. package/lib/transform/template/map-template-contents.d.ts.map +0 -1
  102. package/lib/transform/template/map-template-contents.js +0 -287
  103. package/lib/transform/template/map-template-contents.js.map +0 -1
  104. package/lib/transform/template/rewrite-module.d.ts +0 -22
  105. package/lib/transform/template/rewrite-module.d.ts.map +0 -1
  106. package/lib/transform/template/rewrite-module.js +0 -265
  107. package/lib/transform/template/rewrite-module.js.map +0 -1
  108. package/lib/transform/template/scope-stack.d.ts +0 -13
  109. package/lib/transform/template/scope-stack.d.ts.map +0 -1
  110. package/lib/transform/template/scope-stack.js +0 -28
  111. package/lib/transform/template/scope-stack.js.map +0 -1
  112. package/lib/transform/template/template-to-typescript.d.ts +0 -19
  113. package/lib/transform/template/template-to-typescript.d.ts.map +0 -1
  114. package/lib/transform/template/template-to-typescript.js +0 -1125
  115. package/lib/transform/template/template-to-typescript.js.map +0 -1
  116. package/lib/transform/template/transformed-module.d.ts +0 -111
  117. package/lib/transform/template/transformed-module.d.ts.map +0 -1
  118. package/lib/transform/template/transformed-module.js +0 -287
  119. package/lib/transform/template/transformed-module.js.map +0 -1
  120. package/lib/transform/util.d.ts +0 -7
  121. package/lib/transform/util.d.ts.map +0 -1
  122. package/lib/transform/util.js +0 -15
  123. package/lib/transform/util.js.map +0 -1
  124. package/lib/volar/ember-language-plugin.d.ts +0 -14
  125. package/lib/volar/ember-language-plugin.d.ts.map +0 -1
  126. package/lib/volar/ember-language-plugin.js +0 -91
  127. package/lib/volar/ember-language-plugin.js.map +0 -1
  128. package/lib/volar/gts-virtual-code.d.ts +0 -83
  129. package/lib/volar/gts-virtual-code.d.ts.map +0 -1
  130. package/lib/volar/gts-virtual-code.js +0 -210
  131. package/lib/volar/gts-virtual-code.js.map +0 -1
  132. package/lib/volar/language-server.d.ts +0 -2
  133. package/lib/volar/language-server.d.ts.map +0 -1
  134. package/lib/volar/language-server.js +0 -171
  135. package/lib/volar/language-server.js.map +0 -1
  136. package/lib/volar/script-snapshot.d.ts +0 -17
  137. package/lib/volar/script-snapshot.d.ts.map +0 -1
  138. package/lib/volar/script-snapshot.js +0 -24
  139. 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.4.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"
@@ -1,4 +1,6 @@
1
+ import * as path from 'node:path';
1
2
  import SilentError from 'silent-error';
3
+ import type TS from 'typescript';
2
4
  import { GlintConfig } from './config.js';
3
5
  import { ConfigLoader } from './loader.js';
4
6
 
@@ -28,3 +30,13 @@ export function loadConfig(from: string): GlintConfig {
28
30
  export function findConfig(from: string): GlintConfig | null {
29
31
  return new ConfigLoader().configForDirectory(from);
30
32
  }
33
+
34
+ /**
35
+ * Creates a default GlintConfig with ember-template-imports environment
36
+ * for use when no tsconfig.json or jsconfig.json exists. This enables
37
+ * Glint to provide IntelliSense in JavaScript-only Ember projects.
38
+ */
39
+ export function createDefaultConfig(ts: typeof TS, rootDir: string): GlintConfig {
40
+ const syntheticConfigPath = path.join(rootDir, 'jsconfig.json');
41
+ return new GlintConfig(ts, syntheticConfigPath, { environment: 'ember-template-imports' });
42
+ }
@@ -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
  ],
package/src/index.ts CHANGED
@@ -1,9 +1,16 @@
1
- import { GlintConfig, loadConfig, findConfig } from './config/index.js';
1
+ import { GlintConfig, loadConfig, findConfig, createDefaultConfig } from './config/index.js';
2
2
  import { createEmberLanguagePlugin } from './volar/ember-language-plugin.js';
3
3
 
4
4
  import { VirtualGtsCode } from './volar/gts-virtual-code.js';
5
5
  import { augmentDiagnostics } from './transform/diagnostics/augmentation.js';
6
6
 
7
- export { loadConfig, findConfig, createEmberLanguagePlugin, VirtualGtsCode, augmentDiagnostics };
7
+ export {
8
+ loadConfig,
9
+ findConfig,
10
+ createDefaultConfig,
11
+ createEmberLanguagePlugin,
12
+ VirtualGtsCode,
13
+ augmentDiagnostics,
14
+ };
8
15
 
9
16
  export type { GlintConfig };
@@ -1,3 +1,4 @@
1
+ import * as path from 'node:path';
1
2
  import { createLanguage } from '@volar/language-core';
2
3
  import type { LanguagePlugin, LanguageServer } from '@volar/language-server';
3
4
  import { createLanguageServiceEnvironment } from '@volar/language-server/lib/project/simpleProject.js';
@@ -9,6 +10,7 @@ import { create as createHtmlSyntacticPlugin } from 'volar-service-html';
9
10
  import { create as createTypeScriptSyntacticPlugin } from 'volar-service-typescript/lib/plugins/syntactic.js';
10
11
  import { URI } from 'vscode-uri';
11
12
  import { ConfigLoader } from '../config/loader.js';
13
+ import { createDefaultConfig } from '../config/index.js';
12
14
  import { create as createCompilerErrorsPlugin } from '../plugins/g-compiler-errors.js';
13
15
  import { create as createComponentHoverPlugin } from '../plugins/g-component-hover.js';
14
16
  import type { ComponentMeta, TsPluginClient } from '../plugins/g-component-hover.js';
@@ -143,18 +145,28 @@ connection.onInitialize((params) => {
143
145
  },
144
146
  ];
145
147
 
146
- if (tsconfigFileName) {
147
- const configLoader = new ConfigLoader(logInfo);
148
- const glintConfig = configLoader.configForFile(tsconfigFileName);
149
- if (glintConfig) {
150
- logInfo(`Glint config active for ${tsconfigFileName}.`);
151
- const emberLanguagePlugin = createEmberLanguagePlugin(glintConfig);
152
- languagePlugins.push(emberLanguagePlugin);
153
- } else {
154
- logWarn(`Glint config not found for ${tsconfigFileName}; Glint features disabled.`);
148
+ {
149
+ let glintConfig = null;
150
+ const isRealConfigFile =
151
+ tsconfigFileName &&
152
+ !tsconfigFileName.startsWith('/dev/null') &&
153
+ tsconfigFileName.endsWith('.json');
154
+ if (isRealConfigFile) {
155
+ const configLoader = new ConfigLoader(logInfo);
156
+ glintConfig = configLoader.configForFile(tsconfigFileName);
157
+ }
158
+ if (!glintConfig) {
159
+ const rootDir = isRealConfigFile
160
+ ? path.dirname(tsconfigFileName!)
161
+ : params.workspaceFolders?.[0]
162
+ ? URI.parse(params.workspaceFolders[0].uri).fsPath
163
+ : process.cwd();
164
+ logInfo(`Using default Glint config for ${rootDir}.`);
165
+ glintConfig = createDefaultConfig(ts, rootDir);
155
166
  }
156
- } else {
157
- logWarn('No tsconfig/jsconfig provided; Glint config cannot be resolved.');
167
+ logInfo(`Glint config active for ${tsconfigFileName ?? 'default'}.`);
168
+ const emberLanguagePlugin = createEmberLanguagePlugin(glintConfig);
169
+ languagePlugins.push(emberLanguagePlugin);
158
170
  }
159
171
 
160
172
  const language = createLanguage<URI>(languagePlugins, createUriMap(), (uri) => {
@@ -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
+ }>;