svelte-migrate
Version:
A CLI for migrating Svelte(Kit) codebases
85 lines (78 loc) • 2.29 kB
JavaScript
import * as p from '@clack/prompts';
import fs from 'node:fs';
import pc from 'picocolors';
import MagicString from 'magic-string';
import ts from 'typescript';
export function migrate_config() {
try {
const content = fs.readFileSync('svelte.config.js', 'utf8');
fs.writeFileSync('svelte.config.js', remove_package_from_config(content));
} catch {
p.log.warning(
pc.bold(
pc.yellow(
'Could not remove package config from svelte.config.js, please remove it manually'
)
)
);
}
}
/**
* @param {string} content
*/
export function remove_package_from_config(content) {
const ast = ts.createSourceFile(
'filename.ts',
content,
ts.ScriptTarget.Latest,
true,
ts.ScriptKind.TS
);
const code = new MagicString(content);
for (const statement of ast.statements) {
if (ts.isExportAssignment(statement)) {
if (ts.isObjectLiteralExpression(statement.expression)) {
remove(statement.expression);
} else if (ts.isIdentifier(statement.expression)) {
for (const statement2 of ast.statements) {
if (ts.isVariableStatement(statement2)) {
for (const declaration of statement2.declarationList.declarations) {
if (
ts.isIdentifier(declaration.name) &&
declaration.name.text === statement.expression.text &&
declaration.initializer &&
ts.isObjectLiteralExpression(declaration.initializer)
) {
remove(declaration.initializer);
}
}
}
}
}
}
}
return code.toString();
/** @param {ts.ObjectLiteralExpression} expression */
function remove(expression) {
for (let i = 0; i < expression.properties.length; i++) {
const property = expression.properties[i];
if (
ts.isPropertyAssignment(property) &&
ts.isIdentifier(property.name) &&
property.name.text === 'package' &&
ts.isObjectLiteralExpression(property.initializer)
) {
if (expression.properties.length === 1) {
code.overwrite(expression.getStart(), expression.getEnd(), '{}');
} else {
const next_property = expression.properties[i + 1];
if (next_property) {
code.remove(property.getStart(), next_property.getStart());
} else {
code.remove(property.getStart(), content.lastIndexOf('}', expression.getEnd()));
}
}
}
}
}
}