fix: return ast from `compile`

Was returned from Svelte 4's compile method, and language tools uses it in various places for perf reasons (not doing double parses unnecessarily if you need both)
compile-return-ast
Simon Holthausen 6 months ago
parent a271878abe
commit c87affdef4

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: return ast from `compile`

@ -28,7 +28,7 @@ export function compile(source, options) {
});
const analysis = analyze_component(parsed, combined_options);
const result = transform_component(analysis, source, combined_options);
const result = transform_component(parsed, analysis, source, combined_options);
return result;
} catch (e) {
if (e instanceof CompileError) {
@ -45,7 +45,7 @@ export function compile(source, options) {
* https://svelte.dev/docs/svelte-compiler#svelte-compile
* @param {string} source The component source code
* @param {import('#compiler').ModuleCompileOptions} options
* @returns {import('#compiler').CompileResult}
* @returns {import('#compiler').ModuleCompileResult}
*/
export function compileModule(source, options) {
try {

@ -5,12 +5,13 @@ import { client_component, client_module } from './client/transform-client.js';
import { getLocator } from 'locate-character';
/**
* @param {import('#compiler').Root} ast
* @param {import('../types').ComponentAnalysis} analysis
* @param {string} source
* @param {import('#compiler').ValidatedCompileOptions} options
* @returns {import('#compiler').CompileResult}
*/
export function transform_component(analysis, source, options) {
export function transform_component(ast, analysis, source, options) {
if (options.generate === false) {
return {
js: /** @type {any} */ (null),
@ -18,7 +19,8 @@ export function transform_component(analysis, source, options) {
warnings: transform_warnings(source, options.filename, analysis.warnings),
metadata: {
runes: analysis.runes
}
},
ast
};
}
@ -50,7 +52,8 @@ export function transform_component(analysis, source, options) {
warnings: transform_warnings(source, options.filename, analysis.warnings),
metadata: {
runes: analysis.runes
}
},
ast
};
}
@ -58,13 +61,12 @@ export function transform_component(analysis, source, options) {
* @param {import('../types').Analysis} analysis
* @param {string} source
* @param {import('#compiler').ValidatedModuleCompileOptions} options
* @returns {import('#compiler').CompileResult}
* @returns {import('#compiler').ModuleCompileResult}
*/
export function transform_module(analysis, source, options) {
if (options.generate === false) {
return {
js: /** @type {any} */ (null),
css: null,
warnings: transform_warnings(source, analysis.name, analysis.warnings),
metadata: {
runes: true
@ -89,7 +91,6 @@ export function transform_module(analysis, source, options) {
return {
js: print(program, {}),
css: null,
warnings: transform_warnings(source, analysis.name, analysis.warnings),
metadata: {
runes: true

@ -11,10 +11,10 @@ import type { SourceMap } from 'magic-string';
import type { Context } from 'zimmerframe';
import type { Scope } from '../phases/scope.js';
import * as Css from './css.js';
import type { EachBlock, Namespace, SvelteNode } from './template.js';
import type { EachBlock, Namespace, Root, SvelteNode } from './template.js';
/** The return value of `compile` from `svelte/compiler` */
export interface CompileResult {
/** The return value of `compileModule` from `svelte/compiler` */
export interface ModuleCompileResult {
/** The compiled JavaScript */
js: {
/** The generated code */
@ -22,13 +22,6 @@ export interface CompileResult {
/** A source map */
map: SourceMap;
};
/** The compiled CSS */
css: null | {
/** The generated code */
code: string;
/** A source map */
map: SourceMap;
};
/**
* An array of warning objects that were generated during compilation. Each warning has several properties:
* - `code` is a string identifying the category of warning
@ -48,6 +41,19 @@ export interface CompileResult {
};
}
/** The return value of `compile` from `svelte/compiler` */
export interface CompileResult extends ModuleCompileResult {
/** The compiled CSS */
css: null | {
/** The generated code */
code: string;
/** A source map */
map: SourceMap;
};
/** The AST */
ast: Root;
}
export interface Warning {
start?: Location;
end?: Location;

@ -502,7 +502,7 @@ declare module 'svelte/compiler' {
* https://svelte.dev/docs/svelte-compiler#svelte-compile
* @param source The component source code
* */
export function compileModule(source: string, options: ModuleCompileOptions): CompileResult;
export function compileModule(source: string, options: ModuleCompileOptions): ModuleCompileResult;
/**
* The parse function parses a component, returning only its abstract syntax tree.
*
@ -519,8 +519,8 @@ declare module 'svelte/compiler' {
* @deprecated Replace this with `import { walk } from 'estree-walker'`
* */
function walk(): never;
/** The return value of `compile` from `svelte/compiler` */
interface CompileResult {
/** The return value of `compileModule` from `svelte/compiler` */
interface ModuleCompileResult {
/** The compiled JavaScript */
js: {
/** The generated code */
@ -528,13 +528,6 @@ declare module 'svelte/compiler' {
/** A source map */
map: SourceMap;
};
/** The compiled CSS */
css: null | {
/** The generated code */
code: string;
/** A source map */
map: SourceMap;
};
/**
* An array of warning objects that were generated during compilation. Each warning has several properties:
* - `code` is a string identifying the category of warning
@ -554,6 +547,19 @@ declare module 'svelte/compiler' {
};
}
/** The return value of `compile` from `svelte/compiler` */
interface CompileResult extends ModuleCompileResult {
/** The compiled CSS */
css: null | {
/** The generated code */
code: string;
/** A source map */
map: SourceMap;
};
/** The AST */
ast: Root;
}
interface Warning {
start?: Location;
end?: Location;

Loading…
Cancel
Save