@mybricks/to-code-taro 1.1.0 → 1.1.4

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 (101) hide show
  1. package/dist/cjs/core/comlib/{index.js → Index.js} +6 -6
  2. package/dist/cjs/core/utils/PopupRenderer.js +1 -1
  3. package/dist/cjs/core/utils/hooks.js +102 -38
  4. package/dist/cjs/core/utils/slots.js +11 -4
  5. package/dist/cjs/core/utils/useContext.js +6 -4
  6. package/dist/cjs/core/utils/with.js +3 -3
  7. package/dist/cjs/generate/generateTaroProjectJson.js +36 -11
  8. package/dist/cjs/generate/utils/commonDir.js +14 -10
  9. package/dist/cjs/generate/utils/pageImages.d.ts +14 -0
  10. package/dist/cjs/generate/utils/pageImages.js +36 -0
  11. package/dist/cjs/handleCom.js +37 -14
  12. package/dist/cjs/handleDom.d.ts +2 -0
  13. package/dist/cjs/handleDom.js +5 -2
  14. package/dist/cjs/handleGlobal.js +4 -2
  15. package/dist/cjs/handleSlot.d.ts +3 -0
  16. package/dist/cjs/handleSlot.js +38 -10
  17. package/dist/cjs/processors/processScene.js +3 -1
  18. package/dist/cjs/taro-template.json +313 -13
  19. package/dist/cjs/toCodeTaro.d.ts +4 -1
  20. package/dist/cjs/toCodeTaro.js +80 -1
  21. package/dist/cjs/utils/builder/buildResult.js +3 -16
  22. package/dist/cjs/utils/config/content/converter.js +2 -2
  23. package/dist/cjs/utils/config/content/pageConfig.js +4 -1
  24. package/dist/cjs/utils/config/content/saveBase64Image.d.ts +10 -0
  25. package/dist/cjs/utils/config/content/saveBase64Image.js +44 -3
  26. package/dist/cjs/utils/config/content/tabBarConfig.js +8 -2
  27. package/dist/cjs/utils/config/handlePageConfig.js +5 -3
  28. package/dist/cjs/utils/context/collectJSModules.d.ts +4 -0
  29. package/dist/cjs/utils/context/collectJSModules.js +4 -2
  30. package/dist/cjs/utils/logic/genJSModules.d.ts +8 -4
  31. package/dist/cjs/utils/logic/genJSModules.js +31 -33
  32. package/dist/cjs/utils/logic/handleProcess.js +4 -4
  33. package/dist/cjs/utils/logic/processChildren.d.ts +14 -1
  34. package/dist/cjs/utils/logic/processChildren.js +30 -6
  35. package/dist/cjs/utils/style/converter.js +34 -72
  36. package/dist/cjs/utils/templates/index.d.ts +1 -0
  37. package/dist/cjs/utils/templates/index.js +11 -2
  38. package/dist/cjs/utils/templates/renderManager.d.ts +4 -0
  39. package/dist/cjs/utils/templates/renderManager.js +10 -3
  40. package/dist/cjs/utils/templates/scene.js +13 -1
  41. package/dist/esm/core/comlib/{index.js → Index.js} +1 -1
  42. package/dist/esm/core/utils/PopupRenderer.js +1 -1
  43. package/dist/esm/core/utils/hooks.js +137 -53
  44. package/dist/esm/core/utils/popupRouter.js +2 -1
  45. package/dist/esm/core/utils/slots.js +24 -22
  46. package/dist/esm/core/utils/useContext.js +8 -10
  47. package/dist/esm/core/utils/with.js +3 -3
  48. package/dist/esm/generate/generateTaroProjectJson.js +28 -8
  49. package/dist/esm/generate/utils/commonDir.js +18 -14
  50. package/dist/esm/generate/utils/pageImages.d.ts +14 -0
  51. package/dist/esm/generate/utils/pageImages.d.ts.map +1 -0
  52. package/dist/esm/generate/utils/pageImages.js +15 -0
  53. package/dist/esm/handleCom.js +44 -17
  54. package/dist/esm/handleDom.d.ts +2 -0
  55. package/dist/esm/handleDom.js +6 -4
  56. package/dist/esm/handleGlobal.js +4 -2
  57. package/dist/esm/handleSlot.d.ts +3 -0
  58. package/dist/esm/handleSlot.js +57 -12
  59. package/dist/esm/processors/processComEvents.d.ts.map +1 -0
  60. package/dist/esm/processors/processScene.d.ts.map +1 -1
  61. package/dist/esm/processors/processScene.js +13 -3
  62. package/dist/esm/processors/processSceneLogic.d.ts.map +1 -0
  63. package/dist/esm/taro-template.json +313 -13
  64. package/dist/esm/toCodeTaro.d.ts +4 -1
  65. package/dist/esm/toCodeTaro.d.ts.map +1 -1
  66. package/dist/esm/toCodeTaro.js +89 -4
  67. package/dist/esm/utils/builder/buildResult.d.ts.map +1 -1
  68. package/dist/esm/utils/builder/buildResult.js +5 -14
  69. package/dist/esm/utils/common/helper.d.ts.map +1 -0
  70. package/dist/esm/utils/config/content/converter.js +2 -2
  71. package/dist/esm/utils/config/content/pageConfig.js +4 -1
  72. package/dist/esm/utils/config/content/saveBase64Image.d.ts +10 -0
  73. package/dist/esm/utils/config/content/saveBase64Image.js +42 -1
  74. package/dist/esm/utils/config/content/tabBarConfig.js +7 -2
  75. package/dist/esm/utils/config/handlePageConfig.d.ts.map +1 -1
  76. package/dist/esm/utils/config/handlePageConfig.js +5 -3
  77. package/dist/esm/utils/context/collectJSModules.d.ts +4 -0
  78. package/dist/esm/utils/context/collectJSModules.d.ts.map +1 -1
  79. package/dist/esm/utils/context/collectJSModules.js +1 -1
  80. package/dist/esm/utils/logic/genJSModules.d.ts +8 -4
  81. package/dist/esm/utils/logic/genJSModules.d.ts.map +1 -1
  82. package/dist/esm/utils/logic/genJSModules.js +16 -27
  83. package/dist/esm/utils/logic/handleProcess.js +4 -4
  84. package/dist/esm/utils/logic/processChildren.d.ts +14 -1
  85. package/dist/esm/utils/logic/processChildren.js +45 -8
  86. package/dist/esm/utils/style/converter.js +57 -106
  87. package/dist/esm/utils/templates/index.d.ts +1 -0
  88. package/dist/esm/utils/templates/index.js +9 -2
  89. package/dist/esm/utils/templates/renderManager.d.ts +4 -0
  90. package/dist/esm/utils/templates/renderManager.js +17 -4
  91. package/dist/esm/utils/templates/scene.js +8 -2
  92. package/package.json +1 -1
  93. package/dist/esm/generate/generateTaroProjectJson.d.ts.map +0 -1
  94. package/dist/esm/generate/utils/commonDir.d.ts.map +0 -1
  95. package/dist/esm/handleDom.d.ts.map +0 -1
  96. package/dist/esm/handleGlobal.d.ts.map +0 -1
  97. package/dist/esm/utils/config/content/converter.d.ts.map +0 -1
  98. package/dist/esm/utils/config/content/pageConfig.d.ts.map +0 -1
  99. package/dist/esm/utils/config/content/saveBase64Image.d.ts.map +0 -1
  100. package/dist/esm/utils/config/content/tabBarConfig.d.ts.map +0 -1
  101. package/dist/esm/utils/logic/processChildren.d.ts.map +0 -1
@@ -1,16 +1,13 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import { useRef, useState, useMemo } from 'react';
3
- import { deepProxy } from "./hooks";
4
- export function useAppCreateContext() {
5
- // 约定:场景级 inputs 统一挂载到 $inputs,避免与组件 runtime 的 inputs 命名冲突
6
- // 同时可避免 `Cannot set property 'open' of undefined`
7
- // 注册表拆分:
8
- // - comRefs: 组件实例/inputs/outputs 注册表(可 scoped)
9
- // - $vars/$fxs: 逻辑能力注册表(仅页面级,全作用域共享)
10
- var comRefs = useRef(deepProxy({
3
+ import { proxyRefs } from "./hooks";
4
+ var GLOBAL_TODO_POOL = new Map();
5
+ export function useAppCreateContext(id) {
6
+ var globalTodoInputs = useRef(GLOBAL_TODO_POOL);
7
+ var comRefs = useRef(proxyRefs({
11
8
  $inputs: {},
12
9
  $outputs: {}
13
- }));
10
+ }, undefined, globalTodoInputs.current));
14
11
  var $vars = useRef({});
15
12
  var $fxs = useRef({});
16
13
  var _useState = useState({
@@ -24,7 +21,7 @@ export function useAppCreateContext() {
24
21
  setPopupState = _useState2[1];
25
22
  var appContext = useRef({
26
23
  canvas: {
27
- id: "u_7VvVn" // 使用 data 中的 id
24
+ id: id
28
25
  },
29
26
  runtime: {
30
27
  debug: false
@@ -45,6 +42,7 @@ export function useAppCreateContext() {
45
42
  comRefs: comRefs,
46
43
  $vars: $vars,
47
44
  $fxs: $fxs,
45
+ globalTodoInputs: globalTodoInputs.current,
48
46
  appContext: appContext,
49
47
  popupState: popupState,
50
48
  setPopupState: setPopupState
@@ -122,11 +122,11 @@ export var WithCom = function WithCom(props) {
122
122
  return show || isPopup ? /*#__PURE__*/React.createElement(View, {
123
123
  className: className,
124
124
  style: _objectSpread(_objectSpread({}, style), dynamicStyle)
125
- }, jsx) : null;
125
+ }, jsx, props.children) : null;
126
126
  };
127
- export var WithWrapper = function WithWrapper(Component) {
127
+ export var WithWrapper = function WithWrapper(id, Component) {
128
128
  return function WrappedComponent(props) {
129
- var contextStore = useAppCreateContext();
129
+ var contextStore = useAppCreateContext(id);
130
130
  var setPopupState = contextStore.setPopupState;
131
131
  var isPopup = Component.isPopup;
132
132
 
@@ -4,7 +4,9 @@ import * as path from "path";
4
4
  import { findDir, ensureDir } from "./utils/fileNode";
5
5
  import { handleCommonDir } from "./utils/commonDir";
6
6
  import { handleTabBarImages } from "./utils/tabBarImages";
7
+ import { handlePageImages } from "./utils/pageImages";
7
8
  import { updateAppConfig } from "./utils/appConfig";
9
+ import { genScopedJSModules } from "../utils/logic/genJSModules";
8
10
  /**
9
11
  * 根据数组生成文件结构 JSON 对象
10
12
  * @param result 包含 files 和 assets 的生成结果对象
@@ -46,6 +48,7 @@ var generateTaroProjectJson = function generateTaroProjectJson(result) {
46
48
 
47
49
  // 从 assets 中获取 TabBar 图片文件信息
48
50
  var imageFiles = assets.tabBarImages || [];
51
+ var pageImages = assets.pageImages || [];
49
52
 
50
53
  // 过滤出类型为 normal 的项
51
54
  var normalItems = files.filter(function (item) {
@@ -76,6 +79,13 @@ var generateTaroProjectJson = function generateTaroProjectJson(result) {
76
79
  path: "src/pages/".concat(pageName, "/index.tsx"),
77
80
  content: fullContent
78
81
  }];
82
+ // 生成页面级 jsModules(如果有 JS 计算组件)
83
+ if (item.jsModules && item.jsModules.length > 0) {
84
+ pageChildren.push({
85
+ path: "src/pages/".concat(pageName, "/index.jsModules.ts"),
86
+ content: genScopedJSModules(item.jsModules, "@/core/mybricks/index", "@/common/jsModulesRuntime")
87
+ });
88
+ }
79
89
 
80
90
  // 返回页面目录节点
81
91
  return {
@@ -98,16 +108,23 @@ var generateTaroProjectJson = function generateTaroProjectJson(result) {
98
108
  var popupId = item.meta.id;
99
109
  var importCode = ((_item$importManager2 = item.importManager) === null || _item$importManager2 === void 0 ? void 0 : _item$importManager2.toCode()) || "";
100
110
  var fullContent = "".concat(importCode, "\n").concat(item.content || "");
111
+ var popupChildren = [{
112
+ path: "src/popupComponents/".concat(popupId, "/index.tsx"),
113
+ content: fullContent
114
+ }, {
115
+ path: "src/popupComponents/".concat(popupId, "/index.global.less"),
116
+ content: item.cssContent || ""
117
+ }];
118
+ if (item.jsModules && item.jsModules.length > 0) {
119
+ popupChildren.push({
120
+ path: "src/popupComponents/".concat(popupId, "/index.jsModules.ts"),
121
+ content: genScopedJSModules(item.jsModules, "@/core/mybricks/index", "@/common/jsModulesRuntime")
122
+ });
123
+ }
101
124
  popupComponentsDir.children.push({
102
125
  path: "src/popupComponents/".concat(popupId),
103
126
  content: null,
104
- children: [{
105
- path: "src/popupComponents/".concat(popupId, "/index.tsx"),
106
- content: fullContent
107
- }, {
108
- path: "src/popupComponents/".concat(popupId, "/index.global.less"),
109
- content: item.cssContent || ""
110
- }]
127
+ children: popupChildren
111
128
  });
112
129
  });
113
130
 
@@ -122,12 +139,15 @@ var generateTaroProjectJson = function generateTaroProjectJson(result) {
122
139
  // 处理 TabBar 图片文件
123
140
  handleTabBarImages(tabbarDir, imageFiles);
124
141
 
142
+ // 处理页面 base64 图片文件(与 tabbar 同级别)
143
+ handlePageImages(assetsDir, pageImages);
144
+
125
145
  // 替换自定义 Tabbar 配置文件
126
146
  var CUSTOM_TAB_BAR_CONFIG_PATH = "src/custom-tab-bar/mybricks/tabbar-config.ts";
127
147
  var customTabBarItem = files.find(function (item) {
128
148
  return item.type === 'customTabBar';
129
149
  });
130
- if (customTabBarItem.content) {
150
+ if (customTabBarItem !== null && customTabBarItem !== void 0 && customTabBarItem.content) {
131
151
  var _mybricksDir$children;
132
152
  var customTabBarDir = ensureDir(srcDir, "src/custom-tab-bar");
133
153
  var mybricksDir = ensureDir(customTabBarDir, "src/custom-tab-bar/mybricks");
@@ -8,29 +8,33 @@
8
8
  export function handleCommonDir(commonDir, items) {
9
9
  commonDir.children = commonDir.children || [];
10
10
 
11
- // 处理 jsModules
12
- var jsModulesItem = items.find(function (item) {
13
- return item.type === 'jsModules';
11
+ // 处理 jsModulesRuntime
12
+ var jsModulesRuntimeItem = items.find(function (item) {
13
+ return item.type === 'jsModulesRuntime';
14
14
  });
15
- if (jsModulesItem) {
16
- var _jsModulesItem$import;
17
- var importCode = ((_jsModulesItem$import = jsModulesItem.importManager) === null || _jsModulesItem$import === void 0 ? void 0 : _jsModulesItem$import.toCode()) || '';
18
- var fileContent = jsModulesItem.content || '';
15
+ if (jsModulesRuntimeItem) {
16
+ var _jsModulesRuntimeItem;
17
+ var importCode = ((_jsModulesRuntimeItem = jsModulesRuntimeItem.importManager) === null || _jsModulesRuntimeItem === void 0 ? void 0 : _jsModulesRuntimeItem.toCode()) || '';
18
+ var fileContent = jsModulesRuntimeItem.content || '';
19
19
  var fullContent = importCode ? "".concat(importCode, "\n").concat(fileContent) : fileContent;
20
20
  commonDir.children.push({
21
- path: 'src/common/jsModules.ts',
21
+ path: 'src/common/jsModulesRuntime.ts',
22
22
  content: fullContent
23
23
  });
24
24
  }
25
25
 
26
- // 处理 commonIndex
27
- var commonIndexItem = items.find(function (item) {
28
- return item.type === 'commonIndex';
26
+ // 处理 global
27
+ var globalItem = items.find(function (item) {
28
+ return item.type === 'global';
29
29
  });
30
- if (commonIndexItem) {
30
+ if (globalItem) {
31
+ var _globalItem$importMan;
32
+ var _importCode = ((_globalItem$importMan = globalItem.importManager) === null || _globalItem$importMan === void 0 ? void 0 : _globalItem$importMan.toCode()) || '';
33
+ var _fileContent = globalItem.content || '';
34
+ var _fullContent = _importCode ? "".concat(_importCode, "\n").concat(_fileContent) : _fileContent;
31
35
  commonDir.children.push({
32
- path: 'src/common/index.ts',
33
- content: commonIndexItem.content || ''
36
+ path: 'src/common/global.ts',
37
+ content: _fullContent
34
38
  });
35
39
  }
36
40
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 页面图片文件处理工具
3
+ */
4
+ import type { ImageFileInfo } from '../../utils/config/content';
5
+ interface FileNode {
6
+ path: string;
7
+ content: string | null;
8
+ children?: FileNode[];
9
+ }
10
+ /**
11
+ * 处理页面 base64 图片文件
12
+ */
13
+ export declare function handlePageImages(assetsDir: FileNode, imageFiles: ImageFileInfo[]): void;
14
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageImages.d.ts","sourceRoot":"","sources":["pageImages.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,EACnB,UAAU,EAAE,aAAa,EAAE,GAC1B,IAAI,CAON"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 页面图片文件处理工具
3
+ */
4
+
5
+ /**
6
+ * 处理页面 base64 图片文件
7
+ */
8
+ export function handlePageImages(assetsDir, imageFiles) {
9
+ imageFiles.forEach(function (imageFile) {
10
+ assetsDir.children.push({
11
+ path: imageFile.filePath,
12
+ content: imageFile.fileContent.toString('base64')
13
+ });
14
+ });
15
+ }
@@ -1,12 +1,13 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
2
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
4
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
5
  import { convertComponentStyle, convertStyleAryToCss } from "./utils/style/converter";
6
- import { indentation, firstCharToUpperCase, formatSlotContent, getUiComponentCode } from "./utils/templates/index";
6
+ import { indentation, firstCharToUpperCase, getUiComponentCode } from "./utils/templates/index";
7
7
  import { genSlotRenderRef } from "./utils/templates/component";
8
8
  import { RenderManager } from "./utils/templates/renderManager";
9
9
  import handleSlot from "./handleSlot";
10
+ import handleDom from "./handleDom";
10
11
  import { processComEvents } from "./processors/processComEvents";
11
12
  import { handleProcess } from "./utils/logic/handleProcess";
12
13
  /**
@@ -52,6 +53,11 @@ export var handleCom = function handleCom(com, config) {
52
53
  rootStyle = _prepareStyles.rootStyle;
53
54
  var accumulatedCssContent = cssContent;
54
55
 
56
+ // 鸿蒙化:如果存在内置子节点(child),确保容器为 relative,以便内部绝对定位生效
57
+ if (com.child) {
58
+ rootStyle.position = "relative";
59
+ }
60
+
55
61
  // 4. 处理插槽
56
62
  var _processComSlots = processComSlots(com, config, accumulatedCssContent),
57
63
  slotsCode = _processComSlots.slotsCode,
@@ -60,15 +66,28 @@ export var handleCom = function handleCom(com, config) {
60
66
  childrenResults = _processComSlots.childrenResults;
61
67
  accumulatedCssContent = slotCss;
62
68
 
63
- // 5. 生成 UI 代码
64
- var ui = generateUiCode(com, config, componentName, rootStyle, comEventCode, slotsCode, eventHandlers);
69
+ // 5. 处理组件内置子节点 (child 属性,常用于自由布局中的绝对定位包装层)
70
+ var childrenUi = "";
71
+ if (com.child) {
72
+ var childResult = handleDom(com.child, _objectSpread(_objectSpread({}, config), {}, {
73
+ depth: config.depth + 1
74
+ }));
75
+ childrenUi = childResult.ui;
76
+ if (childResult.cssContent) {
77
+ accumulatedCssContent += (accumulatedCssContent ? "\n" : "") + childResult.cssContent;
78
+ }
79
+ }
80
+
81
+ // 6. 生成 UI 代码 (支持嵌套子节点)
82
+ var ui = generateUiCode(com, config, componentName, rootStyle, comEventCode, slotsCode, eventHandlers, childrenUi);
83
+ var hasEvents = Object.keys(eventHandlers).length > 0;
65
84
  return {
66
85
  slots: [],
67
86
  scopeSlots: [],
68
87
  ui: ui,
69
88
  js: eventCode,
70
89
  cssContent: accumulatedCssContent,
71
- outputsConfig: Object.keys(eventHandlers).length > 0 ? _defineProperty({}, meta.id, eventHandlers) : undefined,
90
+ outputsConfig: hasEvents ? _defineProperty({}, meta.id, eventHandlers) : undefined,
72
91
  childrenResults: childrenResults,
73
92
  name: meta.name,
74
93
  // 返回解析后的稳定名称
@@ -147,9 +166,12 @@ var processComSlots = function processComSlots(com, config, initialCss) {
147
166
  var _ref3 = _slicedToArray(_ref2, 2),
148
167
  slotId = _ref3[0],
149
168
  slot = _ref3[1];
150
- // 鸿蒙规范:如果插槽内没有组件,跳过渲染
169
+ // 鸿蒙规范:如果插槽内没有组件,直接渲染空
151
170
  var children = slot.comAry || slot.children || [];
171
+ var isLast = index === slotEntries.length - 1;
172
+ var slotIndent = indentation(config.codeStyle.indent * (config.depth + 2));
152
173
  if (children.length === 0) {
174
+ slotsCode += "".concat(slotIndent).concat(slotId, ": {\n").concat(slotIndent, " render: () => null\n").concat(slotIndent, "}").concat(isLast ? '' : ',', "\n");
153
175
  return;
154
176
  }
155
177
  var slotLayout = (_com$props$data = com.props.data) === null || _com$props$data === void 0 ? void 0 : _com$props$data.layout;
@@ -160,6 +182,8 @@ var processComSlots = function processComSlots(com, config, initialCss) {
160
182
  depth: 1,
161
183
  renderManager: renderManager,
162
184
  slotKey: slotId,
185
+ // 给 slot 根容器打标用(slot wrapper className)
186
+ parentComId: meta.id,
163
187
  // 鸿蒙化:传递父容器的布局配置给插槽
164
188
  layout: slotLayout
165
189
  }));
@@ -168,15 +192,16 @@ var processComSlots = function processComSlots(com, config, initialCss) {
168
192
  accumulatedCssContent += (accumulatedCssContent ? "\n" : "") + result.cssContent;
169
193
  }
170
194
  var renderId = "".concat(meta.id, "_").concat(slotId);
171
- var baseIndentSize = config.codeStyle.indent;
172
- var renderBodyIndent = indentation(config.codeStyle.indent * 2);
173
- var formattedContent = formatSlotContent(result.ui, baseIndentSize, renderBodyIndent);
195
+
196
+ // 关键:不再预先 formatSlotContent,而是将原始 ui 传给 renderManager
197
+ // 这样 RenderManager 在内部进行精确字符串替换时才能匹配成功
198
+ var rawContent = result.ui;
174
199
 
175
200
  // 鸿蒙化处理:针对表单容器进行别名对齐
176
- if (meta.def.namespace === "mybricks.taro.formContainer" && Array.isArray((_props$data2 = props.data) === null || _props$data2 === void 0 ? void 0 : _props$data2.items) && result.childrenResults) {
201
+ if (meta.def.namespace === "mybricks.taro.formContainer" && Array.isArray((_props$data2 = props.data) === null || _props$data2 === void 0 ? void 0 : _props$data2.items) && result.directChildren) {
177
202
  var _props$data3;
178
203
  var items = (_props$data3 = props.data) === null || _props$data3 === void 0 ? void 0 : _props$data3.items;
179
- result.childrenResults.forEach(function (childRes) {
204
+ result.directChildren.forEach(function (childRes) {
180
205
  var itemConfig = items.find(function (it) {
181
206
  return it.id === childRes.id;
182
207
  });
@@ -192,22 +217,23 @@ var processComSlots = function processComSlots(com, config, initialCss) {
192
217
  var logicCode = buildSlotLogicCode({
193
218
  parentComId: meta.id,
194
219
  slotKey: slotId,
195
- children: result.childrenResults,
220
+ children: result.directChildren,
196
221
  config: config
197
222
  });
198
223
 
199
224
  // 生成插槽描述注释内容
200
225
  var description = "".concat(meta.title || meta.id, "\u7684").concat(slot.title || slotId, "\u63D2\u69FD");
201
- renderManager.register(renderId, formattedContent, result.childrenResults, logicCode, slot.type, slot.wrap || slot.itemWrap || ((_COM_PROTOCOL$meta$de = COM_PROTOCOL[meta.def.namespace]) === null || _COM_PROTOCOL$meta$de === void 0 ? void 0 : _COM_PROTOCOL$meta$de.useWrap), description);
226
+ renderManager.register(renderId, rawContent, result.directChildren,
227
+ // 仅传入直接子组件,避免递归替换导致的结构破坏
228
+ logicCode, slot.type, slot.wrap || slot.itemWrap || ((_COM_PROTOCOL$meta$de = COM_PROTOCOL[meta.def.namespace]) === null || _COM_PROTOCOL$meta$de === void 0 ? void 0 : _COM_PROTOCOL$meta$de.useWrap), description);
202
229
  if (result.childrenResults) {
203
230
  allChildrenResults = allChildrenResults.concat(result.childrenResults);
204
231
  }
205
- var slotIndent = indentation(config.codeStyle.indent * (config.depth + 2));
206
232
  slotsCode += genSlotRenderRef({
207
233
  slotId: slotId,
208
234
  renderId: renderId,
209
235
  indent: slotIndent,
210
- isLast: index === slotEntries.length - 1
236
+ isLast: isLast
211
237
  });
212
238
  });
213
239
  return {
@@ -263,7 +289,7 @@ var buildSlotLogicCode = function buildSlotLogicCode(args) {
263
289
  /**
264
290
  * 生成 UI 代码
265
291
  */
266
- var generateUiCode = function generateUiCode(com, config, componentName, rootStyle, comEventCode, slotsCode, eventHandlers) {
292
+ var generateUiCode = function generateUiCode(com, config, componentName, rootStyle, comEventCode, slotsCode, eventHandlers, childrenUi) {
267
293
  var _scene$coms, _sceneCom$inputs, _sceneCom$outputs, _meta$outputs;
268
294
  var meta = com.meta,
269
295
  props = com.props;
@@ -280,7 +306,8 @@ var generateUiCode = function generateUiCode(com, config, componentName, rootSty
280
306
  componentOutputs: ((sceneCom === null || sceneCom === void 0 || (_sceneCom$outputs = sceneCom.outputs) === null || _sceneCom$outputs === void 0 ? void 0 : _sceneCom$outputs.length) || 0) > 0 ? sceneCom.outputs : (((_meta$outputs = meta.outputs) === null || _meta$outputs === void 0 ? void 0 : _meta$outputs.length) || 0) > 0 ? meta.outputs : undefined,
281
307
  comEventCode: comEventCode,
282
308
  slotsCode: slotsCode,
283
- eventHandlers: eventHandlers
309
+ eventHandlers: eventHandlers,
310
+ childrenUi: childrenUi
284
311
  }, {
285
312
  codeStyle: config.codeStyle,
286
313
  depth: config.depth + 1,
@@ -14,6 +14,8 @@ type HandleDomResult = {
14
14
  slots: string[];
15
15
  scopeSlots: string[];
16
16
  cssContent: string;
17
+ directChildren?: any[];
18
+ childrenResults?: any[];
17
19
  };
18
20
  declare const handleDom: (dom: Dom, config: HandleDomConfig) => HandleDomResult;
19
21
  export default handleDom;
@@ -1,11 +1,11 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { indentation, convertStyleAryToCss, convertRootStyle } from "./utils";
3
- import { processChildren } from "./utils/logic/processChildren";
3
+ import { normalizeChildren, processChildren } from "./utils/logic/processChildren";
4
4
  var handleDom = function handleDom(dom, config) {
5
5
  var _domProps$style;
6
- var props = dom.props,
7
- children = dom.children;
6
+ var props = dom.props;
8
7
  var domProps = props;
8
+ var children = normalizeChildren(dom);
9
9
  var childResults = processChildren(children, _objectSpread(_objectSpread({}, config), {}, {
10
10
  depth: config.depth + 1
11
11
  }));
@@ -18,7 +18,9 @@ var handleDom = function handleDom(dom, config) {
18
18
  js: childResults.js,
19
19
  slots: childResults.slots,
20
20
  scopeSlots: childResults.scopeSlots,
21
- cssContent: cssContent
21
+ cssContent: cssContent,
22
+ directChildren: childResults.directChildren,
23
+ childrenResults: childResults.childrenResults
22
24
  };
23
25
  };
24
26
  export default handleDom;
@@ -8,6 +8,7 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
8
8
  /* eslint-disable @typescript-eslint/no-explicit-any */
9
9
  import { ImportManager, indentation } from "./utils";
10
10
  import { handleProcess } from "./utils/logic/handleProcess";
11
+ import { getSafeVarName } from "./utils/common/string";
11
12
  var handleGlobal = function handleGlobal(params, config) {
12
13
  var tojson = params.tojson,
13
14
  globalFxs = params.globalFxs,
@@ -50,8 +51,9 @@ var handleGlobal = function handleGlobal(params, config) {
50
51
  return tojson.global;
51
52
  }
52
53
  }));
53
- globalVarsRegisterChangeCode += "\n".concat(indent2, "this.").concat(com.title, ".registerChange((value: any) => {") + "\n".concat(res) + "\n".concat(indent2, "})");
54
- globalVarsInitCode += "".concat(indent).concat(com.title, ": any = createVariable(").concat(JSON.stringify(com.model.data.initValue || {}), ")\n");
54
+ var varKey = getSafeVarName(com);
55
+ globalVarsRegisterChangeCode += "\n".concat(indent2, "this.").concat(varKey, ".registerChange((value: any) => {") + "\n".concat(res) + "\n".concat(indent2, "})");
56
+ globalVarsInitCode += "".concat(indent).concat(varKey, ": any = createVariable(").concat(JSON.stringify(com.model.data.initValue || {}), ")\n");
55
57
  });
56
58
  var globalFxsInitCode = "";
57
59
  globalFxs.forEach(function (event) {
@@ -12,6 +12,8 @@ interface HandleSlotConfig extends BaseConfig {
12
12
  hasPopups?: boolean;
13
13
  /** handleCom 处理 slots 时的 slot key(如 item/content),用于识别 scope 入参 */
14
14
  slotKey?: string;
15
+ /** 父组件 id(用于给插槽根容器打标 className) */
16
+ parentComId?: string;
15
17
  }
16
18
  declare const handleSlot: (ui: UI, config: HandleSlotConfig) => {
17
19
  js: string;
@@ -20,6 +22,7 @@ declare const handleSlot: (ui: UI, config: HandleSlotConfig) => {
20
22
  cssContent: string;
21
23
  slots: any[];
22
24
  scopeSlots: any[];
25
+ directChildren: any[];
23
26
  childrenResults: any[];
24
27
  };
25
28
  export default handleSlot;
@@ -2,15 +2,15 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { ImportManager, indentation, convertStyleAryToCss, convertRootStyle, getRootComponentClassName } from "./utils";
3
3
  import { genRootDefineCode, genSlotDefineCode, genComponentTemplate, wrapInEffect } from "./utils/templates/scene";
4
4
  import { RenderManager } from "./utils/templates/renderManager";
5
- import { processChildren } from "./utils/logic/processChildren";
5
+ import { processChildren, normalizeChildren } from "./utils/logic/processChildren";
6
6
  import { processSceneLogic } from "./processors/processSceneLogic";
7
7
  var handleSlot = function handleSlot(ui, config) {
8
8
  var _meta, _props$style;
9
9
  var importManager = new ImportManager(config);
10
10
  var _ui$props = ui.props,
11
11
  props = _ui$props === void 0 ? {} : _ui$props;
12
- // 支持 children 或 comAry (DSL 常用名)
13
- var children = ui.children || ui.comAry || [];
12
+ // 使用归一化处理器
13
+ var children = normalizeChildren(ui);
14
14
  var isRoot = config.checkIsRoot();
15
15
  var slotId = ((_meta = ui.meta) === null || _meta === void 0 ? void 0 : _meta.id) || ui.id;
16
16
 
@@ -26,7 +26,7 @@ var handleSlot = function handleSlot(ui, config) {
26
26
  });
27
27
  addDependencyImport({
28
28
  packageName: utilsPkg,
29
- dependencyNames: ["useAppContext", "ScopedComContextProvider"],
29
+ dependencyNames: ["useAppContext"],
30
30
  importType: "named"
31
31
  });
32
32
  // 补全 useEffect 导入(用于插槽逻辑驱动)
@@ -59,7 +59,7 @@ var handleSlot = function handleSlot(ui, config) {
59
59
  var combinedJsCode = "".concat(envDefineCode).concat(childResults.js).concat(initCode).concat(wrapInEffect(indent2, effectCode));
60
60
 
61
61
  // 5. 生成 UI 结构
62
- var uiResult = generateSlotUi(ui, props, childResults.ui, config);
62
+ var uiResult = generateSlotUi(ui, props, childResults.ui, childResults.childrenResults, config);
63
63
 
64
64
  // 6. 如果是根场景,生成完整文件
65
65
  if (isRoot) {
@@ -73,6 +73,7 @@ var handleSlot = function handleSlot(ui, config) {
73
73
  cssContent: cssContent,
74
74
  slots: [],
75
75
  scopeSlots: [],
76
+ directChildren: childResults.directChildren,
76
77
  childrenResults: childResults.childrenResults
77
78
  };
78
79
  };
@@ -88,7 +89,7 @@ var setupImports = function setupImports(addImport, config, isRoot) {
88
89
  var comPkg = config.getComponentPackageName(importParams);
89
90
  addImport({
90
91
  packageName: "react",
91
- dependencyNames: ["useRef", "useEffect", "useState"],
92
+ dependencyNames: ["useRef", "useEffect", "useState", "createContext", "useContext"],
92
93
  importType: "named"
93
94
  });
94
95
  addImport({
@@ -96,7 +97,9 @@ var setupImports = function setupImports(addImport, config, isRoot) {
96
97
  dependencyNames: ["View"],
97
98
  importType: "named"
98
99
  });
99
- var dependencyNames = ["WithCom", "WithWrapper", "SlotProvider"];
100
+
101
+ // 页面/插槽产物通常不直接使用,避免生成未使用的 import。
102
+ var dependencyNames = ["WithCom", "WithWrapper"];
100
103
  if (isRoot && config.hasPopups) {
101
104
  dependencyNames.push("PopupRenderer");
102
105
  }
@@ -111,9 +114,14 @@ var setupImports = function setupImports(addImport, config, isRoot) {
111
114
  importType: "named"
112
115
  });
113
116
  if (isRoot) {
117
+ addImport({
118
+ packageName: "@/common/pageLife",
119
+ dependencyNames: ["usePageLife"],
120
+ importType: "named"
121
+ });
114
122
  if (config.hasPopups) {
115
123
  addImport({
116
- packageName: "../../common/popup",
124
+ packageName: "@/common/popup",
117
125
  dependencyNames: ["POPUP_MAP", "POPUP_IDS"],
118
126
  importType: "named"
119
127
  });
@@ -129,19 +137,33 @@ var setupImports = function setupImports(addImport, config, isRoot) {
129
137
  /**
130
138
  * 生成 Slot 的 UI 代码
131
139
  */
132
- var generateSlotUi = function generateSlotUi(ui, props, childrenUi, config) {
140
+ var generateSlotUi = function generateSlotUi(ui, props, childrenUi, childrenResults, config) {
133
141
  var indent = indentation(config.codeStyle.indent * config.depth);
142
+ var slotStyle = ui.style || {};
143
+ var propsStyle = props.style || {};
134
144
  var mergedStyle = _objectSpread(_objectSpread({
135
145
  width: "100%",
136
146
  height: "100%"
137
- }, ui.style || {}), props.style || {});
147
+ }, slotStyle), propsStyle);
148
+
138
149
  // 鸿蒙化:优先使用 config 中传递的 layout(来自父容器 data.layout),否则使用 slot 自身的 layout
139
150
  var layout = config.layout || ui.layout || mergedStyle.layout;
151
+ var smart = isSmartLayout(layout);
152
+ var layoutAdjustment = smart ? {
153
+ position: isHasInSmartLayout(childrenResults) ? "fixed" : "relative"
154
+ } : hasFixedChildren(childrenResults) ? {
155
+ transform: "translateX(0)"
156
+ } : {};
140
157
  var styleCode = JSON.stringify(convertRootStyle(_objectSpread(_objectSpread({}, mergedStyle), {}, {
141
158
  layout: layout
142
- })));
159
+ }, layoutAdjustment)));
143
160
  var rootClassName = getRootComponentClassName(config.getCurrentScene(), config.checkIsRoot());
144
- var classNameAttr = rootClassName ? " className='".concat(rootClassName, "'") : "";
161
+ // 插槽根容器增强:加上可读的标识,便于用户定位/调试
162
+ // - className: slot-<parentComId>
163
+ var parentComId = config === null || config === void 0 ? void 0 : config.parentComId;
164
+ var slotMarkClass = parentComId ? "slot-".concat(parentComId) : "";
165
+ var classNameStr = [rootClassName, slotMarkClass].filter(Boolean).join(" ");
166
+ var classNameAttr = classNameStr ? " className='".concat(classNameStr, "'") : "";
145
167
  return "".concat(indent, "<View").concat(classNameAttr, " style={").concat(styleCode, "}>\n").concat(childrenUi, "\n").concat(indent, "</View>");
146
168
  };
147
169
 
@@ -169,4 +191,27 @@ var finalizeRootComponent = function finalizeRootComponent(ui, config, importMan
169
191
  name: fileName
170
192
  });
171
193
  };
194
+
195
+ /**
196
+ * 检查子元素是否有固定定位的元素
197
+ */
198
+ var hasFixedChildren = function hasFixedChildren(childrenResults) {
199
+ return childrenResults.some(function (item) {
200
+ var _item$rootStyle;
201
+ return (item === null || item === void 0 || (_item$rootStyle = item.rootStyle) === null || _item$rootStyle === void 0 ? void 0 : _item$rootStyle.position) === "fixed";
202
+ });
203
+ };
204
+
205
+ /**
206
+ * 检查是否是智能布局
207
+ */
208
+ var isSmartLayout = function isSmartLayout(layout) {
209
+ return layout === "smart" || (layout === null || layout === void 0 ? void 0 : layout.position) === "smart";
210
+ };
211
+ var isHasInSmartLayout = function isHasInSmartLayout(childrenResults) {
212
+ return childrenResults.some(function (item) {
213
+ var _item$rootStyle2;
214
+ return (item === null || item === void 0 || (_item$rootStyle2 = item.rootStyle) === null || _item$rootStyle2 === void 0 ? void 0 : _item$rootStyle2.inSmartLayout) === true;
215
+ });
216
+ };
172
217
  export default handleSlot;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processComEvents.d.ts","sourceRoot":"","sources":["processComEvents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,gBAAgB,QACtB,GAAG,UACA,eAAe;kBAET,MAAM;mBACL,OAAO,MAAM,EAAE,GAAG,CAAC;iBACrB,OAAO,MAAM,EAAE,GAAG,CAAC;CA8HjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"processScene.d.ts","sourceRoot":"","sources":["processScene.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,MAAM,MAAM,yCAAyC,CAAC;AAC7D,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAC9C,KAAK,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,YAAY,EAAE,YAAY,CAAC;IAC3B,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IAC3C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,iBAAiB,EAAE,GAAG,CAAC;IACvB,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,WAAY,kBAAkB,KAAG,IAkJzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,WAChB,KAAK,EAAE,UACP,KAAK,kBAAkB,EAAE,OAAO,CAAC,KACxC,IAOF,CAAC"}
1
+ {"version":3,"file":"processScene.d.ts","sourceRoot":"","sources":["processScene.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,MAAM,MAAM,yCAAyC,CAAC;AAC7D,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAC9C,KAAK,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,YAAY,EAAE,YAAY,CAAC;IAC3B,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IAC3C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,iBAAiB,EAAE,GAAG,CAAC;IACvB,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,WAAY,kBAAkB,KAAG,IAwJzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,WAChB,KAAK,EAAE,UACP,KAAK,kBAAkB,EAAE,OAAO,CAAC,KACxC,IAOF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
3
  /**
3
4
  * 处理场景(Scene)
4
5
  * 参考鸿蒙实现,将场景处理逻辑独立出来
@@ -8,7 +9,7 @@ import handleSlot from "../handleSlot";
8
9
  import { RenderManager } from "../utils/templates/renderManager";
9
10
  import { createProvider, createProviderMap } from "../utils/context/createProvider";
10
11
  import { createEventQueries } from "../utils/context/createEventQueries";
11
- import { collectJSModulesFromScene } from "../utils/context/collectJSModules";
12
+ import { collectJSModulesFromScene, extractJSModuleFromCom } from "../utils/context/collectJSModules";
12
13
  /**
13
14
  * 处理单个场景
14
15
  */
@@ -28,9 +29,17 @@ export var processScene = function processScene(params) {
28
29
  getFrameById = params.getFrameById,
29
30
  pageConfigHandler = params.pageConfigHandler;
30
31
 
31
- // 收集 JS 计算组件
32
+ // 收集 JS 计算组件(全局)
32
33
  collectJSModulesFromScene(scene, jsModulesMap);
33
34
 
35
+ // 收集当前页面/弹窗内的 JS 计算组件(用于生成 index.jsModules.ts)
36
+ var localJsModules = Object.entries(scene.coms || {}).map(function (_ref) {
37
+ var _ref2 = _slicedToArray(_ref, 2),
38
+ comId = _ref2[0],
39
+ comInfo = _ref2[1];
40
+ return extractJSModuleFromCom(comId, comInfo);
41
+ }).filter(Boolean);
42
+
34
43
  // 创建 Provider
35
44
  var fileName = (_config$getFileName = config.getFileName) === null || _config$getFileName === void 0 ? void 0 : _config$getFileName.call(config, ui.meta.slotId);
36
45
  var currentProvider = createProvider(fileName, true);
@@ -141,7 +150,8 @@ export var processScene = function processScene(params) {
141
150
  params.addResult(_objectSpread(_objectSpread({}, value), {}, {
142
151
  type: isPopup ? "popup" : originalScene !== null && originalScene !== void 0 && originalScene.type ? originalScene.type : "normal",
143
152
  meta: scene,
144
- pageConfigContent: pageConfigContent
153
+ pageConfigContent: pageConfigContent,
154
+ jsModules: localJsModules
145
155
  }));
146
156
  },
147
157
  addJSModule: function addJSModule(module) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processSceneLogic.d.ts","sourceRoot":"","sources":["processSceneLogic.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,eAAO,MAAM,iBAAiB,OACxB,GAAG,UACC,GAAG,uBACU,GAAG;;;CAyBzB,CAAC"}