diff --git a/packages/uni-cli-shared/__tests__/transformImports.spec.ts b/packages/uni-cli-shared/__tests__/transformImports.spec.ts index e712e2e9a44109a6c865f2873fe4ea3e19c795c2..6b407865843f7c46a262e928668c0b0e619251ce 100644 --- a/packages/uni-cli-shared/__tests__/transformImports.spec.ts +++ b/packages/uni-cli-shared/__tests__/transformImports.spec.ts @@ -51,6 +51,44 @@ export function createApp() { 'component-b': '/components/component-b', }) }) + test(`ts`, async () => { + const source = ` +import { createSSRApp } from 'vue' +import ComponentA from './components/component-a.vue' +import ComponentB from './components/component-b.vue' +export function createApp() { + const app = createSSRApp(App) + app.provide('UseRequestConfigContext', { + requestMethod: (param: any) => {}, + }) + app.component('component-a',ComponentA) + app.component('component-b',ComponentB) + return { + app + } +} +` + const { code, usingComponents } = await transformVueComponentImports( + source, + importer.replace('.js', '.ts'), + { + root, + global: true, + resolve, + dynamicImport, + } + ) + expect(code).toContain( + `const ComponentA = ()=>import('${root}/components/component-a.vue')` + ) + expect(code).toContain( + `const ComponentB = ()=>import('${root}/components/component-b.vue')` + ) + expect(usingComponents).toMatchObject({ + 'component-a': '/components/component-a', + 'component-b': '/components/component-b', + }) + }) }) describe('local', () => { const importer = '/usr/xxx/projects/test/src/pages/index/index.vue' diff --git a/packages/uni-cli-shared/src/constants.ts b/packages/uni-cli-shared/src/constants.ts index c20a1e80e1c51a40da6bc9b26882dd6c855fb380..bb002b3cc8d0d340f0171d368072db1cddd57d0b 100644 --- a/packages/uni-cli-shared/src/constants.ts +++ b/packages/uni-cli-shared/src/constants.ts @@ -1,8 +1,10 @@ export const PUBLIC_DIR = 'static' export const EXTNAME_JS = ['.js', '.ts', '.jsx', '.tsx'] +export const EXTNAME_TS = ['.ts', '.tsx'] export const EXTNAME_VUE = ['.vue', '.nvue'] export const EXTNAME_VUE_RE = /\.(vue|nvue)$/ export const EXTNAME_JS_RE = /\.[jt]sx?$/ +export const EXTNAME_TS_RE = /\.tsx?$/ export const ASSETS_INLINE_LIMIT = 40 * 1024 diff --git a/packages/uni-cli-shared/src/mp/imports.ts b/packages/uni-cli-shared/src/mp/imports.ts index 07f535d05d64bfe0b3abf2d3d8db13d176862a2b..d4130720e05529a35bc3101b8d229e68ea297357 100644 --- a/packages/uni-cli-shared/src/mp/imports.ts +++ b/packages/uni-cli-shared/src/mp/imports.ts @@ -5,7 +5,14 @@ import { extend } from '@vue/shared' import { isImportDeclaration, isImportDefaultSpecifier } from '@babel/types' import { parse } from '@babel/parser' import { EXTNAME_VUE, EXTNAME_VUE_RE } from '../constants' - +import { normalizeParsePlugins } from '../utils' +/** + * 暂时没用 + * @param source + * @param importer + * @param resolve + * @returns + */ export async function findVueComponentImports( source: string, importer: string, @@ -44,6 +51,7 @@ export async function findVueComponentImports( } if (EXTNAME_VUE_RE.test(res.id)) { const expr = parse(source.slice(importSpecifier.ss, importSpecifier.se), { + plugins: normalizeParsePlugins(res.id), sourceType: 'module', }).program.body[0] if (isImportDeclaration(expr) && expr.specifiers.length === 1) { diff --git a/packages/uni-cli-shared/src/mp/transformImports.ts b/packages/uni-cli-shared/src/mp/transformImports.ts index 1490818a217018b4b6d2cf0b28e35228481d3248..58b809545ef2d9d1ac4a32210eb01146c3cdd3f6 100644 --- a/packages/uni-cli-shared/src/mp/transformImports.ts +++ b/packages/uni-cli-shared/src/mp/transformImports.ts @@ -20,7 +20,11 @@ import MagicString from 'magic-string' import { PluginContext } from 'rollup' import { M } from '../messages' import { BINDING_COMPONENTS } from '../constants' -import { normalizeMiniProgramFilename, removeExt } from '../utils' +import { + normalizeMiniProgramFilename, + normalizeParsePlugins, + removeExt, +} from '../utils' import { addLeadingSlash } from '@dcloudio/uni-shared' interface TransformVueComponentImportsOptions { @@ -47,9 +51,10 @@ export async function transformVueComponentImports( if (!global && !code.includes(BINDING_COMPONENTS)) { return { code, usingComponents: {} } } + const s = new MagicString(code) const scriptAst = parse(code, { - plugins: [...(babelParserPlugins || [])], + plugins: normalizeParsePlugins(importer, babelParserPlugins), sourceType: 'module', }).program diff --git a/packages/uni-cli-shared/src/utils.ts b/packages/uni-cli-shared/src/utils.ts index 76c2b43732c864de0e8279ed53304e722704fba6..1a6e564a06f192747ddceed535bc4e8aadc935b5 100644 --- a/packages/uni-cli-shared/src/utils.ts +++ b/packages/uni-cli-shared/src/utils.ts @@ -3,7 +3,7 @@ import os from 'os' import path from 'path' import { camelize, capitalize } from '@vue/shared' export { default as hash } from 'hash-sum' -import { PAGE_EXTNAME, PAGE_EXTNAME_APP } from './constants' +import { EXTNAME_TS_RE, PAGE_EXTNAME, PAGE_EXTNAME_APP } from './constants' import { NodeTypes, @@ -11,6 +11,7 @@ import { RootNode, TemplateChildNode, } from '@vue/compiler-core' +import { ParserPlugin } from '@babel/parser' export let isRunningWithYarnPnp: boolean try { @@ -76,3 +77,17 @@ export function normalizeMiniProgramFilename( } return normalizeNodeModules(path.relative(inputDir, filename)) } + +export function normalizeParsePlugins( + importer: string, + babelParserPlugins?: ParserPlugin[] +) { + const isTS = EXTNAME_TS_RE.test(importer.split('?')[0]) + const plugins: ParserPlugin[] = [] + if (isTS) { + plugins.push('jsx') + } + if (babelParserPlugins) plugins.push(...babelParserPlugins) + if (isTS) plugins.push('typescript', 'decorators-legacy') + return plugins +}