diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/optimize/index.ts | 10 | ||||
-rw-r--r-- | src/compiler/optimize/module-scripts.ts | 42 |
2 files changed, 49 insertions, 3 deletions
diff --git a/src/compiler/optimize/index.ts b/src/compiler/optimize/index.ts index d86ce3c24..e73c93c7c 100644 --- a/src/compiler/optimize/index.ts +++ b/src/compiler/optimize/index.ts @@ -1,10 +1,13 @@ -import { walk } from 'estree-walker'; import type { Ast, TemplateNode } from '../../parser/interfaces'; -import { NodeVisitor, Optimizer, VisitorFn } from '../../@types/optimizer'; +import type { CompileOptions } from '../../@types/compiler'; +import type { NodeVisitor, Optimizer, VisitorFn } from '../../@types/optimizer'; + +import { walk } from 'estree-walker'; // Optimizers import optimizeStyles from './styles.js'; import optimizeDoctype from './doctype.js'; +import optimizeModuleScripts from './module-scripts.js'; interface VisitorCollection { enter: Map<string, VisitorFn[]>; @@ -67,6 +70,7 @@ function walkAstWithVisitors(tmpl: TemplateNode, collection: VisitorCollection) } interface OptimizeOptions { + compileOptions: CompileOptions; filename: string; fileID: string; } @@ -76,7 +80,7 @@ export async function optimize(ast: Ast, opts: OptimizeOptions) { const cssVisitors = createVisitorCollection(); const finalizers: Array<() => Promise<void>> = []; - const optimizers = [optimizeStyles(opts), optimizeDoctype(opts)]; + const optimizers = [optimizeStyles(opts), optimizeDoctype(opts), optimizeModuleScripts(opts)]; for (const optimizer of optimizers) { collectVisitors(optimizer, htmlVisitors, cssVisitors, finalizers); diff --git a/src/compiler/optimize/module-scripts.ts b/src/compiler/optimize/module-scripts.ts new file mode 100644 index 000000000..713747fcb --- /dev/null +++ b/src/compiler/optimize/module-scripts.ts @@ -0,0 +1,42 @@ +import type { Optimizer } from '../../@types/optimizer'; +import type { CompileOptions } from '../../@types/compiler'; + +import path from 'path'; +import { getAttrValue, setAttrValue } from '../../ast.js'; + +export default function ({ compileOptions, filename }: { compileOptions: CompileOptions; filename: string; fileID: string }): Optimizer { + const { astroConfig } = compileOptions; + const { astroRoot } = astroConfig; + const fileUrl = new URL(`file://${filename}`); + + return { + visitors: { + html: { + Element: { + enter(node) { + let name = node.name; + if (name !== 'script') { + return; + } + + let type = getAttrValue(node.attributes, 'type'); + if (type !== 'module') { + return; + } + + let src = getAttrValue(node.attributes, 'src'); + if (!src || !src.startsWith('.')) { + return; + } + + const srcUrl = new URL(src, fileUrl); + const fromAstroRoot = path.posix.relative(astroRoot.pathname, srcUrl.pathname); + const absoluteUrl = `/_astro/${fromAstroRoot}`; + setAttrValue(node.attributes, 'src', absoluteUrl); + }, + }, + }, + }, + async finalize() {}, + }; +} |