@kcuf/helper-data 0.2.3 → 0.3.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/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.2.3 2024/11/05 @驳是
3
+ ## 0.3.0 2025/12/18 @驳是
4
+
5
+ * FEAT 新增 `normalizeTreeList`
6
+
7
+ ## 0.2.3 2025/10/26 @驳是
4
8
 
5
9
  * FEAT 新增 `isEmptyPagedList`
6
10
 
@@ -52,6 +52,12 @@ Object.defineProperty(exports, "normalizeTime", {
52
52
  return _normalizeTime.default;
53
53
  }
54
54
  });
55
+ Object.defineProperty(exports, "normalizeTreeList", {
56
+ enumerable: true,
57
+ get: function get() {
58
+ return _normalizeTreeList.default;
59
+ }
60
+ });
55
61
  var _normalizeId = _interopRequireDefault(require("./normalize-id"));
56
62
  var _normalizeBoolean = _interopRequireDefault(require("./normalize-boolean"));
57
63
  var _normalizeNumber = _interopRequireDefault(require("./normalize-number"));
@@ -59,4 +65,5 @@ var _normalizeEnum = _interopRequireDefault(require("./normalize-enum"));
59
65
  var _normalizeTime = _interopRequireDefault(require("./normalize-time"));
60
66
  var _normalizePagedList = _interopRequireDefault(require("./normalize-paged-list"));
61
67
  var _normalizePagedListUncertain = _interopRequireDefault(require("./normalize-paged-list-uncertain"));
68
+ var _normalizeTreeList = _interopRequireDefault(require("./normalize-tree-list"));
62
69
  var _isEmptyPagedList = _interopRequireDefault(require("./is-empty-paged-list"));
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = normalizeTreeList;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ /**
10
+ * 将平铺的数据转成树节点列表
11
+ */
12
+ function normalizeTreeList(list) {
13
+ var nodeMap = new Map();
14
+ var treeList = list.map(function (v) {
15
+ var treeItem = (0, _objectSpread2.default)({}, v);
16
+ nodeMap.set(treeItem.id, treeItem);
17
+ return treeItem;
18
+ });
19
+ function putToParent(o) {
20
+ if (!o.parentId) {
21
+ return;
22
+ }
23
+ var parentNode = nodeMap.get(o.parentId);
24
+ if (parentNode) {
25
+ var _parentNode$children;
26
+ (_parentNode$children = parentNode.children) !== null && _parentNode$children !== void 0 ? _parentNode$children : parentNode.children = [];
27
+ parentNode.children.push(o);
28
+ } else {
29
+ o.parentId = ''; // wrong parent
30
+ }
31
+ }
32
+ treeList.forEach(function (v) {
33
+ return putToParent(v);
34
+ });
35
+ return treeList.filter(function (v) {
36
+ return !v.parentId;
37
+ }); // all top-level nodes
38
+ }
@@ -5,5 +5,6 @@ export { default as normalizeEnum } from './normalize-enum';
5
5
  export { default as normalizeTime } from './normalize-time';
6
6
  export { default as normalizePagedList } from './normalize-paged-list';
7
7
  export { default as normalizePagedListUncertain } from './normalize-paged-list-uncertain';
8
+ export { default as normalizeTreeList } from './normalize-tree-list';
8
9
  export { default as isEmptyPagedList } from './is-empty-paged-list';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default","normalizeId","normalizeBoolean","normalizeNumber","normalizeEnum","normalizeTime","normalizePagedList","normalizePagedListUncertain","isEmptyPagedList"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as normalizeId } from './normalize-id';\nexport { default as normalizeBoolean } from './normalize-boolean';\nexport { default as normalizeNumber } from './normalize-number';\nexport { default as normalizeEnum } from './normalize-enum';\nexport { default as normalizeTime } from './normalize-time';\nexport { default as normalizePagedList } from './normalize-paged-list';\nexport { default as normalizePagedListUncertain } from './normalize-paged-list-uncertain';\n\nexport { default as isEmptyPagedList } from './is-empty-paged-list';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,WAAW,QAAQ,gBAAgB;AACvD,SAASD,OAAO,IAAIE,gBAAgB,QAAQ,qBAAqB;AACjE,SAASF,OAAO,IAAIG,eAAe,QAAQ,oBAAoB;AAC/D,SAASH,OAAO,IAAII,aAAa,QAAQ,kBAAkB;AAC3D,SAASJ,OAAO,IAAIK,aAAa,QAAQ,kBAAkB;AAC3D,SAASL,OAAO,IAAIM,kBAAkB,QAAQ,wBAAwB;AACtE,SAASN,OAAO,IAAIO,2BAA2B,QAAQ,kCAAkC;AAEzF,SAASP,OAAO,IAAIQ,gBAAgB,QAAQ,uBAAuB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["default","normalizeId","normalizeBoolean","normalizeNumber","normalizeEnum","normalizeTime","normalizePagedList","normalizePagedListUncertain","normalizeTreeList","isEmptyPagedList"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as normalizeId } from './normalize-id';\nexport { default as normalizeBoolean } from './normalize-boolean';\nexport { default as normalizeNumber } from './normalize-number';\nexport { default as normalizeEnum } from './normalize-enum';\nexport { default as normalizeTime } from './normalize-time';\nexport { default as normalizePagedList } from './normalize-paged-list';\nexport { default as normalizePagedListUncertain } from './normalize-paged-list-uncertain';\nexport { default as normalizeTreeList } from './normalize-tree-list';\n\nexport { default as isEmptyPagedList } from './is-empty-paged-list';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,WAAW,QAAQ,gBAAgB;AACvD,SAASD,OAAO,IAAIE,gBAAgB,QAAQ,qBAAqB;AACjE,SAASF,OAAO,IAAIG,eAAe,QAAQ,oBAAoB;AAC/D,SAASH,OAAO,IAAII,aAAa,QAAQ,kBAAkB;AAC3D,SAASJ,OAAO,IAAIK,aAAa,QAAQ,kBAAkB;AAC3D,SAASL,OAAO,IAAIM,kBAAkB,QAAQ,wBAAwB;AACtE,SAASN,OAAO,IAAIO,2BAA2B,QAAQ,kCAAkC;AACzF,SAASP,OAAO,IAAIQ,iBAAiB,QAAQ,uBAAuB;AAEpE,SAASR,OAAO,IAAIS,gBAAgB,QAAQ,uBAAuB","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
+ /**
3
+ * 将平铺的数据转成树节点列表
4
+ */
5
+ export default function normalizeTreeList(list) {
6
+ var nodeMap = new Map();
7
+ var treeList = list.map(function (v) {
8
+ var treeItem = _objectSpread({}, v);
9
+ nodeMap.set(treeItem.id, treeItem);
10
+ return treeItem;
11
+ });
12
+ function putToParent(o) {
13
+ if (!o.parentId) {
14
+ return;
15
+ }
16
+ var parentNode = nodeMap.get(o.parentId);
17
+ if (parentNode) {
18
+ var _parentNode$children;
19
+ (_parentNode$children = parentNode.children) !== null && _parentNode$children !== void 0 ? _parentNode$children : parentNode.children = [];
20
+ parentNode.children.push(o);
21
+ } else {
22
+ o.parentId = ''; // wrong parent
23
+ }
24
+ }
25
+ treeList.forEach(function (v) {
26
+ return putToParent(v);
27
+ });
28
+ return treeList.filter(function (v) {
29
+ return !v.parentId;
30
+ }); // all top-level nodes
31
+ }
32
+ //# sourceMappingURL=normalize-tree-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-tree-list.js","names":["normalizeTreeList","list","nodeMap","Map","treeList","map","v","treeItem","_objectSpread","set","id","putToParent","o","parentId","parentNode","get","_parentNode$children","children","push","forEach","filter"],"sources":["../../../src/helper/normalize-tree-list.ts"],"sourcesContent":["import {\n IBaseDataId,\n IBaseDataParentId\n} from '../types';\n\ninterface IBaseItem extends IBaseDataId, IBaseDataParentId {}\n\ntype TTreeItem<T extends IBaseItem> = T & {\n children?: TTreeItem<T>[];\n};\n\n/**\n * 将平铺的数据转成树节点列表\n */\nexport default function normalizeTreeList<T extends IBaseItem>(list: T[]): TTreeItem<T>[] {\n const nodeMap = new Map<string, TTreeItem<T>>();\n const treeList: TTreeItem<T>[] = list.map((v: T) => {\n const treeItem: TTreeItem<T> = { // shallow clone\n ...v\n };\n \n nodeMap.set(treeItem.id, treeItem);\n \n return treeItem;\n });\n \n function putToParent(o: TTreeItem<T>): void {\n if (!o.parentId) {\n return;\n }\n \n const parentNode = nodeMap.get(o.parentId);\n \n if (parentNode) {\n parentNode.children ??= [];\n \n parentNode.children.push(o);\n } else {\n o.parentId = ''; // wrong parent\n }\n }\n \n treeList.forEach(v => putToParent(v));\n \n return treeList.filter(v => !v.parentId); // all top-level nodes\n}\n"],"mappings":";AAWA;AACA;AACA;AACA,eAAe,SAASA,iBAAiBA,CAAsBC,IAAS,EAAkB;EACxF,IAAMC,OAAO,GAAG,IAAIC,GAAG,CAAuB,CAAC;EAC/C,IAAMC,QAAwB,GAAGH,IAAI,CAACI,GAAG,CAAC,UAACC,CAAI,EAAK;IAClD,IAAMC,QAAsB,GAAAC,aAAA,KACvBF,CAAC,CACL;IAEDJ,OAAO,CAACO,GAAG,CAACF,QAAQ,CAACG,EAAE,EAAEH,QAAQ,CAAC;IAElC,OAAOA,QAAQ;EACjB,CAAC,CAAC;EAEF,SAASI,WAAWA,CAACC,CAAe,EAAQ;IAC1C,IAAI,CAACA,CAAC,CAACC,QAAQ,EAAE;MACf;IACF;IAEA,IAAMC,UAAU,GAAGZ,OAAO,CAACa,GAAG,CAACH,CAAC,CAACC,QAAQ,CAAC;IAE1C,IAAIC,UAAU,EAAE;MAAA,IAAAE,oBAAA;MACd,CAAAA,oBAAA,GAAAF,UAAU,CAACG,QAAQ,cAAAD,oBAAA,cAAAA,oBAAA,GAAnBF,UAAU,CAACG,QAAQ,GAAK,EAAE;MAE1BH,UAAU,CAACG,QAAQ,CAACC,IAAI,CAACN,CAAC,CAAC;IAC7B,CAAC,MAAM;MACLA,CAAC,CAACC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnB;EACF;EAEAT,QAAQ,CAACe,OAAO,CAAC,UAAAb,CAAC;IAAA,OAAIK,WAAW,CAACL,CAAC,CAAC;EAAA,EAAC;EAErC,OAAOF,QAAQ,CAACgB,MAAM,CAAC,UAAAd,CAAC;IAAA,OAAI,CAACA,CAAC,CAACO,QAAQ;EAAA,EAAC,CAAC,CAAC;AAC5C","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './helper';\n\nexport type {\n // 参数标准化\n IBaseParamsPage as BaseParamsPage,\n IBaseParamsPageWithQ as BaseParamsPageWithQ,\n IBaseParamsCursorPage as BaseParamsCursorPage,\n IBaseParamsCursorPageWithQ as BaseParamsCursorPageWithQ,\n \n // 数据标准化\n IBaseDataId as BaseDataId,\n IBaseDataName as BaseDataName,\n IBaseDataIdName as BaseDataIdName,\n IBaseDataTitle as BaseDataTitle,\n IBaseDataDescription as BaseDataDescription,\n IBaseDataContent as BaseDataContent,\n IBaseDataTimeCreated as BaseDataTimeCreated,\n IBaseDataTimeUpdated as BaseDataTimeModified,\n IBaseDataTimes as BaseDataTimes,\n IBaseDataCreator as BaseDataCreator,\n IBaseDataUpdater as BaseDataUpdater,\n \n // 数据标准化(泛型)\n IPagedList as PagedList,\n IPagedCursorList as PagedCursorList,\n IPagedListUncertain as PagedListUncertain\n} from './types';\n"],"mappings":"AAAA,cAAc,UAAU;AAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './helper';\n\nexport type {\n // 参数标准化\n IBaseParamsPage as BaseParamsPage,\n IBaseParamsPageWithQ as BaseParamsPageWithQ,\n IBaseParamsCursorPage as BaseParamsCursorPage,\n IBaseParamsCursorPageWithQ as BaseParamsCursorPageWithQ,\n \n // 数据标准化\n IBaseDataId as BaseDataId,\n IBaseDataParentId as BaseDataParentId,\n IBaseDataName as BaseDataName,\n IBaseDataIdName as BaseDataIdName,\n IBaseDataTitle as BaseDataTitle,\n IBaseDataDescription as BaseDataDescription,\n IBaseDataContent as BaseDataContent,\n IBaseDataTimeCreated as BaseDataTimeCreated,\n IBaseDataTimeUpdated as BaseDataTimeModified,\n IBaseDataTimes as BaseDataTimes,\n IBaseDataCreator as BaseDataCreator,\n IBaseDataUpdater as BaseDataUpdater,\n \n // 数据标准化(泛型)\n IPagedList as PagedList,\n IPagedCursorList as PagedCursorList,\n IPagedListUncertain as PagedListUncertain\n} from './types';\n"],"mappings":"AAAA,cAAc,UAAU;AAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"base-data.js","names":[],"sources":["../../../src/types/base-data.ts"],"sourcesContent":["// 基础类型 mixin,用于继承,统一前缀 BaseData\n\n/**\n * 「ID」标准化\n */\nexport interface IBaseDataId {\n id: string;\n}\n\n/**\n * 「名称」标准化\n */\nexport interface IBaseDataName {\n name: string;\n}\n\n/**\n * 「标题」标准化\n */\nexport interface IBaseDataTitle {\n title: string;\n}\n\n/**\n * 「内容」标准化\n */\nexport interface IBaseDataContent {\n content: string;\n}\n\n/**\n * 「描述」标准化\n */\nexport interface IBaseDataDescription {\n description: string;\n}\n\n/**\n * id + name\n */\nexport interface IBaseDataIdName extends IBaseDataId, IBaseDataName {}\n\n/**\n * 「创建时间」标准化\n */\nexport interface IBaseDataTimeCreated {\n timeCreated: Date;\n}\n\n/**\n * 「更新时间」标准化\n */\nexport interface IBaseDataTimeUpdated {\n timeUpdated: Date;\n}\n\n/**\n * timeCreated + timeUpdated\n */\nexport interface IBaseDataTimes extends IBaseDataTimeCreated, IBaseDataTimeUpdated {}\n\n/**\n * 「创建人」标准化\n */\nexport interface IBaseDataCreator {\n creator: IBaseDataIdName;\n}\n\n/**\n * 「更新人」标准化\n */\nexport interface IBaseDataUpdater {\n updater: IBaseDataIdName;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"base-data.js","names":[],"sources":["../../../src/types/base-data.ts"],"sourcesContent":["// 基础类型 mixin,用于继承,统一前缀 BaseData\n\n/**\n * 「ID」标准化\n */\nexport interface IBaseDataId {\n id: string;\n}\n\n/**\n * 「父 ID」标准化\n */\nexport interface IBaseDataParentId {\n parentId: string;\n}\n\n/**\n * 「名称」标准化\n */\nexport interface IBaseDataName {\n name: string;\n}\n\n/**\n * 「标题」标准化\n */\nexport interface IBaseDataTitle {\n title: string;\n}\n\n/**\n * 「内容」标准化\n */\nexport interface IBaseDataContent {\n content: string;\n}\n\n/**\n * 「描述」标准化\n */\nexport interface IBaseDataDescription {\n description: string;\n}\n\n/**\n * id + name\n */\nexport interface IBaseDataIdName extends IBaseDataId, IBaseDataName {}\n\n/**\n * 「创建时间」标准化\n */\nexport interface IBaseDataTimeCreated {\n timeCreated: Date;\n}\n\n/**\n * 「更新时间」标准化\n */\nexport interface IBaseDataTimeUpdated {\n timeUpdated: Date;\n}\n\n/**\n * timeCreated + timeUpdated\n */\nexport interface IBaseDataTimes extends IBaseDataTimeCreated, IBaseDataTimeUpdated {}\n\n/**\n * 「创建人」标准化\n */\nexport interface IBaseDataCreator {\n creator: IBaseDataIdName;\n}\n\n/**\n * 「更新人」标准化\n */\nexport interface IBaseDataUpdater {\n updater: IBaseDataIdName;\n}\n"],"mappings":"","ignoreList":[]}
@@ -5,4 +5,5 @@ export { default as normalizeEnum } from './normalize-enum';
5
5
  export { default as normalizeTime } from './normalize-time';
6
6
  export { default as normalizePagedList } from './normalize-paged-list';
7
7
  export { default as normalizePagedListUncertain } from './normalize-paged-list-uncertain';
8
+ export { default as normalizeTreeList } from './normalize-tree-list';
8
9
  export { default as isEmptyPagedList } from './is-empty-paged-list';
@@ -0,0 +1,11 @@
1
+ import { IBaseDataId, IBaseDataParentId } from '../types';
2
+ interface IBaseItem extends IBaseDataId, IBaseDataParentId {
3
+ }
4
+ type TTreeItem<T extends IBaseItem> = T & {
5
+ children?: TTreeItem<T>[];
6
+ };
7
+ /**
8
+ * 将平铺的数据转成树节点列表
9
+ */
10
+ export default function normalizeTreeList<T extends IBaseItem>(list: T[]): TTreeItem<T>[];
11
+ export {};
@@ -1,2 +1,2 @@
1
1
  export * from './helper';
2
- export type { IBaseParamsPage as BaseParamsPage, IBaseParamsPageWithQ as BaseParamsPageWithQ, IBaseParamsCursorPage as BaseParamsCursorPage, IBaseParamsCursorPageWithQ as BaseParamsCursorPageWithQ, IBaseDataId as BaseDataId, IBaseDataName as BaseDataName, IBaseDataIdName as BaseDataIdName, IBaseDataTitle as BaseDataTitle, IBaseDataDescription as BaseDataDescription, IBaseDataContent as BaseDataContent, IBaseDataTimeCreated as BaseDataTimeCreated, IBaseDataTimeUpdated as BaseDataTimeModified, IBaseDataTimes as BaseDataTimes, IBaseDataCreator as BaseDataCreator, IBaseDataUpdater as BaseDataUpdater, IPagedList as PagedList, IPagedCursorList as PagedCursorList, IPagedListUncertain as PagedListUncertain } from './types';
2
+ export type { IBaseParamsPage as BaseParamsPage, IBaseParamsPageWithQ as BaseParamsPageWithQ, IBaseParamsCursorPage as BaseParamsCursorPage, IBaseParamsCursorPageWithQ as BaseParamsCursorPageWithQ, IBaseDataId as BaseDataId, IBaseDataParentId as BaseDataParentId, IBaseDataName as BaseDataName, IBaseDataIdName as BaseDataIdName, IBaseDataTitle as BaseDataTitle, IBaseDataDescription as BaseDataDescription, IBaseDataContent as BaseDataContent, IBaseDataTimeCreated as BaseDataTimeCreated, IBaseDataTimeUpdated as BaseDataTimeModified, IBaseDataTimes as BaseDataTimes, IBaseDataCreator as BaseDataCreator, IBaseDataUpdater as BaseDataUpdater, IPagedList as PagedList, IPagedCursorList as PagedCursorList, IPagedListUncertain as PagedListUncertain } from './types';
@@ -4,6 +4,12 @@
4
4
  export interface IBaseDataId {
5
5
  id: string;
6
6
  }
7
+ /**
8
+ * 「父 ID」标准化
9
+ */
10
+ export interface IBaseDataParentId {
11
+ parentId: string;
12
+ }
7
13
  /**
8
14
  * 「名称」标准化
9
15
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kcuf/helper-data",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Data normalizer helpers and loading stuff to make all frontend data processing sane.",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -12,7 +12,7 @@
12
12
  "type": "git",
13
13
  "url": "git+https://github.com/justnewbee/kcuf.git"
14
14
  },
15
- "homepage": "https://github.com/justnewbee/kcuf/tree/master/packages-helper/helper-data",
15
+ "homepage": "https://github.com/justnewbee/kcuf/tree/main/packages-helper/helper-data",
16
16
  "bugs": "https://github.com/justnewbee/kcuf/issues",
17
17
  "author": {
18
18
  "name": "Jianchun Wang",
@@ -27,12 +27,12 @@
27
27
  "@babel/plugin-transform-runtime": "^7.28.5",
28
28
  "@babel/preset-env": "^7.28.5",
29
29
  "@babel/preset-typescript": "^7.28.5",
30
- "rimraf": "^6.0.1",
30
+ "rimraf": "^6.1.2",
31
31
  "typescript": "^5.9.3",
32
- "@kcuf/ts-config": "^0.0.1"
32
+ "@kcuf/ts-config": "^0.1.0"
33
33
  },
34
34
  "peerDependencies": {
35
- "@babel/runtime": "^7.x"
35
+ "@babel/runtime": ">=7.0.0"
36
36
  },
37
37
  "scripts": {
38
38
  "build:clean": "rimraf dist",