@veltra/utils 1.12.1 → 1.13.0
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.
- package/dist/helper/vue.d.ts +10 -0
- package/dist/helper/vue.js +26 -1
- package/dist/helper/vue.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/src/helper/vue.ts +32 -0
package/dist/helper/vue.d.ts
CHANGED
|
@@ -39,6 +39,16 @@ export declare function isTemplate(node: unknown): node is VNode;
|
|
|
39
39
|
export declare function extractNormalVNodes(nodes: VNodeArrayChildren, results?: VNode[]): VNode[];
|
|
40
40
|
/** 字段名:空串 / null / undefined 时回退默认值 */
|
|
41
41
|
export declare function fieldKey(key: string | null | undefined, fallback: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* 按 labelTemplate 渲染选项展示文案
|
|
44
|
+
* @description `{fieldKey}` 占位符按行字段取值(链式取值,支持嵌套路径),
|
|
45
|
+
* 取不到值(字段缺失 / null / 空串)的占位符按空串处理;
|
|
46
|
+
* 只要有字段未命中即返回 undefined,由调用方回退 `row[labelKey]`,
|
|
47
|
+
* 避免「文本()」这类残缺展示。渲染期格式化,不改写行数据。
|
|
48
|
+
* @param template 模板串,如 `{label}({code})`;空值直接返回 undefined
|
|
49
|
+
* @param row 选项行数据
|
|
50
|
+
*/
|
|
51
|
+
export declare function renderLabelTemplate(template: string | undefined, row: Record<string, any> | undefined | null): string | undefined;
|
|
42
52
|
export declare function shallowComputed<T>(getter: () => T): ShallowRef<T>;
|
|
43
53
|
//#endregion
|
|
44
54
|
//# sourceMappingURL=vue.d.ts.map
|
package/dist/helper/vue.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { o } from "@cat-kit/core";
|
|
1
2
|
import { Comment, Fragment, Text, createTextVNode, isVNode, shallowRef, watch } from "vue";
|
|
2
3
|
//#region src/helper/vue.ts
|
|
3
4
|
/**
|
|
@@ -53,6 +54,30 @@ function extractNormalVNodes(nodes, results = []) {
|
|
|
53
54
|
function fieldKey(key, fallback) {
|
|
54
55
|
return key ? key : fallback;
|
|
55
56
|
}
|
|
57
|
+
/** labelTemplate 占位符:{fieldKey},支持嵌套路径 */
|
|
58
|
+
const LABEL_TEMPLATE_RE = /\{([^{}]+)\}/g;
|
|
59
|
+
/**
|
|
60
|
+
* 按 labelTemplate 渲染选项展示文案
|
|
61
|
+
* @description `{fieldKey}` 占位符按行字段取值(链式取值,支持嵌套路径),
|
|
62
|
+
* 取不到值(字段缺失 / null / 空串)的占位符按空串处理;
|
|
63
|
+
* 只要有字段未命中即返回 undefined,由调用方回退 `row[labelKey]`,
|
|
64
|
+
* 避免「文本()」这类残缺展示。渲染期格式化,不改写行数据。
|
|
65
|
+
* @param template 模板串,如 `{label}({code})`;空值直接返回 undefined
|
|
66
|
+
* @param row 选项行数据
|
|
67
|
+
*/
|
|
68
|
+
function renderLabelTemplate(template, row) {
|
|
69
|
+
if (!template || !row) return void 0;
|
|
70
|
+
let missing = false;
|
|
71
|
+
const text = template.replace(LABEL_TEMPLATE_RE, (_, key) => {
|
|
72
|
+
const value = o(row).get(key);
|
|
73
|
+
if (value === void 0 || value === null || value === "") {
|
|
74
|
+
missing = true;
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
return String(value);
|
|
78
|
+
});
|
|
79
|
+
return missing ? void 0 : text;
|
|
80
|
+
}
|
|
56
81
|
function shallowComputed(getter) {
|
|
57
82
|
const result = shallowRef(getter());
|
|
58
83
|
watch(getter, (value) => {
|
|
@@ -61,6 +86,6 @@ function shallowComputed(getter) {
|
|
|
61
86
|
return result;
|
|
62
87
|
}
|
|
63
88
|
//#endregion
|
|
64
|
-
export { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, shallowComputed };
|
|
89
|
+
export { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, renderLabelTemplate, shallowComputed };
|
|
65
90
|
|
|
66
91
|
//# sourceMappingURL=vue.js.map
|
package/dist/helper/vue.js.map
CHANGED
|
@@ -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\n/** 字段名:空串 / null / undefined 时回退默认值 */\nexport function fieldKey(key: string | null | undefined, fallback: string): string {\n return key ? key : fallback\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":"
|
|
1
|
+
{"version":3,"file":"vue.js","names":[],"sources":["../../src/helper/vue.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport {\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\n/** 字段名:空串 / null / undefined 时回退默认值 */\nexport function fieldKey(key: string | null | undefined, fallback: string): string {\n return key ? key : fallback\n}\n\n/** labelTemplate 占位符:{fieldKey},支持嵌套路径 */\nconst LABEL_TEMPLATE_RE = /\\{([^{}]+)\\}/g\n\n/**\n * 按 labelTemplate 渲染选项展示文案\n * @description `{fieldKey}` 占位符按行字段取值(链式取值,支持嵌套路径),\n * 取不到值(字段缺失 / null / 空串)的占位符按空串处理;\n * 只要有字段未命中即返回 undefined,由调用方回退 `row[labelKey]`,\n * 避免「文本()」这类残缺展示。渲染期格式化,不改写行数据。\n * @param template 模板串,如 `{label}({code})`;空值直接返回 undefined\n * @param row 选项行数据\n */\nexport function renderLabelTemplate(\n template: string | undefined,\n row: Record<string, any> | undefined | null\n): string | undefined {\n if (!template || !row) return undefined\n\n let missing = false\n const text = template.replace(LABEL_TEMPLATE_RE, (_, key: string) => {\n const value = o(row).get(key)\n if (value === undefined || value === null || value === '') {\n missing = true\n return ''\n }\n return String(value)\n })\n\n return missing ? undefined : text\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":";;;;;;;;AAuBA,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;;AAGA,SAAgB,SAAS,KAAgC,UAA0B;CACjF,OAAO,MAAM,MAAM;AACrB;;AAGA,MAAM,oBAAoB;;;;;;;;;;AAW1B,SAAgB,oBACd,UACA,KACoB;CACpB,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,KAAA;CAE9B,IAAI,UAAU;CACd,MAAM,OAAO,SAAS,QAAQ,oBAAoB,GAAG,QAAgB;EACnE,MAAM,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG;EAC5B,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,IAAI;GACzD,UAAU;GACV,OAAO;EACT;EACA,OAAO,OAAO,KAAK;CACrB,CAAC;CAED,OAAO,UAAU,KAAA,IAAY;AAC/B;AAEA,SAAgB,gBAAmB,QAAgC;CACjE,MAAM,SAAS,WAAc,OAAO,CAAC;CACrC,MAAM,SAAS,UAAU;EACvB,OAAO,QAAQ;CACjB,CAAC;CAED,OAAO;AACT"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,10 +14,10 @@ import { createToggle } from "./helper/create-toggle.js";
|
|
|
14
14
|
import { AnimeConfig, Tween, TweenConfig } from "./helper/tween.js";
|
|
15
15
|
import { nextFrame } from "./helper/frame.js";
|
|
16
16
|
import { OverflowNavState, OverflowNavViewport, applyWheelHorizontalScroll, computeOverflowNavState, scrollElementIntoView, scrollViewportByStep } from "./helper/overflow-nav.js";
|
|
17
|
-
import { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, shallowComputed } from "./helper/vue.js";
|
|
17
|
+
import { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, renderLabelTemplate, shallowComputed } from "./helper/vue.js";
|
|
18
18
|
import { middleProxy } from "./reactive/proxy.js";
|
|
19
19
|
import { DeconstructValue, DefineEvent, Index, Null, RenderReturn, Undef } from "./types/helper.js";
|
|
20
20
|
import { BreakpointName, ColorType, ComponentProps, ComponentSize, FormComponentProps, PresetRule, PropsWithServerQuery, ValidateRule } from "./types/component-common.js";
|
|
21
21
|
import { FormContextModel, FormContextProps, FormFieldItem, injectFormContext, provideFormContext } from "./types/form-context.js";
|
|
22
22
|
import "./types/index.js";
|
|
23
|
-
export { AiMessage, AiProviderConfig, AiStreamHandlers, AiTextRequestOptions, AiTokenUsage, AiTool, AiToolCall, AnimeConfig, BEM, BEMFactory, BreakpointName, CLS_PREFIX, ColorType, ComponentProps, ComponentSize, DeconstructValue, DefineEvent, ExpandTransition, ExpandTransitionOptions, FORM_EMPTY_CONTENT, FormComponentProps, FormContextModel, FormContextProps, FormFieldItem, Index, NAME_SPACE, Null, OpenAIBodyOptions, OpenAIRequestOptions, OpenAIStreamCallbacks, OverflowNavState, OverflowNavViewport, PresetRule, PropsWithServerQuery, RenderReturn, Tween, TweenConfig, Undef, ValidateRule, addClass, applyWheelHorizontalScroll, bem, buildOpenAIBody, computeOverflowNavState, createIncrease, createToggle, extractNormalVNodes, fieldKey, getHighlightChunks, getNearestScrollParent, getScrollParents, injectFormContext, isComment, isFragment, isTemplate, isTextNode, makeBEM, middleProxy, nextFrame, parseOpenAICompletionText, parseOpenAISSEStream, provideFormContext, removeClass, removeStyles, requestAiText, requestOpenAIStream, scrollElementIntoView, scrollIntoContainerView, scrollViewportByStep, setStyles, shallowComputed, withUnit, zIndex };
|
|
23
|
+
export { AiMessage, AiProviderConfig, AiStreamHandlers, AiTextRequestOptions, AiTokenUsage, AiTool, AiToolCall, AnimeConfig, BEM, BEMFactory, BreakpointName, CLS_PREFIX, ColorType, ComponentProps, ComponentSize, DeconstructValue, DefineEvent, ExpandTransition, ExpandTransitionOptions, FORM_EMPTY_CONTENT, FormComponentProps, FormContextModel, FormContextProps, FormFieldItem, Index, NAME_SPACE, Null, OpenAIBodyOptions, OpenAIRequestOptions, OpenAIStreamCallbacks, OverflowNavState, OverflowNavViewport, PresetRule, PropsWithServerQuery, RenderReturn, Tween, TweenConfig, Undef, ValidateRule, addClass, applyWheelHorizontalScroll, bem, buildOpenAIBody, computeOverflowNavState, createIncrease, createToggle, extractNormalVNodes, fieldKey, getHighlightChunks, getNearestScrollParent, getScrollParents, injectFormContext, isComment, isFragment, isTemplate, isTextNode, makeBEM, middleProxy, nextFrame, parseOpenAICompletionText, parseOpenAISSEStream, provideFormContext, removeClass, removeStyles, renderLabelTemplate, requestAiText, requestOpenAIStream, scrollElementIntoView, scrollIntoContainerView, scrollViewportByStep, setStyles, shallowComputed, withUnit, zIndex };
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { createToggle } from "./helper/create-toggle.js";
|
|
|
13
13
|
import { Tween } from "./helper/tween.js";
|
|
14
14
|
import { nextFrame } from "./helper/frame.js";
|
|
15
15
|
import { applyWheelHorizontalScroll, computeOverflowNavState, scrollElementIntoView, scrollViewportByStep } from "./helper/overflow-nav.js";
|
|
16
|
-
import { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, shallowComputed } from "./helper/vue.js";
|
|
16
|
+
import { extractNormalVNodes, fieldKey, isComment, isFragment, isTemplate, isTextNode, renderLabelTemplate, shallowComputed } from "./helper/vue.js";
|
|
17
17
|
import { middleProxy } from "./reactive/proxy.js";
|
|
18
18
|
import { injectFormContext, provideFormContext } from "./types/form-context.js";
|
|
19
|
-
export { CLS_PREFIX, ExpandTransition, FORM_EMPTY_CONTENT, NAME_SPACE, Tween, addClass, applyWheelHorizontalScroll, bem, buildOpenAIBody, computeOverflowNavState, createIncrease, createToggle, extractNormalVNodes, fieldKey, getHighlightChunks, getNearestScrollParent, getScrollParents, injectFormContext, isComment, isFragment, isTemplate, isTextNode, makeBEM, middleProxy, nextFrame, parseOpenAICompletionText, parseOpenAISSEStream, provideFormContext, removeClass, removeStyles, requestAiText, requestOpenAIStream, scrollElementIntoView, scrollIntoContainerView, scrollViewportByStep, setStyles, shallowComputed, withUnit, zIndex };
|
|
19
|
+
export { CLS_PREFIX, ExpandTransition, FORM_EMPTY_CONTENT, NAME_SPACE, Tween, addClass, applyWheelHorizontalScroll, bem, buildOpenAIBody, computeOverflowNavState, createIncrease, createToggle, extractNormalVNodes, fieldKey, getHighlightChunks, getNearestScrollParent, getScrollParents, injectFormContext, isComment, isFragment, isTemplate, isTextNode, makeBEM, middleProxy, nextFrame, parseOpenAICompletionText, parseOpenAISSEStream, provideFormContext, removeClass, removeStyles, renderLabelTemplate, requestAiText, requestOpenAIStream, scrollElementIntoView, scrollIntoContainerView, scrollViewportByStep, setStyles, shallowComputed, withUnit, zIndex };
|
package/package.json
CHANGED
package/src/helper/vue.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { o } from '@cat-kit/core'
|
|
1
2
|
import {
|
|
2
3
|
Text,
|
|
3
4
|
Fragment,
|
|
@@ -83,6 +84,37 @@ export function fieldKey(key: string | null | undefined, fallback: string): stri
|
|
|
83
84
|
return key ? key : fallback
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
/** labelTemplate 占位符:{fieldKey},支持嵌套路径 */
|
|
88
|
+
const LABEL_TEMPLATE_RE = /\{([^{}]+)\}/g
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 按 labelTemplate 渲染选项展示文案
|
|
92
|
+
* @description `{fieldKey}` 占位符按行字段取值(链式取值,支持嵌套路径),
|
|
93
|
+
* 取不到值(字段缺失 / null / 空串)的占位符按空串处理;
|
|
94
|
+
* 只要有字段未命中即返回 undefined,由调用方回退 `row[labelKey]`,
|
|
95
|
+
* 避免「文本()」这类残缺展示。渲染期格式化,不改写行数据。
|
|
96
|
+
* @param template 模板串,如 `{label}({code})`;空值直接返回 undefined
|
|
97
|
+
* @param row 选项行数据
|
|
98
|
+
*/
|
|
99
|
+
export function renderLabelTemplate(
|
|
100
|
+
template: string | undefined,
|
|
101
|
+
row: Record<string, any> | undefined | null
|
|
102
|
+
): string | undefined {
|
|
103
|
+
if (!template || !row) return undefined
|
|
104
|
+
|
|
105
|
+
let missing = false
|
|
106
|
+
const text = template.replace(LABEL_TEMPLATE_RE, (_, key: string) => {
|
|
107
|
+
const value = o(row).get(key)
|
|
108
|
+
if (value === undefined || value === null || value === '') {
|
|
109
|
+
missing = true
|
|
110
|
+
return ''
|
|
111
|
+
}
|
|
112
|
+
return String(value)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
return missing ? undefined : text
|
|
116
|
+
}
|
|
117
|
+
|
|
86
118
|
export function shallowComputed<T>(getter: () => T): ShallowRef<T> {
|
|
87
119
|
const result = shallowRef<T>(getter())
|
|
88
120
|
watch(getter, (value) => {
|