diff --git a/packages/svelte/src/compiler/index.js b/packages/svelte/src/compiler/index.js index 599206ac6a..f637179597 100644 --- a/packages/svelte/src/compiler/index.js +++ b/packages/svelte/src/compiler/index.js @@ -4,7 +4,6 @@ import { walk as zimmerframe_walk } from 'zimmerframe'; import { convert } from './legacy.js'; import { parse as _parse, Parser } from './phases/1-parse/index.js'; -import { remove_typescript_nodes } from './phases/1-parse/remove_typescript_nodes.js'; import { parse_stylesheet } from './phases/1-parse/read/style.js'; import { analyze_component, analyze_module } from './phases/2-analyze/index.js'; import { transform_component, transform_module } from './phases/3-transform/index.js'; @@ -26,7 +25,7 @@ export function compile(source, options) { const validated = validate_component_options(options, ''); - let parsed = _parse(source); + const parsed = _parse(source, false, true); const { customElement: customElementOptions, ...parsed_options } = parsed.options || {}; @@ -39,20 +38,6 @@ export function compile(source, options) { runes: 'runes' in parsed_options ? () => parsed_options.runes : validated.runes }; - if (parsed.metadata.ts) { - parsed = { - ...parsed, - fragment: parsed.fragment && remove_typescript_nodes(parsed.fragment), - instance: parsed.instance && remove_typescript_nodes(parsed.instance), - module: parsed.module && remove_typescript_nodes(parsed.module) - }; - if (combined_options.customElementOptions?.extend) { - combined_options.customElementOptions.extend = remove_typescript_nodes( - combined_options.customElementOptions?.extend - ); - } - } - const analysis = analyze_component(parsed, source, combined_options); const result = transform_component(analysis, source, combined_options); result.ast = to_public_ast(source, parsed, options.modernAst); diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 3fb7243e39..fa3c2ff808 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -73,8 +73,9 @@ export class Parser { /** * @param {string} template * @param {boolean} loose + * @param {boolean} [erase] hand back JavaScript for TypeScript input, as the compiler wants it */ - constructor(template, loose) { + constructor(template, loose, erase = false) { if (typeof template !== 'string') { throw new TypeError('Template must be a string'); } @@ -92,9 +93,11 @@ export class Parser { this.ts = match_lang?.[2] === 'ts'; this.js = new Source(this.template, { sourceType: 'module', - typescript: this.ts, + typescript: this.ts && (erase ? 'erase' : true), comments: true, - locations: true + locations: true, + // a script may export what the component declares elsewhere + allowUndeclaredExports: true }); this.root = { @@ -337,12 +340,13 @@ export class Parser { /** * @param {string} template * @param {boolean} [loose] + * @param {boolean} [erase] hand back JavaScript for TypeScript input, as the compiler wants it * @returns {AST.Root} */ -export function parse(template, loose = false) { +export function parse(template, loose = false, erase = false) { state.set_source(template); - const parser = new Parser(template, loose); + const parser = new Parser(template, loose, erase); return parser.root; } diff --git a/packages/svelte/src/compiler/phases/1-parse/js.js b/packages/svelte/src/compiler/phases/1-parse/js.js index af965e259d..6a60d01af7 100644 --- a/packages/svelte/src/compiler/phases/1-parse/js.js +++ b/packages/svelte/src/compiler/phases/1-parse/js.js @@ -5,45 +5,73 @@ import * as teasel from '@teasel/parser'; import * as e from '../../errors.js'; /** + * A standalone module, as `analyze_module` reads one. * @param {string} source * @param {AST.JSComment[]} comments * @param {boolean} typescript - * @param {boolean} [is_script] a `