From 4a5b9ec181008d0bbba1562c7f072f7a1a47a88b Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 16 Apr 2024 10:34:19 +0200 Subject: [PATCH] use local Svelte installation --- .../migrations/self-closing-tags/index.js | 20 ++++++++++++++++++- .../migrations/self-closing-tags/migrate.js | 19 ++++++++++++------ .../self-closing-tags/migrate.spec.js | 3 ++- packages/migrate/package.json | 6 ++++-- pnpm-lock.yaml | 16 ++++++++++++--- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/packages/migrate/migrations/self-closing-tags/index.js b/packages/migrate/migrations/self-closing-tags/index.js index 4b60382fb385..692c2012a35e 100644 --- a/packages/migrate/migrations/self-closing-tags/index.js +++ b/packages/migrate/migrations/self-closing-tags/index.js @@ -3,8 +3,18 @@ import fs from 'node:fs'; import prompts from 'prompts'; import glob from 'tiny-glob/sync.js'; import { remove_self_closing_tags } from './migrate.js'; +import { pathToFileURL } from 'node:url'; +import { resolve } from 'import-meta-resolve'; export async function migrate() { + let compiler; + try { + compiler = await import_from_cwd('svelte/compiler'); + } catch (e) { + console.log(colors.bold().red('❌ Could not find a local Svelte installation.')); + return; + } + console.log( colors.bold().yellow('\nThis will update .svelte files inside the current directory\n') ); @@ -26,7 +36,7 @@ export async function migrate() { for (const file of files) { try { - const code = await remove_self_closing_tags(fs.readFileSync(file, 'utf-8')); + const code = await remove_self_closing_tags(compiler, fs.readFileSync(file, 'utf-8')); fs.writeFileSync(file, code); } catch (e) { // continue @@ -36,3 +46,11 @@ export async function migrate() { console.log(colors.bold().green('✔ Your project has been updated')); console.log(' If using Prettier, please upgrade to the latest prettier-plugin-svelte version'); } + +/** @param {string} name */ +async function import_from_cwd(name) { + const cwd = pathToFileURL(process.cwd()).href; + const url = await resolve(name, cwd + '/x.js'); + + return import(url); +} diff --git a/packages/migrate/migrations/self-closing-tags/migrate.js b/packages/migrate/migrations/self-closing-tags/migrate.js index 080e25fe8ab4..8145b199079b 100644 --- a/packages/migrate/migrations/self-closing-tags/migrate.js +++ b/packages/migrate/migrations/self-closing-tags/migrate.js @@ -1,5 +1,5 @@ import MagicString from 'magic-string'; -import { parse, preprocess, walk } from 'svelte/compiler'; +import { walk } from 'zimmerframe'; const VoidElements = [ 'area', @@ -109,15 +109,20 @@ const SVGElements = [ 'vkern' ]; -/** @param {string} source */ -export async function remove_self_closing_tags(source) { +/** + * @param {{ preprocess: any, parse: any }} svelte_compiler + * @param {string} source + */ +export async function remove_self_closing_tags({ preprocess, parse }, source) { const preprocessed = await preprocess(source, { + /** @param {{ content: string }} input */ script: ({ content }) => ({ code: content .split('\n') .map((line) => ' '.repeat(line.length)) .join('\n') }), + /** @param {{ content: string }} input */ style: ({ content }) => ({ code: content .split('\n') @@ -132,9 +137,8 @@ export async function remove_self_closing_tags(source) { let is_foreign = false; let is_custom_element = false; - walk(/** @type {any} */ (ast.html), { - /** @param {Record} node */ - enter(node) { + walk(ast.html, null, { + _(node, { next, stop }) { if (node.type === 'Options') { const namespace = node.attributes.find( /** @param {any} a */ @@ -142,6 +146,7 @@ export async function remove_self_closing_tags(source) { ); if (namespace?.value[0].data === 'foreign') { is_foreign = true; + stop(); return; } @@ -172,6 +177,8 @@ export async function remove_self_closing_tags(source) { } }); } + + next(); } }); diff --git a/packages/migrate/migrations/self-closing-tags/migrate.spec.js b/packages/migrate/migrations/self-closing-tags/migrate.spec.js index ded823a9c882..d45d04991d16 100644 --- a/packages/migrate/migrations/self-closing-tags/migrate.spec.js +++ b/packages/migrate/migrations/self-closing-tags/migrate.spec.js @@ -1,4 +1,5 @@ import { assert, test } from 'vitest'; +import * as compiler from 'svelte/compiler'; import { remove_self_closing_tags } from './migrate.js'; /** @type {Record} */ @@ -25,6 +26,6 @@ const tests = { for (const input in tests) { test(input, async () => { const output = tests[input]; - assert.equal(await remove_self_closing_tags(input), output); + assert.equal(await remove_self_closing_tags(compiler, input), output); }); } diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 215e9f2adf48..1957bdfb09cd 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -24,20 +24,22 @@ "!migrations/**/samples.md" ], "dependencies": { + "import-meta-resolve": "^4.0.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", "prompts": "^2.4.2", "semver": "^7.5.4", - "svelte": "^4.0.0", "tiny-glob": "^0.2.9", "ts-morph": "^22.0.0", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "zimmerframe": "^1.1.2" }, "devDependencies": { "@types/node": "^18.19.3", "@types/prompts": "^2.4.9", "@types/semver": "^7.5.6", "prettier": "^3.1.1", + "svelte": "^4.2.10", "vitest": "^1.5.0" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8dffdd1de52..c420992d9b78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1077,6 +1077,9 @@ importers: packages/migrate: dependencies: + import-meta-resolve: + specifier: ^4.0.0 + version: 4.0.0 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -1089,9 +1092,6 @@ importers: semver: specifier: ^7.5.4 version: 7.6.0 - svelte: - specifier: ^4.0.0 - version: 4.2.14 tiny-glob: specifier: ^0.2.9 version: 0.2.9 @@ -1101,6 +1101,9 @@ importers: typescript: specifier: ^5.3.3 version: 5.4.5 + zimmerframe: + specifier: ^1.1.2 + version: 1.1.2 devDependencies: '@types/node': specifier: ^18.19.3 @@ -1114,6 +1117,9 @@ importers: prettier: specifier: ^3.1.1 version: 3.2.5 + svelte: + specifier: ^4.2.10 + version: 4.2.14 vitest: specifier: ^1.5.0 version: 1.5.0(@types/node@18.19.31)(lightningcss@1.24.1) @@ -7460,6 +7466,10 @@ packages: stacktracey: 2.1.8 dev: false + /zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + dev: false + /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false