componentMetadata.ts 838 B

1234567891011121314151617181920212223242526272829303132
  1. import { type Data, remove } from '@vue/shared'
  2. import type { DelegatedHandler } from './dom/event'
  3. export enum MetadataKind {
  4. prop,
  5. event,
  6. }
  7. export type ComponentMetadata = [
  8. props: Data,
  9. events: Record<string, DelegatedHandler[]>,
  10. ]
  11. export function getMetadata(
  12. el: Node & { $$metadata?: ComponentMetadata },
  13. ): ComponentMetadata {
  14. return el.$$metadata || (el.$$metadata = [{}, {}])
  15. }
  16. export function recordPropMetadata(el: Node, key: string, value: any): any {
  17. const metadata = getMetadata(el)[MetadataKind.prop]
  18. const prev = metadata[key]
  19. metadata[key] = value
  20. return prev
  21. }
  22. export function recordEventMetadata(el: Node, key: string, value: any) {
  23. const metadata = getMetadata(el)[MetadataKind.event]
  24. const handlers = (metadata[key] ||= [])
  25. handlers.push(value)
  26. return () => remove(handlers, value)
  27. }