const path = require('node:path');
const replacements = new Map([
['HelpBubbleMixin', 'HelpBubbleMixinLit'],
['I18nMixin', 'I18nMixinLit'],
['PolymerElement', 'CrLitElement'],
['WebUiListenerMixin', 'WebUiListenerMixinLit'],
[
'//resources/cr_components/help_bubble/help_bubble_mixin.js',
'//resources/cr_components/help_bubble/help_bubble_mixin_lit.js',
],
[
'//resources/cr_elements/i18n_mixin.js',
'//resources/cr_elements/i18n_mixin_lit.js',
],
[
'//resources/cr_elements/web_ui_listener_mixin.js',
'//resources/cr_elements/web_ui_listener_mixin_lit.js',
],
[
'//resources/polymer/v3_0/polymer/polymer_bundled.min.js',
'//resources/lit/v3_0/lit.rollup.js',
],
['SettingsMixin', 'SettingsMixinLit'],
['SelectMixin', 'SelectMixinLit'],
['settings_mixin.js', 'settings_mixin_lit.js'],
['select_mixin.js', 'select_mixin_lit.js'],
]);
const OLD_GET_TEMPLATE = `static get template() {
return getTemplate();
}`;
const NEW_GET_TEMPLATE = `static override get styles() {
return getCss();
}
override render() {
return getHtml.bind(this)();
}`;
function getOldTemplateImport(basename) {
return `import {getTemplate} from './${basename}.html.js';`;
}
function getNewTemplateImport(basename) {
return `import {getCss} from './${basename}.css.js';
import {getHtml} from './${basename}.html.js';`;
}
module.exports = function transformer(file, api) {
let source = file.source;
for (const [from, to] of replacements.entries()) {
source = source.replaceAll(from, to);
}
const basename = path.basename(file.path, '.ts');
const OLD_TEMPLATE_IMPORT = getOldTemplateImport(basename);
const NEW_TEMPLATE_IMPORT = getNewTemplateImport(basename);
source = source.replace(OLD_TEMPLATE_IMPORT, NEW_TEMPLATE_IMPORT);
source = source.replace(OLD_GET_TEMPLATE, NEW_GET_TEMPLATE);
source = source.replace(
'static get properties() {', 'static override get properties() {');
source = source.replaceAll('reflectToAttribute: true', 'reflect: true');
source = source.replaceAll(' declare ', ' accessor ');
source = source.replaceAll(' accessor private ', ' private accessor ');
source = source.replace('override ready() {', 'override firstUpdated() {');
source = source.replace(/\s+super.ready\(\);\n/, '');
const j = api.jscodeshift;
const root = j(source);
root.find(j.Function, {key: {name: 'properties'}})
.find(j.ObjectExpression)
.forEach(p => {
p.value.properties.forEach(property => {
if (p.parentPath.value.type !== 'ReturnStatement') {
return;
}
if (property.value.type === 'ObjectExpression') {
return;
}
const expression = j.objectExpression([
j.property(
'init', j.identifier('type'),
j.identifier(property.value.name)),
]);
property.value = expression;
});
});
const outputOptions = {quote: 'single'};
return root.toSource(outputOptions);
};