@glint/ember-tsc 1.6.0 → 1.6.2

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 (131) hide show
  1. package/README.md +1 -0
  2. package/lib/cli/run-volar-tsc.d.ts +2 -0
  3. package/lib/cli/run-volar-tsc.d.ts.map +1 -0
  4. package/lib/cli/run-volar-tsc.js +32 -0
  5. package/lib/cli/run-volar-tsc.js.map +1 -0
  6. package/lib/config/config.d.ts +15 -0
  7. package/lib/config/config.d.ts.map +1 -0
  8. package/lib/config/config.js +21 -0
  9. package/lib/config/config.js.map +1 -0
  10. package/lib/config/environment.d.ts +26 -0
  11. package/lib/config/environment.d.ts.map +1 -0
  12. package/lib/config/environment.js +96 -0
  13. package/lib/config/environment.js.map +1 -0
  14. package/lib/config/index.d.ts +24 -0
  15. package/lib/config/index.d.ts.map +1 -0
  16. package/lib/config/index.js +37 -0
  17. package/lib/config/index.js.map +1 -0
  18. package/lib/config/loader.d.ts +28 -0
  19. package/lib/config/loader.d.ts.map +1 -0
  20. package/lib/config/loader.js +121 -0
  21. package/lib/config/loader.js.map +1 -0
  22. package/lib/config/types.cjs +3 -0
  23. package/lib/config/types.cjs.map +1 -0
  24. package/lib/config/types.d.cts +60 -0
  25. package/lib/config/types.d.cts.map +1 -0
  26. package/lib/environment-ember-template-imports/-private/environment/common.d.ts +13 -0
  27. package/lib/environment-ember-template-imports/-private/environment/common.d.ts.map +1 -0
  28. package/lib/environment-ember-template-imports/-private/environment/common.js +2 -0
  29. package/lib/environment-ember-template-imports/-private/environment/common.js.map +1 -0
  30. package/lib/environment-ember-template-imports/-private/environment/index.d.ts +3 -0
  31. package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +1 -0
  32. package/lib/environment-ember-template-imports/-private/environment/index.js +102 -0
  33. package/lib/environment-ember-template-imports/-private/environment/index.js.map +1 -0
  34. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts +4 -0
  35. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +1 -0
  36. package/lib/environment-ember-template-imports/-private/environment/preprocess.js +42 -0
  37. package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +1 -0
  38. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts +4 -0
  39. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +1 -0
  40. package/lib/environment-ember-template-imports/-private/environment/transform.js +134 -0
  41. package/lib/environment-ember-template-imports/-private/environment/transform.js.map +1 -0
  42. package/lib/index.d.ts +7 -0
  43. package/lib/index.d.ts.map +1 -0
  44. package/lib/index.js +6 -0
  45. package/lib/index.js.map +1 -0
  46. package/lib/plugins/g-compiler-errors.d.ts +12 -0
  47. package/lib/plugins/g-compiler-errors.d.ts.map +1 -0
  48. package/lib/plugins/g-compiler-errors.js +58 -0
  49. package/lib/plugins/g-compiler-errors.js.map +1 -0
  50. package/lib/plugins/g-component-hover.d.ts +24 -0
  51. package/lib/plugins/g-component-hover.d.ts.map +1 -0
  52. package/lib/plugins/g-component-hover.js +135 -0
  53. package/lib/plugins/g-component-hover.js.map +1 -0
  54. package/lib/plugins/g-template-tag-symbols.d.ts +11 -0
  55. package/lib/plugins/g-template-tag-symbols.d.ts.map +1 -0
  56. package/lib/plugins/g-template-tag-symbols.js +48 -0
  57. package/lib/plugins/g-template-tag-symbols.js.map +1 -0
  58. package/lib/plugins/utils.d.ts +25 -0
  59. package/lib/plugins/utils.d.ts.map +1 -0
  60. package/lib/plugins/utils.js +63 -0
  61. package/lib/plugins/utils.js.map +1 -0
  62. package/lib/transform/diagnostics/augmentation.d.ts +4 -0
  63. package/lib/transform/diagnostics/augmentation.d.ts.map +1 -0
  64. package/lib/transform/diagnostics/augmentation.js +249 -0
  65. package/lib/transform/diagnostics/augmentation.js.map +1 -0
  66. package/lib/transform/diagnostics/index.d.ts +5 -0
  67. package/lib/transform/diagnostics/index.d.ts.map +1 -0
  68. package/lib/transform/diagnostics/index.js +2 -0
  69. package/lib/transform/diagnostics/index.js.map +1 -0
  70. package/lib/transform/index.d.ts +4 -0
  71. package/lib/transform/index.d.ts.map +1 -0
  72. package/lib/transform/index.js +2 -0
  73. package/lib/transform/index.js.map +1 -0
  74. package/lib/transform/template/code-features.d.ts +30 -0
  75. package/lib/transform/template/code-features.d.ts.map +1 -0
  76. package/lib/transform/template/code-features.js +26 -0
  77. package/lib/transform/template/code-features.js.map +1 -0
  78. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +80 -0
  79. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +1 -0
  80. package/lib/transform/template/glimmer-ast-mapping-tree.js +132 -0
  81. package/lib/transform/template/glimmer-ast-mapping-tree.js.map +1 -0
  82. package/lib/transform/template/inlining/index.d.ts +16 -0
  83. package/lib/transform/template/inlining/index.d.ts.map +1 -0
  84. package/lib/transform/template/inlining/index.js +21 -0
  85. package/lib/transform/template/inlining/index.js.map +1 -0
  86. package/lib/transform/template/inlining/tagged-strings.d.ts +8 -0
  87. package/lib/transform/template/inlining/tagged-strings.d.ts.map +1 -0
  88. package/lib/transform/template/inlining/tagged-strings.js +156 -0
  89. package/lib/transform/template/inlining/tagged-strings.js.map +1 -0
  90. package/lib/transform/template/map-template-contents.d.ts +121 -0
  91. package/lib/transform/template/map-template-contents.d.ts.map +1 -0
  92. package/lib/transform/template/map-template-contents.js +287 -0
  93. package/lib/transform/template/map-template-contents.js.map +1 -0
  94. package/lib/transform/template/rewrite-module.d.ts +22 -0
  95. package/lib/transform/template/rewrite-module.d.ts.map +1 -0
  96. package/lib/transform/template/rewrite-module.js +265 -0
  97. package/lib/transform/template/rewrite-module.js.map +1 -0
  98. package/lib/transform/template/scope-stack.d.ts +13 -0
  99. package/lib/transform/template/scope-stack.d.ts.map +1 -0
  100. package/lib/transform/template/scope-stack.js +28 -0
  101. package/lib/transform/template/scope-stack.js.map +1 -0
  102. package/lib/transform/template/template-to-typescript.d.ts +19 -0
  103. package/lib/transform/template/template-to-typescript.d.ts.map +1 -0
  104. package/lib/transform/template/template-to-typescript.js +1125 -0
  105. package/lib/transform/template/template-to-typescript.js.map +1 -0
  106. package/lib/transform/template/transformed-module.d.ts +111 -0
  107. package/lib/transform/template/transformed-module.d.ts.map +1 -0
  108. package/lib/transform/template/transformed-module.js +287 -0
  109. package/lib/transform/template/transformed-module.js.map +1 -0
  110. package/lib/transform/util.d.ts +7 -0
  111. package/lib/transform/util.d.ts.map +1 -0
  112. package/lib/transform/util.js +15 -0
  113. package/lib/transform/util.js.map +1 -0
  114. package/lib/volar/ember-language-plugin.d.ts +14 -0
  115. package/lib/volar/ember-language-plugin.d.ts.map +1 -0
  116. package/lib/volar/ember-language-plugin.js +91 -0
  117. package/lib/volar/ember-language-plugin.js.map +1 -0
  118. package/lib/volar/gts-virtual-code.d.ts +83 -0
  119. package/lib/volar/gts-virtual-code.d.ts.map +1 -0
  120. package/lib/volar/gts-virtual-code.js +210 -0
  121. package/lib/volar/gts-virtual-code.js.map +1 -0
  122. package/lib/volar/language-server.d.ts +2 -0
  123. package/lib/volar/language-server.d.ts.map +1 -0
  124. package/lib/volar/language-server.js +180 -0
  125. package/lib/volar/language-server.js.map +1 -0
  126. package/lib/volar/script-snapshot.d.ts +17 -0
  127. package/lib/volar/script-snapshot.d.ts.map +1 -0
  128. package/lib/volar/script-snapshot.js +24 -0
  129. package/lib/volar/script-snapshot.js.map +1 -0
  130. package/package.json +4 -4
  131. package/src/transform/template/inlining/tagged-strings.ts +21 -1
@@ -0,0 +1,102 @@
1
+ import { preprocess } from './preprocess.js';
2
+ import { transform } from './transform.js';
3
+ export default function emberTemplateImportsEnvironment(options) {
4
+ let additionalSpecialForms = typeof options['additionalSpecialForms'] === 'object'
5
+ ? options['additionalSpecialForms']
6
+ : {};
7
+ const additionalGlobalSpecialForms = additionalSpecialForms.globals ?? {};
8
+ const additionalGlobals = Array.isArray(options['additionalGlobals'])
9
+ ? options['additionalGlobals']
10
+ : [];
11
+ const globalsForEmber = [
12
+ 'action',
13
+ 'component',
14
+ 'debugger',
15
+ 'each',
16
+ 'each-in',
17
+ 'has-block',
18
+ 'has-block-params',
19
+ 'helper',
20
+ 'if',
21
+ 'in-element',
22
+ 'let',
23
+ 'log',
24
+ 'modifier',
25
+ 'mount',
26
+ 'mut',
27
+ 'outlet',
28
+ 'unbound',
29
+ 'unless',
30
+ 'with',
31
+ 'yield',
32
+ ];
33
+ /*
34
+ Ember 7.1+ built-in keywords (RFCs 389, 470, 560, 561, 562, 997, 998, 999,
35
+ 1000). Their template-side signatures live in `KeywordsForEmber71` in
36
+ `types/-private/dsl/globals.d.ts` and are gated on `ember-source >= 7.1.0`
37
+ via the `HasEmber71BuiltIns` probe.
38
+ */
39
+ const globalsForEmber71 = [
40
+ 'and',
41
+ 'array',
42
+ 'element',
43
+ 'eq',
44
+ 'fn',
45
+ 'gt',
46
+ 'gte',
47
+ 'hash',
48
+ 'lt',
49
+ 'lte',
50
+ 'neq',
51
+ 'not',
52
+ 'on',
53
+ 'or',
54
+ ];
55
+ return {
56
+ tags: {
57
+ '@glint/ember-tsc/environment-ember-template-imports/-private/tag': {
58
+ hbs: {
59
+ typesModule: '@glint/ember-tsc/-private/dsl',
60
+ specialForms: {
61
+ globals: {
62
+ if: 'if',
63
+ unless: 'if-not',
64
+ yield: 'yield',
65
+ component: 'bind-invokable',
66
+ modifier: 'bind-invokable',
67
+ helper: 'bind-invokable',
68
+ ...additionalGlobalSpecialForms,
69
+ },
70
+ imports: {
71
+ '@ember/helper': {
72
+ array: 'array-literal',
73
+ hash: 'object-literal',
74
+ ...additionalSpecialForms.imports?.['@ember/helper'],
75
+ },
76
+ ...additionalSpecialForms.imports,
77
+ },
78
+ },
79
+ globals: [
80
+ ...globalsForEmber,
81
+ ...globalsForEmber71,
82
+ ...Object.keys(additionalGlobalSpecialForms),
83
+ ...additionalGlobals,
84
+ ],
85
+ },
86
+ },
87
+ },
88
+ extensions: {
89
+ '.gts': {
90
+ kind: 'typed-script',
91
+ preprocess,
92
+ transform,
93
+ },
94
+ '.gjs': {
95
+ kind: 'untyped-script',
96
+ preprocess,
97
+ transform,
98
+ },
99
+ },
100
+ };
101
+ }
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/environment-ember-template-imports/-private/environment/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,+BAA+B,CACrD,OAAgC;IAEhC,IAAI,sBAAsB,GACxB,OAAO,OAAO,CAAC,wBAAwB,CAAC,KAAK,QAAQ;QACnD,CAAC,CAAE,OAAO,CAAC,wBAAwB,CAA4B;QAC/D,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,4BAA4B,GAAG,sBAAsB,CAAC,OAAO,IAAI,EAAE,CAAC;IAE1E,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACnE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,eAAe,GAAG;QACtB,QAAQ;QACR,WAAW;QACX,UAAU;QACV,MAAM;QACN,SAAS;QACT,WAAW;QACX,kBAAkB;QAClB,QAAQ;QACR,IAAI;QACJ,YAAY;QACZ,KAAK;QACL,KAAK;QACL,UAAU;QACV,OAAO;QACP,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,MAAM;QACN,OAAO;KACR,CAAC;IAEF;;;;;MAKE;IACF,MAAM,iBAAiB,GAAG;QACxB,KAAK;QACL,OAAO;QACP,SAAS;QACT,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,MAAM;QACN,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,IAAI;QACJ,IAAI;KACL,CAAC;IAEF,OAAO;QACL,IAAI,EAAE;YACJ,kEAAkE,EAAE;gBAClE,GAAG,EAAE;oBACH,WAAW,EAAE,+BAA+B;oBAC5C,YAAY,EAAE;wBACZ,OAAO,EAAE;4BACP,EAAE,EAAE,IAAI;4BACR,MAAM,EAAE,QAAQ;4BAChB,KAAK,EAAE,OAAO;4BACd,SAAS,EAAE,gBAAgB;4BAC3B,QAAQ,EAAE,gBAAgB;4BAC1B,MAAM,EAAE,gBAAgB;4BACxB,GAAG,4BAA4B;yBAChC;wBACD,OAAO,EAAE;4BACP,eAAe,EAAE;gCACf,KAAK,EAAE,eAAe;gCACtB,IAAI,EAAE,gBAAgB;gCACtB,GAAG,sBAAsB,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC;6BACrD;4BACD,GAAG,sBAAsB,CAAC,OAAO;yBAClC;qBACF;oBACD,OAAO,EAAE;wBACP,GAAG,eAAe;wBAClB,GAAG,iBAAiB;wBACpB,GAAG,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;wBAC5C,GAAG,iBAAiB;qBACrB;iBACF;aACF;SACF;QACD,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,cAAc;gBACpB,UAAU;gBACV,SAAS;aACV;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,gBAAgB;gBACtB,UAAU;gBACV,SAAS;aACV;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { GlintExtensionPreprocess } from '@glint/ember-tsc/config-types';
2
+ import { PreprocessData } from './common.js';
3
+ export declare const preprocess: GlintExtensionPreprocess<PreprocessData>;
4
+ //# sourceMappingURL=preprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.d.ts","sourceRoot":"","sources":["../../../../src/environment-ember-template-imports/-private/environment/preprocess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAc,cAAc,EAAoB,MAAM,aAAa,CAAC;AAQ3E,eAAO,MAAM,UAAU,EAAE,wBAAwB,CAAC,cAAc,CA0C/D,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { GLOBAL_TAG } from './common.js';
2
+ const TEMPLATE_START = `[${GLOBAL_TAG}\``;
3
+ const TEMPLATE_END = '`]';
4
+ import { Preprocessor } from 'content-tag';
5
+ const p = new Preprocessor();
6
+ export const preprocess = (source, path) => {
7
+ let templates = p.parse(source, { filename: path });
8
+ let templateLocations = [];
9
+ let contents = '';
10
+ let sourceOffset = 0;
11
+ for (let template of templates) {
12
+ let startTagOffset = template.startRange.startUtf16Codepoint;
13
+ let startTagEnd = template.startRange.endUtf16Codepoint;
14
+ let endTagOffset = template.endRange.startUtf16Codepoint;
15
+ let endTagEnd = template.endRange.endUtf16Codepoint;
16
+ contents += source.slice(sourceOffset, startTagOffset);
17
+ let transformedStart = contents.length;
18
+ contents += TEMPLATE_START;
19
+ let templateContent = source.slice(startTagEnd, endTagOffset);
20
+ let escapedContent = templateContent.replaceAll('${{', '\\${{').replaceAll('`', '\\`');
21
+ contents += escapedContent;
22
+ contents += TEMPLATE_END;
23
+ let transformedEnd = contents.length;
24
+ sourceOffset = endTagEnd;
25
+ templateLocations.push({
26
+ startTagOffset,
27
+ endTagOffset,
28
+ startTagLength: startTagEnd - startTagOffset,
29
+ endTagLength: endTagEnd - endTagOffset,
30
+ transformedStart,
31
+ transformedEnd,
32
+ });
33
+ }
34
+ contents += source.slice(sourceOffset);
35
+ return {
36
+ contents,
37
+ data: {
38
+ templateLocations,
39
+ },
40
+ };
41
+ };
42
+ //# sourceMappingURL=preprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.js","sourceRoot":"","sources":["../../../../src/environment-ember-template-imports/-private/environment/preprocess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAoC,MAAM,aAAa,CAAC;AAE3E,MAAM,cAAc,GAAG,IAAI,UAAU,IAAI,CAAC;AAC1C,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,MAAM,CAAC,GAAG,IAAI,YAAY,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAA6C,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IACnF,IAAI,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,IAAI,iBAAiB,GAA4B,EAAE,CAAC;IACpD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAC7D,IAAI,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACxD,IAAI,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACzD,IAAI,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAEpD,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAEvD,IAAI,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvC,QAAQ,IAAI,cAAc,CAAC;QAE3B,IAAI,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,cAAc,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvF,QAAQ,IAAI,cAAc,CAAC;QAC3B,QAAQ,IAAI,YAAY,CAAC;QACzB,IAAI,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;QAErC,YAAY,GAAG,SAAS,CAAC;QACzB,iBAAiB,CAAC,IAAI,CAAC;YACrB,cAAc;YACd,YAAY;YACZ,cAAc,EAAE,WAAW,GAAG,cAAc;YAC5C,YAAY,EAAE,SAAS,GAAG,YAAY;YACtC,gBAAgB;YAChB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO;QACL,QAAQ;QACR,IAAI,EAAE;YACJ,iBAAiB;SAClB;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { GlintExtensionTransform } from '@glint/ember-tsc/config-types';
2
+ import { PreprocessData } from './common.js';
3
+ export declare const transform: GlintExtensionTransform<PreprocessData>;
4
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../../src/environment-ember-template-imports/-private/environment/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAc,cAAc,EAAoB,MAAM,aAAa,CAAC;AAI3E,eAAO,MAAM,SAAS,EAAE,uBAAuB,CAAC,cAAc,CA6D7D,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { GLOBAL_TAG } from './common.js';
2
+ export const transform = (data, { ts, context, setEmitMetadata }) => {
3
+ let f = ts.factory;
4
+ let { templateLocations } = data;
5
+ if (!templateLocations.length)
6
+ return (sf) => sf;
7
+ return function visit(node) {
8
+ let visitedNode = ts.visitEachChild(node, visit, context);
9
+ let transformedNode = transformNode(visitedNode);
10
+ return repairAncestry(transformedNode);
11
+ };
12
+ function transformNode(node) {
13
+ if (ts.isSourceFile(node)) {
14
+ // Add `import { hbs as __T } from 'ember-template-imports'` to the file
15
+ return addTagImport(f, node);
16
+ }
17
+ else if (isETIDefaultTemplate(ts, node)) {
18
+ // Annotate that this template is a default export
19
+ setEmitMetadata(node.expression, { prepend: 'export default ' });
20
+ return node;
21
+ }
22
+ else if (isETIDefaultSatisfiesTemplate(ts, node)) {
23
+ // Annotate that this template is a default export
24
+ setEmitMetadata(node.expression.expression, { prepend: 'export default ' });
25
+ return node;
26
+ }
27
+ else if (isETITemplateExpression(ts, node)) {
28
+ // Convert '[__T`foo`]' as an expression to just '__T`foo`'
29
+ let location = findTemplateLocation(templateLocations, node);
30
+ let template = node.elements[0];
31
+ setEmitMetadata(template, {
32
+ templateLocation: {
33
+ start: location.startTagOffset,
34
+ end: location.endTagOffset + location.endTagLength,
35
+ contentStart: location.startTagOffset + location.startTagLength,
36
+ contentEnd: location.endTagOffset,
37
+ },
38
+ });
39
+ return template;
40
+ }
41
+ else if (isETITemplateProperty(ts, node)) {
42
+ // Convert '[__T`foo`]' in a class body to 'static { __T`foo` }'
43
+ let location = findTemplateLocation(templateLocations, node);
44
+ let template = node.name.expression;
45
+ setEmitMetadata(template, {
46
+ prepend: 'static { ',
47
+ append: ' }',
48
+ templateLocation: {
49
+ start: location.startTagOffset,
50
+ end: location.endTagOffset + location.endTagLength,
51
+ contentStart: location.startTagOffset + location.startTagLength,
52
+ contentEnd: location.endTagOffset,
53
+ },
54
+ });
55
+ return buildStaticBlockForTemplate(f, template);
56
+ }
57
+ return node;
58
+ }
59
+ };
60
+ // Many location operations in the TS AST rely on having an unbroken chain
61
+ // of `.parent` values fron a given node up to its containing `SourceFile`,
62
+ // but its transformation framework does not maintain these by default,
63
+ // so we explicitly reconnect nodes as we go.
64
+ function repairAncestry(node, parent = node.parent) {
65
+ // If the node already has a parent AND it's correct, we don't need
66
+ // to descend further.
67
+ if (parent && node.parent === parent)
68
+ return node;
69
+ Object.assign(node, { parent });
70
+ node.forEachChild((child) => {
71
+ repairAncestry(child, node);
72
+ });
73
+ return node;
74
+ }
75
+ function addTagImport(f, sourceFile) {
76
+ return f.updateSourceFile(sourceFile, [
77
+ f.createImportDeclaration([], f.createImportClause(false, undefined, f.createNamedImports([
78
+ f.createImportSpecifier(false, f.createIdentifier('hbs'), f.createIdentifier(GLOBAL_TAG)),
79
+ ])), f.createStringLiteral('@glint/ember-tsc/environment-ember-template-imports/-private/tag')),
80
+ ...sourceFile.statements,
81
+ ]);
82
+ }
83
+ /**
84
+ * Implicit default export:
85
+ *
86
+ * ( <template></template> )
87
+ * ^ ExpressionStatement
88
+ *
89
+ * ( <template></template> satisfies ... )
90
+ * ^ SatisfiesExpression
91
+ *
92
+ * But!
93
+ *
94
+ * ( const X = <template></template> satisfies ... )
95
+ * ^ VariableStatement
96
+ *
97
+ * So when we check for a wrapping SatisfiesExpression, we need to also make sure
98
+ * the parent node is not a variable Statement.
99
+ */
100
+ function isETIDefaultTemplate(ts, node) {
101
+ return ts.isExpressionStatement(node) && isETITemplateLiteral(ts, node.expression);
102
+ }
103
+ function isETIDefaultSatisfiesTemplate(ts, node) {
104
+ return (ts.isExpressionStatement(node) &&
105
+ ts.isSatisfiesExpression(node.expression) &&
106
+ isETITemplateLiteral(ts, node.expression.expression));
107
+ }
108
+ function isETITemplateProperty(ts, node) {
109
+ return (ts.isPropertyDeclaration(node) &&
110
+ ts.isComputedPropertyName(node.name) &&
111
+ isETITemplateLiteral(ts, node.name.expression));
112
+ }
113
+ function isETITemplateExpression(ts, node) {
114
+ return (ts.isArrayLiteralExpression(node) &&
115
+ node.elements.length === 1 &&
116
+ isETITemplateLiteral(ts, node.elements[0]));
117
+ }
118
+ function isETITemplateLiteral(ts, node) {
119
+ return (ts.isTaggedTemplateExpression(node) &&
120
+ ts.isNoSubstitutionTemplateLiteral(node.template) &&
121
+ ts.isIdentifier(node.tag) &&
122
+ node.tag.text === GLOBAL_TAG);
123
+ }
124
+ function findTemplateLocation(locations, node) {
125
+ let location = locations.find((loc) => loc.transformedStart === node.getStart());
126
+ if (!location) {
127
+ throw new Error('Internal error: missing location info for template');
128
+ }
129
+ return location;
130
+ }
131
+ function buildStaticBlockForTemplate(f, template) {
132
+ return f.createClassStaticBlockDeclaration(f.createBlock([f.createExpressionStatement(template)]));
133
+ }
134
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/environment-ember-template-imports/-private/environment/transform.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { GlintConfig, loadConfig, findConfig, createDefaultConfig } from './config/index.js';
2
+ import { createEmberLanguagePlugin } from './volar/ember-language-plugin.js';
3
+ import { VirtualGtsCode } from './volar/gts-virtual-code.js';
4
+ import { augmentDiagnostics } from './transform/diagnostics/augmentation.js';
5
+ export { loadConfig, findConfig, createDefaultConfig, createEmberLanguagePlugin, VirtualGtsCode, augmentDiagnostics, };
6
+ export type { GlintConfig };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EACL,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,kBAAkB,GACnB,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { loadConfig, findConfig, createDefaultConfig } from './config/index.js';
2
+ import { createEmberLanguagePlugin } from './volar/ember-language-plugin.js';
3
+ import { VirtualGtsCode } from './volar/gts-virtual-code.js';
4
+ import { augmentDiagnostics } from './transform/diagnostics/augmentation.js';
5
+ export { loadConfig, findConfig, createDefaultConfig, createEmberLanguagePlugin, VirtualGtsCode, augmentDiagnostics, };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EACL,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,kBAAkB,GACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ /**
3
+ * This LanguageServicePlugin surfaces compiler/syntax errors as diagnostics
4
+ * within .gts/.gjs files, e.g. if there is an unclosed html tag or `{{` curly brace,
5
+ * the entire `<template>` tag region will be highlighted as an error.
6
+ *
7
+ * @GLINT_FEATURE_DIAGNOSTICS
8
+ * @GLINT_FEATURE_DIAGNOSTICS_LANGUAGE_SERVER
9
+ * @GLINT_FEATURE_DIAGNOSTICS_LANGUAGE_SERVER_GTS_COMPILER_ERRORS
10
+ */
11
+ export declare function create(): LanguageServicePlugin;
12
+ //# sourceMappingURL=g-compiler-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"g-compiler-errors.d.ts","sourceRoot":"","sources":["../../src/plugins/g-compiler-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIrE;;;;;;;;GAQG;AACH,wBAAgB,MAAM,IAAI,qBAAqB,CAqD9C"}
@@ -0,0 +1,58 @@
1
+ import { getEmbeddedInfo } from './utils.js';
2
+ /**
3
+ * This LanguageServicePlugin surfaces compiler/syntax errors as diagnostics
4
+ * within .gts/.gjs files, e.g. if there is an unclosed html tag or `{{` curly brace,
5
+ * the entire `<template>` tag region will be highlighted as an error.
6
+ *
7
+ * @GLINT_FEATURE_DIAGNOSTICS
8
+ * @GLINT_FEATURE_DIAGNOSTICS_LANGUAGE_SERVER
9
+ * @GLINT_FEATURE_DIAGNOSTICS_LANGUAGE_SERVER_GTS_COMPILER_ERRORS
10
+ */
11
+ export function create() {
12
+ return {
13
+ name: 'g-compiler-errors',
14
+ capabilities: {
15
+ diagnosticProvider: {
16
+ interFileDependencies: false,
17
+ workspaceDiagnostics: false,
18
+ },
19
+ },
20
+ create(context) {
21
+ return {
22
+ provideDiagnostics(document) {
23
+ // `gts` is the ID of the root virtual code within the virtual/embedded code tree of our GtsVirtualCode.
24
+ // It is the untransformed .gts file; we use this file to generate diagnostics for
25
+ // `<template>` tag compiler errors because the diagnostic regions within the errors
26
+ // we get back from the compiler are already relative to the root/outer .gts file
27
+ // rather than relative to start of the template tag.
28
+ const info = getEmbeddedInfo(context, document, 'gts');
29
+ if (!info) {
30
+ return;
31
+ }
32
+ const virtualCode = info.root;
33
+ const transformedModule = virtualCode.transformedModule;
34
+ if (!transformedModule) {
35
+ return;
36
+ }
37
+ const parseErrors = [];
38
+ for (const error of transformedModule.errors) {
39
+ const start = document.positionAt(error.location.start);
40
+ const end = document.positionAt(error.location.end);
41
+ parseErrors.push({
42
+ range: {
43
+ start: start,
44
+ end: end,
45
+ },
46
+ severity: 1,
47
+ code: 9999,
48
+ source: 'glint',
49
+ message: error.message,
50
+ });
51
+ }
52
+ return parseErrors;
53
+ },
54
+ };
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=g-compiler-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"g-compiler-errors.js","sourceRoot":"","sources":["../../src/plugins/g-compiler-errors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,YAAY,EAAE;YACZ,kBAAkB,EAAE;gBAClB,qBAAqB,EAAE,KAAK;gBAC5B,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,MAAM,CAAC,OAAO;YACZ,OAAO;gBACL,kBAAkB,CAAC,QAAQ;oBACzB,wGAAwG;oBACxG,kFAAkF;oBAClF,oFAAoF;oBACpF,iFAAiF;oBACjF,qDAAqD;oBACrD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;oBAE9B,MAAM,iBAAiB,GAAG,WAAW,CAAC,iBAAiB,CAAC;oBACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACvB,OAAO;oBACT,CAAC;oBAED,MAAM,WAAW,GAAwB,EAAE,CAAC;oBAE5C,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;wBAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAEpD,WAAW,CAAC,IAAI,CAAC;4BACf,KAAK,EAAE;gCACL,KAAK,EAAE,KAAK;gCACZ,GAAG,EAAE,GAAG;6BACT;4BACD,QAAQ,EAAE,CAAkD;4BAC5D,IAAI,EAAE,IAAI;4BACV,MAAM,EAAE,OAAO;4BACf,OAAO,EAAE,KAAK,CAAC,OAAO;yBACvB,CAAC,CAAC;oBACL,CAAC;oBAED,OAAO,WAAW,CAAC;gBACrB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ export interface ComponentMeta {
3
+ args: Array<{
4
+ name: string;
5
+ type: string;
6
+ description: string;
7
+ required: boolean;
8
+ tags: Array<{
9
+ name: string;
10
+ text?: string;
11
+ }>;
12
+ }>;
13
+ blocks: Array<{
14
+ name: string;
15
+ params: string;
16
+ }>;
17
+ element: string | null;
18
+ description: string;
19
+ }
20
+ export type TsPluginClient = {
21
+ getComponentMeta(fileName: string, tagName: string): Promise<ComponentMeta | null>;
22
+ };
23
+ export declare function create(getTsPluginClient: () => TsPluginClient | undefined): LanguageServicePlugin;
24
+ //# sourceMappingURL=g-component-hover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"g-component-hover.d.ts","sourceRoot":"","sources":["../../src/plugins/g-component-hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKrE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,CAAC;QACV,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;CACpF,CAAC;AAEF,wBAAgB,MAAM,CAAC,iBAAiB,EAAE,MAAM,cAAc,GAAG,SAAS,GAAG,qBAAqB,CA6CjG"}
@@ -0,0 +1,135 @@
1
+ import { getEmbeddedInfo } from './utils.js';
2
+ export function create(getTsPluginClient) {
3
+ return {
4
+ name: 'g-component-hover',
5
+ capabilities: {
6
+ hoverProvider: true,
7
+ },
8
+ create(_context) {
9
+ return {
10
+ async provideHover(document, position) {
11
+ const info = getEmbeddedInfo(_context, document, 'gts');
12
+ if (!info)
13
+ return;
14
+ const { root } = info;
15
+ const transformedModule = root.transformedModule;
16
+ if (!transformedModule)
17
+ return;
18
+ const offset = document.offsetAt(position);
19
+ const componentInfo = findComponentAtOffset(transformedModule, offset);
20
+ if (!componentInfo)
21
+ return;
22
+ const tsPluginClient = getTsPluginClient();
23
+ if (!tsPluginClient)
24
+ return;
25
+ const filePath = info.sourceScript.id.fsPath;
26
+ const meta = await tsPluginClient.getComponentMeta(filePath, componentInfo.tagName);
27
+ if (!meta)
28
+ return;
29
+ const content = formatComponentHover(componentInfo.tagName, meta);
30
+ if (!content)
31
+ return;
32
+ return {
33
+ range: {
34
+ start: document.positionAt(componentInfo.tagStart),
35
+ end: document.positionAt(componentInfo.tagEnd),
36
+ },
37
+ contents: {
38
+ kind: 'markdown',
39
+ value: content,
40
+ },
41
+ };
42
+ },
43
+ };
44
+ },
45
+ };
46
+ }
47
+ function findComponentAtOffset(transformedModule, offset) {
48
+ for (const span of transformedModule.correlatedSpans) {
49
+ if (!span.glimmerAstMapping)
50
+ continue;
51
+ if (offset < span.originalStart || offset >= span.originalStart + span.originalLength)
52
+ continue;
53
+ const relativeOffset = offset - span.originalStart;
54
+ const elementNode = findElementNodeInTree(span.glimmerAstMapping, relativeOffset);
55
+ if (!elementNode)
56
+ continue;
57
+ if (elementNode.sourceNode.type !== 'ElementNode')
58
+ continue;
59
+ const tagName = elementNode.sourceNode.tag;
60
+ const firstChar = tagName.charAt(0);
61
+ // Components are PascalCase or namespaced (Foo.Bar)
62
+ if (firstChar !== firstChar.toUpperCase() && !tagName.includes('.')) {
63
+ return null; // plain element
64
+ }
65
+ const elementStart = span.originalStart + elementNode.originalRange.start;
66
+ const source = span.originalFile.contents;
67
+ const tagNameIdx = source.indexOf(tagName, elementStart);
68
+ const tagStart = tagNameIdx >= 0 ? tagNameIdx : elementStart;
69
+ const tagEnd = tagStart + tagName.length;
70
+ return { tagName, tagStart, tagEnd };
71
+ }
72
+ return null;
73
+ }
74
+ function findElementNodeInTree(tree, offset) {
75
+ if (offset < tree.originalRange.start || offset >= tree.originalRange.end) {
76
+ return null;
77
+ }
78
+ // Check children first (depth-first, find the deepest ElementNode)
79
+ for (const child of tree.children) {
80
+ const result = findElementNodeInTree(child, offset);
81
+ if (result)
82
+ return result;
83
+ }
84
+ if (tree.sourceNode?.type === 'ElementNode') {
85
+ return tree;
86
+ }
87
+ return null;
88
+ }
89
+ function formatComponentHover(tagName, meta) {
90
+ const hasArgs = meta.args.length > 0;
91
+ const hasBlocks = meta.blocks.length > 0;
92
+ const hasElement = meta.element && meta.element !== 'unknown' && meta.element !== 'null';
93
+ if (!hasArgs && !hasBlocks && !hasElement && !meta.description)
94
+ return null;
95
+ const lines = [];
96
+ if (meta.description) {
97
+ lines.push(meta.description);
98
+ lines.push('');
99
+ }
100
+ lines.push('```typescript');
101
+ lines.push(`interface ${tagName}Signature {`);
102
+ if (hasElement) {
103
+ lines.push(` Element: ${meta.element}`);
104
+ }
105
+ if (hasArgs) {
106
+ lines.push(' Args: {');
107
+ for (const arg of meta.args) {
108
+ const opt = arg.required ? '' : '?';
109
+ const deprecatedTag = arg.tags.find((t) => t.name === 'deprecated');
110
+ if (deprecatedTag) {
111
+ // Strike through only the property name using Unicode combining
112
+ // strikethrough (U+0336) — keeps the type readable and syntax-highlighted.
113
+ const reason = deprecatedTag.text ? ` ${deprecatedTag.text}` : '';
114
+ const struckName = arg.name.split('').join('\u0336') + '\u0336';
115
+ lines.push(` ${struckName}${opt}: ${arg.type} // @deprecated${reason}`);
116
+ }
117
+ else {
118
+ const comment = arg.description ? ` // ${arg.description}` : '';
119
+ lines.push(` ${arg.name}${opt}: ${arg.type}${comment}`);
120
+ }
121
+ }
122
+ lines.push(' }');
123
+ }
124
+ if (hasBlocks) {
125
+ lines.push(' Blocks: {');
126
+ for (const block of meta.blocks) {
127
+ lines.push(` ${block.name}: ${block.params}`);
128
+ }
129
+ lines.push(' }');
130
+ }
131
+ lines.push('}');
132
+ lines.push('```');
133
+ return lines.join('\n');
134
+ }
135
+ //# sourceMappingURL=g-component-hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"g-component-hover.js","sourceRoot":"","sources":["../../src/plugins/g-component-hover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ /**
3
+ * Provides symbols for `<template>` tags within .gts/.gjs files.
4
+ * This among other things faciliates code folding of the `<template>` region.
5
+ *
6
+ * Note that this ONLY provides symbols for the `<template>` tag and none of the
7
+ * contents of the template tag. Symbols inside or outside the template tag are actually
8
+ * generated by the syntactic TS LanguageServicePlugin (search `createTypeScriptSyntacticPlugin`).
9
+ */
10
+ export declare function create(): LanguageServicePlugin;
11
+ //# sourceMappingURL=g-template-tag-symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"g-template-tag-symbols.d.ts","sourceRoot":"","sources":["../../src/plugins/g-template-tag-symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIrE;;;;;;;GAOG;AACH,wBAAgB,MAAM,IAAI,qBAAqB,CAyC9C"}