summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Matthew Phillips <matthew@matthewphillips.info> 2021-03-16 16:36:43 -0400
committerGravatar GitHub <noreply@github.com> 2021-03-16 16:36:43 -0400
commit09324014338f30914a83f1b6481a78f48f525047 (patch)
treeb0082782ff9a2309b5d56d930bf1666192883db3 /src
parent588b086a4dc45e717341e18728fff65a90ddf46c (diff)
downloadastro-09324014338f30914a83f1b6481a78f48f525047.tar.gz
astro-09324014338f30914a83f1b6481a78f48f525047.tar.zst
astro-09324014338f30914a83f1b6481a78f48f525047.zip
TypeScript support (#5)
This makes it so that setup scripts are treated as TypeScript.
Diffstat (limited to 'src')
-rw-r--r--src/transform2.ts37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/transform2.ts b/src/transform2.ts
index 8f67e4523..106a9680d 100644
--- a/src/transform2.ts
+++ b/src/transform2.ts
@@ -153,11 +153,39 @@ function getComponentWrapper(_name: string, { type, url }: { type: string; url:
throw new Error('Unknown Component Type: ' + name);
}
+const patternImport = new RegExp(/import(?:["'\s]*([\w*${}\n\r\t, ]+)from\s*)?["'\s]["'\s](.*[@\w_-]+)["'\s].*;$/, 'mg');
+function compileScriptSafe(raw: string, loader:'jsx' | 'tsx'): string {
+ // esbuild treeshakes unused imports. In our case these are components, so let's keep them.
+ const imports: Array<string> = [];
+ raw.replace(patternImport, (value: string) => {
+ imports.push(value);
+ return value;
+ })
+
+ let { code } = transformSync(raw, {
+ loader,
+ jsxFactory: 'h',
+ jsxFragment: 'Fragment',
+ charset: 'utf8',
+ });
+
+ for(let importStatement of imports) {
+ if(!code.includes(importStatement)) {
+ code = importStatement + '\n' + code;
+ }
+ }
+
+ return code;
+}
+
async function convertHmxToJsx(template: string, compileOptions: CompileOptions) {
await eslexer.init;
const ast = parse(template, {});
- const script = ast.instance ? ast.instance.content : "";
+ const script = compileScriptSafe(ast.instance ? ast.instance.content : "", 'tsx');
+
+ // Compile scripts as TypeScript, always
+
// Todo: Validate that `h` and `Fragment` aren't defined in the script
const [scriptImports] = eslexer.parse(script, 'optional-sourcename');
@@ -182,12 +210,7 @@ async function convertHmxToJsx(template: string, compileOptions: CompileOptions)
// console.log("enter", node.type);
switch (node.type) {
case 'MustacheTag':
- let { code } = transformSync(node.expression, {
- loader: 'jsx',
- jsxFactory: 'h',
- jsxFragment: 'Fragment',
- charset: 'utf8',
- });
+ let code = compileScriptSafe(node.expression, 'jsx');
let matches: RegExpExecArray[] = [];
let match: RegExpExecArray | null | undefined;