semanticdb-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/representation.d.ts +7 -0
- package/dist/common/representation.js +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/logicform/logicform.d.ts +33 -0
- package/dist/logicform/logicform.js +2 -0
- package/dist/logicform/logicform.utils.d.ts +2 -0
- package/dist/logicform/logicform.utils.js +36 -0
- package/dist/schema/property.d.ts +69 -0
- package/dist/schema/property.js +2 -0
- package/dist/schema/schema.d.ts +25 -0
- package/dist/schema/schema.js +2 -0
- package/dist/schema/schema.utils/getDrilldownDimensions.d.ts +3 -0
- package/dist/schema/schema.utils/getDrilldownDimensions.js +104 -0
- package/dist/schema/schema.utils.d.ts +16 -0
- package/dist/schema/schema.utils.js +52 -0
- package/package.json +43 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 系统支持的图表类型
|
|
3
|
+
* - 基础图表:表格、饼图、柱状图(横向/纵向/堆积)、折线图、散点图、面积图
|
|
4
|
+
* - 高级图表:气泡图、漏斗图、仪表盘、热力图、直方图、帕累托图、雷达图、词云、地图
|
|
5
|
+
* - 其他可视化:KPI卡片、实体详情卡片、报告、文本、视频列表、图片列表、RAG
|
|
6
|
+
*/
|
|
7
|
+
export declare type RepresentationType = 'value' | 'table' | 'pie' | 'bar' | 'column' | 'stackedColumn' | 'line' | 'scatter' | 'area' | 'bubble' | 'funnel' | 'guage' | 'heatmap' | 'histogram' | 'pareto' | 'radar' | 'wordCloud' | 'map' | 'entity' | 'report' | 'text' | 'videos' | 'images' | 'rag';
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./schema/property"), exports);
|
|
18
|
+
__exportStar(require("./schema/schema"), exports);
|
|
19
|
+
__exportStar(require("./common/representation"), exports);
|
|
20
|
+
__exportStar(require("./schema/schema.utils"), exports);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RepresentationType } from '../common/representation';
|
|
2
|
+
import { SchemaType } from '../schema/schema';
|
|
3
|
+
export declare type QueryType = {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
};
|
|
6
|
+
export interface PredItemType {
|
|
7
|
+
pred?: string | PredItemType;
|
|
8
|
+
operator?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
query?: QueryType;
|
|
11
|
+
type?: string;
|
|
12
|
+
schema?: string;
|
|
13
|
+
by?: string;
|
|
14
|
+
params?: any[];
|
|
15
|
+
}
|
|
16
|
+
export interface GroupbyItemType {
|
|
17
|
+
_id: string;
|
|
18
|
+
level?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
schema?: SchemaType;
|
|
21
|
+
}
|
|
22
|
+
export interface LogicformType {
|
|
23
|
+
schema: string;
|
|
24
|
+
query?: QueryType;
|
|
25
|
+
preds?: PredItemType[];
|
|
26
|
+
groupby?: GroupbyItemType[];
|
|
27
|
+
sort?: QueryType;
|
|
28
|
+
having?: QueryType;
|
|
29
|
+
limit?: number;
|
|
30
|
+
limitBy?: number;
|
|
31
|
+
skip?: number;
|
|
32
|
+
representation?: RepresentationType;
|
|
33
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isDimensionInQuery = void 0;
|
|
4
|
+
const isDimensionInQuery = (query, dimension) => {
|
|
5
|
+
const chain = dimension.split('_');
|
|
6
|
+
let chainedQuery = query;
|
|
7
|
+
for (let i = 0; i < chain.length; i++) {
|
|
8
|
+
const item = chain[i];
|
|
9
|
+
if (!(chainedQuery && chainedQuery[item])) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
// last one
|
|
13
|
+
if (i === chain.length - 1) {
|
|
14
|
+
if (typeof chainedQuery[item] !== 'object' || !chainedQuery[item].query) {
|
|
15
|
+
if (typeof chainedQuery[item] === 'object' && '$exists' in chainedQuery[item]) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (chainedQuery[item].entity_id) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// TODO: 如果是name property,也行的,现在先简单搞一个
|
|
24
|
+
if (chainedQuery[item].query && chainedQuery[item].query.别名) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (typeof chainedQuery[item] !== 'object' || !chainedQuery[item].query) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
chainedQuery = chainedQuery[item].query;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
exports.isDimensionInQuery = isDimensionInQuery;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { RepresentationType } from '../common/representation';
|
|
2
|
+
import { SchemaType } from './schema';
|
|
3
|
+
export declare type PropertyTypeType = 'ID' | 'timestamp' | 'name' | 'humanName' | 'category' | 'string' | 'tag' | 'image' | 'file' | 'number' | 'int' | 'currency' | 'percentage' | 'duration' | 'order' | 'boolean' | 'date' | 'start_date' | 'end_date' | 'object';
|
|
4
|
+
export declare type PropertyTypePrimalType = 'string' | 'number' | 'boolean' | 'date' | 'object';
|
|
5
|
+
export interface PropertyTypeDraft {
|
|
6
|
+
_sid?: string;
|
|
7
|
+
_id?: string;
|
|
8
|
+
name: string;
|
|
9
|
+
syno?: string[];
|
|
10
|
+
description?: string;
|
|
11
|
+
constraints?: {
|
|
12
|
+
required?: boolean;
|
|
13
|
+
unique?: boolean;
|
|
14
|
+
enum?: string[];
|
|
15
|
+
};
|
|
16
|
+
type: PropertyTypeType;
|
|
17
|
+
primal_type?: PropertyTypePrimalType;
|
|
18
|
+
isArray?: boolean;
|
|
19
|
+
is_dynamic?: boolean;
|
|
20
|
+
is_name?: boolean;
|
|
21
|
+
is_categorical?: boolean;
|
|
22
|
+
ref?: string;
|
|
23
|
+
schema?: SchemaType;
|
|
24
|
+
granularity?: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'week' | 'year';
|
|
25
|
+
is_additive?: boolean;
|
|
26
|
+
use_minus_on_mom?: boolean;
|
|
27
|
+
is_supplementary?: boolean;
|
|
28
|
+
stats?: {
|
|
29
|
+
min?: number;
|
|
30
|
+
max?: number;
|
|
31
|
+
total?: number;
|
|
32
|
+
avg?: number;
|
|
33
|
+
distincts?: string[];
|
|
34
|
+
};
|
|
35
|
+
ui?: {
|
|
36
|
+
name?: boolean;
|
|
37
|
+
formatter?: string;
|
|
38
|
+
formatters?: {
|
|
39
|
+
min?: number;
|
|
40
|
+
max?: number;
|
|
41
|
+
formatter: string;
|
|
42
|
+
prefix?: string;
|
|
43
|
+
postfix?: string;
|
|
44
|
+
role?: string;
|
|
45
|
+
}[];
|
|
46
|
+
show_in_detail_only?: boolean;
|
|
47
|
+
hide?: boolean;
|
|
48
|
+
ellipsis?: boolean;
|
|
49
|
+
editable?: boolean;
|
|
50
|
+
type?: 'file';
|
|
51
|
+
startLevel?: string;
|
|
52
|
+
representation?: RepresentationType;
|
|
53
|
+
delimiter?: boolean;
|
|
54
|
+
};
|
|
55
|
+
unit?: string;
|
|
56
|
+
level?: string;
|
|
57
|
+
udf?: any;
|
|
58
|
+
versioned?: boolean;
|
|
59
|
+
can_drilldown?: boolean;
|
|
60
|
+
analyzer?: {
|
|
61
|
+
customSummary?: string;
|
|
62
|
+
drilldown?: any[];
|
|
63
|
+
};
|
|
64
|
+
recommend_kpis?: any[];
|
|
65
|
+
components?: any[];
|
|
66
|
+
}
|
|
67
|
+
export interface PropertyType extends Omit<PropertyTypeDraft, '_sid' | '_id' | 'constraints' | 'primal_type' | 'ui'>, Required<Pick<PropertyTypeDraft, '_sid' | '_id' | 'constraints' | 'primal_type' | 'ui'>> {
|
|
68
|
+
schemaID?: string;
|
|
69
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GroupbyItemType } from '../logicform/logicform';
|
|
2
|
+
import { PropertyTypeDraft, PropertyType } from './property';
|
|
3
|
+
export interface HierarchyType {
|
|
4
|
+
name: string;
|
|
5
|
+
syno?: string[];
|
|
6
|
+
code_length: number;
|
|
7
|
+
use_full_length?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SchemaTypeDraft {
|
|
10
|
+
_id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
type: 'entity' | 'event';
|
|
13
|
+
syno?: string[];
|
|
14
|
+
properties: PropertyTypeDraft[];
|
|
15
|
+
tag?: string[];
|
|
16
|
+
hierarchy?: [HierarchyType, ...HierarchyType[]];
|
|
17
|
+
analyzer?: {
|
|
18
|
+
drilldown?: string | GroupbyItemType[];
|
|
19
|
+
drilldown_blacklist?: string[];
|
|
20
|
+
};
|
|
21
|
+
drilldown?: GroupbyItemType[];
|
|
22
|
+
}
|
|
23
|
+
export interface SchemaType extends SchemaTypeDraft {
|
|
24
|
+
properties: PropertyType[];
|
|
25
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { GroupbyItemType, LogicformType } from '../../logicform/logicform';
|
|
2
|
+
import { SchemaType } from '../schema';
|
|
3
|
+
export declare const getDrilldownDimensions: (schema: SchemaType, schemas: Record<string, SchemaType>, logicform: LogicformType) => Promise<GroupbyItemType[]>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getDrilldownDimensions = void 0;
|
|
16
|
+
const logicform_utils_1 = require("../../logicform/logicform.utils");
|
|
17
|
+
const moment_1 = __importDefault(require("moment"));
|
|
18
|
+
const getDrilldownDimensions = (schema, schemas, logicform) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
if (!schema)
|
|
20
|
+
return []; // 如果没有schema,代表logicform result报错了
|
|
21
|
+
if (schema.analyzer && schema.analyzer.drilldown) {
|
|
22
|
+
if (typeof schema.analyzer.drilldown === 'string') {
|
|
23
|
+
try {
|
|
24
|
+
const func = new Function(`return ${schema.analyzer.drilldown}`)();
|
|
25
|
+
return func(logicform, { isDimensionInQuery: logicform_utils_1.isDimensionInQuery, moment: moment_1.default }) || [];
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error('error in gen schema.analyzer.drilldown function');
|
|
29
|
+
console.error('schema: ', schema._id);
|
|
30
|
+
console.error(error);
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return schema.analyzer.drilldown; // 自定义的下钻维度
|
|
35
|
+
}
|
|
36
|
+
if (schema.drilldown)
|
|
37
|
+
return schema.drilldown; // 自定义的下钻维度
|
|
38
|
+
let drilldownProps = [];
|
|
39
|
+
// 一个递归函数
|
|
40
|
+
const addToArrayWithProperty = (property, prefix, schema) => {
|
|
41
|
+
const pushToPropNames = (propertyName, level, prefix, schema) => {
|
|
42
|
+
const groupbyItem = {
|
|
43
|
+
_id: prefix ? `${prefix}_${propertyName}` : propertyName,
|
|
44
|
+
};
|
|
45
|
+
if (level) {
|
|
46
|
+
groupbyItem.level = level;
|
|
47
|
+
}
|
|
48
|
+
if (schema) {
|
|
49
|
+
groupbyItem.schema = schema;
|
|
50
|
+
}
|
|
51
|
+
drilldownProps.push(groupbyItem);
|
|
52
|
+
};
|
|
53
|
+
if (property.isArray)
|
|
54
|
+
return; // array因为如果做分组的话,其中的一些统计值都会重复计算,所以默认不做drilldown了
|
|
55
|
+
if (property.is_supplementary)
|
|
56
|
+
return;
|
|
57
|
+
if (property.can_drilldown === false)
|
|
58
|
+
return;
|
|
59
|
+
if (property.is_categorical) {
|
|
60
|
+
pushToPropNames(property.name, undefined, prefix, schema);
|
|
61
|
+
}
|
|
62
|
+
else if (property.ref && schemas[property.ref]) {
|
|
63
|
+
if (schemas[property.ref].drilldown) {
|
|
64
|
+
schemas[property.ref].drilldown.forEach((h) => {
|
|
65
|
+
if (!h._id.startsWith('_')) {
|
|
66
|
+
property.name = h._id ? `${property.name}_${h._id}` : property.name;
|
|
67
|
+
}
|
|
68
|
+
pushToPropNames(property.name, h.level, prefix, schema);
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
else if (schemas[property.ref].hierarchy) {
|
|
73
|
+
schemas[property.ref].hierarchy.forEach((h) => {
|
|
74
|
+
pushToPropNames(property.name, h.name, prefix, schema);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
pushToPropNames(property.name, undefined, prefix, schema);
|
|
79
|
+
}
|
|
80
|
+
// 这里要获取其他schema的属性
|
|
81
|
+
if (!prefix || prefix.split('_').length < 3) {
|
|
82
|
+
// 最多三层
|
|
83
|
+
schemas[property.ref].properties.forEach((refProperty) => {
|
|
84
|
+
if (prefix) {
|
|
85
|
+
addToArrayWithProperty(refProperty, `${prefix}_${property.name}`, schema);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
addToArrayWithProperty(refProperty, property.name, schema);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
schema.properties.forEach((property) => {
|
|
95
|
+
addToArrayWithProperty(property);
|
|
96
|
+
});
|
|
97
|
+
// console.log('drilldownProps', drilldownProps);
|
|
98
|
+
// blacklist
|
|
99
|
+
if (schema.analyzer && schema.analyzer.drilldown_blacklist) {
|
|
100
|
+
drilldownProps = drilldownProps.filter((prop) => schema.analyzer.drilldown_blacklist.indexOf(prop._id) < 0);
|
|
101
|
+
}
|
|
102
|
+
return drilldownProps;
|
|
103
|
+
});
|
|
104
|
+
exports.getDrilldownDimensions = getDrilldownDimensions;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PropertyType } from './property';
|
|
2
|
+
import { SchemaType } from './schema';
|
|
3
|
+
/**
|
|
4
|
+
* Find a property by name within a specific schema
|
|
5
|
+
* @param schemaID - The unique identifier of the schema to search in
|
|
6
|
+
* @param propertyName - The name of the property to find。支持chain式结构。chain式结构例如:a_b_c,a_b(level)_c
|
|
7
|
+
* @param schemas - Array of runtime schema types to search through
|
|
8
|
+
* @returns The found property or undefined if not found
|
|
9
|
+
*/
|
|
10
|
+
export declare const findPropertyByName: (schemaID: string, propertyName: string, schemas: Record<string, SchemaType>) => PropertyType | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* 找到用在UI上面显示的Name,找到第一个满足条件的property就返回
|
|
13
|
+
* @param schema - The runtime schema to search in
|
|
14
|
+
* @returns The property marked as display name (is_name=true or ui.name=true) or undefined if not found
|
|
15
|
+
*/
|
|
16
|
+
export declare const findDisplayNameProperty: (schema: SchemaType) => PropertyType | undefined;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findDisplayNameProperty = exports.findPropertyByName = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Find a property by name within a specific schema
|
|
6
|
+
* @param schemaID - The unique identifier of the schema to search in
|
|
7
|
+
* @param propertyName - The name of the property to find。支持chain式结构。chain式结构例如:a_b_c,a_b(level)_c
|
|
8
|
+
* @param schemas - Array of runtime schema types to search through
|
|
9
|
+
* @returns The found property or undefined if not found
|
|
10
|
+
*/
|
|
11
|
+
const findPropertyByName = (schemaID, propertyName, schemas) => {
|
|
12
|
+
const chain = propertyName.split('_');
|
|
13
|
+
let currentSchemaID = schemaID;
|
|
14
|
+
let property = undefined;
|
|
15
|
+
for (let i = 0; i < chain.length; i++) {
|
|
16
|
+
const schema = schemas[currentSchemaID];
|
|
17
|
+
if (!schema) {
|
|
18
|
+
throw new Error(`[schema.utils.findPropertyByName]Schema with id ${currentSchemaID} not found`);
|
|
19
|
+
}
|
|
20
|
+
const chainItem = chain[i].split('(')[0]; // 去掉(level)
|
|
21
|
+
const p = schema.properties.find((property) => property.name === chainItem);
|
|
22
|
+
if (!p) {
|
|
23
|
+
throw new Error(`[schema.utils.findPropertyByName]Property with name ${chainItem} not found`);
|
|
24
|
+
}
|
|
25
|
+
if (i === chain.length - 1) {
|
|
26
|
+
property = p;
|
|
27
|
+
property.schemaID = currentSchemaID;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
if (!p.ref) {
|
|
31
|
+
throw new Error(`[schema.utils.findPropertyByName]Property with name ${chainItem} do not have ref field`);
|
|
32
|
+
}
|
|
33
|
+
currentSchemaID = p.ref;
|
|
34
|
+
}
|
|
35
|
+
return property;
|
|
36
|
+
};
|
|
37
|
+
exports.findPropertyByName = findPropertyByName;
|
|
38
|
+
/**
|
|
39
|
+
* 找到用在UI上面显示的Name,找到第一个满足条件的property就返回
|
|
40
|
+
* @param schema - The runtime schema to search in
|
|
41
|
+
* @returns The property marked as display name (is_name=true or ui.name=true) or undefined if not found
|
|
42
|
+
*/
|
|
43
|
+
const findDisplayNameProperty = (schema) => {
|
|
44
|
+
let nameProp = schema.properties.find((p) => p.is_name || p.ui.name);
|
|
45
|
+
if (nameProp)
|
|
46
|
+
return nameProp;
|
|
47
|
+
nameProp = schema.properties.find((p) => p.type === 'ID');
|
|
48
|
+
if (nameProp)
|
|
49
|
+
return nameProp;
|
|
50
|
+
return undefined;
|
|
51
|
+
};
|
|
52
|
+
exports.findDisplayNameProperty = findDisplayNameProperty;
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "semanticdb-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"clean": "rm -rf dist",
|
|
11
|
+
"build": "npm run clean && tsc",
|
|
12
|
+
"prepare": "npm run build",
|
|
13
|
+
"lint": "eslint . --ext .ts",
|
|
14
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
15
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:watch": "jest --watch",
|
|
18
|
+
"test:coverage": "jest --coverage"
|
|
19
|
+
},
|
|
20
|
+
"repository": "https://github.com/YiwenData/semanticdb-core",
|
|
21
|
+
"keywords": [],
|
|
22
|
+
"author": "XiChi Zhu",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"description": "",
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/jest": "^29.5.14",
|
|
27
|
+
"@types/lodash": "^4.17.16",
|
|
28
|
+
"@types/node": "^22.13.10",
|
|
29
|
+
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
|
30
|
+
"@typescript-eslint/parser": "^8.26.1",
|
|
31
|
+
"eslint": "^9.22.0",
|
|
32
|
+
"eslint-config-prettier": "^10.1.1",
|
|
33
|
+
"eslint-plugin-prettier": "^5.2.3",
|
|
34
|
+
"jest": "^29.7.0",
|
|
35
|
+
"prettier": "^3.5.3",
|
|
36
|
+
"ts-jest": "^29.2.6",
|
|
37
|
+
"ts-node": "^10.9.2",
|
|
38
|
+
"typescript": "^5.8.2"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"moment": "^2.30.1"
|
|
42
|
+
}
|
|
43
|
+
}
|