提交 3fc1d5a9 编写于 作者: fxy060608's avatar fxy060608

wip(mp): externalClasses

上级 3ce5c1ee
import { parseProgram } from '../src/mp/ast'
import { parseExternalClasses } from '../src/mp/externalClasses'
describe('externalClasses', () => {
const filename = '/usr/xxx/projects/test/src/components/test/test.vue'
test(`basic`, async () => {
const source = `
export default {
externalClasses: ['my-class']
}
`
const program = parseProgram(source, filename, {})
expect(parseExternalClasses(program)).toEqual(['my-class'])
})
})
import path from 'path'
import { ResolvedId } from 'rollup'
import { findUsingComponents } from '../src/json/mp/jsonFile'
import { parseProgram } from '../src/mp/ast'
import {
parseMainDescriptor,
parseProgram,
transformDynamicImports,
updateMiniProgramComponentsByMainFilename,
updateMiniProgramGlobalComponents,
......
import { parse, ParserPlugin } from '@babel/parser'
import { normalizeParsePlugins } from '../utils'
export function parseProgram(
code: string,
importer: string,
{ babelParserPlugins }: { babelParserPlugins?: ParserPlugin[] }
) {
return parse(code, {
plugins: normalizeParsePlugins(importer, babelParserPlugins),
sourceType: 'module',
}).program
}
import {
isArrayExpression,
isIdentifier,
isObjectProperty,
isStringLiteral,
Program,
} from '@babel/types'
import { walk } from 'estree-walker'
const externalClassesCache = new Map<string, string[]>()
export function hasExternalClasses(code: string) {
return code.includes('externalClasses')
}
export function findMiniProgramComponentExternalClasses(filename: string) {
return externalClassesCache.get(filename)
}
export function updateMiniProgramComponentExternalClasses(
filename: string,
classes: string[]
) {
externalClassesCache.set(filename, classes)
}
export function parseExternalClasses(ast: Program) {
const classes: string[] = []
;(walk as any)(ast, {
enter(child: Node, parent: Node) {
if (!isIdentifier(child) || child.name !== 'externalClasses') {
return
}
// export default { externalClasses: ['my-class'] }
if (!isObjectProperty(parent)) {
return
}
if (!isArrayExpression(parent.value)) {
return
}
parent.value.elements.forEach((element) => {
if (isStringLiteral(element)) {
classes.push(element.value)
}
})
},
})
return classes
}
export * from './ast'
export * from './nvue'
export * from './event'
export * from './style'
......@@ -6,7 +7,6 @@ export * from './constants'
export { HTML_TO_MINI_PROGRAM_TAGS } from './tags'
export { copyMiniProgramPluginJson } from './plugin'
export {
parseProgram,
parseMainDescriptor,
parseScriptDescriptor,
parseTemplateDescriptor,
......@@ -16,3 +16,9 @@ export {
updateMiniProgramComponentsByScriptFilename,
updateMiniProgramComponentsByTemplateFilename,
} from './usingComponents'
export {
hasExternalClasses,
parseExternalClasses,
findMiniProgramComponentExternalClasses,
updateMiniProgramComponentExternalClasses,
} from './externalClasses'
......@@ -17,7 +17,6 @@ import {
Statement,
StringLiteral,
} from '@babel/types'
import { parse, ParserPlugin } from '@babel/parser'
import { walk } from 'estree-walker'
import MagicString from 'magic-string'
import type { PluginContext } from 'rollup'
......@@ -25,11 +24,7 @@ import { camelize, capitalize, hyphenate } from '@vue/shared'
import { addLeadingSlash } from '@dcloudio/uni-shared'
import { M } from '../messages'
import { BINDING_COMPONENTS, EXTNAME_VUE_RE } from '../constants'
import {
normalizeMiniProgramFilename,
normalizeParsePlugins,
removeExt,
} from '../utils'
import { normalizeMiniProgramFilename, removeExt } from '../utils'
import { cleanUrl, parseVueRequest } from '../vite/utils'
import { addMiniProgramUsingComponents } from '../json/mp/jsonFile'
......@@ -38,17 +33,6 @@ type BindingComponents = Record<
{ tag: string; type: 'unknown' | 'setup' | 'self' }
>
export function parseProgram(
code: string,
importer: string,
{ babelParserPlugins }: { babelParserPlugins?: ParserPlugin[] }
) {
return parse(code, {
plugins: normalizeParsePlugins(importer, babelParserPlugins),
sourceType: 'module',
}).program
}
const mainDescriptors = new Map<string, MainDescriptor>()
const scriptDescriptors = new Map<string, ScriptDescriptor>()
const templateDescriptors = new Map<string, TemplateDescriptor>()
......
......@@ -111,26 +111,26 @@ function processBooleanAttr({ props }: ComponentNode) {
})
}
const builtInProps = [
'class',
'style',
ATTR_VUE_ID,
ATTR_VUE_PROPS,
ATTR_VUE_SLOTS,
ATTR_VUE_REF,
ATTR_VUE_REF_IN_FOR,
ATTR_COM_TYPE,
'eO',
'e-o',
'onVI',
'ref',
'slot',
'key',
'is',
]
function isComponentProp(name: string) {
if (
[
'class',
'style',
ATTR_VUE_ID,
ATTR_VUE_PROPS,
ATTR_VUE_SLOTS,
ATTR_VUE_REF,
ATTR_VUE_REF_IN_FOR,
ATTR_COM_TYPE,
'eO',
'e-o',
'onVI',
'ref',
'slot',
'key',
'is',
].includes(name)
) {
if (builtInProps.includes(name)) {
return false
}
if (name.startsWith('data-')) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册