Ver código fonte

fix(compiler-sfc): rewriteDefault for class with decorators (#6320)

fix #6318
林烁壕 3 anos atrás
pai
commit
81a7819535

+ 50 - 1
packages/compiler-sfc/__tests__/rewriteDefault.spec.ts

@@ -190,7 +190,56 @@ describe('compiler sfc: rewriteDefault', () => {
     ).toMatchInlineSnapshot(`
     ).toMatchInlineSnapshot(`
       "/*
       "/*
       export default class Foo {}*/
       export default class Foo {}*/
-      const script = class Bar {}"
+      class Bar {}
+      const script = Bar"
+    `)
+  })
+
+  test('@Component\nexport default class', async () => {
+    expect(rewriteDefault(`@Component\nexport default class Foo {}`, 'script'))
+      .toMatchInlineSnapshot(`
+      "@Component
+      class Foo {}
+      const script = Foo"
+    `)
+  })
+
+  test('@Component\nexport default class w/ comments', async () => {
+    expect(
+      rewriteDefault(`// export default\n@Component\nexport default class Foo {}`, 'script')
+    ).toMatchInlineSnapshot(`
+      "// export default
+      @Component
+      class Foo {}
+      const script = Foo"
+    `)
+  })
+
+  test('@Component\nexport default class w/ comments 2', async () => {
+    expect(
+      rewriteDefault(
+        `export default {}\n` + `// @Component\n// export default class Foo {}`,
+        'script'
+      )
+    ).toMatchInlineSnapshot(`
+      "const script = {}
+      // @Component
+      // export default class Foo {}"
+    `)
+  })
+
+  test('@Component\nexport default class w/ comments 3', async () => {
+    expect(
+      rewriteDefault(
+        `/*\n@Component\nexport default class Foo {}*/\n` + `export default class Bar {}`,
+        'script'
+      )
+    ).toMatchInlineSnapshot(`
+      "/*
+      @Component
+      export default class Foo {}*/
+      class Bar {}
+      const script = Bar"
     `)
     `)
   })
   })
 })
 })

+ 6 - 1
packages/compiler-sfc/src/rewriteDefault.ts

@@ -42,7 +42,12 @@ export function rewriteDefault(
   }).program.body
   }).program.body
   ast.forEach(node => {
   ast.forEach(node => {
     if (node.type === 'ExportDefaultDeclaration') {
     if (node.type === 'ExportDefaultDeclaration') {
-      s.overwrite(node.start!, node.declaration.start!, `const ${as} = `)
+      if (node.declaration.type === 'ClassDeclaration') {
+        s.overwrite(node.start!, node.declaration.id.start!, `class `)
+        s.append(`\nconst ${as} = ${node.declaration.id.name}`)
+      } else {
+        s.overwrite(node.start!, node.declaration.start!, `const ${as} = `)
+      }
     }
     }
     if (node.type === 'ExportNamedDeclaration') {
     if (node.type === 'ExportNamedDeclaration') {
       for (const specifier of node.specifiers) {
       for (const specifier of node.specifiers) {