Bladeren bron

chore(sfc-playground): ignore duplicate logs

Evan You 4 jaren geleden
bovenliggende
commit
3ffc7be864

+ 10 - 1
packages/runtime-core/src/apiSetupHelpers.ts

@@ -7,6 +7,12 @@ import { EmitFn, EmitsOptions } from './componentEmits'
 import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps'
 import { warn } from './warning'
 
+type InferDefaults<T> = {
+  [K in keyof T]?: NonNullable<T[K]> extends object
+    ? () => NonNullable<T[K]>
+    : NonNullable<T[K]>
+}
+
 /**
  * Compile-time-only helper used for declaring props inside `<script setup>`.
  * This is stripped away in the compiled code and should never be actually
@@ -25,7 +31,10 @@ export function defineProps<
   TypeProps = undefined,
   PP extends ComponentObjectPropsOptions = ComponentObjectPropsOptions,
   InferredProps = ExtractPropTypes<PP>
->(props?: PP): Readonly<TypeProps extends undefined ? InferredProps : TypeProps>
+>(
+  props?: PP,
+  defaults?: InferDefaults<TypeProps>
+): Readonly<TypeProps extends undefined ? InferredProps : TypeProps>
 // implementation
 export function defineProps() {
   if (__DEV__) {

+ 7 - 1
packages/sfc-playground/src/output/Preview.vue

@@ -123,6 +123,9 @@ function createSandbox() {
       runtimeError.value = 'Uncaught (in promise): ' + error.message
     },
     on_console: (log: any) => {
+      if (log.duplicate) {
+        return
+      }
       if (log.level === 'error') {
         if (log.args[0] instanceof Error) {
           runtimeError.value = log.args[0].message
@@ -156,7 +159,10 @@ function createSandbox() {
 }
 
 async function updatePreview() {
-  console.clear()
+  // @ts-ignore
+  if (import.meta.env.PROD) {
+    console.clear()
+  }
   runtimeError.value = null
   runtimeWarning.value = null
   try {

+ 26 - 0
test-dts/setupHelpers.test-d.ts

@@ -19,6 +19,32 @@ describe('defineProps w/ type declaration', () => {
   props.bar
 })
 
+describe('defineProps w/ type declaration + defaults', () => {
+  defineProps<{
+    number?: number
+    arr?: string[]
+    arr2?: string[]
+    obj?: { x: number }
+    obj2?: { x: number }
+    obj3?: { x: number }
+  }>(
+    {},
+    {
+      number: 1,
+
+      arr: () => [''],
+      // @ts-expect-error not using factory
+      arr2: [''],
+
+      obj: () => ({ x: 123 }),
+      // @ts-expect-error not using factory
+      obj2: { x: 123 },
+      // @ts-expect-error factory return type does not match
+      obj3: () => ({ x: 'foo' })
+    }
+  )
+})
+
 describe('defineProps w/ runtime declaration', () => {
   // runtime declaration
   const props = defineProps({