@quanxiaoxiao/datav 0.3.2 → 0.5.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.
Files changed (64) hide show
  1. package/README.md +680 -165
  2. package/dist/createArrayAccessor.d.ts +2 -0
  3. package/dist/createArrayAccessor.d.ts.map +1 -0
  4. package/dist/createArrayAccessor.js +38 -0
  5. package/dist/createArrayAccessor.js.map +1 -0
  6. package/dist/createDataAccessor.d.ts +2 -0
  7. package/dist/createDataAccessor.d.ts.map +1 -0
  8. package/dist/createDataAccessor.js +23 -0
  9. package/dist/createDataAccessor.js.map +1 -0
  10. package/dist/createDataTransformer.d.ts +14 -0
  11. package/dist/createDataTransformer.d.ts.map +1 -0
  12. package/dist/createDataTransformer.js +124 -0
  13. package/dist/createDataTransformer.js.map +1 -0
  14. package/dist/createPathAccessor.d.ts +2 -0
  15. package/dist/createPathAccessor.d.ts.map +1 -0
  16. package/dist/createPathAccessor.js +38 -0
  17. package/dist/createPathAccessor.js.map +1 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/parseDotPath.d.ts +2 -0
  23. package/dist/parseDotPath.d.ts.map +1 -0
  24. package/dist/parseDotPath.js +14 -0
  25. package/dist/parseDotPath.js.map +1 -0
  26. package/dist/parseValueByType.d.ts +11 -0
  27. package/dist/parseValueByType.d.ts.map +1 -0
  28. package/dist/parseValueByType.js +122 -0
  29. package/dist/parseValueByType.js.map +1 -0
  30. package/dist/utils.d.ts +3 -0
  31. package/dist/utils.d.ts.map +1 -0
  32. package/dist/utils.js +22 -0
  33. package/dist/utils.js.map +1 -0
  34. package/dist/validateExpressSchema.d.ts +7 -0
  35. package/dist/validateExpressSchema.d.ts.map +1 -0
  36. package/dist/validateExpressSchema.js +53 -0
  37. package/dist/validateExpressSchema.js.map +1 -0
  38. package/package.json +50 -10
  39. package/src/createArrayAccessor.test.ts +181 -0
  40. package/src/createArrayAccessor.ts +48 -0
  41. package/src/createDataAccessor.test.ts +220 -0
  42. package/src/createDataAccessor.ts +26 -0
  43. package/src/createDataTransformer.test.ts +847 -0
  44. package/src/createDataTransformer.ts +173 -0
  45. package/src/createPathAccessor.test.ts +217 -0
  46. package/src/createPathAccessor.ts +45 -0
  47. package/src/index.ts +11 -0
  48. package/src/parseDotPath.test.ts +132 -0
  49. package/src/parseDotPath.ts +13 -0
  50. package/src/parseValueByType.test.ts +342 -0
  51. package/src/parseValueByType.ts +165 -0
  52. package/src/utils.test.ts +85 -0
  53. package/src/utils.ts +22 -0
  54. package/src/validateExpressSchema.test.ts +295 -0
  55. package/src/validateExpressSchema.ts +62 -0
  56. package/.editorconfig +0 -13
  57. package/eslint.config.mjs +0 -40
  58. package/src/checkout.mjs +0 -134
  59. package/src/checkout.test.mjs +0 -143
  60. package/src/index.mjs +0 -7
  61. package/src/select/check.mjs +0 -63
  62. package/src/select/check.test.mjs +0 -75
  63. package/src/select/index.mjs +0 -116
  64. package/src/select/index.test.mjs +0 -1120
@@ -0,0 +1,2 @@
1
+ export declare function createArrayAccessor(index: string | number): (array: unknown[]) => unknown;
2
+ //# sourceMappingURL=createArrayAccessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArrayAccessor.d.ts","sourceRoot":"","sources":["../src/createArrayAccessor.ts"],"names":[],"mappings":"AAsBA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,OAAO,CAyBzF"}
@@ -0,0 +1,38 @@
1
+ const getArrayElementAt = (index, array) => {
2
+ const length = array.length;
3
+ if (length === 0) {
4
+ return null;
5
+ }
6
+ if (index < 0) {
7
+ const actualIndex = length + index;
8
+ if (actualIndex < 0) {
9
+ return null;
10
+ }
11
+ return array[actualIndex];
12
+ }
13
+ if (index >= length) {
14
+ return null;
15
+ }
16
+ return array[index];
17
+ };
18
+ export function createArrayAccessor(index) {
19
+ const indexType = typeof index;
20
+ if (indexType !== 'string' && indexType !== 'number') {
21
+ return () => null;
22
+ }
23
+ if (indexType === 'string') {
24
+ if (index === 'length') {
25
+ return (array) => array.length;
26
+ }
27
+ const numericIndex = parseInt(index, 10);
28
+ if (Number.isNaN(numericIndex) || numericIndex.toString() !== index) {
29
+ return () => null;
30
+ }
31
+ return (array) => getArrayElementAt(numericIndex, array);
32
+ }
33
+ if (!Number.isInteger(index)) {
34
+ return () => null;
35
+ }
36
+ return (array) => getArrayElementAt(index, array);
37
+ }
38
+ //# sourceMappingURL=createArrayAccessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArrayAccessor.js","sourceRoot":"","sources":["../src/createArrayAccessor.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,KAAgB,EAAW,EAAE;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;IAE/B,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,CAAC,KAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,KAAK,EAAE,CAAC;YACpE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,KAAgB,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAe,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,KAAgB,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAe,EAAE,KAAK,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createDataAccessor(pathname: string | number | null): (data: unknown) => unknown;
2
+ //# sourceMappingURL=createDataAccessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDataAccessor.d.ts","sourceRoot":"","sources":["../src/createDataAccessor.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAqB/F"}
@@ -0,0 +1,23 @@
1
+ import { createArrayAccessor } from './createArrayAccessor.js';
2
+ import { createPathAccessor } from './createPathAccessor.js';
3
+ import { parseDotPath } from './parseDotPath.js';
4
+ export function createDataAccessor(pathname) {
5
+ if (pathname == null) {
6
+ return () => null;
7
+ }
8
+ if (typeof pathname === 'number') {
9
+ const arrayAccessor = createArrayAccessor(pathname);
10
+ return (data) => {
11
+ if (!Array.isArray(data)) {
12
+ return null;
13
+ }
14
+ return arrayAccessor(data);
15
+ };
16
+ }
17
+ if (typeof pathname === 'string') {
18
+ const parsedPath = parseDotPath(pathname);
19
+ return createPathAccessor(parsedPath);
20
+ }
21
+ return () => null;
22
+ }
23
+ //# sourceMappingURL=createDataAccessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDataAccessor.js","sourceRoot":"","sources":["../src/createDataAccessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,kBAAkB,CAAC,QAAgC;IACjE,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,IAAa,EAAE,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;AACpB,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface SchemaExpress {
2
+ type: 'string' | 'number' | 'boolean' | 'integer' | 'object' | 'array';
3
+ properties?: Record<string, SchemaExpress> | [string, SchemaExpress] | SchemaExpress[];
4
+ resolve?: (value: unknown, root: unknown) => unknown;
5
+ }
6
+ type SchemaTransformer = (data: unknown, root?: unknown) => unknown;
7
+ type TransformFn = (schema: SchemaExpress | [string, SchemaExpress]) => SchemaTransformer;
8
+ /**
9
+ * 创建数据转换器
10
+ * 根据 schema 表达式递归创建数据转换函数
11
+ */
12
+ export declare const createDataTransformer: TransformFn;
13
+ export {};
14
+ //# sourceMappingURL=createDataTransformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDataTransformer.d.ts","sourceRoot":"","sources":["../src/createDataTransformer.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,aAAa,EAAE,CAAC;IACvF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACtD;AAQD,KAAK,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;AAEpE,KAAK,WAAW,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,iBAAiB,CAAC;AA4G1F;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAyCnC,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { createDataAccessor } from './createDataAccessor.js';
2
+ import { parseValueByType } from './parseValueByType.js';
3
+ import { isEmpty, isPlainObject } from './utils.js';
4
+ import { validateExpressSchema } from './validateExpressSchema.js';
5
+ const createObjectTransformer = (properties, createTransform) => {
6
+ const handlers = Object.entries(properties).map(([fieldKey, schema]) => ({
7
+ fieldKey,
8
+ schema,
9
+ transform: createTransform(schema),
10
+ }));
11
+ return (data, root) => {
12
+ const rootData = root ?? data;
13
+ return handlers.reduce((result, handler) => {
14
+ const fieldValue = Array.isArray(handler.schema)
15
+ ? handler.transform(data, rootData)
16
+ : handler.transform(data == null ? data : data[handler.fieldKey], rootData);
17
+ return {
18
+ ...result,
19
+ [handler.fieldKey]: fieldValue,
20
+ };
21
+ }, {});
22
+ };
23
+ };
24
+ /**
25
+ * 处理路径访问的数据提取
26
+ */
27
+ const extractDataByPath = (pathname, data, root) => {
28
+ if (pathname.startsWith('$')) {
29
+ return createDataAccessor(pathname.slice(1))(root);
30
+ }
31
+ return createDataAccessor(pathname)(data);
32
+ };
33
+ /**
34
+ * 创建基础类型转换器
35
+ */
36
+ const createPrimitiveTransformer = (schema) => {
37
+ return (value, root) => {
38
+ const rootData = root ?? value;
39
+ const resolvedValue = schema.resolve ? schema.resolve(value, rootData) : value;
40
+ return parseValueByType(resolvedValue, schema.type);
41
+ };
42
+ };
43
+ /**
44
+ * 创建简单对象转换器(无 properties)
45
+ */
46
+ const createPlainObjectTransformer = () => {
47
+ return (value) => {
48
+ return isPlainObject(value) ? value : {};
49
+ };
50
+ };
51
+ /**
52
+ * 创建数组转换器(tuple 形式的 properties)
53
+ */
54
+ const createArrayTransformer = (properties, createTransform) => {
55
+ const [pathname, itemSchema] = properties;
56
+ const itemTransform = createTransform(itemSchema);
57
+ return (data, root) => {
58
+ const rootData = root ?? data;
59
+ if (!Array.isArray(data)) {
60
+ if (pathname.startsWith('$')) {
61
+ const extractedData = createDataAccessor(pathname.slice(1))(rootData);
62
+ return extractedData == null ? [] : [itemTransform(extractedData, rootData)];
63
+ }
64
+ return [];
65
+ }
66
+ return data.map((item) => {
67
+ if (pathname === '' || pathname === '.') {
68
+ return itemTransform(item, rootData);
69
+ }
70
+ return itemTransform(createDataAccessor(pathname)(item), rootData);
71
+ });
72
+ };
73
+ };
74
+ /**
75
+ * 创建数组对象转换器(对象形式的 properties)
76
+ */
77
+ const createArrayObjectTransformer = (properties, createTransform) => {
78
+ const objectTransform = createObjectTransformer(properties, createTransform);
79
+ return (data, root) => {
80
+ const rootData = root ?? data;
81
+ if (!Array.isArray(data)) {
82
+ return isEmpty(properties) ? [] : [objectTransform(data, rootData)];
83
+ }
84
+ return data.map((item) => objectTransform(item, rootData));
85
+ };
86
+ };
87
+ /**
88
+ * 创建数据转换器
89
+ * 根据 schema 表达式递归创建数据转换函数
90
+ */
91
+ export const createDataTransformer = (schema) => {
92
+ // 处理路径访问形式: [pathname, schema]
93
+ if (Array.isArray(schema)) {
94
+ const [pathname, nestedSchema] = schema;
95
+ if (typeof pathname !== 'string' || !isPlainObject(nestedSchema)) {
96
+ throw new Error(`Invalid schema expression: ${JSON.stringify(schema)}`);
97
+ }
98
+ const nestedTransform = createDataTransformer(nestedSchema);
99
+ return (data, root) => {
100
+ const rootData = root ?? data;
101
+ const extractedData = extractDataByPath(pathname, data, rootData);
102
+ return nestedTransform(extractedData, rootData);
103
+ };
104
+ }
105
+ validateExpressSchema(schema);
106
+ if (['string', 'number', 'boolean', 'integer'].includes(schema.type)) {
107
+ return createPrimitiveTransformer(schema);
108
+ }
109
+ if (schema.resolve) {
110
+ console.warn('Data type `array` or `object` does not support resolve function');
111
+ }
112
+ if (schema.type === 'object') {
113
+ if (isEmpty(schema.properties)) {
114
+ return createPlainObjectTransformer();
115
+ }
116
+ return createObjectTransformer(schema.properties, createDataTransformer);
117
+ }
118
+ if (Array.isArray(schema.properties)) {
119
+ return createArrayTransformer(schema.properties, createDataTransformer);
120
+ }
121
+ // 处理数组对象类型
122
+ return createArrayObjectTransformer(schema.properties, createDataTransformer);
123
+ };
124
+ //# sourceMappingURL=createDataTransformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDataTransformer.js","sourceRoot":"","sources":["../src/createDataTransformer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function createPathAccessor(pathSegments: string[]): (data: unknown) => unknown;
2
+ //# sourceMappingURL=createPathAccessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPathAccessor.d.ts","sourceRoot":"","sources":["../src/createPathAccessor.ts"],"names":[],"mappings":"AA4BA,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAgBrF"}
@@ -0,0 +1,38 @@
1
+ import { createArrayAccessor } from './createArrayAccessor.js';
2
+ const getObjectValue = (key) => (obj) => {
3
+ if (obj == null || !Object.hasOwnProperty.call(obj, key)) {
4
+ return null;
5
+ }
6
+ return obj[key];
7
+ };
8
+ const traversePath = (target, pathSegments) => {
9
+ const [currentKey, ...remainingPath] = pathSegments;
10
+ if (Array.isArray(target)) {
11
+ const value = createArrayAccessor(currentKey)(target);
12
+ if (value == null || remainingPath.length === 0) {
13
+ return value;
14
+ }
15
+ return traversePath(value, remainingPath);
16
+ }
17
+ const value = getObjectValue(currentKey)(target);
18
+ if (value == null || remainingPath.length === 0) {
19
+ return value;
20
+ }
21
+ return traversePath(value, remainingPath);
22
+ };
23
+ export function createPathAccessor(pathSegments) {
24
+ if (pathSegments.length === 0) {
25
+ return (data) => data;
26
+ }
27
+ if (pathSegments.length === 1) {
28
+ const key = pathSegments[0];
29
+ return (data) => {
30
+ if (Array.isArray(data)) {
31
+ return createArrayAccessor(key)(data);
32
+ }
33
+ return getObjectValue(key)(data);
34
+ };
35
+ }
36
+ return (data) => traversePath(data, pathSegments);
37
+ }
38
+ //# sourceMappingURL=createPathAccessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPathAccessor.js","sourceRoot":"","sources":["../src/createPathAccessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAmC,EAAW,EAAE;IACvF,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,MAAe,EAAE,YAAsB,EAAW,EAAE;IACxE,MAAM,CAAC,UAAU,EAAE,GAAG,aAAa,CAAC,GAAG,YAAY,CAAC;IAEpD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,MAAiC,CAAC,CAAC;IAC5E,IAAI,KAAK,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,YAAsB;IACvD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAa,EAAE,EAAE;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAA+B,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAa,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { createDataTransformer } from './createDataTransformer.js';
2
+ import { parseValueByType, type DataType } from './parseValueByType.js';
3
+ import { validateExpressSchema, type ExpressSchema } from './validateExpressSchema.js';
4
+ export { createDataTransformer, parseValueByType, validateExpressSchema, type DataType, type ExpressSchema, };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEvF,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,QAAQ,EACb,KAAK,aAAa,GACnB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import { createDataTransformer } from './createDataTransformer.js';
2
+ import { parseValueByType } from './parseValueByType.js';
3
+ import { validateExpressSchema } from './validateExpressSchema.js';
4
+ export { createDataTransformer, parseValueByType, validateExpressSchema, };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAsB,MAAM,4BAA4B,CAAC;AAEvF,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,GAGtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function parseDotPath(path: string): string[];
2
+ //# sourceMappingURL=parseDotPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseDotPath.d.ts","sourceRoot":"","sources":["../src/parseDotPath.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAYnD"}
@@ -0,0 +1,14 @@
1
+ export function parseDotPath(path) {
2
+ const normalizedPath = path.startsWith('.') ? path.slice(1) : path;
3
+ if (normalizedPath === '') {
4
+ return [];
5
+ }
6
+ const segments = normalizedPath
7
+ .split(/(?<!\\)\./)
8
+ .map((segment) => segment.replace(/\\\./g, '.'));
9
+ if (segments.some((segment) => segment === '')) {
10
+ throw new Error(`Path "${path}" parse failed: contains empty segment`);
11
+ }
12
+ return segments;
13
+ }
14
+ //# sourceMappingURL=parseDotPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseDotPath.js","sourceRoot":"","sources":["../src/parseDotPath.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc;SAC5B,KAAK,CAAC,WAAW,CAAC;SAClB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,wCAAwC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ declare const DATA_TYPE_NUMBER = "number";
2
+ declare const DATA_TYPE_STRING = "string";
3
+ declare const DATA_TYPE_BOOLEAN = "boolean";
4
+ declare const DATA_TYPE_JSON = "json";
5
+ declare const DATA_TYPE_ARRAY = "array";
6
+ declare const DATA_TYPE_OBJECT = "object";
7
+ declare const DATA_TYPE_INTEGER = "integer";
8
+ type DataType = typeof DATA_TYPE_NUMBER | typeof DATA_TYPE_STRING | typeof DATA_TYPE_BOOLEAN | typeof DATA_TYPE_JSON | typeof DATA_TYPE_ARRAY | typeof DATA_TYPE_OBJECT | typeof DATA_TYPE_INTEGER;
9
+ export declare function parseValueByType(value: unknown, type: DataType): unknown;
10
+ export { DATA_TYPE_ARRAY, DATA_TYPE_BOOLEAN, DATA_TYPE_INTEGER, DATA_TYPE_JSON, DATA_TYPE_NUMBER, DATA_TYPE_OBJECT, DATA_TYPE_STRING, type DataType, };
11
+ //# sourceMappingURL=parseValueByType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseValueByType.d.ts","sourceRoot":"","sources":["../src/parseValueByType.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,gBAAgB,WAAW,CAAC;AAClC,QAAA,MAAM,gBAAgB,WAAW,CAAC;AAClC,QAAA,MAAM,iBAAiB,YAAY,CAAC;AACpC,QAAA,MAAM,cAAc,SAAS,CAAC;AAC9B,QAAA,MAAM,eAAe,UAAU,CAAC;AAChC,QAAA,MAAM,gBAAgB,WAAW,CAAC;AAClC,QAAA,MAAM,iBAAiB,YAAY,CAAC;AAEpC,KAAK,QAAQ,GACT,OAAO,gBAAgB,GACvB,OAAO,gBAAgB,GACvB,OAAO,iBAAiB,GACxB,OAAO,cAAc,GACrB,OAAO,eAAe,GACtB,OAAO,gBAAgB,GACvB,OAAO,iBAAiB,CAAC;AAsG7B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAkCxE;AAED,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,QAAQ,GACd,CAAC"}
@@ -0,0 +1,122 @@
1
+ import { isPlainObject } from './utils.js';
2
+ const DATA_TYPE_NUMBER = 'number';
3
+ const DATA_TYPE_STRING = 'string';
4
+ const DATA_TYPE_BOOLEAN = 'boolean';
5
+ const DATA_TYPE_JSON = 'json';
6
+ const DATA_TYPE_ARRAY = 'array';
7
+ const DATA_TYPE_OBJECT = 'object';
8
+ const DATA_TYPE_INTEGER = 'integer';
9
+ const typeTransformers = {
10
+ [DATA_TYPE_STRING]: (value) => {
11
+ if (typeof value === 'string') {
12
+ return value;
13
+ }
14
+ const strVal = value;
15
+ return strVal.toString ? strVal.toString() : JSON.stringify(value);
16
+ },
17
+ [DATA_TYPE_INTEGER]: (value) => {
18
+ if (value === '' || value == null) {
19
+ return null;
20
+ }
21
+ const valueType = typeof value;
22
+ if (valueType !== 'number' && valueType !== 'string') {
23
+ return null;
24
+ }
25
+ const number = Number(value);
26
+ if (Number.isNaN(number)) {
27
+ return null;
28
+ }
29
+ if (String(number) !== String(value)) {
30
+ return null;
31
+ }
32
+ return parseInt(number.toString(), 10);
33
+ },
34
+ [DATA_TYPE_NUMBER]: (value) => {
35
+ if (value === '' || value == null) {
36
+ return null;
37
+ }
38
+ const number = Number(value);
39
+ if (Number.isNaN(number)) {
40
+ return null;
41
+ }
42
+ if (String(number) !== String(value)) {
43
+ return null;
44
+ }
45
+ return number;
46
+ },
47
+ [DATA_TYPE_BOOLEAN]: (value) => {
48
+ if (value !== 'false' && value !== 'true') {
49
+ return null;
50
+ }
51
+ return value === 'true';
52
+ },
53
+ [DATA_TYPE_JSON]: (value) => {
54
+ try {
55
+ return JSON.parse(value);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ },
61
+ [DATA_TYPE_OBJECT]: (value) => {
62
+ try {
63
+ const parsed = JSON.parse(value);
64
+ if (Array.isArray(parsed) || typeof parsed !== 'object') {
65
+ return null;
66
+ }
67
+ return parsed;
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ },
73
+ [DATA_TYPE_ARRAY]: (value) => {
74
+ try {
75
+ const parsed = JSON.parse(value);
76
+ return Array.isArray(parsed) ? parsed : [];
77
+ }
78
+ catch {
79
+ return [];
80
+ }
81
+ },
82
+ };
83
+ // 类型名称映射表(用于 typeof 检查)
84
+ const typeNameMap = {
85
+ [DATA_TYPE_NUMBER]: 'number',
86
+ [DATA_TYPE_STRING]: 'string',
87
+ [DATA_TYPE_INTEGER]: 'integer',
88
+ [DATA_TYPE_BOOLEAN]: 'boolean',
89
+ [DATA_TYPE_JSON]: 'object',
90
+ [DATA_TYPE_ARRAY]: 'object',
91
+ [DATA_TYPE_OBJECT]: 'object',
92
+ };
93
+ export function parseValueByType(value, type) {
94
+ if (type == null) {
95
+ throw new Error('data type is empty');
96
+ }
97
+ if (!Object.hasOwnProperty.call(typeTransformers, type)) {
98
+ throw new Error(`\`${type}\` is an invalid data type`);
99
+ }
100
+ if (value == null) {
101
+ return type === DATA_TYPE_ARRAY ? [] : null;
102
+ }
103
+ const valueType = typeof value;
104
+ if (valueType !== 'string') {
105
+ if (type === DATA_TYPE_INTEGER || type === DATA_TYPE_STRING) {
106
+ return typeTransformers[type](value);
107
+ }
108
+ if (valueType === typeNameMap[type]) {
109
+ if (type === DATA_TYPE_ARRAY) {
110
+ return Array.isArray(value) ? value : [];
111
+ }
112
+ if (type === DATA_TYPE_OBJECT) {
113
+ return isPlainObject(value) ? value : null;
114
+ }
115
+ return value;
116
+ }
117
+ return type === DATA_TYPE_ARRAY ? [] : null;
118
+ }
119
+ return typeTransformers[type](value);
120
+ }
121
+ export { DATA_TYPE_ARRAY, DATA_TYPE_BOOLEAN, DATA_TYPE_INTEGER, DATA_TYPE_JSON, DATA_TYPE_NUMBER, DATA_TYPE_OBJECT, DATA_TYPE_STRING, };
122
+ //# sourceMappingURL=parseValueByType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseValueByType.js","sourceRoot":"","sources":["../src/parseValueByType.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function isPlainObject(value: unknown): boolean;
2
+ export declare function isEmpty(value: unknown): boolean;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW/C"}
package/dist/utils.js ADDED
@@ -0,0 +1,22 @@
1
+ export function isPlainObject(value) {
2
+ if (typeof value !== 'object' || value === null) {
3
+ return false;
4
+ }
5
+ if (Array.isArray(value)) {
6
+ return false;
7
+ }
8
+ return Object.prototype.toString.call(value) === '[object Object]';
9
+ }
10
+ export function isEmpty(value) {
11
+ if (value == null) {
12
+ return true;
13
+ }
14
+ if (Array.isArray(value)) {
15
+ return value.length === 0;
16
+ }
17
+ if (typeof value === 'object') {
18
+ return Object.keys(value).length === 0;
19
+ }
20
+ return false;
21
+ }
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ExpressSchema {
2
+ type: 'string' | 'number' | 'boolean' | 'integer' | 'object' | 'array';
3
+ properties?: Record<string, unknown> | [string, object];
4
+ resolve?: (value: unknown, root: unknown) => unknown;
5
+ }
6
+ export declare function validateExpressSchema(schema: ExpressSchema): void;
7
+ //# sourceMappingURL=validateExpressSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateExpressSchema.d.ts","sourceRoot":"","sources":["../src/validateExpressSchema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACtD;AAiDD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,53 @@
1
+ import Ajv from 'ajv';
2
+ const ajv = new Ajv.default();
3
+ const schemaValidationRules = {
4
+ type: 'object',
5
+ anyOf: [
6
+ // 对象类型规则
7
+ {
8
+ properties: {
9
+ type: { enum: ['object'] },
10
+ properties: { type: 'object' },
11
+ },
12
+ required: ['type', 'properties'],
13
+ },
14
+ // 数组类型规则
15
+ {
16
+ properties: {
17
+ type: { enum: ['array'] },
18
+ properties: {
19
+ anyOf: [
20
+ { type: 'object' },
21
+ {
22
+ type: 'array',
23
+ items: [
24
+ { type: 'string' },
25
+ { type: 'object' },
26
+ ],
27
+ additionalItems: false,
28
+ minItems: 2,
29
+ maxItems: 2,
30
+ },
31
+ ],
32
+ },
33
+ },
34
+ required: ['type', 'properties'],
35
+ },
36
+ // 基础类型规则
37
+ {
38
+ properties: {
39
+ type: { enum: ['string', 'number', 'boolean', 'integer'] },
40
+ },
41
+ required: ['type'],
42
+ },
43
+ ],
44
+ };
45
+ const validateSchema = ajv.compile(schemaValidationRules);
46
+ export function validateExpressSchema(schema) {
47
+ if (!validateSchema(schema)) {
48
+ const schemaStr = JSON.stringify(schema);
49
+ const errorsStr = JSON.stringify(validateSchema.errors);
50
+ throw new Error(`Invalid schema: ${schemaStr}. Validation errors: ${errorsStr}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=validateExpressSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateExpressSchema.js","sourceRoot":"","sources":["../src/validateExpressSchema.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAQtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AAE9B,MAAM,qBAAqB,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE;QACL,SAAS;QACT;YACE,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACjC;QACD,SAAS;QACT;YACE,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBACzB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAClB;4BACE,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,EAAE,IAAI,EAAE,QAAQ,EAAE;gCAClB,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACnB;4BACD,eAAe,EAAE,KAAK;4BACtB,QAAQ,EAAE,CAAC;4BACX,QAAQ,EAAE,CAAC;yBACZ;qBACF;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACjC;QACD,SAAS;QACT;YACE,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;aAC3D;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}