@glint/ember-tsc 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/bin/ember-tsc.js +4 -0
  4. package/bin/glint-language-server.js +2 -0
  5. package/lib/cli/run-volar-tsc.d.ts +2 -0
  6. package/lib/cli/run-volar-tsc.d.ts.map +1 -0
  7. package/lib/cli/run-volar-tsc.js +30 -0
  8. package/lib/cli/run-volar-tsc.js.map +1 -0
  9. package/lib/config/config.d.ts +15 -0
  10. package/lib/config/config.d.ts.map +1 -0
  11. package/lib/config/config.js +21 -0
  12. package/lib/config/config.js.map +1 -0
  13. package/lib/config/environment.d.ts +26 -0
  14. package/lib/config/environment.d.ts.map +1 -0
  15. package/lib/config/environment.js +96 -0
  16. package/lib/config/environment.js.map +1 -0
  17. package/lib/config/index.d.ts +17 -0
  18. package/lib/config/index.d.ts.map +1 -0
  19. package/lib/config/index.js +26 -0
  20. package/lib/config/index.js.map +1 -0
  21. package/lib/config/loader.d.ts +25 -0
  22. package/lib/config/loader.d.ts.map +1 -0
  23. package/lib/config/loader.js +110 -0
  24. package/lib/config/loader.js.map +1 -0
  25. package/lib/config/types.cjs +3 -0
  26. package/lib/config/types.cjs.map +1 -0
  27. package/lib/config/types.d.cts +60 -0
  28. package/lib/config/types.d.cts.map +1 -0
  29. package/lib/environment-ember-template-imports/-private/environment/common.d.ts +13 -0
  30. package/lib/environment-ember-template-imports/-private/environment/common.d.ts.map +1 -0
  31. package/lib/environment-ember-template-imports/-private/environment/common.js +2 -0
  32. package/lib/environment-ember-template-imports/-private/environment/common.js.map +1 -0
  33. package/lib/environment-ember-template-imports/-private/environment/index.d.ts +3 -0
  34. package/lib/environment-ember-template-imports/-private/environment/index.d.ts.map +1 -0
  35. package/lib/environment-ember-template-imports/-private/environment/index.js +76 -0
  36. package/lib/environment-ember-template-imports/-private/environment/index.js.map +1 -0
  37. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts +4 -0
  38. package/lib/environment-ember-template-imports/-private/environment/preprocess.d.ts.map +1 -0
  39. package/lib/environment-ember-template-imports/-private/environment/preprocess.js +73 -0
  40. package/lib/environment-ember-template-imports/-private/environment/preprocess.js.map +1 -0
  41. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts +4 -0
  42. package/lib/environment-ember-template-imports/-private/environment/transform.d.ts.map +1 -0
  43. package/lib/environment-ember-template-imports/-private/environment/transform.js +134 -0
  44. package/lib/environment-ember-template-imports/-private/environment/transform.js.map +1 -0
  45. package/lib/index.d.ts +7 -0
  46. package/lib/index.d.ts.map +1 -0
  47. package/lib/index.js +6 -0
  48. package/lib/index.js.map +1 -0
  49. package/lib/plugins/g-compiler-errors.d.ts +12 -0
  50. package/lib/plugins/g-compiler-errors.d.ts.map +1 -0
  51. package/lib/plugins/g-compiler-errors.js +58 -0
  52. package/lib/plugins/g-compiler-errors.js.map +1 -0
  53. package/lib/plugins/g-template-tag-symbols.d.ts +11 -0
  54. package/lib/plugins/g-template-tag-symbols.d.ts.map +1 -0
  55. package/lib/plugins/g-template-tag-symbols.js +48 -0
  56. package/lib/plugins/g-template-tag-symbols.js.map +1 -0
  57. package/lib/plugins/utils.d.ts +25 -0
  58. package/lib/plugins/utils.d.ts.map +1 -0
  59. package/lib/plugins/utils.js +63 -0
  60. package/lib/plugins/utils.js.map +1 -0
  61. package/lib/transform/diagnostics/augmentation.d.ts +4 -0
  62. package/lib/transform/diagnostics/augmentation.d.ts.map +1 -0
  63. package/lib/transform/diagnostics/augmentation.js +223 -0
  64. package/lib/transform/diagnostics/augmentation.js.map +1 -0
  65. package/lib/transform/diagnostics/index.d.ts +5 -0
  66. package/lib/transform/diagnostics/index.d.ts.map +1 -0
  67. package/lib/transform/diagnostics/index.js +2 -0
  68. package/lib/transform/diagnostics/index.js.map +1 -0
  69. package/lib/transform/index.d.ts +4 -0
  70. package/lib/transform/index.d.ts.map +1 -0
  71. package/lib/transform/index.js +2 -0
  72. package/lib/transform/index.js.map +1 -0
  73. package/lib/transform/template/code-features.d.ts +30 -0
  74. package/lib/transform/template/code-features.d.ts.map +1 -0
  75. package/lib/transform/template/code-features.js +26 -0
  76. package/lib/transform/template/code-features.js.map +1 -0
  77. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts +80 -0
  78. package/lib/transform/template/glimmer-ast-mapping-tree.d.ts.map +1 -0
  79. package/lib/transform/template/glimmer-ast-mapping-tree.js +132 -0
  80. package/lib/transform/template/glimmer-ast-mapping-tree.js.map +1 -0
  81. package/lib/transform/template/inlining/index.d.ts +16 -0
  82. package/lib/transform/template/inlining/index.d.ts.map +1 -0
  83. package/lib/transform/template/inlining/index.js +21 -0
  84. package/lib/transform/template/inlining/index.js.map +1 -0
  85. package/lib/transform/template/inlining/tagged-strings.d.ts +8 -0
  86. package/lib/transform/template/inlining/tagged-strings.d.ts.map +1 -0
  87. package/lib/transform/template/inlining/tagged-strings.js +140 -0
  88. package/lib/transform/template/inlining/tagged-strings.js.map +1 -0
  89. package/lib/transform/template/map-template-contents.d.ts +121 -0
  90. package/lib/transform/template/map-template-contents.d.ts.map +1 -0
  91. package/lib/transform/template/map-template-contents.js +287 -0
  92. package/lib/transform/template/map-template-contents.js.map +1 -0
  93. package/lib/transform/template/rewrite-module.d.ts +22 -0
  94. package/lib/transform/template/rewrite-module.d.ts.map +1 -0
  95. package/lib/transform/template/rewrite-module.js +265 -0
  96. package/lib/transform/template/rewrite-module.js.map +1 -0
  97. package/lib/transform/template/scope-stack.d.ts +13 -0
  98. package/lib/transform/template/scope-stack.d.ts.map +1 -0
  99. package/lib/transform/template/scope-stack.js +28 -0
  100. package/lib/transform/template/scope-stack.js.map +1 -0
  101. package/lib/transform/template/template-to-typescript.d.ts +19 -0
  102. package/lib/transform/template/template-to-typescript.d.ts.map +1 -0
  103. package/lib/transform/template/template-to-typescript.js +1095 -0
  104. package/lib/transform/template/template-to-typescript.js.map +1 -0
  105. package/lib/transform/template/transformed-module.d.ts +111 -0
  106. package/lib/transform/template/transformed-module.d.ts.map +1 -0
  107. package/lib/transform/template/transformed-module.js +287 -0
  108. package/lib/transform/template/transformed-module.js.map +1 -0
  109. package/lib/transform/util.d.ts +7 -0
  110. package/lib/transform/util.d.ts.map +1 -0
  111. package/lib/transform/util.js +15 -0
  112. package/lib/transform/util.js.map +1 -0
  113. package/lib/volar/ember-language-plugin.d.ts +14 -0
  114. package/lib/volar/ember-language-plugin.d.ts.map +1 -0
  115. package/lib/volar/ember-language-plugin.js +91 -0
  116. package/lib/volar/ember-language-plugin.js.map +1 -0
  117. package/lib/volar/gts-virtual-code.d.ts +83 -0
  118. package/lib/volar/gts-virtual-code.d.ts.map +1 -0
  119. package/lib/volar/gts-virtual-code.js +210 -0
  120. package/lib/volar/gts-virtual-code.js.map +1 -0
  121. package/lib/volar/language-server.d.ts +2 -0
  122. package/lib/volar/language-server.d.ts.map +1 -0
  123. package/lib/volar/language-server.js +214 -0
  124. package/lib/volar/language-server.js.map +1 -0
  125. package/lib/volar/script-snapshot.d.ts +17 -0
  126. package/lib/volar/script-snapshot.d.ts.map +1 -0
  127. package/lib/volar/script-snapshot.js +24 -0
  128. package/lib/volar/script-snapshot.js.map +1 -0
  129. package/package.json +104 -0
  130. package/src/cli/run-volar-tsc.ts +36 -0
  131. package/src/config/config.ts +33 -0
  132. package/src/config/environment.ts +128 -0
  133. package/src/config/index.ts +30 -0
  134. package/src/config/loader.ts +143 -0
  135. package/src/config/types.cts +85 -0
  136. package/src/environment-ember-template-imports/-private/environment/common.ts +14 -0
  137. package/src/environment-ember-template-imports/-private/environment/index.ts +83 -0
  138. package/src/environment-ember-template-imports/-private/environment/preprocess.ts +90 -0
  139. package/src/environment-ember-template-imports/-private/environment/transform.ts +202 -0
  140. package/src/index.ts +9 -0
  141. package/src/plugins/g-compiler-errors.ts +67 -0
  142. package/src/plugins/g-template-tag-symbols.ts +54 -0
  143. package/src/plugins/utils.ts +86 -0
  144. package/src/transform/diagnostics/augmentation.ts +333 -0
  145. package/src/transform/diagnostics/index.ts +5 -0
  146. package/src/transform/index.ts +4 -0
  147. package/src/transform/template/code-features.ts +30 -0
  148. package/src/transform/template/glimmer-ast-mapping-tree.ts +173 -0
  149. package/src/transform/template/inlining/index.ts +33 -0
  150. package/src/transform/template/inlining/tagged-strings.ts +187 -0
  151. package/src/transform/template/map-template-contents.ts +501 -0
  152. package/src/transform/template/rewrite-module.ts +372 -0
  153. package/src/transform/template/scope-stack.ts +34 -0
  154. package/src/transform/template/template-to-typescript.ts +1476 -0
  155. package/src/transform/template/transformed-module.ts +431 -0
  156. package/src/transform/util.ts +24 -0
  157. package/src/volar/ember-language-plugin.ts +108 -0
  158. package/src/volar/gts-virtual-code.ts +249 -0
  159. package/src/volar/language-server.ts +250 -0
  160. package/src/volar/script-snapshot.ts +27 -0
  161. package/types/-private/dsl/globals.d.ts +204 -0
  162. package/types/-private/dsl/index.d.ts +50 -0
  163. package/types/-private/dsl/integration-declarations.d.ts +143 -0
  164. package/types/-private/intrinsics/action.d.ts +45 -0
  165. package/types/-private/intrinsics/concat.d.ts +6 -0
  166. package/types/-private/intrinsics/each-in.d.ts +24 -0
  167. package/types/-private/intrinsics/each.d.ts +17 -0
  168. package/types/-private/intrinsics/fn.d.ts +44 -0
  169. package/types/-private/intrinsics/get.d.ts +31 -0
  170. package/types/-private/intrinsics/input.d.ts +24 -0
  171. package/types/-private/intrinsics/link-to.d.ts +31 -0
  172. package/types/-private/intrinsics/log.d.ts +6 -0
  173. package/types/-private/intrinsics/mount.d.ts +9 -0
  174. package/types/-private/intrinsics/mut.d.ts +14 -0
  175. package/types/-private/intrinsics/on.d.ts +21 -0
  176. package/types/-private/intrinsics/outlet.d.ts +8 -0
  177. package/types/-private/intrinsics/textarea.d.ts +16 -0
  178. package/types/-private/intrinsics/unbound.d.ts +10 -0
  179. package/types/-private/intrinsics/unique-id.d.ts +5 -0
  180. package/types/globals/index.d.ts +3 -0
  181. package/types/silent-error.d.ts +4 -0
@@ -0,0 +1,140 @@
1
+ import { assert } from '../../util.js';
2
+ import { templateToTypescript } from '../template-to-typescript.js';
3
+ import { isEmbeddedInClass } from './index.js';
4
+ export function calculateTaggedTemplateSpans(ts, node, meta, script, environment) {
5
+ let directives = [];
6
+ let errors = [];
7
+ let partialSpans = [];
8
+ let tag = node.tag;
9
+ if (!ts.isIdentifier(tag)) {
10
+ return { errors, directives, partialSpans };
11
+ }
12
+ let importedBindings = collectImportedBindings(ts, tag.getSourceFile());
13
+ let info = resolveTagInfo(importedBindings, tag, environment);
14
+ if (info) {
15
+ assert(ts.isNoSubstitutionTemplateLiteral(node.template), 'No interpolated values in template strings');
16
+ let { typesModule, globals } = info.tagConfig;
17
+ let template = node.template.rawText ?? node.template.text;
18
+ // environment-specific transforms may emit templateLocation in meta, in
19
+ // which case we use that. Otherwise we use the reported location from the
20
+ // node itself (which is presumably correct because no transform has messed
21
+ // with it).
22
+ let templateLocation = meta?.templateLocation ?? {
23
+ start: node.getStart(),
24
+ end: node.getEnd(),
25
+ contentStart: node.template.getStart() + 1,
26
+ contentEnd: node.template.getEnd() - 1,
27
+ };
28
+ let embeddingSyntax = {
29
+ prefix: script.contents.slice(templateLocation.start, templateLocation.contentStart),
30
+ suffix: script.contents.slice(templateLocation.contentEnd, templateLocation.end),
31
+ };
32
+ let preamble = [];
33
+ if (!info.importedBinding.synthetic) {
34
+ preamble.push(`${tag.text};`);
35
+ }
36
+ let specialForms = collectSpecialForms(importedBindings, info.tagConfig.specialForms ?? {});
37
+ let transformedTemplate = templateToTypescript(template, {
38
+ typesModule: typesModule,
39
+ meta,
40
+ preamble,
41
+ globals,
42
+ embeddingSyntax,
43
+ specialForms,
44
+ backingValue: isEmbeddedInClass(ts, node) ? 'this' : undefined,
45
+ useJsDoc: environment.isUntypedScript(script.filename),
46
+ });
47
+ for (let { message, location } of transformedTemplate.errors) {
48
+ if (location) {
49
+ errors.push({
50
+ source: script,
51
+ message,
52
+ location: addOffset(location, templateLocation.start),
53
+ });
54
+ }
55
+ else {
56
+ errors.push({
57
+ source: script,
58
+ message,
59
+ location: {
60
+ start: tag.getStart(),
61
+ end: tag.getEnd(),
62
+ },
63
+ });
64
+ }
65
+ }
66
+ if (transformedTemplate.result) {
67
+ partialSpans.push({
68
+ originalFile: script,
69
+ originalStart: templateLocation.start,
70
+ originalLength: templateLocation.end - templateLocation.start,
71
+ insertionPoint: templateLocation.start,
72
+ transformedSource: transformedTemplate.result.code,
73
+ glimmerAstMapping: transformedTemplate.result.mapping,
74
+ });
75
+ }
76
+ }
77
+ return { errors, directives, partialSpans };
78
+ }
79
+ function addOffset(location, offset) {
80
+ return {
81
+ start: location.start + offset,
82
+ end: location.end + offset,
83
+ };
84
+ }
85
+ function collectSpecialForms(importedBindings, config) {
86
+ let specialForms = { ...config.globals };
87
+ if (config.imports) {
88
+ for (let [name, { specifier, source }] of Object.entries(importedBindings)) {
89
+ let formForImport = config.imports[source]?.[specifier];
90
+ if (formForImport) {
91
+ specialForms[name] = formForImport;
92
+ }
93
+ }
94
+ }
95
+ return specialForms;
96
+ }
97
+ function resolveTagInfo(importedBindings, tag, environment) {
98
+ let importedBinding = importedBindings[tag.text];
99
+ if (!importedBinding) {
100
+ return;
101
+ }
102
+ for (let [importSource, tags] of Object.entries(environment.getConfiguredTemplateTags())) {
103
+ for (let [importSpecifier, tagConfig] of Object.entries(tags)) {
104
+ if (importSource === importedBinding.source &&
105
+ importSpecifier === importedBinding.specifier) {
106
+ return { importedBinding, tagConfig };
107
+ }
108
+ }
109
+ }
110
+ }
111
+ function collectImportedBindings(ts, sourceFile) {
112
+ let result = {};
113
+ for (let statement of sourceFile.statements) {
114
+ if (ts.isImportDeclaration(statement)) {
115
+ assert(ts.isStringLiteral(statement.moduleSpecifier));
116
+ let { importClause } = statement;
117
+ if (!importClause)
118
+ continue;
119
+ let synthetic = statement.pos === statement.end;
120
+ if (importClause.name) {
121
+ result[importClause.name.text] = {
122
+ specifier: 'default',
123
+ source: statement.moduleSpecifier.text,
124
+ synthetic,
125
+ };
126
+ }
127
+ if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) {
128
+ for (let binding of importClause.namedBindings.elements) {
129
+ result[binding.name.text] = {
130
+ specifier: binding.propertyName?.text ?? binding.name.text,
131
+ source: statement.moduleSpecifier.text,
132
+ synthetic,
133
+ };
134
+ }
135
+ }
136
+ }
137
+ }
138
+ return result;
139
+ }
140
+ //# sourceMappingURL=tagged-strings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagged-strings.js","sourceRoot":"","sources":["../../../../src/transform/template/inlining/tagged-strings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { AST } from '@glimmer/syntax';
2
+ import { CodeInformation } from '@volar/language-server/node.js';
3
+ import GlimmerASTMappingTree, { MappingSource } from './glimmer-ast-mapping-tree.js';
4
+ import { Directive, DirectiveKind, Range } from './transformed-module.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 declare class Identifier {
15
+ readonly name: string;
16
+ readonly type = "Identifier";
17
+ constructor(name: string);
18
+ }
19
+ export type Mapper = {
20
+ /**
21
+ * Given a @glimmer/syntax AST node, returns the corresponding start
22
+ * and end offsets of that node in the original source.
23
+ */
24
+ rangeForNode: (node: AST.Node, span?: AST.Node['loc']) => Range;
25
+ /**
26
+ * Given a 0-based line number, returns the corresponding start and
27
+ * end offsets for that line.
28
+ */
29
+ rangeForLine: (line: number) => Range;
30
+ /**
31
+ * Captures the existence of a directive specified by the given source
32
+ * node and affecting the given range of text.
33
+ */
34
+ directive: (type: DirectiveKind, commentNode: AST.CommentStatement | AST.MustacheCommentStatement, location: Range, areaOfEffect: Range) => void;
35
+ /**
36
+ * Emits placeholder `ts-expect-error`s for corresponding `@glint-expect-error` directives.
37
+ * This is called at the end of the template transformation to ensure that we're at a
38
+ * top-level / statement-level point in the transformed code, which is a requirement for
39
+ * the `ts-expect-error` placeholder diagnostics to be emitted.
40
+ */
41
+ emitDirectivePlaceholders: () => void;
42
+ /**
43
+ * Records an error at the given location.
44
+ */
45
+ error: (message: string, location: Range) => void;
46
+ /** Emit a newline in the transformed source */
47
+ newline(): void;
48
+ /** Increase the indent level for future emitted content */
49
+ indent(): void;
50
+ /** Decrease the indent level for future emitted content */
51
+ dedent(): void;
52
+ /** Append the given raw text to the transformed source */
53
+ text(value: string): void;
54
+ /**
55
+ * Append the given raw text to the transformed source, creating
56
+ * a 0-length mapping for it in the output.
57
+ */
58
+ synthetic(value: string): void;
59
+ /**
60
+ * Essentially the inverse of `emit.synthetic`, this notes the
61
+ * presence of a template AST node at a given location while not
62
+ * emitting anything in the resulting TS translation.
63
+ */
64
+ nothing(node: AST.Node, source?: MappingSource): void;
65
+ /**
66
+ * Append the given value to the transformed source, mapping
67
+ * that span back to the given offset in the original source.
68
+ */
69
+ identifier(value: string, hbsOffset: number, hbsLength?: number): void;
70
+ /**
71
+ * Map all content emitted in the given callback to the span
72
+ * corresponding to the given AST node in the original source.
73
+ */
74
+ forNode(node: AST.Node, callback: () => void, codeFeaturesForNode?: CodeInformation): void;
75
+ forNodeWithSpan(node: AST.Node, span: AST.Node['loc'], callback: () => void, codeFeaturesForNode?: CodeInformation): void;
76
+ };
77
+ type LocalDirective = Omit<Directive, 'source'>;
78
+ /** The result of rewriting a template */
79
+ export type RewriteResult = {
80
+ /**
81
+ * Any errors discovered during rewriting, along with their location
82
+ * in terms of the original source.
83
+ */
84
+ errors: Array<{
85
+ message: string;
86
+ location: Range | undefined;
87
+ }>;
88
+ /**
89
+ * The source code and a `MappingTree` resulting from rewriting a
90
+ * template. If the template contains unrecoverable syntax errors,
91
+ * this may be undefined.
92
+ */
93
+ result?: {
94
+ code: string;
95
+ directives: Array<LocalDirective>;
96
+ mapping: GlimmerASTMappingTree;
97
+ };
98
+ };
99
+ /**
100
+ * Syntax surrounding the contents of a template that marks it as
101
+ * embedded within the surrounding context, like the `hbs` tag and
102
+ * backticks on a tagged string or the `<template>` markers in a
103
+ * `.gts`/`.gjs` file.
104
+ */
105
+ export type EmbeddingSyntax = {
106
+ prefix: string;
107
+ suffix: string;
108
+ };
109
+ export type MapTemplateContentsOptions = {
110
+ embeddingSyntax: EmbeddingSyntax;
111
+ };
112
+ /**
113
+ * Given the text of a handlebars template (either standalone .hbs file, or the contents
114
+ * of an embedded `<template>...</template>` within a .gts file), invokes the given callback
115
+ * with a set of tools to emit mapped contents corresponding to
116
+ * that template, tracking the text emitted in order to provide
117
+ * a mapping of ranges in the input to ranges in the output.
118
+ */
119
+ export declare function mapTemplateContents(template: string, { embeddingSyntax }: MapTemplateContentsOptions, callback: (ast: AST.Template | null, mapper: Mapper) => void): RewriteResult;
120
+ export {};
121
+ //# sourceMappingURL=map-template-contents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-template-contents.d.ts","sourceRoot":"","sources":["../../../src/transform/template/map-template-contents.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
@@ -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"}