@tianyr/schema-antd 0.1.0 → 0.2.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/README.md +57 -12
- package/dist/SchemaField.d.ts +1 -1
- package/dist/biz-select/BizMultiSelect.d.ts +3 -0
- package/dist/biz-select/BizMultiSelect.d.ts.map +1 -0
- package/dist/biz-select/BizMultiSelect.js +120 -0
- package/dist/biz-select/BizMultiSelect.js.map +1 -0
- package/dist/biz-select/BizMultiSelectDisplay.d.ts +3 -0
- package/dist/biz-select/BizMultiSelectDisplay.d.ts.map +1 -0
- package/dist/biz-select/BizMultiSelectDisplay.js +59 -0
- package/dist/biz-select/BizMultiSelectDisplay.js.map +1 -0
- package/dist/biz-select/BizSelect.d.ts +3 -0
- package/dist/biz-select/BizSelect.d.ts.map +1 -0
- package/dist/biz-select/BizSelect.js +87 -0
- package/dist/biz-select/BizSelect.js.map +1 -0
- package/dist/biz-select/BizSelectDisplay.d.ts +3 -0
- package/dist/biz-select/BizSelectDisplay.d.ts.map +1 -0
- package/dist/biz-select/BizSelectDisplay.js +58 -0
- package/dist/biz-select/BizSelectDisplay.js.map +1 -0
- package/dist/biz-select/cache.d.ts +23 -0
- package/dist/biz-select/cache.d.ts.map +1 -0
- package/dist/biz-select/cache.js +141 -0
- package/dist/biz-select/cache.js.map +1 -0
- package/dist/biz-select/compile.d.ts +36 -0
- package/dist/biz-select/compile.d.ts.map +1 -0
- package/dist/biz-select/compile.js +103 -0
- package/dist/biz-select/compile.js.map +1 -0
- package/dist/biz-select/factories.d.ts +32 -0
- package/dist/biz-select/factories.d.ts.map +1 -0
- package/dist/biz-select/factories.js +67 -0
- package/dist/biz-select/factories.js.map +1 -0
- package/dist/biz-select/format.d.ts +66 -0
- package/dist/biz-select/format.d.ts.map +1 -0
- package/dist/biz-select/format.js +175 -0
- package/dist/biz-select/format.js.map +1 -0
- package/dist/biz-select/index.d.ts +28 -0
- package/dist/biz-select/index.d.ts.map +1 -0
- package/dist/biz-select/index.js +26 -0
- package/dist/biz-select/index.js.map +1 -0
- package/dist/biz-select/key.d.ts +25 -0
- package/dist/biz-select/key.d.ts.map +1 -0
- package/dist/biz-select/key.js +83 -0
- package/dist/biz-select/key.js.map +1 -0
- package/dist/biz-select/normalize.d.ts +43 -0
- package/dist/biz-select/normalize.d.ts.map +1 -0
- package/dist/biz-select/normalize.js +49 -0
- package/dist/biz-select/normalize.js.map +1 -0
- package/dist/biz-select/registry.d.ts +15 -0
- package/dist/biz-select/registry.d.ts.map +1 -0
- package/dist/biz-select/registry.js +81 -0
- package/dist/biz-select/registry.js.map +1 -0
- package/dist/biz-select/resolveBatch.d.ts +34 -0
- package/dist/biz-select/resolveBatch.d.ts.map +1 -0
- package/dist/biz-select/resolveBatch.js +124 -0
- package/dist/biz-select/resolveBatch.js.map +1 -0
- package/dist/biz-select/schema.d.ts +5 -0
- package/dist/biz-select/schema.d.ts.map +1 -0
- package/dist/biz-select/schema.js +28 -0
- package/dist/biz-select/schema.js.map +1 -0
- package/dist/biz-select/source-id.d.ts +8 -0
- package/dist/biz-select/source-id.d.ts.map +1 -0
- package/dist/biz-select/source-id.js +10 -0
- package/dist/biz-select/source-id.js.map +1 -0
- package/dist/biz-select/types.d.ts +160 -0
- package/dist/biz-select/types.d.ts.map +1 -0
- package/dist/{app-select → biz-select}/types.js.map +1 -1
- package/dist/biz-select/useCandidates.d.ts +40 -0
- package/dist/biz-select/useCandidates.d.ts.map +1 -0
- package/dist/biz-select/useCandidates.js +292 -0
- package/dist/biz-select/useCandidates.js.map +1 -0
- package/dist/biz-select/useResolvedLabels.d.ts +28 -0
- package/dist/biz-select/useResolvedLabels.d.ts.map +1 -0
- package/dist/biz-select/useResolvedLabels.js +151 -0
- package/dist/biz-select/useResolvedLabels.js.map +1 -0
- package/dist/biz-select/useSelectedLabel.d.ts +18 -0
- package/dist/biz-select/useSelectedLabel.d.ts.map +1 -0
- package/dist/biz-select/useSelectedLabel.js +156 -0
- package/dist/biz-select/useSelectedLabel.js.map +1 -0
- package/dist/biz-select/useSelectedLabels.d.ts +26 -0
- package/dist/biz-select/useSelectedLabels.d.ts.map +1 -0
- package/dist/biz-select/useSelectedLabels.js +88 -0
- package/dist/biz-select/useSelectedLabels.js.map +1 -0
- package/dist/biz-select/useStableSourceKey.d.ts +3 -0
- package/dist/biz-select/useStableSourceKey.d.ts.map +1 -0
- package/dist/biz-select/useStableSourceKey.js +48 -0
- package/dist/biz-select/useStableSourceKey.js.map +1 -0
- package/dist/flat.d.ts +43 -0
- package/dist/flat.d.ts.map +1 -0
- package/dist/flat.js +91 -0
- package/dist/flat.js.map +1 -0
- package/dist/form/SchemaFormField.d.ts.map +1 -1
- package/dist/form/SchemaFormField.js +4 -3
- package/dist/form/SchemaFormField.js.map +1 -1
- package/dist/form/derive.d.ts +3 -8
- package/dist/form/derive.d.ts.map +1 -1
- package/dist/form/derive.js +28 -0
- package/dist/form/derive.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +6 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +7 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/app-select/AppSelect.d.ts +0 -3
- package/dist/app-select/AppSelect.d.ts.map +0 -1
- package/dist/app-select/AppSelect.js +0 -56
- package/dist/app-select/AppSelect.js.map +0 -1
- package/dist/app-select/AppSelectDisplay.d.ts +0 -3
- package/dist/app-select/AppSelectDisplay.d.ts.map +0 -1
- package/dist/app-select/AppSelectDisplay.js +0 -39
- package/dist/app-select/AppSelectDisplay.js.map +0 -1
- package/dist/app-select/cache.d.ts +0 -26
- package/dist/app-select/cache.d.ts.map +0 -1
- package/dist/app-select/cache.js +0 -82
- package/dist/app-select/cache.js.map +0 -1
- package/dist/app-select/hooks.d.ts +0 -56
- package/dist/app-select/hooks.d.ts.map +0 -1
- package/dist/app-select/hooks.js +0 -322
- package/dist/app-select/hooks.js.map +0 -1
- package/dist/app-select/index.d.ts +0 -7
- package/dist/app-select/index.d.ts.map +0 -1
- package/dist/app-select/index.js +0 -6
- package/dist/app-select/index.js.map +0 -1
- package/dist/app-select/register.d.ts +0 -2
- package/dist/app-select/register.d.ts.map +0 -1
- package/dist/app-select/register.js +0 -10
- package/dist/app-select/register.js.map +0 -1
- package/dist/app-select/sources.d.ts +0 -20
- package/dist/app-select/sources.d.ts.map +0 -1
- package/dist/app-select/sources.js +0 -59
- package/dist/app-select/sources.js.map +0 -1
- package/dist/app-select/types.d.ts +0 -68
- package/dist/app-select/types.d.ts.map +0 -1
- package/dist/app-select/utils.d.ts +0 -30
- package/dist/app-select/utils.d.ts.map +0 -1
- package/dist/app-select/utils.js +0 -76
- package/dist/app-select/utils.js.map +0 -1
- /package/dist/{app-select → biz-select}/types.js +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** 命中后的存活时间 */
|
|
2
|
+
const HIT_TTL = 5 * 60 * 1000;
|
|
3
|
+
/** 空结果的存活时间:别把「暂时查不到」当成长久不存在 */
|
|
4
|
+
const MISS_TTL = 30 * 1000;
|
|
5
|
+
/**
|
|
6
|
+
* 条目上限。过期只在读到同一个 key 时才清理,没有上限的话,
|
|
7
|
+
* 大量编码 × 参数组合会一直堆着。这里按插入顺序淘汰(FIFO),够用即可。
|
|
8
|
+
*/
|
|
9
|
+
const MAX_ENTRIES = 500;
|
|
10
|
+
/**
|
|
11
|
+
* 缓存代次:clear 只清 Map,已经在途的请求稍后回来照样会写回旧数据。
|
|
12
|
+
* 每次 clear 递增一代,写回时比对代次就能丢掉上一代的结果。
|
|
13
|
+
*/
|
|
14
|
+
let generation = 0;
|
|
15
|
+
const candidateCache = new Map();
|
|
16
|
+
const resolveCache = new Map();
|
|
17
|
+
function take(store, key) {
|
|
18
|
+
const hit = store.get(key);
|
|
19
|
+
if (!hit)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (hit.expiresAt <= Date.now()) {
|
|
22
|
+
store.delete(key);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return hit.promise;
|
|
26
|
+
}
|
|
27
|
+
function evict(store) {
|
|
28
|
+
while (store.size > MAX_ENTRIES) {
|
|
29
|
+
const oldest = store.keys().next();
|
|
30
|
+
if (oldest.done)
|
|
31
|
+
return;
|
|
32
|
+
store.delete(oldest.value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** 请求发出后缓存被清过:这份结果属于上一代 */
|
|
36
|
+
function staleGeneration(startedGeneration) {
|
|
37
|
+
return startedGeneration !== generation;
|
|
38
|
+
}
|
|
39
|
+
/** 首次登记:只占位,不覆盖同键已有的请求(并发调用共享同一份 promise) */
|
|
40
|
+
function register(store, key, promise, ttl, startedGeneration) {
|
|
41
|
+
if (staleGeneration(startedGeneration) || store.has(key))
|
|
42
|
+
return;
|
|
43
|
+
store.set(key, { promise, expiresAt: Date.now() + ttl });
|
|
44
|
+
evict(store);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 结果写回:条目必须仍属于这次请求。
|
|
48
|
+
*
|
|
49
|
+
* 「条目不存在」也算失效——reload 换过一轮、新请求又失败了,此时写回去
|
|
50
|
+
* 就是让旧数据复活。所以不能只看 `current && current.promise !== owner`。
|
|
51
|
+
*/
|
|
52
|
+
function settle(store, key, owner, value, ttl, startedGeneration) {
|
|
53
|
+
if (staleGeneration(startedGeneration))
|
|
54
|
+
return;
|
|
55
|
+
const current = store.get(key);
|
|
56
|
+
if (!current || current.promise !== owner)
|
|
57
|
+
return;
|
|
58
|
+
store.set(key, { promise: Promise.resolve(value), expiresAt: Date.now() + ttl });
|
|
59
|
+
}
|
|
60
|
+
/** 失败清场:只删自己那一条,别误删已经接手的新请求 */
|
|
61
|
+
function dropOwn(store, key, owner) {
|
|
62
|
+
if (store.get(key)?.promise === owner)
|
|
63
|
+
store.delete(key);
|
|
64
|
+
}
|
|
65
|
+
export function loadCandidatesWithCache(key, loader) {
|
|
66
|
+
const cached = take(candidateCache, key);
|
|
67
|
+
if (cached)
|
|
68
|
+
return cached;
|
|
69
|
+
const startedGeneration = generation;
|
|
70
|
+
const promise = Promise.resolve()
|
|
71
|
+
.then(loader)
|
|
72
|
+
.then((list) => {
|
|
73
|
+
const options = list ?? [];
|
|
74
|
+
// 空结果只短暂记住
|
|
75
|
+
settle(candidateCache, key, promise, options, options.length ? HIT_TTL : MISS_TTL, startedGeneration);
|
|
76
|
+
return options;
|
|
77
|
+
})
|
|
78
|
+
.catch((error) => {
|
|
79
|
+
// 失败不缓存,下一次仍可重试
|
|
80
|
+
dropOwn(candidateCache, key, promise);
|
|
81
|
+
throw error;
|
|
82
|
+
});
|
|
83
|
+
register(candidateCache, key, promise, HIT_TTL, startedGeneration);
|
|
84
|
+
return promise;
|
|
85
|
+
}
|
|
86
|
+
/** 丢掉单条候选缓存:reload() 要真正重取,不能又命中同一份 */
|
|
87
|
+
export function dropCandidateCache(key) {
|
|
88
|
+
candidateCache.delete(key);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 只看缓存、不发起请求:批量解析用它先把已命中的挑出来,
|
|
92
|
+
* 免得已经查过的编码还被塞进批量请求里占位。
|
|
93
|
+
*/
|
|
94
|
+
export function peekResolved(key) {
|
|
95
|
+
return take(resolveCache, key);
|
|
96
|
+
}
|
|
97
|
+
/** 丢掉单条解析缓存:`reload()` 要真正重查,不能又命中同一份 */
|
|
98
|
+
export function dropResolvedCache(key) {
|
|
99
|
+
resolveCache.delete(key);
|
|
100
|
+
}
|
|
101
|
+
export function resolveCodeWithCache(key, loader) {
|
|
102
|
+
const cached = take(resolveCache, key);
|
|
103
|
+
if (cached)
|
|
104
|
+
return cached;
|
|
105
|
+
const startedGeneration = generation;
|
|
106
|
+
const promise = loader()
|
|
107
|
+
.then((option) => {
|
|
108
|
+
settle(resolveCache, key, promise, option, option ? HIT_TTL : MISS_TTL, startedGeneration);
|
|
109
|
+
return option;
|
|
110
|
+
})
|
|
111
|
+
.catch((error) => {
|
|
112
|
+
dropOwn(resolveCache, key, promise);
|
|
113
|
+
throw error;
|
|
114
|
+
});
|
|
115
|
+
register(resolveCache, key, promise, HIT_TTL, startedGeneration);
|
|
116
|
+
return promise;
|
|
117
|
+
}
|
|
118
|
+
/** 来源键在缓存键里固定占第二段,因此用两侧分隔符即可精确匹配 */
|
|
119
|
+
function matchesSource(key, sourceKey) {
|
|
120
|
+
return key.startsWith(`${sourceKey}|`) || key.includes(`|${sourceKey}|`);
|
|
121
|
+
}
|
|
122
|
+
export function clearSelectCacheOfSource(sourceKey) {
|
|
123
|
+
generation += 1;
|
|
124
|
+
for (const key of candidateCache.keys()) {
|
|
125
|
+
if (matchesSource(key, sourceKey))
|
|
126
|
+
candidateCache.delete(key);
|
|
127
|
+
}
|
|
128
|
+
for (const key of resolveCache.keys()) {
|
|
129
|
+
if (matchesSource(key, sourceKey))
|
|
130
|
+
resolveCache.delete(key);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function clearSelectCache() {
|
|
134
|
+
generation += 1;
|
|
135
|
+
candidateCache.clear();
|
|
136
|
+
resolveCache.clear();
|
|
137
|
+
}
|
|
138
|
+
export function getSelectCacheSize() {
|
|
139
|
+
return candidateCache.size + resolveCache.size;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/biz-select/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AnyFormFieldSchema, NamePath } from '../types.js';
|
|
2
|
+
import type { BizOption, DisplayMode, SearchFields, ValueFieldMap, ValueMode } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* `paramsFrom` 的两种写法,别的不认:
|
|
5
|
+
* - `NamePath`:字段值原样当参数
|
|
6
|
+
* - `{ from, pick }`:字段值是对象时取其中一个键当参数。
|
|
7
|
+
* 给「接口平铺 userId/userName、前端临时组装成 user 对象」这类场景用;
|
|
8
|
+
* 只声明键名,不做「看到对象就猜该取哪个键」的自动推导。
|
|
9
|
+
*/
|
|
10
|
+
export type ParamsFromEntry = NamePath | {
|
|
11
|
+
from: NamePath;
|
|
12
|
+
pick: string;
|
|
13
|
+
};
|
|
14
|
+
/** BizSelect 在 schema 里额外认的专有属性 */
|
|
15
|
+
export interface BizSelectSchemaProps {
|
|
16
|
+
/** 数据源注册名;schema 里不允许写函数 */
|
|
17
|
+
source?: string;
|
|
18
|
+
/** 参数名 ← 表单字段名(或字段值里的某个键):`{ provinceCode: 'provinceCode' }` */
|
|
19
|
+
paramsFrom?: Record<string, ParamsFromEntry>;
|
|
20
|
+
valueMode?: ValueMode;
|
|
21
|
+
valueFields?: ValueFieldMap;
|
|
22
|
+
displayMode?: DisplayMode;
|
|
23
|
+
searchFields?: SearchFields;
|
|
24
|
+
seedOptions?: BizOption[];
|
|
25
|
+
/** 默认 true:父值变化时清空本字段 */
|
|
26
|
+
clearOnParent?: boolean;
|
|
27
|
+
blockedText?: unknown;
|
|
28
|
+
debounceMs?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 归一化:专有属性下沉 + 级联编译。
|
|
32
|
+
*
|
|
33
|
+
* 必须是纯函数——调用方按 schema 对象缓存结果,每次新建对象会让下游 memo 与 effect 全部失效。
|
|
34
|
+
*/
|
|
35
|
+
export declare function normalizeBizSelectSchema<T extends AnyFormFieldSchema>(schema: T): T;
|
|
36
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/biz-select/compile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,kBAAkB,EAIlB,QAAQ,EAET,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,YAAY,EAEZ,aAAa,EACb,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,yBAAyB;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgFD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,kBAAkB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CA2BnF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* schema 侧的纯逻辑:专有属性下沉 + `paramsFrom` 编译。
|
|
3
|
+
*
|
|
4
|
+
* 与 `schema.tsx`(负责注册、需要 antd/React)分开,是为了让这部分能被单测直接加载。
|
|
5
|
+
*/
|
|
6
|
+
import { dedupeNamePaths } from '../form/namePath.js';
|
|
7
|
+
/** 需要下沉到 props 的专有属性:组件只认 props */
|
|
8
|
+
const SUNK_KEYS = [
|
|
9
|
+
'source',
|
|
10
|
+
'valueMode',
|
|
11
|
+
'valueFields',
|
|
12
|
+
'displayMode',
|
|
13
|
+
'searchFields',
|
|
14
|
+
'seedOptions',
|
|
15
|
+
'blockedText',
|
|
16
|
+
'debounceMs',
|
|
17
|
+
];
|
|
18
|
+
function isPickEntry(entry) {
|
|
19
|
+
return typeof entry === 'object' && entry !== null && !Array.isArray(entry);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 取参数值。
|
|
23
|
+
*
|
|
24
|
+
* `pick` 取不到(父值为空、不是对象、没这个键)一律给 `undefined`,
|
|
25
|
+
* 交给下游的 `requiredParams` 去挡请求——这里不能回退成整个对象,
|
|
26
|
+
* 把对象当参数传给后端是静默错误,比不查难查得多。
|
|
27
|
+
*/
|
|
28
|
+
function readParam(entry, ctx) {
|
|
29
|
+
if (!isPickEntry(entry))
|
|
30
|
+
return ctx.get(entry);
|
|
31
|
+
const value = ctx.get(entry.from);
|
|
32
|
+
if (!value || typeof value !== 'object')
|
|
33
|
+
return undefined;
|
|
34
|
+
return value[entry.pick];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 把 `paramsFrom` 编译成已有的两套机制:
|
|
38
|
+
* - `dynamic`:订阅父字段,把值映射成 `params` 传给组件
|
|
39
|
+
* - `linkage`:父值变化时清空本字段
|
|
40
|
+
*/
|
|
41
|
+
function compileParamsFrom(schema, entries) {
|
|
42
|
+
// 依赖必须挂在 from 上:linkage 的清空匹配用的是一级字段名,
|
|
43
|
+
// 写成 ['user','userId'] 这种子路径,父值变化时不会触发清空
|
|
44
|
+
const deps = dedupeNamePaths(entries.map(([, entry]) => (isPickEntry(entry) ? entry.from : entry)));
|
|
45
|
+
const base = schema.dynamic;
|
|
46
|
+
const inheritedProps = base?.props;
|
|
47
|
+
// 静态固定条件(如 props.params: { enabled: true })必须保留,否则查询会放宽
|
|
48
|
+
const staticParams = (schema.props?.params ?? undefined);
|
|
49
|
+
const dynamic = {
|
|
50
|
+
...base,
|
|
51
|
+
// 与调用方自己声明的依赖取并集去重
|
|
52
|
+
dependencies: dedupeNamePaths([...(base?.dependencies ?? []), ...deps]),
|
|
53
|
+
props: (ctx) => {
|
|
54
|
+
const inherited = typeof inheritedProps === 'function' ? inheritedProps(ctx) : (inheritedProps ?? {});
|
|
55
|
+
const inheritedParams = inherited.params;
|
|
56
|
+
const mapped = Object.fromEntries(entries.map(([param, entry]) => [param, readParam(entry, ctx)]));
|
|
57
|
+
// 合并顺序:静态 props.params < dynamic.props().params < paramsFrom 映射。
|
|
58
|
+
// 越靠后的越"当前",同名时覆盖前面的
|
|
59
|
+
return {
|
|
60
|
+
...inherited,
|
|
61
|
+
params: { ...staticParams, ...inheritedParams, ...mapped },
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
// clearOnParent=false 是「快照语义」:父变不清空,也不额外下发联动规则
|
|
66
|
+
const linkage = schema.clearOnParent === false
|
|
67
|
+
? schema.linkage
|
|
68
|
+
: [...(schema.linkage ?? []), { dependencies: deps, handler: (ctx) => ctx.clear(schema.name) }];
|
|
69
|
+
return { dynamic, linkage };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 归一化:专有属性下沉 + 级联编译。
|
|
73
|
+
*
|
|
74
|
+
* 必须是纯函数——调用方按 schema 对象缓存结果,每次新建对象会让下游 memo 与 effect 全部失效。
|
|
75
|
+
*/
|
|
76
|
+
export function normalizeBizSelectSchema(schema) {
|
|
77
|
+
const ext = schema;
|
|
78
|
+
// 单选多选共用同一套:级联参数和清空语义与值的形态无关
|
|
79
|
+
if (ext.type !== 'BizSelect' && ext.type !== 'BizMultiSelect')
|
|
80
|
+
return schema;
|
|
81
|
+
const sunk = {};
|
|
82
|
+
for (const key of SUNK_KEYS) {
|
|
83
|
+
if (ext[key] !== undefined)
|
|
84
|
+
sunk[key] = ext[key];
|
|
85
|
+
}
|
|
86
|
+
const entries = Object.entries(ext.paramsFrom ?? {});
|
|
87
|
+
// 没有可下沉的属性和可编译的级联时保持同一引用,避免无意义的新对象
|
|
88
|
+
if (!entries.length && !Object.keys(sunk).length)
|
|
89
|
+
return schema;
|
|
90
|
+
const next = { ...schema, props: { ...schema.props, ...sunk } };
|
|
91
|
+
if (entries.length) {
|
|
92
|
+
const { dynamic, linkage } = compileParamsFrom(ext, entries);
|
|
93
|
+
next.dynamic = dynamic;
|
|
94
|
+
if (linkage)
|
|
95
|
+
next.linkage = linkage;
|
|
96
|
+
}
|
|
97
|
+
// 已经编译进 props / dynamic / linkage 的属性从顶层摘掉,保证归一化幂等
|
|
98
|
+
for (const key of [...SUNK_KEYS, 'paramsFrom', 'clearOnParent']) {
|
|
99
|
+
delete next[key];
|
|
100
|
+
}
|
|
101
|
+
return next;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/biz-select/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BizOption, RecordFieldNames, SelectParams, SelectSource, SelectValue } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 源返回的原始记录:字段名由 recordFields 声明。
|
|
4
|
+
* 刻意不收窄成 `Record<string, unknown>`——业务侧传的是 interface,
|
|
5
|
+
* 没有索引签名就赋不进来;形状对不对由 recordFields 声明负责,类型系统管不到这一步。
|
|
6
|
+
*/
|
|
7
|
+
type OptionRecord = object;
|
|
8
|
+
/** ① 纯前端常量:同步可用,没有请求也没有 loading */
|
|
9
|
+
export declare function staticList(list: ReadonlyArray<BizOption | OptionRecord>, recordFields?: RecordFieldNames): SelectSource;
|
|
10
|
+
export interface LoadedOptions {
|
|
11
|
+
requiredParams?: string[];
|
|
12
|
+
namespace?: () => string;
|
|
13
|
+
recordFields?: RecordFieldNames;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ② 有限远程枚举:一次拉全量,之后由前端过滤。
|
|
17
|
+
* 传导入的函数(如 `api.listCurrency`)而不是内联箭头,才能跨实例共享缓存。
|
|
18
|
+
*/
|
|
19
|
+
export declare function loaded<P extends SelectParams = SelectParams>(load: (params: P, signal?: AbortSignal) => Promise<Array<BizOption | OptionRecord>>, options?: LoadedOptions): SelectSource<P>;
|
|
20
|
+
export interface RemoteOptions<P extends SelectParams = SelectParams> {
|
|
21
|
+
search: (keyword: string, params: P, signal?: AbortSignal) => Promise<Array<BizOption | OptionRecord>>;
|
|
22
|
+
resolve?: (value: SelectValue, params: P, signal?: AbortSignal) => Promise<BizOption | OptionRecord | null>;
|
|
23
|
+
/** 批量按值查:接口有 IN 参数时才声明,见 SelectSource.resolveMany */
|
|
24
|
+
resolveMany?: (values: SelectValue[], params: P, signal?: AbortSignal) => Promise<Array<BizOption | OptionRecord>>;
|
|
25
|
+
requiredParams?: string[];
|
|
26
|
+
namespace?: () => string;
|
|
27
|
+
recordFields?: RecordFieldNames;
|
|
28
|
+
}
|
|
29
|
+
/** ③ 无限远程:关键词搜索 + 按值回显 */
|
|
30
|
+
export declare function remote<P extends SelectParams = SelectParams>(config: RemoteOptions<P>): SelectSource<P>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=factories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../../src/biz-select/factories.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,KAAK,YAAY,GAAG,MAAM,CAAC;AAuC3B,mCAAmC;AACnC,wBAAgB,UAAU,CACxB,IAAI,EAAE,aAAa,CAAC,SAAS,GAAG,YAAY,CAAC,EAC7C,YAAY,CAAC,EAAE,gBAAgB,GAC9B,YAAY,CAEd;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC1D,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,EACnF,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAAC,CAAC,CAAC,CAGjB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IAClE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;IACvG,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,CAAC,EACT,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,SAAS,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,qDAAqD;IACrD,WAAW,CAAC,EAAE,CACZ,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,CAAC,EACT,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED,0BAA0B;AAC1B,wBAAgB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC1D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GACvB,YAAY,CAAC,CAAC,CAAC,CAWjB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 三个工厂:只做形状收敛,不注册、不缓存、不发请求。
|
|
3
|
+
*
|
|
4
|
+
* 之所以保留工厂而不是让调用方直接写 `{ load, search }`:
|
|
5
|
+
* 工厂承载了「这个源属于哪种能力组合」的语义,写法越短,越不容易写出
|
|
6
|
+
* `resolve` 用模糊搜索冒充精确查这类错误。
|
|
7
|
+
*
|
|
8
|
+
* 后端字段名不同的记录(`{ code, name }`、`{ userId, userName }`)在这一层用
|
|
9
|
+
* `recordFields` 映射一次,组件和其它所有下游只认 `{ value, label }`。
|
|
10
|
+
* 映射只发生在数据入口,不做「看到 code 就当 value」的自动嗅探。
|
|
11
|
+
*/
|
|
12
|
+
import { present } from './format.js';
|
|
13
|
+
/** 原始记录 → 契约选项;未声明 recordFields 时原样返回(视为已经是契约形状) */
|
|
14
|
+
function mapRecord(record, fields) {
|
|
15
|
+
if (!fields)
|
|
16
|
+
return record;
|
|
17
|
+
const source = record;
|
|
18
|
+
const valueKey = fields.value ?? 'value';
|
|
19
|
+
const labelKey = fields.label ?? 'label';
|
|
20
|
+
const label = source[labelKey];
|
|
21
|
+
const mapped = {
|
|
22
|
+
value: source[valueKey],
|
|
23
|
+
label: present(label) ? String(label) : undefined,
|
|
24
|
+
// 映射过的记录,原样记录就是业务需要的附加字段
|
|
25
|
+
raw: source.raw ?? source,
|
|
26
|
+
};
|
|
27
|
+
if (source.disabled !== undefined)
|
|
28
|
+
mapped.disabled = Boolean(source.disabled);
|
|
29
|
+
return mapped;
|
|
30
|
+
}
|
|
31
|
+
/** 列表型能力(options / load / search)的包装:取出后统一映射 */
|
|
32
|
+
function wrapList(fn, fields) {
|
|
33
|
+
return async (...args) => (await fn(...args)).map((item) => mapRecord(item, fields));
|
|
34
|
+
}
|
|
35
|
+
/** 单条能力(resolve)的包装:null 原样返回 */
|
|
36
|
+
function wrapOne(fn, fields) {
|
|
37
|
+
return async (...args) => {
|
|
38
|
+
const record = await fn(...args);
|
|
39
|
+
return record ? mapRecord(record, fields) : null;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** ① 纯前端常量:同步可用,没有请求也没有 loading */
|
|
43
|
+
export function staticList(list, recordFields) {
|
|
44
|
+
return { options: list.map((item) => mapRecord(item, recordFields)) };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* ② 有限远程枚举:一次拉全量,之后由前端过滤。
|
|
48
|
+
* 传导入的函数(如 `api.listCurrency`)而不是内联箭头,才能跨实例共享缓存。
|
|
49
|
+
*/
|
|
50
|
+
export function loaded(load, options = {}) {
|
|
51
|
+
const { recordFields, ...rest } = options;
|
|
52
|
+
return { load: wrapList(load, recordFields), ...rest };
|
|
53
|
+
}
|
|
54
|
+
/** ③ 无限远程:关键词搜索 + 按值回显 */
|
|
55
|
+
export function remote(config) {
|
|
56
|
+
const { search, resolve, resolveMany, requiredParams, namespace, recordFields } = config;
|
|
57
|
+
return {
|
|
58
|
+
search: wrapList(search, recordFields),
|
|
59
|
+
resolve: resolve ? wrapOne(resolve, recordFields) : undefined,
|
|
60
|
+
resolveMany: resolveMany
|
|
61
|
+
? wrapList(resolveMany, recordFields)
|
|
62
|
+
: undefined,
|
|
63
|
+
requiredParams,
|
|
64
|
+
namespace,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=factories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factories.js","sourceRoot":"","sources":["../../src/biz-select/factories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAgBnC,oDAAoD;AACpD,SAAS,SAAS,CAAC,MAAgC,EAAE,MAAyB;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,MAAmB,CAAC;IACxC,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAc;QACxB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAgB;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QACjD,yBAAyB;QACzB,GAAG,EAAG,MAAM,CAAC,GAAe,IAAI,MAAM;KACvC,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,SAAS,QAAQ,CACf,EAA4D,EAC5D,MAAyB;IAEzB,OAAO,KAAK,EAAE,GAAG,IAAO,EAAwB,EAAE,CAChD,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,iCAAiC;AACjC,SAAS,OAAO,CACd,EAA4D,EAC5D,MAAyB;IAEzB,OAAO,KAAK,EAAE,GAAG,IAAO,EAA6B,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,UAAU,CACxB,IAA6C,EAC7C,YAA+B;IAE/B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,IAAmF,EACnF,UAAyB,EAAE;IAE3B,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;AACpF,CAAC;AAoBD,0BAA0B;AAC1B,MAAM,UAAU,MAAM,CACpB,MAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IACzF,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAA8B;QACnE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,OAAO,CAAC,OAAO,EAAE,YAAY,CAAgC,CAAC,CAAC,CAAC,SAAS;QAC7F,WAAW,EAAE,WAAW;YACtB,CAAC,CAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAoC;YACzE,CAAC,CAAC,SAAS;QACb,cAAc;QACd,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 展示与取值:纯函数,不依赖 React,可直接单测。
|
|
3
|
+
*
|
|
4
|
+
* 展示模式统一走「先取首选字段,缺失再降级」,不写三套分支;
|
|
5
|
+
* 值 0 是合法值,判空一律用 present,不能用真值判断。
|
|
6
|
+
*
|
|
7
|
+
* 注意区分两套键名:
|
|
8
|
+
* - 选项用 `{ value, label }`(契约,和 antd 一致)
|
|
9
|
+
* - 存储的对象值键名由 `valueFields` 决定,默认也是 `{ value, label }`
|
|
10
|
+
*/
|
|
11
|
+
import type { BizObjectValue, BizOption, DisplayMode, SearchFields, SelectValue, SelectValues, ValueFieldMap, ValueMode } from './types.js';
|
|
12
|
+
/** 与 read.tsx 的 EMPTY_TEXT 保持一致;接 BMS 时由覆盖层决定最终观感 */
|
|
13
|
+
export declare const EMPTY = "\u2014";
|
|
14
|
+
/** `V-L` 的连接符:场景不多,不做配置 */
|
|
15
|
+
export declare const LABEL_SEPARATOR = "-";
|
|
16
|
+
export declare function present(value: unknown): boolean;
|
|
17
|
+
export declare function isEmptyValue(value: SelectValue | null | undefined): boolean;
|
|
18
|
+
/** 展示模式 → 默认的搜索字段 */
|
|
19
|
+
export declare function defaultSearchFields(mode: DisplayMode): SearchFields;
|
|
20
|
+
/**
|
|
21
|
+
* 拼接展示文本。
|
|
22
|
+
* 降级规则:`L` 缺名称用值,`V` 缺值用名称,`V-L` 缺一侧就只显示另一侧。
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatLabel(option: Pick<BizOption, 'value' | 'label'>, mode: DisplayMode, separator?: string): string;
|
|
25
|
+
/** 关键字是否命中:空关键字一律命中,前端过滤只管 `options` / `load` 两类源 */
|
|
26
|
+
export declare function matchKeyword(option: BizOption, keyword: string, fields: SearchFields): boolean;
|
|
27
|
+
/** 本地过滤:候选全集已在前端时用;关键词为空直接返回原数组,避免多余遍历 */
|
|
28
|
+
export declare function filterOptions(list: BizOption[], keyword: string, fields: SearchFields): BizOption[];
|
|
29
|
+
/** 按内容判断候选是否真的变了:内联数组每次新建也能对上 */
|
|
30
|
+
export declare function optionsContentKey(list?: BizOption[] | null): string;
|
|
31
|
+
/** 契约选项 → antd 需要的 `{ value, label }`;形状一致,这里只负责拼展示文本 */
|
|
32
|
+
export declare function toAntOption(option: BizOption, mode: DisplayMode): {
|
|
33
|
+
value: SelectValue;
|
|
34
|
+
label: string;
|
|
35
|
+
disabled: boolean | undefined;
|
|
36
|
+
raw: BizOption<unknown>;
|
|
37
|
+
};
|
|
38
|
+
export declare function resolveValueFields(fields?: ValueFieldMap): Required<ValueFieldMap>;
|
|
39
|
+
/** 从值里取出编码,标量与对象两种形态统一到一处 */
|
|
40
|
+
export declare function readValue(value: SelectValue | BizObjectValue | null | undefined, valueMode: ValueMode, fields?: ValueFieldMap): SelectValue | undefined;
|
|
41
|
+
/** 从对象值里取出已带的名称,命中就不必再 resolve */
|
|
42
|
+
export declare function readObjectLabel(value: SelectValue | BizObjectValue | null | undefined, valueMode: ValueMode, fields?: ValueFieldMap): string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* 标量值 + 选项 → 对象值;名称缺失时留空串,由展示层降级到值本身。
|
|
45
|
+
*
|
|
46
|
+
* 只输出 valueFields 指定的两个键。改选是换成另一条记录,旧对象上的 id /
|
|
47
|
+
* 部门等字段属于上一条,跟着搬过去就是串数据;拿不到新名称时也不能沿用旧名称,
|
|
48
|
+
* 那会把「张三」显示成「李四」的编码。需要附加字段的业务从 onChange 的
|
|
49
|
+
* 第二个参数 `option.raw` 里取。
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildObjectValue(value: SelectValue, option: BizOption | undefined, fields?: ValueFieldMap): BizObjectValue;
|
|
52
|
+
/**
|
|
53
|
+
* 值 → 编码数组。
|
|
54
|
+
*
|
|
55
|
+
* 输入接受 `undefined` / `null` / `[]` 和各种混杂形态,输出永远是数组;
|
|
56
|
+
* 空值一律给 `[]`(调用方判断"有没有值"用长度,不用再区分 undefined)。
|
|
57
|
+
*/
|
|
58
|
+
export declare function readValues(value: SelectValues | SelectValue | BizObjectValue | null | undefined, valueMode: ValueMode, fields?: ValueFieldMap): SelectValue[];
|
|
59
|
+
/**
|
|
60
|
+
* 对象数组 → 编码 → 名称的映射。
|
|
61
|
+
* 只服务于回显里的第一优先级「值自己带着名称」,没有名称的键不写。
|
|
62
|
+
*/
|
|
63
|
+
export declare function readObjectLabels(value: SelectValues | SelectValue | BizObjectValue | null | undefined, valueMode: ValueMode, fields?: ValueFieldMap): Map<string, string>;
|
|
64
|
+
/** 编码数组 + 已解析选项 → 对象数组;缺名称的留空串,由展示层降级到编码本身 */
|
|
65
|
+
export declare function buildObjectValues(codes: SelectValue[], options: Map<string, BizOption>, fields?: ValueFieldMap): BizObjectValue[];
|
|
66
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/biz-select/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB,qDAAqD;AACrD,eAAO,MAAM,KAAK,WAAM,CAAC;AAEzB,2BAA2B;AAC3B,eAAO,MAAM,eAAe,MAAM,CAAC;AAInC,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,qBAAqB;AACrB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAInE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,EAC1C,IAAI,EAAE,WAAW,EACjB,SAAS,SAAkB,GAC1B,MAAM,CAUR;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAU9F;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,GACnB,SAAS,EAAE,CAGb;AAED,iCAAiC;AACjC,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,MAAM,CAKnE;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW;;;;;EAO/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAKlF;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,EACtD,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,aAAa,GACrB,WAAW,GAAG,SAAS,CAOzB;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,EACtD,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,MAAM,CAAC,EAAE,aAAa,GACrB,cAAc,CAGhB;AAUD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,EACrE,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,aAAa,GACrB,WAAW,EAAE,CAgBf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,EACrE,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,aAAa,GACrB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAcrB;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,MAAM,CAAC,EAAE,aAAa,GACrB,cAAc,EAAE,CAMlB"}
|