UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

105 lines 4.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.migrateSidebar = migrateSidebar; const insert_todo_1 = require("../../../../utils/insert-todo"); const elements_1 = require("../../../../utils/templates/elements"); const template_resource_1 = require("../../../../utils/templates/template-resource"); const SIDEBAR_ATTR = `*${'tuiSidebar'.toLowerCase()}`; const SIDEBAR_DIRECTION_ATTRS = new Set([ 'tuiSidebarDirection'.toLowerCase(), `[${'tuiSidebarDirection'.toLowerCase()}]`, ]); const SIDEBAR_AUTO_WIDTH_ATTRS = new Set([ 'tuiSidebarAutoWidth'.toLowerCase(), `[${'tuiSidebarAutoWidth'.toLowerCase()}]`, ]); const AUTO_WIDTH_MIGRATION_COMMENT = `<!-- ${insert_todo_1.TODO_MARK} tuiSidebarAutoWidth has no equivalent in TuiDrawer, adjust layout manually -->\n`; const DYNAMIC_DIRECTION_MIGRATION_COMMENT = `<!-- ${insert_todo_1.TODO_MARK} Update direction variable values: left->start, right->end -->\n`; function migrateSidebar({ resource, recorder, fileSystem, }) { const template = (0, template_resource_1.getTemplateFromTemplateResource)(resource, fileSystem); const templateOffset = (0, template_resource_1.getTemplateOffset)(resource); const elements = (0, elements_1.findElementsInTemplateByFn)(template, (el) => { var _a; return (_a = el.attrs) === null || _a === void 0 ? void 0 : _a.some((attr) => attr.name === SIDEBAR_ATTR); }); const replacements = elements .map((element) => buildReplacement(template, element)) .filter((x) => Boolean(x)) .sort((a, b) => b.startOffset - a.startOffset); replacements.forEach(({ startOffset, endOffset, replacement }) => { recorder.remove(templateOffset + startOffset, endOffset - startOffset); recorder.insertRight(templateOffset + startOffset, replacement); }); } function buildReplacement(template, element) { const loc = element.sourceCodeLocation; const startTag = loc === null || loc === void 0 ? void 0 : loc.startTag; if (!startTag) { return null; } const sidebarAttr = element.attrs.find((attr) => attr.name === SIDEBAR_ATTR); if (!sidebarAttr) { return null; } const parsed = parseBinding(sidebarAttr.value); const mappedDirection = mapDirection(parsed.direction); const hasAutoWidth = parsed.autoWidth !== null; const otherAttrs = element.attrs .filter(({ name }) => name !== SIDEBAR_ATTR && !SIDEBAR_DIRECTION_ATTRS.has(name) && !SIDEBAR_AUTO_WIDTH_ATTRS.has(name)) .map(({ name, value }) => (value ? `${name}="${value}"` : name)); const tuiPopupAttr = `*tuiPopup="${parsed.binding}"`; const newAttrs = [ tuiPopupAttr, ...otherAttrs, ...(mappedDirection ? [mappedDirection.attr] : []), ]; const attrsStr = newAttrs.length > 0 ? ` ${newAttrs.join(' ')}` : ''; const comments = `${hasAutoWidth ? AUTO_WIDTH_MIGRATION_COMMENT : ''}${(mappedDirection === null || mappedDirection === void 0 ? void 0 : mappedDirection.isDynamic) ? DYNAMIC_DIRECTION_MIGRATION_COMMENT : ''}`; const endTag = loc === null || loc === void 0 ? void 0 : loc.endTag; if (!endTag) { return { startOffset: startTag.startOffset, endOffset: startTag.endOffset, replacement: `${comments}<tui-drawer${attrsStr}></tui-drawer>`, }; } const innerContent = template.slice(startTag.endOffset, endTag.startOffset); return { startOffset: startTag.startOffset, endOffset: endTag.endOffset, replacement: `${comments}<tui-drawer${attrsStr}>${innerContent}</tui-drawer>`, }; } function parseBinding(value) { var _a, _b; const parts = value.split(';').map((s) => s.trim()); const binding = (_b = (_a = parts[0]) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : ''; let direction = null; let autoWidth = null; for (const part of parts.slice(1)) { const colonIdx = part.indexOf(':'); if (colonIdx === -1) { continue; } const key = part.slice(0, colonIdx).trim().toLowerCase(); const val = part.slice(colonIdx + 1).trim(); if (key === 'direction') { direction = val; } else if (key === 'autoWidth'.toLowerCase()) { autoWidth = val; } } return { binding, direction, autoWidth }; } function mapDirection(direction) { if (!direction) { return null; } if (direction === "'left'" || direction === '"left"') { return { attr: 'direction="start"', isDynamic: false }; } return direction === "'right'" || direction === '"right"' ? { attr: 'direction="end"', isDynamic: false } : { attr: `[direction]="${direction}"`, isDynamic: true }; } //# sourceMappingURL=migrate-sidebar.js.map