@backtickjs/compiler 0.0.0-stage → 0.1.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -2
  3. package/dist/CodeInformation.d.ts +8 -0
  4. package/dist/CodeInformation.js +2 -0
  5. package/dist/CodeInformation.js.map +1 -0
  6. package/dist/SourceRange.d.ts +4 -0
  7. package/dist/SourceRange.js +2 -0
  8. package/dist/SourceRange.js.map +1 -0
  9. package/dist/buildMappings.d.ts +10 -0
  10. package/dist/buildMappings.js +21 -0
  11. package/dist/buildMappings.js.map +1 -0
  12. package/dist/compileModule.d.ts +25 -0
  13. package/dist/compileModule.js +78 -0
  14. package/dist/compileModule.js.map +1 -0
  15. package/dist/compileScript.d.ts +24 -0
  16. package/dist/compileScript.js +66 -0
  17. package/dist/compileScript.js.map +1 -0
  18. package/dist/diagnostics.d.ts +8 -0
  19. package/dist/diagnostics.js +2 -0
  20. package/dist/diagnostics.js.map +1 -0
  21. package/dist/emitScript.d.ts +52 -0
  22. package/dist/emitScript.js +201 -0
  23. package/dist/emitScript.js.map +1 -0
  24. package/dist/emitScripts.d.ts +10 -0
  25. package/dist/emitScripts.js +23 -0
  26. package/dist/emitScripts.js.map +1 -0
  27. package/dist/flattenScripts.d.ts +2 -0
  28. package/dist/flattenScripts.js +10 -0
  29. package/dist/flattenScripts.js.map +1 -0
  30. package/dist/hashText.d.ts +1 -0
  31. package/dist/hashText.js +18 -0
  32. package/dist/hashText.js.map +1 -0
  33. package/dist/hostElements.d.ts +3 -0
  34. package/dist/hostElements.js +28 -0
  35. package/dist/hostElements.js.map +1 -0
  36. package/dist/index.d.ts +16 -0
  37. package/dist/index.js +10 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/isComponentTag.d.ts +1 -0
  40. package/dist/isComponentTag.js +15 -0
  41. package/dist/isComponentTag.js.map +1 -0
  42. package/dist/nodeFactory.d.ts +3 -0
  43. package/dist/nodeFactory.js +5 -0
  44. package/dist/nodeFactory.js.map +1 -0
  45. package/dist/parseFile.d.ts +34 -0
  46. package/dist/parseFile.js +200 -0
  47. package/dist/parseFile.js.map +1 -0
  48. package/dist/printVirtualCode.d.ts +9 -0
  49. package/dist/printVirtualCode.js +52 -0
  50. package/dist/printVirtualCode.js.map +1 -0
  51. package/dist/resolveBindings.d.ts +76 -0
  52. package/dist/resolveBindings.js +240 -0
  53. package/dist/resolveBindings.js.map +1 -0
  54. package/dist/rewriteFile.d.ts +12 -0
  55. package/dist/rewriteFile.js +22 -0
  56. package/dist/rewriteFile.js.map +1 -0
  57. package/dist/rewriteScript.d.ts +27 -0
  58. package/dist/rewriteScript.js +268 -0
  59. package/dist/rewriteScript.js.map +1 -0
  60. package/dist/segmentsToString.d.ts +9 -0
  61. package/dist/segmentsToString.js +4 -0
  62. package/dist/segmentsToString.js.map +1 -0
  63. package/dist/tagRoot.d.ts +2 -0
  64. package/dist/tagRoot.js +10 -0
  65. package/dist/tagRoot.js.map +1 -0
  66. package/dist/transform.d.ts +17 -0
  67. package/dist/transform.js +61 -0
  68. package/dist/transform.js.map +1 -0
  69. package/dist/transpile.d.ts +27 -0
  70. package/dist/transpile.js +41 -0
  71. package/dist/transpile.js.map +1 -0
  72. package/dist/unmangle.d.ts +2 -0
  73. package/dist/unmangle.js +9 -0
  74. package/dist/unmangle.js.map +1 -0
  75. package/dist/virtualScript.d.ts +22 -0
  76. package/dist/virtualScript.js +305 -0
  77. package/dist/virtualScript.js.map +1 -0
  78. package/dist/virtualize.d.ts +8 -0
  79. package/dist/virtualize.js +10 -0
  80. package/dist/virtualize.js.map +1 -0
  81. package/package.json +58 -3
  82. package/src/CodeInformation.ts +14 -0
  83. package/src/SourceRange.ts +4 -0
  84. package/src/buildMappings.ts +31 -0
  85. package/src/compileModule.ts +132 -0
  86. package/src/compileScript.ts +97 -0
  87. package/src/diagnostics.ts +9 -0
  88. package/src/emitScript.ts +297 -0
  89. package/src/emitScripts.ts +39 -0
  90. package/src/flattenScripts.ts +13 -0
  91. package/src/hashText.ts +17 -0
  92. package/src/hostElements.ts +34 -0
  93. package/src/index.ts +20 -0
  94. package/src/isComponentTag.ts +15 -0
  95. package/src/nodeFactory.ts +18 -0
  96. package/src/parseFile.ts +331 -0
  97. package/src/printVirtualCode.ts +93 -0
  98. package/src/resolveBindings.ts +417 -0
  99. package/src/rewriteFile.ts +52 -0
  100. package/src/rewriteScript.ts +413 -0
  101. package/src/segmentsToString.ts +16 -0
  102. package/src/tagRoot.ts +14 -0
  103. package/src/transform.ts +96 -0
  104. package/src/transpile.ts +49 -0
  105. package/src/unmangle.ts +10 -0
  106. package/src/virtualScript.ts +355 -0
  107. package/src/virtualize.ts +29 -0
@@ -0,0 +1,240 @@
1
+ export function resolveBindings(ts, scripts, fileHash) {
2
+ const combined = combine(ts, scripts);
3
+ const file = ts.createSourceFile("scripts.tsx", combined.text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
4
+ const checker = checkerOf(ts, file);
5
+ const binding = ts.SymbolFlags.Variable | ts.SymbolFlags.Function | ts.SymbolFlags.Class;
6
+ const scriptAt = (position) => combined.pieces.find((piece) => position >= piece.start && position < piece.start + piece.length)?.script;
7
+ const own = new Map();
8
+ // The script's own identifier written at a combined position.
9
+ const identifierAt = (position) => {
10
+ const piece = combined.pieces.find((each) => position >= each.start && position < each.start + each.length);
11
+ if (piece === undefined) {
12
+ return undefined;
13
+ }
14
+ let identifiers = own.get(piece.script);
15
+ if (identifiers === undefined) {
16
+ identifiers = identifiersOf(ts, piece.script.fileWithPlaceholders);
17
+ own.set(piece.script, identifiers);
18
+ }
19
+ return identifiers.get(piece.from + position - piece.start);
20
+ };
21
+ const scriptParams = new Map();
22
+ for (const script of combined.parents.keys()) {
23
+ scriptParams.set(script, {
24
+ splices: Object.values(script.splices).map(({ key, refs }) => ({
25
+ kind: "splice",
26
+ key,
27
+ bindings: [],
28
+ refs,
29
+ })),
30
+ captures: new Map(),
31
+ });
32
+ }
33
+ // A binding's key, its declaring script and where it is declared, minted
34
+ // the first time the pass meets it, so keys count up in source order.
35
+ const bindings = new Map();
36
+ const keys = new Map();
37
+ const owner = new Map();
38
+ const declaredAt = new Map();
39
+ let next = 0;
40
+ const keyOf = (declaration) => {
41
+ let key = keys.get(declaration);
42
+ if (key === undefined) {
43
+ const name = ts.getNameOfDeclaration(declaration);
44
+ key = `${name && ts.isIdentifier(name) ? name.text : "_"}$${fileHash}$${next++}`;
45
+ keys.set(declaration, key);
46
+ owner.set(key, scriptAt(declaration.getStart(file)));
47
+ declaredAt.set(key, declaration);
48
+ }
49
+ return key;
50
+ };
51
+ // The binding a name resolves to, where the scripts declare it.
52
+ const declarationOf = (identifier) => {
53
+ const symbol = ts.isShorthandPropertyAssignment(identifier.parent) &&
54
+ identifier.parent.name === identifier
55
+ ? checker.getShorthandAssignmentValueSymbol(identifier.parent)
56
+ : checker.getSymbolAtLocation(identifier);
57
+ return symbol !== undefined && symbol.flags & binding
58
+ ? symbol.declarations?.find((declaration) => declaration.getSourceFile() === file)
59
+ : undefined;
60
+ };
61
+ // Every binding some nested script captures, whatever hole it was written at.
62
+ const escaped = new Set();
63
+ const visit = (node) => {
64
+ // A type's names are never runtime bindings, but for a `typeof` and a
65
+ // class's `extends`, which read values.
66
+ if (ts.isTypeNode(node) &&
67
+ !ts.isTypeQueryNode(node) &&
68
+ !(ts.isExpressionWithTypeArguments(node) &&
69
+ ts.isHeritageClause(node.parent) &&
70
+ ts.isClassLike(node.parent.parent))) {
71
+ return;
72
+ }
73
+ if (ts.isIdentifier(node)) {
74
+ const script = scriptAt(node.getStart(file));
75
+ const declaration = declarationOf(node);
76
+ if (script === undefined) {
77
+ return;
78
+ }
79
+ if (declaration === undefined) {
80
+ return;
81
+ }
82
+ const key = keyOf(declaration);
83
+ const identifier = identifierAt(node.getStart(file));
84
+ if (identifier !== undefined) {
85
+ bindings.set(identifier, key);
86
+ }
87
+ // Captured by the script that reads it and by every one between it and
88
+ // the script that declared it: each hands it to the next.
89
+ const from = owner.get(key);
90
+ for (let reader = script; reader !== undefined && reader !== from; reader = combined.parents.get(reader)) {
91
+ const captures = scriptParams.get(reader).captures;
92
+ if (!captures.has(key)) {
93
+ captures.set(key, { kind: "capture", key });
94
+ }
95
+ escaped.add(key);
96
+ }
97
+ return;
98
+ }
99
+ node.forEachChild(visit);
100
+ };
101
+ visit(file);
102
+ // Each splice where the script reads it, and what a fragment landing there
103
+ // may be handed: the script's own bindings in scope, by a name nothing
104
+ // shadows, whose declaration the source has passed.
105
+ for (const [script, { splices }] of scriptParams) {
106
+ for (const splice of splices) {
107
+ for (const ref of splice.refs) {
108
+ const position = combined.positions.get(ref);
109
+ const location = nodeAt(file, position);
110
+ splice.bindings = checker
111
+ .getSymbolsInScope(location, binding)
112
+ .flatMap((symbol) => {
113
+ const declaration = symbol.declarations?.find((each) => each.getSourceFile() === file);
114
+ if (declaration === undefined ||
115
+ declared(ts, declaration).getEnd() > position) {
116
+ return [];
117
+ }
118
+ const key = keyOf(declaration);
119
+ return owner.get(key) === script ? [key] : [];
120
+ })
121
+ .sort((a, b) => declaredAt.get(a).getStart(file) -
122
+ declaredAt.get(b).getStart(file));
123
+ }
124
+ }
125
+ }
126
+ const params = new Map();
127
+ for (const [script, { splices, captures }] of scriptParams) {
128
+ for (const splice of splices) {
129
+ // Narrowed only now: whether anything captures a binding is not known
130
+ // until every script that could has been read.
131
+ splice.bindings = splice.bindings.filter((key) => escaped.has(key));
132
+ }
133
+ params.set(script, [...splices, ...captures.values()]);
134
+ }
135
+ return { bindings, params };
136
+ }
137
+ // The scripts as one text, each `(() => text)`, a nested script written where
138
+ // its placeholder stands.
139
+ function combine(ts, scripts) {
140
+ const combined = {
141
+ text: "",
142
+ pieces: [],
143
+ parents: new Map(),
144
+ positions: new Map(),
145
+ };
146
+ const emit = (script, parent) => {
147
+ combined.parents.set(script, parent);
148
+ const identifiers = identifiersOf(ts, script.fileWithPlaceholders);
149
+ const holes = [...identifiers.values()].filter((identifier) => {
150
+ const splice = script.splices[identifier.text];
151
+ return splice?.kind === "braced" && splice.scripts.length > 0;
152
+ });
153
+ combined.text += "(() => ";
154
+ let at = 0;
155
+ const copy = (to) => {
156
+ const start = combined.text.length;
157
+ combined.pieces.push({ start, length: to - at, script, from: at });
158
+ for (const [offset, identifier] of identifiers) {
159
+ if (offset >= at && offset < to) {
160
+ combined.positions.set(identifier, start + offset - at);
161
+ }
162
+ }
163
+ combined.text += script.textWithPlaceholders.slice(at, to);
164
+ at = to;
165
+ };
166
+ for (const hole of holes) {
167
+ copy(hole.getStart(script.fileWithPlaceholders));
168
+ combined.positions.set(hole, combined.text.length);
169
+ const splice = script.splices[hole.text];
170
+ combined.text += "[";
171
+ splice.scripts.forEach((nested, index) => {
172
+ combined.text += index === 0 ? "" : ", ";
173
+ emit(nested, script);
174
+ });
175
+ combined.text += "]";
176
+ at = hole.getEnd();
177
+ }
178
+ copy(script.textWithPlaceholders.length);
179
+ combined.text += ")";
180
+ };
181
+ for (const script of scripts) {
182
+ emit(script);
183
+ combined.text += ";\n";
184
+ }
185
+ return combined;
186
+ }
187
+ // A checker over the one file: no libraries, as only the scripts' own
188
+ // bindings are asked about.
189
+ function checkerOf(ts, file) {
190
+ const host = {
191
+ getSourceFile: (name) => (name === file.fileName ? file : undefined),
192
+ getDefaultLibFileName: () => "lib.d.ts",
193
+ writeFile: () => { },
194
+ getCurrentDirectory: () => "/",
195
+ getCanonicalFileName: (name) => name,
196
+ useCaseSensitiveFileNames: () => true,
197
+ getNewLine: () => "\n",
198
+ fileExists: (name) => name === file.fileName,
199
+ readFile: () => undefined,
200
+ };
201
+ return ts
202
+ .createProgram([file.fileName], { noLib: true, noResolve: true, types: [], jsx: ts.JsxEmit.Preserve }, host)
203
+ .getTypeChecker();
204
+ }
205
+ // A script's own identifiers, by where they start in its placeholder text.
206
+ function identifiersOf(ts, file) {
207
+ const identifiers = new Map();
208
+ const visit = (node) => {
209
+ if (ts.isIdentifier(node)) {
210
+ identifiers.set(node.getStart(file), node);
211
+ }
212
+ node.forEachChild(visit);
213
+ };
214
+ visit(file);
215
+ return identifiers;
216
+ }
217
+ // The innermost node starting at a position.
218
+ function nodeAt(file, position) {
219
+ let found = file;
220
+ const visit = (node) => {
221
+ if (node.getStart(file) <= position && position < node.getEnd()) {
222
+ found = node;
223
+ node.forEachChild(visit);
224
+ }
225
+ };
226
+ file.forEachChild(visit);
227
+ return found;
228
+ }
229
+ // What declares a name, whole: a name a pattern destructures is declared when
230
+ // the declaration it is in is, initializer and all, not where the pattern ends.
231
+ function declared(ts, declaration) {
232
+ let at = declaration;
233
+ while (ts.isBindingElement(at) ||
234
+ ts.isObjectBindingPattern(at) ||
235
+ ts.isArrayBindingPattern(at)) {
236
+ at = at.parent;
237
+ }
238
+ return at;
239
+ }
240
+ //# sourceMappingURL=resolveBindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveBindings.js","sourceRoot":"","sources":["../src/resolveBindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type ts from "typescript";
2
+ import type { Diagnostic } from "./diagnostics.js";
3
+ import type { ParsedFile } from "./parseFile.js";
4
+ import { type BindingResolution } from "./resolveBindings.js";
5
+ import { type RewrittenScript } from "./rewriteScript.js";
6
+ export interface RewrittenFile {
7
+ sourceFile: ts.SourceFile;
8
+ scripts: Map<ts.TaggedTemplateExpression, RewrittenScript>;
9
+ bindings: BindingResolution;
10
+ diagnostics: Diagnostic[];
11
+ }
12
+ export declare function rewriteFile(ts: typeof import("typescript"), parsedFile: ParsedFile): RewrittenFile;
@@ -0,0 +1,22 @@
1
+ import { flattenScripts } from "./flattenScripts.js";
2
+ import { hashText } from "./hashText.js";
3
+ import { hostElementDiagnostics } from "./hostElements.js";
4
+ import { resolveBindings } from "./resolveBindings.js";
5
+ import { rewriteScript } from "./rewriteScript.js";
6
+ export function rewriteFile(ts, parsedFile) {
7
+ const sourceFile = parsedFile.sourceFile;
8
+ const scripts = new Map();
9
+ const diagnostics = [];
10
+ // One hash per file, shared by binding keys and script locations: both need
11
+ // to distinguish this file from a same-named file in another codebase.
12
+ const fileHash = hashText(sourceFile.text);
13
+ const { bindings, params } = resolveBindings(ts, parsedFile.scripts, fileHash);
14
+ for (const script of flattenScripts(parsedFile.scripts)) {
15
+ const rewritten = rewriteScript(ts, script, fileHash, bindings, params.get(script));
16
+ scripts.set(script.sourceNode, rewritten);
17
+ diagnostics.push(...rewritten.diagnostics);
18
+ }
19
+ diagnostics.push(...hostElementDiagnostics(ts, sourceFile));
20
+ return { sourceFile, scripts, bindings, diagnostics };
21
+ }
22
+ //# sourceMappingURL=rewriteFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteFile.js","sourceRoot":"","sources":["../src/rewriteFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAA0B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAwB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAUzE,MAAM,UAAU,WAAW,CACzB,EAA+B,EAC/B,UAAsB;IAEtB,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgD,CAAC;IACxE,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAC1C,EAAE,EACF,UAAU,CAAC,OAAO,EAClB,QAAQ,CACT,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,EACF,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAE5D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type ts from "typescript";
2
+ import type { CompiledScript } from "./compileScript.js";
3
+ import type { Diagnostic } from "./diagnostics.js";
4
+ import { type EmittedScript } from "./emitScript.js";
5
+ import type { ClientScript } from "./parseFile.js";
6
+ import type { BindingResolution, ResolvedParam } from "./resolveBindings.js";
7
+ /** What `cs.create` is handed for a script: which it is, and what it runs. */
8
+ export interface RuntimeScript {
9
+ id: string;
10
+ params: ts.Expression;
11
+ args: ts.Expression;
12
+ emitted: EmittedScript;
13
+ }
14
+ /**
15
+ * A script's module, declared once at the top of its host file, every run of
16
+ * the script sharing it: `const $module0 = { id, code, … };`.
17
+ */
18
+ export declare function moduleDeclaration(ts: typeof import("typescript"), name: string, { id, params }: RuntimeScript, { code, map, dependencies }: CompiledScript): ts.VariableStatement;
19
+ /** A script as the client gets it, `cs.create($module0, [...args])`. */
20
+ export declare function createCall(ts: typeof import("typescript"), moduleName: string, { args }: RuntimeScript): ts.Expression;
21
+ export interface RewrittenScript {
22
+ runtime: RuntimeScript | null;
23
+ awaits: boolean;
24
+ leftAsWritten: boolean;
25
+ diagnostics: Diagnostic[];
26
+ }
27
+ export declare function rewriteScript(ts: typeof import("typescript"), clientScript: ClientScript, fileHash: string, bindings: BindingResolution, params?: readonly ResolvedParam[]): RewrittenScript;
@@ -0,0 +1,268 @@
1
+ import { emitScript, paramName, scriptEdits, } from "./emitScript.js";
2
+ import { isComponentTag } from "./isComponentTag.js";
3
+ import { call } from "./nodeFactory.js";
4
+ import { tagRoot } from "./tagRoot.js";
5
+ /**
6
+ * A script's module, declared once at the top of its host file, every run of
7
+ * the script sharing it: `const $module0 = { id, code, … };`.
8
+ */
9
+ export function moduleDeclaration(ts, name, { id, params }, { code, map, dependencies }) {
10
+ const f = ts.factory;
11
+ const string = (text) => f.createStringLiteral(text);
12
+ return f.createVariableStatement(undefined, f.createVariableDeclarationList([
13
+ f.createVariableDeclaration(name, undefined, undefined, f.createObjectLiteralExpression([
14
+ f.createPropertyAssignment("id", string(id)),
15
+ f.createPropertyAssignment("code", string(code)),
16
+ f.createPropertyAssignment("map", string(map)),
17
+ f.createPropertyAssignment("dependencies", f.createArrayLiteralExpression(dependencies.map(string))),
18
+ f.createPropertyAssignment("params", params),
19
+ ], true)),
20
+ ], ts.NodeFlags.Const));
21
+ }
22
+ /** A script as the client gets it, `cs.create($module0, [...args])`. */
23
+ export function createCall(ts, moduleName, { args }) {
24
+ return call(ts, "cs", "create", [
25
+ ts.factory.createIdentifier(moduleName),
26
+ args,
27
+ ]);
28
+ }
29
+ export function rewriteScript(ts, clientScript, fileHash, bindings, params = []) {
30
+ const { sourceFile, sourceNode, fileWithPlaceholders } = clientScript;
31
+ // A script that can't be rewritten is left as written at runtime, and
32
+ // checked as nothing, so nothing else is reported for it.
33
+ const leftAsWritten = (diagnostics) => ({
34
+ runtime: null,
35
+ awaits: false,
36
+ leftAsWritten: true,
37
+ diagnostics,
38
+ });
39
+ const scriptRange = {
40
+ start: sourceNode.getStart(sourceFile),
41
+ end: sourceNode.getEnd(),
42
+ };
43
+ // A script that doesn't parse is reported as TypeScript's parser read it.
44
+ const parseErrors = parseDiagnostics(fileWithPlaceholders);
45
+ if (parseErrors.length > 0) {
46
+ return leftAsWritten(parseErrors.map((diagnostic) => ({
47
+ range: {
48
+ start: clientScript.toSourceOffset(diagnostic.start),
49
+ end: clientScript.toSourceOffset(diagnostic.start + diagnostic.length),
50
+ },
51
+ message: ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
52
+ category: ts.DiagnosticCategory.Error,
53
+ code: diagnostic.code,
54
+ })));
55
+ }
56
+ // A script is one expression or one block: statements go in braces.
57
+ const [statement] = fileWithPlaceholders.statements;
58
+ if (fileWithPlaceholders.statements.length !== 1 ||
59
+ !(ts.isExpressionStatement(statement) || ts.isBlock(statement))) {
60
+ return leftAsWritten([
61
+ {
62
+ range: scriptRange,
63
+ message: "A `cs` client script is one expression or one block: write " +
64
+ "statements in braces, e.g. cs`{ a(); b(); }`.",
65
+ category: ts.DiagnosticCategory.Error,
66
+ code: 0,
67
+ },
68
+ ]);
69
+ }
70
+ // A `${…}` written where the script has text rather than code is no splice.
71
+ const unspliced = unsplicedSpans(ts, clientScript);
72
+ if (unspliced.length > 0) {
73
+ return leftAsWritten(unspliced);
74
+ }
75
+ // Nor is a script that writes what it can't: emitting it may not be
76
+ // possible, as a declared `$` name is a splice, not a name.
77
+ const refused = refusals(ts, clientScript, bindings);
78
+ if (refused.length > 0) {
79
+ return leftAsWritten(refused);
80
+ }
81
+ // Which script this is (see `ClientModule.id`): its line from 1, and its
82
+ // column from 0.
83
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(scriptRange.start);
84
+ const id = `${fileHash}:${line + 1}:${character}`;
85
+ // The function's parameters, as `ClientModule.params` describes them, and
86
+ // what a run passes: for each splice and tag, the host expression written
87
+ // there.
88
+ const objectLiteral = (properties) => ts.factory.createObjectLiteralExpression(Object.entries(properties).map(([name, value]) => ts.factory.createPropertyAssignment(name, value)), false);
89
+ const string = (text) => ts.factory.createStringLiteral(text);
90
+ const paramsLiteral = ts.factory.createArrayLiteralExpression(params.map((param) => {
91
+ switch (param.kind) {
92
+ case "splice":
93
+ return objectLiteral({
94
+ kind: string("splice"),
95
+ bindings: ts.factory.createArrayLiteralExpression(param.bindings.map(string), false),
96
+ });
97
+ case "capture":
98
+ return objectLiteral({
99
+ kind: string("capture"),
100
+ key: string(param.key),
101
+ });
102
+ }
103
+ }), false);
104
+ const argsLiteral = ts.factory.createArrayLiteralExpression(params.flatMap((param) => param.kind === "capture"
105
+ ? []
106
+ : [clientScript.splices[param.key].expression]), false);
107
+ // A splice that awaits is the host's `await`, where the template is: where
108
+ // the host may await, the script's function is async, and awaited there;
109
+ // elsewhere it isn't, so the splice's own `await` is refused where written.
110
+ const awaits = mayAwait(ts, sourceNode) &&
111
+ Object.values(clientScript.splices).some((splice) => splice.kind === "braced" && hasAwait(ts, splice.expression));
112
+ const emitted = emitScript(ts, clientScript, params.map(paramName), scriptEdits(clientScript, bindings, params));
113
+ return {
114
+ runtime: { id, params: paramsLiteral, args: argsLiteral, emitted },
115
+ awaits,
116
+ leftAsWritten: false,
117
+ diagnostics: [],
118
+ };
119
+ }
120
+ // Whether host code at `node` may `await`: in an async function, or at a
121
+ // module's top level.
122
+ function mayAwait(ts, node) {
123
+ for (let parent = node.parent; parent; parent = parent.parent) {
124
+ if (ts.isFunctionLike(parent)) {
125
+ return (ts
126
+ .getModifiers(parent)
127
+ ?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ??
128
+ false);
129
+ }
130
+ }
131
+ return true;
132
+ }
133
+ // An `await` in host code, but not one inside a function it holds, which is
134
+ // that function's own, nor in a nested script, which is checked as its own.
135
+ function hasAwait(ts, node) {
136
+ if (ts.isAwaitExpression(node)) {
137
+ return true;
138
+ }
139
+ if (ts.isFunctionLike(node) || ts.isTaggedTemplateExpression(node)) {
140
+ return false;
141
+ }
142
+ return ts.forEachChild(node, (child) => hasAwait(ts, child)) ?? false;
143
+ }
144
+ // Each `${…}` that isn't a splice: written in text (JSX text, a string, a
145
+ // comment) rather than code, where nothing reads its placeholder.
146
+ function unsplicedSpans(ts, { sourceFile, sourceNode, splices }) {
147
+ const spans = ts.isTemplateExpression(sourceNode.template)
148
+ ? sourceNode.template.templateSpans
149
+ : [];
150
+ return spans
151
+ .filter((_, index) => splices[`$0splice${index}`] === undefined)
152
+ .map((span) => ({
153
+ range: {
154
+ start: span.expression.getFullStart() - 2, // at `${`
155
+ end: span.literal.getStart(sourceFile) + 1, // past `}`
156
+ },
157
+ message: "This `${…}` is in text, not code, so it isn't spliced. As an " +
158
+ "element's child, write it in braces: `{${…}}`.",
159
+ category: ts.DiagnosticCategory.Error,
160
+ code: 0,
161
+ }));
162
+ }
163
+ // What a script may not write though TypeScript would read it: a name it
164
+ // declares where it can't, a tag naming what it doesn't declare, and a splice
165
+ // it can't spell unbraced.
166
+ function refusals(ts, script, bindings) {
167
+ const diagnostics = [];
168
+ const refuse = (node, message) => {
169
+ diagnostics.push({
170
+ range: script.toSourceRange(node),
171
+ message,
172
+ category: ts.DiagnosticCategory.Error,
173
+ code: 0,
174
+ });
175
+ };
176
+ const visit = (node) => {
177
+ const name = (ts.isVariableDeclaration(node) ||
178
+ ts.isBindingElement(node) ||
179
+ ts.isParameter(node) ||
180
+ ts.isFunctionDeclaration(node) ||
181
+ ts.isClassDeclaration(node)) &&
182
+ node.name !== undefined &&
183
+ ts.isIdentifier(node.name)
184
+ ? node.name
185
+ : undefined;
186
+ if (name !== undefined) {
187
+ // `$`-prefixed names splice host bindings, so a client script can't
188
+ // declare one: the declaration would shadow the shorthand.
189
+ if (name.text.startsWith("$")) {
190
+ refuse(name, "`$`-prefixed names are reserved for unbraced splices in a `cs` " +
191
+ "client script.");
192
+ }
193
+ else {
194
+ // Checked here rather than left to TypeScript: the virtual code binds
195
+ // renamed names, so its strict-mode checks never see these, and
196
+ // without strict mode it wouldn't check them at all.
197
+ const reason = strictReason(name.text);
198
+ if (reason !== null) {
199
+ refuse(name, `\`${name.text}\` is not allowed as a ${ts.isParameter(node) ? "parameter" : "variable declaration"} name: ${reason}.`);
200
+ }
201
+ }
202
+ }
203
+ // A component tag is the script's own or a host value spliced, `<$Card>`:
204
+ // the virtual code is checked in the host file, where an unmarked `<Card>`
205
+ // would quietly read the host's.
206
+ if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
207
+ // What the tag starts with: `Card`, or `ui` in `<ui.Card>`.
208
+ const root = tagRoot(ts, node.tagName);
209
+ const written = node.tagName.getText(script.fileWithPlaceholders);
210
+ if (root?.text.startsWith("$0splice")) {
211
+ refuse(root, "A tag splices a host value by its name, e.g. `<$Card>`, not " +
212
+ "with `${…}`.");
213
+ }
214
+ else if (root !== undefined &&
215
+ !root.text.startsWith("$") &&
216
+ // a name alone is a component's where it starts uppercase; a member
217
+ // of anything is one
218
+ (root !== node.tagName || isComponentTag(root.text)) &&
219
+ !bindings.has(root)) {
220
+ refuse(root, `\`<${written}>\` names nothing this script declares. A host value ` +
221
+ `used as a tag is spliced: \`<$${written}>\`.`);
222
+ }
223
+ }
224
+ node.forEachChild(visit);
225
+ };
226
+ visit(script.fileWithPlaceholders);
227
+ // A `$`-prefixed host binding has no shorthand: `$$x` stacks sigils
228
+ // unreadably, so it splices braced.
229
+ for (const splice of Object.values(script.splices)) {
230
+ if (splice.kind === "unbraced" && splice.expression.text.startsWith("$")) {
231
+ for (const ref of splice.refs) {
232
+ refuse(ref, `Can't splice \`${splice.expression.text}\` unbraced: a ` +
233
+ "`$`-prefixed host binding splices with braces, e.g. " +
234
+ `\`\${${splice.expression.text}}\`.`);
235
+ }
236
+ }
237
+ }
238
+ return diagnostics;
239
+ }
240
+ // Why strict mode forbids binding a name, or null where it doesn't.
241
+ function strictReason(name) {
242
+ switch (name) {
243
+ case "eval":
244
+ case "arguments":
245
+ return "strict mode forbids binding it";
246
+ case "let":
247
+ case "static":
248
+ case "yield":
249
+ case "implements":
250
+ case "interface":
251
+ case "package":
252
+ case "private":
253
+ case "protected":
254
+ case "public":
255
+ return "it is reserved in strict mode";
256
+ case "await":
257
+ return "it is reserved in module code";
258
+ default:
259
+ return null;
260
+ }
261
+ }
262
+ // A file's parse errors. Internal to TypeScript, which reports them only
263
+ // through a program; a script has no program of its own.
264
+ function parseDiagnostics(file) {
265
+ return file
266
+ .parseDiagnostics;
267
+ }
268
+ //# sourceMappingURL=rewriteScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteScript.js","sourceRoot":"","sources":["../src/rewriteScript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CodeInformation } from "./CodeInformation.js";
2
+ export type Segment = string | [
3
+ text: string,
4
+ source: string | undefined,
5
+ sourceOffset: number,
6
+ length: number,
7
+ data?: CodeInformation
8
+ ];
9
+ export declare function segmentsToString<T extends Segment>(segments: T[]): string;
@@ -0,0 +1,4 @@
1
+ export function segmentsToString(segments) {
2
+ return segments.map((s) => (typeof s === "string" ? s : s[0])).join("");
3
+ }
4
+ //# sourceMappingURL=segmentsToString.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmentsToString.js","sourceRoot":"","sources":["../src/segmentsToString.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,gBAAgB,CAAoB,QAAa;IAC/D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type ts from "typescript";
2
+ export declare function tagRoot(ts: typeof import("typescript"), tagName: ts.JsxTagNameExpression): ts.Identifier | undefined;
@@ -0,0 +1,10 @@
1
+ // The name a tag starts with: `Card` in `<Card>`, `Animated` in
2
+ // `<Animated.View>`; none where it starts with `this`.
3
+ export function tagRoot(ts, tagName) {
4
+ let at = tagName;
5
+ while (ts.isPropertyAccessExpression(at)) {
6
+ at = at.expression;
7
+ }
8
+ return ts.isIdentifier(at) ? at : undefined;
9
+ }
10
+ //# sourceMappingURL=tagRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagRoot.js","sourceRoot":"","sources":["../src/tagRoot.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,uDAAuD;AACvD,MAAM,UAAU,OAAO,CACrB,EAA+B,EAC/B,OAAgC;IAEhC,IAAI,EAAE,GAAY,OAAO,CAAC;IAC1B,OAAO,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC,EAAE,CAAC;QACzC,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC"}