Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 1x 1x 1x 1x 719x 719x 719x 719x 493x 226x 226x 258x 258x 258x 258x 34x 224x 224x 224x 224x 224x 224x 121x 121x 103x 224x 226x | import { Change, InsertChange, TsChange, createCssSelectorForTs, } from 'cyia-code-util'; import * as ts from 'typescript'; import { RawUpdater } from '../util'; export function changeComponent(data: string) { const sf = ts.createSourceFile('', data, ts.ScriptTarget.Latest, true); const selector = createCssSelectorForTs(sf); const ɵcmpNodeList = selector.queryAll( `PropertyAccessExpression[name=ɵɵdefineComponent]~SyntaxList ObjectLiteralExpression` ) as ts.BinaryExpression[]; if (!ɵcmpNodeList.length) { return undefined; } const changeList: Change[] = []; for (const componentNode of ɵcmpNodeList) { const ɵcmpNode = componentNode; const templateNode = selector.queryOne( ɵcmpNode, `PropertyAssignment[name=template]::initializer` ) as ts.PropertyAssignment; const initIfNode = selector.queryOne( templateNode, `IfStatement[expression="rf & 1"]` ) as ts.IfStatement; if (!initIfNode) { continue; } const change = new TsChange(sf); let updateInsertChange: InsertChange; changeList.push( new InsertChange(0, `import * as amp from 'angular-miniprogram';\n`) ); changeList.push( new InsertChange(0, `import * as ampNgCore from '@angular/core';\n`) ); const updateIfNode = selector.queryOne( templateNode, `IfStatement[expression="rf & 2"]` ) as ts.IfStatement; const updateContent = `amp.propertyChange(ampNgCore.ɵɵgetCurrentView());`; if (updateIfNode) { const updateBlock = updateIfNode.thenStatement as ts.Block; updateInsertChange = change.insertNode( updateBlock.statements[updateBlock.statements.length - 1], `;${updateContent}`, 'end' ); } else { updateInsertChange = change.insertNode( initIfNode, `if(rf & 2){${updateContent}}`, 'end' ); } changeList.push(updateInsertChange); } return { content: RawUpdater.update(data, changeList), // todo library可否支持同文件多组件 componentName: selector .queryOne(ɵcmpNodeList[0], 'PropertyAssignment[name=type]::initializer') .getText(), }; } |