@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
94 lines • 4.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.tuiLetMigration = tuiLetMigration;
const schematics_1 = require("@angular/cdk/schematics");
const ng_morph_1 = require("ng-morph");
const file_globs_1 = require("../../../constants/file-globs");
const colored_log_1 = require("../../../utils/colored-log");
const remove_module_1 = require("../../../utils/remove-module");
const get_component_templates_1 = require("../../../utils/templates/get-component-templates");
const template_resource_1 = require("../../../utils/templates/template-resource");
const get_file_system_1 = require("../../utils/get-file-system");
const STRUCTURAL_ATTR = '*tuiLet';
function tuiLetMigration(tree, options) {
const fileSystem = (0, get_file_system_1.getFileSystem)(tree);
(0, remove_module_1.removeModule)('TuiLet', '@taiga-ui/cdk');
const resources = (0, get_component_templates_1.getComponentTemplates)(file_globs_1.ALL_FILES);
for (const resource of resources) {
migrateTemplate(resource, fileSystem, options);
}
fileSystem.commitEdits();
(0, ng_morph_1.saveActiveProject)();
}
function migrateTemplate(resource, fileSystem, options) {
const templatePath = fileSystem.resolve((0, template_resource_1.getPathFromTemplateResource)(resource));
const template = (0, template_resource_1.getTemplateFromTemplateResource)(resource, fileSystem);
const recorder = fileSystem.edit(templatePath);
const offset = (0, template_resource_1.getTemplateOffset)(resource);
const elements = (0, schematics_1.findElementsWithAttribute)(template, STRUCTURAL_ATTR);
for (const element of elements) {
migrateStructuralLet(element, template, recorder, offset, options);
}
}
function migrateStructuralLet(element, template, recorder, offset, options) {
const attr = element.attrs.find((a) => a.name === STRUCTURAL_ATTR.toLowerCase());
if (!attr) {
return;
}
const { expr, key } = parseLetExpression(attr.value);
if (!expr || !key) {
return;
}
if (containsDuplicateLet(template, key)) {
if (!options['skip-logs']) {
(0, colored_log_1.errorLog)(`The @let with key ${key} is already defined`);
}
return;
}
insertLetDeclaration({ recorder, offset, element, template, expr, key });
removeStructuralAttribute({ recorder, offset, element, attr });
}
function parseLetExpression(value) {
const [expr = '', key = ''] = value.split(' as ').map((v) => v.trim());
return { expr, key };
}
function containsDuplicateLet(template, key) {
const pattern = new RegExp(String.raw `@let\s+${key}\s+=`);
return pattern.test(template);
}
function insertLetDeclaration({ recorder, element, key, expr, template, offset, }) {
const loc = element.sourceCodeLocation;
const indent = computeIndent(template, loc.startOffset);
const indentStr = ' '.repeat(indent);
recorder.insertLeft(offset + loc.startOffset, `@let ${key} = ${expr};\n${indentStr}`);
}
function computeIndent(template, pos) {
const lastNewLine = template.lastIndexOf('\n', pos);
return pos - (lastNewLine + 1);
}
function removeStructuralAttribute({ recorder, offset, element, attr, }) {
var _a;
const loc = element.sourceCodeLocation;
const attrLoc = (_a = loc.attrs) === null || _a === void 0 ? void 0 : _a[attr.name];
const isPureNgContainer = element.tagName === 'ng-container' && element.attrs.length === 1;
if (isPureNgContainer) {
unwrapNgContainer(recorder, offset, element);
return;
}
if (attrLoc) {
recorder.remove(offset + attrLoc.startOffset - 1, attrLoc.endOffset - attrLoc.startOffset + 1);
}
}
function unwrapNgContainer(recorder, offset, element) {
const loc = element.sourceCodeLocation;
const children = element.childNodes;
if (!children.length) {
recorder.remove(offset + loc.startOffset, loc.endOffset - loc.startOffset);
return;
}
const first = children[0].sourceCodeLocation;
const last = children[children.length - 1].sourceCodeLocation;
recorder.remove(offset + loc.startOffset, first.startOffset - loc.startOffset);
recorder.remove(offset + last.endOffset, loc.endOffset - last.endOffset);
}
//# sourceMappingURL=migrate-tui-let.js.map