@veltra/utils 1.1.28 → 1.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"class-name.js","names":[],"sources":["../../src/dom/class-name.ts"],"sourcesContent":["import { makeBEM, type BEMFactory } from '../helper/make-bem'\nimport { CLS_PREFIX } from '../shared/constants'\n\nexport const bem: BEMFactory<typeof CLS_PREFIX> = makeBEM(CLS_PREFIX)\n\nexport function addClass(el: HTMLElement, className: string | string[]): void {\n if (Array.isArray(className)) {\n className.forEach((c) => el.classList.add(c))\n } else {\n el.classList.add(className)\n }\n}\n\nexport function removeClass(el: HTMLElement, className: string | string[]): void {\n if (Array.isArray(className)) {\n className.forEach((c) => el.classList.remove(c))\n } else {\n el.classList.remove(className)\n }\n}\n"],"mappings":";;;AAGA,MAAa,MAAqC,QAAQ,WAAW;AAErE,SAAgB,SAAS,IAAiB,WAAoC;CAC5E,IAAI,MAAM,QAAQ,UAAU,EAC1B,UAAU,SAAS,MAAM,GAAG,UAAU,IAAI,EAAE,CAAC;MAE7C,GAAG,UAAU,IAAI,UAAU;;AAI/B,SAAgB,YAAY,IAAiB,WAAoC;CAC/E,IAAI,MAAM,QAAQ,UAAU,EAC1B,UAAU,SAAS,MAAM,GAAG,UAAU,OAAO,EAAE,CAAC;MAEhD,GAAG,UAAU,OAAO,UAAU"}
1
+ {"version":3,"file":"class-name.js","names":[],"sources":["../../src/dom/class-name.ts"],"sourcesContent":["import { makeBEM, type BEMFactory } from '../helper/make-bem'\nimport { CLS_PREFIX } from '../shared/constants'\n\nexport const bem: BEMFactory<typeof CLS_PREFIX> = makeBEM(CLS_PREFIX)\n\nexport function addClass(el: HTMLElement, className: string | string[]): void {\n if (Array.isArray(className)) {\n className.forEach((c) => el.classList.add(c))\n } else {\n el.classList.add(className)\n }\n}\n\nexport function removeClass(el: HTMLElement, className: string | string[]): void {\n if (Array.isArray(className)) {\n className.forEach((c) => el.classList.remove(c))\n } else {\n el.classList.remove(className)\n }\n}\n"],"mappings":";;;AAGA,MAAa,MAAqC,QAAQ,UAAU;AAEpE,SAAgB,SAAS,IAAiB,WAAoC;CAC5E,IAAI,MAAM,QAAQ,SAAS,GACzB,UAAU,SAAS,MAAM,GAAG,UAAU,IAAI,CAAC,CAAC;MAE5C,GAAG,UAAU,IAAI,SAAS;AAE9B;AAEA,SAAgB,YAAY,IAAiB,WAAoC;CAC/E,IAAI,MAAM,QAAQ,SAAS,GACzB,UAAU,SAAS,MAAM,GAAG,UAAU,OAAO,CAAC,CAAC;MAE/C,GAAG,UAAU,OAAO,SAAS;AAEjC"}
@@ -11,6 +11,7 @@ function getTransition(options, type) {
11
11
  return (type === "enter" ? options.enterTransition : options.leaveTransition) ?? options.transition ?? "height 0.25s cubic-bezier(0.4, 0, 0.2, 1)";
12
12
  }
13
13
  var ExpandTransition = class {
14
+ options;
14
15
  cleanupMap = /* @__PURE__ */ new Map();
15
16
  constructor(options = {}) {
16
17
  this.options = options;
@@ -1 +1 @@
1
- {"version":3,"file":"expand-transition.js","names":[],"sources":["../../src/dom/expand-transition.ts"],"sourcesContent":["import { removeStyles, setStyles } from './style'\n\nexport interface ExpandTransitionOptions {\n transition?: string\n enterTransition?: string\n leaveTransition?: string\n opacity?: boolean\n}\n\nfunction readVerticalPadding(el: HTMLElement) {\n const { paddingTop, paddingBottom } = getComputedStyle(el)\n return { paddingTop, paddingBottom }\n}\n\nfunction getTransition(options: ExpandTransitionOptions, type: 'enter' | 'leave') {\n return (\n (type === 'enter' ? options.enterTransition : options.leaveTransition) ??\n options.transition ??\n 'height 0.25s cubic-bezier(0.4, 0, 0.2, 1)'\n )\n}\n\nexport class ExpandTransition {\n private cleanupMap = new Map<HTMLElement, () => void>()\n\n constructor(private options: ExpandTransitionOptions = {}) {}\n\n cancel(el: HTMLElement) {\n this.cleanupMap.get(el)?.()\n this.cleanupMap.delete(el)\n }\n\n enter(el: HTMLElement) {\n const height = el.scrollHeight\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: 0,\n paddingTop: 0,\n paddingBottom: 0,\n overflow: 'hidden',\n transition: getTransition(this.options, 'enter'),\n willChange: this.options.opacity ? 'height, opacity' : 'height'\n })\n\n if (this.options.opacity) {\n el.style.opacity = '0'\n }\n\n void el.offsetHeight\n\n setStyles(el, { height: `${height}px`, paddingTop, paddingBottom })\n\n if (this.options.opacity) {\n el.style.opacity = '1'\n }\n }\n\n afterEnter(el: HTMLElement) {\n this.resetTransitionStyles(el)\n }\n\n beforeLeave(el: HTMLElement) {\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: `${el.scrollHeight}px`,\n paddingTop,\n paddingBottom,\n overflow: 'hidden',\n transition: getTransition(this.options, 'leave'),\n willChange: this.options.opacity ? 'height, opacity' : 'height'\n })\n\n if (this.options.opacity) {\n el.style.opacity = '1'\n }\n }\n\n leave(el: HTMLElement) {\n void el.offsetHeight\n\n setStyles(el, { height: 0, paddingTop: 0, paddingBottom: 0 })\n\n if (this.options.opacity) {\n el.style.opacity = '0'\n }\n }\n\n afterLeave(el: HTMLElement) {\n this.resetTransitionStyles(el)\n }\n\n expand(el: HTMLElement) {\n this.animate(el, true)\n }\n\n collapse(el: HTMLElement) {\n this.animate(el, false)\n }\n\n setExpanded(el: HTMLElement, expanded: boolean) {\n this.cancel(el)\n this.resetTemporaryStyles(el)\n el.style.overflow = 'hidden'\n el.style.height = expanded ? 'auto' : '0px'\n }\n\n private animate(el: HTMLElement, expanded: boolean) {\n this.cancel(el)\n\n const startHeight = el.offsetHeight\n const endHeight = expanded ? el.scrollHeight : 0\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n if (startHeight === endHeight) {\n this.setExpanded(el, expanded)\n return\n }\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: `${startHeight}px`,\n paddingTop,\n paddingBottom,\n overflow: 'hidden',\n transition: getTransition(this.options, expanded ? 'enter' : 'leave'),\n willChange: 'height'\n })\n\n void el.offsetHeight\n\n setStyles(el, {\n height: `${endHeight}px`,\n paddingTop: expanded ? paddingTop : 0,\n paddingBottom: expanded ? paddingBottom : 0\n })\n\n const cleanup = () => {\n el.removeEventListener('transitionend', onEnd)\n el.removeEventListener('transitioncancel', onEnd)\n this.cleanupMap.delete(el)\n }\n\n const onEnd = (e: TransitionEvent) => {\n if (e.target !== el || e.propertyName !== 'height') return\n cleanup()\n this.resetTemporaryStyles(el)\n el.style.overflow = 'hidden'\n el.style.height = expanded ? 'auto' : '0px'\n }\n\n el.addEventListener('transitionend', onEnd)\n el.addEventListener('transitioncancel', onEnd)\n this.cleanupMap.set(el, cleanup)\n }\n\n private resetTransitionStyles(el: HTMLElement) {\n removeStyles(el, [\n 'box-sizing',\n 'height',\n 'padding-top',\n 'padding-bottom',\n 'overflow',\n 'transition',\n 'opacity',\n 'will-change'\n ])\n }\n\n private resetTemporaryStyles(el: HTMLElement) {\n removeStyles(el, [\n 'box-sizing',\n 'padding-top',\n 'padding-bottom',\n 'transition',\n 'opacity',\n 'will-change'\n ])\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand-transition.js","names":[],"sources":["../../src/dom/expand-transition.ts"],"sourcesContent":["import { removeStyles, setStyles } from './style'\n\nexport interface ExpandTransitionOptions {\n transition?: string\n enterTransition?: string\n leaveTransition?: string\n opacity?: boolean\n}\n\nfunction readVerticalPadding(el: HTMLElement) {\n const { paddingTop, paddingBottom } = getComputedStyle(el)\n return { paddingTop, paddingBottom }\n}\n\nfunction getTransition(options: ExpandTransitionOptions, type: 'enter' | 'leave') {\n return (\n (type === 'enter' ? options.enterTransition : options.leaveTransition) ??\n options.transition ??\n 'height 0.25s cubic-bezier(0.4, 0, 0.2, 1)'\n )\n}\n\nexport class ExpandTransition {\n private cleanupMap = new Map<HTMLElement, () => void>()\n\n constructor(private options: ExpandTransitionOptions = {}) {}\n\n cancel(el: HTMLElement) {\n this.cleanupMap.get(el)?.()\n this.cleanupMap.delete(el)\n }\n\n enter(el: HTMLElement) {\n const height = el.scrollHeight\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: 0,\n paddingTop: 0,\n paddingBottom: 0,\n overflow: 'hidden',\n transition: getTransition(this.options, 'enter'),\n willChange: this.options.opacity ? 'height, opacity' : 'height'\n })\n\n if (this.options.opacity) {\n el.style.opacity = '0'\n }\n\n void el.offsetHeight\n\n setStyles(el, { height: `${height}px`, paddingTop, paddingBottom })\n\n if (this.options.opacity) {\n el.style.opacity = '1'\n }\n }\n\n afterEnter(el: HTMLElement) {\n this.resetTransitionStyles(el)\n }\n\n beforeLeave(el: HTMLElement) {\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: `${el.scrollHeight}px`,\n paddingTop,\n paddingBottom,\n overflow: 'hidden',\n transition: getTransition(this.options, 'leave'),\n willChange: this.options.opacity ? 'height, opacity' : 'height'\n })\n\n if (this.options.opacity) {\n el.style.opacity = '1'\n }\n }\n\n leave(el: HTMLElement) {\n void el.offsetHeight\n\n setStyles(el, { height: 0, paddingTop: 0, paddingBottom: 0 })\n\n if (this.options.opacity) {\n el.style.opacity = '0'\n }\n }\n\n afterLeave(el: HTMLElement) {\n this.resetTransitionStyles(el)\n }\n\n expand(el: HTMLElement) {\n this.animate(el, true)\n }\n\n collapse(el: HTMLElement) {\n this.animate(el, false)\n }\n\n setExpanded(el: HTMLElement, expanded: boolean) {\n this.cancel(el)\n this.resetTemporaryStyles(el)\n el.style.overflow = 'hidden'\n el.style.height = expanded ? 'auto' : '0px'\n }\n\n private animate(el: HTMLElement, expanded: boolean) {\n this.cancel(el)\n\n const startHeight = el.offsetHeight\n const endHeight = expanded ? el.scrollHeight : 0\n const { paddingTop, paddingBottom } = readVerticalPadding(el)\n\n if (startHeight === endHeight) {\n this.setExpanded(el, expanded)\n return\n }\n\n setStyles(el, {\n boxSizing: 'border-box',\n height: `${startHeight}px`,\n paddingTop,\n paddingBottom,\n overflow: 'hidden',\n transition: getTransition(this.options, expanded ? 'enter' : 'leave'),\n willChange: 'height'\n })\n\n void el.offsetHeight\n\n setStyles(el, {\n height: `${endHeight}px`,\n paddingTop: expanded ? paddingTop : 0,\n paddingBottom: expanded ? paddingBottom : 0\n })\n\n const cleanup = () => {\n el.removeEventListener('transitionend', onEnd)\n el.removeEventListener('transitioncancel', onEnd)\n this.cleanupMap.delete(el)\n }\n\n const onEnd = (e: TransitionEvent) => {\n if (e.target !== el || e.propertyName !== 'height') return\n cleanup()\n this.resetTemporaryStyles(el)\n el.style.overflow = 'hidden'\n el.style.height = expanded ? 'auto' : '0px'\n }\n\n el.addEventListener('transitionend', onEnd)\n el.addEventListener('transitioncancel', onEnd)\n this.cleanupMap.set(el, cleanup)\n }\n\n private resetTransitionStyles(el: HTMLElement) {\n removeStyles(el, [\n 'box-sizing',\n 'height',\n 'padding-top',\n 'padding-bottom',\n 'overflow',\n 'transition',\n 'opacity',\n 'will-change'\n ])\n }\n\n private resetTemporaryStyles(el: HTMLElement) {\n removeStyles(el, [\n 'box-sizing',\n 'padding-top',\n 'padding-bottom',\n 'transition',\n 'opacity',\n 'will-change'\n ])\n }\n}\n"],"mappings":";;AASA,SAAS,oBAAoB,IAAiB;CAC5C,MAAM,EAAE,YAAY,kBAAkB,iBAAiB,EAAE;CACzD,OAAO;EAAE;EAAY;CAAc;AACrC;AAEA,SAAS,cAAc,SAAkC,MAAyB;CAChF,QACG,SAAS,UAAU,QAAQ,kBAAkB,QAAQ,oBACtD,QAAQ,cACR;AAEJ;AAEA,IAAa,mBAAb,MAA8B;CAGR;CAFpB,6BAAqB,IAAI,IAA6B;CAEtD,YAAY,UAA2C,CAAC,GAAG;EAAvC,KAAA,UAAA;CAAwC;CAE5D,OAAO,IAAiB;EACtB,KAAK,WAAW,IAAI,EAAE,IAAI;EAC1B,KAAK,WAAW,OAAO,EAAE;CAC3B;CAEA,MAAM,IAAiB;EACrB,MAAM,SAAS,GAAG;EAClB,MAAM,EAAE,YAAY,kBAAkB,oBAAoB,EAAE;EAE5D,UAAU,IAAI;GACZ,WAAW;GACX,QAAQ;GACR,YAAY;GACZ,eAAe;GACf,UAAU;GACV,YAAY,cAAc,KAAK,SAAS,OAAO;GAC/C,YAAY,KAAK,QAAQ,UAAU,oBAAoB;EACzD,CAAC;EAED,IAAI,KAAK,QAAQ,SACf,GAAG,MAAM,UAAU;EAGrB,GAAQ;EAER,UAAU,IAAI;GAAE,QAAQ,GAAG,OAAO;GAAK;GAAY;EAAc,CAAC;EAElE,IAAI,KAAK,QAAQ,SACf,GAAG,MAAM,UAAU;CAEvB;CAEA,WAAW,IAAiB;EAC1B,KAAK,sBAAsB,EAAE;CAC/B;CAEA,YAAY,IAAiB;EAC3B,MAAM,EAAE,YAAY,kBAAkB,oBAAoB,EAAE;EAE5D,UAAU,IAAI;GACZ,WAAW;GACX,QAAQ,GAAG,GAAG,aAAa;GAC3B;GACA;GACA,UAAU;GACV,YAAY,cAAc,KAAK,SAAS,OAAO;GAC/C,YAAY,KAAK,QAAQ,UAAU,oBAAoB;EACzD,CAAC;EAED,IAAI,KAAK,QAAQ,SACf,GAAG,MAAM,UAAU;CAEvB;CAEA,MAAM,IAAiB;EACrB,GAAQ;EAER,UAAU,IAAI;GAAE,QAAQ;GAAG,YAAY;GAAG,eAAe;EAAE,CAAC;EAE5D,IAAI,KAAK,QAAQ,SACf,GAAG,MAAM,UAAU;CAEvB;CAEA,WAAW,IAAiB;EAC1B,KAAK,sBAAsB,EAAE;CAC/B;CAEA,OAAO,IAAiB;EACtB,KAAK,QAAQ,IAAI,IAAI;CACvB;CAEA,SAAS,IAAiB;EACxB,KAAK,QAAQ,IAAI,KAAK;CACxB;CAEA,YAAY,IAAiB,UAAmB;EAC9C,KAAK,OAAO,EAAE;EACd,KAAK,qBAAqB,EAAE;EAC5B,GAAG,MAAM,WAAW;EACpB,GAAG,MAAM,SAAS,WAAW,SAAS;CACxC;CAEA,QAAgB,IAAiB,UAAmB;EAClD,KAAK,OAAO,EAAE;EAEd,MAAM,cAAc,GAAG;EACvB,MAAM,YAAY,WAAW,GAAG,eAAe;EAC/C,MAAM,EAAE,YAAY,kBAAkB,oBAAoB,EAAE;EAE5D,IAAI,gBAAgB,WAAW;GAC7B,KAAK,YAAY,IAAI,QAAQ;GAC7B;EACF;EAEA,UAAU,IAAI;GACZ,WAAW;GACX,QAAQ,GAAG,YAAY;GACvB;GACA;GACA,UAAU;GACV,YAAY,cAAc,KAAK,SAAS,WAAW,UAAU,OAAO;GACpE,YAAY;EACd,CAAC;EAED,GAAQ;EAER,UAAU,IAAI;GACZ,QAAQ,GAAG,UAAU;GACrB,YAAY,WAAW,aAAa;GACpC,eAAe,WAAW,gBAAgB;EAC5C,CAAC;EAED,MAAM,gBAAgB;GACpB,GAAG,oBAAoB,iBAAiB,KAAK;GAC7C,GAAG,oBAAoB,oBAAoB,KAAK;GAChD,KAAK,WAAW,OAAO,EAAE;EAC3B;EAEA,MAAM,SAAS,MAAuB;GACpC,IAAI,EAAE,WAAW,MAAM,EAAE,iBAAiB,UAAU;GACpD,QAAQ;GACR,KAAK,qBAAqB,EAAE;GAC5B,GAAG,MAAM,WAAW;GACpB,GAAG,MAAM,SAAS,WAAW,SAAS;EACxC;EAEA,GAAG,iBAAiB,iBAAiB,KAAK;EAC1C,GAAG,iBAAiB,oBAAoB,KAAK;EAC7C,KAAK,WAAW,IAAI,IAAI,OAAO;CACjC;CAEA,sBAA8B,IAAiB;EAC7C,aAAa,IAAI;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;CACH;CAEA,qBAA6B,IAAiB;EAC5C,aAAa,IAAI;GACf;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"highlight.js","names":[],"sources":["../../src/dom/highlight.ts"],"sourcesContent":["// TODO: 在多种场景下, 比较KMP算法, BM算法, two-way算法是否比正则更快\n\ninterface HighlightChunk {\n text: string\n highlight: boolean\n}\n\nconst escapeRegexp = (term: string): string =>\n term.replace(/[|\\\\{}()[\\]^$+*?.-]/g, (char: string) => `\\\\${char}`)\n\n/**\n * 获取文本高亮片段\n * @param string 字符串\n * @param substrings 需要匹配的字串列表\n */\nexport function getHighlightChunks(str: string, substrings: string[]): HighlightChunk[] {\n const _substrings = substrings.filter((s) => !!s).map((s) => escapeRegexp(s.trim()))\n const re = new RegExp(`(${_substrings.join('|')})`, 'gi')\n return str\n .split(re)\n .filter(Boolean)\n .map((text) => ({ text, highlight: re.test(text) }))\n}\n"],"mappings":";AAOA,MAAM,gBAAgB,SACpB,KAAK,QAAQ,yBAAyB,SAAiB,KAAK,OAAO;;;;;;AAOrE,SAAgB,mBAAmB,KAAa,YAAwC;CACtF,MAAM,cAAc,WAAW,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,aAAa,EAAE,MAAM,CAAC,CAAC;CACpF,MAAM,KAAK,IAAI,OAAO,IAAI,YAAY,KAAK,IAAI,CAAC,IAAI,KAAK;CACzD,OAAO,IACJ,MAAM,GAAG,CACT,OAAO,QAAQ,CACf,KAAK,UAAU;EAAE;EAAM,WAAW,GAAG,KAAK,KAAK;EAAE,EAAE"}
1
+ {"version":3,"file":"highlight.js","names":[],"sources":["../../src/dom/highlight.ts"],"sourcesContent":["// TODO: 在多种场景下, 比较KMP算法, BM算法, two-way算法是否比正则更快\n\ninterface HighlightChunk {\n text: string\n highlight: boolean\n}\n\nconst escapeRegexp = (term: string): string =>\n term.replace(/[|\\\\{}()[\\]^$+*?.-]/g, (char: string) => `\\\\${char}`)\n\n/**\n * 获取文本高亮片段\n * @param string 字符串\n * @param substrings 需要匹配的字串列表\n */\nexport function getHighlightChunks(str: string, substrings: string[]): HighlightChunk[] {\n const _substrings = substrings.filter((s) => !!s).map((s) => escapeRegexp(s.trim()))\n const re = new RegExp(`(${_substrings.join('|')})`, 'gi')\n return str\n .split(re)\n .filter(Boolean)\n .map((text) => ({ text, highlight: re.test(text) }))\n}\n"],"mappings":";AAOA,MAAM,gBAAgB,SACpB,KAAK,QAAQ,yBAAyB,SAAiB,KAAK,MAAM;;;;;;AAOpE,SAAgB,mBAAmB,KAAa,YAAwC;CACtF,MAAM,cAAc,WAAW,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC;CACnF,MAAM,KAAK,IAAI,OAAO,IAAI,YAAY,KAAK,GAAG,EAAE,IAAI,IAAI;CACxD,OAAO,IACJ,MAAM,EAAE,EACR,OAAO,OAAO,EACd,KAAK,UAAU;EAAE;EAAM,WAAW,GAAG,KAAK,IAAI;CAAE,EAAE;AACvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"position.js","names":[],"sources":["../../src/dom/position.ts"],"sourcesContent":["/**\n * 获取可滚动的父级\n * @param el 元素\n * @returns\n */\nexport function getScrollParents(el: HTMLElement): HTMLElement[] {\n const parents: HTMLElement[] = []\n let parent = el.parentElement\n while (parent) {\n if (parent.scrollHeight > parent.clientHeight) {\n parents.push(parent)\n }\n\n parent = parent.parentElement\n }\n return parents\n}\n\n/**\n * 获取最近的可滚动父级\n * @param el 元素\n * @returns 最近的可滚动父级\n */\nexport function getNearestScrollParent(el: HTMLElement): HTMLElement | null {\n let parent = el.parentElement\n while (parent) {\n if (parent.scrollHeight > parent.clientHeight) {\n return parent\n }\n parent = parent.parentElement\n }\n return null\n}\n\ntype ScrollViewPosition = 'center' | 'start' | 'end'\n\n/**\n * 滚动元素到容器视图中\n * @description 用于替代 `el.scrollIntoView` 方法,因为 `el.scrollIntoView` 在某些情况下会导致外部元素滚动\n * @param el 元素\n * @param container 可滚动容器\n * @param options 滚动选项\n */\nexport function scrollIntoContainerView(\n el: HTMLElement,\n container: HTMLElement | null,\n options?: { block?: ScrollViewPosition; inline?: ScrollViewPosition }\n): void {\n container = container || getNearestScrollParent(el)\n if (!container) return\n\n const { block = 'center', inline = 'center' } = options || {}\n\n const {\n offsetTop: eOffsetTop,\n offsetLeft: eOffsetLeft,\n offsetHeight: eOffsetHeight,\n offsetWidth: eOffsetWidth\n } = el\n\n const {\n clientHeight: cClientHeight,\n clientWidth: cClientWidth,\n scrollTop: cScrollTop,\n scrollLeft: cScrollLeft\n } = container\n\n const isVerticalInView =\n cScrollTop + cClientHeight > eOffsetTop + eOffsetHeight && cScrollTop < eOffsetTop\n\n const isHorizontalInView =\n cScrollLeft + cClientWidth > eOffsetLeft + eOffsetWidth && cScrollLeft < eOffsetLeft\n\n // 垂直方向和水平方向都已经在视图中,则不进行滚动\n if (isVerticalInView && isHorizontalInView) return\n\n if (!isVerticalInView) {\n if (block === 'center') {\n container.scrollTop = eOffsetTop - cClientHeight / 2 + eOffsetHeight / 2\n } else if (block === 'start') {\n container.scrollTop = eOffsetTop\n } else if (block === 'end') {\n container.scrollTop = eOffsetTop - cClientHeight + eOffsetHeight\n }\n }\n\n if (!isHorizontalInView) {\n if (inline === 'center') {\n container.scrollLeft = eOffsetLeft - cClientWidth / 2 + eOffsetWidth / 2\n } else if (inline === 'start') {\n container.scrollLeft = eOffsetLeft\n } else if (inline === 'end') {\n container.scrollLeft = eOffsetLeft - cClientWidth + eOffsetWidth\n }\n }\n}\n"],"mappings":";;;;;;AAKA,SAAgB,iBAAiB,IAAgC;CAC/D,MAAM,UAAyB,EAAE;CACjC,IAAI,SAAS,GAAG;CAChB,OAAO,QAAQ;EACb,IAAI,OAAO,eAAe,OAAO,cAC/B,QAAQ,KAAK,OAAO;EAGtB,SAAS,OAAO;;CAElB,OAAO;;;;;;;AAQT,SAAgB,uBAAuB,IAAqC;CAC1E,IAAI,SAAS,GAAG;CAChB,OAAO,QAAQ;EACb,IAAI,OAAO,eAAe,OAAO,cAC/B,OAAO;EAET,SAAS,OAAO;;CAElB,OAAO;;;;;;;;;AAYT,SAAgB,wBACd,IACA,WACA,SACM;CACN,YAAY,aAAa,uBAAuB,GAAG;CACnD,IAAI,CAAC,WAAW;CAEhB,MAAM,EAAE,QAAQ,UAAU,SAAS,aAAa,WAAW,EAAE;CAE7D,MAAM,EACJ,WAAW,YACX,YAAY,aACZ,cAAc,eACd,aAAa,iBACX;CAEJ,MAAM,EACJ,cAAc,eACd,aAAa,cACb,WAAW,YACX,YAAY,gBACV;CAEJ,MAAM,mBACJ,aAAa,gBAAgB,aAAa,iBAAiB,aAAa;CAE1E,MAAM,qBACJ,cAAc,eAAe,cAAc,gBAAgB,cAAc;CAG3E,IAAI,oBAAoB,oBAAoB;CAE5C,IAAI,CAAC;MACC,UAAU,UACZ,UAAU,YAAY,aAAa,gBAAgB,IAAI,gBAAgB;OAClE,IAAI,UAAU,SACnB,UAAU,YAAY;OACjB,IAAI,UAAU,OACnB,UAAU,YAAY,aAAa,gBAAgB;;CAIvD,IAAI,CAAC;MACC,WAAW,UACb,UAAU,aAAa,cAAc,eAAe,IAAI,eAAe;OAClE,IAAI,WAAW,SACpB,UAAU,aAAa;OAClB,IAAI,WAAW,OACpB,UAAU,aAAa,cAAc,eAAe"}
1
+ {"version":3,"file":"position.js","names":[],"sources":["../../src/dom/position.ts"],"sourcesContent":["/**\n * 获取可滚动的父级\n * @param el 元素\n * @returns\n */\nexport function getScrollParents(el: HTMLElement): HTMLElement[] {\n const parents: HTMLElement[] = []\n let parent = el.parentElement\n while (parent) {\n if (parent.scrollHeight > parent.clientHeight) {\n parents.push(parent)\n }\n\n parent = parent.parentElement\n }\n return parents\n}\n\n/**\n * 获取最近的可滚动父级\n * @param el 元素\n * @returns 最近的可滚动父级\n */\nexport function getNearestScrollParent(el: HTMLElement): HTMLElement | null {\n let parent = el.parentElement\n while (parent) {\n if (parent.scrollHeight > parent.clientHeight) {\n return parent\n }\n parent = parent.parentElement\n }\n return null\n}\n\ntype ScrollViewPosition = 'center' | 'start' | 'end'\n\n/**\n * 滚动元素到容器视图中\n * @description 用于替代 `el.scrollIntoView` 方法,因为 `el.scrollIntoView` 在某些情况下会导致外部元素滚动\n * @param el 元素\n * @param container 可滚动容器\n * @param options 滚动选项\n */\nexport function scrollIntoContainerView(\n el: HTMLElement,\n container: HTMLElement | null,\n options?: { block?: ScrollViewPosition; inline?: ScrollViewPosition }\n): void {\n container = container || getNearestScrollParent(el)\n if (!container) return\n\n const { block = 'center', inline = 'center' } = options || {}\n\n const {\n offsetTop: eOffsetTop,\n offsetLeft: eOffsetLeft,\n offsetHeight: eOffsetHeight,\n offsetWidth: eOffsetWidth\n } = el\n\n const {\n clientHeight: cClientHeight,\n clientWidth: cClientWidth,\n scrollTop: cScrollTop,\n scrollLeft: cScrollLeft\n } = container\n\n const isVerticalInView =\n cScrollTop + cClientHeight > eOffsetTop + eOffsetHeight && cScrollTop < eOffsetTop\n\n const isHorizontalInView =\n cScrollLeft + cClientWidth > eOffsetLeft + eOffsetWidth && cScrollLeft < eOffsetLeft\n\n // 垂直方向和水平方向都已经在视图中,则不进行滚动\n if (isVerticalInView && isHorizontalInView) return\n\n if (!isVerticalInView) {\n if (block === 'center') {\n container.scrollTop = eOffsetTop - cClientHeight / 2 + eOffsetHeight / 2\n } else if (block === 'start') {\n container.scrollTop = eOffsetTop\n } else if (block === 'end') {\n container.scrollTop = eOffsetTop - cClientHeight + eOffsetHeight\n }\n }\n\n if (!isHorizontalInView) {\n if (inline === 'center') {\n container.scrollLeft = eOffsetLeft - cClientWidth / 2 + eOffsetWidth / 2\n } else if (inline === 'start') {\n container.scrollLeft = eOffsetLeft\n } else if (inline === 'end') {\n container.scrollLeft = eOffsetLeft - cClientWidth + eOffsetWidth\n }\n }\n}\n"],"mappings":";;;;;;AAKA,SAAgB,iBAAiB,IAAgC;CAC/D,MAAM,UAAyB,CAAC;CAChC,IAAI,SAAS,GAAG;CAChB,OAAO,QAAQ;EACb,IAAI,OAAO,eAAe,OAAO,cAC/B,QAAQ,KAAK,MAAM;EAGrB,SAAS,OAAO;CAClB;CACA,OAAO;AACT;;;;;;AAOA,SAAgB,uBAAuB,IAAqC;CAC1E,IAAI,SAAS,GAAG;CAChB,OAAO,QAAQ;EACb,IAAI,OAAO,eAAe,OAAO,cAC/B,OAAO;EAET,SAAS,OAAO;CAClB;CACA,OAAO;AACT;;;;;;;;AAWA,SAAgB,wBACd,IACA,WACA,SACM;CACN,YAAY,aAAa,uBAAuB,EAAE;CAClD,IAAI,CAAC,WAAW;CAEhB,MAAM,EAAE,QAAQ,UAAU,SAAS,aAAa,WAAW,CAAC;CAE5D,MAAM,EACJ,WAAW,YACX,YAAY,aACZ,cAAc,eACd,aAAa,iBACX;CAEJ,MAAM,EACJ,cAAc,eACd,aAAa,cACb,WAAW,YACX,YAAY,gBACV;CAEJ,MAAM,mBACJ,aAAa,gBAAgB,aAAa,iBAAiB,aAAa;CAE1E,MAAM,qBACJ,cAAc,eAAe,cAAc,gBAAgB,cAAc;CAG3E,IAAI,oBAAoB,oBAAoB;CAE5C,IAAI,CAAC;MACC,UAAU,UACZ,UAAU,YAAY,aAAa,gBAAgB,IAAI,gBAAgB;OAClE,IAAI,UAAU,SACnB,UAAU,YAAY;OACjB,IAAI,UAAU,OACnB,UAAU,YAAY,aAAa,gBAAgB;CAAA;CAIvD,IAAI,CAAC;MACC,WAAW,UACb,UAAU,aAAa,cAAc,eAAe,IAAI,eAAe;OAClE,IAAI,WAAW,SACpB,UAAU,aAAa;OAClB,IAAI,WAAW,OACpB,UAAU,aAAa,cAAc,eAAe;CAAA;AAG1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../src/dom/style.ts"],"sourcesContent":["import { str } from '@cat-kit/core'\nimport type { CSSProperties } from 'vue'\n\n/**\n * 给数值加上单位\n * @param value 数值\n * @param unit 单位\n * @returns\n */\nexport function withUnit(value: number | string | undefined, unit: string): string | undefined {\n return value === undefined\n ? undefined\n : typeof value === 'number' || !isNaN(+value)\n ? String(value) + unit\n : value\n}\n\n/**\n * 设置元素样式,优先使用高性能的方式\n * @param el 元素\n * @param styles 样式\n */\nexport function setStyles(el: HTMLElement, styles: CSSProperties): void {\n Object.keys(styles).forEach((key) => {\n el.style[key] = styles[key]\n })\n // TODO: 此处有问题,在某些情况下会导致样式设置失效\n // 例如在 Tabs 组件中无法设置overflow属性\n // if (el.attributeStyleMap) {\n // Object.keys(styles).forEach(key => {\n // const value = styles[key]\n // if (!value && value !== 0) {\n // el.attributeStyleMap.delete(kebabCase(key))\n // } else {\n // el.attributeStyleMap.set(kebabCase(key), value)\n // }\n // })\n // } else {\n // Object.keys(styles).forEach(key => {\n // el.style[key] = styles[key]\n // })\n // }\n}\n\n/**\n * 移除样式\n * @param el dom元素\n * @param props 要移除的样式属性\n */\nexport function removeStyles(el: HTMLElement, props: string[]): void {\n if (el.attributeStyleMap) {\n props.forEach((key) => {\n el.attributeStyleMap.delete(str(key).kebabCase())\n })\n } else {\n props.forEach((key) => {\n el.style.removeProperty(key)\n })\n }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,SAAS,OAAoC,MAAkC;CAC7F,OAAO,UAAU,KAAA,IACb,KAAA,IACA,OAAO,UAAU,YAAY,CAAC,MAAM,CAAC,MAAM,GACzC,OAAO,MAAM,GAAG,OAChB;;;;;;;AAQR,SAAgB,UAAU,IAAiB,QAA6B;CACtE,OAAO,KAAK,OAAO,CAAC,SAAS,QAAQ;EACnC,GAAG,MAAM,OAAO,OAAO;GACvB;;;;;;;AAwBJ,SAAgB,aAAa,IAAiB,OAAuB;CACnE,IAAI,GAAG,mBACL,MAAM,SAAS,QAAQ;EACrB,GAAG,kBAAkB,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC;GACjD;MAEF,MAAM,SAAS,QAAQ;EACrB,GAAG,MAAM,eAAe,IAAI;GAC5B"}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../src/dom/style.ts"],"sourcesContent":["import { str } from '@cat-kit/core'\nimport type { CSSProperties } from 'vue'\n\n/**\n * 给数值加上单位\n * @param value 数值\n * @param unit 单位\n * @returns\n */\nexport function withUnit(value: number | string | undefined, unit: string): string | undefined {\n return value === undefined\n ? undefined\n : typeof value === 'number' || !isNaN(+value)\n ? String(value) + unit\n : value\n}\n\n/**\n * 设置元素样式,优先使用高性能的方式\n * @param el 元素\n * @param styles 样式\n */\nexport function setStyles(el: HTMLElement, styles: CSSProperties): void {\n Object.keys(styles).forEach((key) => {\n el.style[key] = styles[key]\n })\n // TODO: 此处有问题,在某些情况下会导致样式设置失效\n // 例如在 Tabs 组件中无法设置overflow属性\n // if (el.attributeStyleMap) {\n // Object.keys(styles).forEach(key => {\n // const value = styles[key]\n // if (!value && value !== 0) {\n // el.attributeStyleMap.delete(kebabCase(key))\n // } else {\n // el.attributeStyleMap.set(kebabCase(key), value)\n // }\n // })\n // } else {\n // Object.keys(styles).forEach(key => {\n // el.style[key] = styles[key]\n // })\n // }\n}\n\n/**\n * 移除样式\n * @param el dom元素\n * @param props 要移除的样式属性\n */\nexport function removeStyles(el: HTMLElement, props: string[]): void {\n if (el.attributeStyleMap) {\n props.forEach((key) => {\n el.attributeStyleMap.delete(str(key).kebabCase())\n })\n } else {\n props.forEach((key) => {\n el.style.removeProperty(key)\n })\n }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,SAAS,OAAoC,MAAkC;CAC7F,OAAO,UAAU,KAAA,IACb,KAAA,IACA,OAAO,UAAU,YAAY,CAAC,MAAM,CAAC,KAAK,IACxC,OAAO,KAAK,IAAI,OAChB;AACR;;;;;;AAOA,SAAgB,UAAU,IAAiB,QAA6B;CACtE,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;EACnC,GAAG,MAAM,OAAO,OAAO;CACzB,CAAC;AAiBH;;;;;;AAOA,SAAgB,aAAa,IAAiB,OAAuB;CACnE,IAAI,GAAG,mBACL,MAAM,SAAS,QAAQ;EACrB,GAAG,kBAAkB,OAAO,IAAI,GAAG,EAAE,UAAU,CAAC;CAClD,CAAC;MAED,MAAM,SAAS,QAAQ;EACrB,GAAG,MAAM,eAAe,GAAG;CAC7B,CAAC;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"z-index.js","names":[],"sources":["../../src/dom/z-index.ts"],"sourcesContent":["import { createIncrease } from '../helper/create-increase'\n\n/**\n * z轴层级\n * 保证每个新打开的弹框的位置都处于上层\n */\nexport const zIndex: () => number = createIncrease(1000)\n"],"mappings":";;;;;;AAMA,MAAa,SAAuB,eAAe,IAAK"}
1
+ {"version":3,"file":"z-index.js","names":[],"sources":["../../src/dom/z-index.ts"],"sourcesContent":["import { createIncrease } from '../helper/create-increase'\n\n/**\n * z轴层级\n * 保证每个新打开的弹框的位置都处于上层\n */\nexport const zIndex: () => number = createIncrease(1000)\n"],"mappings":";;;;;;AAMA,MAAa,SAAuB,eAAe,GAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","names":[],"sources":["../../src/form/validate.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\n\nimport type { Undef } from '../types/helper'\nimport type { ValidateRule, Data, ValidatorConfig, PresetRule } from '../types/utils/form/validate'\n\nconst isEmpty = (value: any): value is null | undefined => {\n return value === null || value === undefined\n}\n\nconst presetRules: Record<PresetRule, (value: string) => string | undefined> = {\n email(v) {\n const re = /^([\\w_-]+)@([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}$/\n if (!re.test(v)) {\n return '邮箱格式不正确'\n }\n },\n phone(v) {\n const re = /^\\d{11}$/\n if (!re.test(v)) {\n return '手机号格式不正确'\n }\n },\n num(v) {\n const re = /^\\d+$/\n if (!re.test(v)) {\n return '数字格式不正确'\n }\n },\n url(v) {\n const re = /^(ftp|https?):\\/\\/([\\w_-]+)\\.([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)/\n if (!re.test(v)) {\n return '链接格式不正确'\n }\n },\n\n idCard(v) {\n const re = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/\n if (!re.test(v)) {\n return '身份证格式不正确'\n }\n }\n}\n\n/** 预设规则 */\nconst ruleTypes = {\n required(value: any, required: ValidateRule['required']): Undef<string> {\n if (required === false) return\n\n const errMsg = typeof required === 'string' ? required : '该项不能为空'\n if (isEmpty(value)) return errMsg\n\n if (Array.isArray(value) && !value.length) return errMsg\n if (typeof value === 'string' && !value) return errMsg\n },\n min(value: any, rule: ValidateRule['min']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须大于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value < _rule) return errMsg\n },\n max(value: any, rule: ValidateRule['max']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须小于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value > _rule) return errMsg\n },\n\n minLen(value: any, rule: ValidateRule['minLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须大于等于${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length < _rule) return errMsg\n },\n maxLen(value: any, rule: ValidateRule['maxLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须小于等于:${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length > _rule) return errMsg\n },\n match(value: any, rule: ValidateRule['match']): Undef<string> {\n if (isEmpty(value) || value === '') return\n if (typeof rule === 'string') {\n if (!rule) return\n rule = new RegExp(rule)\n }\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项不匹配正则:${_rule}`\n if (typeof value !== 'string') return `${value}不是一个字符串`\n if (!_rule.test(value)) return errMsg\n },\n preset(value: any, rule: ValidateRule['preset']): Undef<string> {\n if (isEmpty(value) || value === '' || !rule) return\n if (typeof value !== 'string') return `${value}不是一个字符串`\n const ruleValidator = presetRules[rule]\n return ruleValidator(value)\n }\n}\n/** */\nexport class Validator<\n Rules extends Record<string, ValidateRule> = Record<string, ValidateRule>,\n Field extends keyof Rules = keyof Rules\n> {\n protected rules: Rules\n\n private config?: ValidatorConfig\n\n constructor(rules: Rules, config?: ValidatorConfig) {\n this.rules = rules\n if (config) {\n this.config = config\n }\n }\n\n /** 是否存在规则 */\n private get existRules() {\n for (const _ in this.rules) {\n return true\n }\n return false\n }\n\n /**\n * 校验单条数据\n * @param data 数据\n */\n private async validateSingleData(\n data: Record<any, any>,\n fields?: Field | Field[]\n ): Promise<{ [key in Field]?: string[] }> {\n const fieldErrors: { [key in Field]?: string[] } = {}\n\n if (!this.existRules) return fieldErrors\n\n const lazy = this.config?.lazy ?? true\n\n fields = fields\n ? Array.isArray(fields)\n ? fields\n : [fields]\n : (Object.keys(this.rules) as Field[])\n\n // 懒校验,当有一个规则不通过,剩下的规则不再校验\n if (lazy) {\n // 校验字段\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n // oxlint-disable-next-line no-await-in-loop -- 懒校验需按字段顺序短路\n const errors = await this.validateValueLazy(data, field)\n if (errors.length === 0) continue\n fieldErrors[field] = errors\n }\n return fieldErrors\n } else {\n // 校验字段\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n // oxlint-disable-next-line no-await-in-loop -- 按字段顺序校验以便尽早收集错误\n const errors = await this.validateValue(data, field)\n if (errors.length === 0) continue\n fieldErrors[field] = errors\n }\n\n return fieldErrors\n }\n }\n\n private async validateValue(data: Record<any, any>, field: Field) {\n const rules = this.rules[field]!\n const value = o(data).get(field as string)\n\n const { validator, required, ...normalRules } = rules\n\n let errors: string[] = []\n\n // 必填要先去校验\n if (required) {\n const err = ruleTypes.required(value, required)\n err && errors.push(err)\n }\n\n // 校验规则\n for (const ruleKey in normalRules) {\n const validate = ruleTypes[ruleKey]\n if (!validate) continue\n const err = validate(value, normalRules[ruleKey])\n err && errors.push(err)\n }\n\n // 自定义校验\n if (validator) {\n const err = await validator(value, data)\n err && errors.push(err)\n }\n\n return errors\n }\n\n private async validateValueLazy(data: Record<any, any>, field: Field): Promise<string[]> {\n const rules = this.rules[field]\n const value = o(data).get(field as string)\n let errors: string[] = []\n\n if (!rules) return errors\n\n const { validator, required, ...normalRules } = rules\n\n // 必填要先去校验\n if (required) {\n const err = ruleTypes.required(value, required)\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n // 校验规则\n for (const ruleKey in normalRules) {\n const validate = ruleTypes[ruleKey]\n if (!validate) continue\n\n const err = validate(value, normalRules[ruleKey])\n\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n // 自定义校验最火校验\n if (validator) {\n const err = await validator(value, data)\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n return errors\n }\n\n /**\n * 校验多条数据\n * @param field 需要校验的字段\n */\n private async validateManyData(\n data: Data,\n field?: Field | Field[]\n ): Promise<{ [key in Field]?: string[] }> {\n let i = 0\n while (i < data.length) {\n const item = data[i]!\n // oxlint-disable-next-line no-await-in-loop -- 多条数据校验命中首条错误即返回\n const fieldErrors = await this.validateSingleData(item, field)\n if (Object.keys(fieldErrors).length > 0) {\n return fieldErrors\n }\n i++\n }\n\n return {}\n }\n\n /**\n * 校验\n * @param data 数据\n * @param fields 字段\n * @returns\n */\n async validate(data: Data, fields?: Field | Field[]): Promise<{ [key in Field]?: string[] }> {\n return Array.isArray(data)\n ? this.validateManyData(data, fields)\n : this.validateSingleData(data, fields)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","names":[],"sources":["../../src/form/validate.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\n\nimport type { Undef } from '../types/helper'\nimport type { ValidateRule, Data, ValidatorConfig, PresetRule } from '../types/utils/form/validate'\n\nconst isEmpty = (value: any): value is null | undefined => {\n return value === null || value === undefined\n}\n\nconst presetRules: Record<PresetRule, (value: string) => string | undefined> = {\n email(v) {\n const re = /^([\\w_-]+)@([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}$/\n if (!re.test(v)) {\n return '邮箱格式不正确'\n }\n },\n phone(v) {\n const re = /^\\d{11}$/\n if (!re.test(v)) {\n return '手机号格式不正确'\n }\n },\n num(v) {\n const re = /^\\d+$/\n if (!re.test(v)) {\n return '数字格式不正确'\n }\n },\n url(v) {\n const re = /^(ftp|https?):\\/\\/([\\w_-]+)\\.([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)/\n if (!re.test(v)) {\n return '链接格式不正确'\n }\n },\n\n idCard(v) {\n const re = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/\n if (!re.test(v)) {\n return '身份证格式不正确'\n }\n }\n}\n\n/** 预设规则 */\nconst ruleTypes = {\n required(value: any, required: ValidateRule['required']): Undef<string> {\n if (required === false) return\n\n const errMsg = typeof required === 'string' ? required : '该项不能为空'\n if (isEmpty(value)) return errMsg\n\n if (Array.isArray(value) && !value.length) return errMsg\n if (typeof value === 'string' && !value) return errMsg\n },\n min(value: any, rule: ValidateRule['min']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须大于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value < _rule) return errMsg\n },\n max(value: any, rule: ValidateRule['max']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须小于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value > _rule) return errMsg\n },\n\n minLen(value: any, rule: ValidateRule['minLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须大于等于${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length < _rule) return errMsg\n },\n maxLen(value: any, rule: ValidateRule['maxLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须小于等于:${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length > _rule) return errMsg\n },\n match(value: any, rule: ValidateRule['match']): Undef<string> {\n if (isEmpty(value) || value === '') return\n if (typeof rule === 'string') {\n if (!rule) return\n rule = new RegExp(rule)\n }\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项不匹配正则:${_rule}`\n if (typeof value !== 'string') return `${value}不是一个字符串`\n if (!_rule.test(value)) return errMsg\n },\n preset(value: any, rule: ValidateRule['preset']): Undef<string> {\n if (isEmpty(value) || value === '' || !rule) return\n if (typeof value !== 'string') return `${value}不是一个字符串`\n const ruleValidator = presetRules[rule]\n return ruleValidator(value)\n }\n}\n/** */\nexport class Validator<\n Rules extends Record<string, ValidateRule> = Record<string, ValidateRule>,\n Field extends keyof Rules = keyof Rules\n> {\n protected rules: Rules\n\n private config?: ValidatorConfig\n\n constructor(rules: Rules, config?: ValidatorConfig) {\n this.rules = rules\n if (config) {\n this.config = config\n }\n }\n\n /** 是否存在规则 */\n private get existRules() {\n for (const _ in this.rules) {\n return true\n }\n return false\n }\n\n /**\n * 校验单条数据\n * @param data 数据\n */\n private async validateSingleData(\n data: Record<any, any>,\n fields?: Field | Field[]\n ): Promise<{ [key in Field]?: string[] }> {\n const fieldErrors: { [key in Field]?: string[] } = {}\n\n if (!this.existRules) return fieldErrors\n\n const lazy = this.config?.lazy ?? true\n\n fields = fields\n ? Array.isArray(fields)\n ? fields\n : [fields]\n : (Object.keys(this.rules) as Field[])\n\n // 懒校验,当有一个规则不通过,剩下的规则不再校验\n if (lazy) {\n // 校验字段\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n // oxlint-disable-next-line no-await-in-loop -- 懒校验需按字段顺序短路\n const errors = await this.validateValueLazy(data, field)\n if (errors.length === 0) continue\n fieldErrors[field] = errors\n }\n return fieldErrors\n } else {\n // 校验字段\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n // oxlint-disable-next-line no-await-in-loop -- 按字段顺序校验以便尽早收集错误\n const errors = await this.validateValue(data, field)\n if (errors.length === 0) continue\n fieldErrors[field] = errors\n }\n\n return fieldErrors\n }\n }\n\n private async validateValue(data: Record<any, any>, field: Field) {\n const rules = this.rules[field]!\n const value = o(data).get(field as string)\n\n const { validator, required, ...normalRules } = rules\n\n let errors: string[] = []\n\n // 必填要先去校验\n if (required) {\n const err = ruleTypes.required(value, required)\n err && errors.push(err)\n }\n\n // 校验规则\n for (const ruleKey in normalRules) {\n const validate = ruleTypes[ruleKey]\n if (!validate) continue\n const err = validate(value, normalRules[ruleKey])\n err && errors.push(err)\n }\n\n // 自定义校验\n if (validator) {\n const err = await validator(value, data)\n err && errors.push(err)\n }\n\n return errors\n }\n\n private async validateValueLazy(data: Record<any, any>, field: Field): Promise<string[]> {\n const rules = this.rules[field]\n const value = o(data).get(field as string)\n let errors: string[] = []\n\n if (!rules) return errors\n\n const { validator, required, ...normalRules } = rules\n\n // 必填要先去校验\n if (required) {\n const err = ruleTypes.required(value, required)\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n // 校验规则\n for (const ruleKey in normalRules) {\n const validate = ruleTypes[ruleKey]\n if (!validate) continue\n\n const err = validate(value, normalRules[ruleKey])\n\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n // 自定义校验最火校验\n if (validator) {\n const err = await validator(value, data)\n if (err) {\n errors.push(err)\n return errors\n }\n }\n\n return errors\n }\n\n /**\n * 校验多条数据\n * @param field 需要校验的字段\n */\n private async validateManyData(\n data: Data,\n field?: Field | Field[]\n ): Promise<{ [key in Field]?: string[] }> {\n let i = 0\n while (i < data.length) {\n const item = data[i]!\n // oxlint-disable-next-line no-await-in-loop -- 多条数据校验命中首条错误即返回\n const fieldErrors = await this.validateSingleData(item, field)\n if (Object.keys(fieldErrors).length > 0) {\n return fieldErrors\n }\n i++\n }\n\n return {}\n }\n\n /**\n * 校验\n * @param data 数据\n * @param fields 字段\n * @returns\n */\n async validate(data: Data, fields?: Field | Field[]): Promise<{ [key in Field]?: string[] }> {\n return Array.isArray(data)\n ? this.validateManyData(data, fields)\n : this.validateSingleData(data, fields)\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-increase.js","names":[],"sources":["../../src/helper/create-increase.ts"],"sourcesContent":["/**\n * 创建一个自增函数\n * @param initial 初始值\n * @returns\n */\nexport function createIncrease(initial = 1000): () => number {\n let value = initial\n\n const increase = () => {\n return value++\n }\n\n return increase\n}\n"],"mappings":";;;;;;AAKA,SAAgB,eAAe,UAAU,KAAoB;CAC3D,IAAI,QAAQ;CAEZ,MAAM,iBAAiB;EACrB,OAAO;;CAGT,OAAO"}
1
+ {"version":3,"file":"create-increase.js","names":[],"sources":["../../src/helper/create-increase.ts"],"sourcesContent":["/**\n * 创建一个自增函数\n * @param initial 初始值\n * @returns\n */\nexport function createIncrease(initial = 1000): () => number {\n let value = initial\n\n const increase = () => {\n return value++\n }\n\n return increase\n}\n"],"mappings":";;;;;;AAKA,SAAgB,eAAe,UAAU,KAAoB;CAC3D,IAAI,QAAQ;CAEZ,MAAM,iBAAiB;EACrB,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-toggle.js","names":[],"sources":["../../src/helper/create-toggle.ts"],"sourcesContent":["type Active = boolean | ((active: boolean) => boolean) | ((active: boolean) => Promise<boolean>)\n\ntype ToggleReturn = [{ value: boolean }, (active: Active) => void]\n/**\n * 创建一个toggle函数\n * @param initial 初始值\n * @param onChange 值变化时的回调\n * @returns\n */\nexport function createToggle(initial = false, onChange?: (active: boolean) => void): ToggleReturn {\n const state = { value: initial }\n\n function toggle(active: Active) {\n if (typeof active === 'boolean') {\n state.value = active\n return onChange?.(state.value)\n }\n\n const result = active(state.value)\n\n if (result instanceof Promise) {\n result.then(toggle)\n } else {\n toggle(result)\n }\n }\n\n return [state, toggle]\n}\n"],"mappings":";;;;;;;AASA,SAAgB,aAAa,UAAU,OAAO,UAAoD;CAChG,MAAM,QAAQ,EAAE,OAAO,SAAS;CAEhC,SAAS,OAAO,QAAgB;EAC9B,IAAI,OAAO,WAAW,WAAW;GAC/B,MAAM,QAAQ;GACd,OAAO,WAAW,MAAM,MAAM;;EAGhC,MAAM,SAAS,OAAO,MAAM,MAAM;EAElC,IAAI,kBAAkB,SACpB,OAAO,KAAK,OAAO;OAEnB,OAAO,OAAO;;CAIlB,OAAO,CAAC,OAAO,OAAO"}
1
+ {"version":3,"file":"create-toggle.js","names":[],"sources":["../../src/helper/create-toggle.ts"],"sourcesContent":["type Active = boolean | ((active: boolean) => boolean) | ((active: boolean) => Promise<boolean>)\n\ntype ToggleReturn = [{ value: boolean }, (active: Active) => void]\n/**\n * 创建一个toggle函数\n * @param initial 初始值\n * @param onChange 值变化时的回调\n * @returns\n */\nexport function createToggle(initial = false, onChange?: (active: boolean) => void): ToggleReturn {\n const state = { value: initial }\n\n function toggle(active: Active) {\n if (typeof active === 'boolean') {\n state.value = active\n return onChange?.(state.value)\n }\n\n const result = active(state.value)\n\n if (result instanceof Promise) {\n result.then(toggle)\n } else {\n toggle(result)\n }\n }\n\n return [state, toggle]\n}\n"],"mappings":";;;;;;;AASA,SAAgB,aAAa,UAAU,OAAO,UAAoD;CAChG,MAAM,QAAQ,EAAE,OAAO,QAAQ;CAE/B,SAAS,OAAO,QAAgB;EAC9B,IAAI,OAAO,WAAW,WAAW;GAC/B,MAAM,QAAQ;GACd,OAAO,WAAW,MAAM,KAAK;EAC/B;EAEA,MAAM,SAAS,OAAO,MAAM,KAAK;EAEjC,IAAI,kBAAkB,SACpB,OAAO,KAAK,MAAM;OAElB,OAAO,MAAM;CAEjB;CAEA,OAAO,CAAC,OAAO,MAAM;AACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"frame.js","names":[],"sources":["../../src/helper/frame.ts"],"sourcesContent":["/**\n * 下一帧运行\n * @param cb 回调\n */\nexport function nextFrame(cb: () => void): void {\n requestAnimationFrame(() => {\n requestAnimationFrame(cb)\n })\n}\n"],"mappings":";;;;;AAIA,SAAgB,UAAU,IAAsB;CAC9C,4BAA4B;EAC1B,sBAAsB,GAAG;GACzB"}
1
+ {"version":3,"file":"frame.js","names":[],"sources":["../../src/helper/frame.ts"],"sourcesContent":["/**\n * 下一帧运行\n * @param cb 回调\n */\nexport function nextFrame(cb: () => void): void {\n requestAnimationFrame(() => {\n requestAnimationFrame(cb)\n })\n}\n"],"mappings":";;;;;AAIA,SAAgB,UAAU,IAAsB;CAC9C,4BAA4B;EAC1B,sBAAsB,EAAE;CAC1B,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"make-bem.js","names":[],"sources":["../../src/helper/make-bem.ts"],"sourcesContent":["/** BEM实例 */\nexport type BEM<N extends string, P extends string = 'u-', B extends string = `${P}${N}`> = {\n /** BEM中的块 */\n b: B\n\n /**\n * BEM中的元素(E)\n * @param name 元素名称\n * @returns\n */\n e<const E extends string>(name: E): `${B}__${E}`\n\n /**\n * 基于当前bem创建一个新的bem\n * @param block 块名称\n */\n create<const Block extends string>(block: Block): BEM<`${N}-${Block}`, P>\n\n /**\n * BEM中的修饰符(M)\n * @param m 修饰符名\n * @returns 修饰符\n */\n m<const M extends string>(m: M): `${B}--${M}`\n\n /**\n * BEM中的元素与修饰符(E--M)\n * @param e 元素名\n * @param m 修饰符名\n * @returns\n */\n em<const E extends string, const M extends string>(e: E, m: M): `${B}__${E}--${M}`\n}\n\n/** BEM工厂 */\nexport interface BEMFactory<Prefix extends string> {\n <N extends string>(name: N): BEM<N, Prefix>\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n */\n is<const N extends string>(name: N): `is-${N}`\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n * @param condition 辅助类显示条件\n */\n is<const N extends string, C extends boolean | undefined>(\n name: N,\n condition: C\n ): C extends true ? `is-${N}` : ''\n}\n\n/**\n * 创建一个bem函数\n * @param prefix 前缀\n */\nexport function makeBEM<Prefix extends '' | `${string}-`>(prefix: Prefix): BEMFactory<Prefix> {\n /**\n * css类命名辅助\n * @param name 类block名称\n */\n function bem<N extends string>(name: N): BEM<N, Prefix> {\n const b = `${prefix}${name}` as BEM<N, Prefix>['b']\n return {\n b,\n\n e(name) {\n return `${b}__${name}`\n },\n\n create(block) {\n return bem(`${name}-${block}`)\n },\n\n m(m) {\n return `${b}--${m}`\n },\n\n em(e, m) {\n return `${b}__${e}--${m}`\n }\n }\n }\n\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n */\n function is<const N extends string>(name: N): `is-${N}`\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n * @param condition 辅助类显示条件\n */\n function is<const N extends string, C extends boolean | undefined>(\n name: N,\n condition: C\n ): C extends true ? `is-${N}` : ''\n\n function is<N extends string>(name: N, condition?: boolean) {\n if (arguments.length < 2) return `is-${name}`\n return condition !== true ? '' : (`is-${name}` as const)\n }\n\n bem.is = is\n\n return bem\n}\n"],"mappings":";;;;;AAyDA,SAAgB,QAA0C,QAAoC;;;;;CAK5F,SAAS,IAAsB,MAAyB;EACtD,MAAM,IAAI,GAAG,SAAS;EACtB,OAAO;GACL;GAEA,EAAE,MAAM;IACN,OAAO,GAAG,EAAE,IAAI;;GAGlB,OAAO,OAAO;IACZ,OAAO,IAAI,GAAG,KAAK,GAAG,QAAQ;;GAGhC,EAAE,GAAG;IACH,OAAO,GAAG,EAAE,IAAI;;GAGlB,GAAG,GAAG,GAAG;IACP,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI;;GAEzB;;CAkBH,SAAS,GAAqB,MAAS,WAAqB;EAC1D,IAAI,UAAU,SAAS,GAAG,OAAO,MAAM;EACvC,OAAO,cAAc,OAAO,KAAM,MAAM;;CAG1C,IAAI,KAAK;CAET,OAAO"}
1
+ {"version":3,"file":"make-bem.js","names":[],"sources":["../../src/helper/make-bem.ts"],"sourcesContent":["/** BEM实例 */\nexport type BEM<N extends string, P extends string = 'u-', B extends string = `${P}${N}`> = {\n /** BEM中的块 */\n b: B\n\n /**\n * BEM中的元素(E)\n * @param name 元素名称\n * @returns\n */\n e<const E extends string>(name: E): `${B}__${E}`\n\n /**\n * 基于当前bem创建一个新的bem\n * @param block 块名称\n */\n create<const Block extends string>(block: Block): BEM<`${N}-${Block}`, P>\n\n /**\n * BEM中的修饰符(M)\n * @param m 修饰符名\n * @returns 修饰符\n */\n m<const M extends string>(m: M): `${B}--${M}`\n\n /**\n * BEM中的元素与修饰符(E--M)\n * @param e 元素名\n * @param m 修饰符名\n * @returns\n */\n em<const E extends string, const M extends string>(e: E, m: M): `${B}__${E}--${M}`\n}\n\n/** BEM工厂 */\nexport interface BEMFactory<Prefix extends string> {\n <N extends string>(name: N): BEM<N, Prefix>\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n */\n is<const N extends string>(name: N): `is-${N}`\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n * @param condition 辅助类显示条件\n */\n is<const N extends string, C extends boolean | undefined>(\n name: N,\n condition: C\n ): C extends true ? `is-${N}` : ''\n}\n\n/**\n * 创建一个bem函数\n * @param prefix 前缀\n */\nexport function makeBEM<Prefix extends '' | `${string}-`>(prefix: Prefix): BEMFactory<Prefix> {\n /**\n * css类命名辅助\n * @param name 类block名称\n */\n function bem<N extends string>(name: N): BEM<N, Prefix> {\n const b = `${prefix}${name}` as BEM<N, Prefix>['b']\n return {\n b,\n\n e(name) {\n return `${b}__${name}`\n },\n\n create(block) {\n return bem(`${name}-${block}`)\n },\n\n m(m) {\n return `${b}--${m}`\n },\n\n em(e, m) {\n return `${b}__${e}--${m}`\n }\n }\n }\n\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n */\n function is<const N extends string>(name: N): `is-${N}`\n /**\n * 生成is辅助类\n * @param name 辅助类名称\n * @param condition 辅助类显示条件\n */\n function is<const N extends string, C extends boolean | undefined>(\n name: N,\n condition: C\n ): C extends true ? `is-${N}` : ''\n\n function is<N extends string>(name: N, condition?: boolean) {\n if (arguments.length < 2) return `is-${name}`\n return condition !== true ? '' : (`is-${name}` as const)\n }\n\n bem.is = is\n\n return bem\n}\n"],"mappings":";;;;;AAyDA,SAAgB,QAA0C,QAAoC;;;;;CAK5F,SAAS,IAAsB,MAAyB;EACtD,MAAM,IAAI,GAAG,SAAS;EACtB,OAAO;GACL;GAEA,EAAE,MAAM;IACN,OAAO,GAAG,EAAE,IAAI;GAClB;GAEA,OAAO,OAAO;IACZ,OAAO,IAAI,GAAG,KAAK,GAAG,OAAO;GAC/B;GAEA,EAAE,GAAG;IACH,OAAO,GAAG,EAAE,IAAI;GAClB;GAEA,GAAG,GAAG,GAAG;IACP,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI;GACxB;EACF;CACF;CAiBA,SAAS,GAAqB,MAAS,WAAqB;EAC1D,IAAI,UAAU,SAAS,GAAG,OAAO,MAAM;EACvC,OAAO,cAAc,OAAO,KAAM,MAAM;CAC1C;CAEA,IAAI,KAAK;CAET,OAAO;AACT"}
@@ -79,7 +79,7 @@ var Tween = class Tween {
79
79
  easeOutBack: (p) => 1 + 2.70158 * Math.pow(p - 1, 3) + 1.70158 * Math.pow(p - 1, 2),
80
80
  easeInOutBack: (p) => {
81
81
  const c2 = 1.70158 * 1.525;
82
- return p < .5 ? Math.pow(2 * p, 2) * ((c2 + 1) * 2 * p - c2) / 2 : (Math.pow(2 * p - 2, 2) * ((c2 + 1) * (p * 2 - 2) + c2) + 2) / 2;
82
+ return p < .5 ? Math.pow(2 * p, 2) * (3.5949095 * 2 * p - c2) / 2 : (Math.pow(2 * p - 2, 2) * (3.5949095 * (p * 2 - 2) + c2) + 2) / 2;
83
83
  }
84
84
  };
85
85
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tween.js","names":["pk"],"sources":["../../src/helper/tween.ts"],"sourcesContent":["/** 自 cat-kit 3.x Tween 行为对齐的轻量动画(原 `cat-kit/fe` 导出) */\n\nexport interface AnimeConfig<State extends Record<string, number>> {\n duration?: number\n easingFunction?: (progress: number) => number\n onComplete?(state: State): void\n}\n\nexport interface TweenConfig<State extends Record<string, number>> {\n duration?: number\n onUpdate?(state: State): void\n onComplete?(state: State): void\n easingFunction?: (progress: number) => number\n}\n\nexport class Tween<State extends Record<string, number> = Record<string, number>> {\n readonly state: State\n protected duration = 300\n protected onUpdate?: (state: State) => void\n protected onComplete?: (state: State) => void\n protected frameId?: number\n protected easingFunction: (progress: number) => number\n private defaultState: State\n\n constructor(state: State, config?: TweenConfig<State>) {\n this.state = state\n this.defaultState = { ...state }\n const { duration, onUpdate, onComplete, easingFunction } = config || {}\n if (duration !== undefined) this.duration = duration\n if (onUpdate !== undefined) this.onUpdate = onUpdate\n if (onComplete !== undefined) this.onComplete = onComplete\n this.easingFunction = easingFunction ?? Tween.easing.linear\n }\n\n protected raf(options: {\n onComplete: () => void\n duration: number\n tick: (p: number) => void\n }): void {\n const start = performance.now()\n const { onComplete, tick, duration } = options\n const update = (timestamp: number) => {\n const elapsed = timestamp - start\n const progress = Math.min(elapsed / duration, 1)\n tick(progress)\n if (progress < 1) {\n this.frameId = requestAnimationFrame(update)\n } else {\n tick(progress)\n this.stop()\n onComplete()\n }\n }\n this.frameId = requestAnimationFrame(update)\n }\n\n to(state: Partial<State>, config?: AnimeConfig<State>): void {\n this.stop()\n const prevState = { ...this.state }\n const stateDistance = Object.keys(state).reduce(\n (acc, key) => {\n const k = key as keyof State\n const sv = state[k] as number\n const pv = prevState[k] as number\n if ((sv || sv === 0) && (pv || pv === 0)) {\n acc[key] = sv - pv\n }\n return acc\n },\n {} as Record<string, number>\n )\n const duration = config?.duration || this.duration\n const easingFunction = config?.easingFunction || this.easingFunction\n const onComplete = config?.onComplete || this.onComplete\n this.raf({\n duration,\n onComplete: () => {\n for (const key in state) {\n if (key in this.state) {\n ;(this.state as Record<string, number>)[key] = state[key as keyof State] as number\n }\n }\n this.onUpdate?.(this.state)\n onComplete?.(this.state)\n },\n tick: (progress) => {\n for (const key in stateDistance) {\n const pk = key as keyof State\n const target = (prevState[pk] as number) + easingFunction(progress) * stateDistance[key]!\n ;(this.state as Record<string, number>)[key] = target\n }\n this.onUpdate?.(this.state)\n }\n })\n }\n\n back(config?: AnimeConfig<State>): void {\n this.to(this.defaultState as Partial<State>, config)\n }\n\n private stop(): boolean {\n if (!this.frameId) return false\n cancelAnimationFrame(this.frameId)\n this.frameId = undefined\n return true\n }\n\n static readonly easing = {\n linear: (p: number) => p,\n easeInQuad: (p: number) => p * p,\n easeOutQuad: (p: number) => p * (2 - p),\n easeInOutQuad: (p: number) => (p < 0.5 ? 2 * p * p : -1 + (4 - 2 * p) * p),\n easeInBack: (p: number) => p * p * ((2.70158 + 1) * p - 1),\n easeOutBack: (p: number) => 1 + 2.70158 * Math.pow(p - 1, 3) + 1.70158 * Math.pow(p - 1, 2),\n easeInOutBack: (p: number) => {\n const c1 = 1.70158\n const c2 = c1 * 1.525\n return p < 0.5\n ? (Math.pow(2 * p, 2) * ((c2 + 1) * 2 * p - c2)) / 2\n : (Math.pow(2 * p - 2, 2) * ((c2 + 1) * (p * 2 - 2) + c2) + 2) / 2\n }\n }\n}\n"],"mappings":";AAeA,IAAa,QAAb,MAAa,MAAqE;CAChF;CACA,WAAqB;CACrB;CACA;CACA;CACA;CACA;CAEA,YAAY,OAAc,QAA6B;EACrD,KAAK,QAAQ;EACb,KAAK,eAAe,EAAE,GAAG,OAAO;EAChC,MAAM,EAAE,UAAU,UAAU,YAAY,mBAAmB,UAAU,EAAE;EACvE,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;EAC5C,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;EAC5C,IAAI,eAAe,KAAA,GAAW,KAAK,aAAa;EAChD,KAAK,iBAAiB,kBAAkB,MAAM,OAAO;;CAGvD,IAAc,SAIL;EACP,MAAM,QAAQ,YAAY,KAAK;EAC/B,MAAM,EAAE,YAAY,MAAM,aAAa;EACvC,MAAM,UAAU,cAAsB;GACpC,MAAM,UAAU,YAAY;GAC5B,MAAM,WAAW,KAAK,IAAI,UAAU,UAAU,EAAE;GAChD,KAAK,SAAS;GACd,IAAI,WAAW,GACb,KAAK,UAAU,sBAAsB,OAAO;QACvC;IACL,KAAK,SAAS;IACd,KAAK,MAAM;IACX,YAAY;;;EAGhB,KAAK,UAAU,sBAAsB,OAAO;;CAG9C,GAAG,OAAuB,QAAmC;EAC3D,KAAK,MAAM;EACX,MAAM,YAAY,EAAE,GAAG,KAAK,OAAO;EACnC,MAAM,gBAAgB,OAAO,KAAK,MAAM,CAAC,QACtC,KAAK,QAAQ;GACZ,MAAM,IAAI;GACV,MAAM,KAAK,MAAM;GACjB,MAAM,KAAK,UAAU;GACrB,KAAK,MAAM,OAAO,OAAO,MAAM,OAAO,IACpC,IAAI,OAAO,KAAK;GAElB,OAAO;KAET,EAAE,CACH;EACD,MAAM,WAAW,QAAQ,YAAY,KAAK;EAC1C,MAAM,iBAAiB,QAAQ,kBAAkB,KAAK;EACtD,MAAM,aAAa,QAAQ,cAAc,KAAK;EAC9C,KAAK,IAAI;GACP;GACA,kBAAkB;IAChB,KAAK,MAAM,OAAO,OAChB,IAAI,OAAO,KAAK,OACb,KAAM,MAAiC,OAAO,MAAM;IAGzD,KAAK,WAAW,KAAK,MAAM;IAC3B,aAAa,KAAK,MAAM;;GAE1B,OAAO,aAAa;IAClB,KAAK,MAAM,OAAO,eAAe;KAE/B,MAAM,SAAU,UAAUA,OAAiB,eAAe,SAAS,GAAG,cAAc;KACnF,KAAM,MAAiC,OAAO;;IAEjD,KAAK,WAAW,KAAK,MAAM;;GAE9B,CAAC;;CAGJ,KAAK,QAAmC;EACtC,KAAK,GAAG,KAAK,cAAgC,OAAO;;CAGtD,OAAwB;EACtB,IAAI,CAAC,KAAK,SAAS,OAAO;EAC1B,qBAAqB,KAAK,QAAQ;EAClC,KAAK,UAAU,KAAA;EACf,OAAO;;CAGT,OAAgB,SAAS;EACvB,SAAS,MAAc;EACvB,aAAa,MAAc,IAAI;EAC/B,cAAc,MAAc,KAAK,IAAI;EACrC,gBAAgB,MAAe,IAAI,KAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK;EACxE,aAAa,MAAc,IAAI,KAAM,UAAe,IAAI;EACxD,cAAc,MAAc,IAAI,UAAU,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,UAAU,KAAK,IAAI,IAAI,GAAG,EAAE;EAC3F,gBAAgB,MAAc;GAE5B,MAAM,KAAK,UAAK;GAChB,OAAO,IAAI,KACN,KAAK,IAAI,IAAI,GAAG,EAAE,KAAK,KAAK,KAAK,IAAI,IAAI,MAAO,KAChD,KAAK,IAAI,IAAI,IAAI,GAAG,EAAE,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,KAAK;;EAEtE"}
1
+ {"version":3,"file":"tween.js","names":["pk"],"sources":["../../src/helper/tween.ts"],"sourcesContent":["/** 自 cat-kit 3.x Tween 行为对齐的轻量动画(原 `cat-kit/fe` 导出) */\n\nexport interface AnimeConfig<State extends Record<string, number>> {\n duration?: number\n easingFunction?: (progress: number) => number\n onComplete?(state: State): void\n}\n\nexport interface TweenConfig<State extends Record<string, number>> {\n duration?: number\n onUpdate?(state: State): void\n onComplete?(state: State): void\n easingFunction?: (progress: number) => number\n}\n\nexport class Tween<State extends Record<string, number> = Record<string, number>> {\n readonly state: State\n protected duration = 300\n protected onUpdate?: (state: State) => void\n protected onComplete?: (state: State) => void\n protected frameId?: number\n protected easingFunction: (progress: number) => number\n private defaultState: State\n\n constructor(state: State, config?: TweenConfig<State>) {\n this.state = state\n this.defaultState = { ...state }\n const { duration, onUpdate, onComplete, easingFunction } = config || {}\n if (duration !== undefined) this.duration = duration\n if (onUpdate !== undefined) this.onUpdate = onUpdate\n if (onComplete !== undefined) this.onComplete = onComplete\n this.easingFunction = easingFunction ?? Tween.easing.linear\n }\n\n protected raf(options: {\n onComplete: () => void\n duration: number\n tick: (p: number) => void\n }): void {\n const start = performance.now()\n const { onComplete, tick, duration } = options\n const update = (timestamp: number) => {\n const elapsed = timestamp - start\n const progress = Math.min(elapsed / duration, 1)\n tick(progress)\n if (progress < 1) {\n this.frameId = requestAnimationFrame(update)\n } else {\n tick(progress)\n this.stop()\n onComplete()\n }\n }\n this.frameId = requestAnimationFrame(update)\n }\n\n to(state: Partial<State>, config?: AnimeConfig<State>): void {\n this.stop()\n const prevState = { ...this.state }\n const stateDistance = Object.keys(state).reduce(\n (acc, key) => {\n const k = key as keyof State\n const sv = state[k] as number\n const pv = prevState[k] as number\n if ((sv || sv === 0) && (pv || pv === 0)) {\n acc[key] = sv - pv\n }\n return acc\n },\n {} as Record<string, number>\n )\n const duration = config?.duration || this.duration\n const easingFunction = config?.easingFunction || this.easingFunction\n const onComplete = config?.onComplete || this.onComplete\n this.raf({\n duration,\n onComplete: () => {\n for (const key in state) {\n if (key in this.state) {\n ;(this.state as Record<string, number>)[key] = state[key as keyof State] as number\n }\n }\n this.onUpdate?.(this.state)\n onComplete?.(this.state)\n },\n tick: (progress) => {\n for (const key in stateDistance) {\n const pk = key as keyof State\n const target = (prevState[pk] as number) + easingFunction(progress) * stateDistance[key]!\n ;(this.state as Record<string, number>)[key] = target\n }\n this.onUpdate?.(this.state)\n }\n })\n }\n\n back(config?: AnimeConfig<State>): void {\n this.to(this.defaultState as Partial<State>, config)\n }\n\n private stop(): boolean {\n if (!this.frameId) return false\n cancelAnimationFrame(this.frameId)\n this.frameId = undefined\n return true\n }\n\n static readonly easing = {\n linear: (p: number) => p,\n easeInQuad: (p: number) => p * p,\n easeOutQuad: (p: number) => p * (2 - p),\n easeInOutQuad: (p: number) => (p < 0.5 ? 2 * p * p : -1 + (4 - 2 * p) * p),\n easeInBack: (p: number) => p * p * ((2.70158 + 1) * p - 1),\n easeOutBack: (p: number) => 1 + 2.70158 * Math.pow(p - 1, 3) + 1.70158 * Math.pow(p - 1, 2),\n easeInOutBack: (p: number) => {\n const c1 = 1.70158\n const c2 = c1 * 1.525\n return p < 0.5\n ? (Math.pow(2 * p, 2) * ((c2 + 1) * 2 * p - c2)) / 2\n : (Math.pow(2 * p - 2, 2) * ((c2 + 1) * (p * 2 - 2) + c2) + 2) / 2\n }\n }\n}\n"],"mappings":";AAeA,IAAa,QAAb,MAAa,MAAqE;CAChF;CACA,WAAqB;CACrB;CACA;CACA;CACA;CACA;CAEA,YAAY,OAAc,QAA6B;EACrD,KAAK,QAAQ;EACb,KAAK,eAAe,EAAE,GAAG,MAAM;EAC/B,MAAM,EAAE,UAAU,UAAU,YAAY,mBAAmB,UAAU,CAAC;EACtE,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;EAC5C,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;EAC5C,IAAI,eAAe,KAAA,GAAW,KAAK,aAAa;EAChD,KAAK,iBAAiB,kBAAkB,MAAM,OAAO;CACvD;CAEA,IAAc,SAIL;EACP,MAAM,QAAQ,YAAY,IAAI;EAC9B,MAAM,EAAE,YAAY,MAAM,aAAa;EACvC,MAAM,UAAU,cAAsB;GACpC,MAAM,UAAU,YAAY;GAC5B,MAAM,WAAW,KAAK,IAAI,UAAU,UAAU,CAAC;GAC/C,KAAK,QAAQ;GACb,IAAI,WAAW,GACb,KAAK,UAAU,sBAAsB,MAAM;QACtC;IACL,KAAK,QAAQ;IACb,KAAK,KAAK;IACV,WAAW;GACb;EACF;EACA,KAAK,UAAU,sBAAsB,MAAM;CAC7C;CAEA,GAAG,OAAuB,QAAmC;EAC3D,KAAK,KAAK;EACV,MAAM,YAAY,EAAE,GAAG,KAAK,MAAM;EAClC,MAAM,gBAAgB,OAAO,KAAK,KAAK,EAAE,QACtC,KAAK,QAAQ;GACZ,MAAM,IAAI;GACV,MAAM,KAAK,MAAM;GACjB,MAAM,KAAK,UAAU;GACrB,KAAK,MAAM,OAAO,OAAO,MAAM,OAAO,IACpC,IAAI,OAAO,KAAK;GAElB,OAAO;EACT,GACA,CAAC,CACH;EACA,MAAM,WAAW,QAAQ,YAAY,KAAK;EAC1C,MAAM,iBAAiB,QAAQ,kBAAkB,KAAK;EACtD,MAAM,aAAa,QAAQ,cAAc,KAAK;EAC9C,KAAK,IAAI;GACP;GACA,kBAAkB;IAChB,KAAK,MAAM,OAAO,OAChB,IAAI,OAAO,KAAK,OACb,KAAM,MAAiC,OAAO,MAAM;IAGzD,KAAK,WAAW,KAAK,KAAK;IAC1B,aAAa,KAAK,KAAK;GACzB;GACA,OAAO,aAAa;IAClB,KAAK,MAAM,OAAO,eAAe;KAE/B,MAAM,SAAU,UAAUA,OAAiB,eAAe,QAAQ,IAAI,cAAc;KACnF,KAAM,MAAiC,OAAO;IACjD;IACA,KAAK,WAAW,KAAK,KAAK;GAC5B;EACF,CAAC;CACH;CAEA,KAAK,QAAmC;EACtC,KAAK,GAAG,KAAK,cAAgC,MAAM;CACrD;CAEA,OAAwB;EACtB,IAAI,CAAC,KAAK,SAAS,OAAO;EAC1B,qBAAqB,KAAK,OAAO;EACjC,KAAK,UAAU,KAAA;EACf,OAAO;CACT;CAEA,OAAgB,SAAS;EACvB,SAAS,MAAc;EACvB,aAAa,MAAc,IAAI;EAC/B,cAAc,MAAc,KAAK,IAAI;EACrC,gBAAgB,MAAe,IAAI,KAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK;EACxE,aAAa,MAAc,IAAI,KAAM,UAAe,IAAI;EACxD,cAAc,MAAc,IAAI,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC;EAC1F,gBAAgB,MAAc;GAE5B,MAAM,KAAK,UAAK;GAChB,OAAO,IAAI,KACN,KAAK,IAAI,IAAI,GAAG,CAAC,KAAM,YAAU,IAAI,IAAI,MAAO,KAChD,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAM,aAAW,IAAI,IAAI,KAAK,MAAM,KAAK;EACrE;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"vue.js","names":[],"sources":["../../src/helper/vue.ts"],"sourcesContent":["import {\n Text,\n Fragment,\n Comment,\n type VNode,\n isVNode,\n createTextVNode,\n type VNodeArrayChildren,\n shallowRef,\n watch,\n type ShallowRef\n} from 'vue'\n\ninterface TextVNode extends VNode {\n children: string\n}\n\n/**\n * 是否为文本\n * @param node\n * @returns\n */\nexport function isTextNode(node: VNode): node is TextVNode {\n return node.type === Text\n}\n\n/**\n * 是否为片段\n * @param node\n * @returns\n */\nexport function isFragment(node: any): node is VNode {\n return node && node.type === Fragment\n}\n\ninterface CommentVNode extends VNode {\n children: string\n}\n\n/**\n * 是否为注释\n * @param node\n * @returns\n */\nexport function isComment(node: VNode): node is CommentVNode {\n return node.type === Comment\n}\n\n/**\n * 是否为模板\n * @param node\n * @returns\n */\nexport function isTemplate(node: unknown): node is VNode {\n return isVNode(node) && node.type === 'template'\n}\n\n/**\n * 提取常规虚拟节点(移除type为fragment、template的节点)\n * @param nodes VNodeArrayChildren\n * @param results 虚拟节点\n * @returns\n */\nexport function extractNormalVNodes(nodes: VNodeArrayChildren, results: VNode[] = []): VNode[] {\n nodes.forEach((node) => {\n if (!isVNode(node)) {\n if (typeof node === 'string' || typeof node === 'number') {\n results.push(createTextVNode(String(node)))\n }\n return\n }\n if ((isFragment(node) || isTemplate(node)) && Array.isArray(node.children)) {\n extractNormalVNodes(node.children, results)\n } else {\n results.push(node)\n }\n })\n return results\n}\n\nexport function shallowComputed<T>(getter: () => T): ShallowRef<T> {\n const result = shallowRef<T>(getter())\n watch(getter, (value) => {\n result.value = value\n })\n\n return result\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,WAAW,MAAgC;CACzD,OAAO,KAAK,SAAS;;;;;;;AAQvB,SAAgB,WAAW,MAA0B;CACnD,OAAO,QAAQ,KAAK,SAAS;;;;;;;AAY/B,SAAgB,UAAU,MAAmC;CAC3D,OAAO,KAAK,SAAS;;;;;;;AAQvB,SAAgB,WAAW,MAA8B;CACvD,OAAO,QAAQ,KAAK,IAAI,KAAK,SAAS;;;;;;;;AASxC,SAAgB,oBAAoB,OAA2B,UAAmB,EAAE,EAAW;CAC7F,MAAM,SAAS,SAAS;EACtB,IAAI,CAAC,QAAQ,KAAK,EAAE;GAClB,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAC9C,QAAQ,KAAK,gBAAgB,OAAO,KAAK,CAAC,CAAC;GAE7C;;EAEF,KAAK,WAAW,KAAK,IAAI,WAAW,KAAK,KAAK,MAAM,QAAQ,KAAK,SAAS,EACxE,oBAAoB,KAAK,UAAU,QAAQ;OAE3C,QAAQ,KAAK,KAAK;GAEpB;CACF,OAAO;;AAGT,SAAgB,gBAAmB,QAAgC;CACjE,MAAM,SAAS,WAAc,QAAQ,CAAC;CACtC,MAAM,SAAS,UAAU;EACvB,OAAO,QAAQ;GACf;CAEF,OAAO"}
1
+ {"version":3,"file":"vue.js","names":[],"sources":["../../src/helper/vue.ts"],"sourcesContent":["import {\n Text,\n Fragment,\n Comment,\n type VNode,\n isVNode,\n createTextVNode,\n type VNodeArrayChildren,\n shallowRef,\n watch,\n type ShallowRef\n} from 'vue'\n\ninterface TextVNode extends VNode {\n children: string\n}\n\n/**\n * 是否为文本\n * @param node\n * @returns\n */\nexport function isTextNode(node: VNode): node is TextVNode {\n return node.type === Text\n}\n\n/**\n * 是否为片段\n * @param node\n * @returns\n */\nexport function isFragment(node: any): node is VNode {\n return node && node.type === Fragment\n}\n\ninterface CommentVNode extends VNode {\n children: string\n}\n\n/**\n * 是否为注释\n * @param node\n * @returns\n */\nexport function isComment(node: VNode): node is CommentVNode {\n return node.type === Comment\n}\n\n/**\n * 是否为模板\n * @param node\n * @returns\n */\nexport function isTemplate(node: unknown): node is VNode {\n return isVNode(node) && node.type === 'template'\n}\n\n/**\n * 提取常规虚拟节点(移除type为fragment、template的节点)\n * @param nodes VNodeArrayChildren\n * @param results 虚拟节点\n * @returns\n */\nexport function extractNormalVNodes(nodes: VNodeArrayChildren, results: VNode[] = []): VNode[] {\n nodes.forEach((node) => {\n if (!isVNode(node)) {\n if (typeof node === 'string' || typeof node === 'number') {\n results.push(createTextVNode(String(node)))\n }\n return\n }\n if ((isFragment(node) || isTemplate(node)) && Array.isArray(node.children)) {\n extractNormalVNodes(node.children, results)\n } else {\n results.push(node)\n }\n })\n return results\n}\n\nexport function shallowComputed<T>(getter: () => T): ShallowRef<T> {\n const result = shallowRef<T>(getter())\n watch(getter, (value) => {\n result.value = value\n })\n\n return result\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,WAAW,MAAgC;CACzD,OAAO,KAAK,SAAS;AACvB;;;;;;AAOA,SAAgB,WAAW,MAA0B;CACnD,OAAO,QAAQ,KAAK,SAAS;AAC/B;;;;;;AAWA,SAAgB,UAAU,MAAmC;CAC3D,OAAO,KAAK,SAAS;AACvB;;;;;;AAOA,SAAgB,WAAW,MAA8B;CACvD,OAAO,QAAQ,IAAI,KAAK,KAAK,SAAS;AACxC;;;;;;;AAQA,SAAgB,oBAAoB,OAA2B,UAAmB,CAAC,GAAY;CAC7F,MAAM,SAAS,SAAS;EACtB,IAAI,CAAC,QAAQ,IAAI,GAAG;GAClB,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAC9C,QAAQ,KAAK,gBAAgB,OAAO,IAAI,CAAC,CAAC;GAE5C;EACF;EACA,KAAK,WAAW,IAAI,KAAK,WAAW,IAAI,MAAM,MAAM,QAAQ,KAAK,QAAQ,GACvE,oBAAoB,KAAK,UAAU,OAAO;OAE1C,QAAQ,KAAK,IAAI;CAErB,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,gBAAmB,QAAgC;CACjE,MAAM,SAAS,WAAc,OAAO,CAAC;CACrC,MAAM,SAAS,UAAU;EACvB,OAAO,QAAQ;CACjB,CAAC;CAED,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","names":[],"sources":["../../src/reactive/proxy.ts"],"sourcesContent":["/**\n * 创建一个介于vue的reactive和shallowReactive对象的中间层\n * @description\n * 如果对象含有嵌套对象,则**递归**进行中间代理\n *\n * @param o 代理对象\n * @param handler 处理函数\n * @param options 代理配置\n * @returns 中间代理对象\n */\nfunction createMiddleProxy(\n o: Record<string, any>,\n handler?: {\n set?: (field: string, val: any) => void\n get?: (field: string) => any\n changed?: (fields: string[]) => void\n },\n options?: {\n weakMap?: WeakMap<Record<string, any>, any>\n parentsField?: string\n changedFields?: string[]\n }\n) {\n let { weakMap, parentsField, changedFields = [] } = options || {}\n if (!weakMap) {\n weakMap = new WeakMap()\n }\n\n return new Proxy(o, {\n set(target, field: string, val) {\n const changedField = parentsField ? `${parentsField}.${field}` : field\n handler?.set?.(changedField, val)\n target[field] = val\n\n changedFields.push(changedField)\n Promise.resolve().then(() => {\n if (!changedFields.length) return\n handler?.changed?.([...changedFields])\n changedFields.splice(0)\n })\n\n return true\n },\n\n get(target, field: string) {\n handler?.get?.(field)\n\n const val = target[field]\n if (\n val !== null &&\n typeof val === 'object' &&\n !(val instanceof Date) &&\n !(val instanceof RegExp)\n ) {\n if (weakMap.has(val)) return weakMap.get(val)\n const valProxy = createMiddleProxy(val, handler, {\n weakMap,\n parentsField: parentsField ? `${parentsField}.${field}` : field,\n changedFields\n })\n weakMap.set(val, valProxy)\n\n return valProxy\n }\n\n return val\n }\n })\n}\n\n/**\n * 中间代理, 用于vue的reactive和shallowReactive方法的中间层\n * @param o 代理对象\n * @param config 代理配置\n * @returns\n */\nexport function middleProxy<O extends Record<string, any>>(\n o: O,\n handler?: {\n set?: (field: string, val: any) => void\n get?: (field: string) => any\n /**\n * 数值变更回调,传入的参数是本次模型值变更的所有字段\n * @param fields 变更的字段\n */\n changed?: (fields: string[]) => void\n }\n): O {\n return createMiddleProxy(o, handler) as O\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAS,kBACP,GACA,SAKA,SAKA;CACA,IAAI,EAAE,SAAS,cAAc,gBAAgB,EAAE,KAAK,WAAW,EAAE;CACjE,IAAI,CAAC,SACH,0BAAU,IAAI,SAAS;CAGzB,OAAO,IAAI,MAAM,GAAG;EAClB,IAAI,QAAQ,OAAe,KAAK;GAC9B,MAAM,eAAe,eAAe,GAAG,aAAa,GAAG,UAAU;GACjE,SAAS,MAAM,cAAc,IAAI;GACjC,OAAO,SAAS;GAEhB,cAAc,KAAK,aAAa;GAChC,QAAQ,SAAS,CAAC,WAAW;IAC3B,IAAI,CAAC,cAAc,QAAQ;IAC3B,SAAS,UAAU,CAAC,GAAG,cAAc,CAAC;IACtC,cAAc,OAAO,EAAE;KACvB;GAEF,OAAO;;EAGT,IAAI,QAAQ,OAAe;GACzB,SAAS,MAAM,MAAM;GAErB,MAAM,MAAM,OAAO;GACnB,IACE,QAAQ,QACR,OAAO,QAAQ,YACf,EAAE,eAAe,SACjB,EAAE,eAAe,SACjB;IACA,IAAI,QAAQ,IAAI,IAAI,EAAE,OAAO,QAAQ,IAAI,IAAI;IAC7C,MAAM,WAAW,kBAAkB,KAAK,SAAS;KAC/C;KACA,cAAc,eAAe,GAAG,aAAa,GAAG,UAAU;KAC1D;KACD,CAAC;IACF,QAAQ,IAAI,KAAK,SAAS;IAE1B,OAAO;;GAGT,OAAO;;EAEV,CAAC;;;;;;;;AASJ,SAAgB,YACd,GACA,SASG;CACH,OAAO,kBAAkB,GAAG,QAAQ"}
1
+ {"version":3,"file":"proxy.js","names":[],"sources":["../../src/reactive/proxy.ts"],"sourcesContent":["/**\n * 创建一个介于vue的reactive和shallowReactive对象的中间层\n * @description\n * 如果对象含有嵌套对象,则**递归**进行中间代理\n *\n * @param o 代理对象\n * @param handler 处理函数\n * @param options 代理配置\n * @returns 中间代理对象\n */\nfunction createMiddleProxy(\n o: Record<string, any>,\n handler?: {\n set?: (field: string, val: any) => void\n get?: (field: string) => any\n changed?: (fields: string[]) => void\n },\n options?: {\n weakMap?: WeakMap<Record<string, any>, any>\n parentsField?: string\n changedFields?: string[]\n }\n) {\n let { weakMap, parentsField, changedFields = [] } = options || {}\n if (!weakMap) {\n weakMap = new WeakMap()\n }\n\n return new Proxy(o, {\n set(target, field: string, val) {\n const changedField = parentsField ? `${parentsField}.${field}` : field\n handler?.set?.(changedField, val)\n target[field] = val\n\n changedFields.push(changedField)\n Promise.resolve().then(() => {\n if (!changedFields.length) return\n handler?.changed?.([...changedFields])\n changedFields.splice(0)\n })\n\n return true\n },\n\n get(target, field: string) {\n handler?.get?.(field)\n\n const val = target[field]\n if (\n val !== null &&\n typeof val === 'object' &&\n !(val instanceof Date) &&\n !(val instanceof RegExp)\n ) {\n if (weakMap.has(val)) return weakMap.get(val)\n const valProxy = createMiddleProxy(val, handler, {\n weakMap,\n parentsField: parentsField ? `${parentsField}.${field}` : field,\n changedFields\n })\n weakMap.set(val, valProxy)\n\n return valProxy\n }\n\n return val\n }\n })\n}\n\n/**\n * 中间代理, 用于vue的reactive和shallowReactive方法的中间层\n * @param o 代理对象\n * @param config 代理配置\n * @returns\n */\nexport function middleProxy<O extends Record<string, any>>(\n o: O,\n handler?: {\n set?: (field: string, val: any) => void\n get?: (field: string) => any\n /**\n * 数值变更回调,传入的参数是本次模型值变更的所有字段\n * @param fields 变更的字段\n */\n changed?: (fields: string[]) => void\n }\n): O {\n return createMiddleProxy(o, handler) as O\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAS,kBACP,GACA,SAKA,SAKA;CACA,IAAI,EAAE,SAAS,cAAc,gBAAgB,CAAC,MAAM,WAAW,CAAC;CAChE,IAAI,CAAC,SACH,0BAAU,IAAI,QAAQ;CAGxB,OAAO,IAAI,MAAM,GAAG;EAClB,IAAI,QAAQ,OAAe,KAAK;GAC9B,MAAM,eAAe,eAAe,GAAG,aAAa,GAAG,UAAU;GACjE,SAAS,MAAM,cAAc,GAAG;GAChC,OAAO,SAAS;GAEhB,cAAc,KAAK,YAAY;GAC/B,QAAQ,QAAQ,EAAE,WAAW;IAC3B,IAAI,CAAC,cAAc,QAAQ;IAC3B,SAAS,UAAU,CAAC,GAAG,aAAa,CAAC;IACrC,cAAc,OAAO,CAAC;GACxB,CAAC;GAED,OAAO;EACT;EAEA,IAAI,QAAQ,OAAe;GACzB,SAAS,MAAM,KAAK;GAEpB,MAAM,MAAM,OAAO;GACnB,IACE,QAAQ,QACR,OAAO,QAAQ,YACf,EAAE,eAAe,SACjB,EAAE,eAAe,SACjB;IACA,IAAI,QAAQ,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,GAAG;IAC5C,MAAM,WAAW,kBAAkB,KAAK,SAAS;KAC/C;KACA,cAAc,eAAe,GAAG,aAAa,GAAG,UAAU;KAC1D;IACF,CAAC;IACD,QAAQ,IAAI,KAAK,QAAQ;IAEzB,OAAO;GACT;GAEA,OAAO;EACT;CACF,CAAC;AACH;;;;;;;AAQA,SAAgB,YACd,GACA,SASG;CACH,OAAO,kBAAkB,GAAG,OAAO;AACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../src/shared/constants.ts"],"sourcesContent":["/** 命名前缀 */\nexport const NAME_SPACE = 'U'\n\n/** 类前缀 */\nexport const CLS_PREFIX = `${NAME_SPACE.toLowerCase()}-` as 'u-'\n\n/** 表单空内容 */\nexport const FORM_EMPTY_CONTENT = '-'\n"],"mappings":";;AACA,MAAa,aAAa;;AAG1B,MAAa,aAAa,GAAA,IAAc,aAAa,CAAC;;AAGtD,MAAa,qBAAqB"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../src/shared/constants.ts"],"sourcesContent":["/** 命名前缀 */\nexport const NAME_SPACE = 'U'\n\n/** 类前缀 */\nexport const CLS_PREFIX = `${NAME_SPACE.toLowerCase()}-` as 'u-'\n\n/** 表单空内容 */\nexport const FORM_EMPTY_CONTENT = '-'\n"],"mappings":";;AACA,MAAa,aAAa;;AAG1B,MAAa,aAAa,GAAA,IAAc,YAAY,EAAE;;AAGtD,MAAa,qBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-context.js","names":[],"sources":["../../src/types/form-context.ts"],"sourcesContent":["import { type InjectionKey, inject, provide } from 'vue'\n\nimport type { ComponentSize } from './component-common'\n\nexport interface FormContextModel {\n errors: Map<any, string[] | undefined>\n fields: Record<string, { required?: unknown }>\n}\n\nexport interface FormContextProps {\n /** 表单列宽 */\n labelWidth?: string | number\n /** 表单尺寸 */\n size?: ComponentSize\n /** 是否禁用 */\n disabled?: boolean\n /** 是否只读 */\n readonly?: boolean\n /** 是否隐藏提示 */\n noTips?: boolean\n /** 表单数据模型 */\n model?: FormContextModel\n}\n\ntype FormPropsLike = Partial<FormContextProps> & Record<string, any>\n\ntype DIContext = {\n /** 表单属性 */\n formProps: FormPropsLike\n}\n\nconst FormComponentDIKey: InjectionKey<DIContext> = Symbol('FormComponentDIKey')\n\nexport function provideFormContext<T extends FormPropsLike>(props: T): void {\n if (props) {\n provide(FormComponentDIKey, { formProps: props })\n }\n}\n\nexport function injectFormContext(): {\n /** 是否在表单中 */\n inForm: boolean\n} & Partial<DIContext> {\n const context = inject(FormComponentDIKey, undefined) || {}\n return { inForm: !!context, ...context }\n}\n"],"mappings":";;AA+BA,MAAM,qBAA8C,OAAO,qBAAqB;AAEhF,SAAgB,mBAA4C,OAAgB;CAC1E,IAAI,OACF,QAAQ,oBAAoB,EAAE,WAAW,OAAO,CAAC;;AAIrD,SAAgB,oBAGO;CACrB,MAAM,UAAU,OAAO,oBAAoB,KAAA,EAAU,IAAI,EAAE;CAC3D,OAAO;EAAE,QAAQ,CAAC,CAAC;EAAS,GAAG;EAAS"}
1
+ {"version":3,"file":"form-context.js","names":[],"sources":["../../src/types/form-context.ts"],"sourcesContent":["import { type InjectionKey, inject, provide } from 'vue'\n\nimport type { ComponentSize } from './component-common'\n\nexport interface FormContextModel {\n errors: Map<any, string[] | undefined>\n fields: Record<string, { required?: unknown }>\n}\n\nexport interface FormContextProps {\n /** 表单列宽 */\n labelWidth?: string | number\n /** 表单尺寸 */\n size?: ComponentSize\n /** 是否禁用 */\n disabled?: boolean\n /** 是否只读 */\n readonly?: boolean\n /** 是否隐藏提示 */\n noTips?: boolean\n /** 表单数据模型 */\n model?: FormContextModel\n}\n\ntype FormPropsLike = Partial<FormContextProps> & Record<string, any>\n\ntype DIContext = {\n /** 表单属性 */\n formProps: FormPropsLike\n}\n\nconst FormComponentDIKey: InjectionKey<DIContext> = Symbol('FormComponentDIKey')\n\nexport function provideFormContext<T extends FormPropsLike>(props: T): void {\n if (props) {\n provide(FormComponentDIKey, { formProps: props })\n }\n}\n\nexport function injectFormContext(): {\n /** 是否在表单中 */\n inForm: boolean\n} & Partial<DIContext> {\n const context = inject(FormComponentDIKey, undefined) || {}\n return { inForm: !!context, ...context }\n}\n"],"mappings":";;AA+BA,MAAM,qBAA8C,OAAO,oBAAoB;AAE/E,SAAgB,mBAA4C,OAAgB;CAC1E,IAAI,OACF,QAAQ,oBAAoB,EAAE,WAAW,MAAM,CAAC;AAEpD;AAEA,SAAgB,oBAGO;CACrB,MAAM,UAAU,OAAO,oBAAoB,KAAA,CAAS,KAAK,CAAC;CAC1D,OAAO;EAAE,QAAQ,CAAC,CAAC;EAAS,GAAG;CAAQ;AACzC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veltra/utils",
3
- "version": "1.1.28",
3
+ "version": "1.1.30",
4
4
  "files": [
5
5
  "dist",
6
6
  "src"
@@ -23,7 +23,7 @@
23
23
  "build": "vp pack"
24
24
  },
25
25
  "peerDependencies": {
26
- "@cat-kit/core": ">=1.1.5",
26
+ "@cat-kit/core": ">=1.1.6",
27
27
  "vue": ">=3.5.0"
28
28
  }
29
29
  }