@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.
- package/package.json +14 -3
- package/src/config/index.ts +12 -0
- package/src/environment-ember-template-imports/-private/environment/index.ts +48 -20
- package/src/index.ts +9 -2
- package/src/volar/language-server.ts +23 -11
- package/types/-private/dsl/globals.d.ts +316 -1
- package/types/-private/intrinsics/array-hash.d.ts +17 -0
- package/types/-private/intrinsics/comparison.d.ts +36 -0
- package/types/-private/intrinsics/element.d.ts +14 -0
- package/types/-private/intrinsics/truth-convert.d.ts +86 -0
- package/types/-private/intrinsics/truth-helpers.d.ts +32 -0
- package/lib/cli/run-volar-tsc.d.ts +0 -2
- package/lib/cli/run-volar-tsc.d.ts.map +0 -1
- package/lib/cli/run-volar-tsc.js +0 -32
- package/lib/cli/run-volar-tsc.js.map +0 -1
- package/lib/config/config.d.ts +0 -15
- package/lib/config/config.d.ts.map +0 -1
- package/lib/config/config.js +0 -21
- package/lib/config/config.js.map +0 -1
- package/lib/config/environment.d.ts +0 -26
- package/lib/config/environment.d.ts.map +0 -1
- package/lib/config/environment.js +0 -96
- package/lib/config/environment.js.map +0 -1
- package/lib/config/index.d.ts +0 -17
- package/lib/config/index.d.ts.map +0 -1
- package/lib/config/index.js +0 -26
- package/lib/config/index.js.map +0 -1
- package/lib/config/loader.d.ts +0 -28
- package/lib/config/loader.d.ts.map +0 -1
- package/lib/config/loader.js +0 -121
- package/lib/config/loader.js.map +0 -1
- package/lib/config/types.cjs +0 -3
- package/lib/config/types.cjs.map +0 -1
- package/lib/config/types.d.cts +0 -60
- package/lib/config/types.d.cts.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/common.d.ts +0 -13
- package/lib/environment-ember-template-imports/-private/environment/common.d.ts.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/common.js +0 -2
- package/lib/environment-ember-template-imports/-private/environment/common.js.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/index.d.ts +0 -3
- package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/index.js +0 -76
- package/lib/environment-ember-template-imports/-private/environment/index.js.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts +0 -4
- package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/preprocess.js +0 -42
- package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/transform.d.ts +0 -4
- package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +0 -1
- package/lib/environment-ember-template-imports/-private/environment/transform.js +0 -134
- package/lib/environment-ember-template-imports/-private/environment/transform.js.map +0 -1
- package/lib/index.d.ts +0 -7
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -6
- package/lib/index.js.map +0 -1
- package/lib/plugins/g-compiler-errors.d.ts +0 -12
- package/lib/plugins/g-compiler-errors.d.ts.map +0 -1
- package/lib/plugins/g-compiler-errors.js +0 -58
- package/lib/plugins/g-compiler-errors.js.map +0 -1
- package/lib/plugins/g-component-hover.d.ts +0 -24
- package/lib/plugins/g-component-hover.d.ts.map +0 -1
- package/lib/plugins/g-component-hover.js +0 -135
- package/lib/plugins/g-component-hover.js.map +0 -1
- package/lib/plugins/g-template-tag-symbols.d.ts +0 -11
- package/lib/plugins/g-template-tag-symbols.d.ts.map +0 -1
- package/lib/plugins/g-template-tag-symbols.js +0 -48
- package/lib/plugins/g-template-tag-symbols.js.map +0 -1
- package/lib/plugins/utils.d.ts +0 -25
- package/lib/plugins/utils.d.ts.map +0 -1
- package/lib/plugins/utils.js +0 -63
- package/lib/plugins/utils.js.map +0 -1
- package/lib/transform/diagnostics/augmentation.d.ts +0 -4
- package/lib/transform/diagnostics/augmentation.d.ts.map +0 -1
- package/lib/transform/diagnostics/augmentation.js +0 -249
- package/lib/transform/diagnostics/augmentation.js.map +0 -1
- package/lib/transform/diagnostics/index.d.ts +0 -5
- package/lib/transform/diagnostics/index.d.ts.map +0 -1
- package/lib/transform/diagnostics/index.js +0 -2
- package/lib/transform/diagnostics/index.js.map +0 -1
- package/lib/transform/index.d.ts +0 -4
- package/lib/transform/index.d.ts.map +0 -1
- package/lib/transform/index.js +0 -2
- package/lib/transform/index.js.map +0 -1
- package/lib/transform/template/code-features.d.ts +0 -30
- package/lib/transform/template/code-features.d.ts.map +0 -1
- package/lib/transform/template/code-features.js +0 -26
- package/lib/transform/template/code-features.js.map +0 -1
- package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +0 -80
- package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +0 -1
- package/lib/transform/template/glimmer-ast-mapping-tree.js +0 -132
- package/lib/transform/template/glimmer-ast-mapping-tree.js.map +0 -1
- package/lib/transform/template/inlining/index.d.ts +0 -16
- package/lib/transform/template/inlining/index.d.ts.map +0 -1
- package/lib/transform/template/inlining/index.js +0 -21
- package/lib/transform/template/inlining/index.js.map +0 -1
- package/lib/transform/template/inlining/tagged-strings.d.ts +0 -8
- package/lib/transform/template/inlining/tagged-strings.d.ts.map +0 -1
- package/lib/transform/template/inlining/tagged-strings.js +0 -140
- package/lib/transform/template/inlining/tagged-strings.js.map +0 -1
- package/lib/transform/template/map-template-contents.d.ts +0 -121
- package/lib/transform/template/map-template-contents.d.ts.map +0 -1
- package/lib/transform/template/map-template-contents.js +0 -287
- package/lib/transform/template/map-template-contents.js.map +0 -1
- package/lib/transform/template/rewrite-module.d.ts +0 -22
- package/lib/transform/template/rewrite-module.d.ts.map +0 -1
- package/lib/transform/template/rewrite-module.js +0 -265
- package/lib/transform/template/rewrite-module.js.map +0 -1
- package/lib/transform/template/scope-stack.d.ts +0 -13
- package/lib/transform/template/scope-stack.d.ts.map +0 -1
- package/lib/transform/template/scope-stack.js +0 -28
- package/lib/transform/template/scope-stack.js.map +0 -1
- package/lib/transform/template/template-to-typescript.d.ts +0 -19
- package/lib/transform/template/template-to-typescript.d.ts.map +0 -1
- package/lib/transform/template/template-to-typescript.js +0 -1125
- package/lib/transform/template/template-to-typescript.js.map +0 -1
- package/lib/transform/template/transformed-module.d.ts +0 -111
- package/lib/transform/template/transformed-module.d.ts.map +0 -1
- package/lib/transform/template/transformed-module.js +0 -287
- package/lib/transform/template/transformed-module.js.map +0 -1
- package/lib/transform/util.d.ts +0 -7
- package/lib/transform/util.d.ts.map +0 -1
- package/lib/transform/util.js +0 -15
- package/lib/transform/util.js.map +0 -1
- package/lib/volar/ember-language-plugin.d.ts +0 -14
- package/lib/volar/ember-language-plugin.d.ts.map +0 -1
- package/lib/volar/ember-language-plugin.js +0 -91
- package/lib/volar/ember-language-plugin.js.map +0 -1
- package/lib/volar/gts-virtual-code.d.ts +0 -83
- package/lib/volar/gts-virtual-code.d.ts.map +0 -1
- package/lib/volar/gts-virtual-code.js +0 -210
- package/lib/volar/gts-virtual-code.js.map +0 -1
- package/lib/volar/language-server.d.ts +0 -2
- package/lib/volar/language-server.d.ts.map +0 -1
- package/lib/volar/language-server.js +0 -171
- package/lib/volar/language-server.js.map +0 -1
- package/lib/volar/script-snapshot.d.ts +0 -17
- package/lib/volar/script-snapshot.d.ts.map +0 -1
- package/lib/volar/script-snapshot.js +0 -24
- 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.
|
|
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
|
-
"
|
|
90
|
-
"glint-
|
|
100
|
+
"glint-monorepo-test-utils": "0.0.0",
|
|
101
|
+
"@glint/type-test": "2.0.1"
|
|
91
102
|
},
|
|
92
103
|
"publishConfig": {
|
|
93
104
|
"access": "public"
|
package/src/config/index.ts
CHANGED
|
@@ -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
|
-
|
|
45
|
-
|
|
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 {
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
157
|
-
|
|
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
|
|
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
|
+
}>;
|