From 795912d1623bcd65ec9035725355dc949f3c43c8 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sat, 20 Aug 2022 10:07:11 +0200 Subject: [PATCH 1/2] automatically optimize array-destructuring --- resources/build-npm.ts | 2 ++ resources/transform-array-destruct.ts | 34 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 resources/transform-array-destruct.ts diff --git a/resources/build-npm.ts b/resources/build-npm.ts index 3fbbbd657b..5c63ef1c0c 100644 --- a/resources/build-npm.ts +++ b/resources/build-npm.ts @@ -5,6 +5,7 @@ import path from 'node:path'; import ts from 'typescript'; import { inlineInvariant } from './inline-invariant.js'; +import { transformArrayDestructuring } from './transform-array-destruct.js' import { localRepoPath, readdirRecursive, @@ -51,6 +52,7 @@ tsHost.writeFile = writeGeneratedFile; const tsProgram = ts.createProgram(['src/index.ts'], tsOptions, tsHost); const tsResult = tsProgram.emit(undefined, undefined, undefined, undefined, { + before: [transformArrayDestructuring()], after: [inlineInvariant], }); assert( diff --git a/resources/transform-array-destruct.ts b/resources/transform-array-destruct.ts new file mode 100644 index 0000000000..85ab0fabf7 --- /dev/null +++ b/resources/transform-array-destruct.ts @@ -0,0 +1,34 @@ +import * as ts from 'typescript'; + +export function transformArrayDestructuring() { + return (context: ts.TransformationContext) => { + const { factory } = context; + + return (sourceFile: ts.SourceFile) => { + const visitor = (node: ts.Node): ts.Node => { + if(ts.isArrayBindingPattern(node)) { + const elements = node.elements.map((el, i) => { + if (!el.getText()) { + return undefined; + } + return { key: String(i), name: el.getText() } + }).filter(Boolean) + + const els = elements.map(el => { + if (!el) { + return undefined; + } + const key = factory.createIdentifier(el.key) + const name = factory.createIdentifier(el.name) + return factory.createBindingElement(undefined, key, name) + }).filter(Boolean) as Array + return factory.createObjectBindingPattern(els) + } + + return ts.visitEachChild(node, visitor, context); + }; + return ts.visitNode(sourceFile, visitor); + }; + }; +}; + From d2b3f7b7a80f17c68b8d712c2efe64a0a9afcaad Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 2 Sep 2022 10:00:56 +0200 Subject: [PATCH 2/2] run prettier --- resources/transform-array-destruct.ts | 39 ++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/resources/transform-array-destruct.ts b/resources/transform-array-destruct.ts index 85ab0fabf7..f4dd09f041 100644 --- a/resources/transform-array-destruct.ts +++ b/resources/transform-array-destruct.ts @@ -6,23 +6,27 @@ export function transformArrayDestructuring() { return (sourceFile: ts.SourceFile) => { const visitor = (node: ts.Node): ts.Node => { - if(ts.isArrayBindingPattern(node)) { - const elements = node.elements.map((el, i) => { - if (!el.getText()) { - return undefined; - } - return { key: String(i), name: el.getText() } - }).filter(Boolean) + if (ts.isArrayBindingPattern(node)) { + const elements = node.elements + .map((el, i) => { + if (!el.getText()) { + return undefined; + } + return { key: String(i), name: el.getText() }; + }) + .filter(Boolean); - const els = elements.map(el => { - if (!el) { - return undefined; - } - const key = factory.createIdentifier(el.key) - const name = factory.createIdentifier(el.name) - return factory.createBindingElement(undefined, key, name) - }).filter(Boolean) as Array - return factory.createObjectBindingPattern(els) + const els = elements + .map((el) => { + if (!el) { + return undefined; + } + const key = factory.createIdentifier(el.key); + const name = factory.createIdentifier(el.name); + return factory.createBindingElement(undefined, key, name); + }) + .filter(Boolean) as Array; + return factory.createObjectBindingPattern(els); } return ts.visitEachChild(node, visitor, context); @@ -30,5 +34,4 @@ export function transformArrayDestructuring() { return ts.visitNode(sourceFile, visitor); }; }; -}; - +}