From 6b16beb6f238b74903a0735db17f15b8c474ee5e Mon Sep 17 00:00:00 2001 From: Anton Golub Date: Mon, 4 May 2020 18:27:33 +0300 Subject: [PATCH] feat: add external modules refs corrector --- src/main/ts/replacer.ts | 29 +++++++++++++++++++++++- src/test/ts/replacer.ts | 50 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/main/ts/replacer.ts b/src/main/ts/replacer.ts index 1169ce1..086a728 100644 --- a/src/main/ts/replacer.ts +++ b/src/main/ts/replacer.ts @@ -1,4 +1,4 @@ -import {IReplacer} from './interface' +import {IReplacer, IReplacerFactory} from './interface' export const replaceExportMain: IReplacer = { from: '\texport = main;', @@ -20,3 +20,30 @@ export const replaceBrokenModulePrefix: IReplacer = (pattern => ({ return `${module}index' {` } }))(/(declare module '.+\/target\/es5\/)[^/]*\/src\/main\/index'.+/) + +export const replaceModuleTypeRefs: IReplacer = { + from: /\/\/\/.+/, + to: '' +} + +export const replaceEmptyLines: IReplacer = { + from: /^\s*[\r\n]/gm, + to: '' +} + +export const replaceLocalModulesScope: IReplacerFactory = ({dtsData, prefix}) => { + const declaredModules = (dtsData.match(/declare module '.*'/g) || []).map(v => v.slice(16, -1)) + + return { + from: /import .+ from '(.+)'/g, + to: (line: string) => { + const re = /^(.+from ')([^']+)('.*)$/ + const [, pre, module, post] = re.exec(line) || [] + const name = declaredModules.includes(module) + ? module + : module.replace(prefix + '/', '') + + return `${pre}${name}${post}` + } + } +} diff --git a/src/test/ts/replacer.ts b/src/test/ts/replacer.ts index 0f14e6e..66125b9 100644 --- a/src/test/ts/replacer.ts +++ b/src/test/ts/replacer.ts @@ -3,6 +3,9 @@ import { replaceExportMain, replaceImportMain, replaceBrokenModulePrefix, + replaceModuleTypeRefs, + replaceEmptyLines, + replaceLocalModulesScope, } from '../../main/ts/replacer' describe('replacer', () => { @@ -18,17 +21,22 @@ describe('replacer', () => { if (typeof to === 'function') { expect(to(input, '')).toBe(output) } + + if (typeof to === 'string') { + expect(to).toBe(output) + } } it('#replaceExportMain', () => { - assertReplacement(replaceExportMain, '\texport = main;', 'bar') + assertReplacement(replaceExportMain, '\texport = main;', '') }) it('#replaceImportMain', () => { assertReplacement( replaceImportMain, ' import main = require(\'foo\');', - ' export * from \'foo\';') + ' export * from \'foo\';' + ) }) it('#replaceBrokenModulePrefix', () => { @@ -37,4 +45,42 @@ describe('replacer', () => { 'declare module \'@qiwi/foo/target/es5//src/main/index\' {', 'declare module \'@qiwi/foo/target/es5/index\' {') }) + + it('#replaceModuleTypeRefs', () => { + assertReplacement( + replaceModuleTypeRefs, + '/// ', + '' + ) + }) + + it('#replaceEmptyLines', () => { + assertReplacement( + replaceEmptyLines, + ` +`, + '' + ) + }) + + it('#replaceLocalModulesScope', () => { + const dtsData = ` +declare module '@qiwi/decorator-utils/target/es5/utils' { +\t/** @module @qiwi/decorator-utils */ +\timport { IInstance } from '@qiwi/decorator-utils/target/es5/interface'; +\timport get from '@qiwi/decorator-utils/target/es5/lodash.get'; +\timport set from '@qiwi/decorator-utils/target/es5/lodash.set'; +\texport { get, set, }; + +\texport function getPrototypeMethods(instance: IInstance): PropertyDescriptorMap; +} +` + const prefix = '@qiwi/decorator-utils/target/es5' + const replacer = replaceLocalModulesScope({dtsData, prefix}) + assertReplacement( + replacer, + `\timport get from '@qiwi/decorator-utils/target/es5/lodash.get';`, + `\timport get from 'lodash.get';` + ) + }) })