@mybricks/to-code-taro 1.0.2 → 1.0.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.
- package/README.md +58 -0
- package/dist/cjs/core/comlib/{Index.js → index.js} +4 -4
- package/dist/cjs/core/mybricks/index.js +47 -47
- package/dist/cjs/core/utils/ComContext.js +3 -0
- package/dist/cjs/core/utils/hooks.js +125 -0
- package/dist/cjs/core/utils/index.js +21 -57
- package/dist/cjs/core/utils/page.js +67 -0
- package/dist/cjs/core/utils/useContext.js +2 -1
- package/dist/cjs/generate/generateTaroProjectJson.d.ts +3 -14
- package/dist/cjs/generate/generateTaroProjectJson.js +9 -6
- package/dist/cjs/generate/utils/tabBarImages.d.ts +1 -1
- package/dist/cjs/handleCom.d.ts +1 -1
- package/dist/cjs/handleCom.js +91 -177
- package/dist/cjs/handleDom.js +7 -44
- package/dist/cjs/handleExtension.d.ts +2 -2
- package/dist/cjs/handleExtension.js +5 -5
- package/dist/cjs/handleGlobal.d.ts +2 -12
- package/dist/cjs/handleGlobal.js +23 -7
- package/dist/cjs/handleModule.js +3 -3
- package/dist/cjs/handleSlot.d.ts +2 -9
- package/dist/cjs/handleSlot.js +47 -150
- package/dist/cjs/processors/processComEvents.d.ts +9 -0
- package/dist/cjs/processors/processComEvents.js +122 -0
- package/dist/cjs/processors/processModule.d.ts +31 -0
- package/dist/cjs/processors/processModule.js +125 -0
- package/dist/cjs/processors/processScene.d.ts +32 -0
- package/dist/cjs/processors/processScene.js +124 -0
- package/dist/cjs/processors/processSceneLogic.d.ts +4 -0
- package/dist/cjs/processors/processSceneLogic.js +166 -0
- package/dist/cjs/taro-template.json +15 -7
- package/dist/cjs/toCodeTaro.d.ts +26 -5
- package/dist/cjs/toCodeTaro.js +59 -343
- package/dist/cjs/utils/builder/buildResult.d.ts +21 -0
- package/dist/cjs/utils/builder/buildResult.js +91 -0
- package/dist/cjs/utils/common/ImportManager.d.ts +19 -0
- package/dist/cjs/utils/common/ImportManager.js +105 -0
- package/dist/cjs/utils/common/helper.d.ts +2 -0
- package/dist/cjs/utils/common/helper.js +31 -0
- package/dist/cjs/utils/common/object.d.ts +5 -0
- package/dist/cjs/utils/common/object.js +58 -0
- package/dist/cjs/utils/common/string.d.ts +8 -0
- package/dist/cjs/utils/common/string.js +46 -0
- package/dist/cjs/utils/{pageConfig → config/content}/converter.js +1 -1
- package/dist/cjs/utils/{pageConfig → config/content}/index.js +9 -9
- package/dist/cjs/utils/{pageConfig → config/content}/pageConfig.js +12 -22
- package/dist/{esm/utils/pageConfig → cjs/utils/config/content}/saveBase64Image.d.ts +1 -1
- package/dist/cjs/utils/{pageConfig → config/content}/saveBase64Image.js +8 -17
- package/dist/cjs/utils/{pageConfig → config/content}/tabBarConfig.js +9 -32
- package/dist/cjs/utils/config/content/types.js +17 -0
- package/dist/cjs/utils/{pageConfig → config/content}/validator.js +1 -1
- package/dist/{esm/utils → cjs/utils/config}/handlePageConfig.d.ts +1 -1
- package/dist/cjs/utils/{handlePageConfig.js → config/handlePageConfig.js} +4 -4
- package/dist/cjs/utils/context/buildContext.d.ts +24 -0
- package/dist/cjs/utils/context/buildContext.js +65 -0
- package/dist/cjs/utils/context/buildFrameMap.d.ts +16 -0
- package/dist/cjs/utils/context/buildFrameMap.js +106 -0
- package/dist/cjs/utils/context/buildGlobalData.d.ts +13 -0
- package/dist/cjs/utils/context/buildGlobalData.js +58 -0
- package/dist/cjs/utils/context/collectJSModules.d.ts +37 -0
- package/dist/cjs/utils/context/collectJSModules.js +91 -0
- package/dist/cjs/utils/context/createEventQueries.d.ts +45 -0
- package/dist/cjs/utils/context/createEventQueries.js +99 -0
- package/dist/cjs/utils/context/createProvider.d.ts +21 -0
- package/dist/cjs/utils/context/createProvider.js +49 -0
- package/dist/cjs/utils/index.d.ts +10 -62
- package/dist/cjs/utils/index.js +21 -282
- package/dist/cjs/utils/{convertNamespace.js → logic/convertNamespace.js} +1 -1
- package/dist/cjs/utils/{genJSModules.js → logic/genJSModules.js} +1 -1
- package/dist/{esm/utils → cjs/utils/logic}/handleProcess.d.ts +2 -2
- package/dist/cjs/utils/{handleProcess.js → logic/handleProcess.js} +14 -11
- package/dist/cjs/utils/logic/processChildren.d.ts +12 -0
- package/dist/cjs/utils/logic/processChildren.js +82 -0
- package/dist/cjs/utils/style/color.d.ts +4 -0
- package/dist/cjs/utils/style/color.js +45 -0
- package/dist/cjs/utils/style/converter.d.ts +7 -0
- package/dist/cjs/utils/style/converter.js +181 -0
- package/dist/cjs/utils/{getComponentClassName.js → style/getComponentClassName.js} +1 -1
- package/dist/cjs/utils/{pxtransform.js → style/pxtransform.js} +1 -1
- package/dist/cjs/utils/style/types.d.ts +23 -0
- package/dist/cjs/utils/{pageConfig → style}/types.js +1 -1
- package/dist/cjs/utils/{code → templates}/component.js +1 -1
- package/dist/cjs/utils/{code → templates}/index.js +4 -4
- package/dist/cjs/utils/{code → templates}/renderManager.js +1 -1
- package/dist/cjs/utils/{code → templates}/scene.js +1 -1
- package/dist/esm/core/mybricks/index.js +1 -1
- package/dist/esm/core/utils/ComContext.js +1 -0
- package/dist/esm/core/utils/hooks.js +118 -0
- package/dist/esm/core/utils/index.js +6 -57
- package/dist/esm/core/utils/page.js +50 -0
- package/dist/esm/core/utils/useContext.js +2 -1
- package/dist/esm/generate/generateTaroProjectJson.d.ts +3 -14
- package/dist/esm/generate/generateTaroProjectJson.js +27 -23
- package/dist/esm/generate/utils/tabBarImages.d.ts +1 -1
- package/dist/esm/handleCom.d.ts +1 -1
- package/dist/esm/handleCom.js +159 -244
- package/dist/esm/handleDom.js +9 -48
- package/dist/esm/handleExtension.d.ts +2 -2
- package/dist/esm/handleExtension.js +5 -5
- package/dist/esm/handleGlobal.d.ts +2 -12
- package/dist/esm/handleGlobal.js +17 -3
- package/dist/esm/handleModule.js +3 -3
- package/dist/esm/handleSlot.d.ts +2 -9
- package/dist/esm/handleSlot.js +97 -174
- package/dist/esm/processors/processComEvents.d.ts +9 -0
- package/dist/esm/processors/processComEvents.js +110 -0
- package/dist/esm/processors/processModule.d.ts +31 -0
- package/dist/esm/processors/processModule.js +126 -0
- package/dist/esm/processors/processScene.d.ts +32 -0
- package/dist/esm/processors/processScene.js +126 -0
- package/dist/esm/processors/processSceneLogic.d.ts +4 -0
- package/dist/esm/processors/processSceneLogic.js +160 -0
- package/dist/esm/taro-template.json +15 -7
- package/dist/esm/toCodeTaro.d.ts +26 -5
- package/dist/esm/toCodeTaro.js +96 -396
- package/dist/esm/utils/builder/buildResult.d.ts +21 -0
- package/dist/esm/utils/builder/buildResult.js +61 -0
- package/dist/esm/utils/common/ImportManager.d.ts +19 -0
- package/dist/esm/utils/common/ImportManager.js +103 -0
- package/dist/esm/utils/common/helper.d.ts +2 -0
- package/dist/esm/utils/common/helper.js +4 -0
- package/dist/esm/utils/common/object.d.ts +5 -0
- package/dist/esm/utils/common/object.js +32 -0
- package/dist/esm/utils/common/string.d.ts +8 -0
- package/dist/esm/utils/common/string.js +21 -0
- package/dist/esm/utils/config/content/pageConfig.js +40 -0
- package/dist/{cjs/utils/pageConfig → esm/utils/config/content}/saveBase64Image.d.ts +1 -1
- package/dist/esm/utils/{pageConfig → config/content}/saveBase64Image.js +11 -30
- package/dist/esm/utils/{pageConfig → config/content}/tabBarConfig.js +12 -34
- package/dist/{cjs/utils → esm/utils/config}/handlePageConfig.d.ts +1 -1
- package/dist/esm/utils/{handlePageConfig.js → config/handlePageConfig.js} +1 -1
- package/dist/esm/utils/context/buildContext.d.ts +24 -0
- package/dist/esm/utils/context/buildContext.js +53 -0
- package/dist/esm/utils/context/buildFrameMap.d.ts +16 -0
- package/dist/esm/utils/context/buildFrameMap.js +131 -0
- package/dist/esm/utils/context/buildGlobalData.d.ts +13 -0
- package/dist/esm/utils/context/buildGlobalData.js +44 -0
- package/dist/esm/utils/context/collectJSModules.d.ts +37 -0
- package/dist/esm/utils/context/collectJSModules.js +87 -0
- package/dist/esm/utils/context/createEventQueries.d.ts +45 -0
- package/dist/esm/utils/context/createEventQueries.js +98 -0
- package/dist/esm/utils/context/createProvider.d.ts +21 -0
- package/dist/esm/utils/context/createProvider.js +33 -0
- package/dist/esm/utils/index.d.ts +10 -62
- package/dist/esm/utils/index.js +12 -345
- package/dist/{cjs/utils → esm/utils/logic}/handleProcess.d.ts +2 -2
- package/dist/esm/utils/{handleProcess.js → logic/handleProcess.js} +11 -5
- package/dist/esm/utils/logic/processChildren.d.ts +12 -0
- package/dist/esm/utils/logic/processChildren.js +48 -0
- package/dist/esm/utils/style/color.d.ts +4 -0
- package/dist/esm/utils/style/color.js +17 -0
- package/dist/esm/utils/style/converter.d.ts +7 -0
- package/dist/esm/utils/style/converter.js +176 -0
- package/dist/esm/utils/style/types.d.ts +23 -0
- package/dist/esm/utils/style/types.js +1 -0
- package/package.json +1 -1
- package/dist/esm/utils/pageConfig/pageConfig.js +0 -60
- /package/dist/cjs/utils/{pageConfig → config/content}/converter.d.ts +0 -0
- /package/dist/cjs/utils/{pageConfig → config/content}/index.d.ts +0 -0
- /package/dist/cjs/utils/{pageConfig → config/content}/pageConfig.d.ts +0 -0
- /package/dist/cjs/utils/{pageConfig → config/content}/tabBarConfig.d.ts +0 -0
- /package/dist/cjs/utils/{pageConfig → config/content}/types.d.ts +0 -0
- /package/dist/cjs/utils/{pageConfig → config/content}/validator.d.ts +0 -0
- /package/dist/cjs/utils/{convertNamespace.d.ts → logic/convertNamespace.d.ts} +0 -0
- /package/dist/cjs/utils/{genJSModules.d.ts → logic/genJSModules.d.ts} +0 -0
- /package/dist/cjs/utils/{getComponentClassName.d.ts → style/getComponentClassName.d.ts} +0 -0
- /package/dist/cjs/utils/{pxtransform.d.ts → style/pxtransform.d.ts} +0 -0
- /package/dist/cjs/utils/{code → templates}/component.d.ts +0 -0
- /package/dist/cjs/utils/{code → templates}/index.d.ts +0 -0
- /package/dist/cjs/utils/{code → templates}/renderManager.d.ts +0 -0
- /package/dist/cjs/utils/{code → templates}/scene.d.ts +0 -0
- /package/dist/esm/core/comlib/{Index.js → index.js} +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/converter.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/converter.js +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/index.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/index.js +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/pageConfig.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/tabBarConfig.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/types.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/types.js +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/validator.d.ts +0 -0
- /package/dist/esm/utils/{pageConfig → config/content}/validator.js +0 -0
- /package/dist/esm/utils/{convertNamespace.d.ts → logic/convertNamespace.d.ts} +0 -0
- /package/dist/esm/utils/{convertNamespace.js → logic/convertNamespace.js} +0 -0
- /package/dist/esm/utils/{genJSModules.d.ts → logic/genJSModules.d.ts} +0 -0
- /package/dist/esm/utils/{genJSModules.js → logic/genJSModules.js} +0 -0
- /package/dist/esm/utils/{getComponentClassName.d.ts → style/getComponentClassName.d.ts} +0 -0
- /package/dist/esm/utils/{getComponentClassName.js → style/getComponentClassName.js} +0 -0
- /package/dist/esm/utils/{pxtransform.d.ts → style/pxtransform.d.ts} +0 -0
- /package/dist/esm/utils/{pxtransform.js → style/pxtransform.js} +0 -0
- /package/dist/esm/utils/{code → templates}/component.d.ts +0 -0
- /package/dist/esm/utils/{code → templates}/component.js +0 -0
- /package/dist/esm/utils/{code → templates}/index.d.ts +0 -0
- /package/dist/esm/utils/{code → templates}/index.js +0 -0
- /package/dist/esm/utils/{code → templates}/renderManager.d.ts +0 -0
- /package/dist/esm/utils/{code → templates}/renderManager.js +0 -0
- /package/dist/esm/utils/{code → templates}/scene.d.ts +0 -0
- /package/dist/esm/utils/{code → templates}/scene.js +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/processors/processSceneLogic.ts
|
|
20
|
+
var processSceneLogic_exports = {};
|
|
21
|
+
__export(processSceneLogic_exports, {
|
|
22
|
+
processSceneLogic: () => processSceneLogic
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(processSceneLogic_exports);
|
|
25
|
+
var import_utils = require("../utils");
|
|
26
|
+
var import_handleProcess = require("../utils/logic/handleProcess");
|
|
27
|
+
var processSceneLogic = (ui, config, addDependencyImport) => {
|
|
28
|
+
let effectCode = "";
|
|
29
|
+
const indent2 = (0, import_utils.indentation)(config.codeStyle.indent);
|
|
30
|
+
const currentScene = config.getCurrentScene();
|
|
31
|
+
const providerName = config.getCurrentProvider().name;
|
|
32
|
+
effectCode += processLogicalInit(currentScene, config, addDependencyImport, indent2, providerName);
|
|
33
|
+
if (!config.checkIsRoot())
|
|
34
|
+
return effectCode;
|
|
35
|
+
effectCode += processSceneEvents(ui, currentScene, config, addDependencyImport, indent2);
|
|
36
|
+
effectCode += processSceneInputs(currentScene, config, addDependencyImport, indent2);
|
|
37
|
+
return effectCode;
|
|
38
|
+
};
|
|
39
|
+
var processLogicalInit = (scene, config, addDependencyImport, indent, providerName) => {
|
|
40
|
+
let code = "";
|
|
41
|
+
const vars = Object.entries(scene.coms || {}).filter(([, com]) => {
|
|
42
|
+
return com.def.namespace === "mybricks.core-comlib.var";
|
|
43
|
+
});
|
|
44
|
+
if (vars.length > 0) {
|
|
45
|
+
addDependencyImport({
|
|
46
|
+
packageName: config.getUtilsPackageName(),
|
|
47
|
+
dependencyNames: ["createVariable"],
|
|
48
|
+
importType: "named"
|
|
49
|
+
});
|
|
50
|
+
code += `
|
|
51
|
+
${indent}const vars = comRefs.current.${providerName}_Vars;`;
|
|
52
|
+
vars.forEach(([comId, com]) => {
|
|
53
|
+
var _a, _b;
|
|
54
|
+
const initValue = JSON.stringify(((_b = (_a = com.model) == null ? void 0 : _a.data) == null ? void 0 : _b.initValue) || {});
|
|
55
|
+
code += `
|
|
56
|
+
${indent}if (!vars.${com.title}.get) vars.${com.title} = createVariable(${initValue});`;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const fxEvents = config.getFxEvents();
|
|
60
|
+
if (fxEvents.length > 0) {
|
|
61
|
+
addDependencyImport({
|
|
62
|
+
packageName: config.getUtilsPackageName(),
|
|
63
|
+
dependencyNames: ["createFx"],
|
|
64
|
+
importType: "named"
|
|
65
|
+
});
|
|
66
|
+
code += `
|
|
67
|
+
${indent}const fxs = comRefs.current.${providerName}_Fxs;`;
|
|
68
|
+
fxEvents.forEach((fxEvent) => {
|
|
69
|
+
const res = (0, import_handleProcess.handleProcess)(fxEvent, {
|
|
70
|
+
...config,
|
|
71
|
+
depth: 3,
|
|
72
|
+
getCurrentScene: () => ({ id: fxEvent.frameId, ...fxEvent }),
|
|
73
|
+
addParentDependencyImport: addDependencyImport,
|
|
74
|
+
getParams: () => {
|
|
75
|
+
return (fxEvent.paramPins || []).reduce(
|
|
76
|
+
(pre, cur, index) => {
|
|
77
|
+
pre[cur.id] = `value${index}`;
|
|
78
|
+
return pre;
|
|
79
|
+
},
|
|
80
|
+
{}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}).replace(/this\./g, "comRefs.current.").replace(/comRefs\.current\.([a-zA-Z0-9_]+)\.controller_/g, "comRefs.current.$1.").replace(/comRefs\.current\.slot_Index\./g, "comRefs.current.");
|
|
84
|
+
const values = (fxEvent.paramPins || []).map((paramPin, index) => {
|
|
85
|
+
var _a;
|
|
86
|
+
if (paramPin.type === "config") {
|
|
87
|
+
return `value${index}: any = ${JSON.stringify(((_a = fxEvent.initValues) == null ? void 0 : _a[paramPin.id]) || {})}`;
|
|
88
|
+
}
|
|
89
|
+
return `value${index}: any`;
|
|
90
|
+
}).join(", ");
|
|
91
|
+
code += `
|
|
92
|
+
${indent}if (!fxs.${fxEvent.frameId}.call) fxs.${fxEvent.frameId} = createFx((${values}) => {
|
|
93
|
+
${res}
|
|
94
|
+
${indent}});`;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return code;
|
|
98
|
+
};
|
|
99
|
+
var processSceneEvents = (ui, currentScene, config, addDependencyImport, indent) => {
|
|
100
|
+
let code = "";
|
|
101
|
+
const sceneEvents = (currentScene == null ? void 0 : currentScene.events) || (ui == null ? void 0 : ui.events) || [];
|
|
102
|
+
if (!Array.isArray(sceneEvents))
|
|
103
|
+
return code;
|
|
104
|
+
sceneEvents.forEach((eventInfo) => {
|
|
105
|
+
const { type, diagramId, active } = eventInfo;
|
|
106
|
+
if (active !== false && type === "defined" && diagramId) {
|
|
107
|
+
const event = config.getEventByDiagramId(diagramId);
|
|
108
|
+
if (event) {
|
|
109
|
+
const process = (0, import_handleProcess.handleProcess)(event, {
|
|
110
|
+
...config,
|
|
111
|
+
target: "comRefs.current",
|
|
112
|
+
depth: 2,
|
|
113
|
+
addParentDependencyImport: addDependencyImport,
|
|
114
|
+
getParams: () => ({})
|
|
115
|
+
}).replace(/this\./g, "comRefs.current.").replace(/comRefs\.current\.([a-zA-Z0-9_]+)\.controller_/g, "comRefs.current.$1.").replace(/comRefs\.current\.slot_Index\./g, "comRefs.current.");
|
|
116
|
+
if (process.trim()) {
|
|
117
|
+
code += `
|
|
118
|
+
${indent} ${process.trim()}`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return code;
|
|
124
|
+
};
|
|
125
|
+
var processSceneInputs = (currentScene, config, addDependencyImport, indent) => {
|
|
126
|
+
let code = "";
|
|
127
|
+
const sceneInputs = (currentScene == null ? void 0 : currentScene.inputs) || [];
|
|
128
|
+
if (!Array.isArray(sceneInputs) || sceneInputs.length === 0)
|
|
129
|
+
return code;
|
|
130
|
+
code += `
|
|
131
|
+
${indent} const inputs = comRefs.current.inputs;`;
|
|
132
|
+
sceneInputs.forEach((input) => {
|
|
133
|
+
const event = config.getFrameInputEvent(input.id, currentScene.id);
|
|
134
|
+
if (!event)
|
|
135
|
+
return;
|
|
136
|
+
const process = (0, import_handleProcess.handleProcess)(event, {
|
|
137
|
+
...config,
|
|
138
|
+
target: "comRefs.current",
|
|
139
|
+
depth: 3,
|
|
140
|
+
addParentDependencyImport: addDependencyImport,
|
|
141
|
+
getParams: () => ({ [input.id]: "data" })
|
|
142
|
+
}).replace(/this\./g, "comRefs.current.").replace(/comRefs\.current\.([a-zA-Z0-9_]+)\.controller_/g, "comRefs.current.$1.").replace(/comRefs\.current\.slot_Index\./g, "comRefs.current.");
|
|
143
|
+
if (process.trim()) {
|
|
144
|
+
code += `
|
|
145
|
+
${indent} inputs.${input.id} = (data: any) => {
|
|
146
|
+
${process}
|
|
147
|
+
${indent} };`;
|
|
148
|
+
if (input.id === "open") {
|
|
149
|
+
addDependencyImport({
|
|
150
|
+
packageName: config.getComponentPackageName(),
|
|
151
|
+
dependencyNames: ["page", "SUBJECT_SUBSCRIBE"],
|
|
152
|
+
importType: "named"
|
|
153
|
+
});
|
|
154
|
+
code += `
|
|
155
|
+
${indent} page.getParams()[SUBJECT_SUBSCRIBE]((val: any) => {
|
|
156
|
+
${indent} if (val) inputs.open(val);
|
|
157
|
+
${indent} });`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return code;
|
|
162
|
+
};
|
|
163
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
164
|
+
0 && (module.exports = {
|
|
165
|
+
processSceneLogic
|
|
166
|
+
});
|
|
@@ -5196,8 +5196,8 @@
|
|
|
5196
5196
|
"content": "import Taro from '@tarojs/taro';\n\nexport type DataType = {\n dynamic?: boolean;\n title?: string;\n duration?: number | string;\n mask?: boolean;\n asynchronous?: boolean;\n icon?: 'success' | 'error' | 'loading' | 'none';\n image?: string;\n};\n\nexport interface Inputs {\n showToast?: (fn: (config: DataType | string, relOutputs?: any) => void) => void;\n}\n\nexport interface Outputs {\n afterShowToast: (value?: any) => void;\n}\n\ninterface IOContext {\n data: DataType;\n inputs: Inputs;\n outputs: Outputs;\n}\n\nexport default (context: IOContext) => {\n const data: DataType = context.data;\n const inputs: Inputs = context.inputs;\n const outputs: Outputs = context.outputs;\n\n inputs.showToast?.((val: DataType | string) => {\n if (data?.dynamic) {\n // 动态输入\n try {\n const toastConfig: any = {\n title: typeof val === 'string' ? val : val?.title || data.title || '',\n duration: Number(val && typeof val === 'object' ? (val?.duration ?? data.duration ?? 1000) : data.duration ?? 1000),\n mask: val && typeof val === 'object' ? (val?.mask ?? data.mask ?? false) : data.mask ?? false,\n };\n \n if (val && typeof val === 'object' && val.icon) {\n toastConfig.icon = val.icon;\n } else if (data.icon) {\n toastConfig.icon = data.icon;\n }\n \n if (val && typeof val === 'object' && val.image) {\n toastConfig.image = val.image;\n } else if (data.image) {\n toastConfig.image = data.image;\n }\n\n Taro.showToast(toastConfig);\n \n if (data.asynchronous) {\n setTimeout(() => {\n outputs.afterShowToast(val);\n }, Number(val && typeof val === 'object' ? (val?.duration ?? data.duration ?? 1000) : data.duration ?? 1000));\n } else {\n outputs.afterShowToast(val);\n }\n } catch (error) {\n console.error('显示 Toast 失败:', error);\n }\n } else {\n // 非动态输入\n try {\n const toastConfig: any = {\n title: data.title || '',\n duration: Number(data.duration || 1000),\n mask: data.mask ?? false,\n };\n \n if (data.icon) {\n toastConfig.icon = data.icon;\n }\n \n if (data.image) {\n toastConfig.image = data.image;\n }\n\n Taro.showToast(toastConfig);\n \n if (data.asynchronous) {\n setTimeout(() => {\n outputs.afterShowToast(val);\n }, Number(data.duration || 1000));\n } else {\n outputs.afterShowToast(val);\n }\n } catch (error) {\n console.error('显示 Toast 失败:', error);\n }\n }\n });\n};\n\n"
|
|
5197
5197
|
},
|
|
5198
5198
|
{
|
|
5199
|
-
"path": "src/core/comlib/
|
|
5200
|
-
"content": "export {
|
|
5199
|
+
"path": "src/core/comlib/index.ts",
|
|
5200
|
+
"content": "export { default as mybricks_taro_showToast } from './_ShowToast';\nexport type { DataType as mybricks_taro_showToast_DataType } from './_ShowToast';\n\nexport { default as mybricks_taro_scanQrcode } from './_ScanQrcode';\nexport type { DataType as mybricks_taro_scanQrcode_DataType } from './_ScanQrcode';\n\nexport { default as mybricks_taro_setStorage } from './_SetStorage';\nexport type { DataType as mybricks_taro_setStorage_DataType } from './_SetStorage';\n\n"
|
|
5201
5201
|
}
|
|
5202
5202
|
]
|
|
5203
5203
|
},
|
|
@@ -5235,7 +5235,7 @@
|
|
|
5235
5235
|
},
|
|
5236
5236
|
{
|
|
5237
5237
|
"path": "src/core/mybricks/index.js",
|
|
5238
|
-
"content": "import {\n SUBJECT_NEXT,\n SUBJECT_VALUE,\n VARS_MARK,\n BASECONTROLLER_MARK,\n EXE_TITLE_MAP,\n CONTROLLER_CONTEXT,\n EXCUTE_TYPE_KEY,\n EXCUTE_TYPE_VALUE\n} from \"./constant\"\nimport { log } from \"./log\"\nimport { Subject } from \"./Subject\"\nimport { context } from \"./context\"\nimport { safeSetByPath, isObject } from \"./utils\"\nimport { createReactiveInputHandler } from \"./createReactiveInputHandler\"\n\n/** 合并数据流 */\nexport const merge = (...subjects) => {\n const merge = new Subject()\n\n subjects.forEach((subject) => {\n if (subject?.[SUBJECT_SUBSCRIBE]) {\n subject[SUBJECT_SUBSCRIBE]((value) => {\n merge[SUBJECT_NEXT](value)\n })\n } else {\n merge[SUBJECT_NEXT](subject)\n }\n })\n\n return merge\n}\n\n\n// UI\nexport const createInputsHandle = (params, init = false) => {\n if (init) {\n /** 注册的输入 */\n const _inputEvents = {}\n /** 输入未完成注册,写入todo列表 */\n const _inputEventsTodo = {}\n /** 组件基础信息 */\n const _comInfo = {}\n /** 全局 */\n const controllerContext = {\n initStyles: {},\n initData: {},\n dataChangedSubjects: {},\n // 唯一标记\n mark: {}\n }\n\n const proxy = new Proxy({}, {\n get(_, key) {\n // 内置关键字\n if (key === \"_inputEvents\") {\n return _inputEvents;\n } else if (key === \"_inputEventsTodo\") {\n return _inputEventsTodo\n } else if (key === \"_comInfo\") {\n return _comInfo\n } else if (key === CONTROLLER_CONTEXT) {\n return controllerContext\n } else if (key === \"_setStyle\") {\n return (value0, value1) => {\n const next = (value) => {\n if (Object.prototype.toString.call(value) === \"[object Object]\") {\n Object.entries(value).forEach(([selector, nextStyle]) => {\n if (!controllerContext.styles) {\n const { initStyles } = controllerContext\n if (!initStyles[selector]) {\n initStyles[selector] = nextStyle\n } else {\n const initStyle = initStyles[selector]\n Object.entries(nextStyle).forEach(([key, value]) => {\n initStyle[key] = value\n })\n }\n return\n }\n const { style } = controllerContext.styles.getStyle(selector)\n const updators = controllerContext.styles.getUpdators(selector)\n\n Object.entries(nextStyle).forEach(([key, value]) => {\n style[key] = value\n })\n\n if (updators) {\n updators.forEach((updator) => {\n updator(selector, style)\n })\n }\n })\n }\n }\n\n if (typeof value0 === \"string\" && value1) {\n if (value1?.[SUBJECT_SUBSCRIBE]) {\n value1[SUBJECT_SUBSCRIBE]((value) => {\n next({\n [value0]: value\n })\n })\n } else {\n next({\n [value0]: value1\n })\n }\n } else {\n if (value0?.[SUBJECT_SUBSCRIBE]) {\n value0[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value0)\n }\n }\n }\n } else if (key === \"_setData\") {\n return (...args) => {\n if (args.length === 2) {\n const [path, value] = args\n\n const next = (params) => {\n const { path, value } = params\n if (!controllerContext.data) {\n const { initData } = controllerContext\n initData[path] = value\n return\n }\n\n safeSetByPath({\n data: controllerContext.data,\n path: path.split(\".\"),\n value: {\n value,\n [EXCUTE_TYPE_KEY]: EXCUTE_TYPE_VALUE.DATACHANGED\n }\n })\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value, extra) => {\n if (extra?.[EXCUTE_TYPE_KEY] === EXCUTE_TYPE_VALUE.DATACHANGED && extra?.controllerMark === controllerContext.mark) {\n // 数据流来自「EXCUTE_TYPE_VALUE.DATACHANGED」且来自自身,不再继续执行,避免死循环\n return\n }\n next({ value, path })\n })\n } else {\n next({ value, path })\n }\n }\n }\n } else if (key === \"_dataChanged\") {\n return (path) => {\n const subject = new Subject();\n controllerContext.dataChangedSubjects[path] = subject;\n\n return subject;\n }\n }\n\n return (value) => {\n if (!_inputEvents[key]) {\n // 组件未完成输入注册\n if (!_inputEventsTodo[key]) {\n _inputEventsTodo[key] = []\n }\n\n const rels = {}\n\n _inputEventsTodo[key].push({\n value,\n rels,\n });\n\n return new Proxy({}, {\n get(_, key) {\n return rels[key] || (rels[key] = new Subject())\n }\n })\n }\n\n return createReactiveInputHandler({\n input(value, proxy) {\n log(`${EXE_TITLE_MAP[\"input\"]} ${_comInfo.title} | ${key}`, JSON.stringify(value))\n return _inputEvents[key](value, proxy)\n },\n title: _comInfo.title,\n value,\n rels: {}\n })\n }\n }\n })\n\n return proxy;\n } else {\n if (!params.controller[CONTROLLER_CONTEXT].inputs) {\n const { controller, title, styles } = params\n const { _inputEvents, _comInfo, _inputEventsTodo, [CONTROLLER_CONTEXT]: controllerContext } = controller\n _comInfo.title = title;\n controllerContext.initModifier = {\n visibility: styles?.root?.display === \"none\" ? Visibility.None : Visibility.Visible\n }\n\n const createVisibilityHandler = (visibilityState) => {\n return (value) => {\n const setVisibility = () => {\n if (!controllerContext.modifier?.attribute) {\n controllerContext.initModifier.visibility = visibilityState\n } else {\n controllerContext.modifier.attribute?.visibility(visibilityState)\n }\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE](setVisibility);\n } else {\n setVisibility()\n }\n };\n };\n\n // 内置显示隐藏逻辑\n _inputEvents.show = createVisibilityHandler(Visibility.Visible)\n _inputEvents.hide = createVisibilityHandler(Visibility.None)\n _inputEvents.showOrHide = (value) => {\n const setVisibility = (value) => {\n if (!controllerContext.modifier?.attribute) {\n controllerContext.initModifier.visibility = !!value ? Visibility.Visible : Visibility.None\n } else {\n controllerContext.modifier.attribute?.visibility(!!value ? Visibility.Visible : Visibility.None)\n }\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE](setVisibility)\n } else {\n setVisibility(value)\n }\n }\n // 处理显示隐藏todo项\n [\"show\", \"hide\", \"showOrHide\"].forEach((key) => {\n const todo = _inputEventsTodo[key]\n if (todo) {\n Reflect.deleteProperty(_inputEventsTodo, key)\n\n todo.forEach(({ value }) => {\n _inputEvents[key](value)\n })\n }\n })\n\n const proxy = new Proxy(controller, {\n get(_, key) {\n return (input) => {\n if (!_inputEvents[key]) {\n // 第一次注册,处理TODO\n if (_inputEventsTodo[key]) {\n _inputEventsTodo[key].forEach(({ value, rels }) => {\n createReactiveInputHandler({\n input(value, proxy) {\n log(`${EXE_TITLE_MAP[\"input\"]} ${title} | ${key}`, JSON.stringify(value))\n return input(value, proxy)\n },\n title,\n value,\n rels\n })\n })\n Reflect.deleteProperty(_inputEventsTodo, key)\n }\n }\n\n _inputEvents[key] = input\n }\n }\n })\n\n params.controller[CONTROLLER_CONTEXT].inputs = proxy;\n }\n\n return params.controller[CONTROLLER_CONTEXT].inputs\n }\n}\n\n// 事件\nexport const createEventsHandle = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].outputs) {\n params.controller[CONTROLLER_CONTEXT].outputs = new Proxy(params.events || {}, {\n get(target, key) {\n const event = params.controller[CONTROLLER_CONTEXT].appContext?.comEvent?.[params.uid]?.[key]\n if (event) {\n const { getVar, getOutput, getInput } = params.controller[CONTROLLER_CONTEXT]\n return (value) => {\n event(value, {\n getVar,\n getOutput,\n getInput\n })\n }\n }\n\n return target[key] || (() => {\n })\n }\n })\n }\n\n return params.controller[CONTROLLER_CONTEXT].outputs\n}\n\n// 场景打开、输出\nexport const pageController = () => {\n return new Proxy({\n commit: new Subject(),\n cancel: new Subject(),\n apply: new Subject(),\n close: new Subject(),\n }, {\n get(target, key) {\n return target[key]\n }\n })\n}\n\nexport class Page {\n appRouter\n\n constructor(appRouter) {\n this.appRouter = appRouter\n }\n\n /** 获取当前页面入参 */\n getParams(name) {\n const params = this.appRouter.getParams(name)\n const subject = new Subject()\n subject[SUBJECT_NEXT](params?.value)\n return subject\n }\n\n /** 打开 */\n open(name, value) {\n const controller = pageController()\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.push(name, { value, controller })\n })\n } else {\n this.appRouter.push(name, { value, controller })\n }\n\n return controller\n }\n\n /** 打开 */\n replace(name, value) {\n const controller = pageController()\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.replace(name, { value, controller })\n })\n } else {\n this.appRouter.replace(name, { value, controller })\n }\n\n return controller\n }\n\n /** 确定 */\n commit(name, value) {\n const params = this.appRouter.getParams(name)\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.commit[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.commit[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n\n /** 取消 */\n cancel(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.cancel[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.cancel[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n\n /** 应用,不关闭 */\n apply(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n params.controller.apply[SUBJECT_NEXT](value)\n })\n } else {\n params.controller.apply[SUBJECT_NEXT](value)\n }\n }\n\n /** 关闭 */\n close(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.close[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.close[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n}\n\n// api\nexport const emit = (fn, value) => {\n const subject = new Subject()\n\n if (!fn) {\n return subject\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n const res = fn(value)\n\n if (res instanceof Promise) {\n res.then((value) => {\n subject[SUBJECT_NEXT](value)\n })\n } else {\n subject[SUBJECT_NEXT](res)\n }\n })\n } else {\n const res = fn(value)\n\n if (res instanceof Promise) {\n res.then((value) => {\n subject[SUBJECT_NEXT](value)\n })\n } else {\n subject[SUBJECT_NEXT](res)\n }\n }\n\n return subject;\n}\n\n/** 创建fx */\nexport const createFx = (fx) => {\n return (value, ...args) => {\n const outputs = {}\n\n const proxy = new Proxy({}, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n\n const next = (value) => {\n const res = fx(value, ...args)\n if (res) {\n Object.entries(res).forEach(([key, value]) => {\n if (!outputs[key]) {\n outputs[key] = new Subject()\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n outputs[key][SUBJECT_NEXT](value)\n })\n } else {\n outputs[key][SUBJECT_NEXT](value)\n }\n })\n }\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value)\n }\n\n return proxy\n }\n}\n\n/** 创建插槽IO */\nexport const createSlotsIO = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].slotsIO) {\n const slotsIOMap = {}\n params.controller[CONTROLLER_CONTEXT].slotsIO = new Proxy({}, {\n get(_, key) {\n if (!slotsIOMap[key]) {\n const inputsMap = {}\n slotsIOMap[key] = {\n inputs: new Proxy({}, {\n get(_, key) {\n if (!inputsMap[key]) {\n inputsMap[key] = new Subject()\n }\n\n const next = (value) => {\n inputsMap[key][SUBJECT_NEXT](value)\n }\n\n next[SUBJECT_SUBSCRIBE] = (next) => {\n inputsMap[key][SUBJECT_SUBSCRIBE](next)\n }\n\n return next\n }\n }),\n outputs: new Proxy({}, {\n get(_, key) {\n return (next) => {\n return (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value)\n }\n }\n }\n }\n })\n }\n }\n\n return slotsIOMap[key]\n }\n })\n }\n\n return params.controller[CONTROLLER_CONTEXT].slotsIO\n}\n\n/**\n * 模块\n * [TODO] 暂时无法在多处使用关联输出项\n */\nexport const createModuleInputsHandle = () => {\n const inputsMap = {}\n const outputsMap = {}\n\n return new Proxy({}, {\n get(_, key) {\n if (key === \"outputs\") {\n return new Proxy({}, {\n get(_, key) {\n if (!outputsMap[key]) {\n outputsMap[key] = new Subject()\n }\n return (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n outputsMap[key][SUBJECT_NEXT](value)\n });\n } else {\n outputsMap[key][SUBJECT_NEXT](value)\n }\n }\n }\n })\n }\n\n if (!inputsMap[key]) {\n inputsMap[key] = new Subject()\n }\n\n const next = (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n inputsMap[key][SUBJECT_NEXT](value)\n });\n } else {\n inputsMap[key][SUBJECT_NEXT](value)\n }\n\n return new Proxy({}, {\n get(_, key) {\n return outputsMap[key] || (outputsMap[key] = new Subject())\n }\n })\n }\n\n return new Proxy(next, {\n get(_, proxyKey) {\n if (proxyKey === \"subscribe\" || proxyKey === SUBJECT_SUBSCRIBE) {\n return (next) => {\n inputsMap[key][SUBJECT_SUBSCRIBE](next)\n }\n } else if (proxyKey === \"value\" || proxyKey === SUBJECT_VALUE) {\n return inputsMap[key][SUBJECT_VALUE]\n }\n }\n })\n }\n })\n}\n\nclass Styles {\n styles = {}\n map = new Map()\n\n constructor(styles) {\n this.styles = styles\n }\n\n getStyle(selector) {\n let style = this.styles[selector]\n if (!style) {\n this.styles[selector] = {}\n style = this.styles[selector]\n }\n return {\n selector,\n style,\n setUpdator: (updator, uid) => {\n if (!this.map.has(selector)) {\n this.map.set(selector, new Map())\n }\n const selectorMap = this.map.get(selector)\n selectorMap.set(uid, updator)\n },\n ...style\n }\n }\n\n getUpdators(selector) {\n return this.map.get(selector)\n }\n}\n\n/**\n * 组件样式\n */\nexport const createStyles = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].styles) {\n const initStyles = params.controller[CONTROLLER_CONTEXT].initStyles\n const { styles, parentSlot } = params;\n Object.entries(initStyles).forEach(([selector, initStyle]) => {\n if (!styles[selector]) {\n styles[selector] = initStyle\n } else {\n const style = styles[selector]\n Object.entries(initStyle).forEach(([key, value]) => {\n style[key] = value\n })\n }\n })\n if (parentSlot?.itemWrap) {\n const { root, ...other } = styles\n params.controller[CONTROLLER_CONTEXT].styles = new Styles(other)\n } else {\n params.controller[CONTROLLER_CONTEXT].styles = new Styles(styles)\n }\n }\n\n return new Proxy({}, {\n ownKeys() {\n return Object.keys(params.styles)\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n get(_, key) {\n return params.controller[CONTROLLER_CONTEXT].styles.getStyle(key)\n }\n })\n}\n\n/**\n * @returns {any}\n */\nexport const transformApi = (api) => {\n return (value, cb) => {\n const id = `${Math.random()}_${new Date().getTime()}`\n const outputs = {}\n const dispose = () => {\n\n }\n const proxy = new Proxy(dispose, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n let isDispose = false;\n\n context.apiRun = id;\n\n const res = api(value)\n\n context.apiRun = null;\n\n if (res) {\n Object.entries(res).forEach(([key, value]) => {\n if (!outputs[key]) {\n outputs[key] = new Subject()\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n if (isDispose) {\n return\n }\n isDispose = true\n outputs[key][SUBJECT_NEXT](value)\n cb?.[key]?.(value)\n context.apiRunVariablesSubject[id]?.forEach((subject) => {\n subject.destroy()\n })\n })\n } else {\n if (isDispose) {\n return\n }\n isDispose = true\n outputs[key][SUBJECT_NEXT](value)\n cb?.[key]?.(value)\n context.apiRunVariablesSubject[id]?.forEach((subject) => {\n subject.destroy()\n })\n }\n })\n }\n\n return proxy\n }\n}\n\nexport const transformBus = (bus) => {\n return (newBus) => {\n Object.entries(newBus).forEach(([key, newBus]) => {\n bus[key] = (value) => {\n const outputs = {}\n\n const callBack = new Proxy({}, {\n get(_, key) {\n return (value) => {\n const output = outputs[key] || (outputs[key] = new Subject())\n output[SUBJECT_NEXT](value)\n }\n }\n })\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n newBus(value, callBack)\n })\n } else {\n newBus(value, callBack)\n }\n\n return new Proxy({}, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n };\n })\n }\n}\n\nexport const createBus = (bus) => {\n return () => {\n return new Proxy({}, {\n get() {\n return new Subject()\n }\n })\n }\n}\n\nexport const join = (lastSubject, nextSubject) => {\n const subject = new Subject();\n const next = () => {\n if (nextSubject?.[SUBJECT_SUBSCRIBE]) {\n subject[SUBJECT_NEXT](nextSubject[SUBJECT_VALUE]);\n } else {\n subject[SUBJECT_NEXT](nextSubject);\n }\n }\n\n if (lastSubject?.[SUBJECT_SUBSCRIBE]) {\n lastSubject[SUBJECT_SUBSCRIBE](() => {\n next()\n });\n } else {\n next()\n }\n\n return subject;\n};\n\nexport const createModifier = (params, Modifier) => {\n if (!params.controller[CONTROLLER_CONTEXT].modifier) {\n params.controller[CONTROLLER_CONTEXT].modifier = new Modifier(params.controller[CONTROLLER_CONTEXT].initModifier);\n }\n return params.controller[CONTROLLER_CONTEXT].modifier\n}\n\nconst DATA_PROXY = Symbol(\"DATA_PROXY\");\nconst dataProxy = (params) => {\n const { data, path, config } = params;\n return new Proxy(data, {\n get(target, key, receiver) {\n if (key === DATA_PROXY) {\n return true;\n }\n const value = Reflect.get(target, key, receiver);\n if (typeof key !== \"string\" || target.hasOwnProperty(key)) {\n return value\n }\n if (isObject(value)) {\n if (value[DATA_PROXY]) {\n return value;\n }\n\n return dataProxy({\n data: value,\n path: path ? `${path}.${key}` : key,\n config\n });\n }\n return value;\n },\n set(target, key, value, receiver) {\n if (typeof key !== \"string\" || target.hasOwnProperty(key)) {\n Reflect.set(target, key, value, receiver);\n } else {\n if (!value?.[EXCUTE_TYPE_KEY]) {\n Reflect.set(target, key, value, receiver);\n // 目前只有「EXCUTE_TYPE_VALUE.DATACHANGED」,所以判断有「EXCUTE_TYPE_KEY」就行\n config?.set?.({\n value,\n path: path ? `${path}.${key}` : key,\n });\n } else {\n Reflect.set(target, key, value.value, receiver);\n }\n }\n return true;\n },\n });\n}\n\nexport const createData = (params, Data) => {\n if (!params.controller[CONTROLLER_CONTEXT].data) {\n const { initData, dataChangedSubjects, mark } = params.controller[CONTROLLER_CONTEXT]\n const nextData = Object.assign({}, params.data)\n Object.entries(initData).forEach(([path, value]) => {\n safeSetByPath({\n data: nextData,\n path: path.split(\".\"),\n value\n })\n })\n\n const data = new Data(nextData)\n const observeData = dataProxy({\n data,\n path: \"\",\n config: {\n set(params) {\n const dataChangedSubject = dataChangedSubjects[params.path];\n if (dataChangedSubject) {\n dataChangedSubject[SUBJECT_NEXT](params.value, {\n [EXCUTE_TYPE_KEY]: EXCUTE_TYPE_VALUE.DATACHANGED,\n controllerMark: mark,\n })\n }\n }\n }\n })\n\n params.controller[CONTROLLER_CONTEXT].data = observeData\n }\n\n return params.controller[CONTROLLER_CONTEXT].data\n}\n\nexport class Vars {\n [VARS_MARK] = true\n}\n\nexport class BaseController {\n [BASECONTROLLER_MARK] = true\n}\n\nexport * from \"./MyBricksDescriptor\"\n\nexport * from \"./createModuleEventsHandle\"\n\nexport * from \"./createJSHandle\"\n\nexport * from \"./Subject\"\n\nexport * from \"./createEnv\"\n\nexport * from \"./variables\"\n\nexport * from \"./event\"\n\n"
|
|
5238
|
+
"content": "import {\n SUBJECT_NEXT,\n SUBJECT_VALUE,\n SUBJECT_SUBSCRIBE,\n VARS_MARK,\n BASECONTROLLER_MARK,\n EXE_TITLE_MAP,\n CONTROLLER_CONTEXT,\n EXCUTE_TYPE_KEY,\n EXCUTE_TYPE_VALUE\n} from \"./constant\"\nimport { log } from \"./log\"\nimport { Subject } from \"./Subject\"\nimport { context } from \"./context\"\nimport { safeSetByPath, isObject } from \"./utils\"\nimport { createReactiveInputHandler } from \"./createReactiveInputHandler\"\n\n/** 合并数据流 */\nexport const merge = (...subjects) => {\n const merge = new Subject()\n\n subjects.forEach((subject) => {\n if (subject?.[SUBJECT_SUBSCRIBE]) {\n subject[SUBJECT_SUBSCRIBE]((value) => {\n merge[SUBJECT_NEXT](value)\n })\n } else {\n merge[SUBJECT_NEXT](subject)\n }\n })\n\n return merge\n}\n\n\n// UI\nexport const createInputsHandle = (params, init = false) => {\n if (init) {\n /** 注册的输入 */\n const _inputEvents = {}\n /** 输入未完成注册,写入todo列表 */\n const _inputEventsTodo = {}\n /** 组件基础信息 */\n const _comInfo = {}\n /** 全局 */\n const controllerContext = {\n initStyles: {},\n initData: {},\n dataChangedSubjects: {},\n // 唯一标记\n mark: {}\n }\n\n const proxy = new Proxy({}, {\n get(_, key) {\n // 内置关键字\n if (key === \"_inputEvents\") {\n return _inputEvents;\n } else if (key === \"_inputEventsTodo\") {\n return _inputEventsTodo\n } else if (key === \"_comInfo\") {\n return _comInfo\n } else if (key === CONTROLLER_CONTEXT) {\n return controllerContext\n } else if (key === \"_setStyle\") {\n return (value0, value1) => {\n const next = (value) => {\n if (Object.prototype.toString.call(value) === \"[object Object]\") {\n Object.entries(value).forEach(([selector, nextStyle]) => {\n if (!controllerContext.styles) {\n const { initStyles } = controllerContext\n if (!initStyles[selector]) {\n initStyles[selector] = nextStyle\n } else {\n const initStyle = initStyles[selector]\n Object.entries(nextStyle).forEach(([key, value]) => {\n initStyle[key] = value\n })\n }\n return\n }\n const { style } = controllerContext.styles.getStyle(selector)\n const updators = controllerContext.styles.getUpdators(selector)\n\n Object.entries(nextStyle).forEach(([key, value]) => {\n style[key] = value\n })\n\n if (updators) {\n updators.forEach((updator) => {\n updator(selector, style)\n })\n }\n })\n }\n }\n\n if (typeof value0 === \"string\" && value1) {\n if (value1?.[SUBJECT_SUBSCRIBE]) {\n value1[SUBJECT_SUBSCRIBE]((value) => {\n next({\n [value0]: value\n })\n })\n } else {\n next({\n [value0]: value1\n })\n }\n } else {\n if (value0?.[SUBJECT_SUBSCRIBE]) {\n value0[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value0)\n }\n }\n }\n } else if (key === \"_setData\") {\n return (...args) => {\n if (args.length === 2) {\n const [path, value] = args\n\n const next = (params) => {\n const { path, value } = params\n if (!controllerContext.data) {\n const { initData } = controllerContext\n initData[path] = value\n return\n }\n\n safeSetByPath({\n data: controllerContext.data,\n path: path.split(\".\"),\n value: {\n value,\n [EXCUTE_TYPE_KEY]: EXCUTE_TYPE_VALUE.DATACHANGED\n }\n })\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value, extra) => {\n if (extra?.[EXCUTE_TYPE_KEY] === EXCUTE_TYPE_VALUE.DATACHANGED && extra?.controllerMark === controllerContext.mark) {\n // 数据流来自「EXCUTE_TYPE_VALUE.DATACHANGED」且来自自身,不再继续执行,避免死循环\n return\n }\n next({ value, path })\n })\n } else {\n next({ value, path })\n }\n }\n }\n } else if (key === \"_dataChanged\") {\n return (path) => {\n const subject = new Subject();\n controllerContext.dataChangedSubjects[path] = subject;\n\n return subject;\n }\n }\n\n return (value) => {\n if (!_inputEvents[key]) {\n // 组件未完成输入注册\n if (!_inputEventsTodo[key]) {\n _inputEventsTodo[key] = []\n }\n\n const rels = {}\n\n _inputEventsTodo[key].push({\n value,\n rels,\n });\n\n return new Proxy({}, {\n get(_, key) {\n return rels[key] || (rels[key] = new Subject())\n }\n })\n }\n\n return createReactiveInputHandler({\n input(value, proxy) {\n log(`${EXE_TITLE_MAP[\"input\"]} ${_comInfo.title} | ${key}`, JSON.stringify(value))\n return _inputEvents[key](value, proxy)\n },\n title: _comInfo.title,\n value,\n rels: {}\n })\n }\n }\n })\n\n return proxy;\n } else {\n if (!params.controller[CONTROLLER_CONTEXT].inputs) {\n const { controller, title, styles } = params\n const { _inputEvents, _comInfo, _inputEventsTodo, [CONTROLLER_CONTEXT]: controllerContext } = controller\n _comInfo.title = title;\n controllerContext.initModifier = {\n visibility: styles?.root?.display === \"none\" ? Visibility.None : Visibility.Visible\n }\n\n const createVisibilityHandler = (visibilityState) => {\n return (value) => {\n const setVisibility = () => {\n if (!controllerContext.modifier?.attribute) {\n controllerContext.initModifier.visibility = visibilityState\n } else {\n controllerContext.modifier.attribute?.visibility(visibilityState)\n }\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE](setVisibility);\n } else {\n setVisibility()\n }\n };\n };\n\n // 内置显示隐藏逻辑\n _inputEvents.show = createVisibilityHandler(Visibility.Visible)\n _inputEvents.hide = createVisibilityHandler(Visibility.None)\n _inputEvents.showOrHide = (value) => {\n const setVisibility = (value) => {\n if (!controllerContext.modifier?.attribute) {\n controllerContext.initModifier.visibility = !!value ? Visibility.Visible : Visibility.None\n } else {\n controllerContext.modifier.attribute?.visibility(!!value ? Visibility.Visible : Visibility.None)\n }\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE](setVisibility)\n } else {\n setVisibility(value)\n }\n }\n // 处理显示隐藏todo项\n [\"show\", \"hide\", \"showOrHide\"].forEach((key) => {\n const todo = _inputEventsTodo[key]\n if (todo) {\n Reflect.deleteProperty(_inputEventsTodo, key)\n\n todo.forEach(({ value }) => {\n _inputEvents[key](value)\n })\n }\n })\n\n const proxy = new Proxy(controller, {\n get(_, key) {\n return (input) => {\n if (!_inputEvents[key]) {\n // 第一次注册,处理TODO\n if (_inputEventsTodo[key]) {\n _inputEventsTodo[key].forEach(({ value, rels }) => {\n createReactiveInputHandler({\n input(value, proxy) {\n log(`${EXE_TITLE_MAP[\"input\"]} ${title} | ${key}`, JSON.stringify(value))\n return input(value, proxy)\n },\n title,\n value,\n rels\n })\n })\n Reflect.deleteProperty(_inputEventsTodo, key)\n }\n }\n\n _inputEvents[key] = input\n }\n }\n })\n\n params.controller[CONTROLLER_CONTEXT].inputs = proxy;\n }\n\n return params.controller[CONTROLLER_CONTEXT].inputs\n }\n}\n\n// 事件\nexport const createEventsHandle = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].outputs) {\n params.controller[CONTROLLER_CONTEXT].outputs = new Proxy(params.events || {}, {\n get(target, key) {\n const event = params.controller[CONTROLLER_CONTEXT].appContext?.comEvent?.[params.uid]?.[key]\n if (event) {\n const { getVar, getOutput, getInput } = params.controller[CONTROLLER_CONTEXT]\n return (value) => {\n event(value, {\n getVar,\n getOutput,\n getInput\n })\n }\n }\n\n return target[key] || (() => {\n })\n }\n })\n }\n\n return params.controller[CONTROLLER_CONTEXT].outputs\n}\n\n// 场景打开、输出\nexport const pageController = () => {\n return new Proxy({\n commit: new Subject(),\n cancel: new Subject(),\n apply: new Subject(),\n close: new Subject(),\n }, {\n get(target, key) {\n return target[key]\n }\n })\n}\n\nexport class Page {\n appRouter\n\n constructor(appRouter) {\n this.appRouter = appRouter\n }\n\n /** 获取当前页面入参 */\n getParams(name) {\n const params = this.appRouter.getParams(name)\n const subject = new Subject()\n subject[SUBJECT_NEXT](params?.value)\n return subject\n }\n\n /** 打开 */\n open(name, value) {\n const controller = pageController()\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.push(name, { value, controller })\n })\n } else {\n this.appRouter.push(name, { value, controller })\n }\n\n return controller\n }\n\n /** 打开 */\n replace(name, value) {\n const controller = pageController()\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.replace(name, { value, controller })\n })\n } else {\n this.appRouter.replace(name, { value, controller })\n }\n\n return controller\n }\n\n /** 确定 */\n commit(name, value) {\n const params = this.appRouter.getParams(name)\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.commit[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.commit[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n\n /** 取消 */\n cancel(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.cancel[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.cancel[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n\n /** 应用,不关闭 */\n apply(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n params.controller.apply[SUBJECT_NEXT](value)\n })\n } else {\n params.controller.apply[SUBJECT_NEXT](value)\n }\n }\n\n /** 关闭 */\n close(name, value) {\n const params = this.appRouter.getParams(name)\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.close[SUBJECT_NEXT](value)\n }, 100)\n })\n } else {\n this.appRouter.pop()\n setTimeout(() => {\n params.controller.close[SUBJECT_NEXT](value)\n }, 100)\n }\n }\n}\n\n// api\nexport const emit = (fn, value) => {\n const subject = new Subject()\n\n if (!fn) {\n return subject\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n const res = fn(value)\n\n if (res instanceof Promise) {\n res.then((value) => {\n subject[SUBJECT_NEXT](value)\n })\n } else {\n subject[SUBJECT_NEXT](res)\n }\n })\n } else {\n const res = fn(value)\n\n if (res instanceof Promise) {\n res.then((value) => {\n subject[SUBJECT_NEXT](value)\n })\n } else {\n subject[SUBJECT_NEXT](res)\n }\n }\n\n return subject;\n}\n\n/** 创建fx */\nexport const createFx = (fx) => {\n return (value, ...args) => {\n const outputs = {}\n\n const proxy = new Proxy({}, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n\n const next = (value) => {\n const res = fx(value, ...args)\n if (res) {\n Object.entries(res).forEach(([key, value]) => {\n if (!outputs[key]) {\n outputs[key] = new Subject()\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n outputs[key][SUBJECT_NEXT](value)\n })\n } else {\n outputs[key][SUBJECT_NEXT](value)\n }\n })\n }\n }\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value)\n }\n\n return proxy\n }\n}\n\n/** 创建插槽IO */\nexport const createSlotsIO = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].slotsIO) {\n const slotsIOMap = {}\n params.controller[CONTROLLER_CONTEXT].slotsIO = new Proxy({}, {\n get(_, key) {\n if (!slotsIOMap[key]) {\n const inputsMap = {}\n slotsIOMap[key] = {\n inputs: new Proxy({}, {\n get(_, key) {\n if (!inputsMap[key]) {\n inputsMap[key] = new Subject()\n }\n\n const next = (value) => {\n inputsMap[key][SUBJECT_NEXT](value)\n }\n\n next[SUBJECT_SUBSCRIBE] = (next) => {\n inputsMap[key][SUBJECT_SUBSCRIBE](next)\n }\n\n return next\n }\n }),\n outputs: new Proxy({}, {\n get(_, key) {\n return (next) => {\n return (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n next(value)\n })\n } else {\n next(value)\n }\n }\n }\n }\n })\n }\n }\n\n return slotsIOMap[key]\n }\n })\n }\n\n return params.controller[CONTROLLER_CONTEXT].slotsIO\n}\n\n/**\n * 模块\n * [TODO] 暂时无法在多处使用关联输出项\n */\nexport const createModuleInputsHandle = () => {\n const inputsMap = {}\n const outputsMap = {}\n\n return new Proxy({}, {\n get(_, key) {\n if (key === \"outputs\") {\n return new Proxy({}, {\n get(_, key) {\n if (!outputsMap[key]) {\n outputsMap[key] = new Subject()\n }\n return (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n outputsMap[key][SUBJECT_NEXT](value)\n });\n } else {\n outputsMap[key][SUBJECT_NEXT](value)\n }\n }\n }\n })\n }\n\n if (!inputsMap[key]) {\n inputsMap[key] = new Subject()\n }\n\n const next = (value) => {\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n inputsMap[key][SUBJECT_NEXT](value)\n });\n } else {\n inputsMap[key][SUBJECT_NEXT](value)\n }\n\n return new Proxy({}, {\n get(_, key) {\n return outputsMap[key] || (outputsMap[key] = new Subject())\n }\n })\n }\n\n return new Proxy(next, {\n get(_, proxyKey) {\n if (proxyKey === \"subscribe\" || proxyKey === SUBJECT_SUBSCRIBE) {\n return (next) => {\n inputsMap[key][SUBJECT_SUBSCRIBE](next)\n }\n } else if (proxyKey === \"value\" || proxyKey === SUBJECT_VALUE) {\n return inputsMap[key][SUBJECT_VALUE]\n }\n }\n })\n }\n })\n}\n\nclass Styles {\n styles = {}\n map = new Map()\n\n constructor(styles) {\n this.styles = styles\n }\n\n getStyle(selector) {\n let style = this.styles[selector]\n if (!style) {\n this.styles[selector] = {}\n style = this.styles[selector]\n }\n return {\n selector,\n style,\n setUpdator: (updator, uid) => {\n if (!this.map.has(selector)) {\n this.map.set(selector, new Map())\n }\n const selectorMap = this.map.get(selector)\n selectorMap.set(uid, updator)\n },\n ...style\n }\n }\n\n getUpdators(selector) {\n return this.map.get(selector)\n }\n}\n\n/**\n * 组件样式\n */\nexport const createStyles = (params) => {\n if (!params.controller[CONTROLLER_CONTEXT].styles) {\n const initStyles = params.controller[CONTROLLER_CONTEXT].initStyles\n const { styles, parentSlot } = params;\n Object.entries(initStyles).forEach(([selector, initStyle]) => {\n if (!styles[selector]) {\n styles[selector] = initStyle\n } else {\n const style = styles[selector]\n Object.entries(initStyle).forEach(([key, value]) => {\n style[key] = value\n })\n }\n })\n if (parentSlot?.itemWrap) {\n const { root, ...other } = styles\n params.controller[CONTROLLER_CONTEXT].styles = new Styles(other)\n } else {\n params.controller[CONTROLLER_CONTEXT].styles = new Styles(styles)\n }\n }\n\n return new Proxy({}, {\n ownKeys() {\n return Object.keys(params.styles)\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n get(_, key) {\n return params.controller[CONTROLLER_CONTEXT].styles.getStyle(key)\n }\n })\n}\n\n/**\n * @returns {any}\n */\nexport const transformApi = (api) => {\n return (value, cb) => {\n const id = `${Math.random()}_${new Date().getTime()}`\n const outputs = {}\n const dispose = () => {\n\n }\n const proxy = new Proxy(dispose, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n let isDispose = false;\n\n context.apiRun = id;\n\n const res = api(value)\n\n context.apiRun = null;\n\n if (res) {\n Object.entries(res).forEach(([key, value]) => {\n if (!outputs[key]) {\n outputs[key] = new Subject()\n }\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n if (isDispose) {\n return\n }\n isDispose = true\n outputs[key][SUBJECT_NEXT](value)\n cb?.[key]?.(value)\n context.apiRunVariablesSubject[id]?.forEach((subject) => {\n subject.destroy()\n })\n })\n } else {\n if (isDispose) {\n return\n }\n isDispose = true\n outputs[key][SUBJECT_NEXT](value)\n cb?.[key]?.(value)\n context.apiRunVariablesSubject[id]?.forEach((subject) => {\n subject.destroy()\n })\n }\n })\n }\n\n return proxy\n }\n}\n\nexport const transformBus = (bus) => {\n return (newBus) => {\n Object.entries(newBus).forEach(([key, newBus]) => {\n bus[key] = (value) => {\n const outputs = {}\n\n const callBack = new Proxy({}, {\n get(_, key) {\n return (value) => {\n const output = outputs[key] || (outputs[key] = new Subject())\n output[SUBJECT_NEXT](value)\n }\n }\n })\n\n if (value?.[SUBJECT_SUBSCRIBE]) {\n value[SUBJECT_SUBSCRIBE]((value) => {\n newBus(value, callBack)\n })\n } else {\n newBus(value, callBack)\n }\n\n return new Proxy({}, {\n get(_, key) {\n return outputs[key] || (outputs[key] = new Subject())\n }\n })\n };\n })\n }\n}\n\nexport const createBus = (bus) => {\n return () => {\n return new Proxy({}, {\n get() {\n return new Subject()\n }\n })\n }\n}\n\nexport const join = (lastSubject, nextSubject) => {\n const subject = new Subject();\n const next = () => {\n if (nextSubject?.[SUBJECT_SUBSCRIBE]) {\n subject[SUBJECT_NEXT](nextSubject[SUBJECT_VALUE]);\n } else {\n subject[SUBJECT_NEXT](nextSubject);\n }\n }\n\n if (lastSubject?.[SUBJECT_SUBSCRIBE]) {\n lastSubject[SUBJECT_SUBSCRIBE](() => {\n next()\n });\n } else {\n next()\n }\n\n return subject;\n};\n\nexport const createModifier = (params, Modifier) => {\n if (!params.controller[CONTROLLER_CONTEXT].modifier) {\n params.controller[CONTROLLER_CONTEXT].modifier = new Modifier(params.controller[CONTROLLER_CONTEXT].initModifier);\n }\n return params.controller[CONTROLLER_CONTEXT].modifier\n}\n\nconst DATA_PROXY = Symbol(\"DATA_PROXY\");\nconst dataProxy = (params) => {\n const { data, path, config } = params;\n return new Proxy(data, {\n get(target, key, receiver) {\n if (key === DATA_PROXY) {\n return true;\n }\n const value = Reflect.get(target, key, receiver);\n if (typeof key !== \"string\" || target.hasOwnProperty(key)) {\n return value\n }\n if (isObject(value)) {\n if (value[DATA_PROXY]) {\n return value;\n }\n\n return dataProxy({\n data: value,\n path: path ? `${path}.${key}` : key,\n config\n });\n }\n return value;\n },\n set(target, key, value, receiver) {\n if (typeof key !== \"string\" || target.hasOwnProperty(key)) {\n Reflect.set(target, key, value, receiver);\n } else {\n if (!value?.[EXCUTE_TYPE_KEY]) {\n Reflect.set(target, key, value, receiver);\n // 目前只有「EXCUTE_TYPE_VALUE.DATACHANGED」,所以判断有「EXCUTE_TYPE_KEY」就行\n config?.set?.({\n value,\n path: path ? `${path}.${key}` : key,\n });\n } else {\n Reflect.set(target, key, value.value, receiver);\n }\n }\n return true;\n },\n });\n}\n\nexport const createData = (params, Data) => {\n if (!params.controller[CONTROLLER_CONTEXT].data) {\n const { initData, dataChangedSubjects, mark } = params.controller[CONTROLLER_CONTEXT]\n const nextData = Object.assign({}, params.data)\n Object.entries(initData).forEach(([path, value]) => {\n safeSetByPath({\n data: nextData,\n path: path.split(\".\"),\n value\n })\n })\n\n const data = new Data(nextData)\n const observeData = dataProxy({\n data,\n path: \"\",\n config: {\n set(params) {\n const dataChangedSubject = dataChangedSubjects[params.path];\n if (dataChangedSubject) {\n dataChangedSubject[SUBJECT_NEXT](params.value, {\n [EXCUTE_TYPE_KEY]: EXCUTE_TYPE_VALUE.DATACHANGED,\n controllerMark: mark,\n })\n }\n }\n }\n })\n\n params.controller[CONTROLLER_CONTEXT].data = observeData\n }\n\n return params.controller[CONTROLLER_CONTEXT].data\n}\n\nexport class Vars {\n [VARS_MARK] = true\n}\n\nexport class BaseController {\n [BASECONTROLLER_MARK] = true\n}\n\nexport * from \"./MyBricksDescriptor\"\n\nexport * from \"./createModuleEventsHandle\"\n\nexport * from \"./createJSHandle\"\n\nexport * from \"./Subject\"\n\nexport * from \"./createEnv\"\n\nexport * from \"./variables\"\n\nexport * from \"./event\"\n\n"
|
|
5239
5239
|
},
|
|
5240
5240
|
{
|
|
5241
5241
|
"path": "src/core/mybricks/log.js",
|
|
@@ -5247,7 +5247,7 @@
|
|
|
5247
5247
|
},
|
|
5248
5248
|
{
|
|
5249
5249
|
"path": "src/core/mybricks/Subject.js",
|
|
5250
|
-
"content": "import { log } from \"./log\"\nimport {\n SUBJECT_NEXT,\n SUBJECT_VALUE,\n SUBJECT_EMPTY,\n SUBJECT_SETVALUE,\n SUBJECT_SUBSCRIBE,\n SUBJECT_UNSUBSCRIBE\n} from \"./constant\"\n\n/** 数据流 */\nexport class Subject {\n _values = []\n _observers = new Set()\n _log = undefined\n _empty = true;\n\n constructor(params = {}) {\n this._log = params.log\n return new Proxy(this, {\n get(target, prop) {\n if (prop in target) {\n return target[prop];\n }\n\n const subjectNext = new SubjectNext(prop)\n\n target[SUBJECT_SUBSCRIBE]((value, extra) => {\n subjectNext[SUBJECT_NEXT](value, extra)\n })\n\n return subjectNext\n }\n })\n }\n\n get [SUBJECT_VALUE]() {\n return this._values[0]\n }\n\n get [SUBJECT_EMPTY]() {\n return this._empty;\n }\n\n [SUBJECT_SETVALUE](value) {\n this._values[0] = value;\n this._empty = false;\n }\n\n [SUBJECT_NEXT](value, extra) {\n log(this._log, JSON.stringify(value))\n this._values[0] = value\n this._empty = false\n this._observers.forEach((observer) => observer(value, extra))\n }\n\n [SUBJECT_SUBSCRIBE](observer) {\n if (this._values.length) {\n observer(this._values[0])\n }\n this._observers.add(observer)\n }\n\n [SUBJECT_UNSUBSCRIBE](observer) {\n this._observers.delete(observer)\n }\n}\n\nfunction getValueNextByPath(params) {\n const { value, path } = params\n let current = value\n for (const key of path) {\n if (current === null || current === undefined) {\n return undefined\n }\n current = current[key]\n }\n return current\n}\n\nclass SubjectNext extends Subject {\n _path = []\n\n constructor(path) {\n super()\n\n this._path.push(path)\n\n return new Proxy(this, {\n get(target, prop) {\n if (prop in target) {\n return target[prop];\n }\n\n target._path.push(prop)\n\n return target;\n }\n })\n }\n\n [SUBJECT_NEXT](value, extra) {\n this._values[0] = value\n this._empty = false\n const nextValue = getValueNextByPath({ value, path: this._path })\n this._observers.forEach((observer) => observer(nextValue, extra))\n }\n\n [SUBJECT_SUBSCRIBE](observer) {\n if (this._values.length) {\n observer(getValueNextByPath({ value: this._values[0], path: this._path }))\n }\n this._observers.add(observer)\n }\n}\n
|
|
5250
|
+
"content": "import { log } from \"./log\"\nimport {\n SUBJECT_NEXT,\n SUBJECT_VALUE,\n SUBJECT_EMPTY,\n SUBJECT_SETVALUE,\n SUBJECT_SUBSCRIBE,\n SUBJECT_UNSUBSCRIBE\n} from \"./constant\"\n\n/** 数据流 */\nexport class Subject {\n _values = []\n _observers = new Set()\n _log = undefined\n _empty = true;\n\n constructor(params = {}) {\n this._log = params.log\n return new Proxy(this, {\n get(target, prop) {\n if (prop in target) {\n return target[prop];\n }\n\n const subjectNext = new SubjectNext(prop)\n\n target[SUBJECT_SUBSCRIBE]((value, extra) => {\n subjectNext[SUBJECT_NEXT](value, extra)\n })\n\n return subjectNext\n }\n })\n }\n\n get [SUBJECT_VALUE]() {\n return this._values[0]\n }\n\n get [SUBJECT_EMPTY]() {\n return this._empty;\n }\n\n [SUBJECT_SETVALUE](value) {\n this._values[0] = value;\n this._empty = false;\n }\n\n [SUBJECT_NEXT](value, extra) {\n log(this._log, JSON.stringify(value))\n this._values[0] = value\n this._empty = false\n this._observers.forEach((observer) => observer(value, extra))\n }\n\n [SUBJECT_SUBSCRIBE](observer) {\n if (this._values.length) {\n observer(this._values[0])\n }\n this._observers.add(observer)\n }\n\n [SUBJECT_UNSUBSCRIBE](observer) {\n this._observers.delete(observer)\n }\n}\n\nfunction getValueNextByPath(params) {\n const { value, path } = params\n let current = value\n for (const key of path) {\n if (current === null || current === undefined) {\n return undefined\n }\n current = current[key]\n }\n return current\n}\n\nclass SubjectNext extends Subject {\n _path = []\n\n constructor(path) {\n super()\n\n this._path.push(path)\n\n return new Proxy(this, {\n get(target, prop) {\n if (prop in target) {\n return target[prop];\n }\n\n target._path.push(prop)\n\n return target;\n }\n })\n }\n\n [SUBJECT_NEXT](value, extra) {\n this._values[0] = value\n this._empty = false\n const nextValue = getValueNextByPath({ value, path: this._path })\n this._observers.forEach((observer) => observer(nextValue, extra))\n }\n\n [SUBJECT_SUBSCRIBE](observer) {\n if (this._values.length) {\n observer(getValueNextByPath({ value: this._values[0], path: this._path }))\n }\n this._observers.add(observer)\n }\n}\n"
|
|
5251
5251
|
},
|
|
5252
5252
|
{
|
|
5253
5253
|
"path": "src/core/mybricks/utils.js",
|
|
@@ -5265,15 +5265,23 @@
|
|
|
5265
5265
|
"children": [
|
|
5266
5266
|
{
|
|
5267
5267
|
"path": "src/core/utils/ComContext.tsx",
|
|
5268
|
-
"content": "import { createContext, useContext } from 'react'\nimport type { ComContextStore } from './useContext'\n\nconst ComContext = createContext<ComContextStore | undefined>(undefined)\n\nexport function useAppContext(): ComContextStore {\n const context = useContext(ComContext)\n if (!context) {\n throw new Error('useAppContext must be used within a ComContext.Provider')\n }\n return context\n}\n\nexport default ComContext\n"
|
|
5268
|
+
"content": "import { createContext, useContext } from 'react'\nimport type { ComContextStore } from './useContext'\nexport { page } from './page'\n\nconst ComContext = createContext<ComContextStore | undefined>(undefined)\n\nexport function useAppContext(): ComContextStore {\n const context = useContext(ComContext)\n if (!context) {\n throw new Error('useAppContext must be used within a ComContext.Provider')\n }\n return context\n}\n\nexport default ComContext\n"
|
|
5269
|
+
},
|
|
5270
|
+
{
|
|
5271
|
+
"path": "src/core/utils/hooks.ts",
|
|
5272
|
+
"content": "import { useState, useRef, useMemo } from 'react';\nimport { SUBJECT_SUBSCRIBE } from '../mybricks/constant';\n\n/**\n * 深度代理,支持自动路径初始化和响应式更新(鸿蒙化处理方案)\n */\nexport function deepProxy(target: any, onSet?: () => void): any {\n if (target === null || typeof target !== 'object' || target.__isProxy) {\n return target;\n }\n\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n \n let value = obj[prop];\n \n // 只有在访问不存在的对象属性时,才自动创建(实现类似 ensure 的效果)\n // 特意排除 MyBricks 内置的方法名,以便在生成代码中进行初始化判断\n const mybricksMethods = ['get', 'set', 'changed', 'reset', 'registerChange', 'call', 'apply', 'bind', 'push', 'pop'];\n if (value === undefined && typeof prop === 'string' && !mybricksMethods.includes(prop)) {\n value = obj[prop] = {};\n }\n \n if (typeof value === 'object' && value !== null && !value.__isProxy) {\n obj[prop] = deepProxy(value, onSet);\n }\n \n return obj[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n if (onSet) onSet();\n return result;\n }\n });\n}\n\nexport function useModel(rawData: any) {\n const [, forceUpdate] = useState({});\n const dataRef = useRef(rawData || {});\n \n return useMemo(() => {\n return deepProxy(dataRef.current, () => forceUpdate({}));\n }, []);\n}\n\nexport function useBindInputs(scope: any, id: string) {\n const handlersRef = useRef<Record<string, any>>({});\n\n return useMemo(() => {\n const proxy = new Proxy({}, {\n get: (_target, pin: string) => {\n return (arg: any) => {\n if (typeof arg === 'function') {\n // 组件注册回调\n handlersRef.current[pin] = arg;\n } else {\n // 逻辑流触发输入\n const handler = handlersRef.current[pin];\n if (typeof handler === 'function') {\n if (arg && arg[SUBJECT_SUBSCRIBE]) {\n // 如果传入的是 Subject,自动订阅并触发回调\n arg[SUBJECT_SUBSCRIBE]((val: any) => {\n handler(val);\n });\n } else {\n handler(arg);\n }\n }\n }\n };\n }\n });\n\n // 将代理对象挂载到作用域,供外部 comRefs.current.id.pin() 调用\n scope[id] = proxy;\n return proxy;\n }, [scope, id]);\n}\n\nexport function useBindEvents(props: any) {\n return useMemo(() => {\n const _events: Record<string, any> = {};\n \n // 预处理已存在的事件\n Object.keys(props).forEach(key => {\n if (key.startsWith('on') && typeof props[key] === 'function') {\n const handler = props[key];\n const wrapped = (...args: any[]) => handler(...args);\n wrapped.getConnections = () => [{ id: 'default' }];\n _events[key] = wrapped;\n }\n });\n\n return new Proxy(_events, {\n get(target, key: string) {\n if (typeof key === 'string' && key.startsWith('on')) {\n if (target[key]) {\n return target[key];\n }\n // 对未连接的事件返回兜底函数\n const emptyFn = () => {};\n emptyFn.getConnections = () => [];\n return emptyFn;\n }\n return target[key];\n }\n });\n }, [props]);\n}\n"
|
|
5269
5273
|
},
|
|
5270
5274
|
{
|
|
5271
5275
|
"path": "src/core/utils/index.ts",
|
|
5272
|
-
"content": "
|
|
5276
|
+
"content": "export * from './hooks';\nexport { WithCom, WithWrapper } from './with';\nexport { page } from './page';\nexport { useAppContext } from './ComContext';\nexport { createVariable, createFx, merge } from '../mybricks';\nexport { SUBJECT_SUBSCRIBE, SUBJECT_VALUE } from '../mybricks/constant';\n"
|
|
5277
|
+
},
|
|
5278
|
+
{
|
|
5279
|
+
"path": "src/core/utils/page.ts",
|
|
5280
|
+
"content": "import Taro from '@tarojs/taro';\nimport { Page } from '../mybricks';\n\n/**\n * Taro 路由实现\n */\nclass TaroRouter {\n getParams(name: string) {\n const instance = Taro.getCurrentInstance();\n return {\n value: instance.router?.params\n };\n }\n\n push(name: string, { value }: any) {\n const url = `/pages/${name}/index`;\n const queryString = value ? `?data=${encodeURIComponent(JSON.stringify(value))}` : '';\n \n Taro.navigateTo({\n url: url + queryString\n });\n }\n\n replace(name: string, { value }: any) {\n const url = `/pages/${name}/index`;\n const queryString = value ? `?data=${encodeURIComponent(JSON.stringify(value))}` : '';\n \n Taro.redirectTo({\n url: url + queryString\n });\n }\n\n pop() {\n Taro.navigateBack();\n }\n}\n\nexport const page = new Page(new TaroRouter());\n\n"
|
|
5273
5281
|
},
|
|
5274
5282
|
{
|
|
5275
5283
|
"path": "src/core/utils/useContext.ts",
|
|
5276
|
-
"content": "import { useRef,
|
|
5284
|
+
"content": "import { useRef, createContext, useContext } from 'react'\nimport { deepProxy } from './hooks'\n\nexport interface ComContextStore {\n comRefs: any;\n appContext: any; \n}\n\nexport function useAppCreateContext(): ComContextStore {\n const comRefs = useRef<any>(deepProxy({}));\n\n const appContext: any = {\n canvas: {\n id: \"u_7VvVn\", // 使用 data 中的 id\n },\n runtime: {\n debug: false,\n },\n edit: false,\n isH5: false,\n isDesigner: false,\n isPreview: false,\n isRelease: false,\n isDebug: false,\n isLocal: false,\n isTest: false,\n };\n return {\n comRefs,\n appContext,\n }\n}\n"
|
|
5277
5285
|
},
|
|
5278
5286
|
{
|
|
5279
5287
|
"path": "src/core/utils/with.tsx",
|
package/dist/cjs/toCodeTaro.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taro 代码生成入口文件
|
|
3
|
+
* 参考鸿蒙实现,采用低耦合、高内聚的设计
|
|
4
|
+
*/
|
|
1
5
|
import toCode from "@mybricks/to-code-react/dist/cjs/toCode";
|
|
2
6
|
import type { ToJSON } from "@mybricks/to-code-react/dist/cjs/toCode/types";
|
|
3
|
-
import { ImportManager } from "./utils";
|
|
7
|
+
import { ImportManager } from "./utils/common/ImportManager";
|
|
4
8
|
export interface ToTaroCodeConfig {
|
|
5
9
|
getComponentMeta: (com: Extract<UI["children"][0], {
|
|
6
10
|
type: "com";
|
|
@@ -52,8 +56,8 @@ export interface ToTaroCodeConfig {
|
|
|
52
56
|
indent: number;
|
|
53
57
|
};
|
|
54
58
|
}
|
|
55
|
-
/**
|
|
56
|
-
export
|
|
59
|
+
/** 单个生成文件的信息 */
|
|
60
|
+
export interface GeneratedFile {
|
|
57
61
|
content: string;
|
|
58
62
|
cssContent?: string;
|
|
59
63
|
pageConfigContent?: string;
|
|
@@ -62,8 +66,18 @@ export type Result = Array<{
|
|
|
62
66
|
meta?: ReturnType<typeof toCode>["scenes"][0]["scene"];
|
|
63
67
|
name: string;
|
|
64
68
|
tabBarConfig?: string;
|
|
65
|
-
}
|
|
66
|
-
|
|
69
|
+
}
|
|
70
|
+
/** 统一的生成结果结构 */
|
|
71
|
+
export interface GenerationResult {
|
|
72
|
+
files: GeneratedFile[];
|
|
73
|
+
assets?: {
|
|
74
|
+
tabBarImages?: any[];
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Taro 代码生成主函数
|
|
79
|
+
*/
|
|
80
|
+
declare const toCodeTaro: (tojson: ToJSON, config: ToTaroCodeConfig) => GenerationResult;
|
|
67
81
|
type ToCodeResult = ReturnType<typeof toCode>;
|
|
68
82
|
export type UI = ToCodeResult["scenes"][0]["ui"];
|
|
69
83
|
interface Provider {
|
|
@@ -112,6 +126,13 @@ export interface BaseConfig extends ToTaroCodeConfig {
|
|
|
112
126
|
getProviderMap: () => Record<string, ReturnType<BaseConfig["getCurrentProvider"]>>;
|
|
113
127
|
getExtensionEventById: (id: string) => ReturnType<typeof toCode>["scenes"][0]["event"][0];
|
|
114
128
|
getSceneById: (id: string) => ReturnType<typeof toCode>["scenes"][0]["scene"];
|
|
129
|
+
/** 根据 pinId 获取场景/区块的输入项事件 */
|
|
130
|
+
getFrameInputEvent: (pinId: string, frameId?: string) => ReturnType<typeof toCode>["scenes"][0]["event"][0];
|
|
131
|
+
/** 根据 frameId 获取 frame 信息(参考鸿蒙实现) */
|
|
132
|
+
getFrameById?: (id: string) => {
|
|
133
|
+
frame: any;
|
|
134
|
+
meta: any;
|
|
135
|
+
} | undefined;
|
|
115
136
|
/** 层级,用于格式化代码 */
|
|
116
137
|
depth: number;
|
|
117
138
|
getTypeDef: () => {
|