@tianyr/schema-antd 0.0.0-stage → 0.1.1

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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -2
  3. package/dist/SchemaField.d.ts +15 -0
  4. package/dist/SchemaField.d.ts.map +1 -0
  5. package/dist/SchemaField.js +107 -0
  6. package/dist/SchemaField.js.map +1 -0
  7. package/dist/SchemaForm.d.ts +22 -0
  8. package/dist/SchemaForm.d.ts.map +1 -0
  9. package/dist/SchemaForm.js +19 -0
  10. package/dist/SchemaForm.js.map +1 -0
  11. package/dist/TableFooter.d.ts +38 -0
  12. package/dist/TableFooter.d.ts.map +1 -0
  13. package/dist/TableFooter.js +16 -0
  14. package/dist/TableFooter.js.map +1 -0
  15. package/dist/biz-select/BizSelect.d.ts +3 -0
  16. package/dist/biz-select/BizSelect.d.ts.map +1 -0
  17. package/dist/biz-select/BizSelect.js +87 -0
  18. package/dist/biz-select/BizSelect.js.map +1 -0
  19. package/dist/biz-select/BizSelectDisplay.d.ts +3 -0
  20. package/dist/biz-select/BizSelectDisplay.d.ts.map +1 -0
  21. package/dist/biz-select/BizSelectDisplay.js +58 -0
  22. package/dist/biz-select/BizSelectDisplay.js.map +1 -0
  23. package/dist/biz-select/cache.d.ts +16 -0
  24. package/dist/biz-select/cache.d.ts.map +1 -0
  25. package/dist/biz-select/cache.js +130 -0
  26. package/dist/biz-select/cache.js.map +1 -0
  27. package/dist/biz-select/compile.d.ts +25 -0
  28. package/dist/biz-select/compile.d.ts.map +1 -0
  29. package/dist/biz-select/compile.js +82 -0
  30. package/dist/biz-select/compile.js.map +1 -0
  31. package/dist/biz-select/factories.d.ts +23 -0
  32. package/dist/biz-select/factories.d.ts.map +1 -0
  33. package/dist/biz-select/factories.js +17 -0
  34. package/dist/biz-select/factories.js.map +1 -0
  35. package/dist/biz-select/format.d.ts +48 -0
  36. package/dist/biz-select/format.d.ts.map +1 -0
  37. package/dist/biz-select/format.js +110 -0
  38. package/dist/biz-select/format.js.map +1 -0
  39. package/dist/biz-select/index.d.ts +23 -0
  40. package/dist/biz-select/index.d.ts.map +1 -0
  41. package/dist/biz-select/index.js +22 -0
  42. package/dist/biz-select/index.js.map +1 -0
  43. package/dist/biz-select/key.d.ts +15 -0
  44. package/dist/biz-select/key.d.ts.map +1 -0
  45. package/dist/biz-select/key.js +69 -0
  46. package/dist/biz-select/key.js.map +1 -0
  47. package/dist/biz-select/normalize.d.ts +40 -0
  48. package/dist/biz-select/normalize.d.ts.map +1 -0
  49. package/dist/biz-select/normalize.js +46 -0
  50. package/dist/biz-select/normalize.js.map +1 -0
  51. package/dist/biz-select/registry.d.ts +15 -0
  52. package/dist/biz-select/registry.d.ts.map +1 -0
  53. package/dist/biz-select/registry.js +81 -0
  54. package/dist/biz-select/registry.js.map +1 -0
  55. package/dist/biz-select/schema.d.ts +5 -0
  56. package/dist/biz-select/schema.d.ts.map +1 -0
  57. package/dist/biz-select/schema.js +21 -0
  58. package/dist/biz-select/schema.js.map +1 -0
  59. package/dist/biz-select/source-id.d.ts +8 -0
  60. package/dist/biz-select/source-id.d.ts.map +1 -0
  61. package/dist/biz-select/source-id.js +10 -0
  62. package/dist/biz-select/source-id.js.map +1 -0
  63. package/dist/biz-select/types.d.ts +104 -0
  64. package/dist/biz-select/types.d.ts.map +1 -0
  65. package/dist/biz-select/types.js +2 -0
  66. package/dist/biz-select/types.js.map +1 -0
  67. package/dist/biz-select/useCandidates.d.ts +40 -0
  68. package/dist/biz-select/useCandidates.d.ts.map +1 -0
  69. package/dist/biz-select/useCandidates.js +292 -0
  70. package/dist/biz-select/useCandidates.js.map +1 -0
  71. package/dist/biz-select/useSelectedLabel.d.ts +18 -0
  72. package/dist/biz-select/useSelectedLabel.d.ts.map +1 -0
  73. package/dist/biz-select/useSelectedLabel.js +158 -0
  74. package/dist/biz-select/useSelectedLabel.js.map +1 -0
  75. package/dist/biz-select/useStableSourceKey.d.ts +3 -0
  76. package/dist/biz-select/useStableSourceKey.d.ts.map +1 -0
  77. package/dist/biz-select/useStableSourceKey.js +48 -0
  78. package/dist/biz-select/useStableSourceKey.js.map +1 -0
  79. package/dist/editable-table/EditableTable.d.ts +3 -0
  80. package/dist/editable-table/EditableTable.d.ts.map +1 -0
  81. package/dist/editable-table/EditableTable.js +499 -0
  82. package/dist/editable-table/EditableTable.js.map +1 -0
  83. package/dist/editable-table/dirty.d.ts +17 -0
  84. package/dist/editable-table/dirty.d.ts.map +1 -0
  85. package/dist/editable-table/dirty.js +72 -0
  86. package/dist/editable-table/dirty.js.map +1 -0
  87. package/dist/editable-table/index.d.ts +4 -0
  88. package/dist/editable-table/index.d.ts.map +1 -0
  89. package/dist/editable-table/index.js +3 -0
  90. package/dist/editable-table/index.js.map +1 -0
  91. package/dist/editable-table/types.d.ts +109 -0
  92. package/dist/editable-table/types.d.ts.map +1 -0
  93. package/dist/editable-table/types.js +2 -0
  94. package/dist/editable-table/types.js.map +1 -0
  95. package/dist/env.d.ts +3 -0
  96. package/dist/env.d.ts.map +1 -0
  97. package/dist/env.js +11 -0
  98. package/dist/env.js.map +1 -0
  99. package/dist/form/FormRuntimeHost.d.ts +39 -0
  100. package/dist/form/FormRuntimeHost.d.ts.map +1 -0
  101. package/dist/form/FormRuntimeHost.js +184 -0
  102. package/dist/form/FormRuntimeHost.js.map +1 -0
  103. package/dist/form/SchemaFormField.d.ts +15 -0
  104. package/dist/form/SchemaFormField.d.ts.map +1 -0
  105. package/dist/form/SchemaFormField.js +143 -0
  106. package/dist/form/SchemaFormField.js.map +1 -0
  107. package/dist/form/derive.d.ts +28 -0
  108. package/dist/form/derive.d.ts.map +1 -0
  109. package/dist/form/derive.js +87 -0
  110. package/dist/form/derive.js.map +1 -0
  111. package/dist/form/namePath.d.ts +12 -0
  112. package/dist/form/namePath.d.ts.map +1 -0
  113. package/dist/form/namePath.js +33 -0
  114. package/dist/form/namePath.js.map +1 -0
  115. package/dist/full-editable-table/EditableCell.d.ts +12 -0
  116. package/dist/full-editable-table/EditableCell.d.ts.map +1 -0
  117. package/dist/full-editable-table/EditableCell.js +8 -0
  118. package/dist/full-editable-table/EditableCell.js.map +1 -0
  119. package/dist/full-editable-table/EditableRow.d.ts +8 -0
  120. package/dist/full-editable-table/EditableRow.d.ts.map +1 -0
  121. package/dist/full-editable-table/EditableRow.js +23 -0
  122. package/dist/full-editable-table/EditableRow.js.map +1 -0
  123. package/dist/full-editable-table/FullEditableTable.d.ts +3 -0
  124. package/dist/full-editable-table/FullEditableTable.d.ts.map +1 -0
  125. package/dist/full-editable-table/FullEditableTable.js +384 -0
  126. package/dist/full-editable-table/FullEditableTable.js.map +1 -0
  127. package/dist/full-editable-table/context.d.ts +4 -0
  128. package/dist/full-editable-table/context.d.ts.map +1 -0
  129. package/dist/full-editable-table/context.js +6 -0
  130. package/dist/full-editable-table/context.js.map +1 -0
  131. package/dist/full-editable-table/index.d.ts +3 -0
  132. package/dist/full-editable-table/index.d.ts.map +1 -0
  133. package/dist/full-editable-table/index.js +2 -0
  134. package/dist/full-editable-table/index.js.map +1 -0
  135. package/dist/full-editable-table/types.d.ts +95 -0
  136. package/dist/full-editable-table/types.d.ts.map +1 -0
  137. package/dist/full-editable-table/types.js +2 -0
  138. package/dist/full-editable-table/types.js.map +1 -0
  139. package/dist/index.d.ts +19 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +15 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/read.d.ts +14 -0
  144. package/dist/read.d.ts.map +1 -0
  145. package/dist/read.js +151 -0
  146. package/dist/read.js.map +1 -0
  147. package/dist/registry.d.ts +29 -0
  148. package/dist/registry.d.ts.map +1 -0
  149. package/dist/registry.js +49 -0
  150. package/dist/registry.js.map +1 -0
  151. package/dist/rowMerge.d.ts +2 -0
  152. package/dist/rowMerge.d.ts.map +1 -0
  153. package/dist/rowMerge.js +32 -0
  154. package/dist/rowMerge.js.map +1 -0
  155. package/dist/tableScroll.d.ts +10 -0
  156. package/dist/tableScroll.d.ts.map +1 -0
  157. package/dist/tableScroll.js +14 -0
  158. package/dist/tableScroll.js.map +1 -0
  159. package/dist/types.d.ts +133 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +2 -0
  162. package/dist/types.js.map +1 -0
  163. package/package.json +60 -4
@@ -0,0 +1,15 @@
1
+ import type { SelectCode, SelectParams, SelectSource } from './types.js';
2
+ /**
3
+ * 源的稳定身份,参与缓存键。
4
+ *
5
+ * 注册名带版本号:重新注册或主动失效后,已挂载的实例会换 key 重新取数,
6
+ * 而不是继续用挂载时捕获的旧函数。
7
+ */
8
+ export declare function selectSourceKey(source?: string | SelectSource, cacheKey?: string): string;
9
+ /** 键序稳定的序列化:对象字面量顺序不同不算参数变化 */
10
+ export declare function stableStringify(value: unknown): string;
11
+ export declare function paramsKeyOf(params?: SelectParams): string;
12
+ /** 来源键固定占第二段,清理单个源的缓存时按它匹配 */
13
+ export declare function candidatesCacheKey(scope: string, sourceKey: string, paramsKey: string): string;
14
+ export declare function resolveCacheKey(scope: string, sourceKey: string, code: SelectCode, paramsKey: string): string;
15
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/biz-select/key.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAetE;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAiBR;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAStD;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED,8BAA8B;AAC9B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 稳定键推导。
3
+ *
4
+ * 缓存和 effect 都只认一个字符串,所以「源是谁」必须能算成一个 key。
5
+ * 四档由强到弱:注册名 → 显式 cacheKey → 纯数据内容 → 函数引用。
6
+ * 只有最后一档会在内联箭头函数下抖动,此时退化为实例级缓存(见设计文档 §7)。
7
+ */
8
+ import { getSelectSourceVersion } from './registry.js';
9
+ import { nameSourceKey } from './source-id.js';
10
+ import { optionsContentKey } from './format.js';
11
+ const fnIds = new WeakMap();
12
+ let fnIdSeq = 0;
13
+ /** 函数引用 → 稳定编号;模块级导出的函数因此可以跨实例共享缓存 */
14
+ function fnId(fn) {
15
+ const hit = fnIds.get(fn);
16
+ if (hit !== undefined)
17
+ return hit;
18
+ fnIdSeq += 1;
19
+ fnIds.set(fn, fnIdSeq);
20
+ return fnIdSeq;
21
+ }
22
+ /**
23
+ * 源的稳定身份,参与缓存键。
24
+ *
25
+ * 注册名带版本号:重新注册或主动失效后,已挂载的实例会换 key 重新取数,
26
+ * 而不是继续用挂载时捕获的旧函数。
27
+ */
28
+ export function selectSourceKey(source, cacheKey) {
29
+ // 注册名本身就是跨实例稳定的身份,版本号也在里面:再传 cacheKey 只会把它盖掉,
30
+ // 连带绕过 invalidate / 重注册的失效机制。cacheKey 只服务内联源。
31
+ if (typeof source === 'string') {
32
+ return nameSourceKey(source, getSelectSourceVersion(source));
33
+ }
34
+ if (cacheKey)
35
+ return `c:${cacheKey}`;
36
+ if (!source)
37
+ return '';
38
+ const parts = [source.load, source.search, source.resolve, source.namespace].map((fn) => fn ? fnId(fn) : '-');
39
+ if (parts.every((part) => part === '-')) {
40
+ // 纯数据源没有闭包,按内容识别才安全,且写在 JSX 里也能命中同一份缓存
41
+ return `d:${optionsContentKey(source.options)}`;
42
+ }
43
+ return `f:${parts.join('.')}`;
44
+ }
45
+ /** 键序稳定的序列化:对象字面量顺序不同不算参数变化 */
46
+ export function stableStringify(value) {
47
+ if (value === undefined)
48
+ return 'undefined';
49
+ if (value === null || typeof value !== 'object')
50
+ return JSON.stringify(value);
51
+ if (Array.isArray(value))
52
+ return `[${value.map(stableStringify).join(',')}]`;
53
+ const record = value;
54
+ const keys = Object.keys(record).sort();
55
+ return `{${keys
56
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
57
+ .join(',')}}`;
58
+ }
59
+ export function paramsKeyOf(params) {
60
+ return stableStringify(params ?? null);
61
+ }
62
+ /** 来源键固定占第二段,清理单个源的缓存时按它匹配 */
63
+ export function candidatesCacheKey(scope, sourceKey, paramsKey) {
64
+ return `${scope}|${sourceKey}|${paramsKey}`;
65
+ }
66
+ export function resolveCacheKey(scope, sourceKey, code, paramsKey) {
67
+ return `${scope}|${sourceKey}|r|${typeof code}:${code}|${paramsKey}`;
68
+ }
69
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/biz-select/key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 能力推导:从源「提供了什么」推「该怎么做」,不看类型标签。
3
+ *
4
+ * 这张推导表同时解释了三种来源(静态 / 有限枚举 / 无限表)——
5
+ * 它们不是三种类型,是三种能力组合。
6
+ */
7
+ import type { SelectParams, SelectSource } from './types.js';
8
+ export type CandidateMode =
9
+ /** 同步全集,无需请求 */
10
+ 'sync'
11
+ /** 异步全集,一次拉完前端过滤 */
12
+ | 'load'
13
+ /** 只有关键词搜索,过滤在后端 */
14
+ | 'search'
15
+ /** 空关键词走全集,有关键词走后端 */
16
+ | 'hybrid'
17
+ /** 没有候选能力,只能按编码解析(只读展示可用) */
18
+ | 'none'
19
+ /** 什么能力都没有,配置非法 */
20
+ | 'invalid';
21
+ export interface SourceCapability {
22
+ source?: SelectSource;
23
+ candidateMode: CandidateMode;
24
+ /** 候选是否需要发请求 */
25
+ needsFetch: boolean;
26
+ /** 是否在前端做关键词过滤 */
27
+ canLocalFilter: boolean;
28
+ /** 搜索交给后端 */
29
+ canSearch: boolean;
30
+ canResolve: boolean;
31
+ requiredParams: string[];
32
+ namespace?: () => string;
33
+ }
34
+ export declare function normalizeSource(source?: SelectSource): SourceCapability;
35
+ /**
36
+ * 必需的查询参数是否齐备。
37
+ * 缺任何一个都不该发请求——用空条件查,可能拿到别的租户/省份的记录。
38
+ */
39
+ export declare function hasRequiredParams(required: string[] | undefined, params: SelectParams | undefined): boolean;
40
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/biz-select/normalize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,aAAa;AACvB,gBAAgB;AACd,MAAM;AACR,oBAAoB;GAClB,MAAM;AACR,oBAAoB;GAClB,QAAQ;AACV,sBAAsB;GACpB,QAAQ;AACV,6BAA6B;GAC3B,MAAM;AACR,mBAAmB;GACjB,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,gBAAgB,CAwBvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,OAAO,CAQT"}
@@ -0,0 +1,46 @@
1
+ export function normalizeSource(source) {
2
+ const hasOptions = Array.isArray(source?.options);
3
+ const canLoad = typeof source?.load === 'function';
4
+ const canSearch = typeof source?.search === 'function';
5
+ const canResolve = typeof source?.resolve === 'function';
6
+ let candidateMode;
7
+ if (hasOptions)
8
+ candidateMode = 'sync';
9
+ else if (canLoad && canSearch)
10
+ candidateMode = 'hybrid';
11
+ else if (canLoad)
12
+ candidateMode = 'load';
13
+ else if (canSearch)
14
+ candidateMode = 'search';
15
+ else if (canResolve)
16
+ candidateMode = 'none';
17
+ else
18
+ candidateMode = 'invalid';
19
+ return {
20
+ source,
21
+ candidateMode,
22
+ needsFetch: candidateMode === 'load' || candidateMode === 'search' || candidateMode === 'hybrid',
23
+ canLocalFilter: hasOptions || canLoad,
24
+ canSearch,
25
+ canResolve,
26
+ requiredParams: source?.requiredParams ?? [],
27
+ namespace: source?.namespace,
28
+ };
29
+ }
30
+ /**
31
+ * 必需的查询参数是否齐备。
32
+ * 缺任何一个都不该发请求——用空条件查,可能拿到别的租户/省份的记录。
33
+ */
34
+ export function hasRequiredParams(required, params) {
35
+ if (!required || !required.length)
36
+ return true;
37
+ return required.every((key) => {
38
+ const value = params?.[key];
39
+ if (value === undefined || value === null || value === '')
40
+ return false;
41
+ if (Array.isArray(value) && value.length === 0)
42
+ return false;
43
+ return true;
44
+ });
45
+ }
46
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/biz-select/normalize.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,MAAM,EAAE,OAAO,KAAK,UAAU,CAAC;IAEzD,IAAI,aAA4B,CAAC;IACjC,IAAI,UAAU;QAAE,aAAa,GAAG,MAAM,CAAC;SAClC,IAAI,OAAO,IAAI,SAAS;QAAE,aAAa,GAAG,QAAQ,CAAC;SACnD,IAAI,OAAO;QAAE,aAAa,GAAG,MAAM,CAAC;SACpC,IAAI,SAAS;QAAE,aAAa,GAAG,QAAQ,CAAC;SACxC,IAAI,UAAU;QAAE,aAAa,GAAG,MAAM,CAAC;;QACvC,aAAa,GAAG,SAAS,CAAC;IAE/B,OAAO;QACL,MAAM;QACN,aAAa;QACb,UAAU,EAAE,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ;QAChG,cAAc,EAAE,UAAU,IAAI,OAAO;QACrC,SAAS;QACT,UAAU;QACV,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE;QAC5C,SAAS,EAAE,MAAM,EAAE,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA8B,EAC9B,MAAgC;IAEhC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { SelectSource } from './types.js';
2
+ export declare function subscribeSelectSourceVersion(name: string, listener: () => void): () => void;
3
+ export declare function registerSelectSource(name: string, source: SelectSource): void;
4
+ /** 批量注册:应用启动时一次写完 */
5
+ export declare function defineSelectSources(map: Record<string, SelectSource>): void;
6
+ export declare function unregisterSelectSource(name: string): void;
7
+ /** 让已挂载的实例重新取数:版本 +1 换 key,同时清掉旧结果 */
8
+ export declare function invalidateSelectSource(name: string): void;
9
+ export declare function getSelectSource(name?: string): SelectSource | undefined;
10
+ export declare function getSelectSourceVersion(name: string): number;
11
+ /** 注册名或内联源统一解析;传对象时直接用,不看名字 */
12
+ export declare function resolveSelectSource(source?: string | SelectSource): SelectSource | undefined;
13
+ export declare function getRegisteredSelectSourceNames(): string[];
14
+ export declare function clearSelectSources(): void;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/biz-select/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAY5C,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQ3F;AAYD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAM7E;AAED,qBAAqB;AACrB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAE3E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKzD;AAED,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,+BAA+B;AAC/B,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAC7B,YAAY,GAAG,SAAS,CAG1B;AAED,wBAAgB,8BAA8B,IAAI,MAAM,EAAE,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 业务下拉数据源注册表。
3
+ *
4
+ * 注册表存在的两个理由:给缓存一个稳定标识,给 schema 一个可序列化的引用
5
+ * (schema 是数据,装不下函数)。
6
+ */
7
+ import { clearSelectCache, clearSelectCacheOfSource } from './cache.js';
8
+ import { nameSourceKey } from './source-id.js';
9
+ const sources = new Map();
10
+ /** 每次注册/失效都递增,进入来源键:已挂载实例因此能感知到源被换掉 */
11
+ const versions = new Map();
12
+ /**
13
+ * 版本订阅。版本号只存在 Map 里,单单改值不会让任何组件重渲染,
14
+ * 所以「失效后已挂载实例重新取数」必须靠订阅把变化推给组件。
15
+ */
16
+ const versionListeners = new Map();
17
+ export function subscribeSelectSourceVersion(name, listener) {
18
+ const listeners = versionListeners.get(name) ?? new Set();
19
+ listeners.add(listener);
20
+ versionListeners.set(name, listeners);
21
+ return () => {
22
+ listeners.delete(listener);
23
+ if (!listeners.size)
24
+ versionListeners.delete(name);
25
+ };
26
+ }
27
+ function bumpVersion(name) {
28
+ versions.set(name, (versions.get(name) ?? 0) + 1);
29
+ versionListeners.get(name)?.forEach((listener) => listener());
30
+ }
31
+ /** 换实现时清掉上一版的缓存,否则旧结果会留到 TTL 结束 */
32
+ function clearPrevious(name, previousVersion) {
33
+ clearSelectCacheOfSource(nameSourceKey(name, previousVersion));
34
+ }
35
+ export function registerSelectSource(name, source) {
36
+ const previous = versions.get(name) ?? 0;
37
+ sources.set(name, source);
38
+ bumpVersion(name);
39
+ // 同名重注册(HMR / 动态切换)后旧缓存不再代表当前实现
40
+ clearPrevious(name, previous);
41
+ }
42
+ /** 批量注册:应用启动时一次写完 */
43
+ export function defineSelectSources(map) {
44
+ for (const [name, source] of Object.entries(map))
45
+ registerSelectSource(name, source);
46
+ }
47
+ export function unregisterSelectSource(name) {
48
+ const previous = versions.get(name) ?? 0;
49
+ sources.delete(name);
50
+ bumpVersion(name);
51
+ clearPrevious(name, previous);
52
+ }
53
+ /** 让已挂载的实例重新取数:版本 +1 换 key,同时清掉旧结果 */
54
+ export function invalidateSelectSource(name) {
55
+ const previous = versions.get(name) ?? 0;
56
+ bumpVersion(name);
57
+ clearPrevious(name, previous);
58
+ }
59
+ export function getSelectSource(name) {
60
+ return name ? sources.get(name) : undefined;
61
+ }
62
+ export function getSelectSourceVersion(name) {
63
+ return versions.get(name) ?? 0;
64
+ }
65
+ /** 注册名或内联源统一解析;传对象时直接用,不看名字 */
66
+ export function resolveSelectSource(source) {
67
+ if (!source)
68
+ return undefined;
69
+ return typeof source === 'string' ? sources.get(source) : source;
70
+ }
71
+ export function getRegisteredSelectSourceNames() {
72
+ return [...sources.keys()];
73
+ }
74
+ export function clearSelectSources() {
75
+ sources.clear();
76
+ versions.clear();
77
+ // 版本 Map 一起清掉了,不主动通知的话订阅方永远等不到变化
78
+ versionListeners.forEach((listeners) => listeners.forEach((listener) => listener()));
79
+ clearSelectCache();
80
+ }
81
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/biz-select/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { normalizeBizSelectSchema } from './compile.js';
2
+ export { normalizeBizSelectSchema };
3
+ export type { BizSelectSchemaProps } from './compile.js';
4
+ export declare function registerBizSelectField(): void;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/biz-select/schema.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,wBAAgB,sBAAsB,IAAI,IAAI,CAgB7C"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * BizSelect 的字段类型注册。
4
+ *
5
+ * 刻意不自动执行:包默认只提供标准 antd 控件,使用方需要时调一次
6
+ * `registerBizSelectField()`。
7
+ */
8
+ import { registerField } from '../registry.js';
9
+ import { BizSelect } from './BizSelect.js';
10
+ import { BizSelectDisplay } from './BizSelectDisplay.js';
11
+ import { normalizeBizSelectSchema } from './compile.js';
12
+ export { normalizeBizSelectSchema };
13
+ export function registerBizSelectField() {
14
+ registerField('BizSelect', {
15
+ component: BizSelect,
16
+ normalize: normalizeBizSelectSchema,
17
+ // 只读态复用同一套解析,不挂载交互组件
18
+ renderRead: (value, props) => (_jsx(BizSelectDisplay, { value: value, ...props })),
19
+ }, { override: true });
20
+ }
21
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/biz-select/schema.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAGpC,MAAM,UAAU,sBAAsB;IACpC,aAAa,CACX,WAAW,EACX;QACE,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,wBAAwB;QACnC,qBAAqB;QACrB,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5B,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAc,KAChB,KAA0C,GAC/C,CACH;KACF,EACD,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 注册名的来源键格式。
3
+ *
4
+ * 单独成一个文件是为了打断 `key.ts ↔ registry.ts` 的循环依赖:
5
+ * 两边都要拼同一个字符串,格式漂移会让缓存清不掉。
6
+ */
7
+ export declare function nameSourceKey(name: string, version: number): string;
8
+ //# sourceMappingURL=source-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-id.d.ts","sourceRoot":"","sources":["../../src/biz-select/source-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 注册名的来源键格式。
3
+ *
4
+ * 单独成一个文件是为了打断 `key.ts ↔ registry.ts` 的循环依赖:
5
+ * 两边都要拼同一个字符串,格式漂移会让缓存清不掉。
6
+ */
7
+ export function nameSourceKey(name, version) {
8
+ return `n:${name}@${version}`;
9
+ }
10
+ //# sourceMappingURL=source-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-id.js","sourceRoot":"","sources":["../../src/biz-select/source-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,OAAO,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * BizSelect 的类型契约。
3
+ *
4
+ * 对外只有一个「数据源」概念:能给出候选、能按编码解析名称。
5
+ * 具体是前端常量、一次拉全量还是关键词翻页,由源**提供了哪些能力**决定,
6
+ * 不再用 kind 之类的标签分类。
7
+ */
8
+ import type { ReactNode } from 'react';
9
+ import type { SelectProps } from 'antd';
10
+ export type SelectCode = string | number;
11
+ /** 契约层的标准选项;后端字段换名在 adapter 层做,不污染组件 */
12
+ export interface BizOption<T = unknown> {
13
+ code: SelectCode;
14
+ name?: string;
15
+ disabled?: boolean;
16
+ /** 原始接口记录,原样带回给业务回调 */
17
+ raw?: T;
18
+ }
19
+ /** 展示模式:编码 / 编码-名称 / 名称 */
20
+ export type DisplayMode = 'V' | 'V-L' | 'L';
21
+ /** 前端过滤时匹配哪些字段 */
22
+ export type SearchFields = 'code' | 'name' | 'both';
23
+ /** 值形态:标量编码,或自带名称的对象 */
24
+ export type ValueMode = 'primitive' | 'object';
25
+ /**
26
+ * 对象值里哪个键装编码、哪个装名称。
27
+ * 默认 `{ code: 'value', name: 'label' }`,兼容存量 `{ value, label }` 协议。
28
+ */
29
+ export interface ValueFieldMap {
30
+ code?: string;
31
+ name?: string;
32
+ }
33
+ export type SelectParams = Record<string, unknown>;
34
+ /** 对象形态的值;具体键名由 valueFields 决定,所以只能约束到 Record */
35
+ export type BizObjectValue = Record<string, unknown>;
36
+ /**
37
+ * 数据源契约。只有能力声明,不认识 URL、method、低代码控件配置。
38
+ *
39
+ * 行为推导:
40
+ * - 只有 `options` → 同步全集,前端过滤
41
+ * - 只有 `load` → 需要时加载一次,前端过滤
42
+ * - 只有 `search` → 后端过滤
43
+ * - `load` + `search` → 空关键词走 load 缓存,有关键词走后端
44
+ */
45
+ export interface SelectSource<P extends SelectParams = SelectParams> {
46
+ /** 同步全集:纯前端常量,没有请求也没有 loading */
47
+ options?: BizOption[];
48
+ /** 异步全集:一次拉完,之后前端过滤 */
49
+ load?: (params: P, signal?: AbortSignal) => Promise<BizOption[]>;
50
+ /** 关键词搜索:分页接口固定取第一页 */
51
+ search?: (keyword: string, params: P, signal?: AbortSignal) => Promise<BizOption[]>;
52
+ /** 按编码精确查:远程回显,不能用模糊搜索冒充 */
53
+ resolve?: (code: SelectCode, params: P, signal?: AbortSignal) => Promise<BizOption | null>;
54
+ /** 缺任一参数就不发请求:用空条件查可能拿到别家数据 */
55
+ requiredParams?: string[];
56
+ /** 租户/权限隔离,参与缓存键 */
57
+ namespace?: () => string;
58
+ }
59
+ /**
60
+ * 受控通道与搜索协议由组件接管,这些属性传进来要么被静默忽略、要么直接把控件弄坏:
61
+ * - `searchValue`:antd 的受控搜索框,传了会锁死用户输入(组件自己维护 keyword)
62
+ * - `showSearch` / `filterOption` / `optionFilterProp` / `onSearch`:搜索行为由源的能力决定
63
+ * - `optionLabelProp`:标签取哪个字段由 displayMode 决定
64
+ */
65
+ type BaseAntProps = Omit<SelectProps, 'value' | 'defaultValue' | 'onChange' | 'options' | 'labelInValue' | 'mode' | 'onSearch' | 'searchValue' | 'showSearch' | 'filterOption' | 'optionFilterProp' | 'optionLabelProp'>;
66
+ /** 与 antd 无关的公共属性:可编辑与只读都吃这一份 */
67
+ interface CoreProps {
68
+ /** 注册名或内联源;schema 里只能是字符串 */
69
+ source?: string | SelectSource;
70
+ /** 传给 load/search/resolve,参与缓存键 */
71
+ params?: SelectParams;
72
+ /** 下拉与回显文本,默认 L */
73
+ displayMode?: DisplayMode;
74
+ /** 前端过滤匹配的字段,缺省随 displayMode 推导 */
75
+ searchFields?: SearchFields;
76
+ /** 详情已带回的名称,省掉一次 resolve */
77
+ seedOptions?: BizOption[];
78
+ /** 远程搜索防抖,默认 300ms */
79
+ debounceMs?: number;
80
+ /** 内联源需要跨实例共享缓存时显式指定 */
81
+ cacheKey?: string;
82
+ /** 门禁提示文案 */
83
+ blockedText?: ReactNode;
84
+ valueMode?: ValueMode;
85
+ valueFields?: ValueFieldMap;
86
+ }
87
+ interface PrimitiveModeProps {
88
+ valueMode?: 'primitive';
89
+ value?: SelectCode | null;
90
+ onChange?: (value: SelectCode | undefined, option?: BizOption) => void;
91
+ }
92
+ interface ObjectModeProps {
93
+ valueMode: 'object';
94
+ value?: BizObjectValue | null;
95
+ onChange?: (value: BizObjectValue | undefined, option?: BizOption) => void;
96
+ }
97
+ export type BizSelectProps = CoreProps & BaseAntProps & (PrimitiveModeProps | ObjectModeProps);
98
+ export interface BizSelectDisplayProps extends CoreProps {
99
+ value?: SelectCode | BizObjectValue | null;
100
+ /** 只读占位 */
101
+ emptyText?: ReactNode;
102
+ }
103
+ export {};
104
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/biz-select/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/biz-select/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import type { BizOption, SearchFields, SelectParams, SelectSource } from './types.js';
2
+ export interface UseCandidatesOptions {
3
+ /**
4
+ * 注册名或内联源。解析与来源键都在 Hook 内完成:
5
+ * 让调用方自己拼 sourceKey 就会绕开注册名的版本身份,组件和 Hook 表现不一致。
6
+ */
7
+ source?: string | SelectSource;
8
+ /** 内联源需要跨实例共享缓存时显式指定;注册名自带稳定键 */
9
+ cacheKey?: string;
10
+ params?: SelectParams;
11
+ /** 前端过滤匹配哪些字段 */
12
+ searchFields: SearchFields;
13
+ debounceMs?: number;
14
+ }
15
+ export interface UseCandidatesResult {
16
+ /** 解析后的来源键,和组件用的是同一个身份;要传给别的 Hook 时直接用它 */
17
+ sourceKey: string;
18
+ /** 当前该给下拉看的候选:本地过滤型已按 keyword 过滤 */
19
+ options: BizOption[];
20
+ /**
21
+ * 回显专用候选:优先取未过滤的全集。
22
+ * 已选中的项可能被关键词过滤掉,用它查名称才不会退回编码。
23
+ */
24
+ echoOptions: BizOption[];
25
+ /** 当前关键词:搜索中不要往结果里补回已选项 */
26
+ keyword: string;
27
+ loading: boolean;
28
+ error: boolean;
29
+ /** 缺少必需参数,主动不查 */
30
+ blocked: boolean;
31
+ /** 展开下拉:`load` 型在这里才发第一次请求 */
32
+ open(): void;
33
+ /** 输入关键词:后端搜索型防抖请求;本地过滤型只更新关键字 */
34
+ search(keyword: string): void;
35
+ /** 收起下拉时清掉关键字:不发请求,避免下次打开看到上次的过滤结果 */
36
+ resetKeyword(): void;
37
+ reload(): void;
38
+ }
39
+ export declare function useCandidates({ source: sourceProp, cacheKey, params, searchFields, debounceMs, }: UseCandidatesOptions): UseCandidatesResult;
40
+ //# sourceMappingURL=useCandidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCandidates.d.ts","sourceRoot":"","sources":["../../src/biz-select/useCandidates.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGnF,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,IAAI,IAAI,IAAI,CAAC;IACb,kCAAkC;IAClC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,sCAAsC;IACtC,YAAY,IAAI,IAAI,CAAC;IACrB,MAAM,IAAI,IAAI,CAAC;CAChB;AAuBD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAgB,GACjB,EAAE,oBAAoB,GAAG,mBAAmB,CA0S5C"}