From 72d9ece6db9cd57c865108b5fad43cbd5728e204 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 6 Apr 2021 16:14:42 -0400 Subject: Compiler cleanup (#64) * Compiler cleanup This is general compiler cleanup, especially around the codegen part. Goals here were too: 1. Make it possible to compile HTML recursively (needed for future astro-in-expressions work) by moving that work into its own function. 1. Get rid of collectionItems and have compiling the HTML return just a source string. Also not planned, this change gets rid of the different between components and pages. All Astro components compile to the same JavaScript. * Remove unused node types --- src/compiler/codegen.ts | 139 +++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 68 deletions(-) (limited to 'src/compiler/codegen.ts') diff --git a/src/compiler/codegen.ts b/src/compiler/codegen.ts index 0447cbdc7..a08db028f 100644 --- a/src/compiler/codegen.ts +++ b/src/compiler/codegen.ts @@ -1,6 +1,6 @@ import type { CompileOptions } from '../@types/compiler'; import type { AstroConfig, ValidExtensionPlugins } from '../@types/astro'; -import type { Ast, TemplateNode } from '../parser/interfaces'; +import type { Ast, Script, Style, TemplateNode } from '../parser/interfaces'; import type { JsxItem, TransformResult } from '../@types/astro'; import eslexer from 'es-module-lexer'; @@ -262,17 +262,18 @@ async function acquireDynamicComponentImports(plugins: Set { - const { extensions = defaultExtensions, astroConfig } = compileOptions; - await eslexer.init; +type Components = Record; + +interface CodegenState { + filename: string; + components: Components; + css: string[]; + importExportStatements: Set; + dynamicImports: DynamicImportMap; +} + +function compileModule(module: Script, state: CodegenState, compileOptions: CompileOptions) { + const { extensions = defaultExtensions } = compileOptions; const componentImports: ImportDeclaration[] = []; const componentProps: VariableDeclarator[] = []; @@ -280,12 +281,10 @@ export async function codegen(ast: Ast, { compileOptions, filename }: CodeGenOpt let script = ''; let propsStatement = ''; - const importExportStatements: Set = new Set(); - const components: Record = {}; const componentPlugins = new Set(); - if (ast.module) { - const program = babelParser.parse(ast.module.content, { + if (module) { + const program = babelParser.parse(module.content, { sourceType: 'module', plugins: ['jsx', 'typescript', 'topLevelAwait'], }).program; @@ -317,7 +316,7 @@ export async function codegen(ast: Ast, { compileOptions, filename }: CodeGenOpt const componentType = path.posix.extname(importUrl); const componentName = path.posix.basename(importUrl, componentType); const plugin = extensions[componentType] || defaultExtensions[componentType]; - components[componentName] = { + state.components[componentName] = { type: componentType, plugin, url: importUrl, @@ -325,10 +324,10 @@ export async function codegen(ast: Ast, { compileOptions, filename }: CodeGenOpt if (plugin) { componentPlugins.add(plugin); } - importExportStatements.add(ast.module.content.slice(componentImport.start!, componentImport.end!)); + state.importExportStatements.add(module.content.slice(componentImport.start!, componentImport.end!)); } for (const componentImport of componentExports) { - importExportStatements.add(ast.module.content.slice(componentImport.start!, componentImport.end!)); + state.importExportStatements.add(module.content.slice(componentImport.start!, componentImport.end!)); } if (componentProps.length > 0) { @@ -345,18 +344,14 @@ export async function codegen(ast: Ast, { compileOptions, filename }: CodeGenOpt script = propsStatement + babelGenerator(program).code; } - const dynamicImports = await acquireDynamicComponentImports(componentPlugins, compileOptions.resolve); - - let items: JsxItem[] = []; - let collectionItem: JsxItem | undefined; - let currentItemName: string | undefined; - let currentDepth = 0; - let css: string[] = []; + return { script, componentPlugins }; +} - walk(ast.css, { +function compileCss(style: Style, state: CodegenState) { + walk(style, { enter(node: TemplateNode) { if (node.type === 'Style') { - css.push(node.content.styles); // if multiple