From 9a5088b705d3084ecbdee4bcc858610380c3ac53 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 26 Apr 2024 15:49:23 +0200 Subject: [PATCH] props alias --- packages/svelte/src/compiler/migrate/index.js | 24 +++++++++++++++++++ .../samples/props-export-alias/input.svelte | 6 +++++ .../samples/props-export-alias/output.svelte | 8 +++++++ 3 files changed, 38 insertions(+) create mode 100644 packages/svelte/tests/migrate/samples/props-export-alias/input.svelte create mode 100644 packages/svelte/tests/migrate/samples/props-export-alias/output.svelte diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index 5de2bebc65..5c94738f7f 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -163,6 +163,27 @@ const instance_script = { Identifier(node, { state }) { handle_identifier(node, state); }, + ExportNamedDeclaration(node, { state, next }) { + if (node.declaration) { + next(); + return; + } + + let count_removed = 0; + for (const specifier of node.specifiers) { + const binding = state.scope.get(specifier.local.name); + if (binding?.kind === 'bindable_prop') { + state.str.remove( + /** @type {number} */ (specifier.start), + /** @type {number} */ (specifier.end) + ); + count_removed++; + } + } + if (count_removed === node.specifiers.length) { + state.str.remove(/** @type {number} */ (node.start), /** @type {number} */ (node.end)); + } + }, VariableDeclaration(node, { state, path }) { if (state.scope !== state.analysis.instance.scope) { return; @@ -192,6 +213,9 @@ const instance_script = { if (declarator.id.type !== 'Identifier') { // TODO + throw new Error( + 'Encountered an export declaration pattern that is not supported for automigration.' + ); // Turn export let into props. It's really really weird because export let { x: foo, z: [bar]} = .. // means that foo and bar are the props (i.e. the leafs are the prop names), not x and z. // const tmp = state.scope.generate('tmp'); diff --git a/packages/svelte/tests/migrate/samples/props-export-alias/input.svelte b/packages/svelte/tests/migrate/samples/props-export-alias/input.svelte new file mode 100644 index 0000000000..1cb57ef5fd --- /dev/null +++ b/packages/svelte/tests/migrate/samples/props-export-alias/input.svelte @@ -0,0 +1,6 @@ + + +{klass} diff --git a/packages/svelte/tests/migrate/samples/props-export-alias/output.svelte b/packages/svelte/tests/migrate/samples/props-export-alias/output.svelte new file mode 100644 index 0000000000..76d25afb08 --- /dev/null +++ b/packages/svelte/tests/migrate/samples/props-export-alias/output.svelte @@ -0,0 +1,8 @@ + + +{klass} \ No newline at end of file