Function,
ObjectProperty,
BlockStatement,
- Program
+ Program,
+ ImportDefaultSpecifier,
+ ImportNamespaceSpecifier,
+ ImportSpecifier
} from '@babel/types'
import { walk } from 'estree-walker'
export const isStaticPropertyKey = (node: Node, parent: Node) =>
isStaticProperty(parent) && parent.key === node
+export function getImportedName(
+ specifier: ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier
+) {
+ if (specifier.type === 'ImportSpecifier')
+ return specifier.imported.type === 'Identifier'
+ ? specifier.imported.name
+ : specifier.imported.value
+ else if (specifier.type === 'ImportNamespaceSpecifier') return '*'
+ return 'default'
+}
+
/**
* Copied from https://github.com/babel/babel/blob/main/packages/babel-types/src/validators/isReferenced.ts
* To avoid runtime dependency on @babel/types (which includes process references)
}"
`;
+exports[`SFC compile <script setup> > imports > should support module string names syntax 1`] = `
+"import { \\"😏\\" as foo } from './foo'
+
+export default {
+ setup(__props, { expose }) {
+ expose();
+
+
+return { get foo() { return foo } }
+}
+
+}"
+`;
+
exports[`SFC compile <script setup> > inlineTemplate mode > avoid unref() when necessary 1`] = `
"import { unref as _unref, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\"
})
})
})
+
+ test('should support module string names syntax', () => {
+ const { content, bindings } = compile(`
+ <script>
+ import { "😏" as foo } from './foo'
+ </script>
+ <script setup>
+ import { "😏" as foo } from './foo'
+ </script>
+ `)
+ assertCode(content)
+ expect(bindings).toStrictEqual({
+ foo: BindingTypes.SETUP_MAYBE_REF
+ })
+ })
})
// in dev mode, declared bindings are returned as an object from setup()
SimpleExpressionNode,
isFunctionType,
walkIdentifiers,
+ getImportedName,
unwrapTSNode
} from '@vue/compiler-dom'
import { DEFAULT_FILENAME, SFCDescriptor, SFCScriptBlock } from './parse'
function registerUserImport(
source: string,
local: string,
- imported: string | false,
+ imported: string,
isType: boolean,
isFromSetup: boolean,
needTemplateUsageCheck: boolean
userImports[local] = {
isType,
- imported: imported || 'default',
+ imported,
local,
source,
isFromSetup,
if (node.type === 'ImportDeclaration') {
// record imports for dedupe
for (const specifier of node.specifiers) {
- const imported =
- specifier.type === 'ImportSpecifier' &&
- specifier.imported.type === 'Identifier' &&
- specifier.imported.name
+ const imported = getImportedName(specifier)
registerUserImport(
node.source.value,
specifier.local.name,
for (let i = 0; i < node.specifiers.length; i++) {
const specifier = node.specifiers[i]
const local = specifier.local.name
- let imported =
- specifier.type === 'ImportSpecifier' &&
- specifier.imported.type === 'Identifier' &&
- specifier.imported.name
- if (specifier.type === 'ImportNamespaceSpecifier') {
- imported = '*'
- }
+ const imported = getImportedName(specifier)
const source = node.source.value
const existing = userImports[local]
if (