super-page-designer 2.0.96 → 2.0.99

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.
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, computed, resolveComponent, openBlock, createBlock, withCtx, createElementVNode, createVNode, createTextVNode, unref, createCommentVNode, withDirectives, vShow, createElementBlock, Fragment, renderList, normalizeClass, toDisplayString, renderSlot } from "vue";
2
- import _sfc_main$1 from "../../form/common/dataorigin-input-table.vue2.js";
2
+ import _sfc_main$1 from "../../form/common/dataorigin-input-table.vue.js";
3
3
  import { Codemirror } from "vue-codemirror";
4
4
  import _sfc_main$6 from "../../workflow/component/combination.vue.js";
5
5
  import _sfc_main$5 from "./return-set-table.vue.js";
@@ -47,8 +47,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
47
  let clolumnTableFields = ref([]);
48
48
  const groupTitleValueSet = ref({});
49
49
  function dynamicColumnDataSourcesChange(value) {
50
+ var _a;
50
51
  if (value === "service" && !props.configure.props.dynamicColumnData.service) {
51
52
  props.configure.props.dynamicColumnData.service = {};
53
+ } else if (value === "dataTable") {
54
+ queryTableFieldsByTable();
55
+ } else if (value === "optionGroup") {
56
+ props.configure.props.dynamicColumnData.optionGroup = "";
57
+ }
58
+ if (value === "optionGroup" && ((_a = props.configure.props.dynamicColumnData) == null ? void 0 : _a.mergeFieldType) === "more") {
59
+ props.configure.props.dynamicColumnData.mergeFieldLabelTemp = "选项值";
60
+ props.configure.props.dynamicColumnData.mergeField = "_optionValue_";
61
+ } else {
62
+ delete props.configure.props.dynamicColumnData.mergeFieldLabelTemp;
63
+ delete props.configure.props.dynamicColumnData.mergeField;
52
64
  }
53
65
  }
54
66
  const queryOptionGroupLoading = ref(false);
@@ -652,7 +664,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
652
664
  class: "amb-design-attr-item"
653
665
  }, {
654
666
  default: withCtx(() => [
655
- createVNode(_component_el_select, {
667
+ __props.configure.props.dynamicColumnData.dataSources === "dataTable" ? (openBlock(), createBlock(_component_el_select, {
668
+ key: 0,
656
669
  modelValue: __props.configure.props.dynamicColumnData.mergeField,
657
670
  "onUpdate:modelValue": _cache[17] || (_cache[17] = ($event) => __props.configure.props.dynamicColumnData.mergeField = $event),
658
671
  filterable: "",
@@ -669,7 +682,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
669
682
  }), 128))
670
683
  ]),
671
684
  _: 1
672
- }, 8, ["modelValue"])
685
+ }, 8, ["modelValue"])) : __props.configure.props.dynamicColumnData.dataSources === "optionGroup" ? (openBlock(), createBlock(_component_el_input, {
686
+ key: 1,
687
+ disabled: true,
688
+ modelValue: __props.configure.props.dynamicColumnData.mergeFieldLabelTemp,
689
+ "onUpdate:modelValue": _cache[18] || (_cache[18] = ($event) => __props.configure.props.dynamicColumnData.mergeFieldLabelTemp = $event)
690
+ }, null, 8, ["modelValue"])) : __props.configure.props.dynamicColumnData.dataSources === "sql" ? (openBlock(), createBlock(_component_el_input, {
691
+ key: 2,
692
+ modelValue: __props.configure.props.dynamicColumnData.mergeField,
693
+ "onUpdate:modelValue": _cache[19] || (_cache[19] = ($event) => __props.configure.props.dynamicColumnData.mergeField = $event)
694
+ }, null, 8, ["modelValue"])) : createCommentVNode("", true)
673
695
  ]),
674
696
  _: 1
675
697
  })) : createCommentVNode("", true),
@@ -682,7 +704,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
682
704
  default: withCtx(() => [
683
705
  createVNode(_component_el_select, {
684
706
  modelValue: __props.configure.props.dynamicColumnData.mergeTitleContentJoinField,
685
- "onUpdate:modelValue": _cache[18] || (_cache[18] = ($event) => __props.configure.props.dynamicColumnData.mergeTitleContentJoinField = $event),
707
+ "onUpdate:modelValue": _cache[20] || (_cache[20] = ($event) => __props.configure.props.dynamicColumnData.mergeTitleContentJoinField = $event),
686
708
  filterable: "",
687
709
  clearable: "",
688
710
  placeholder: "请选择"
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, onMounted, resolveComponent, openBlock, createBlock, withCtx, createElementVNode, createVNode, unref, createCommentVNode, withDirectives, createTextVNode, createElementBlock, Fragment, renderList, vShow, normalizeClass } from "vue";
2
- import _sfc_main$3 from "./dataorigin-input-table.vue2.js";
2
+ import _sfc_main$3 from "./dataorigin-input-table.vue.js";
3
3
  import _sfc_main$2 from "./condition.vue.js";
4
4
  import _sfc_main$1 from "./row-ul-li.vue.js";
5
5
  import "uuid";
@@ -1,4 +1,155 @@
1
- import _sfc_main from "./dataorigin-input-table.vue2.js";
1
+ import { defineComponent, ref, watch, resolveComponent, openBlock, createElementBlock, Fragment, createVNode, withCtx, unref, createElementVNode, createTextVNode } from "vue";
2
+ import { Search } from "@element-plus/icons-vue";
3
+ const _hoisted_1 = { class: "dialog-footer" };
4
+ const _sfc_main = /* @__PURE__ */ defineComponent({
5
+ __name: "dataorigin-input-table",
6
+ props: {
7
+ modelValue: {
8
+ type: String,
9
+ default: ""
10
+ }
11
+ },
12
+ emits: ["update:modelValue"],
13
+ setup(__props, { emit: __emit }) {
14
+ const props = __props;
15
+ const inputValue = ref(props.modelValue);
16
+ const emit = __emit;
17
+ const tableData = [
18
+ {
19
+ id: 1,
20
+ date: "2016-05-03",
21
+ name: "Tom",
22
+ address: "No. 189, Grove St, Los Angeles"
23
+ },
24
+ {
25
+ id: 2,
26
+ date: "2016-05-02",
27
+ name: "Tom",
28
+ address: "No. 189, Grove St, Los Angeles"
29
+ },
30
+ {
31
+ id: 3,
32
+ date: "2016-05-04",
33
+ name: "Tom",
34
+ address: "No. 189, Grove St, Los Angeles"
35
+ },
36
+ {
37
+ id: 4,
38
+ date: "2016-05-01",
39
+ name: "Tom",
40
+ address: "No. 189, Grove St, Los Angeles"
41
+ }
42
+ ];
43
+ const dialogVisible = ref(false);
44
+ const selectData = ref([]);
45
+ watch(() => props.modelValue, (newVal) => {
46
+ inputValue.value = newVal;
47
+ });
48
+ function confirm() {
49
+ if (selectData.value.length > 0) {
50
+ let str = "";
51
+ selectData.value.forEach((item) => {
52
+ str = str + item.name + ",";
53
+ });
54
+ str = str.substring(0, str.length - 1);
55
+ emit("update:modelValue", str);
56
+ dialogVisible.value = false;
57
+ } else {
58
+ dialogVisible.value = false;
59
+ }
60
+ }
61
+ function handleSelectionChange(selection) {
62
+ selectData.value = selection;
63
+ }
64
+ function inputClick() {
65
+ dialogVisible.value = true;
66
+ }
67
+ return (_ctx, _cache) => {
68
+ const _component_el_icon = resolveComponent("el-icon");
69
+ const _component_el_input = resolveComponent("el-input");
70
+ const _component_el_table_column = resolveComponent("el-table-column");
71
+ const _component_el_table = resolveComponent("el-table");
72
+ const _component_el_button = resolveComponent("el-button");
73
+ const _component_el_dialog = resolveComponent("el-dialog");
74
+ return openBlock(), createElementBlock(Fragment, null, [
75
+ createVNode(_component_el_input, {
76
+ modelValue: inputValue.value,
77
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
78
+ placeholder: "请选择",
79
+ onClick: inputClick
80
+ }, {
81
+ suffix: withCtx(() => [
82
+ createVNode(_component_el_icon, { onClick: inputClick }, {
83
+ default: withCtx(() => [
84
+ createVNode(unref(Search))
85
+ ]),
86
+ _: 1
87
+ })
88
+ ]),
89
+ _: 1
90
+ }, 8, ["modelValue"]),
91
+ createVNode(_component_el_dialog, {
92
+ modelValue: dialogVisible.value,
93
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => dialogVisible.value = $event),
94
+ title: "Tips",
95
+ width: "500"
96
+ }, {
97
+ footer: withCtx(() => [
98
+ createElementVNode("div", _hoisted_1, [
99
+ createVNode(_component_el_button, {
100
+ onClick: _cache[1] || (_cache[1] = ($event) => dialogVisible.value = false)
101
+ }, {
102
+ default: withCtx(() => [
103
+ createTextVNode("取消")
104
+ ]),
105
+ _: 1
106
+ }),
107
+ createVNode(_component_el_button, {
108
+ type: "primary",
109
+ onClick: confirm
110
+ }, {
111
+ default: withCtx(() => [
112
+ createTextVNode(" 确定 ")
113
+ ]),
114
+ _: 1
115
+ })
116
+ ])
117
+ ]),
118
+ default: withCtx(() => [
119
+ createVNode(_component_el_table, {
120
+ data: tableData,
121
+ style: { "width": "100%" },
122
+ onSelectionChange: handleSelectionChange
123
+ }, {
124
+ default: withCtx(() => [
125
+ createVNode(_component_el_table_column, {
126
+ type: "selection",
127
+ width: "55"
128
+ }),
129
+ createVNode(_component_el_table_column, {
130
+ prop: "date",
131
+ label: "Date",
132
+ width: "180"
133
+ }),
134
+ createVNode(_component_el_table_column, {
135
+ prop: "name",
136
+ label: "Name",
137
+ width: "180"
138
+ }),
139
+ createVNode(_component_el_table_column, {
140
+ prop: "address",
141
+ label: "Address"
142
+ })
143
+ ]),
144
+ _: 1
145
+ })
146
+ ]),
147
+ _: 1
148
+ }, 8, ["modelValue"])
149
+ ], 64);
150
+ };
151
+ }
152
+ });
2
153
  export {
3
154
  _sfc_main as default
4
155
  };
@@ -1,155 +1,4 @@
1
- import { defineComponent, ref, watch, resolveComponent, openBlock, createElementBlock, Fragment, createVNode, withCtx, unref, createElementVNode, createTextVNode } from "vue";
2
- import { Search } from "@element-plus/icons-vue";
3
- const _hoisted_1 = { class: "dialog-footer" };
4
- const _sfc_main = /* @__PURE__ */ defineComponent({
5
- __name: "dataorigin-input-table",
6
- props: {
7
- modelValue: {
8
- type: String,
9
- default: ""
10
- }
11
- },
12
- emits: ["update:modelValue"],
13
- setup(__props, { emit: __emit }) {
14
- const props = __props;
15
- const inputValue = ref(props.modelValue);
16
- const emit = __emit;
17
- const tableData = [
18
- {
19
- id: 1,
20
- date: "2016-05-03",
21
- name: "Tom",
22
- address: "No. 189, Grove St, Los Angeles"
23
- },
24
- {
25
- id: 2,
26
- date: "2016-05-02",
27
- name: "Tom",
28
- address: "No. 189, Grove St, Los Angeles"
29
- },
30
- {
31
- id: 3,
32
- date: "2016-05-04",
33
- name: "Tom",
34
- address: "No. 189, Grove St, Los Angeles"
35
- },
36
- {
37
- id: 4,
38
- date: "2016-05-01",
39
- name: "Tom",
40
- address: "No. 189, Grove St, Los Angeles"
41
- }
42
- ];
43
- const dialogVisible = ref(false);
44
- const selectData = ref([]);
45
- watch(() => props.modelValue, (newVal) => {
46
- inputValue.value = newVal;
47
- });
48
- function confirm() {
49
- if (selectData.value.length > 0) {
50
- let str = "";
51
- selectData.value.forEach((item) => {
52
- str = str + item.name + ",";
53
- });
54
- str = str.substring(0, str.length - 1);
55
- emit("update:modelValue", str);
56
- dialogVisible.value = false;
57
- } else {
58
- dialogVisible.value = false;
59
- }
60
- }
61
- function handleSelectionChange(selection) {
62
- selectData.value = selection;
63
- }
64
- function inputClick() {
65
- dialogVisible.value = true;
66
- }
67
- return (_ctx, _cache) => {
68
- const _component_el_icon = resolveComponent("el-icon");
69
- const _component_el_input = resolveComponent("el-input");
70
- const _component_el_table_column = resolveComponent("el-table-column");
71
- const _component_el_table = resolveComponent("el-table");
72
- const _component_el_button = resolveComponent("el-button");
73
- const _component_el_dialog = resolveComponent("el-dialog");
74
- return openBlock(), createElementBlock(Fragment, null, [
75
- createVNode(_component_el_input, {
76
- modelValue: inputValue.value,
77
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
78
- placeholder: "请选择",
79
- onClick: inputClick
80
- }, {
81
- suffix: withCtx(() => [
82
- createVNode(_component_el_icon, { onClick: inputClick }, {
83
- default: withCtx(() => [
84
- createVNode(unref(Search))
85
- ]),
86
- _: 1
87
- })
88
- ]),
89
- _: 1
90
- }, 8, ["modelValue"]),
91
- createVNode(_component_el_dialog, {
92
- modelValue: dialogVisible.value,
93
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => dialogVisible.value = $event),
94
- title: "Tips",
95
- width: "500"
96
- }, {
97
- footer: withCtx(() => [
98
- createElementVNode("div", _hoisted_1, [
99
- createVNode(_component_el_button, {
100
- onClick: _cache[1] || (_cache[1] = ($event) => dialogVisible.value = false)
101
- }, {
102
- default: withCtx(() => [
103
- createTextVNode("取消")
104
- ]),
105
- _: 1
106
- }),
107
- createVNode(_component_el_button, {
108
- type: "primary",
109
- onClick: confirm
110
- }, {
111
- default: withCtx(() => [
112
- createTextVNode(" 确定 ")
113
- ]),
114
- _: 1
115
- })
116
- ])
117
- ]),
118
- default: withCtx(() => [
119
- createVNode(_component_el_table, {
120
- data: tableData,
121
- style: { "width": "100%" },
122
- onSelectionChange: handleSelectionChange
123
- }, {
124
- default: withCtx(() => [
125
- createVNode(_component_el_table_column, {
126
- type: "selection",
127
- width: "55"
128
- }),
129
- createVNode(_component_el_table_column, {
130
- prop: "date",
131
- label: "Date",
132
- width: "180"
133
- }),
134
- createVNode(_component_el_table_column, {
135
- prop: "name",
136
- label: "Name",
137
- width: "180"
138
- }),
139
- createVNode(_component_el_table_column, {
140
- prop: "address",
141
- label: "Address"
142
- })
143
- ]),
144
- _: 1
145
- })
146
- ]),
147
- _: 1
148
- }, 8, ["modelValue"])
149
- ], 64);
150
- };
151
- }
152
- });
1
+ import _sfc_main from "./dataorigin-input-table.vue.js";
153
2
  export {
154
3
  _sfc_main as default
155
4
  };
@@ -54,7 +54,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
54
54
  if (!((_b = (_a = props.pageDesign) == null ? void 0 : _a.tableUuids) == null ? void 0 : _b.includes(props.configure.uuid))) {
55
55
  (_d = (_c = props.pageDesign) == null ? void 0 : _c.tableUuids) == null ? void 0 : _d.push(props.configure.uuid);
56
56
  }
57
- if (!((_e = props.pageDesign) == null ? void 0 : _e.listCodesMap)) {
57
+ if ((_e = props.pageDesign) == null ? void 0 : _e.listCodesMap) {
58
58
  const listCode = getListCode(props.pageDesign.code, props.pageDesign.version, props.configure.uuid);
59
59
  props.pageDesign.listCodesMap[listCode] = props.configure.code;
60
60
  }
@@ -66,7 +66,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
66
66
  (_d = (_c = props.pageDesign) == null ? void 0 : _c.tableUuids) == null ? void 0 : _d.shift(uuidIndex, 1);
67
67
  }
68
68
  const listCode = getListCode(props.pageDesign.code, props.pageDesign.version, props.configure.uuid);
69
- if (props.pageDesign.listCodesMap[listCode]) {
69
+ if (props.pageDesign.listCodesMap && props.pageDesign.listCodesMap[listCode]) {
70
70
  delete props.pageDesign.listCodesMap[listCode];
71
71
  }
72
72
  });
@@ -1 +1,7 @@
1
-
1
+ import _sfc_main from "./config.vue3.js";
2
+ import "./config.vue2.js";
3
+ import _export_sfc from "../../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const config = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-26f79956"]]);
5
+ export {
6
+ config as default
7
+ };
@@ -1,7 +1 @@
1
- import _sfc_main from "./config.vue3.js";
2
- import "./config.vue.js";
3
- import _export_sfc from "../../../../../_virtual/_plugin-vue_export-helper.js";
4
- const config = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-26f79956"]]);
5
- export {
6
- config as default
7
- };
1
+
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, ref, onMounted, onUnmounted, watch, resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, withDirectives, vShow, unref, createTextVNode, toDisplayString, Fragment, renderList, createBlock } from "vue";
2
2
  import { ElMessageBox, ElMessage } from "element-plus";
3
- import config from "./config.vue2.js";
3
+ import config from "./config.vue.js";
4
4
  import { standardButtonOperations } from "../../../utils/assemblys-config.js";
5
5
  import { findDesignItemByUuid, getUuidv4, deepCopy } from "../../../utils/common-util.js";
6
6
  import { usePageContextStore } from "../../../../../stores/page-store.js";
@@ -15,7 +15,7 @@ import "@codemirror/state";
15
15
  import "@codemirror/autocomplete";
16
16
  import "@codemirror/language";
17
17
  import "@codemirror/search";
18
- import "../page-event/config.vue.js";
18
+ import "../page-event/config.vue2.js";
19
19
  import "../../../utils/assemblys-config.js";
20
20
  import "../../../../../stores/page-store.js";
21
21
  import "../../../../../stores/event-undo-redo-store.js";
package/dist/es/style.css CHANGED
@@ -1294,6 +1294,10 @@ fieldset.amb-design-item-selected {
1294
1294
  padding: 10px;
1295
1295
  font-weight: bold;
1296
1296
  }
1297
+
1298
+ .el-select__wrapper.is-disabled{
1299
+ cursor: default;
1300
+ }
1297
1301
  .el-tree-node__content {
1298
1302
  height: 34px !important;
1299
1303
  }
@@ -1913,6 +1917,10 @@ fieldset.amb-design-item-selected {
1913
1917
  padding: 10px;
1914
1918
  font-weight: bold;
1915
1919
  }
1920
+
1921
+ .el-switch.is-disabled .el-switch__core, .el-switch.is-disabled .el-switch__label{
1922
+ cursor: default;
1923
+ }
1916
1924
  .el-tree-node__content {
1917
1925
  height: 34px !important;
1918
1926
  }
@@ -3770,14 +3778,6 @@ fieldset.amb-design-item-selected {
3770
3778
  padding: 10px;
3771
3779
  font-weight: bold;
3772
3780
  }
3773
-
3774
- .el-switch.is-disabled .el-switch__core, .el-switch.is-disabled .el-switch__label{
3775
- cursor: default;
3776
- }
3777
-
3778
- .el-select__wrapper.is-disabled{
3779
- cursor: default;
3780
- }
3781
3781
  .el-tree-node__content {
3782
3782
  height: 34px !important;
3783
3783
  }
@@ -16870,13 +16870,26 @@ fieldset.amb-design-item-selected {
16870
16870
  padding-bottom: 5px;
16871
16871
  }
16872
16872
 
16873
+ [data-v-7fcec2fa] .el-cascader-menu {
16874
+ min-width: 120px !important;
16875
+ }
16876
+
16873
16877
  .seleteSort[data-v-e6c84ad9] {
16874
16878
  border-radius: 5px;
16875
16879
  border: 1px solid rgba(88, 147, 239);
16876
16880
  }
16877
16881
 
16878
- [data-v-7fcec2fa] .el-cascader-menu {
16879
- min-width: 120px !important;
16882
+ .editorTool[data-v-26f79956] {
16883
+ margin-left: auto;
16884
+ }
16885
+ .editorOption[data-v-26f79956] {
16886
+ margin-right: 10px;
16887
+ cursor: pointer;
16888
+ }
16889
+ .pppp[data-v-26f79956] {
16890
+ display: flex; /* 使用Flex布局 */
16891
+ justify-content: flex-start;
16892
+ align-items: center; /* 子元素在交叉轴(垂直方向)上居中对齐 */
16880
16893
  }
16881
16894
 
16882
16895
  .icon-set-center-body[data-v-4aa5ce08]{
@@ -16916,25 +16929,8 @@ fieldset.amb-design-item-selected {
16916
16929
  margin-bottom: 20px;
16917
16930
  }
16918
16931
 
16919
- .editorTool[data-v-26f79956] {
16920
- margin-left: auto;
16921
- }
16922
- .editorOption[data-v-26f79956] {
16923
- margin-right: 10px;
16924
- cursor: pointer;
16925
- }
16926
- .pppp[data-v-26f79956] {
16927
- display: flex; /* 使用Flex布局 */
16928
- justify-content: flex-start;
16929
- align-items: center; /* 子元素在交叉轴(垂直方向)上居中对齐 */
16930
- }
16931
-
16932
- .seleteSort[data-v-97438be5] {
16933
- border-radius: 5px;
16934
- border: 1px solid rgba(88, 147, 239);
16935
- }
16936
- [data-v-97438be5] .el-select__selection{
16937
- display: inline-block;
16932
+ .el-tag[data-v-665d3bf4]{
16933
+ margin-left: 10px;
16938
16934
  }
16939
16935
 
16940
16936
  .row-backgroud-header-tittle[data-v-b203475d]{
@@ -16996,8 +16992,12 @@ li[data-v-b436905c] {
16996
16992
  list-style-type: none;
16997
16993
  }
16998
16994
 
16999
- .el-tag[data-v-665d3bf4]{
17000
- margin-left: 10px;
16995
+ .seleteSort[data-v-97438be5] {
16996
+ border-radius: 5px;
16997
+ border: 1px solid rgba(88, 147, 239);
16998
+ }
16999
+ [data-v-97438be5] .el-select__selection{
17000
+ display: inline-block;
17001
17001
  }
17002
17002
 
17003
17003
  .input-with-select .el-input-group__append {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "super-page-designer",
3
- "version": "2.0.96",
3
+ "version": "2.0.99",
4
4
  "description": "AgileBuilder super page designer",
5
5
  "license": "ISC",
6
6
  "main": "dist/es/index.js",
@@ -39,7 +39,7 @@
39
39
  "qrcode": "^1.5.3",
40
40
  "quill": "^2.0.1",
41
41
  "service-flow-designer": "2.0.94",
42
- "super-page-runtime": "2.0.95",
42
+ "super-page-runtime": "2.0.97",
43
43
  "uuid": "^9.0.1",
44
44
  "vite": "^5.1.6",
45
45
  "vite-plugin-node-stdlib-browser": "^0.2.1",