-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Expand file tree
/
Copy pathauto-import-builtins.ts
More file actions
109 lines (97 loc) · 3.43 KB
/
auto-import-builtins.ts
File metadata and controls
109 lines (97 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import type { AST, ASTPlugin } from '@glimmer/syntax';
import type { EmberASTPluginEnvironment } from '../types';
import { isPath, trackLocals } from './utils';
/**
@module ember
*/
/**
A Glimmer2 AST transformation that makes importable keywords work
@private
@class TransformActionSyntax
*/
export default function autoImportBuiltins(env: EmberASTPluginEnvironment): ASTPlugin {
let { hasLocal, visitor } = trackLocals(env);
return {
name: 'auto-import-built-ins',
visitor: {
...visitor,
ElementModifierStatement(node: AST.ElementModifierStatement) {
if (isOn(node, hasLocal)) {
rewriteKeyword(env, node, 'on', '@ember/modifier');
}
},
SubExpression(node: AST.SubExpression) {
if (isArray(node, hasLocal)) {
rewriteKeyword(env, node, 'array', '@ember/helper');
}
if (isElement(node, hasLocal)) {
rewriteKeyword(env, node, 'element', '@ember/helper');
}
if (isFn(node, hasLocal)) {
rewriteKeyword(env, node, 'fn', '@ember/helper');
}
if (isHash(node, hasLocal)) {
rewriteKeyword(env, node, 'hash', '@ember/helper');
}
},
MustacheStatement(node: AST.MustacheStatement) {
if (isArray(node, hasLocal)) {
rewriteKeyword(env, node, 'array', '@ember/helper');
}
if (isElement(node, hasLocal)) {
rewriteKeyword(env, node, 'element', '@ember/helper');
}
if (isFn(node, hasLocal)) {
rewriteKeyword(env, node, 'fn', '@ember/helper');
}
if (isHash(node, hasLocal)) {
rewriteKeyword(env, node, 'hash', '@ember/helper');
}
},
},
};
}
function rewriteKeyword(
env: EmberASTPluginEnvironment,
node: { path: AST.PathExpression },
name: string,
moduleSpecifier: string
) {
if (env.meta?.jsutils) {
node.path.original = env.meta.jsutils.bindImport(moduleSpecifier, name, node, {
name,
});
} else if (env.meta?.emberRuntime) {
node.path.original = env.meta.emberRuntime.lookupKeyword(name);
}
}
function isOn(
node: AST.ElementModifierStatement | AST.MustacheStatement | AST.SubExpression,
hasLocal: (k: string) => boolean
): node is AST.ElementModifierStatement & { path: AST.PathExpression } {
return isPath(node.path) && node.path.original === 'on' && !hasLocal('on');
}
function isArray(
node: AST.MustacheStatement | AST.SubExpression,
hasLocal: (k: string) => boolean
): node is (AST.MustacheStatement | AST.SubExpression) & { path: AST.PathExpression } {
return isPath(node.path) && node.path.original === 'array' && !hasLocal('array');
}
function isFn(
node: AST.MustacheStatement | AST.SubExpression,
hasLocal: (k: string) => boolean
): node is (AST.MustacheStatement | AST.SubExpression) & { path: AST.PathExpression } {
return isPath(node.path) && node.path.original === 'fn' && !hasLocal('fn');
}
function isHash(
node: AST.MustacheStatement | AST.SubExpression,
hasLocal: (k: string) => boolean
): node is (AST.MustacheStatement | AST.SubExpression) & { path: AST.PathExpression } {
return isPath(node.path) && node.path.original === 'hash' && !hasLocal('hash');
}
function isElement(
node: AST.MustacheStatement | AST.SubExpression,
hasLocal: (k: string) => boolean
): node is (AST.MustacheStatement | AST.SubExpression) & { path: AST.PathExpression } {
return isPath(node.path) && node.path.original === 'element' && !hasLocal('element');
}