Skip to content

Commit ba5a705

Browse files
Merge branch 'main' into chore-perf
2 parents 73cd394 + 3decc57 commit ba5a705

File tree

22 files changed

+394
-321
lines changed

22 files changed

+394
-321
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"build-runtime-esm": "node scripts/build.js runtime reactivity shared -af esm-bundler && node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js vue -f esm-browser-runtime",
3636
"build-ssr-esm": "node scripts/build.js compiler-sfc server-renderer -f esm-browser",
3737
"build-sfc-playground-self": "cd packages/sfc-playground && npm run build",
38-
"preinstall": "node ./scripts/preinstall.js",
38+
"preinstall": "npx only-allow pnpm",
3939
"postinstall": "simple-git-hooks"
4040
},
4141
"simple-git-hooks": {

packages/compiler-dom/src/decodeHtmlBrowser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ export function decodeHtmlBrowser(raw: string, asAttr = false): string {
88
}
99
if (asAttr) {
1010
decoder.innerHTML = `<div foo="${raw.replace(/"/g, '&quot;')}">`
11-
return decoder.children[0].getAttribute('foo') as string
11+
return decoder.children[0].getAttribute('foo')!
1212
} else {
1313
decoder.innerHTML = raw
14-
return decoder.textContent as string
14+
return decoder.textContent!
1515
}
1616
}

packages/compiler-sfc/src/style/cssVars.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ export function parseCssVars(sfc: SFCDescriptor): string[] {
5353
const vars: string[] = []
5454
sfc.styles.forEach(style => {
5555
let match
56-
// ignore v-bind() in comments /* ... */
57-
const content = style.content.replace(/\/\*([\s\S]*?)\*\//g, '')
56+
// ignore v-bind() in comments, eg /* ... */
57+
// and // (Less, Sass and Stylus all support the use of // to comment)
58+
const content = style.content.replace(/\/\*([\s\S]*?)\*\/|\/\/.*/g, '')
5859
while ((match = vBindRE.exec(content))) {
5960
const start = match.index + match[0].length
6061
const end = lexBinding(content, start)

packages/compiler-sfc/src/style/preprocessors.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ const less: StylePreprocessor = (source, map, options, load = require) => {
9898
const styl: StylePreprocessor = (source, map, options, load = require) => {
9999
const nodeStylus = load('stylus')
100100
try {
101-
const ref = nodeStylus(source)
102-
Object.keys(options).forEach(key => ref.set(key, options[key]))
101+
const ref = nodeStylus(source, options)
103102
if (map) ref.set('sourcemap', { inline: false, comment: false })
104103

105104
const result = ref.render()

packages/reactivity/__tests__/computed.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,13 @@ describe('reactivity/computed', () => {
259259
const onTrigger = vi.fn((e: DebuggerEvent) => {
260260
events.push(e)
261261
})
262-
const obj = reactive({ foo: 1 })
262+
const obj = reactive<{ foo?: number }>({ foo: 1 })
263263
const c = computed(() => obj.foo, { onTrigger })
264264

265265
// computed won't trigger compute until accessed
266266
c.value
267267

268-
obj.foo++
268+
obj.foo!++
269269
expect(c.value).toBe(2)
270270
expect(onTrigger).toHaveBeenCalledTimes(1)
271271
expect(events[0]).toEqual({
@@ -277,7 +277,6 @@ describe('reactivity/computed', () => {
277277
newValue: 2
278278
})
279279

280-
// @ts-ignore
281280
delete obj.foo
282281
expect(c.value).toBeUndefined()
283282
expect(onTrigger).toHaveBeenCalledTimes(2)

packages/reactivity/__tests__/reactive.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('reactivity/reactive', () => {
2323
const reactiveObj = reactive(obj)
2424
expect(isReactive(reactiveObj)).toBe(true)
2525
// read prop of reactiveObject will cause reactiveObj[prop] to be reactive
26-
// @ts-ignore
26+
// @ts-expect-error
2727
const prototype = reactiveObj['__proto__']
2828
const otherObj = { data: ['a'] }
2929
expect(isReactive(otherObj)).toBe(false)
@@ -204,7 +204,7 @@ describe('reactivity/reactive', () => {
204204
const dummy = computed(() => observed.a)
205205
expect(dummy.value).toBe(0)
206206

207-
// @ts-ignore
207+
// @ts-expect-error
208208
observed.a = bar
209209
expect(dummy.value).toBe(1)
210210

@@ -233,6 +233,9 @@ describe('reactivity/reactive', () => {
233233
// symbol
234234
const s = Symbol()
235235
assertValue(s)
236+
// bigint
237+
const bn = BigInt('9007199254740991')
238+
assertValue(bn)
236239

237240
// built-ins should work and return same value
238241
const p = Promise.resolve()

packages/reactivity/src/collectionHandlers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function get(
2727
const rawTarget = toRaw(target)
2828
const rawKey = toRaw(key)
2929
if (!isReadonly) {
30-
if (key !== rawKey) {
30+
if (hasChanged(key, rawKey)) {
3131
track(rawTarget, TrackOpTypes.GET, key)
3232
}
3333
track(rawTarget, TrackOpTypes.GET, rawKey)
@@ -50,7 +50,7 @@ function has(this: CollectionTypes, key: unknown, isReadonly = false): boolean {
5050
const rawTarget = toRaw(target)
5151
const rawKey = toRaw(key)
5252
if (!isReadonly) {
53-
if (key !== rawKey) {
53+
if (hasChanged(key, rawKey)) {
5454
track(rawTarget, TrackOpTypes.HAS, key)
5555
}
5656
track(rawTarget, TrackOpTypes.HAS, rawKey)

packages/reactivity/src/ref.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ class ObjectRefImpl<T extends object, K extends keyof T> {
342342

343343
get value() {
344344
const val = this._object[this._key]
345-
return val === undefined ? (this._defaultValue as T[K]) : val
345+
return val === undefined ? this._defaultValue! : val
346346
}
347347

348348
set value(newVal) {

packages/runtime-core/src/apiCreateApp.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
ComponentPublicInstance
1717
} from './componentPublicInstance'
1818
import { Directive, validateDirectiveName } from './directives'
19-
import { RootRenderFunction } from './renderer'
19+
import { RendererElement, RootRenderFunction } from './renderer'
2020
import { InjectionKey } from './apiInject'
2121
import { warn } from './warning'
2222
import { createVNode, cloneVNode, VNode } from './vnode'
@@ -196,7 +196,7 @@ export type CreateAppFunction<HostElement> = (
196196

197197
let uid = 0
198198

199-
export function createAppAPI<HostElement>(
199+
export function createAppAPI<HostElement extends RendererElement>(
200200
render: RootRenderFunction<HostElement>,
201201
hydrate?: RootHydrateFunction
202202
): CreateAppFunction<HostElement> {

packages/runtime-core/src/devtools.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ interface DevtoolsHook {
3030
appRecords: AppRecord[]
3131
/**
3232
* Added at https://github.com/vuejs/devtools/commit/f2ad51eea789006ab66942e5a27c0f0986a257f9
33-
* Returns wether the arg was buffered or not
33+
* Returns whether the arg was buffered or not
3434
*/
3535
cleanupBuffer?: (matchArg: unknown) => boolean
3636
}

packages/runtime-core/src/directives.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { ComponentPublicInstance } from './componentPublicInstance'
2121
import { mapCompatDirectiveHook } from './compat/customDirective'
2222
import { pauseTracking, resetTracking } from '@vue/reactivity'
2323
import { traverse } from './apiWatch'
24+
import { RendererElement } from './renderer'
2425

2526
export interface DirectiveBinding<V = any> {
2627
instance: ComponentPublicInstance | null
@@ -31,7 +32,11 @@ export interface DirectiveBinding<V = any> {
3132
dir: ObjectDirective<any, V>
3233
}
3334

34-
export type DirectiveHook<T = any, Prev = VNode<any, T> | null, V = any> = (
35+
export type DirectiveHook<
36+
T extends RendererElement = any,
37+
Prev = VNode<any, T> | null,
38+
V = any
39+
> = (
3540
el: T,
3641
binding: DirectiveBinding<V>,
3742
vnode: VNode<any, T>,
@@ -43,7 +48,7 @@ export type SSRDirectiveHook = (
4348
vnode: VNode
4449
) => Data | undefined
4550

46-
export interface ObjectDirective<T = any, V = any> {
51+
export interface ObjectDirective<T extends RendererElement = any, V = any> {
4752
created?: DirectiveHook<T, null, V>
4853
beforeMount?: DirectiveHook<T, null, V>
4954
mounted?: DirectiveHook<T, null, V>
@@ -55,9 +60,12 @@ export interface ObjectDirective<T = any, V = any> {
5560
deep?: boolean
5661
}
5762

58-
export type FunctionDirective<T = any, V = any> = DirectiveHook<T, any, V>
63+
export type FunctionDirective<
64+
T extends RendererElement = any,
65+
V = any
66+
> = DirectiveHook<T, any, V>
5967

60-
export type Directive<T = any, V = any> =
68+
export type Directive<T extends RendererElement = any, V = any> =
6169
| ObjectDirective<T, V>
6270
| FunctionDirective<T, V>
6371

packages/runtime-core/src/renderer.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export type RootRenderFunction<HostElement = RendererElement> = (
9090

9191
export interface RendererOptions<
9292
HostNode = RendererNode,
93-
HostElement = RendererElement
93+
HostElement extends RendererElement = RendererElement
9494
> {
9595
patchProp(
9696
el: HostElement,
@@ -145,7 +145,7 @@ export interface RendererElement extends RendererNode {}
145145
// to optimize bundle size.
146146
export interface RendererInternals<
147147
HostNode = RendererNode,
148-
HostElement = RendererElement
148+
HostElement extends RendererElement = RendererElement
149149
> {
150150
p: PatchFn
151151
um: UnmountFn
@@ -295,7 +295,7 @@ export const queuePostRenderEffect = __FEATURE_SUSPENSE__
295295
*/
296296
export function createRenderer<
297297
HostNode = RendererNode,
298-
HostElement = RendererElement
298+
HostElement extends RendererElement = RendererElement
299299
>(options: RendererOptions<HostNode, HostElement>) {
300300
return baseCreateRenderer<HostNode, HostElement>(options)
301301
}
@@ -312,7 +312,7 @@ export function createHydrationRenderer(
312312
// overload 1: no hydration
313313
function baseCreateRenderer<
314314
HostNode = RendererNode,
315-
HostElement = RendererElement
315+
HostElement extends RendererElement = RendererElement
316316
>(options: RendererOptions<HostNode, HostElement>): Renderer<HostElement>
317317

318318
// overload 2: with hydration
@@ -584,7 +584,7 @@ function baseCreateRenderer(
584584
slotScopeIds: string[] | null,
585585
optimized: boolean
586586
) => {
587-
isSVG = isSVG || (n2.type as string) === 'svg'
587+
isSVG = isSVG || n2.type === 'svg'
588588
if (n1 == null) {
589589
mountElement(
590590
n2,

packages/runtime-core/src/vnode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export type VNodeNormalizedChildren =
133133

134134
export interface VNode<
135135
HostNode = RendererNode,
136-
HostElement = RendererElement,
136+
HostElement extends RendererElement = RendererElement,
137137
ExtraProps = { [key: string]: any }
138138
> {
139139
/**
@@ -613,7 +613,7 @@ export function guardReactiveProps(props: (Data & VNodeProps) | null) {
613613
: props
614614
}
615615

616-
export function cloneVNode<T, U>(
616+
export function cloneVNode<T extends RendererNode, U extends RendererElement>(
617617
vnode: VNode<T, U>,
618618
extraProps?: (Data & VNodeProps) | null,
619619
mergeRef = false
@@ -681,7 +681,7 @@ export function cloneVNode<T, U>(
681681
if (__COMPAT__) {
682682
defineLegacyVNodeProperties(cloned as VNode)
683683
}
684-
return cloned as any
684+
return cloned
685685
}
686686

687687
/**

packages/runtime-dom/src/jsx.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -457,13 +457,39 @@ export interface ImgHTMLAttributes extends HTMLAttributes {
457457
srcset?: string
458458
usemap?: string
459459
width?: Numberish
460+
loading?: 'lazy' | 'eager'
460461
}
461462

462463
export interface InsHTMLAttributes extends HTMLAttributes {
463464
cite?: string
464465
datetime?: string
465466
}
466467

468+
export type InputTypeHTMLAttribute =
469+
| 'button'
470+
| 'checkbox'
471+
| 'color'
472+
| 'date'
473+
| 'datetime-local'
474+
| 'email'
475+
| 'file'
476+
| 'hidden'
477+
| 'image'
478+
| 'month'
479+
| 'number'
480+
| 'password'
481+
| 'radio'
482+
| 'range'
483+
| 'reset'
484+
| 'search'
485+
| 'submit'
486+
| 'tel'
487+
| 'text'
488+
| 'time'
489+
| 'url'
490+
| 'week'
491+
| (string & {})
492+
467493
export interface InputHTMLAttributes extends HTMLAttributes {
468494
accept?: string
469495
alt?: string
@@ -495,7 +521,7 @@ export interface InputHTMLAttributes extends HTMLAttributes {
495521
size?: Numberish
496522
src?: string
497523
step?: Numberish
498-
type?: string
524+
type?: InputTypeHTMLAttribute
499525
value?: any // we support :value to be bound to anything w/ v-model
500526
width?: Numberish
501527
}
@@ -677,7 +703,7 @@ export interface TextareaHTMLAttributes extends HTMLAttributes {
677703
minlength?: Numberish
678704
name?: string
679705
placeholder?: string
680-
readonly?: boolean
706+
readonly?: Booleanish
681707
required?: Booleanish
682708
rows?: Numberish
683709
value?: string | string[] | number
@@ -749,7 +775,7 @@ export interface SVGAttributes extends AriaAttributes, EventHandlers<Events> {
749775
* @see https://www.w3.org/TR/SVG/styling.html#ElementSpecificStyling
750776
*/
751777
class?: any
752-
style?: string | CSSProperties
778+
style?: StyleValue
753779

754780
color?: string
755781
height?: Numberish

packages/sfc-playground/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
},
1010
"devDependencies": {
1111
"@vitejs/plugin-vue": "^4.2.3",
12-
"vite": "^4.3.9"
12+
"vite": "^4.4.2"
1313
},
1414
"dependencies": {
15-
"@vue/repl": "^2.4.0",
15+
"@vue/repl": "^2.5.4",
1616
"file-saver": "^2.0.5",
1717
"jszip": "^3.6.0",
1818
"vue": "workspace:*"

packages/sfc-playground/src/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ function toggleSSR() {
7373
store.setFiles(store.getFiles())
7474
}
7575
76-
const theme = ref('dark')
76+
const theme = ref<'dark' | 'light'>('dark')
7777
function toggleTheme(isDark: boolean) {
7878
theme.value = isDark ? 'dark' : 'light'
7979
}

0 commit comments

Comments
 (0)