backfill fixes (#299)
* fix unique symbol error (#248) * Vue breaking change (#279) * bump Vue * ensure we reference the vite.config.js * fix event name casing Vue broke this in a 3.0.5 release, it still worked in 3.0.4. Fixes: #267 * handle throwing while rendering a better in tests
This commit is contained in:
+1
-1
@@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased - React]
|
||||
|
||||
- Nothing yet!
|
||||
- Fix incorrect type error `unique symbol` ([#248](https://github.com/tailwindlabs/headlessui/pull/248), [#240](https://github.com/tailwindlabs/headlessui/issues/240))
|
||||
|
||||
## [Unreleased - Vue]
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { ReactNode, ReactElement } from 'react'
|
||||
// A unique placeholder we can use as some defaults. This is nice because we can use this instead of
|
||||
|
||||
// A unique placeholder we can use as a default. This is nice because we can use this instead of
|
||||
// defaulting to null / never / ... and possibly collide with actual data.
|
||||
const __: unique symbol = Symbol('__placeholder__')
|
||||
// Ideally we use a unique symbol here.
|
||||
let __ = '1D45E01E-AF44-47C4-988A-19A94EBAF55C' as const
|
||||
export type __ = typeof __
|
||||
|
||||
export type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"access": "public"
|
||||
},
|
||||
"scripts": {
|
||||
"playground": "vite serve examples",
|
||||
"playground": "vite --config ./vite.config.js serve examples",
|
||||
"playground:build": "NODE_ENV=production vite build examples",
|
||||
"prepublishOnly": "npm run build",
|
||||
"build": "../../scripts/build.sh",
|
||||
@@ -29,7 +29,7 @@
|
||||
"lint": "../../scripts/lint.sh"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "^3.0.0-rc.13"
|
||||
"vue": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@popperjs/core": "^2.5.3",
|
||||
@@ -38,7 +38,7 @@
|
||||
"@vue/compiler-sfc": "3.0.1",
|
||||
"@vue/test-utils": "^2.0.0-beta.7",
|
||||
"vite": "^1.0.0-rc.4",
|
||||
"vue": "^3.0.0-rc.13",
|
||||
"vue": "^3.0.0",
|
||||
"vue-router": "^4.0.0-beta.13"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,7 +259,7 @@ export let ListboxButton = defineComponent({
|
||||
? [api.labelRef.value.id, this.id].join(' ')
|
||||
: undefined,
|
||||
disabled: api.disabled,
|
||||
onKeyDown: this.handleKeyDown,
|
||||
onKeydown: this.handleKeyDown,
|
||||
onClick: this.handleClick,
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@ export let ListboxOptions = defineComponent({
|
||||
: api.options.value[api.activeOptionIndex.value]?.id,
|
||||
'aria-labelledby': api.labelRef.value?.id ?? api.buttonRef.value?.id,
|
||||
id: this.id,
|
||||
onKeyDown: this.handleKeyDown,
|
||||
onKeydown: this.handleKeyDown,
|
||||
role: 'listbox',
|
||||
tabIndex: 0,
|
||||
ref: 'el',
|
||||
@@ -508,10 +508,10 @@ export let ListboxOption = defineComponent({
|
||||
'aria-selected': selected.value === true ? selected.value : undefined,
|
||||
onClick: handleClick,
|
||||
onFocus: handleFocus,
|
||||
onPointerMove: handleMove,
|
||||
onMouseMove: handleMove,
|
||||
onPointerLeave: handleLeave,
|
||||
onMouseLeave: handleLeave,
|
||||
onPointermove: handleMove,
|
||||
onMousemove: handleMove,
|
||||
onPointerleave: handleLeave,
|
||||
onMouseleave: handleLeave,
|
||||
}
|
||||
|
||||
return render({ props: { ...props, ...propsWeControl }, slot, attrs, slots })
|
||||
|
||||
@@ -315,18 +315,7 @@ describe('Rendering', () => {
|
||||
})
|
||||
|
||||
it('should yell when we render MenuItems using a template `as` prop that contains multiple children', async () => {
|
||||
let state = {
|
||||
resolve(_value: Error | PromiseLike<Error>) {},
|
||||
done(error: unknown) {
|
||||
state.resolve(error as Error)
|
||||
return true
|
||||
},
|
||||
promise: new Promise<Error>(() => {}),
|
||||
}
|
||||
|
||||
state.promise = new Promise<Error>(resolve => {
|
||||
state.resolve = resolve
|
||||
})
|
||||
expect.assertions(1)
|
||||
|
||||
renderTemplate({
|
||||
template: `
|
||||
@@ -339,14 +328,15 @@ describe('Rendering', () => {
|
||||
</MenuItems>
|
||||
</Menu>
|
||||
`,
|
||||
errorCaptured: state.done,
|
||||
errorCaptured(err: unknown) {
|
||||
expect((err as Error).message).toMatchInlineSnapshot(
|
||||
`"You should only render 1 child or use the \`as=\\"...\\"\` prop"`
|
||||
)
|
||||
return false
|
||||
},
|
||||
})
|
||||
|
||||
await click(getMenuButton())
|
||||
let error = await state.promise
|
||||
expect(error.message).toMatchInlineSnapshot(
|
||||
`"You should only render 1 child or use the \`as=\\"...\\"\` prop"`
|
||||
)
|
||||
})
|
||||
|
||||
it('should be possible to always render the MenuItems if we provide it a `static` prop', () => {
|
||||
@@ -469,18 +459,7 @@ describe('Rendering', () => {
|
||||
})
|
||||
|
||||
it('should yell when we render a MenuItem using a template `as` prop that contains multiple children', async () => {
|
||||
let state = {
|
||||
resolve(_value: Error | PromiseLike<Error>) {},
|
||||
done(error: unknown) {
|
||||
state.resolve(error as Error)
|
||||
return true
|
||||
},
|
||||
promise: new Promise<Error>(() => {}),
|
||||
}
|
||||
|
||||
state.promise = new Promise<Error>(resolve => {
|
||||
state.resolve = resolve
|
||||
})
|
||||
expect.assertions(1)
|
||||
|
||||
renderTemplate({
|
||||
template: `
|
||||
@@ -496,14 +475,16 @@ describe('Rendering', () => {
|
||||
</MenuItems>
|
||||
</Menu>
|
||||
`,
|
||||
errorCaptured: state.done,
|
||||
errorCaptured(err: unknown) {
|
||||
expect((err as Error).message).toMatchInlineSnapshot(
|
||||
`"You should only render 1 child or use the \`as=\\"...\\"\` prop"`
|
||||
)
|
||||
|
||||
return false
|
||||
},
|
||||
})
|
||||
|
||||
await click(getMenuButton())
|
||||
let error = await state.promise
|
||||
expect(error.message).toMatchInlineSnapshot(
|
||||
`"You should only render 1 child or use the \`as=\\"...\\"\` prop"`
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -178,7 +178,7 @@ export let MenuButton = defineComponent({
|
||||
'aria-haspopup': true,
|
||||
'aria-controls': api.itemsRef.value?.id,
|
||||
'aria-expanded': api.menuState.value === MenuStates.Open ? true : undefined,
|
||||
onKeyDown: this.handleKeyDown,
|
||||
onKeydown: this.handleKeyDown,
|
||||
onClick: this.handleClick,
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@ export let MenuItems = defineComponent({
|
||||
: api.items.value[api.activeItemIndex.value]?.id,
|
||||
'aria-labelledby': api.buttonRef.value?.id,
|
||||
id: this.id,
|
||||
onKeyDown: this.handleKeyDown,
|
||||
onKeydown: this.handleKeyDown,
|
||||
role: 'menu',
|
||||
tabIndex: 0,
|
||||
ref: 'el',
|
||||
@@ -428,10 +428,10 @@ export let MenuItem = defineComponent({
|
||||
'aria-disabled': disabled === true ? true : undefined,
|
||||
onClick: handleClick,
|
||||
onFocus: handleFocus,
|
||||
onPointerMove: handleMove,
|
||||
onMouseMove: handleMove,
|
||||
onPointerLeave: handleLeave,
|
||||
onMouseLeave: handleLeave,
|
||||
onPointermove: handleMove,
|
||||
onMousemove: handleMove,
|
||||
onPointerleave: handleLeave,
|
||||
onMouseleave: handleLeave,
|
||||
}
|
||||
|
||||
return render({ props: { ...props, ...propsWeControl }, slot, attrs, slots })
|
||||
|
||||
@@ -71,8 +71,8 @@ export let Switch = defineComponent({
|
||||
'aria-checked': this.$props.modelValue,
|
||||
'aria-labelledby': labelledby.value,
|
||||
onClick: this.handleClick,
|
||||
onKeyUp: this.handleKeyUp,
|
||||
onKeyPress: this.handleKeyPress,
|
||||
onKeyup: this.handleKeyUp,
|
||||
onKeypress: this.handleKeyPress,
|
||||
}
|
||||
|
||||
if (this.$props.as === 'button') {
|
||||
|
||||
@@ -3,8 +3,8 @@ import { render } from './vue-testing-library'
|
||||
import { type, shift, Keys } from './interactions'
|
||||
import { defineComponent, h } from 'vue'
|
||||
|
||||
type Events = 'onKeyDown' | 'onKeyUp' | 'onKeyPress' | 'onClick' | 'onBlur' | 'onFocus'
|
||||
let events: Events[] = ['onKeyDown', 'onKeyUp', 'onKeyPress', 'onClick', 'onBlur', 'onFocus']
|
||||
type Events = 'onKeydown' | 'onKeyup' | 'onKeypress' | 'onClick' | 'onBlur' | 'onFocus'
|
||||
let events: Events[] = ['onKeydown', 'onKeyup', 'onKeypress', 'onClick', 'onBlur', 'onFocus']
|
||||
|
||||
function renderTemplate(input: string | Partial<Parameters<typeof defineComponent>[0]>) {
|
||||
let defaultComponents = {}
|
||||
@@ -81,16 +81,16 @@ describe('Keyboard', () => {
|
||||
],
|
||||
|
||||
// Canceling keydown
|
||||
['a', ['keydown', 'keyup'], new Set<Events>(['onKeyDown'])],
|
||||
[Keys.Space, ['keydown', 'keyup'], new Set<Events>(['onKeyDown'])],
|
||||
[Keys.Enter, ['keydown', 'keyup'], new Set<Events>(['onKeyDown'])],
|
||||
[Keys.Tab, ['keydown', 'keyup'], new Set<Events>(['onKeyDown'])],
|
||||
[shift(Keys.Tab), ['keydown', 'keyup'], new Set<Events>(['onKeyDown'])],
|
||||
['a', ['keydown', 'keyup'], new Set<Events>(['onKeydown'])],
|
||||
[Keys.Space, ['keydown', 'keyup'], new Set<Events>(['onKeydown'])],
|
||||
[Keys.Enter, ['keydown', 'keyup'], new Set<Events>(['onKeydown'])],
|
||||
[Keys.Tab, ['keydown', 'keyup'], new Set<Events>(['onKeydown'])],
|
||||
[shift(Keys.Tab), ['keydown', 'keyup'], new Set<Events>(['onKeydown'])],
|
||||
|
||||
// Canceling keypress
|
||||
['a', ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyPress'])],
|
||||
[Keys.Space, ['keydown', 'keypress', 'keyup', 'click'], new Set<Events>(['onKeyPress'])],
|
||||
[Keys.Enter, ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyPress'])],
|
||||
['a', ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeypress'])],
|
||||
[Keys.Space, ['keydown', 'keypress', 'keyup', 'click'], new Set<Events>(['onKeypress'])],
|
||||
[Keys.Enter, ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeypress'])],
|
||||
[
|
||||
Keys.Tab,
|
||||
[
|
||||
@@ -99,7 +99,7 @@ describe('Keyboard', () => {
|
||||
event('focus', 'after'),
|
||||
event('keyup', 'after'),
|
||||
],
|
||||
new Set<Events>(['onKeyPress']),
|
||||
new Set<Events>(['onKeypress']),
|
||||
],
|
||||
[
|
||||
shift(Keys.Tab),
|
||||
@@ -109,13 +109,13 @@ describe('Keyboard', () => {
|
||||
event('focus', 'before'),
|
||||
event('keyup', 'before'),
|
||||
],
|
||||
new Set<Events>(['onKeyPress']),
|
||||
new Set<Events>(['onKeypress']),
|
||||
],
|
||||
|
||||
// Canceling keyup
|
||||
['a', ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyUp'])],
|
||||
[Keys.Space, ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyUp'])],
|
||||
[Keys.Enter, ['keydown', 'keypress', 'click', 'keyup'], new Set<Events>(['onKeyUp'])],
|
||||
['a', ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyup'])],
|
||||
[Keys.Space, ['keydown', 'keypress', 'keyup'], new Set<Events>(['onKeyup'])],
|
||||
[Keys.Enter, ['keydown', 'keypress', 'click', 'keyup'], new Set<Events>(['onKeyup'])],
|
||||
[
|
||||
Keys.Tab,
|
||||
[
|
||||
@@ -124,7 +124,7 @@ describe('Keyboard', () => {
|
||||
event('focus', 'after'),
|
||||
event('keyup', 'after'),
|
||||
],
|
||||
new Set<Events>(['onKeyUp']),
|
||||
new Set<Events>(['onKeyup']),
|
||||
],
|
||||
[
|
||||
shift(Keys.Tab),
|
||||
@@ -134,7 +134,7 @@ describe('Keyboard', () => {
|
||||
event('focus', 'before'),
|
||||
event('keyup', 'before'),
|
||||
],
|
||||
new Set<Events>(['onKeyUp']),
|
||||
new Set<Events>(['onKeyup']),
|
||||
],
|
||||
|
||||
// Cancelling blur
|
||||
@@ -189,7 +189,7 @@ describe('Keyboard', () => {
|
||||
Button: defineComponent({
|
||||
setup(_props, { slots, attrs }) {
|
||||
return () => {
|
||||
return h('button', createProps(attrs.id as string), slots.default())
|
||||
return h('button', createProps(attrs.id as string), slots.default!())
|
||||
}
|
||||
},
|
||||
}),
|
||||
|
||||
@@ -1878,6 +1878,17 @@
|
||||
estree-walker "^2.0.1"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-core@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.0.7.tgz#421782a4c67cc3f2b7c30457ef446d74f8524f74"
|
||||
integrity sha512-JFohgBXoyUc3mdeI2WxlhjQZ5fakfemJkZHX8Gu/nFbEg3+lKVUZmNKWmmnp9aOzJQZKoj77LjmFxiP+P+7lMQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.12.0"
|
||||
"@babel/types" "^7.12.0"
|
||||
"@vue/shared" "3.0.7"
|
||||
estree-walker "^2.0.1"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-dom@3.0.0", "@vue/compiler-dom@^3.0.0-rc.5":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.0.0.tgz#4cbb48fcf1f852daef2babcf9953b681ac463526"
|
||||
@@ -1894,6 +1905,14 @@
|
||||
"@vue/compiler-core" "3.0.1"
|
||||
"@vue/shared" "3.0.1"
|
||||
|
||||
"@vue/compiler-dom@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.0.7.tgz#54d2e12fb9a7aff53abd19dac2c2679533f0c919"
|
||||
integrity sha512-VnIH9EbWQm/Tkcp+8dCaNVsVvhm/vxCrIKWRkXY9215hTqOqQOvejT8IMjd2kc++nIsYMsdQk6H9qqBvoLe/Cw==
|
||||
dependencies:
|
||||
"@vue/compiler-core" "3.0.7"
|
||||
"@vue/shared" "3.0.7"
|
||||
|
||||
"@vue/compiler-sfc@3.0.1":
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.0.1.tgz#f340f8f75b5c1c4509e0f3a12c79d1544899b663"
|
||||
@@ -1961,6 +1980,13 @@
|
||||
dependencies:
|
||||
"@vue/shared" "3.0.0"
|
||||
|
||||
"@vue/reactivity@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.0.7.tgz#e6ccc7bef7fc10b0972e4d974bad71679d3b26ad"
|
||||
integrity sha512-FotWcNNaKhqpFZrdgsUOZ1enlJ5lhTt01CNTtLSyK7jYFgZBTuw8vKsEutZKDYZ1XKotOfoeO8N3pZQqmM6Etw==
|
||||
dependencies:
|
||||
"@vue/shared" "3.0.7"
|
||||
|
||||
"@vue/runtime-core@3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.0.0.tgz#480febf1bfe32798b6abbd71a88f8e8b473a51c2"
|
||||
@@ -1969,6 +1995,14 @@
|
||||
"@vue/reactivity" "3.0.0"
|
||||
"@vue/shared" "3.0.0"
|
||||
|
||||
"@vue/runtime-core@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.0.7.tgz#d44c0b0a57d7e392912a87362a4430ccf446ecea"
|
||||
integrity sha512-DBAZAwVvdmMXuyd6/9qqj/kYr/GaLTmn1L2/QLxLwP+UfhIboiTSBc/tUUb8MRk7Bb98GzNeAWkkT6AfooS3dQ==
|
||||
dependencies:
|
||||
"@vue/reactivity" "3.0.7"
|
||||
"@vue/shared" "3.0.7"
|
||||
|
||||
"@vue/runtime-dom@3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.0.0.tgz#e0d1f7c7e22e1318696014cc3501e06b288c2e11"
|
||||
@@ -1978,6 +2012,15 @@
|
||||
"@vue/shared" "3.0.0"
|
||||
csstype "^2.6.8"
|
||||
|
||||
"@vue/runtime-dom@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.0.7.tgz#b70668d729020bc4ad608c20367223f259576ba6"
|
||||
integrity sha512-Oij4ruOtnpQpCj+/Q3JPzgpTJ1Q7+N67pA53A8KVITEtxfvKL46NN6dhAZ5NGqwX6RWZpYqWQNewITeF0pHr8g==
|
||||
dependencies:
|
||||
"@vue/runtime-core" "3.0.7"
|
||||
"@vue/shared" "3.0.7"
|
||||
csstype "^2.6.8"
|
||||
|
||||
"@vue/shared@3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.0.tgz#ec089236629ecc0f10346b92f101ff4339169f1a"
|
||||
@@ -1988,6 +2031,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.1.tgz#48196c056726aa7466d0182698524c84f203006b"
|
||||
integrity sha512-/X6AUbTFCyD2BcJnBoacUct8qcv1A5uk1+N+3tbzDVuhGPRmoYrTSnNUuF53C/GIsTkChrEiXaJh2kyo/0tRvw==
|
||||
|
||||
"@vue/shared@3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.7.tgz#96d52988efc07444c108c7c6803ba7cc93e40045"
|
||||
integrity sha512-dn5FyfSc4ky424jH4FntiHno7Ss5yLkqKNmM/NXwANRnlkmqu74pnGetexDFVG5phMk9/FhwovUZCWGxsotVKg==
|
||||
|
||||
"@vue/test-utils@^1.0.3", "@vue/test-utils@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.1.0.tgz#76305e73a786c921ede1352849614e26c7113f94"
|
||||
@@ -10692,7 +10740,16 @@ vue@^2.6.10:
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123"
|
||||
integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==
|
||||
|
||||
vue@^3.0.0-rc.13, vue@^3.0.0-rc.5:
|
||||
vue@^3.0.0:
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.0.7.tgz#8bcff51f8be570f9e4ce8cc5f52e2ab0fe3c74a1"
|
||||
integrity sha512-8h4TikD+JabbMK9aRlBO4laG0AtNHRPHynxYgWZ9sq1YUPfzynd9Jeeb27XNyZytC7aCQRX9xe1+TQJuc181Tw==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.0.7"
|
||||
"@vue/runtime-dom" "3.0.7"
|
||||
"@vue/shared" "3.0.7"
|
||||
|
||||
vue@^3.0.0-rc.5:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.0.0.tgz#cfb5df5c34efce319b113a1667d12b74dcfd9c90"
|
||||
integrity sha512-ZMrAARZ32sGIaYKr7Fk2GZEBh/VhulSrGxcGBiAvbN4fhjl3tuJyNFbbbLFqGjndbLoBW66I2ECq8ICdvkKdJw==
|
||||
|
||||
Reference in New Issue
Block a user