]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: remove @vue/vapor package
authorEvan You <evan@vuejs.org>
Wed, 4 Dec 2024 06:22:26 +0000 (14:22 +0800)
committerEvan You <evan@vuejs.org>
Wed, 4 Dec 2024 06:22:26 +0000 (14:22 +0800)
32 files changed:
benchmark/client/App.vue
benchmark/client/data.ts
benchmark/client/profiling.ts
benchmark/client/vapor.ts
benchmark/index.js
benchmark/tsconfig.json
packages/runtime-dom/src/index.ts
packages/runtime-vapor/src/apiCreateApp.ts
packages/runtime-vapor/src/component.ts
packages/runtime-vapor/src/componentEmits.ts
packages/runtime-vapor/src/componentProps.ts
packages/runtime-vapor/src/dom/prop.ts
packages/runtime-vapor/src/dom/style.ts
packages/runtime-vapor/src/dom/templateRef.ts
packages/runtime-vapor/src/renderEffect.ts
packages/vue-vapor/LICENSE [deleted file]
packages/vue-vapor/README.md [deleted file]
packages/vue-vapor/__tests__/e2e/e2eUtils.ts [deleted file]
packages/vue-vapor/__tests__/e2e/todomvc.spec.ts [deleted file]
packages/vue-vapor/examples/composition/todomvc.html [deleted file]
packages/vue-vapor/index.js [deleted file]
packages/vue-vapor/index.mjs [deleted file]
packages/vue-vapor/package.json [deleted file]
packages/vue-vapor/src/index.ts [deleted file]
packages/vue/package.json
packages/vue/vapor/index.d.mts
packages/vue/vapor/index.d.ts
packages/vue/vapor/index.js
packages/vue/vapor/index.mjs
playground/setup/dev.js
pnpm-lock.yaml
tsconfig.json

index 350cd7df1016752083e0820bbf249e3dc50d1ba5..428217aa9717572b5452a1a889e55e594897147b 100644 (file)
@@ -4,7 +4,7 @@ import {
   triggerRef,
   type ShallowRef,
   createSelector,
-} from '@vue/vapor'
+} from 'vue/vapor'
 import { buildData } from './data'
 import { defer, wrap } from './profiling'
 
index 91c3ba631f339487f0cab75e060f05487cc39741..2626bf134810415b72d66aec494c01e21a710eb3 100644 (file)
@@ -1,4 +1,4 @@
-import { shallowRef } from '@vue/vapor'
+import { shallowRef } from 'vue/vapor'
 
 let ID = 1
 
index f4b5eaeb93d651c909d40319fa38788de99dddd7..82d950a0f6153fbda000ee0aebe075940be9c95e 100644 (file)
@@ -2,7 +2,7 @@
 /* eslint-disable no-restricted-syntax */
 /* eslint-disable no-restricted-globals */
 
-import { nextTick } from '@vue/vapor'
+import { nextTick } from 'vue/vapor'
 
 declare namespace globalThis {
   let doProfile: boolean
index 68071a84c464ba22788d9cab5aebfcd84d81fe04..70f1d4b1b3a84592e85c27a006ab8d78e4af5f69 100644 (file)
@@ -1,4 +1,4 @@
-import { createVaporApp } from '@vue/vapor'
+import { createVaporApp } from 'vue/vapor'
 import App from './App.vue'
 
 createVaporApp(App as any).mount('#app')
index eddf3b903666ee9e41d38da67f088b4eee3ef5bb..f1a37cdff7907d391eaf5e9b89b70542a54d2b3a 100644 (file)
@@ -179,7 +179,6 @@ async function buildApp(isVapor) {
     },
     resolve: {
       alias: {
-        '@vue/vapor': runtimePath,
         'vue/vapor': runtimePath,
         vue: runtimePath,
       },
index c769cb57d5ddd6290c3a480901c60636fd5b7135..535fcf20696784f29749602846660db2ef017ae4 100644 (file)
@@ -18,8 +18,6 @@
     "noEmit": true,
     "paths": {
       "vue": ["../packages/vue/src"],
-      "@vue/vapor": ["../packages/vue-vapor/src"],
-      "vue/vapor": ["../packages/vue-vapor/src"],
       "@vue/*": ["../packages/*/src"]
     }
   },
index 4246b3ed0cc2b08a4b31bc051d15a23d05a242ba..4f59f1f16aed3a697022df6961275e63473c167e 100644 (file)
@@ -230,9 +230,9 @@ function injectCompilerOptionsCheck(app: App) {
 /**
  * @internal
  */
-export function normalizeContainer(
-  container: Element | ShadowRoot | string,
-): Element | ShadowRoot | null {
+export function normalizeContainer<T extends ParentNode>(
+  container: T | string,
+): T | null {
   if (isString(container)) {
     const res = document.querySelector(container)
     if (__DEV__ && !res) {
@@ -240,7 +240,7 @@ export function normalizeContainer(
         `Failed to mount app: mount target selector "${container}" returned null.`,
       )
     }
-    return res
+    return res as any
   }
   if (
     __DEV__ &&
index 6ccd70b31585141df4e52db6095699ca9c499bfc..f1112e9a05322d6bd7cb01dad7ee57acc76fbc25 100644 (file)
@@ -1,4 +1,3 @@
-import { normalizeContainer } from './_old/apiRender'
 import { insert } from './dom/element'
 import { type VaporComponent, createComponent } from './component'
 import {
@@ -6,7 +5,8 @@ import {
   type AppUnmountFn,
   type CreateAppFunction,
   createAppAPI,
-} from '@vue/runtime-core'
+  normalizeContainer,
+} from '@vue/runtime-dom'
 
 let _createApp: CreateAppFunction<ParentNode, VaporComponent>
 
@@ -32,7 +32,7 @@ export const createVaporApp: CreateAppFunction<
   const app = _createApp(comp)
   const mount = app.mount
   app.mount = (container, ...args: any[]) => {
-    container = normalizeContainer(container) // TODO reuse from runtime-dom
+    container = normalizeContainer(container) as ParentNode
     return mount(container, ...args)
   }
   return app
index 2ef4730b68408b4b51c45aa6a91c3f5bde4754db..17973b40768b077be4a77ad4655f0a0141164f73 100644 (file)
@@ -11,7 +11,7 @@ import {
   nextUid,
   popWarningContext,
   pushWarningContext,
-} from '@vue/runtime-core'
+} from '@vue/runtime-dom'
 import type { Block } from './block'
 import { pauseTracking, resetTracking } from '@vue/reactivity'
 import { EMPTY_OBJ, isFunction } from '@vue/shared'
index f792766a8e3aa1b99770b281e925004adc65ade2..4dbbf4f3bdaed3181d08b9cbbfd17bdabc0c1d37 100644 (file)
@@ -2,7 +2,7 @@ import {
   type EmitFn,
   type ObjectEmitsOptions,
   baseEmit,
-} from '@vue/runtime-core'
+} from '@vue/runtime-dom'
 import {
   type VaporComponent,
   type VaporComponentInstance,
index 560f89240b6c2a78aa8bb8b1edb46181de826817..17fc893fc02e64034d212737e1e5af5d944e306c 100644 (file)
@@ -5,7 +5,7 @@ import {
   baseNormalizePropsOptions,
   isEmitListener,
   resolvePropValue,
-} from '@vue/runtime-core'
+} from '@vue/runtime-dom'
 import { normalizeEmitsOptions } from './componentEmits'
 
 export interface RawProps {
index 4bcc5304ee7b0c24b099e070e785125591ab43b9..12b7f2a9dacb7f5c4c32237b45ed30690d1e9346 100644 (file)
@@ -12,7 +12,6 @@ import {
   shouldSetAsAttr,
   toDisplayString,
 } from '@vue/shared'
-import { warn } from '../_old/warning'
 import { setStyle } from './style'
 import {
   MetadataKind,
@@ -20,7 +19,8 @@ import {
   recordPropMetadata,
 } from '../componentMetadata'
 import { on } from './event'
-import { currentInstance } from '../_old/component'
+import { currentInstance } from '../component'
+import { warn } from '@vue/runtime-dom'
 
 export function mergeInheritAttr(key: string, value: any): unknown {
   const instance = currentInstance!
index 0e688dfb18b090f1ae79ca0ad6be73b0c7b43279..c0a0844da92e5ebfe9fb99c31ef72831aee190b2 100644 (file)
@@ -6,7 +6,7 @@ import {
   isString,
   normalizeStyle,
 } from '@vue/shared'
-import { warn } from '../_old/warning'
+import { warn } from '@vue/runtime-dom'
 import { recordPropMetadata } from '../componentMetadata'
 import { mergeInheritAttr } from './prop'
 
index 271c8e3c3fe1eebc3e5bd38b8bc336a194777487..445b4a7925f5b207b448d40d0a31f956f9f67b92 100644 (file)
@@ -1,10 +1,15 @@
 import { type Ref, isRef, onScopeDispose } from '@vue/reactivity'
 import {
-  type ComponentInternalInstance,
+  type VaporComponentInstance,
   currentInstance,
   isVaporComponent,
-} from '../_old/component'
-import { VaporErrorCodes, callWithErrorHandling } from '../_old/errorHandling'
+} from '../component'
+import {
+  type SchedulerJob,
+  callWithErrorHandling,
+  queuePostFlushCb,
+  warn,
+} from '@vue/runtime-dom'
 import {
   EMPTY_OBJ,
   hasOwn,
@@ -13,11 +18,9 @@ import {
   isString,
   remove,
 } from '@vue/shared'
-import { warn } from '../_old/warning'
-import { type SchedulerJob, queuePostFlushCb } from '../_old/scheduler'
 
 export type NodeRef = string | Ref | ((ref: Element) => void)
-export type RefEl = Element | ComponentInternalInstance
+export type RefEl = Element | VaporComponentInstance
 
 /**
  * Function for handling a template ref
@@ -29,6 +32,7 @@ export function setRef(
   refFor = false,
 ): NodeRef | undefined {
   if (!currentInstance) return
+  // @ts-expect-error TODO
   const { setupState, isUnmounted } = currentInstance
 
   if (isUnmounted) {
@@ -46,7 +50,7 @@ export function setRef(
   if (oldRef != null && oldRef !== ref) {
     if (isString(oldRef)) {
       refs[oldRef] = null
-      if (hasOwn(setupState, oldRef)) {
+      if (setupState && hasOwn(setupState, oldRef)) {
         setupState[oldRef] = null
       }
     } else if (isRef(oldRef)) {
@@ -59,7 +63,8 @@ export function setRef(
       callWithErrorHandling(
         ref,
         currentInstance,
-        VaporErrorCodes.FUNCTION_REF,
+        // @ts-expect-error
+        null,
         [value, refs],
       )
     }
@@ -126,7 +131,7 @@ export function setRef(
         })
       })
     } else if (__DEV__) {
-      warn('Invalid template ref type:', ref, `(${typeof ref})`)
+      // warn('Invalid template ref type:', ref, `(${typeof ref})`)
     }
   }
   return ref
index 77220ec5b82c09cc5afd89b9f30e5bf16f796a84..170f29bb4c13d7f334fa920998c0dffad9f5cfab 100644 (file)
@@ -1,5 +1,5 @@
 import { ReactiveEffect } from '@vue/reactivity'
-import { type SchedulerJob, queueJob } from '@vue/runtime-core'
+import { type SchedulerJob, queueJob } from '@vue/runtime-dom'
 import { currentInstance } from './component'
 
 export function renderEffect(fn: () => void): void {
diff --git a/packages/vue-vapor/LICENSE b/packages/vue-vapor/LICENSE
deleted file mode 100644 (file)
index 15f1f7e..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2018-present, Yuxi (Evan) You
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/packages/vue-vapor/README.md b/packages/vue-vapor/README.md
deleted file mode 100644 (file)
index ceb922d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-# @vue/vapor
diff --git a/packages/vue-vapor/__tests__/e2e/e2eUtils.ts b/packages/vue-vapor/__tests__/e2e/e2eUtils.ts
deleted file mode 100644 (file)
index 8512dca..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-import puppeteer, {
-  type Browser,
-  type ClickOptions,
-  type Page,
-  type PuppeteerLaunchOptions,
-} from 'puppeteer'
-
-export const E2E_TIMEOUT: number = 30 * 1000
-
-const puppeteerOptions: PuppeteerLaunchOptions = {
-  args: process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] : [],
-  headless: true,
-}
-
-const maxTries = 30
-export const timeout = (n: number): Promise<any> =>
-  new Promise(r => setTimeout(r, n))
-
-export async function expectByPolling(
-  poll: () => Promise<any>,
-  expected: string,
-): Promise<void> {
-  for (let tries = 0; tries < maxTries; tries++) {
-    const actual = (await poll()) || ''
-    if (actual.indexOf(expected) > -1 || tries === maxTries - 1) {
-      expect(actual).toMatch(expected)
-      break
-    } else {
-      await timeout(50)
-    }
-  }
-}
-
-interface PuppeteerUtils {
-  page: () => Page
-  click(selector: string, options?: ClickOptions): Promise<void>
-  count(selector: string): Promise<number>
-  text(selector: string): Promise<string | null>
-  value(selector: string): Promise<string>
-  html(selector: string): Promise<string>
-  classList(selector: string): Promise<string[]>
-  children(selector: string): Promise<any[]>
-  isVisible(selector: string): Promise<boolean>
-  isChecked(selector: string): Promise<boolean>
-  isFocused(selector: string): Promise<boolean>
-  setValue(selector: string, value: string): Promise<any>
-  typeValue(selector: string, value: string): Promise<any>
-  enterValue(selector: string, value: string): Promise<any>
-  clearValue(selector: string): Promise<any>
-  timeout(time: number): Promise<any>
-  nextFrame(): Promise<any>
-}
-
-export function setupPuppeteer(args?: string[]): PuppeteerUtils {
-  let browser: Browser
-  let page: Page
-
-  const resolvedOptions = args
-    ? {
-        ...puppeteerOptions,
-        args: [...puppeteerOptions.args!, ...args],
-      }
-    : puppeteerOptions
-
-  beforeAll(async () => {
-    browser = await puppeteer.launch(resolvedOptions)
-  }, 20000)
-
-  beforeEach(async () => {
-    page = await browser.newPage()
-
-    await page.evaluateOnNewDocument(() => {
-      localStorage.clear()
-    })
-
-    page.on('console', e => {
-      if (e.type() === 'error') {
-        const err = e.args()[0]
-        console.error(`Error from Puppeteer-loaded page:\n`, err.remoteObject())
-      }
-    })
-  })
-
-  afterEach(async () => {
-    await page.close()
-  })
-
-  afterAll(async () => {
-    await browser.close()
-  })
-
-  async function click(
-    selector: string,
-    options?: ClickOptions,
-  ): Promise<void> {
-    await page.click(selector, options)
-  }
-
-  async function count(selector: string): Promise<number> {
-    return (await page.$$(selector)).length
-  }
-
-  async function text(selector: string): Promise<string | null> {
-    return page.$eval(selector, node => node.textContent)
-  }
-
-  async function value(selector: string): Promise<string> {
-    return page.$eval(selector, node => (node as HTMLInputElement).value)
-  }
-
-  async function html(selector: string): Promise<string> {
-    return page.$eval(selector, node => node.innerHTML)
-  }
-
-  async function classList(selector: string): Promise<string[]> {
-    return page.$eval(selector, (node: any) => [...node.classList])
-  }
-
-  async function children(selector: string): Promise<any[]> {
-    return page.$eval(selector, (node: any) => [...node.children])
-  }
-
-  async function isVisible(selector: string): Promise<boolean> {
-    const display = await page.$eval(selector, node => {
-      return window.getComputedStyle(node).display
-    })
-    return display !== 'none'
-  }
-
-  async function isChecked(selector: string) {
-    return await page.$eval(
-      selector,
-      node => (node as HTMLInputElement).checked,
-    )
-  }
-
-  async function isFocused(selector: string) {
-    return await page.$eval(selector, node => node === document.activeElement)
-  }
-
-  async function setValue(selector: string, value: string) {
-    await page.$eval(
-      selector,
-      (node, value) => {
-        ;(node as HTMLInputElement).value = value as string
-        node.dispatchEvent(new Event('input'))
-      },
-      value,
-    )
-  }
-
-  async function typeValue(selector: string, value: string) {
-    const el = (await page.$(selector))!
-    await el.evaluate(node => ((node as HTMLInputElement).value = ''))
-    await el.type(value)
-  }
-
-  async function enterValue(selector: string, value: string) {
-    const el = (await page.$(selector))!
-    await el.evaluate(node => ((node as HTMLInputElement).value = ''))
-    await el.type(value)
-    await el.press('Enter')
-  }
-
-  async function clearValue(selector: string) {
-    return await page.$eval(
-      selector,
-      node => ((node as HTMLInputElement).value = ''),
-    )
-  }
-
-  function timeout(time: number) {
-    return page.evaluate(time => {
-      return new Promise(r => {
-        setTimeout(r, time)
-      })
-    }, time)
-  }
-
-  function nextFrame() {
-    return page.evaluate(() => {
-      return new Promise(resolve => {
-        requestAnimationFrame(() => {
-          requestAnimationFrame(resolve)
-        })
-      })
-    })
-  }
-
-  return {
-    page: () => page,
-    click,
-    count,
-    text,
-    value,
-    html,
-    classList,
-    children,
-    isVisible,
-    isChecked,
-    isFocused,
-    setValue,
-    typeValue,
-    enterValue,
-    clearValue,
-    timeout,
-    nextFrame,
-  }
-}
diff --git a/packages/vue-vapor/__tests__/e2e/todomvc.spec.ts b/packages/vue-vapor/__tests__/e2e/todomvc.spec.ts
deleted file mode 100644 (file)
index c26079c..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-import path from 'node:path'
-import { E2E_TIMEOUT, setupPuppeteer } from './e2eUtils'
-
-describe('e2e: todomvc', () => {
-  const {
-    page,
-    click,
-    isVisible,
-    count,
-    text,
-    value,
-    isChecked,
-    isFocused,
-    classList,
-    enterValue,
-    clearValue,
-  } = setupPuppeteer()
-
-  async function removeItemAt(n: number) {
-    const item = (await page().$('.todo:nth-child(' + n + ')'))!
-    const itemBBox = (await item.boundingBox())!
-    await page().mouse.move(itemBBox.x + 10, itemBBox.y + 10)
-    await click('.todo:nth-child(' + n + ') .destroy')
-  }
-
-  async function testTodomvc(apiType: 'classic' | 'composition') {
-    let baseUrl = `../../examples/${apiType}/todomvc.html`
-    baseUrl = `file://${path.resolve(__dirname, baseUrl)}`
-
-    await page().goto(baseUrl)
-    expect(await isVisible('.main')).toBe(false)
-    expect(await isVisible('.footer')).toBe(false)
-    expect(await count('.filters .selected')).toBe(1)
-    expect(await text('.filters .selected')).toBe('All')
-    expect(await count('.todo')).toBe(0)
-
-    await enterValue('.new-todo', 'test')
-    expect(await count('.todo')).toBe(1)
-    expect(await isVisible('.todo .edit')).toBe(false)
-    expect(await text('.todo label')).toBe('test')
-    expect(await text('.todo-count strong')).toBe('1')
-    expect(await isChecked('.todo .toggle')).toBe(false)
-    expect(await isVisible('.main')).toBe(true)
-    expect(await isVisible('.footer')).toBe(true)
-    expect(await isVisible('.clear-completed')).toBe(false)
-    expect(await value('.new-todo')).toBe('')
-
-    await enterValue('.new-todo', 'test2')
-    expect(await count('.todo')).toBe(2)
-    expect(await text('.todo:nth-child(2) label')).toBe('test2')
-    expect(await text('.todo-count strong')).toBe('2')
-
-    // toggle
-    await click('.todo .toggle')
-    expect(await count('.todo.completed')).toBe(1)
-    expect(await classList('.todo:nth-child(1)')).toContain('completed')
-    expect(await text('.todo-count strong')).toBe('1')
-    expect(await isVisible('.clear-completed')).toBe(true)
-
-    await enterValue('.new-todo', 'test3')
-    expect(await count('.todo')).toBe(3)
-    expect(await text('.todo:nth-child(3) label')).toBe('test3')
-    expect(await text('.todo-count strong')).toBe('2')
-
-    await enterValue('.new-todo', 'test4')
-    await enterValue('.new-todo', 'test5')
-    expect(await count('.todo')).toBe(5)
-    expect(await text('.todo-count strong')).toBe('4')
-
-    // toggle more
-    await click('.todo:nth-child(4) .toggle')
-    await click('.todo:nth-child(5) .toggle')
-    expect(await count('.todo.completed')).toBe(3)
-    expect(await text('.todo-count strong')).toBe('2')
-
-    // remove
-    await removeItemAt(1)
-    expect(await count('.todo')).toBe(4)
-    expect(await count('.todo.completed')).toBe(2)
-    expect(await text('.todo-count strong')).toBe('2')
-    await removeItemAt(2)
-    expect(await count('.todo')).toBe(3)
-    expect(await count('.todo.completed')).toBe(2)
-    expect(await text('.todo-count strong')).toBe('1')
-
-    // remove all
-    await click('.clear-completed')
-    expect(await count('.todo')).toBe(1)
-    expect(await text('.todo label')).toBe('test2')
-    expect(await count('.todo.completed')).toBe(0)
-    expect(await text('.todo-count strong')).toBe('1')
-    expect(await isVisible('.clear-completed')).toBe(false)
-
-    // prepare to test filters
-    await enterValue('.new-todo', 'test')
-    await enterValue('.new-todo', 'test')
-    await click('.todo:nth-child(2) .toggle')
-    await click('.todo:nth-child(3) .toggle')
-
-    // active filter
-    await click('.filters li:nth-child(2) a')
-    expect(await count('.todo')).toBe(1)
-    expect(await count('.todo.completed')).toBe(0)
-    // add item with filter active
-    await enterValue('.new-todo', 'test')
-    expect(await count('.todo')).toBe(2)
-
-    // completed filter
-    await click('.filters li:nth-child(3) a')
-    expect(await count('.todo')).toBe(2)
-    expect(await count('.todo.completed')).toBe(2)
-
-    // filter on page load
-    await page().goto(`${baseUrl}#active`)
-    expect(await count('.todo')).toBe(2)
-    expect(await count('.todo.completed')).toBe(0)
-    expect(await text('.todo-count strong')).toBe('2')
-
-    // completed on page load
-    await page().goto(`${baseUrl}#completed`)
-    expect(await count('.todo')).toBe(2)
-    expect(await count('.todo.completed')).toBe(2)
-    expect(await text('.todo-count strong')).toBe('2')
-
-    // toggling with filter active
-    await click('.todo .toggle')
-    expect(await count('.todo')).toBe(1)
-    await click('.filters li:nth-child(2) a')
-    expect(await count('.todo')).toBe(3)
-    await click('.todo .toggle')
-    expect(await count('.todo')).toBe(2)
-
-    // editing triggered by blur
-    await click('.filters li:nth-child(1) a')
-    await click('.todo:nth-child(1) label', { clickCount: 2 })
-    expect(await count('.todo.editing')).toBe(1)
-    expect(await isFocused('.todo:nth-child(1) .edit')).toBe(true)
-    await clearValue('.todo:nth-child(1) .edit')
-    await page().type('.todo:nth-child(1) .edit', 'edited!')
-    await click('.new-todo') // blur
-    expect(await count('.todo.editing')).toBe(0)
-    expect(await text('.todo:nth-child(1) label')).toBe('edited!')
-
-    // editing triggered by enter
-    await click('.todo label', { clickCount: 2 })
-    await enterValue('.todo:nth-child(1) .edit', 'edited again!')
-    expect(await count('.todo.editing')).toBe(0)
-    expect(await text('.todo:nth-child(1) label')).toBe('edited again!')
-
-    // cancel
-    await click('.todo label', { clickCount: 2 })
-    await clearValue('.todo:nth-child(1) .edit')
-    await page().type('.todo:nth-child(1) .edit', 'edited!')
-    await page().keyboard.press('Escape')
-    expect(await count('.todo.editing')).toBe(0)
-    expect(await text('.todo:nth-child(1) label')).toBe('edited again!')
-
-    // empty value should remove
-    await click('.todo label', { clickCount: 2 })
-    await enterValue('.todo:nth-child(1) .edit', ' ')
-    expect(await count('.todo')).toBe(3)
-
-    // toggle all
-    await click('.toggle-all+label')
-    expect(await count('.todo.completed')).toBe(3)
-    await click('.toggle-all+label')
-    expect(await count('.todo:not(.completed)')).toBe(3)
-  }
-
-  test(
-    'composition',
-    async () => {
-      await testTodomvc('composition')
-    },
-    E2E_TIMEOUT,
-  )
-})
diff --git a/packages/vue-vapor/examples/composition/todomvc.html b/packages/vue-vapor/examples/composition/todomvc.html
deleted file mode 100644 (file)
index 8e3ff00..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-<script src="../../dist/vue-vapor.global.js"></script>
-<link
-  rel="stylesheet"
-  href="../../../../node_modules/todomvc-app-css/index.css"
-/>
-
-<div id="app"></div>
-
-<script>
-  const {
-    createVaporApp,
-    defineComponent,
-    reactive,
-    computed,
-    watchEffect,
-    onMounted,
-    onUnmounted,
-    nextTick,
-  } = VueVapor
-
-  const STORAGE_KEY = 'todos-vuejs-3.x'
-  const todoStorage = {
-    fetch() {
-      const todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')
-      todos.forEach((todo, index) => {
-        todo.id = index
-      })
-      todoStorage.uid = todos.length
-      return todos
-    },
-    save(todos) {
-      localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
-    },
-  }
-
-  const filters = {
-    all(todos) {
-      return todos
-    },
-    active(todos) {
-      return todos.filter(todo => {
-        return !todo.completed
-      })
-    },
-    completed(todos) {
-      return todos.filter(function (todo) {
-        return todo.completed
-      })
-    },
-  }
-
-  function pluralize(n) {
-    return n === 1 ? 'item' : 'items'
-  }
-
-  const _sfc_main = defineComponent({
-    setup() {
-      const state = reactive({
-        todos: todoStorage.fetch(),
-        editedTodo: null,
-        newTodo: '',
-        beforeEditCache: '',
-        visibility: 'all',
-        remaining: computed(() => {
-          return filters.active(state.todos).length
-        }),
-        remainingText: computed(() => {
-          return ` ${pluralize(state.remaining)} left`
-        }),
-        filteredTodos: computed(() => {
-          return filters[state.visibility](state.todos)
-        }),
-        allDone: computed({
-          get: function () {
-            return state.remaining === 0
-          },
-          set: function (value) {
-            state.todos.forEach(todo => {
-              todo.completed = value
-            })
-          },
-        }),
-      })
-
-      watchEffect(() => {
-        todoStorage.save(state.todos)
-      })
-
-      onMounted(() => {
-        window.addEventListener('hashchange', onHashChange)
-        onHashChange()
-      })
-
-      onUnmounted(() => {
-        window.removeEventListener('hashchange', onHashChange)
-      })
-
-      function onHashChange() {
-        const visibility = window.location.hash.replace(/#\/?/, '')
-        if (filters[visibility]) {
-          state.visibility = visibility
-        } else {
-          window.location.hash = ''
-          state.visibility = 'all'
-        }
-      }
-
-      function addTodo() {
-        const value = state.newTodo && state.newTodo.trim()
-        if (!value) {
-          return
-        }
-        state.todos.push({
-          id: todoStorage.uid++,
-          title: value,
-          completed: false,
-        })
-        state.newTodo = ''
-      }
-
-      function removeTodo(todo) {
-        state.todos.splice(state.todos.indexOf(todo), 1)
-      }
-
-      async function editTodo(todo) {
-        state.beforeEditCache = todo.title
-        state.editedTodo = todo
-        await nextTick()
-        document.getElementById(`todo-${todo.id}-input`).focus()
-      }
-
-      function doneEdit(todo) {
-        if (!state.editedTodo) {
-          return
-        }
-        state.editedTodo = null
-        todo.title = todo.title.trim()
-        if (!todo.title) {
-          removeTodo(todo)
-        }
-      }
-
-      function cancelEdit(todo) {
-        state.editedTodo = null
-        todo.title = state.beforeEditCache
-      }
-
-      function removeCompleted() {
-        state.todos = filters.active(state.todos)
-      }
-
-      return {
-        state,
-        addTodo,
-        removeTodo,
-        editTodo,
-        doneEdit,
-        cancelEdit,
-        removeCompleted,
-      }
-    },
-  })
-
-  const {
-    children: _children,
-    vModelText: _vModelText,
-    withDirectives: _withDirectives,
-    vShow: _vShow,
-    next: _next,
-    delegate: _delegate,
-    on: _on,
-    renderEffect: _renderEffect,
-    setDynamicProp: _setDynamicProp,
-    setText: _setText,
-    setClass: _setClass,
-    createFor: _createFor,
-    insert: _insert,
-    delegateEvents: _delegateEvents,
-    template: _template,
-  } = VueVapor
-  const t0 = _template(
-    '<li><div class="view"><input class="toggle" type="checkbox"><label></label><button class="destroy"></button></div><input class="edit" type="text"></li>',
-  )
-  const t1 = _template(
-    '<section class="todoapp"><header class="header"><h1>todos</h1><input class="new-todo" autofocus autocomplete="off" placeholder="What needs to be done?"></header><section class="main"><input id="toggle-all" class="toggle-all" type="checkbox"><label for="toggle-all">Mark all as complete</label><ul class="todo-list"></ul></section><footer class="footer"><span class="todo-count"><strong></strong><span></span></span><ul class="filters"><li><a href="#/all">All</a></li><li><a href="#/active">Active</a></li><li><a href="#/completed">Completed</a></li></ul><button class="clear-completed"> Clear completed </button></footer></section>',
-  )
-  _delegateEvents('keyup', 'dblclick', 'click', 'input')
-
-  function _sfc_render(_ctx) {
-    const n18 = t1()
-    const n0 = _children(n18, 0, 1)
-    _withDirectives(n0, [[_vModelText, () => _ctx.state.newTodo]])
-    const n10 = _children(n18, 1)
-    _withDirectives(n10, [[_vShow, () => _ctx.state.todos.length]])
-    const n1 = n10.firstChild
-    const n9 = _next(n1, 2)
-    const n17 = n10.nextSibling
-    _withDirectives(n17, [[_vShow, () => _ctx.state.todos.length]])
-    const n11 = _children(n17, 0, 0)
-    const n12 = n11.nextSibling
-    const n13 = _children(n17, 1, 0, 0)
-    const n14 = _children(n17, 1, 1, 0)
-    const n15 = _children(n17, 1, 2, 0)
-    const n16 = _children(n17, 2)
-    _withDirectives(n16, [
-      [_vShow, () => _ctx.state.todos.length > _ctx.state.remaining],
-    ])
-    _delegate(
-      n0,
-      'update:modelValue',
-      () => $event => (_ctx.state.newTodo = $event),
-    )
-    _delegate(n0, 'keyup', () => _ctx.addTodo, {
-      keys: ['enter'],
-    })
-    _on(
-      n1,
-      'change',
-      () => $event => (_ctx.state.allDone = $event.target.checked),
-    )
-    const n2 = _createFor(
-      () => _ctx.state.filteredTodos,
-      _ctx2 => {
-        const n8 = t0()
-        const n4 = _children(n8, 0, 0)
-        const n5 = n4.nextSibling
-        const n6 = n5.nextSibling
-        const n7 = _children(n8, 1)
-        _on(
-          n4,
-          'change',
-          () => $event => (_ctx2[0].completed = $event.target.checked),
-        )
-        _delegate(n5, 'dblclick', () => $event => _ctx.editTodo(_ctx2[0]))
-        _delegate(n6, 'click', () => $event => _ctx.removeTodo(_ctx2[0]))
-        _delegate(
-          n7,
-          'input',
-          () => $event => (_ctx2[0].title = $event.target.value),
-        )
-        _on(n7, 'blur', () => $event => _ctx.doneEdit(_ctx2[0]))
-        _delegate(n7, 'keyup', () => $event => _ctx.doneEdit(_ctx2[0]), {
-          keys: ['enter'],
-        })
-        _delegate(n7, 'keyup', () => $event => _ctx.cancelEdit(_ctx2[0]), {
-          keys: ['escape'],
-        })
-        _renderEffect(() => _setDynamicProp(n4, 'checked', _ctx2[0].completed))
-        _renderEffect(() => {
-          _setText(n5, _ctx2[0].title)
-          _setDynamicProp(n7, 'value', _ctx2[0].title)
-        })
-        _renderEffect(() =>
-          _setDynamicProp(n7, 'id', `todo-${_ctx2[0].id}-input`),
-        )
-        _renderEffect(() =>
-          _setClass(n8, [
-            'todo',
-            {
-              completed: _ctx2[0].completed,
-              editing: _ctx2[0] === _ctx.state.editedTodo,
-            },
-          ]),
-        )
-        return n8
-      },
-      todo => todo.id,
-    )
-    _insert(n2, n9)
-    _delegate(n16, 'click', () => _ctx.removeCompleted)
-    _renderEffect(() => _setDynamicProp(n1, 'checked', _ctx.state.allDone))
-    _renderEffect(() => _setText(n11, _ctx.state.remaining))
-    _renderEffect(() => _setText(n12, _ctx.state.remainingText))
-    _renderEffect(() =>
-      _setClass(n13, { selected: _ctx.state.visibility === 'all' }),
-    )
-    _renderEffect(() =>
-      _setClass(n14, { selected: _ctx.state.visibility === 'active' }),
-    )
-    _renderEffect(() =>
-      _setClass(n15, { selected: _ctx.state.visibility === 'completed' }),
-    )
-    return n18
-  }
-
-  _sfc_main.render = _sfc_render
-  const app = createVaporApp(_sfc_main, {})
-  app.mount('#app')
-</script>
diff --git a/packages/vue-vapor/index.js b/packages/vue-vapor/index.js
deleted file mode 100644 (file)
index 2625461..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict'
-
-if (process.env.NODE_ENV === 'production') {
-  module.exports = require('./dist/vue-vapor.cjs.prod.js')
-} else {
-  module.exports = require('./dist/vue-vapor.cjs.js')
-}
diff --git a/packages/vue-vapor/index.mjs b/packages/vue-vapor/index.mjs
deleted file mode 100644 (file)
index fcb9204..0000000
+++ /dev/null
@@ -1 +0,0 @@
-export * from './index.js'
diff --git a/packages/vue-vapor/package.json b/packages/vue-vapor/package.json
deleted file mode 100644 (file)
index 5f02fa5..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-  "name": "@vue/vapor",
-  "version": "3.0.0-vapor",
-  "description": "The progressive JavaScript framework for building modern web UI.",
-  "main": "index.js",
-  "module": "dist/vue-vapor.esm-bundler.js",
-  "types": "dist/vue-vapor.d.ts",
-  "unpkg": "dist/vue-vapor.global.js",
-  "jsdelivr": "dist/vue-vapor.global.js",
-  "files": [
-    "index.js",
-    "index.mjs",
-    "dist"
-  ],
-  "exports": {
-    ".": {
-      "types": "./dist/vue-vapor.d.ts",
-      "import": {
-        "node": "./index.mjs",
-        "default": "./dist/vue-vapor.esm-bundler.js"
-      },
-      "require": {
-        "node": {
-          "production": "./dist/vue-vapor.cjs.prod.js",
-          "development": "./dist/vue-vapor.cjs.js",
-          "default": "./index.js"
-        },
-        "default": "./index.js"
-      }
-    },
-    "./dist/*": "./dist/*",
-    "./package.json": "./package.json"
-  },
-  "buildOptions": {
-    "name": "VueVapor",
-    "formats": [
-      "esm-bundler",
-      "cjs",
-      "global",
-      "esm-browser"
-    ]
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/vuejs/vue-vapor.git"
-  },
-  "keywords": [
-    "vue"
-  ],
-  "author": "Evan You",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/vuejs/vue-vapor/issues"
-  },
-  "homepage": "https://github.com/vuejs/vue-vapor/tree/main/packages/vapor#readme",
-  "dependencies": {
-    "@vue/runtime-vapor": "workspace:*"
-  }
-}
diff --git a/packages/vue-vapor/src/index.ts b/packages/vue-vapor/src/index.ts
deleted file mode 100644 (file)
index c059641..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-import { initCustomFormatter } from '@vue/runtime-dom'
-
-if (__DEV__ && __BROWSER__) {
-  /* istanbul ignore if */
-  if (!__ESM_BUNDLER__) {
-    console.info(
-      `You are running a development build of Vue.\n` +
-        `Make sure to use the production build (*.prod.js) when deploying for production.`,
-    )
-  }
-
-  initCustomFormatter()
-}
-
-export * from '@vue/runtime-vapor/src'
index d47b70ae21f103f82f9930852d4cbe741a7a1746..f3437e5fafd7af6102f63b0c1c93c4b39e06516f 100644 (file)
   "homepage": "https://github.com/vuejs/vue-vapor/tree/main/packages/vue#readme",
   "dependencies": {
     "@vue/shared": "workspace:*",
-    "@vue/vapor": "workspace:*",
     "@vue/compiler-dom": "workspace:*",
     "@vue/runtime-dom": "workspace:*",
+    "@vue/runtime-vapor": "workspace:*",
     "@vue/compiler-sfc": "workspace:*",
     "@vue/server-renderer": "workspace:*"
   },
index 658617456b00cd61c69aa86141d56b917bc9de10..bddf2c71a4594089ffba2471d60f64faf7df9e5b 100644 (file)
@@ -1 +1 @@
-export * from '@vue/vapor'
+export * from '@vue/runtime-vapor'
index 658617456b00cd61c69aa86141d56b917bc9de10..bddf2c71a4594089ffba2471d60f64faf7df9e5b 100644 (file)
@@ -1 +1 @@
-export * from '@vue/vapor'
+export * from '@vue/runtime-vapor'
index a6b4e3cdaf438120dfa4adf61fe21fa6174a9d07..684bafc39bc616ede85475ad8df7b7e623bc7a02 100644 (file)
@@ -1 +1 @@
-module.exports = require('@vue/vapor')
+module.exports = require('@vue/runtime-vapor')
index 658617456b00cd61c69aa86141d56b917bc9de10..bddf2c71a4594089ffba2471d60f64faf7df9e5b 100644 (file)
@@ -1 +1 @@
-export * from '@vue/vapor'
+export * from '@vue/runtime-vapor'
index 8f24be757517357fbf0b62382b250f6b9b6cebb0..5402b4073563c9b7acfa54968fcbfbcf3a5759c4 100644 (file)
@@ -16,9 +16,8 @@ export function DevPlugin({ browser = false } = {}) {
       return {
         resolve: {
           alias: {
-            'vue/vapor': resolve('vue/vapor/index.mjs'),
+            'vue/vapor': resolve('runtime-vapor/src'),
             vue: resolve('vue/src/runtime.ts'),
-            '@vue/vapor': resolve('vue-vapor/src'),
 
             '@vue/runtime-core': resolve('runtime-core/src'),
             '@vue/runtime-dom': resolve('runtime-dom/src'),
index 7f469ca2164df824c09e0cd70c5ffef3e419b83e..3f7ab37c2c8f853da9540412fecbff4be792e638 100644 (file)
@@ -468,15 +468,15 @@ importers:
       '@vue/runtime-dom':
         specifier: workspace:*
         version: link:../runtime-dom
+      '@vue/runtime-vapor':
+        specifier: workspace:*
+        version: link:../runtime-vapor
       '@vue/server-renderer':
         specifier: workspace:*
         version: link:../server-renderer
       '@vue/shared':
         specifier: workspace:*
         version: link:../shared
-      '@vue/vapor':
-        specifier: workspace:*
-        version: link:../vue-vapor
       typescript:
         specifier: '*'
         version: 5.5.4
@@ -496,12 +496,6 @@ importers:
         specifier: workspace:*
         version: link:../vue
 
-  packages/vue-vapor:
-    dependencies:
-      '@vue/runtime-vapor':
-        specifier: workspace:*
-        version: link:../runtime-vapor
-
   playground:
     dependencies:
       '@vueuse/core':
index 051b9b4f9828bd829325f0dff3a2d67bd5a8be82..e34aaa58ab1ad1bb8408f33512c873862f7e0fc4 100644 (file)
@@ -23,7 +23,6 @@
     "rootDir": ".",
     "paths": {
       "@vue/compat": ["packages/vue-compat/src"],
-      "@vue/vapor": ["packages/vue-vapor/src"],
       "@vue/*": ["packages/*/src"],
       "vue": ["packages/vue/src"]
     },