@glint/ember-tsc 1.6.0 → 1.6.1

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 (130) 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 +140 -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 +1 -1
@@ -0,0 +1,287 @@
1
+ import { preprocess } from '@glimmer/syntax';
2
+ import { assert } from '../util.js';
3
+ import { codeFeatures } from './code-features.js';
4
+ import GlimmerASTMappingTree, { TemplateEmbedding, } from './glimmer-ast-mapping-tree.js';
5
+ /**
6
+ * @glimmer/syntax parses identifiers as strings. Aside from meaning
7
+ * we often have to reverse engineer location information for them
8
+ * by hand, it also means we can't treat mappings from identifiers
9
+ * consistently with how we treat mappings from other AST nodes.
10
+ *
11
+ * This class just gives us a uniform way to store identifiers
12
+ * or other nodes as the `source` for a mapping.
13
+ */
14
+ export class Identifier {
15
+ constructor(name) {
16
+ this.name = name;
17
+ this.type = 'Identifier';
18
+ }
19
+ }
20
+ /**
21
+ * Given the text of a handlebars template (either standalone .hbs file, or the contents
22
+ * of an embedded `<template>...</template>` within a .gts file), invokes the given callback
23
+ * with a set of tools to emit mapped contents corresponding to
24
+ * that template, tracking the text emitted in order to provide
25
+ * a mapping of ranges in the input to ranges in the output.
26
+ */
27
+ export function mapTemplateContents(template, { embeddingSyntax }, callback) {
28
+ let ast = null;
29
+ let errors = [];
30
+ let lineOffsets = calculateLineOffsets(template, embeddingSyntax.prefix.length);
31
+ try {
32
+ ast = preprocess(template);
33
+ }
34
+ catch (error) {
35
+ let message = getErrorMessage(error);
36
+ let location;
37
+ if (isHBSSyntaxError(error)) {
38
+ location = {
39
+ start: lineOffsets[error.hash.loc.first_line] + error.hash.loc.first_column,
40
+ end: lineOffsets[error.hash.loc.last_line] + error.hash.loc.last_column,
41
+ };
42
+ }
43
+ else {
44
+ let match = /line (\d+) : column (\d+)/.exec(message);
45
+ if (match) {
46
+ let offset = lineOffsets[Number(match[1])] + Number(match[2]);
47
+ location = { start: offset, end: offset };
48
+ }
49
+ }
50
+ errors.push({ message, location });
51
+ }
52
+ let segmentsStack = [[]];
53
+ let mappingsStack = [[]];
54
+ let indent = '';
55
+ let offset = 0;
56
+ let directives = [];
57
+ // Associates all content emitted during the given callback with the
58
+ // given range in the template source and corresponding AST node.
59
+ // If an exception is thrown while executing the callback, the error
60
+ // will be captured and associated with the given range, and no content
61
+ // will be emitted.
62
+ let captureMapping = (hbsRange, source, allowEmpty, callback, codeFeaturesForNode) => {
63
+ let start = offset;
64
+ let mappings = [];
65
+ let segments = [];
66
+ segmentsStack.unshift(segments);
67
+ mappingsStack.unshift(mappings);
68
+ try {
69
+ callback();
70
+ }
71
+ catch (error) {
72
+ errors.push({ message: getErrorMessage(error), location: hbsRange });
73
+ offset = start;
74
+ }
75
+ mappingsStack.shift();
76
+ segmentsStack.shift();
77
+ // If the offset didn't change (either because nothing was emitted
78
+ // or because an exception was thrown), don't add a new node to the
79
+ // mapping tree or flush any new content.
80
+ if (start !== offset || allowEmpty) {
81
+ let end = offset;
82
+ let tsRange = { start, end };
83
+ mappingsStack[0].push(new GlimmerASTMappingTree(tsRange, hbsRange, mappings, source,
84
+ // Prevent TS's semantic classifications (used for semantic highlighting, see
85
+ // https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide) from being
86
+ // source-mapped back to the glimmer template. These might be useful to reinstate at some
87
+ // point in the future but by default tends to make the highlighting in gts files look wrong.
88
+ codeFeaturesForNode ??
89
+ augmentCodeFeaturesWithIgnoreDirectivesSupport(codeFeatures.withoutHighlight, hbsRange)));
90
+ segmentsStack[0].push(...segments);
91
+ }
92
+ };
93
+ /**
94
+ * This function will conditionally augment the CodeInformation object
95
+ * that's passed in for each mapping as a means to implement support for
96
+ * `@glint-expect-error` directives.
97
+ */
98
+ function augmentCodeFeaturesWithIgnoreDirectivesSupport(features, hbsRange) {
99
+ if (features.verification) {
100
+ // If this code span requests verification (e.g. TS type-checking), then
101
+ // we potentially need to decorate the `verification` value that we pass
102
+ // back to Volar, in case we have active `glint-ignore/expect-error` directives
103
+ // in active effect.
104
+ let activeDirective;
105
+ for (let directive of directives) {
106
+ if (directive.areaOfEffect.start <= hbsRange.start &&
107
+ directive.areaOfEffect.end > hbsRange.start) {
108
+ if (!activeDirective) {
109
+ activeDirective = directive;
110
+ }
111
+ else {
112
+ // More than one directive applies here; glint-nocheck, if present, always wins.
113
+ if (directive.kind === 'nocheck') {
114
+ activeDirective = directive;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ if (!activeDirective) {
120
+ return features;
121
+ }
122
+ if (activeDirective.kind === 'ignore' || activeDirective.kind === 'nocheck') {
123
+ // We are currently in an ignored region of code, so don't
124
+ // even bother performing any type-checking: override verification (i.e. type-checking) to false
125
+ // for this mapping (note that the whole generated TS file will be type-checked but any
126
+ // diagnostics in this region will be suppressed by Volar)
127
+ return {
128
+ ...features,
129
+ verification: false,
130
+ };
131
+ }
132
+ else if (activeDirective.kind === 'expect-error') {
133
+ const expectErrorDirective = activeDirective;
134
+ return {
135
+ ...features,
136
+ verification: {
137
+ shouldReport: () => {
138
+ // Keep track of any errors/diagnostics reported within this region of code...
139
+ expectErrorDirective.errorCount++;
140
+ // ...and suppress them from bubbling up as diagnostics/errrors/warnings.
141
+ return false;
142
+ },
143
+ },
144
+ };
145
+ }
146
+ }
147
+ return features;
148
+ }
149
+ let mapper = {
150
+ indent() {
151
+ indent += ' ';
152
+ },
153
+ dedent() {
154
+ indent = indent.slice(2);
155
+ },
156
+ newline() {
157
+ offset += 1;
158
+ segmentsStack[0].push('\n');
159
+ },
160
+ text(value) {
161
+ offset += value.length;
162
+ segmentsStack[0].push(value);
163
+ },
164
+ synthetic(value) {
165
+ if (value.length) {
166
+ mapper.identifier(value, 0, 0);
167
+ }
168
+ },
169
+ nothing(node, source = node) {
170
+ captureMapping(mapper.rangeForNode(node), source, true, () => { });
171
+ },
172
+ identifier(value, hbsOffset, hbsLength = value.length) {
173
+ let hbsRange = { start: hbsOffset, end: hbsOffset + hbsLength };
174
+ let source = new Identifier(value);
175
+ captureMapping(hbsRange, source, true, () => mapper.text(value));
176
+ },
177
+ forNode(node, callback, codeFeaturesForNode) {
178
+ captureMapping(mapper.rangeForNode(node), node, false, callback, codeFeaturesForNode);
179
+ },
180
+ forNodeWithSpan(node, span, callback, codeFeaturesForNode) {
181
+ captureMapping(mapper.rangeForNode(node, span), node, false, callback, codeFeaturesForNode);
182
+ },
183
+ error(message, location) {
184
+ errors.push({ message, location });
185
+ },
186
+ directive(kind, commentNode, location, areaOfEffect) {
187
+ const directive = {
188
+ kind,
189
+ commentNode,
190
+ location,
191
+ areaOfEffect,
192
+ errorCount: 0,
193
+ };
194
+ directives.push(directive);
195
+ },
196
+ emitDirectivePlaceholders() {
197
+ if (directives.length) {
198
+ mapper.text('// begin directive placeholders');
199
+ mapper.newline();
200
+ }
201
+ for (let directive of directives) {
202
+ if (directive.kind !== 'expect-error') {
203
+ continue;
204
+ }
205
+ mapper.forNode(directive.commentNode, () => {
206
+ mapper.text(`// @ts-expect-error ${directive.kind}`);
207
+ }, {
208
+ ...codeFeatures.withoutHighlight,
209
+ verification: {
210
+ shouldReport: () => {
211
+ // This determines whether we raise the placeholder "unused ts-expect-error" diagnostic.
212
+ // If errors were encountered in the region covered by the directive, then we suppress
213
+ // the "unused ts-expect-error" diagnostic here.
214
+ return directive.errorCount === 0;
215
+ },
216
+ },
217
+ });
218
+ mapper.newline();
219
+ mapper.text(';');
220
+ mapper.newline();
221
+ }
222
+ if (directives.length) {
223
+ mapper.text('// end directive placeholders');
224
+ mapper.newline();
225
+ }
226
+ },
227
+ rangeForNode: buildRangeForNode(lineOffsets),
228
+ rangeForLine: (line) => ({
229
+ start: lineOffsets[line],
230
+ end: lineOffsets[line + 1] ?? template.length,
231
+ }),
232
+ };
233
+ callback(ast, mapper);
234
+ assert(segmentsStack.length === 1);
235
+ let code = segmentsStack[0].join('');
236
+ let mapping = new GlimmerASTMappingTree({ start: 0, end: code.length }, {
237
+ start: 0,
238
+ end: embeddingSyntax.prefix.length + template.length + embeddingSyntax.suffix.length,
239
+ }, mappingsStack[0], new TemplateEmbedding(), codeFeatures.all);
240
+ return { errors, result: { code, directives, mapping } };
241
+ }
242
+ const LEADING_WHITESPACE = /^\s+/;
243
+ const TRAILING_WHITESPACE = /\s+$/;
244
+ function calculateLineOffsets(template, contentOffset) {
245
+ let lines = template.split('\n');
246
+ let total = contentOffset;
247
+ let offsets = [contentOffset];
248
+ for (let [index, line] of lines.entries()) {
249
+ // lines from @glimmer/syntax are 1-indexed
250
+ offsets[index + 1] = total;
251
+ total += line.length + 1;
252
+ }
253
+ return offsets;
254
+ }
255
+ function buildRangeForNode(offsets) {
256
+ return (node, span) => {
257
+ let { loc } = node;
258
+ if (span) {
259
+ loc = span;
260
+ }
261
+ let start = offsets[loc.start.line] + loc.start.column;
262
+ let end = offsets[loc.end.line] + loc.end.column;
263
+ // This makes error reporting for illegal text nodes (e.g. alongside named blocks)
264
+ // a bit nicer by only highlighting the content rather than all the surrounding
265
+ // newlines and attendant whitespace
266
+ if (node.type === 'TextNode') {
267
+ let leading = LEADING_WHITESPACE.exec(node.chars)?.[0].length ?? 0;
268
+ let trailing = TRAILING_WHITESPACE.exec(node.chars)?.[0].length ?? 0;
269
+ if (leading !== node.chars.length) {
270
+ start += leading;
271
+ end -= trailing;
272
+ }
273
+ }
274
+ return { start, end };
275
+ };
276
+ }
277
+ function getErrorMessage(error) {
278
+ return error?.message ?? '(unknown error)';
279
+ }
280
+ function isHBSSyntaxError(error) {
281
+ if (typeof error === 'object' && !!error && 'hash' in error) {
282
+ let { hash } = error;
283
+ return typeof hash?.loc === 'object';
284
+ }
285
+ return false;
286
+ }
287
+ //# sourceMappingURL=map-template-contents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-template-contents.js","sourceRoot":"","sources":["../../../src/transform/template/map-template-contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,qBAAqB,EAAE,EAE5B,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AAGvC;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAU;IAErB,YAAmC,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAD/B,SAAI,GAAG,YAAY,CAAC;IACc,CAAC;CACpD;AAwHD;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,EAAE,eAAe,EAA8B,EAC/C,QAA4D;IAE5D,IAAI,GAAG,GAAwB,IAAI,CAAC;IACpC,IAAI,MAAM,GAA4D,EAAE,CAAC;IACzE,IAAI,WAAW,GAAG,oBAAoB,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAA2B,CAAC;QAChC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG;gBACT,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY;gBAC3E,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW;aACxE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,aAAa,GAAe,CAAC,EAAE,CAAC,CAAC;IACrC,IAAI,aAAa,GAA8B,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,GAA0B,EAAE,CAAC;IAE3C,oEAAoE;IACpE,iEAAiE;IACjE,oEAAoE;IACpE,uEAAuE;IACvE,mBAAmB;IACnB,IAAI,cAAc,GAAG,CACnB,QAAe,EACf,MAAqB,EACrB,UAAmB,EACnB,QAAoB,EACpB,mBAAqC,EAC/B,EAAE;QACR,IAAI,KAAK,GAAG,MAAM,CAAC;QACnB,IAAI,QAAQ,GAA4B,EAAE,CAAC;QAC3C,IAAI,QAAQ,GAAa,EAAE,CAAC;QAE5B,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,kEAAkE;QAClE,mEAAmE;QACnE,yCAAyC;QACzC,IAAI,KAAK,KAAK,MAAM,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,GAAG,GAAG,MAAM,CAAC;YACjB,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAE7B,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CACnB,IAAI,qBAAqB,CACvB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM;YAEN,6EAA6E;YAC7E,6FAA6F;YAC7F,yFAAyF;YACzF,6FAA6F;YAC7F,mBAAmB;gBACjB,8CAA8C,CAAC,YAAY,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAC1F,CACF,CAAC;YACF,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF;;;;OAIG;IACH,SAAS,8CAA8C,CACrD,QAAyB,EACzB,QAAe;QAEf,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,wEAAwE;YACxE,wEAAwE;YACxE,+EAA+E;YAC/E,oBAAoB;YAEpB,IAAI,eAA2C,CAAC;YAChD,KAAK,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBACjC,IACE,SAAS,CAAC,YAAY,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;oBAC9C,SAAS,CAAC,YAAY,CAAC,GAAG,GAAG,QAAQ,CAAC,KAAK,EAC3C,CAAC;oBACD,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,SAAS,CAAC;oBAC9B,CAAC;yBAAM,CAAC;wBACN,gFAAgF;wBAChF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BACjC,eAAe,GAAG,SAAS,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,IAAI,eAAe,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5E,0DAA0D;gBAC1D,gGAAgG;gBAChG,uFAAuF;gBACvF,0DAA0D;gBAC1D,OAAO;oBACL,GAAG,QAAQ;oBACX,YAAY,EAAE,KAAK;iBACpB,CAAC;YACJ,CAAC;iBAAM,IAAI,eAAe,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnD,MAAM,oBAAoB,GAAG,eAAe,CAAC;gBAC7C,OAAO;oBACL,GAAG,QAAQ;oBACX,YAAY,EAAE;wBACZ,YAAY,EAAE,GAAG,EAAE;4BACjB,8EAA8E;4BAC9E,oBAAoB,CAAC,UAAU,EAAE,CAAC;4BAElC,yEAAyE;4BACzE,OAAO,KAAK,CAAC;wBACf,CAAC;qBACF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,GAAW;QACnB,MAAM;YACJ,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QACD,MAAM;YACJ,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO;YACL,MAAM,IAAI,CAAC,CAAC;YACZ,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,KAAa;YAChB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACvB,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,SAAS,CAAC,KAAa;YACrB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAc,EAAE,SAAwB,IAAI;YAClD,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,UAAU,CAAC,KAAa,EAAE,SAAiB,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM;YACnE,IAAI,QAAQ,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;YAChE,IAAI,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;YACnC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,IAAc,EAAE,QAAoB,EAAE,mBAAqC;YACjF,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QACxF,CAAC;QAED,eAAe,CACb,IAAc,EACd,IAAqB,EACrB,QAAoB,EACpB,mBAAqC;YAErC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC9F,CAAC;QAED,KAAK,CAAC,OAAe,EAAE,QAAe;YACpC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,SAAS,CACP,IAAmB,EACnB,WAAgE,EAChE,QAAe,EACf,YAAmB;YAEnB,MAAM,SAAS,GAAmB;gBAChC,IAAI;gBACJ,WAAW;gBACX,QAAQ;gBACR,YAAY;gBACZ,UAAU,EAAE,CAAC;aACd,CAAC;YAEF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,yBAAyB;YACvB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAED,KAAK,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBACjC,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACtC,SAAS;gBACX,CAAC;gBAED,MAAM,CAAC,OAAO,CACZ,SAAS,CAAC,WAAW,EACrB,GAAG,EAAE;oBACH,MAAM,CAAC,IAAI,CAAC,uBAAuB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC,EACD;oBACE,GAAG,YAAY,CAAC,gBAAgB;oBAChC,YAAY,EAAE;wBACZ,YAAY,EAAE,GAAG,EAAE;4BACjB,wFAAwF;4BACxF,sFAAsF;4BACtF,gDAAgD;4BAChD,OAAO,SAAS,CAAC,UAAU,KAAK,CAAC,CAAC;wBACpC,CAAC;qBACF;iBACF,CACF,CAAC;gBACF,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC7C,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,YAAY,EAAE,iBAAiB,CAAC,WAAW,CAAC;QAE5C,YAAY,EAAE,CAAC,IAAY,EAAS,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;YACxB,GAAG,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM;SAC9C,CAAC;KACH,CAAC;IAEF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEtB,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,OAAO,GAAG,IAAI,qBAAqB,CACrC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAC9B;QACE,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM;KACrF,EACD,aAAa,CAAC,CAAC,CAAC,EAChB,IAAI,iBAAiB,EAAE,EACvB,YAAY,CAAC,GAAG,CACjB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,SAAS,oBAAoB,CAAC,QAAgB,EAAE,aAAqB;IACnE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,aAAa,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,2CAA2C;QAC3C,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC3B,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAsB;IAEtB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACpB,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;QACD,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACvD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAEjD,kFAAkF;QAClF,+EAA+E;QAC/E,oCAAoC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,IAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YACnE,IAAI,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YAErE,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,IAAI,OAAO,CAAC;gBACjB,GAAG,IAAI,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC;AAgBD,SAAS,eAAe,CAAC,KAAc;IACrC,OAAQ,KAAa,EAAE,OAAO,IAAI,iBAAiB,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5D,IAAI,EAAE,IAAI,EAAE,GAAG,KAAY,CAAC;QAC5B,OAAO,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { GlintEnvironment } from '../../config/index.js';
2
+ import { TSLib } from '../util.js';
3
+ import TransformedModule, { SourceFile } from './transformed-module.js';
4
+ /**
5
+ * Input to the process of rewriting a template, containing:
6
+ * script: the backing JS/TS module for a component, which may contain
7
+ * embedded templates depending on the environment
8
+ */
9
+ export type RewriteInput = {
10
+ script: SourceFile;
11
+ };
12
+ /**
13
+ * Given the script and/or template that together comprise a component module,
14
+ * returns a `TransformedModule` representing the combined result, with the
15
+ * template(s), either alongside or inline, rewritten into equivalent TypeScript
16
+ * in terms of the active glint environment's exported types.
17
+ *
18
+ * May return `null` if an unrecoverable parse error occurs or if there is
19
+ * no transformation to be done.
20
+ */
21
+ export declare function rewriteModule(ts: TSLib, { script }: RewriteInput, environment: GlintEnvironment, clientId?: string): TransformedModule | null;
22
+ //# sourceMappingURL=rewrite-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-module.d.ts","sourceRoot":"","sources":["../../../src/transform/template/rewrite-module.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAU,KAAK,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,iBAAiB,EAAE,EAGxB,UAAU,EAEX,MAAM,yBAAyB,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAElD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,KAAK,EACT,EAAE,MAAM,EAAE,EAAE,YAAY,EACxB,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,iBAAiB,GAAG,IAAI,CAgB1B"}
@@ -0,0 +1,265 @@
1
+ import * as path from 'node:path';
2
+ import { assert } from '../util.js';
3
+ import { calculateTaggedTemplateSpans } from './inlining/tagged-strings.js';
4
+ import TransformedModule from './transformed-module.js';
5
+ /**
6
+ * Given the script and/or template that together comprise a component module,
7
+ * returns a `TransformedModule` representing the combined result, with the
8
+ * template(s), either alongside or inline, rewritten into equivalent TypeScript
9
+ * in terms of the active glint environment's exported types.
10
+ *
11
+ * May return `null` if an unrecoverable parse error occurs or if there is
12
+ * no transformation to be done.
13
+ */
14
+ export function rewriteModule(ts, { script }, environment, clientId) {
15
+ let { errors, directives, partialSpans } = calculateCorrelatedSpans(ts, script, environment, clientId);
16
+ if (!partialSpans.length && !errors.length) {
17
+ return null;
18
+ }
19
+ let sparseSpans = completeCorrelatedSpans(partialSpans);
20
+ let { contents, correlatedSpans } = calculateTransformedSource(script, sparseSpans, directives);
21
+ return new TransformedModule(contents, errors, directives, correlatedSpans, script.filename);
22
+ }
23
+ /**
24
+ * Locates any embedded templates in the given AST and returns a corresponding
25
+ * `PartialCorrelatedSpan` for each, as well as any errors encountered. These
26
+ * spans are then used in `rewriteModule` above to calculate the full set of
27
+ * source-to-source location information as well as the final transformed source
28
+ * string.
29
+ */
30
+ function calculateCorrelatedSpans(ts, script, environment, clientId) {
31
+ let directives = [];
32
+ let errors = [];
33
+ let partialSpans = [];
34
+ if (clientId === 'tsserver-plugin') {
35
+ partialSpans.push(generateAutoImportAnchor(script));
36
+ }
37
+ let { ast, emitMetadata, error } = parseScript(ts, script, environment);
38
+ if (error) {
39
+ if (typeof error === 'string') {
40
+ errors.push({
41
+ message: error,
42
+ location: { start: 0, end: script.contents.length - 1 },
43
+ source: script,
44
+ });
45
+ }
46
+ else if ('isContentTagError' in error && error.isContentTagError) {
47
+ // these lines exclude the line with the error, because
48
+ // adding the column offset will get us on to the line with the error
49
+ let lines = script.contents.split('\n').slice(0, error.line);
50
+ let start = lines.reduce((sum, line) => sum + line.length, 0) + error.column - 1;
51
+ let end = start + 1;
52
+ errors.push({
53
+ isContentTagError: true,
54
+ // we have to show the "help" because content-tag has different line numbers
55
+ // than we are able to discern ourselves.
56
+ message: error.message + '\n\n' + error.help,
57
+ source: script,
58
+ location: {
59
+ start,
60
+ end,
61
+ },
62
+ });
63
+ }
64
+ // We've hit a parsing error, so we need to immediately return as the parsed
65
+ // document must be correct before we can continue.
66
+ return { errors, directives, partialSpans };
67
+ }
68
+ ts.transform(ast, [
69
+ (context) => function visit(node) {
70
+ // Here we look for ```hbs``` tagged template expressions, originally introduced
71
+ // in the now-removed GlimmerX environment. We can consider getting rid of this, but
72
+ // then again there are still some use cases in the wild (e.g. Glimmer Next / GXT)
73
+ // where have tagged templates closing over outer scope is desirable:
74
+ // https://github.com/lifeart/glimmer-next/tree/master/glint-environment-gxt
75
+ // https://discord.com/channels/480462759797063690/717767358743183412/1259061848632721480
76
+ if (ts.isTaggedTemplateExpression(node)) {
77
+ let meta = emitMetadata.get(node);
78
+ let result = calculateTaggedTemplateSpans(ts, node, meta, script, environment);
79
+ directives.push(...result.directives);
80
+ errors.push(...result.errors);
81
+ partialSpans.push(...result.partialSpans);
82
+ }
83
+ else if (ts.isModuleDeclaration(node)) {
84
+ // don't traverse into declare module
85
+ return node;
86
+ }
87
+ return ts.visitEachChild(node, visit, context);
88
+ },
89
+ ]);
90
+ return { errors, directives, partialSpans };
91
+ }
92
+ function parseScript(ts, script, environment) {
93
+ let { filename, contents } = script;
94
+ let extension = path.extname(filename);
95
+ let emitMetadata = new WeakMap();
96
+ let setEmitMetadata = (node, data) => void emitMetadata.set(node, Object.assign(emitMetadata.get(node) ?? {}, data));
97
+ let { preprocess, transform } = environment.getConfigForExtension(extension) ?? {};
98
+ let original = { contents, data: { templateLocations: [] } };
99
+ let preprocessed = original;
100
+ let error;
101
+ try {
102
+ preprocessed = preprocess?.(contents, filename) ?? original;
103
+ }
104
+ catch (e) {
105
+ error = parseError(e, filename);
106
+ }
107
+ let ast = ts.createSourceFile(filename,
108
+ // contents will be transformed and placeholder'd content
109
+ // or, in the event of a parse error, the original content
110
+ // in which case, TS will report a ton of errors about some goofy syntax.
111
+ // We'll want to ignore all of that and only display our parsing error from content-tag.
112
+ preprocessed.contents, ts.ScriptTarget.Latest, true);
113
+ // Only transform if we don't have a parse error
114
+ if (!error && transform) {
115
+ let { transformed } = ts.transform(ast, [
116
+ (context) => transform(preprocessed.data, { ts, context, setEmitMetadata }),
117
+ ]);
118
+ assert(transformed.length === 1 && ts.isSourceFile(transformed[0]));
119
+ ast = transformed[0];
120
+ }
121
+ return { ast, emitMetadata, error };
122
+ }
123
+ function parseError(e, filename) {
124
+ if (typeof e === 'object' && e !== null) {
125
+ // Parse Errors from the rust parser
126
+ if ('source_code' in e) {
127
+ // We remove the blank links in the error because swc
128
+ // pads errors with a leading and trailing blank line.
129
+ // the error is typically meant for the terminal, so making it
130
+ // stand out a bit more is a good, but that's more a presentation
131
+ // concern than just pure error information (which is what we need).
132
+ // @ts-expect-error object / property narrowing isn't available until TS 5.1
133
+ let lines = e.source_code.split('\n').filter(Boolean);
134
+ // Example:
135
+ // ' × Unexpected eof'
136
+ // ' ╭─[/home/nullvoxpopuli/Development/OpenSource/glint/test-packages/ts-template-imports-app/src/index.gts:6:1]'
137
+ // ' 6 │ '
138
+ // ' 7 │ export const X = <tem'
139
+ // ' ╰────'
140
+ let raw = lines.join('\n');
141
+ let message = lines[0].replace('×', '').trim();
142
+ let info = lines[1];
143
+ // a filename may have numbers in it, so we want to remove the filename
144
+ // before regex searching for numbers at the end of this line
145
+ let strippedInfo = info.replace(filename, '');
146
+ let matches = [...strippedInfo.matchAll(/\d+/g)];
147
+ let line = parseInt(matches[0][0], 10);
148
+ let column = parseInt(matches[1][0], 10);
149
+ // The help omits the original file name, because TS will provide that.
150
+ let help = lines.slice(2).join('\n');
151
+ return {
152
+ isContentTagError: true,
153
+ raw,
154
+ message,
155
+ line,
156
+ column,
157
+ file: filename,
158
+ help,
159
+ };
160
+ }
161
+ }
162
+ return `${e}`;
163
+ }
164
+ /**
165
+ * Given a sparse `CorrelatedSpan` array and the original source for a module,
166
+ * returns the resulting full transformed source string for that module, as
167
+ * well as a filled-in array of correlated spans that includes chunks of the
168
+ * original source that were not transformed.
169
+ */
170
+ function calculateTransformedSource(originalFile, sparseSpans, directives) {
171
+ let correlatedSpans = [];
172
+ let originalOffset = 0;
173
+ let transformedOffset = 0;
174
+ for (let span of sparseSpans) {
175
+ let interstitial = originalFile.contents.slice(originalOffset, span.insertionPoint);
176
+ if (interstitial.length) {
177
+ correlatedSpans.push({
178
+ originalFile,
179
+ originalStart: originalOffset,
180
+ originalLength: interstitial.length,
181
+ insertionPoint: originalOffset,
182
+ transformedStart: transformedOffset,
183
+ transformedLength: interstitial.length,
184
+ transformedSource: interstitial,
185
+ });
186
+ }
187
+ correlatedSpans.push(span);
188
+ transformedOffset += interstitial.length + span.transformedLength;
189
+ originalOffset +=
190
+ interstitial.length + (span.originalFile === originalFile ? span.originalLength : 0);
191
+ }
192
+ let trailingContent = originalFile.contents.slice(originalOffset);
193
+ const trailingSpan = {
194
+ originalFile,
195
+ originalStart: originalOffset,
196
+ originalLength: trailingContent.length + 1,
197
+ insertionPoint: originalOffset,
198
+ transformedStart: transformedOffset,
199
+ transformedLength: trailingContent.length + 1,
200
+ transformedSource: trailingContent,
201
+ };
202
+ correlatedSpans.push(trailingSpan);
203
+ const placeholderContent = '\n\n// @ts-expect-error placeholder for glint-expect-error\n;\n';
204
+ for (let directive of directives) {
205
+ if (directive.kind === 'expect-error') {
206
+ correlatedSpans.push({
207
+ originalFile,
208
+ originalStart: directive.location.start,
209
+ originalLength: directive.location.end - directive.location.start,
210
+ insertionPoint: originalOffset + trailingContent.length,
211
+ transformedSource: placeholderContent,
212
+ transformedStart: transformedOffset + trailingContent.length,
213
+ transformedLength: placeholderContent.length,
214
+ });
215
+ }
216
+ }
217
+ return {
218
+ contents: correlatedSpans.map((span) => span.transformedSource).join(''),
219
+ correlatedSpans,
220
+ };
221
+ }
222
+ /**
223
+ * Given an array of `PartialCorrelatedSpan`s for a file, calculates
224
+ * their `transformedLength` and `transformedStart` values, resulting
225
+ * in full `CorrelatedSpan`s.
226
+ */
227
+ function completeCorrelatedSpans(partialSpans) {
228
+ let correlatedSpans = [];
229
+ for (let i = 0; i < partialSpans.length; i++) {
230
+ let current = partialSpans[i];
231
+ let transformedLength = current.transformedSource.length;
232
+ let transformedStart = current.insertionPoint;
233
+ if (i > 0) {
234
+ let previous = correlatedSpans[i - 1];
235
+ transformedStart =
236
+ previous.transformedStart +
237
+ previous.transformedSource.length +
238
+ (current.insertionPoint - previous.insertionPoint - previous.originalLength);
239
+ }
240
+ correlatedSpans.push({ ...current, transformedStart, transformedLength });
241
+ }
242
+ return correlatedSpans;
243
+ }
244
+ /**
245
+ * Insert a triple-slash reference directive to the top of the transformed file which provides
246
+ * an anchor/insertion point for auto-imports. This fixes an issue where auto-imports
247
+ * don't work for the first import in a file.
248
+ *
249
+ * Because we don't provide any mapping information to Volar, the internal error that
250
+ * this generates is quietly swallowed when Volar reverse source-maps the error back to
251
+ * .gts/.gjs. This is hacky but I don't know of any other (non-upstream) fix for this.
252
+ *
253
+ * Potential upstream Volar fix for this:
254
+ * https://github.com/volarjs/volar.js/pull/281
255
+ */
256
+ function generateAutoImportAnchor(script) {
257
+ return {
258
+ originalFile: script,
259
+ originalStart: 0,
260
+ originalLength: 0,
261
+ insertionPoint: 0,
262
+ transformedSource: '/// <reference types="__GLINT_AUTO_IMPORT_ANCHOR__" />\n',
263
+ };
264
+ }
265
+ //# sourceMappingURL=rewrite-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-module.js","sourceRoot":"","sources":["../../../src/transform/template/rewrite-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A `ScopeStack` is used while traversing a template
3
+ * to track what identifiers are currently in scope.
4
+ */
5
+ export default class ScopeStack {
6
+ private stack;
7
+ constructor(identifiers: string[]);
8
+ push(identifiers: Array<string>): void;
9
+ pop(): void;
10
+ hasBinding(identifier: string): boolean;
11
+ private get top();
12
+ }
13
+ //# sourceMappingURL=scope-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-stack.d.ts","sourceRoot":"","sources":["../../../src/transform/template/scope-stack.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,KAAK,CAAqB;gBAEf,WAAW,EAAE,MAAM,EAAE;IAIjC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI;IAQtC,GAAG,IAAI,IAAI;IAKX,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI9C,OAAO,KAAK,GAAG,GAEd;CACF"}
@@ -0,0 +1,28 @@
1
+ import { assert } from '../util.js';
2
+ /**
3
+ * A `ScopeStack` is used while traversing a template
4
+ * to track what identifiers are currently in scope.
5
+ */
6
+ export default class ScopeStack {
7
+ constructor(identifiers) {
8
+ this.stack = [new Set(identifiers)];
9
+ }
10
+ push(identifiers) {
11
+ let scope = new Set(this.top);
12
+ for (let identifier of identifiers) {
13
+ scope.add(identifier);
14
+ }
15
+ this.stack.unshift(scope);
16
+ }
17
+ pop() {
18
+ assert(this.stack.length > 1);
19
+ this.stack.shift();
20
+ }
21
+ hasBinding(identifier) {
22
+ return this.top.has(identifier);
23
+ }
24
+ get top() {
25
+ return this.stack[0];
26
+ }
27
+ }
28
+ //# sourceMappingURL=scope-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-stack.js","sourceRoot":"","sources":["../../../src/transform/template/scope-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAG7B,YAAmB,WAAqB;QACtC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,CAAC;IAEM,IAAI,CAAC,WAA0B;QACpC,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEM,GAAG;QACR,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEM,UAAU,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,IAAY,GAAG;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;CACF"}