@tmagic/editor 1.7.8-beta.1 → 1.7.8-beta.3

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 (35) hide show
  1. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +6 -6
  2. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +1 -1
  3. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -3
  4. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +5 -5
  5. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +5 -4
  6. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +8 -6
  7. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -6
  8. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +8 -6
  9. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +9 -8
  10. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +8 -6
  11. package/dist/es/services/props.js +2 -1
  12. package/dist/es/utils/data-source/index.js +65 -63
  13. package/dist/es/utils/dep/worker.js +1 -1
  14. package/dist/es/utils/props.js +4 -4
  15. package/dist/tmagic-editor.umd.cjs +120 -107
  16. package/package.json +7 -7
  17. package/src/components/CodeBlockEditor.vue +70 -66
  18. package/src/components/CodeParams.vue +3 -3
  19. package/src/fields/CodeSelectCol.vue +5 -2
  20. package/src/fields/DataSourceFieldSelect/Index.vue +10 -3
  21. package/src/fields/DataSourceFields.vue +4 -1
  22. package/src/fields/DataSourceMethodSelect.vue +4 -1
  23. package/src/fields/EventSelect.vue +69 -63
  24. package/src/fields/StyleSetter/components/BackgroundPosition.vue +2 -2
  25. package/src/fields/StyleSetter/components/Border.vue +35 -33
  26. package/src/fields/StyleSetter/pro/Background.vue +4 -4
  27. package/src/fields/StyleSetter/pro/Border.vue +3 -3
  28. package/src/fields/StyleSetter/pro/Font.vue +3 -3
  29. package/src/fields/StyleSetter/pro/Layout.vue +8 -8
  30. package/src/fields/StyleSetter/pro/Position.vue +3 -3
  31. package/src/services/props.ts +3 -1
  32. package/src/utils/data-source/formConfigs/base.ts +2 -2
  33. package/src/utils/data-source/index.ts +73 -75
  34. package/src/utils/props.ts +10 -8
  35. package/types/index.d.ts +179 -175
@@ -5,7 +5,7 @@ import { useEditorContentHeight } from "../hooks/use-editor-content-height.js";
5
5
  import { useNextFloatBoxPosition } from "../hooks/use-next-float-box-position.js";
6
6
  import CodeEditor_default from "../layouts/CodeEditor.js";
7
7
  import FloatingBox_default from "./FloatingBox.js";
8
- import { MFormBox } from "@tmagic/form";
8
+ import { MFormBox, defineFormConfig, defineFormItem } from "@tmagic/form";
9
9
  import { TMagicButton, TMagicDialog, TMagicTag, tMagicMessage, tMagicMessageBox } from "@tmagic/design";
10
10
  import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, nextTick, openBlock, ref, unref, useModel, useTemplateRef, watch, withCtx } from "vue";
11
11
  //#region packages/editor/src/components/CodeBlockEditor.vue?vue&type=script&setup=true&lang.ts
@@ -53,7 +53,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
53
53
  formBox.value.form.values.content = magicVsEditorRef.value.getEditorValue();
54
54
  difVisible.value = false;
55
55
  };
56
- const defaultParamColConfig = {
56
+ const defaultParamColConfig = defineFormItem({
57
57
  type: "row",
58
58
  label: "参数类型",
59
59
  items: [{
@@ -79,8 +79,8 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
79
79
  }
80
80
  ]
81
81
  }]
82
- };
83
- const functionConfig = computed(() => [
82
+ });
83
+ const functionConfig = computed(() => defineFormConfig([
84
84
  {
85
85
  text: "名称",
86
86
  name: "name",
@@ -150,7 +150,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
150
150
  minRows: 10,
151
151
  maxRows: 30
152
152
  },
153
- onChange: (formState, code) => {
153
+ onChange: (_formState, code) => {
154
154
  try {
155
155
  getEditorConfig("parseDSL")(code);
156
156
  return code;
@@ -160,7 +160,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
160
160
  }
161
161
  }
162
162
  }
163
- ]);
163
+ ]));
164
164
  const parseContent = (content) => {
165
165
  if (typeof content === "string") return getEditorConfig("parseDSL")(content);
166
166
  return content;
@@ -59,7 +59,7 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
59
59
  const selectConfig = {
60
60
  type: "select",
61
61
  name: props.name,
62
- disable: props.disabled,
62
+ disabled: props.disabled,
63
63
  options: () => {
64
64
  if (codeDsl.value) return map(codeDsl.value, (value, key) => ({
65
65
  text: `${value.name}(${key})`,
@@ -40,14 +40,15 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
40
40
  const dataSources = computed(() => dataSourceService.get("dataSources") || []);
41
41
  const disabledDataSource = computed(() => propsService.getDisabledDataSource());
42
42
  const type = computed(() => {
43
- let type = props.config.fieldConfig?.type;
43
+ if (!props.config.fieldConfig) return "";
44
+ let type = "type" in props.config.fieldConfig ? props.config.fieldConfig.type : "";
44
45
  if (typeof type === "function") type = type(mForm, { model: props.model });
45
46
  if (type === "form") return "";
46
47
  if (type === "container") return "";
47
- return type?.replace(/([A-Z])/g, "-$1").toLowerCase() || (props.config.items ? "" : "text");
48
+ return type?.replace(/([A-Z])/g, "-$1").toLowerCase() || (props.config.fieldConfig && "items" in props.config.fieldConfig ? "" : "text");
48
49
  });
49
50
  const tagName = computed(() => {
50
- const component = getFormField(type.value || "container") || resolveComponent(`m-${props.config.items ? "form" : "fields"}-${type.value}`);
51
+ const component = getFormField(type.value || "container") || resolveComponent(`m-${props.config.fieldConfig && "items" in props.config.fieldConfig ? "form" : "fields"}-${type.value}`);
51
52
  if (typeof component !== "string") return component;
52
53
  return "m-fields-text";
53
54
  });
@@ -1,6 +1,6 @@
1
1
  import { useServices } from "../hooks/use-services.js";
2
2
  import { getCascaderOptionsFromFields } from "../utils/data-source/index.js";
3
- import { MContainer, MPanel, MTable } from "@tmagic/form";
3
+ import { MContainer, MPanel, MTable, defineFormItem } from "@tmagic/form";
4
4
  import { TMagicButton } from "@tmagic/design";
5
5
  import { DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, traverseNode } from "@tmagic/utils";
6
6
  import { ActionType } from "@tmagic/core";
@@ -121,8 +121,8 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
121
121
  name: "to",
122
122
  text: "联动组件",
123
123
  type: "ui-select",
124
- display: (mForm, { model }) => model.actionType === ActionType.COMP,
125
- onChange: (MForm, v, { setModel }) => {
124
+ display: (_mForm, { model }) => model.actionType === ActionType.COMP,
125
+ onChange: (_MForm, _v, { setModel }) => {
126
126
  setModel("method", "");
127
127
  },
128
128
  ...props.config.targetCompConfig
@@ -189,7 +189,7 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
189
189
  ...props.config.dataSourceActionConfig
190
190
  };
191
191
  });
192
- const tableConfig = computed(() => ({
192
+ const tableConfig = computed(() => defineFormItem({
193
193
  type: "table",
194
194
  name: "events",
195
195
  items: [
@@ -222,7 +222,7 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
222
222
  }
223
223
  ]
224
224
  }));
225
- const actionsConfig = computed(() => ({
225
+ const actionsConfig = computed(() => defineFormItem({
226
226
  type: "panel",
227
227
  items: [{
228
228
  type: "group-list",
@@ -1,5 +1,5 @@
1
- import { MContainer } from "@tmagic/form";
2
- import { computed, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, unref } from "vue";
1
+ import { defineFormItem } from "@tmagic/form";
2
+ import { computed, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, resolveComponent } from "vue";
3
3
  //#region packages/editor/src/fields/StyleSetter/components/Border.vue?vue&type=script&setup=true&lang.ts
4
4
  var _hoisted_1 = { class: "border-box-container" };
5
5
  var _hoisted_2 = { class: "border-icon-container" };
@@ -17,7 +17,7 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
17
17
  emits: ["change"],
18
18
  setup(__props, { emit: __emit }) {
19
19
  const direction = ref("");
20
- const config = computed(() => ({ items: [
20
+ const config = computed(() => defineFormItem({ items: [
21
21
  {
22
22
  name: `border${direction.value}Width`,
23
23
  text: "边框宽度",
@@ -58,6 +58,7 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
58
58
  });
59
59
  };
60
60
  return (_ctx, _cache) => {
61
+ const _component_MContainer = resolveComponent("MContainer");
61
62
  return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
62
63
  createElementVNode("div", _hoisted_3, [createElementVNode("div", {
63
64
  class: normalizeClass(["border-icon border-icon-top", { active: direction.value === "Top" }]),
@@ -81,7 +82,7 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
81
82
  class: normalizeClass(["border-icon border-icon-bottom", { active: direction.value === "Bottom" }]),
82
83
  onClick: _cache[4] || (_cache[4] = ($event) => selectDirection("Bottom"))
83
84
  }, null, 2)])
84
- ]), createElementVNode("div", _hoisted_6, [createVNode(unref(MContainer), {
85
+ ]), createElementVNode("div", _hoisted_6, [createVNode(_component_MContainer, {
85
86
  config: config.value,
86
87
  model: __props.model,
87
88
  size: __props.size,
@@ -3,8 +3,8 @@ import Repeat_default from "../icons/background-repeat/Repeat.js";
3
3
  import RepeatX_default from "../icons/background-repeat/RepeatX.js";
4
4
  import RepeatY_default from "../icons/background-repeat/RepeatY.js";
5
5
  import NoRepeat_default from "../icons/background-repeat/NoRepeat.js";
6
- import { MContainer } from "@tmagic/form";
7
- import { createBlock, defineComponent, markRaw, openBlock, unref } from "vue";
6
+ import { defineFormItem } from "@tmagic/form";
7
+ import { createBlock, defineComponent, markRaw, openBlock, resolveComponent, unref } from "vue";
8
8
  //#region packages/editor/src/fields/StyleSetter/pro/Background.vue?vue&type=script&setup=true&lang.ts
9
9
  var Background_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
10
10
  __name: "Background",
@@ -16,7 +16,7 @@ var Background_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
16
16
  emits: ["change"],
17
17
  setup(__props, { emit: __emit }) {
18
18
  const emit = __emit;
19
- const config = { items: [
19
+ const config = defineFormItem({ items: [
20
20
  {
21
21
  name: "backgroundColor",
22
22
  text: "背景色",
@@ -91,18 +91,20 @@ var Background_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
91
91
  component: BackgroundPosition_default,
92
92
  labelWidth: "68px"
93
93
  }
94
- ] };
94
+ ] });
95
95
  const change = (value, eventData) => {
96
96
  emit("change", value, eventData);
97
97
  };
98
98
  return (_ctx, _cache) => {
99
- return openBlock(), createBlock(unref(MContainer), {
100
- config,
99
+ const _component_MContainer = resolveComponent("MContainer");
100
+ return openBlock(), createBlock(_component_MContainer, {
101
+ config: unref(config),
101
102
  model: __props.values,
102
103
  size: __props.size,
103
104
  disabled: __props.disabled,
104
105
  onChange: change
105
106
  }, null, 8, [
107
+ "config",
106
108
  "model",
107
109
  "size",
108
110
  "disabled"
@@ -1,6 +1,6 @@
1
1
  import Border_default from "../components/Border.js";
2
- import { MContainer } from "@tmagic/form";
3
- import { Fragment, createElementBlock, createVNode, defineComponent, openBlock, unref } from "vue";
2
+ import { defineFormItem } from "@tmagic/form";
3
+ import { Fragment, createElementBlock, createVNode, defineComponent, openBlock, resolveComponent, unref } from "vue";
4
4
  //#region packages/editor/src/fields/StyleSetter/pro/Border.vue?vue&type=script&setup=true&lang.ts
5
5
  var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
6
6
  __name: "Border",
@@ -12,24 +12,26 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
12
12
  emits: ["change"],
13
13
  setup(__props, { emit: __emit }) {
14
14
  const emit = __emit;
15
- const config = { items: [{
15
+ const config = defineFormItem({ items: [{
16
16
  labelWidth: "68px",
17
17
  name: "borderRadius",
18
18
  text: "圆角",
19
19
  type: "data-source-field-select",
20
20
  fieldConfig: { type: "text" }
21
- }] };
21
+ }] });
22
22
  const change = (value, eventData) => {
23
23
  emit("change", value, eventData);
24
24
  };
25
25
  return (_ctx, _cache) => {
26
- return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(MContainer), {
27
- config,
26
+ const _component_MContainer = resolveComponent("MContainer");
27
+ return openBlock(), createElementBlock(Fragment, null, [createVNode(_component_MContainer, {
28
+ config: unref(config),
28
29
  model: __props.values,
29
30
  size: __props.size,
30
31
  disabled: __props.disabled,
31
32
  onChange: change
32
33
  }, null, 8, [
34
+ "config",
33
35
  "model",
34
36
  "size",
35
37
  "disabled"
@@ -1,8 +1,8 @@
1
1
  import Left_default from "../icons/text-align/Left.js";
2
2
  import Center_default from "../icons/text-align/Center.js";
3
3
  import Right_default from "../icons/text-align/Right.js";
4
- import { MContainer } from "@tmagic/form";
5
- import { createBlock, defineComponent, markRaw, openBlock, unref } from "vue";
4
+ import { defineFormItem } from "@tmagic/form";
5
+ import { createBlock, defineComponent, markRaw, openBlock, resolveComponent, unref } from "vue";
6
6
  //#region packages/editor/src/fields/StyleSetter/pro/Font.vue?vue&type=script&setup=true&lang.ts
7
7
  var Font_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
8
8
  __name: "Font",
@@ -14,7 +14,7 @@ var Font_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
14
14
  emits: ["change"],
15
15
  setup(__props, { emit: __emit }) {
16
16
  const emit = __emit;
17
- const config = { items: [
17
+ const config = defineFormItem({ items: [
18
18
  {
19
19
  type: "row",
20
20
  items: [{
@@ -75,18 +75,20 @@ var Font_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
75
75
  }
76
76
  ]
77
77
  }
78
- ] };
78
+ ] });
79
79
  const change = (value, eventData) => {
80
80
  emit("change", value, eventData);
81
81
  };
82
82
  return (_ctx, _cache) => {
83
- return openBlock(), createBlock(unref(MContainer), {
84
- config,
83
+ const _component_MContainer = resolveComponent("MContainer");
84
+ return openBlock(), createBlock(_component_MContainer, {
85
+ config: unref(config),
85
86
  model: __props.values,
86
87
  size: __props.size,
87
88
  disabled: __props.disabled,
88
89
  onChange: change
89
90
  }, null, 8, [
91
+ "config",
90
92
  "model",
91
93
  "size",
92
94
  "disabled"
@@ -13,7 +13,7 @@ import FlexEnd_default from "../icons/justify-content/FlexEnd.js";
13
13
  import FlexStart_default from "../icons/justify-content/FlexStart.js";
14
14
  import SpaceAround_default from "../icons/justify-content/SpaceAround.js";
15
15
  import SpaceBetween_default from "../icons/justify-content/SpaceBetween.js";
16
- import { MContainer } from "@tmagic/form";
16
+ import { MContainer, defineFormItem } from "@tmagic/form";
17
17
  import { Fragment, createElementBlock, createVNode, defineComponent, markRaw, openBlock, unref, vShow, withDirectives } from "vue";
18
18
  //#region packages/editor/src/fields/StyleSetter/pro/Layout.vue?vue&type=script&setup=true&lang.ts
19
19
  var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
@@ -26,7 +26,7 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
26
26
  emits: ["change"],
27
27
  setup(__props, { emit: __emit }) {
28
28
  const emit = __emit;
29
- const config = { items: [
29
+ const config = defineFormItem({ items: [
30
30
  {
31
31
  name: "display",
32
32
  text: "模式",
@@ -89,7 +89,7 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
89
89
  tooltip: "垂直方向 起点在下沿 column-reverse"
90
90
  }
91
91
  ],
92
- display: (mForm, { model }) => model.display === "flex"
92
+ display: (_mForm, { model }) => model.display === "flex"
93
93
  },
94
94
  {
95
95
  name: "justifyContent",
@@ -124,7 +124,7 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
124
124
  tooltip: "横向平分 space-around"
125
125
  }
126
126
  ],
127
- display: (mForm, { model }) => model.display === "flex"
127
+ display: (_mForm, { model }) => model.display === "flex"
128
128
  },
129
129
  {
130
130
  name: "alignItems",
@@ -159,7 +159,7 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
159
159
  tooltip: "横向平分 space-around"
160
160
  }
161
161
  ],
162
- display: (mForm, { model }) => model.display === "flex"
162
+ display: (_mForm, { model }) => model.display === "flex"
163
163
  },
164
164
  {
165
165
  name: "flexWrap",
@@ -184,7 +184,7 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
184
184
  tooltip: "第一行在下方 wrap-reverse"
185
185
  }
186
186
  ],
187
- display: (mForm, { model }) => model.display === "flex"
187
+ display: (_mForm, { model }) => model.display === "flex"
188
188
  },
189
189
  {
190
190
  type: "row",
@@ -255,18 +255,19 @@ var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
255
255
  fieldConfig: { type: "text" }
256
256
  }]
257
257
  }
258
- ] };
258
+ ] });
259
259
  const change = (value, eventData) => {
260
260
  emit("change", value, eventData);
261
261
  };
262
262
  return (_ctx, _cache) => {
263
263
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(MContainer), {
264
- config,
264
+ config: unref(config),
265
265
  model: __props.values,
266
266
  size: __props.size,
267
267
  disabled: __props.disabled,
268
268
  onChange: change
269
269
  }, null, 8, [
270
+ "config",
270
271
  "model",
271
272
  "size",
272
273
  "disabled"
@@ -1,5 +1,5 @@
1
- import { MContainer } from "@tmagic/form";
2
- import { createBlock, defineComponent, openBlock, unref } from "vue";
1
+ import { defineFormItem } from "@tmagic/form";
2
+ import { createBlock, defineComponent, openBlock, resolveComponent, unref } from "vue";
3
3
  //#region packages/editor/src/fields/StyleSetter/pro/Position.vue?vue&type=script&setup=true&lang.ts
4
4
  var Position_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
5
5
  __name: "Position",
@@ -19,7 +19,7 @@ var Position_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
19
19
  fixed: "固定定位",
20
20
  sticky: "粘性定位"
21
21
  };
22
- const config = { items: [
22
+ const config = defineFormItem({ items: [
23
23
  {
24
24
  name: "position",
25
25
  text: "定位",
@@ -72,18 +72,20 @@ var Position_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
72
72
  type: "data-source-field-select",
73
73
  fieldConfig: { type: "text" }
74
74
  }
75
- ] };
75
+ ] });
76
76
  const change = (value, eventData) => {
77
77
  emit("change", value, eventData);
78
78
  };
79
79
  return (_ctx, _cache) => {
80
- return openBlock(), createBlock(unref(MContainer), {
81
- config,
80
+ const _component_MContainer = resolveComponent("MContainer");
81
+ return openBlock(), createBlock(_component_MContainer, {
82
+ config: unref(config),
82
83
  model: __props.values,
83
84
  size: __props.size,
84
85
  disabled: __props.disabled,
85
86
  onChange: change
86
87
  }, null, 8, [
88
+ "config",
87
89
  "model",
88
90
  "size",
89
91
  "disabled"
@@ -60,8 +60,9 @@ var Props = class extends BaseService_default {
60
60
  });
61
61
  }
62
62
  async setPropsConfig(type, config) {
63
- let c = config;
63
+ let c;
64
64
  if (typeof config === "function") c = config({ editorService: editor_default });
65
+ else c = config;
65
66
  this.state.propsConfigMap[toLine(type)] = await this.fillConfig(Array.isArray(c) ? c : [c]);
66
67
  }
67
68
  /**
@@ -1,73 +1,75 @@
1
1
  import base_default from "./formConfigs/base.js";
2
2
  import http_default from "./formConfigs/http.js";
3
+ import { defineFormItem } from "@tmagic/form";
3
4
  import { dataSourceTemplateRegExp, getKeysArray, isNumber } from "@tmagic/utils";
4
5
  //#region packages/editor/src/utils/data-source/index.ts
6
+ var dataSourceFormConfig = defineFormItem({
7
+ type: "tab",
8
+ items: [
9
+ {
10
+ title: "数据定义",
11
+ items: [{
12
+ name: "fields",
13
+ type: "data-source-fields",
14
+ defaultValue: () => []
15
+ }]
16
+ },
17
+ {
18
+ title: "方法定义",
19
+ items: [{
20
+ name: "methods",
21
+ type: "data-source-methods",
22
+ defaultValue: () => []
23
+ }]
24
+ },
25
+ {
26
+ title: "事件配置",
27
+ items: [{
28
+ name: "events",
29
+ src: "datasource",
30
+ type: "event-select"
31
+ }]
32
+ },
33
+ {
34
+ title: "mock数据",
35
+ items: [{
36
+ name: "mocks",
37
+ type: "data-source-mocks",
38
+ defaultValue: () => []
39
+ }]
40
+ },
41
+ {
42
+ title: "请求参数裁剪",
43
+ display: (_formState, { model }) => model.type === "http",
44
+ items: [{
45
+ name: "beforeRequest",
46
+ type: "vs-code",
47
+ parse: true,
48
+ autosize: {
49
+ minRows: 10,
50
+ maxRows: 30
51
+ }
52
+ }]
53
+ },
54
+ {
55
+ title: "响应数据裁剪",
56
+ display: (_formStat, { model }) => model.type === "http",
57
+ items: [{
58
+ name: "afterResponse",
59
+ type: "vs-code",
60
+ parse: true,
61
+ autosize: {
62
+ minRows: 10,
63
+ maxRows: 30
64
+ }
65
+ }]
66
+ }
67
+ ]
68
+ });
5
69
  var fillConfig = (config) => [
6
70
  ...base_default(),
7
71
  ...config,
8
- {
9
- type: "tab",
10
- items: [
11
- {
12
- title: "数据定义",
13
- items: [{
14
- name: "fields",
15
- type: "data-source-fields",
16
- defaultValue: () => []
17
- }]
18
- },
19
- {
20
- title: "方法定义",
21
- items: [{
22
- name: "methods",
23
- type: "data-source-methods",
24
- defaultValue: () => []
25
- }]
26
- },
27
- {
28
- title: "事件配置",
29
- items: [{
30
- name: "events",
31
- src: "datasource",
32
- type: "event-select"
33
- }]
34
- },
35
- {
36
- title: "mock数据",
37
- items: [{
38
- name: "mocks",
39
- type: "data-source-mocks",
40
- defaultValue: () => []
41
- }]
42
- },
43
- {
44
- title: "请求参数裁剪",
45
- display: (_formState, { model }) => model.type === "http",
46
- items: [{
47
- name: "beforeRequest",
48
- type: "vs-code",
49
- parse: true,
50
- autosize: {
51
- minRows: 10,
52
- maxRows: 30
53
- }
54
- }]
55
- },
56
- {
57
- title: "响应数据裁剪",
58
- display: (_formState, { model }) => model.type === "http",
59
- items: [{
60
- name: "afterResponse",
61
- type: "vs-code",
62
- parse: true,
63
- autosize: {
64
- minRows: 10,
65
- maxRows: 30
66
- }
67
- }]
68
- }
69
- ]
70
- }
72
+ dataSourceFormConfig
71
73
  ];
72
74
  var getFormConfig = (type, configs) => {
73
75
  switch (type) {
@@ -1,5 +1,5 @@
1
1
  //#region packages/editor/src/utils/dep/worker.ts?worker&inline
2
- var jsContent = "(function() {\n //#region packages/schema/src/index.ts\n const NODE_CONDS_KEY = \"displayConds\";\n const NODE_DISABLE_DATA_SOURCE_KEY = \"_tmagic_node_disabled_data_source\";\n const NODE_DISABLE_CODE_BLOCK_KEY = \"_tmagic_node_disabled_code_block\";\n let HookType = /* @__PURE__ */ function(HookType) {\n /** 代码块钩子标识 */\n HookType[\"CODE\"] = \"code\";\n return HookType;\n }({});\n //#endregion\n //#region packages/utils/src/index.ts\n const isObject = (obj) => Object.prototype.toString.call(obj) === \"[object Object]\";\n const getKeysArray = (keys) => `${keys}`.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n const DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX = \"ds-field::\";\n const dataSourceTemplateRegExp = /\\$\\{([\\s\\S]+?)\\}/g;\n //#endregion\n //#region packages/dep/src/types.ts\n /** 依赖收集的目标类型 */\n let DepTargetType = /* @__PURE__ */ function(DepTargetType) {\n DepTargetType[\"DEFAULT\"] = \"default\";\n /** 代码块 */\n DepTargetType[\"CODE_BLOCK\"] = \"code-block\";\n /** 数据源 */\n DepTargetType[\"DATA_SOURCE\"] = \"data-source\";\n /** 数据源方法 */\n DepTargetType[\"DATA_SOURCE_METHOD\"] = \"data-source-method\";\n /** 数据源条件 */\n DepTargetType[\"DATA_SOURCE_COND\"] = \"data-source-cond\";\n return DepTargetType;\n }({});\n //#endregion\n //#region packages/dep/src/Target.ts\n /**\n * 需要收集依赖的目标\n * 例如:一个代码块可以为一个目标\n */\n var Target = class {\n /**\n * 如何识别目标\n */\n isTarget;\n /**\n * 目标id,不可重复\n * 例如目标是代码块,则为代码块id\n */\n id;\n /**\n * 目标名称,用于显示在依赖列表中\n */\n name;\n /**\n * 不同的目标可以进行分类,例如代码块,数据源可以为两个不同的type\n */\n type = DepTargetType.DEFAULT;\n /**\n * 依赖详情\n * 实例:{ 'node_id': { name: 'node_name', keys: [ created, mounted ] } }\n */\n deps = {};\n /**\n * 是否默认收集,默认为true,当值为false时需要传入type参数给collect方法才会被收集\n */\n isCollectByDefault;\n constructor(options) {\n this.isTarget = options.isTarget;\n this.id = options.id;\n this.name = options.name;\n this.isCollectByDefault = options.isCollectByDefault ?? true;\n if (options.type) this.type = options.type;\n if (options.initialDeps) this.deps = options.initialDeps;\n }\n /**\n * 更新依赖\n * @param option 节点配置\n * @param key 哪个key配置了这个目标的id\n */\n updateDep({ id, name, key, data }) {\n const dep = this.deps[id] || {\n name,\n keys: []\n };\n dep.name = name;\n dep.data = data;\n this.deps[id] = dep;\n if (dep.keys.indexOf(key) === -1) dep.keys.push(key);\n }\n /**\n * 删除依赖\n * @param node 哪个节点的依赖需要移除,如果为空,则移除所有依赖\n * @param key 节点下哪个key需要移除,如果为空,则移除改节点下的所有依赖key\n * @returns void\n */\n removeDep(id, key) {\n if (typeof id === \"undefined\") {\n Object.keys(this.deps).forEach((depKey) => {\n delete this.deps[depKey];\n });\n return;\n }\n const dep = this.deps[id];\n if (!dep) return;\n if (key) {\n const index = dep.keys.indexOf(key);\n dep.keys.splice(index, 1);\n if (dep.keys.length === 0) delete this.deps[id];\n } else delete this.deps[id];\n }\n /**\n * 判断指定节点下的指定key是否存在在依赖列表中\n * @param node 哪个节点\n * @param key 哪个key\n * @returns boolean\n */\n hasDep(id, key) {\n const dep = this.deps[id];\n return Boolean(dep?.keys.find((d) => d === key));\n }\n destroy() {\n this.deps = {};\n }\n };\n //#endregion\n //#region packages/dep/src/utils.ts\n const createCodeBlockTarget = (id, codeBlock, initialDeps = {}) => new Target({\n type: DepTargetType.CODE_BLOCK,\n id,\n initialDeps,\n name: codeBlock.name,\n isTarget: (_key, value) => {\n if (id === value) return true;\n if (value?.hookType === HookType.CODE && Array.isArray(value.hookData)) {\n const index = value.hookData.findIndex((item) => item.codeId === id);\n return Boolean(index > -1);\n }\n return false;\n }\n });\n /**\n * ['array'] ['array', '0'] ['array', '0', 'a'] 这种返回false\n * ['array', 'a'] 这种返回true\n * @param keys\n * @param fields\n * @returns boolean\n */\n const isIncludeArrayField = (keys, fields) => {\n let f = fields;\n return keys.some((key, index) => {\n const field = f.find(({ name }) => name === key);\n f = field?.fields || [];\n return field?.type === \"array\" && /^(?!\\d+$).*$/.test(`${keys[index + 1]}`) && index < keys.length - 1;\n });\n };\n /**\n * 判断模板(value)是不是使用数据源Id(dsId),如:`xxx${dsId.field}xxx${dsId.field}`\n * @param value any\n * @param dsId string | number\n * @param hasArray boolean true: 一定要包含有需要迭代的模板; false: 一定要包含普通模板;\n * @returns boolean\n */\n const isDataSourceTemplate = (value, ds, hasArray = false) => {\n const templates = value.match(dataSourceTemplateRegExp) || [];\n if (templates.length <= 0) return false;\n const arrayFieldTemplates = [];\n const fieldTemplates = [];\n templates.forEach((tpl) => {\n const keys = getKeysArray(tpl.substring(2, tpl.length - 1));\n const dsId = keys.shift();\n if (!dsId || dsId !== ds.id) return;\n if (isIncludeArrayField(keys, ds.fields)) arrayFieldTemplates.push(tpl);\n else fieldTemplates.push(tpl);\n });\n if (hasArray) return arrayFieldTemplates.length > 0;\n return fieldTemplates.length > 0;\n };\n /**\n * 指定数据源的字符串模板,如:{ isBindDataSourceField: true, dataSourceId: 'id', template: `xxx${field}xxx`}\n * @param value any\n * @param dsId string | number\n * @returns boolean\n */\n const isSpecificDataSourceTemplate = (value, dsId) => value?.isBindDataSourceField && value.dataSourceId && value.dataSourceId === dsId && typeof value.template === \"string\";\n /**\n * 关联数据源字段,格式为 [前缀+数据源ID, 字段名]\n * 使用data-source-field-select value: 'value' 可以配置出来\n * @param value any[]\n * @param id string | number\n * @returns boolean\n */\n const isUseDataSourceField = (value, id) => {\n if (!Array.isArray(value) || typeof value[0] !== \"string\") return false;\n const [prefixId] = value;\n const prefixIndex = prefixId.indexOf(DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX);\n if (prefixIndex === -1) return false;\n return prefixId.substring(prefixIndex + DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX.length) === id;\n };\n const isDataSourceTarget = (ds, key, value, hasArray = false) => {\n if (!value || ![\"string\", \"object\"].includes(typeof value)) return false;\n if (`${key}`.startsWith(\"displayConds\")) return false;\n if (typeof value === \"string\") return isDataSourceTemplate(value, ds, hasArray);\n if (isObject(value) && value?.isBindDataSource && value.dataSourceId && value.dataSourceId === ds.id) return true;\n if (isSpecificDataSourceTemplate(value, ds.id)) return true;\n if (isUseDataSourceField(value, ds.id)) {\n const [, ...keys] = value;\n const includeArray = isIncludeArrayField(keys, ds.fields);\n if (hasArray) return includeArray;\n return !includeArray;\n }\n return false;\n };\n const isDataSourceCondTarget = (ds, key, value, hasArray = false) => {\n if (!Array.isArray(value) || !ds) return false;\n const [dsId, ...keys] = value;\n if (dsId !== ds.id || !`${key}`.startsWith(\"displayConds\")) return false;\n if (ds.fields?.find((field) => field.name === keys[0])) {\n const includeArray = isIncludeArrayField(keys, ds.fields);\n if (hasArray) return includeArray;\n return !includeArray;\n }\n return false;\n };\n const createDataSourceTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceTarget(ds, key, value)\n });\n const createDataSourceCondTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_COND,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceCondTarget(ds, key, value)\n });\n const createDataSourceMethodTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_METHOD,\n id: ds.id,\n initialDeps,\n isTarget: (_key, value) => {\n if (!Array.isArray(value)) return false;\n const [dsId, methodName] = value;\n if (!methodName || dsId !== ds.id) return false;\n if (ds.methods?.find((method) => method.name === methodName)) return true;\n if (ds.fields?.find((field) => field.name === methodName)) return false;\n return true;\n }\n });\n const traverseTarget = (targetsList, cb, type) => {\n for (const targets of Object.values(targetsList)) for (const target of Object.values(targets)) {\n if (type && target.type !== type) continue;\n cb(target);\n }\n };\n //#endregion\n //#region packages/dep/src/Watcher.ts\n var Watcher = class {\n targetsList = {};\n childrenProp = \"items\";\n idProp = \"id\";\n nameProp = \"name\";\n constructor(options) {\n if (options?.initialTargets) this.targetsList = options.initialTargets;\n if (options?.childrenProp) this.childrenProp = options.childrenProp;\n }\n getTargetsList() {\n return this.targetsList;\n }\n /**\n * 获取指定类型中的所有target\n * @param type 分类\n * @returns Target[]\n */\n getTargets(type = DepTargetType.DEFAULT) {\n return this.targetsList[type] || {};\n }\n /**\n * 添加新的目标\n * @param target Target\n */\n addTarget(target) {\n const targets = this.getTargets(target.type) || {};\n this.targetsList[target.type] = targets;\n targets[target.id] = target;\n }\n /**\n * 获取指定id的target\n * @param id target id\n * @returns Target\n */\n getTarget(id, type = DepTargetType.DEFAULT) {\n return this.getTargets(type)[id];\n }\n /**\n * 判断是否存在指定id的target\n * @param id target id\n * @returns boolean\n */\n hasTarget(id, type = DepTargetType.DEFAULT) {\n return Boolean(this.getTarget(id, type));\n }\n /**\n * 判断是否存在指定类型的target\n * @param type target type\n * @returns boolean\n */\n hasSpecifiedTypeTarget(type = DepTargetType.DEFAULT) {\n return Object.keys(this.getTargets(type)).length > 0;\n }\n /**\n * 删除指定id的target\n * @param id target id\n */\n removeTarget(id, type = DepTargetType.DEFAULT) {\n const targets = this.getTargets(type);\n if (targets[id]) {\n targets[id].destroy();\n delete targets[id];\n }\n }\n /**\n * 删除指定分类的所有target\n * @param type 分类\n * @returns void\n */\n removeTargets(type = DepTargetType.DEFAULT) {\n const targets = this.targetsList[type];\n if (!targets) return;\n for (const target of Object.values(targets)) target.destroy();\n delete this.targetsList[type];\n }\n /**\n * 删除所有target\n */\n clearTargets() {\n for (const key of Object.keys(this.targetsList)) delete this.targetsList[key];\n }\n /**\n * 收集依赖\n * @param nodes 需要收集的节点\n * @param deep 是否需要收集子节点\n * @param type 强制收集指定类型的依赖\n */\n collect(nodes, depExtendedData = {}, deep = false, type) {\n this.collectByCallback(nodes, type, ({ node, target }) => {\n this.removeTargetDep(target, node);\n this.collectItem(node, target, depExtendedData, deep);\n });\n }\n collectByCallback(nodes, type, cb) {\n traverseTarget(this.targetsList, (target) => {\n if (!type && !target.isCollectByDefault) return;\n for (const node of nodes) cb({\n node,\n target\n });\n }, type);\n }\n /**\n * 清除所有目标的依赖\n * @param nodes 需要清除依赖的节点\n */\n clear(nodes, type) {\n let { targetsList } = this;\n if (type) targetsList = { [type]: this.getTargets(type) };\n const clearedItemsNodeIds = [];\n traverseTarget(targetsList, (target) => {\n if (nodes) for (const node of nodes) {\n target.removeDep(node[this.idProp]);\n if (Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length && !clearedItemsNodeIds.includes(node[this.idProp])) {\n clearedItemsNodeIds.push(node[this.idProp]);\n this.clear(node[this.childrenProp]);\n }\n }\n else target.removeDep();\n });\n }\n /**\n * 清除指定类型的依赖\n * @param type 类型\n * @param nodes 需要清除依赖的节点\n */\n clearByType(type, nodes) {\n this.clear(nodes, type);\n }\n collectItem(node, target, depExtendedData = {}, deep = false) {\n const dataSourceTargetTypes = [\n DepTargetType.DATA_SOURCE,\n DepTargetType.DATA_SOURCE_COND,\n DepTargetType.DATA_SOURCE_METHOD\n ];\n if (node[\"_tmagic_node_disabled_data_source\"] && dataSourceTargetTypes.includes(target.type)) return;\n if (node[\"_tmagic_node_disabled_code_block\"] && target.type === DepTargetType.CODE_BLOCK) return;\n const collectTarget = (config, prop = \"\") => {\n const doCollect = (key, value) => {\n const keyIsItems = key === this.childrenProp;\n const fullKey = prop ? `${prop}.${key}` : key;\n if (target.isTarget(fullKey, value)) target.updateDep({\n id: node[this.idProp],\n name: `${node[this.nameProp] || node[this.idProp]}`,\n data: depExtendedData,\n key: fullKey\n });\n else if (!keyIsItems && Array.isArray(value)) for (let i = 0, l = value.length; i < l; i++) {\n const item = value[i];\n if (isObject(item)) collectTarget(item, `${fullKey}[${i}]`);\n }\n else if (isObject(value)) collectTarget(value, fullKey);\n if (keyIsItems && deep && Array.isArray(value)) for (const child of value) this.collectItem(child, target, depExtendedData, deep);\n };\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === \"undefined\" || value === \"\") continue;\n doCollect(key, value);\n }\n };\n collectTarget(node);\n }\n removeTargetDep(target, node, key) {\n target.removeDep(node[this.idProp], key);\n if (typeof key === \"undefined\" && Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length) for (const item of node[this.childrenProp]) this.removeTargetDep(target, item, key);\n }\n };\n //#endregion\n //#region packages/editor/src/utils/logger.ts\n const error = (...args) => {};\n //#endregion\n //#region packages/editor/src/utils/dep/worker.ts\n onmessage = (e) => {\n const watcher = new Watcher({ initialTargets: {} });\n const { dsl } = e.data;\n try {\n const mApp = eval(`(${dsl})`);\n if (!mApp) postMessage({});\n watcher.clearTargets();\n if (mApp.codeBlocks) for (const [id, code] of Object.entries(mApp.codeBlocks)) watcher.addTarget(createCodeBlockTarget(id, code));\n if (mApp.dataSources) for (const ds of mApp.dataSources) {\n watcher.addTarget(createDataSourceTarget(ds, {}));\n watcher.addTarget(createDataSourceMethodTarget(ds, {}));\n watcher.addTarget(createDataSourceCondTarget(ds, {}));\n }\n watcher.collectByCallback(mApp.items, void 0, ({ node, target }) => {\n watcher.collectItem(node, target, { pageId: node.id }, true);\n });\n const data = {\n [DepTargetType.DATA_SOURCE]: {},\n [DepTargetType.DATA_SOURCE_METHOD]: {},\n [DepTargetType.DATA_SOURCE_COND]: {},\n [DepTargetType.CODE_BLOCK]: {}\n };\n traverseTarget(watcher.getTargetsList(), (target) => {\n data[target.type][target.id] = target.deps;\n });\n postMessage(data);\n } catch (e) {\n postMessage({});\n }\n };\n //#endregion\n})();\n";
2
+ var jsContent = "(function() {\n //#region packages/schema/src/index.ts\n const NODE_CONDS_KEY = \"displayConds\";\n const NODE_DISABLE_DATA_SOURCE_KEY = \"_tmagic_node_disabled_data_source\";\n const NODE_DISABLE_CODE_BLOCK_KEY = \"_tmagic_node_disabled_code_block\";\n let HookType = /* @__PURE__ */ function(HookType) {\n /** 代码块钩子标识 */\n HookType[\"CODE\"] = \"code\";\n return HookType;\n }({});\n //#endregion\n //#region packages/utils/src/index.ts\n const isObject = (obj) => Object.prototype.toString.call(obj) === \"[object Object]\";\n const getKeysArray = (keys) => `${keys}`.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n const DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX = \"ds-field::\";\n const dataSourceTemplateRegExp = /\\$\\{([\\s\\S]+?)\\}/g;\n //#endregion\n //#region packages/dep/src/types.ts\n /** 依赖收集的目标类型 */\n let DepTargetType = /* @__PURE__ */ function(DepTargetType) {\n DepTargetType[\"DEFAULT\"] = \"default\";\n /** 代码块 */\n DepTargetType[\"CODE_BLOCK\"] = \"code-block\";\n /** 数据源 */\n DepTargetType[\"DATA_SOURCE\"] = \"data-source\";\n /** 数据源方法 */\n DepTargetType[\"DATA_SOURCE_METHOD\"] = \"data-source-method\";\n /** 数据源条件 */\n DepTargetType[\"DATA_SOURCE_COND\"] = \"data-source-cond\";\n return DepTargetType;\n }({});\n //#endregion\n //#region packages/dep/src/Target.ts\n /**\n * 需要收集依赖的目标\n * 例如:一个代码块可以为一个目标\n */\n var Target = class {\n /**\n * 如何识别目标\n */\n isTarget;\n /**\n * 目标id,不可重复\n * 例如目标是代码块,则为代码块id\n */\n id;\n /**\n * 目标名称,用于显示在依赖列表中\n */\n name;\n /**\n * 不同的目标可以进行分类,例如代码块,数据源可以为两个不同的type\n */\n type = DepTargetType.DEFAULT;\n /**\n * 依赖详情\n * 实例:{ 'node_id': { name: 'node_name', keys: [ created, mounted ] } }\n */\n deps = {};\n /**\n * 是否默认收集,默认为true,当值为false时需要传入type参数给collect方法才会被收集\n */\n isCollectByDefault;\n constructor(options) {\n this.isTarget = options.isTarget;\n this.id = options.id;\n this.name = options.name;\n this.isCollectByDefault = options.isCollectByDefault ?? true;\n if (options.type) this.type = options.type;\n if (options.initialDeps) this.deps = options.initialDeps;\n }\n /**\n * 更新依赖\n * @param option 节点配置\n * @param key 哪个key配置了这个目标的id\n */\n updateDep({ id, name, key, data }) {\n const dep = this.deps[id] || {\n name,\n keys: []\n };\n dep.name = name;\n dep.data = data;\n this.deps[id] = dep;\n if (!dep.keys.includes(key)) dep.keys.push(key);\n }\n /**\n * 删除依赖\n * @param node 哪个节点的依赖需要移除,如果为空,则移除所有依赖\n * @param key 节点下哪个key需要移除,如果为空,则移除改节点下的所有依赖key\n * @returns void\n */\n removeDep(id, key) {\n if (typeof id === \"undefined\") {\n Object.keys(this.deps).forEach((depKey) => {\n delete this.deps[depKey];\n });\n return;\n }\n const dep = this.deps[id];\n if (!dep) return;\n if (key) {\n const index = dep.keys.indexOf(key);\n dep.keys.splice(index, 1);\n if (dep.keys.length === 0) delete this.deps[id];\n } else delete this.deps[id];\n }\n /**\n * 判断指定节点下的指定key是否存在在依赖列表中\n * @param node 哪个节点\n * @param key 哪个key\n * @returns boolean\n */\n hasDep(id, key) {\n return this.deps[id]?.keys.includes(key) ?? false;\n }\n destroy() {\n this.deps = {};\n }\n };\n //#endregion\n //#region packages/dep/src/utils.ts\n const INTEGER_REGEXP = /^\\d+$/;\n const createCodeBlockTarget = (id, codeBlock, initialDeps = {}) => new Target({\n type: DepTargetType.CODE_BLOCK,\n id,\n initialDeps,\n name: codeBlock.name,\n isTarget: (_key, value) => {\n if (id === value) return true;\n if (value?.hookType === HookType.CODE && Array.isArray(value.hookData)) return value.hookData.some((item) => item.codeId === id);\n return false;\n }\n });\n /**\n * ['array'] ['array', '0'] ['array', '0', 'a'] 这种返回false\n * ['array', 'a'] 这种返回true\n * @param keys\n * @param fields\n * @returns boolean\n */\n const isIncludeArrayField = (keys, fields) => {\n let f = fields;\n return keys.some((key, index) => {\n const field = f.find(({ name }) => name === key);\n f = field?.fields || [];\n return field?.type === \"array\" && index < keys.length - 1 && !INTEGER_REGEXP.test(keys[index + 1]);\n });\n };\n /**\n * 判断模板(value)是不是使用数据源Id(dsId),如:`xxx${dsId.field}xxx${dsId.field}`\n * @param value any\n * @param dsId string | number\n * @param hasArray boolean true: 一定要包含有需要迭代的模板; false: 一定要包含普通模板;\n * @returns boolean\n */\n const isDataSourceTemplate = (value, ds, hasArray = false) => {\n const templates = value.match(dataSourceTemplateRegExp) || [];\n if (templates.length <= 0) return false;\n for (const tpl of templates) {\n const keys = getKeysArray(tpl.substring(2, tpl.length - 1));\n const dsId = keys.shift();\n if (!dsId || dsId !== ds.id) continue;\n if (hasArray === isIncludeArrayField(keys, ds.fields)) return true;\n }\n return false;\n };\n /**\n * 指定数据源的字符串模板,如:{ isBindDataSourceField: true, dataSourceId: 'id', template: `xxx${field}xxx`}\n * @param value any\n * @param dsId string | number\n * @returns boolean\n */\n const isSpecificDataSourceTemplate = (value, dsId) => value?.isBindDataSourceField && value.dataSourceId && value.dataSourceId === dsId && typeof value.template === \"string\";\n /**\n * 关联数据源字段,格式为 [前缀+数据源ID, 字段名]\n * 使用data-source-field-select value: 'value' 可以配置出来\n * @param value any[]\n * @param id string | number\n * @returns boolean\n */\n const isUseDataSourceField = (value, id) => {\n if (!Array.isArray(value) || typeof value[0] !== \"string\") return false;\n const [prefixId] = value;\n const prefixIndex = prefixId.indexOf(DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX);\n if (prefixIndex === -1) return false;\n return prefixId.substring(prefixIndex + DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX.length) === id;\n };\n const isDataSourceTarget = (ds, key, value, hasArray = false) => {\n if (!value) return false;\n const valueType = typeof value;\n if (valueType !== \"string\" && valueType !== \"object\") return false;\n if (`${key}`.startsWith(\"displayConds\")) return false;\n if (valueType === \"string\") return isDataSourceTemplate(value, ds, hasArray);\n if (isObject(value) && value.isBindDataSource && value.dataSourceId === ds.id) return true;\n if (isSpecificDataSourceTemplate(value, ds.id)) return true;\n if (isUseDataSourceField(value, ds.id)) {\n const [, ...keys] = value;\n const includeArray = isIncludeArrayField(keys, ds.fields);\n return hasArray ? includeArray : !includeArray;\n }\n return false;\n };\n const isDataSourceCondTarget = (ds, key, value, hasArray = false) => {\n if (!Array.isArray(value) || !ds) return false;\n const [dsId, ...keys] = value;\n if (dsId !== ds.id || !`${key}`.startsWith(\"displayConds\")) return false;\n if (ds.fields?.some((field) => field.name === keys[0])) {\n const includeArray = isIncludeArrayField(keys, ds.fields);\n return hasArray ? includeArray : !includeArray;\n }\n return false;\n };\n const createDataSourceTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceTarget(ds, key, value)\n });\n const createDataSourceCondTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_COND,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceCondTarget(ds, key, value)\n });\n const createDataSourceMethodTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_METHOD,\n id: ds.id,\n initialDeps,\n isTarget: (_key, value) => {\n if (!Array.isArray(value)) return false;\n const [dsId, methodName] = value;\n if (!methodName || dsId !== ds.id) return false;\n if (ds.methods?.some((method) => method.name === methodName)) return true;\n if (ds.fields?.some((field) => field.name === methodName)) return false;\n return true;\n }\n });\n const traverseTarget = (targetsList, cb, type) => {\n if (type) {\n const targets = targetsList[type];\n if (targets) for (const target of Object.values(targets)) cb(target);\n return;\n }\n for (const targets of Object.values(targetsList)) for (const target of Object.values(targets)) cb(target);\n };\n //#endregion\n //#region packages/dep/src/Watcher.ts\n const DATA_SOURCE_TARGET_TYPES = new Set([\n DepTargetType.DATA_SOURCE,\n DepTargetType.DATA_SOURCE_COND,\n DepTargetType.DATA_SOURCE_METHOD\n ]);\n var Watcher = class {\n targetsList = {};\n childrenProp = \"items\";\n idProp = \"id\";\n nameProp = \"name\";\n constructor(options) {\n if (options?.initialTargets) this.targetsList = options.initialTargets;\n if (options?.childrenProp) this.childrenProp = options.childrenProp;\n }\n getTargetsList() {\n return this.targetsList;\n }\n /**\n * 获取指定类型中的所有target\n * @param type 分类\n * @returns Target[]\n */\n getTargets(type = DepTargetType.DEFAULT) {\n return this.targetsList[type] || {};\n }\n /**\n * 添加新的目标\n * @param target Target\n */\n addTarget(target) {\n const targets = this.getTargets(target.type) || {};\n this.targetsList[target.type] = targets;\n targets[target.id] = target;\n }\n /**\n * 获取指定id的target\n * @param id target id\n * @returns Target\n */\n getTarget(id, type = DepTargetType.DEFAULT) {\n return this.getTargets(type)[id];\n }\n /**\n * 判断是否存在指定id的target\n * @param id target id\n * @returns boolean\n */\n hasTarget(id, type = DepTargetType.DEFAULT) {\n return Boolean(this.getTarget(id, type));\n }\n /**\n * 判断是否存在指定类型的target\n * @param type target type\n * @returns boolean\n */\n hasSpecifiedTypeTarget(type = DepTargetType.DEFAULT) {\n return Object.keys(this.getTargets(type)).length > 0;\n }\n /**\n * 删除指定id的target\n * @param id target id\n */\n removeTarget(id, type = DepTargetType.DEFAULT) {\n const targets = this.getTargets(type);\n if (targets[id]) {\n targets[id].destroy();\n delete targets[id];\n }\n }\n /**\n * 删除指定分类的所有target\n * @param type 分类\n * @returns void\n */\n removeTargets(type = DepTargetType.DEFAULT) {\n const targets = this.targetsList[type];\n if (!targets) return;\n for (const target of Object.values(targets)) target.destroy();\n delete this.targetsList[type];\n }\n /**\n * 删除所有target\n */\n clearTargets() {\n for (const key of Object.keys(this.targetsList)) delete this.targetsList[key];\n }\n /**\n * 收集依赖\n * @param nodes 需要收集的节点\n * @param deep 是否需要收集子节点\n * @param type 强制收集指定类型的依赖\n */\n collect(nodes, depExtendedData = {}, deep = false, type) {\n this.collectByCallback(nodes, type, ({ node, target }) => {\n this.removeTargetDep(target, node);\n this.collectItem(node, target, depExtendedData, deep);\n });\n }\n collectByCallback(nodes, type, cb) {\n traverseTarget(this.targetsList, (target) => {\n if (!type && !target.isCollectByDefault) return;\n for (const node of nodes) cb({\n node,\n target\n });\n }, type);\n }\n /**\n * 清除所有目标的依赖\n * @param nodes 需要清除依赖的节点\n */\n clear(nodes, type) {\n let { targetsList } = this;\n if (type) targetsList = { [type]: this.getTargets(type) };\n const clearedItemsNodeIds = /* @__PURE__ */ new Set();\n traverseTarget(targetsList, (target) => {\n if (nodes) for (const node of nodes) {\n target.removeDep(node[this.idProp]);\n if (Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length && !clearedItemsNodeIds.has(node[this.idProp])) {\n clearedItemsNodeIds.add(node[this.idProp]);\n this.clear(node[this.childrenProp]);\n }\n }\n else target.removeDep();\n });\n }\n /**\n * 清除指定类型的依赖\n * @param type 类型\n * @param nodes 需要清除依赖的节点\n */\n clearByType(type, nodes) {\n this.clear(nodes, type);\n }\n collectItem(node, target, depExtendedData = {}, deep = false) {\n if (node[\"_tmagic_node_disabled_data_source\"] && DATA_SOURCE_TARGET_TYPES.has(target.type)) return;\n if (node[\"_tmagic_node_disabled_code_block\"] && target.type === DepTargetType.CODE_BLOCK) return;\n const collectTarget = (config, prop = \"\") => {\n const doCollect = (key, value) => {\n const keyIsItems = key === this.childrenProp;\n const fullKey = prop ? `${prop}.${key}` : key;\n if (target.isTarget(fullKey, value)) target.updateDep({\n id: node[this.idProp],\n name: `${node[this.nameProp] || node[this.idProp]}`,\n data: depExtendedData,\n key: fullKey\n });\n else if (!keyIsItems && Array.isArray(value)) for (let i = 0, l = value.length; i < l; i++) {\n const item = value[i];\n if (isObject(item)) collectTarget(item, `${fullKey}[${i}]`);\n }\n else if (isObject(value)) collectTarget(value, fullKey);\n if (keyIsItems && deep && Array.isArray(value)) for (const child of value) this.collectItem(child, target, depExtendedData, deep);\n };\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === \"undefined\" || value === \"\") continue;\n doCollect(key, value);\n }\n };\n collectTarget(node);\n }\n removeTargetDep(target, node, key) {\n target.removeDep(node[this.idProp], key);\n if (typeof key === \"undefined\" && Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length) for (const item of node[this.childrenProp]) this.removeTargetDep(target, item, key);\n }\n };\n //#endregion\n //#region packages/editor/src/utils/logger.ts\n const error = (...args) => {};\n //#endregion\n //#region packages/editor/src/utils/dep/worker.ts\n onmessage = (e) => {\n const watcher = new Watcher({ initialTargets: {} });\n const { dsl } = e.data;\n try {\n const mApp = eval(`(${dsl})`);\n if (!mApp) postMessage({});\n watcher.clearTargets();\n if (mApp.codeBlocks) for (const [id, code] of Object.entries(mApp.codeBlocks)) watcher.addTarget(createCodeBlockTarget(id, code));\n if (mApp.dataSources) for (const ds of mApp.dataSources) {\n watcher.addTarget(createDataSourceTarget(ds, {}));\n watcher.addTarget(createDataSourceMethodTarget(ds, {}));\n watcher.addTarget(createDataSourceCondTarget(ds, {}));\n }\n watcher.collectByCallback(mApp.items, void 0, ({ node, target }) => {\n watcher.collectItem(node, target, { pageId: node.id }, true);\n });\n const data = {\n [DepTargetType.DATA_SOURCE]: {},\n [DepTargetType.DATA_SOURCE_METHOD]: {},\n [DepTargetType.DATA_SOURCE_COND]: {},\n [DepTargetType.CODE_BLOCK]: {}\n };\n traverseTarget(watcher.getTargetsList(), (target) => {\n data[target.type][target.id] = target.deps;\n });\n postMessage(data);\n } catch (e) {\n postMessage({});\n }\n };\n //#endregion\n})();\n";
3
3
  var blob = typeof self !== "undefined" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", jsContent], { type: "text/javascript;charset=utf-8" });
4
4
  function WorkerWrapper(options) {
5
5
  let objURL;
@@ -183,12 +183,12 @@ var displayTabConfig = {
183
183
  */
184
184
  var fillConfig = (config = [], { labelWidth = "80px", disabledDataSource = false, disabledCodeBlock = false } = {}) => {
185
185
  const propsConfig = [];
186
- if (!config.find((item) => item.name === "type")) propsConfig.push({
186
+ if (!config.find((item) => "name" in item && item.name === "type")) propsConfig.push({
187
187
  text: "type",
188
188
  name: "type",
189
189
  type: "hidden"
190
190
  });
191
- if (!config.find((item) => item.name === "id")) propsConfig.push({
191
+ if (!config.find((item) => "name" in item && item.name === "id")) propsConfig.push({
192
192
  name: "id",
193
193
  text: "ID",
194
194
  type: "text",
@@ -205,11 +205,11 @@ var fillConfig = (config = [], { labelWidth = "80px", disabledDataSource = false
205
205
  }
206
206
  }
207
207
  });
208
- if (!config.find((item) => item.name === "name")) propsConfig.push({
208
+ if (!config.find((item) => "name" in item && item.name === "name")) propsConfig.push({
209
209
  name: "name",
210
210
  text: "组件名称"
211
211
  });
212
- const noCodeAdvancedTabItems = advancedTabConfig.items.filter((item) => item.type !== "code-select");
212
+ const noCodeAdvancedTabItems = advancedTabConfig.items.filter((item) => "type" in item && item.type !== "code-select");
213
213
  if (noCodeAdvancedTabItems.length > 0 && disabledCodeBlock) advancedTabConfig.items = noCodeAdvancedTabItems;
214
214
  const tabConfig = {
215
215
  type: "tab",