From 6bfba0dae9b9dec6acbd3fdeb2a1a4d51eaf1ac9 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Wed, 15 Jan 2020 14:22:39 -0800 Subject: [PATCH] Downlevel export star (#8) * add export * as ns test * Downlevel export * as ns from 'x' To: ```ts import * as ns from 'x' export { ns } ``` This doesn't generate an intermediate name for now. I think this is only required in case the file already declares `ns` as something else. * correctly emit temp alias * Update prettierignore --- .prettierignore | 1 + baselines/ts3.4/test.d.ts | 2 ++ index.js | 40 +++++++++++++++++++++++++++++++++++---- test/test.d.ts | 2 ++ 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/.prettierignore b/.prettierignore index c34db80..52abf89 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ baselines/ +test/ diff --git a/baselines/ts3.4/test.d.ts b/baselines/ts3.4/test.d.ts index 7569ef9..8a805f7 100644 --- a/baselines/ts3.4/test.d.ts +++ b/baselines/ts3.4/test.d.ts @@ -10,3 +10,5 @@ export namespace N { abstract r: boolean; } } +import * as rex_1 from "src/test"; +export { rex_1 as rex } from "src/test"; diff --git a/index.js b/index.js index 5084547..c57b69c 100644 --- a/index.js +++ b/index.js @@ -11,10 +11,11 @@ const assert = require("assert"); function doTransform(k) { /** * @param {Node} n - * @return {Node} + * @return {import("typescript").VisitResult} */ const transform = function(n) { if (ts.isGetAccessor(n)) { + // get x(): number => x: number let flags = ts.getCombinedModifierFlags(n); if (!getMatchingAccessor(n, "get")) { flags |= ts.ModifierFlags.Readonly; @@ -29,8 +30,10 @@ function doTransform(k) { /*initialiser*/ undefined ); } else if (ts.isSetAccessor(n)) { + // set x(value: number) => x: number + let flags = ts.getCombinedModifierFlags(n); if (getMatchingAccessor(n, "set")) { - return /** @type {*} */ (undefined); + return undefined; } else { assert(n.parameters && n.parameters.length); return ts.createProperty( @@ -42,6 +45,36 @@ function doTransform(k) { /*initialiser*/ undefined ); } + } else if ( + ts.isExportDeclaration(n) && + n.exportClause && + n.moduleSpecifier && + ts.isNamespaceExport(n.exportClause) + ) { + // export * as ns from 'x' + // => + // import * as ns_1 from 'x' + // export { ns_1 as ns } + const tempName = ts.createUniqueName(n.exportClause.name.getText()); + return [ + ts.createImportDeclaration( + n.decorators, + n.modifiers, + ts.createImportClause( + /*name*/ undefined, + ts.createNamespaceImport(tempName) + ), + n.moduleSpecifier + ), + ts.createExportDeclaration( + undefined, + undefined, + ts.createNamedExports([ + ts.createExportSpecifier(tempName, n.exportClause.name) + ]), + n.moduleSpecifier + ) + ]; } return ts.visitEachChild(n, transform, k); }; @@ -87,11 +120,10 @@ function main(src, target) { ); const checker = program.getTypeChecker(); // just used for setting parent pointers right now const files = mapDefined(program.getRootFileNames(), program.getSourceFile); - const resultat = ts.transform(files, [doTransform]); const printer = ts.createPrinter({ newLine: ts.NewLineKind.CarriageReturnLineFeed }); - for (const t of resultat.transformed) { + for (const t of ts.transform(files, [doTransform]).transformed) { const f = /** @type {import("typescript").SourceFile} */ (t); const targetPath = path.join(target, f.fileName.slice(src.length)); sh.mkdir("-p", path.dirname(targetPath)); diff --git a/test/test.d.ts b/test/test.d.ts index 63a1753..271ea8c 100644 --- a/test/test.d.ts +++ b/test/test.d.ts @@ -12,3 +12,5 @@ export namespace N { abstract set r(value: boolean); } } + +export * as rex from "src/test";