work-flow-master 1.0.0 → 1.0.2
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/lib/App.css +92 -0
- package/lib/App.js +19 -0
- package/lib/api/index.js +83 -0
- package/lib/assets/images/add-close.png +0 -0
- package/lib/assets/images/add-close1.png +0 -0
- package/lib/assets/images/cancel.png +0 -0
- package/lib/assets/images/check_box.png +0 -0
- package/lib/assets/images/icon_file.png +0 -0
- package/lib/assets/images/icon_people.png +0 -0
- package/lib/assets/images/icon_role.png +0 -0
- package/lib/assets/images/jiaojiao.png +0 -0
- package/lib/assets/images/list_search.png +0 -0
- package/lib/assets/images/loading.gif +0 -0
- package/lib/assets/images/next_level.png +0 -0
- package/lib/assets/images/next_level_active.png +0 -0
- package/lib/assets/logo.svg +1 -0
- package/lib/components/AddNode/index.js +120 -0
- package/lib/components/AddNode/index.scss +120 -0
- package/lib/components/Dialog/ErrorDialog/index.js +61 -0
- package/lib/components/Dialog/ErrorDialog/index.scss +60 -0
- package/lib/components/Dialog/SelectDialog/index.js +336 -0
- package/lib/components/Dialog/SelectDialog/index.scss +34 -0
- package/lib/components/Drawer/ApproverDrawer/index.js +260 -0
- package/lib/components/Drawer/ApproverDrawer/index.scss +62 -0
- package/lib/components/Drawer/ConditionDrawer/index.js +431 -0
- package/lib/components/Drawer/ConditionDrawer/index.scss +113 -0
- package/lib/components/Drawer/CopyerDrawer/index.js +111 -0
- package/lib/components/Drawer/CopyerDrawer/index.scss +12 -0
- package/lib/components/Drawer/PromoterDrawer/index.js +82 -0
- package/lib/components/Drawer/PromoterDrawer/index.scss +16 -0
- package/lib/components/NodeWrap/index.js +383 -0
- package/lib/components/NodeWrap/index.scss +32 -0
- package/lib/components/SelectBox/index.js +72 -0
- package/lib/components/SelectBox/index.scss +27 -0
- package/lib/components/SelectResult/index.js +67 -0
- package/lib/components/SelectResult/index.scss +37 -0
- package/lib/components/setting/index.css +4 -0
- package/lib/components/setting/index.js +342 -0
- package/lib/css/override-element-ui.scss +119 -0
- package/lib/css/workflow.css +952 -0
- package/lib/index.js +0 -0
- package/lib/store/index.js +21 -0
- package/lib/store/models.js +91 -0
- package/lib/utils/axios.js +43 -0
- package/lib/utils/const.js +74 -0
- package/lib/utils/index.js +158 -0
- package/package.json +7 -5
package/lib/index.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _core = require("@rematch/core");
|
|
8
|
+
var models = _interopRequireWildcard(require("./models"));
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
|
+
/*
|
|
11
|
+
* @Date: 2023-03-15 15:34:08
|
|
12
|
+
* @LastEditors: StavinLi 495727881@qq.com
|
|
13
|
+
* @LastEditTime: 2023-03-15 19:59:21
|
|
14
|
+
* @FilePath: /workflow-react/src/store/index.js
|
|
15
|
+
*/
|
|
16
|
+
// store.js
|
|
17
|
+
|
|
18
|
+
const store = (0, _core.init)({
|
|
19
|
+
models
|
|
20
|
+
});
|
|
21
|
+
var _default = exports.default = store;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.models = void 0;
|
|
7
|
+
/*
|
|
8
|
+
* @Date: 2023-03-15 16:42:35
|
|
9
|
+
* @LastEditors: StavinLi 495727881@qq.com
|
|
10
|
+
* @LastEditTime: 2023-03-17 15:03:13
|
|
11
|
+
* @FilePath: /workflow-react/src/store/models.js
|
|
12
|
+
*/
|
|
13
|
+
const models = exports.models = {
|
|
14
|
+
state: {
|
|
15
|
+
tableId: '',
|
|
16
|
+
isTried: false,
|
|
17
|
+
promoterDrawer: false,
|
|
18
|
+
flowPermission1: [],
|
|
19
|
+
approverDrawer: false,
|
|
20
|
+
approverConfig1: {},
|
|
21
|
+
copyerDrawer: false,
|
|
22
|
+
copyerConfig1: {},
|
|
23
|
+
conditionDrawer: false,
|
|
24
|
+
conditionsConfig1: {
|
|
25
|
+
conditionNodes: []
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
// 初始化状态
|
|
29
|
+
reducers: {
|
|
30
|
+
setTableId(status, payload) {
|
|
31
|
+
return {
|
|
32
|
+
...status,
|
|
33
|
+
tableId: payload
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
setIsTried(status, payload) {
|
|
37
|
+
return {
|
|
38
|
+
...status,
|
|
39
|
+
isTried: payload
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
setPromoter(status, payload) {
|
|
43
|
+
return {
|
|
44
|
+
...status,
|
|
45
|
+
promoterDrawer: payload
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
setFlowPermission(status, payload) {
|
|
49
|
+
return {
|
|
50
|
+
...status,
|
|
51
|
+
flowPermission1: payload
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
setApprover(status, payload) {
|
|
55
|
+
return {
|
|
56
|
+
...status,
|
|
57
|
+
approverDrawer: payload
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
setApproverConfig(status, payload) {
|
|
61
|
+
return {
|
|
62
|
+
...status,
|
|
63
|
+
approverConfig1: payload
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
setCopyer(status, payload) {
|
|
67
|
+
return {
|
|
68
|
+
...status,
|
|
69
|
+
copyerDrawer: payload
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
setCopyerConfig(status, payload) {
|
|
73
|
+
return {
|
|
74
|
+
...status,
|
|
75
|
+
copyerConfig1: payload
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
setCondition(status, payload) {
|
|
79
|
+
return {
|
|
80
|
+
...status,
|
|
81
|
+
conditionDrawer: payload
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
setConditionsConfig(status, payload) {
|
|
85
|
+
return {
|
|
86
|
+
...status,
|
|
87
|
+
conditionsConfig1: payload
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _axios2 = _interopRequireDefault(require("axios"));
|
|
9
|
+
/*
|
|
10
|
+
* @Date: 2022-08-25 14:43:53
|
|
11
|
+
* @LastEditors: StavinLi 495727881@qq.com
|
|
12
|
+
* @LastEditTime: 2023-03-23 10:30:21
|
|
13
|
+
* @FilePath: /workflow-react/src/utils/axios.js
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// Full config: https://github.com/axios/axios#request-config
|
|
17
|
+
// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
|
|
18
|
+
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
|
|
19
|
+
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
20
|
+
|
|
21
|
+
let config = {
|
|
22
|
+
// baseURL: process.env.baseURL || process.env.apiUrl || ""
|
|
23
|
+
// timeout: 60 * 1000, // Timeout
|
|
24
|
+
// withCredentials: true, // Check cross-site Access-Control
|
|
25
|
+
};
|
|
26
|
+
const _axios = _axios2.default.create(config);
|
|
27
|
+
_axios.interceptors.request.use(function (config) {
|
|
28
|
+
// Do something before request is sent
|
|
29
|
+
return config;
|
|
30
|
+
}, function (error) {
|
|
31
|
+
// Do something with request error
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Add a response interceptor
|
|
36
|
+
_axios.interceptors.response.use(function (response) {
|
|
37
|
+
// Do something with response data
|
|
38
|
+
return response.data;
|
|
39
|
+
}, function (error) {
|
|
40
|
+
// Do something with response error
|
|
41
|
+
return Promise.reject(error);
|
|
42
|
+
});
|
|
43
|
+
var _default = exports.default = _axios;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.setTypes = exports.selectRanges = exports.selectModes = exports.placeholderList = exports.optTypes = exports.opt1s = exports.bgColors = void 0;
|
|
7
|
+
/*
|
|
8
|
+
* @Date: 2023-03-21 16:25:38
|
|
9
|
+
* @LastEditors: StavinLi 495727881@qq.com
|
|
10
|
+
* @LastEditTime: 2023-03-29 15:34:38
|
|
11
|
+
* @FilePath: /workflow-react/src/utils/const.js
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
let bgColors = exports.bgColors = ['87, 106, 149', '255, 148, 62', '50, 150, 250'];
|
|
15
|
+
let placeholderList = exports.placeholderList = ["发起人", "审核人", "抄送人"];
|
|
16
|
+
let setTypes = exports.setTypes = [{
|
|
17
|
+
value: 1,
|
|
18
|
+
label: '指定成员'
|
|
19
|
+
}, {
|
|
20
|
+
value: 2,
|
|
21
|
+
label: '主管'
|
|
22
|
+
}, {
|
|
23
|
+
value: 4,
|
|
24
|
+
label: '发起人自选'
|
|
25
|
+
}, {
|
|
26
|
+
value: 5,
|
|
27
|
+
label: '发起人自己'
|
|
28
|
+
}, {
|
|
29
|
+
value: 7,
|
|
30
|
+
label: '连续多级主管'
|
|
31
|
+
}];
|
|
32
|
+
let selectModes = exports.selectModes = [{
|
|
33
|
+
value: 1,
|
|
34
|
+
label: '选一个人'
|
|
35
|
+
}, {
|
|
36
|
+
value: 2,
|
|
37
|
+
label: '选多个人'
|
|
38
|
+
}];
|
|
39
|
+
let selectRanges = exports.selectRanges = [{
|
|
40
|
+
value: 1,
|
|
41
|
+
label: '全公司'
|
|
42
|
+
}, {
|
|
43
|
+
value: 2,
|
|
44
|
+
label: '指定成员'
|
|
45
|
+
}, {
|
|
46
|
+
value: 3,
|
|
47
|
+
label: '指定角色'
|
|
48
|
+
}];
|
|
49
|
+
let optTypes = exports.optTypes = [{
|
|
50
|
+
value: '1',
|
|
51
|
+
label: '小于'
|
|
52
|
+
}, {
|
|
53
|
+
value: '2',
|
|
54
|
+
label: '大于'
|
|
55
|
+
}, {
|
|
56
|
+
value: '3',
|
|
57
|
+
label: '小于等于'
|
|
58
|
+
}, {
|
|
59
|
+
value: '4',
|
|
60
|
+
label: '等于'
|
|
61
|
+
}, {
|
|
62
|
+
value: '5',
|
|
63
|
+
label: '大于等于'
|
|
64
|
+
}, {
|
|
65
|
+
value: '6',
|
|
66
|
+
label: '介于两个数之间'
|
|
67
|
+
}];
|
|
68
|
+
let opt1s = exports.opt1s = [{
|
|
69
|
+
value: '<',
|
|
70
|
+
label: '<'
|
|
71
|
+
}, {
|
|
72
|
+
value: '≤',
|
|
73
|
+
label: '≤'
|
|
74
|
+
}];
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.toggleStrClass = exports.toggleClass = exports.toChecked = exports.setApproverStr = exports.removeEle = exports.dealStr = exports.copyerStr = exports.conditionStr = exports.arrToStr = void 0;
|
|
7
|
+
let arrToStr = arr => {
|
|
8
|
+
if (arr) {
|
|
9
|
+
return arr.map(item => {
|
|
10
|
+
return item.name;
|
|
11
|
+
}).toString();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
exports.arrToStr = arrToStr;
|
|
15
|
+
let toggleClass = function (arr, elem) {
|
|
16
|
+
let key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'id';
|
|
17
|
+
return arr.some(item => {
|
|
18
|
+
return item[key] === elem[key];
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
exports.toggleClass = toggleClass;
|
|
22
|
+
let toChecked = function (arr, elem) {
|
|
23
|
+
let key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'id';
|
|
24
|
+
var isIncludes = toggleClass(arr, elem, key);
|
|
25
|
+
!isIncludes ? arr.push(elem) : removeEle(arr, elem, key);
|
|
26
|
+
return [...arr];
|
|
27
|
+
};
|
|
28
|
+
exports.toChecked = toChecked;
|
|
29
|
+
let removeEle = function (arr, elem) {
|
|
30
|
+
let key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'id';
|
|
31
|
+
var includesIndex;
|
|
32
|
+
arr.forEach((item, index) => {
|
|
33
|
+
if (item[key] === elem[key]) {
|
|
34
|
+
includesIndex = index;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
arr.splice(includesIndex, 1);
|
|
38
|
+
return [...arr];
|
|
39
|
+
};
|
|
40
|
+
exports.removeEle = removeEle;
|
|
41
|
+
let setApproverStr = nodeConfig => {
|
|
42
|
+
if (nodeConfig.settype === 1) {
|
|
43
|
+
if (nodeConfig.nodeUserList.length === 1) {
|
|
44
|
+
return nodeConfig.nodeUserList[0].name;
|
|
45
|
+
} else if (nodeConfig.nodeUserList.length > 1) {
|
|
46
|
+
if (nodeConfig.examineMode === 1) {
|
|
47
|
+
return arrToStr(nodeConfig.nodeUserList);
|
|
48
|
+
} else if (nodeConfig.examineMode === 2) {
|
|
49
|
+
return nodeConfig.nodeUserList.length + "人会签";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} else if (nodeConfig.settype === 2) {
|
|
53
|
+
let level = nodeConfig.directorLevel === 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管';
|
|
54
|
+
if (nodeConfig.examineMode === 1) {
|
|
55
|
+
return level;
|
|
56
|
+
} else if (nodeConfig.examineMode === 2) {
|
|
57
|
+
return level + "会签";
|
|
58
|
+
}
|
|
59
|
+
} else if (nodeConfig.settype === 4) {
|
|
60
|
+
if (nodeConfig.selectRange === 1) {
|
|
61
|
+
return "发起人自选";
|
|
62
|
+
} else {
|
|
63
|
+
if (nodeConfig.nodeUserList.length > 0) {
|
|
64
|
+
if (nodeConfig.selectRange === 2) {
|
|
65
|
+
return "发起人自选";
|
|
66
|
+
} else {
|
|
67
|
+
return '发起人从' + nodeConfig.nodeUserList[0].name + '中自选';
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
return "";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
} else if (nodeConfig.settype === 5) {
|
|
74
|
+
return "发起人自己";
|
|
75
|
+
} else if (nodeConfig.settype === 7) {
|
|
76
|
+
return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管';
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
exports.setApproverStr = setApproverStr;
|
|
80
|
+
let dealStr = (str, obj) => {
|
|
81
|
+
let arr = [];
|
|
82
|
+
let list = str.split(",");
|
|
83
|
+
for (var elem in obj) {
|
|
84
|
+
// eslint-disable-next-line no-loop-func
|
|
85
|
+
list.forEach(item => {
|
|
86
|
+
if (item === elem) {
|
|
87
|
+
arr.push(obj[elem].value);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return arr.join("或");
|
|
92
|
+
};
|
|
93
|
+
exports.dealStr = dealStr;
|
|
94
|
+
let conditionStr = (nodeConfig, index) => {
|
|
95
|
+
var {
|
|
96
|
+
conditionList,
|
|
97
|
+
nodeUserList
|
|
98
|
+
} = nodeConfig.conditionNodes[index];
|
|
99
|
+
if (conditionList.length === 0) {
|
|
100
|
+
return index === nodeConfig.conditionNodes.length - 1 && nodeConfig.conditionNodes[0].conditionList.length !== 0 ? '其他条件进入此流程' : '请设置条件';
|
|
101
|
+
} else {
|
|
102
|
+
let str = "";
|
|
103
|
+
for (var i = 0; i < conditionList.length; i++) {
|
|
104
|
+
var {
|
|
105
|
+
columnId,
|
|
106
|
+
columnType,
|
|
107
|
+
showType,
|
|
108
|
+
showName,
|
|
109
|
+
optType,
|
|
110
|
+
zdy1,
|
|
111
|
+
opt1,
|
|
112
|
+
zdy2,
|
|
113
|
+
opt2,
|
|
114
|
+
fixedDownBoxValue
|
|
115
|
+
} = conditionList[i];
|
|
116
|
+
if (columnId === 0) {
|
|
117
|
+
if (nodeUserList.length !== 0) {
|
|
118
|
+
str += '发起人属于:';
|
|
119
|
+
str += nodeUserList.map(item => {
|
|
120
|
+
return item.name;
|
|
121
|
+
}).join("或") + " 并且 ";
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (columnType === "String" && showType === "3") {
|
|
125
|
+
if (zdy1) {
|
|
126
|
+
str += showName + '属于:' + dealStr(zdy1, JSON.parse(fixedDownBoxValue)) + " 并且 ";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (columnType === "Double") {
|
|
130
|
+
if (optType !== 6 && zdy1) {
|
|
131
|
+
var optTypeStr = ["", "<", ">", "≤", "=", "≥"][optType];
|
|
132
|
+
str += `${showName} ${optTypeStr} ${zdy1} 并且 `;
|
|
133
|
+
} else if (optType === 6 && zdy1 && zdy2) {
|
|
134
|
+
str += `${zdy1} ${opt1} ${showName} ${opt2} ${zdy2} 并且 `;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return str ? str.substring(0, str.length - 4) : '请设置条件';
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
exports.conditionStr = conditionStr;
|
|
142
|
+
let copyerStr = nodeConfig => {
|
|
143
|
+
if (nodeConfig.nodeUserList.length !== 0) {
|
|
144
|
+
return arrToStr(nodeConfig.nodeUserList);
|
|
145
|
+
} else {
|
|
146
|
+
if (nodeConfig.ccSelfSelectFlag === 1) {
|
|
147
|
+
return "发起人自选";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
exports.copyerStr = copyerStr;
|
|
152
|
+
let toggleStrClass = (item, key) => {
|
|
153
|
+
let a = item.zdy1 ? item.zdy1.split(",") : [];
|
|
154
|
+
return a.some(item => {
|
|
155
|
+
return item === key;
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
exports.toggleStrClass = toggleStrClass;
|
package/package.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "work-flow-master",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"homepage": "/workflow/dist/",
|
|
6
6
|
"keywords": [
|
|
7
|
-
"
|
|
7
|
+
"work-flow-master"
|
|
8
8
|
],
|
|
9
9
|
"author": "zhouhongwei",
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"description": "",
|
|
12
12
|
"bin": {
|
|
13
|
-
"work-flow-master": "./index.js"
|
|
13
|
+
"work-flow-master": "./lib/index.js"
|
|
14
14
|
},
|
|
15
|
-
"files": [
|
|
15
|
+
"files": [
|
|
16
|
+
"lib"
|
|
17
|
+
],
|
|
16
18
|
"dependencies": {
|
|
17
19
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
|
|
18
20
|
"@rematch/core": "^2.2.0",
|
|
@@ -73,7 +75,7 @@
|
|
|
73
75
|
"start": "react-scripts start",
|
|
74
76
|
"dev": "node scripts/start.js",
|
|
75
77
|
"serve": "node scripts/start.js",
|
|
76
|
-
"build": "
|
|
78
|
+
"build": "react-scripts build",
|
|
77
79
|
"test": "node scripts/test.js"
|
|
78
80
|
},
|
|
79
81
|
"eslintConfig": {
|