@gant-lowcode/plugin-code-generator 1.0.10 → 2.0.0
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/LICENSE +21 -0
- package/{dist → es}/components/code-gen-action/index.d.ts +2 -1
- package/es/components/code-gen-action/index.js +330 -0
- package/es/components/code-gen-action/index.less +20 -0
- package/es/components/code-gen-preview/fixPreviewCode.js +100 -0
- package/{dist → es}/components/code-gen-preview/index.d.ts +3 -2
- package/es/components/code-gen-preview/index.js +5 -0
- package/es/components/code-gen-preview/index.less +16 -0
- package/{dist → es}/components/code-gen-result/index.d.ts +2 -2
- package/es/components/code-gen-result/index.js +207 -0
- package/es/components/code-gen-result/index.less +20 -0
- package/{dist → es}/components/codesandbox-preview/index.d.ts +2 -1
- package/es/components/codesandbox-preview/index.js +192 -0
- package/es/components/codesandbox-preview/index.less +18 -0
- package/{dist → es}/components/file-tree/index.d.ts +3 -2
- package/es/components/file-tree/index.js +162 -0
- package/es/components/file-tree/index.less +54 -0
- package/{dist → es}/components/file-type-icon/index.d.ts +2 -2
- package/es/components/file-type-icon/index.js +12 -0
- package/es/components/file-type-icon/index.less +77 -0
- package/{dist → es}/components/sources-view/index.d.ts +2 -1
- package/es/components/sources-view/index.js +128 -0
- package/es/components/sources-view/index.less +12 -0
- package/{dist → es}/index.d.ts +3 -4
- package/es/index.js +67 -0
- package/es/style.js +9 -0
- package/{dist → es}/types/index.d.ts +3 -3
- package/es/types/index.js +1 -0
- package/lib/components/code-gen-action/index.d.ts +7 -0
- package/lib/components/code-gen-action/index.js +336 -0
- package/lib/components/code-gen-action/index.less +20 -0
- package/lib/components/code-gen-preview/fixPreviewCode.d.ts +2 -0
- package/lib/components/code-gen-preview/fixPreviewCode.js +105 -0
- package/lib/components/code-gen-preview/index.d.ts +9 -0
- package/lib/components/code-gen-preview/index.js +9 -0
- package/lib/components/code-gen-preview/index.less +16 -0
- package/lib/components/code-gen-result/index.d.ts +14 -0
- package/lib/components/code-gen-result/index.js +215 -0
- package/lib/components/code-gen-result/index.less +20 -0
- package/lib/components/codesandbox-preview/index.d.ts +4 -0
- package/lib/components/codesandbox-preview/index.js +199 -0
- package/lib/components/codesandbox-preview/index.less +18 -0
- package/lib/components/file-tree/index.d.ts +21 -0
- package/lib/components/file-tree/index.js +170 -0
- package/lib/components/file-tree/index.less +54 -0
- package/lib/components/file-type-icon/index.d.ts +6 -0
- package/lib/components/file-type-icon/index.js +17 -0
- package/lib/components/file-type-icon/index.less +77 -0
- package/lib/components/sources-view/index.d.ts +8 -0
- package/lib/components/sources-view/index.js +135 -0
- package/lib/components/sources-view/index.less +12 -0
- package/lib/index.d.ts +27 -0
- package/lib/index.js +74 -0
- package/lib/style.js +9 -0
- package/lib/types/index.d.ts +17 -0
- package/lib/types/index.js +3 -0
- package/package.json +27 -19
- package/dist/components/code-gen-action/index.css +0 -18
- package/dist/components/code-gen-action/index.js +0 -203
- package/dist/components/code-gen-preview/fixPreviewCode.js +0 -119
- package/dist/components/code-gen-preview/index.css +0 -18
- package/dist/components/code-gen-preview/index.js +0 -9
- package/dist/components/code-gen-result/index.css +0 -18
- package/dist/components/code-gen-result/index.js +0 -147
- package/dist/components/codesandbox-preview/index.css +0 -17
- package/dist/components/codesandbox-preview/index.js +0 -147
- package/dist/components/file-tree/index.css +0 -55
- package/dist/components/file-tree/index.js +0 -138
- package/dist/components/file-type-icon/index.css +0 -73
- package/dist/components/file-type-icon/index.js +0 -10
- package/dist/components/sources-view/index.css +0 -11
- package/dist/components/sources-view/index.js +0 -128
- package/dist/index.js +0 -50
- package/dist/types/index.js +0 -1
- /package/{dist → es}/components/code-gen-preview/fixPreviewCode.d.ts +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.CodeGenResult = void 0;
|
|
6
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
7
|
+
var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
8
|
+
var _empty = _interopRequireDefault(require("antd/lib/empty"));
|
|
9
|
+
var _message2 = _interopRequireDefault(require("antd/lib/message"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _fileSaver = _interopRequireDefault(require("file-saver"));
|
|
13
|
+
var _jszip = _interopRequireDefault(require("jszip"));
|
|
14
|
+
var _index = require("../sources-view/index");
|
|
15
|
+
require("./index.less");
|
|
16
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
17
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
18
|
+
// import { CodeGenPreview } from "../code-gen-preview/index";
|
|
19
|
+
|
|
20
|
+
var CodeGenResult = exports.CodeGenResult = /*#__PURE__*/(0, _react.forwardRef)(function CodeGenResult(_ref, ref) {
|
|
21
|
+
var result = _ref.result,
|
|
22
|
+
schema = _ref.schema;
|
|
23
|
+
var _useState = (0, _react.useState)({
|
|
24
|
+
expandedKeys: ["sources", "preview"]
|
|
25
|
+
}),
|
|
26
|
+
paneState = _useState[0],
|
|
27
|
+
setPaneState = _useState[1];
|
|
28
|
+
var _useState2 = (0, _react.useState)(null),
|
|
29
|
+
gravityCode = _useState2[0],
|
|
30
|
+
setGravityCode = _useState2[1];
|
|
31
|
+
var _useState3 = (0, _react.useState)(0),
|
|
32
|
+
refresh = _useState3[0],
|
|
33
|
+
setRefresh = _useState3[1];
|
|
34
|
+
(0, _react.useEffect)(function () {
|
|
35
|
+
console.log("--result, schema", result, schema);
|
|
36
|
+
setGravityCode(convertCodeGenResult(result, schema));
|
|
37
|
+
}, [result]);
|
|
38
|
+
var codeZip = /*#__PURE__*/function () {
|
|
39
|
+
var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
40
|
+
var zip;
|
|
41
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
42
|
+
while (1) switch (_context.prev = _context.next) {
|
|
43
|
+
case 0:
|
|
44
|
+
zip = new _jszip["default"]();
|
|
45
|
+
Object.values((gravityCode === null || gravityCode === void 0 ? void 0 : gravityCode.modules) || {}).forEach(function (file) {
|
|
46
|
+
zip.file(file.fpath.replace(/^\/+/, ""), file.code);
|
|
47
|
+
});
|
|
48
|
+
_context.next = 4;
|
|
49
|
+
return zip.generateAsync({
|
|
50
|
+
type: "blob"
|
|
51
|
+
});
|
|
52
|
+
case 4:
|
|
53
|
+
return _context.abrupt("return", _context.sent);
|
|
54
|
+
case 5:
|
|
55
|
+
case "end":
|
|
56
|
+
return _context.stop();
|
|
57
|
+
}
|
|
58
|
+
}, _callee);
|
|
59
|
+
}));
|
|
60
|
+
return function codeZip() {
|
|
61
|
+
return _ref2.apply(this, arguments);
|
|
62
|
+
};
|
|
63
|
+
}();
|
|
64
|
+
(0, _react.useImperativeHandle)(ref, function () {
|
|
65
|
+
return {
|
|
66
|
+
codeZip: codeZip
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
if (!result) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
var handleDownloadSources = /*#__PURE__*/function () {
|
|
73
|
+
var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(e) {
|
|
74
|
+
var content;
|
|
75
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
76
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
77
|
+
case 0:
|
|
78
|
+
_context2.prev = 0;
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
e.stopPropagation();
|
|
81
|
+
_context2.next = 5;
|
|
82
|
+
return codeZip();
|
|
83
|
+
case 5:
|
|
84
|
+
content = _context2.sent;
|
|
85
|
+
_fileSaver["default"].saveAs(content, "gant-lowcode-generated-sources.zip");
|
|
86
|
+
_context2.next = 13;
|
|
87
|
+
break;
|
|
88
|
+
case 9:
|
|
89
|
+
_context2.prev = 9;
|
|
90
|
+
_context2.t0 = _context2["catch"](0);
|
|
91
|
+
console.log("failed to download sources: ", _context2.t0);
|
|
92
|
+
_message2["default"].error("下载失败!");
|
|
93
|
+
case 13:
|
|
94
|
+
case "end":
|
|
95
|
+
return _context2.stop();
|
|
96
|
+
}
|
|
97
|
+
}, _callee2, null, [[0, 9]]);
|
|
98
|
+
}));
|
|
99
|
+
return function handleDownloadSources(_x) {
|
|
100
|
+
return _ref3.apply(this, arguments);
|
|
101
|
+
};
|
|
102
|
+
}();
|
|
103
|
+
console.log("--gravityCode", gravityCode);
|
|
104
|
+
|
|
105
|
+
// const items: TabsProps["items"] = [
|
|
106
|
+
// {
|
|
107
|
+
// key: "sources",
|
|
108
|
+
// label: (
|
|
109
|
+
// <span>
|
|
110
|
+
// 出码生成的源代码{" "}
|
|
111
|
+
// <a href="javascript:void(0)" onClick={handleDownloadSources}>
|
|
112
|
+
// 导出/下载 zip 包
|
|
113
|
+
// </a>
|
|
114
|
+
// </span>
|
|
115
|
+
// ),
|
|
116
|
+
// children: gravityCode != null && (
|
|
117
|
+
// <SourcesView code={gravityCode} onCodeChange={setGravityCode} />
|
|
118
|
+
// ),
|
|
119
|
+
// },
|
|
120
|
+
// {
|
|
121
|
+
// key: "preview",
|
|
122
|
+
// label: (
|
|
123
|
+
// <span>
|
|
124
|
+
// 在线预览{" "}
|
|
125
|
+
// <a
|
|
126
|
+
// href="#refresh"
|
|
127
|
+
// onClick={(e) => {
|
|
128
|
+
// e.preventDefault();
|
|
129
|
+
// e.stopPropagation();
|
|
130
|
+
// setRefresh(Date.now());
|
|
131
|
+
// }}
|
|
132
|
+
// >
|
|
133
|
+
// 刷新
|
|
134
|
+
// </a>
|
|
135
|
+
// </span>
|
|
136
|
+
// ),
|
|
137
|
+
// children: (
|
|
138
|
+
// <div
|
|
139
|
+
// className="code-gen-result-gravity-demo"
|
|
140
|
+
// style={{ height: "100%" }}
|
|
141
|
+
// >
|
|
142
|
+
// <CodeGenPreview
|
|
143
|
+
// code={gravityCode}
|
|
144
|
+
// height={"100%"}
|
|
145
|
+
// refresh={refresh}
|
|
146
|
+
// />
|
|
147
|
+
// </div>
|
|
148
|
+
// ),
|
|
149
|
+
// },
|
|
150
|
+
// ];
|
|
151
|
+
|
|
152
|
+
// return <Tabs className="code-gen-tabs" items={items} />;
|
|
153
|
+
|
|
154
|
+
if (!gravityCode) return /*#__PURE__*/_react["default"].createElement(_empty["default"], null);
|
|
155
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
156
|
+
className: "code-gen-source-view"
|
|
157
|
+
}, /*#__PURE__*/_react["default"].createElement(_index.SourcesView, {
|
|
158
|
+
code: gravityCode,
|
|
159
|
+
onCodeChange: setGravityCode
|
|
160
|
+
}));
|
|
161
|
+
});
|
|
162
|
+
function convertCodeGenResult(result, schema) {
|
|
163
|
+
var schemaFiles = {
|
|
164
|
+
"/.project-schema.json": {
|
|
165
|
+
fpath: "/.project-schema.json",
|
|
166
|
+
code: JSON.stringify(schema, null, 2) + "\n"
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
if (!result || !Array.isArray(result) || !result.length) {
|
|
170
|
+
return {
|
|
171
|
+
type: "demo",
|
|
172
|
+
modules: schemaFiles
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
var code = {
|
|
176
|
+
type: "demo",
|
|
177
|
+
modules: result.reduce(function (acc, file) {
|
|
178
|
+
var _extends2;
|
|
179
|
+
return (0, _extends3["default"])({}, acc, (_extends2 = {}, _extends2["/" + file.pathName] = {
|
|
180
|
+
fpath: "/" + file.pathName,
|
|
181
|
+
code: file.content,
|
|
182
|
+
entry: undefined,
|
|
183
|
+
packagejson: ["package.json"].includes(file.pathName) ? 1 : undefined
|
|
184
|
+
}, _extends2));
|
|
185
|
+
}, {})
|
|
186
|
+
};
|
|
187
|
+
var foundEntry = false;
|
|
188
|
+
|
|
189
|
+
// 设置入口文件
|
|
190
|
+
["index.js", "index.ts", "index.tsx", "app.js", "app.ts", "app.tsx"].forEach(function (fileName) {
|
|
191
|
+
if (!foundEntry) {
|
|
192
|
+
var filePath = "/src/" + fileName;
|
|
193
|
+
if (code.modules[filePath]) {
|
|
194
|
+
foundEntry = true;
|
|
195
|
+
if (fileName === "index.js") {
|
|
196
|
+
code.modules[filePath].entry = 1;
|
|
197
|
+
} else {
|
|
198
|
+
code.modules["/src/index.js"] = {
|
|
199
|
+
fpath: "/src/index.js",
|
|
200
|
+
entry: 1,
|
|
201
|
+
code: "import \"./" + fileName.replace(/\.\w+$/, "") + "\""
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
if (!foundEntry) {
|
|
208
|
+
console.warn("Failed to find entry file for demo.");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 补充 schema 文件
|
|
212
|
+
// Object.assign(code.modules, schemaFiles);
|
|
213
|
+
|
|
214
|
+
return code;
|
|
215
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
.code-gen-tabs {
|
|
2
|
+
height: 100%;
|
|
3
|
+
|
|
4
|
+
.ant-tabs-nav {
|
|
5
|
+
margin: 0;
|
|
6
|
+
}
|
|
7
|
+
.ant-tabs-content, .ant-tabs-tabpane {
|
|
8
|
+
height: 100%;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.code-gen-source-view {
|
|
13
|
+
height: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.source-view-header {
|
|
17
|
+
position: absolute;
|
|
18
|
+
top: 18px;
|
|
19
|
+
right: 20px;
|
|
20
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.CodeSandboxPreview = CodeSandboxPreview;
|
|
6
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
7
|
+
var _spin = _interopRequireDefault(require("antd/lib/spin"));
|
|
8
|
+
var _alert = _interopRequireDefault(require("antd/lib/alert"));
|
|
9
|
+
var _button = _interopRequireDefault(require("antd/lib/button"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
var _fixPreviewCode = require("../code-gen-preview/fixPreviewCode");
|
|
14
|
+
require("./index.less");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
17
|
+
// 使用 CodeSandbox 来进行预览
|
|
18
|
+
// @see https://codesandbox.io/docs/api#get-request
|
|
19
|
+
function CodeSandboxPreview(_ref) {
|
|
20
|
+
var code = _ref.code,
|
|
21
|
+
height = _ref.height;
|
|
22
|
+
var parameters = (0, _react.useMemo)(function () {
|
|
23
|
+
var files = {};
|
|
24
|
+
if (code && code.modules) {
|
|
25
|
+
var fixedCode = (0, _fixPreviewCode.fixPreviewCode)(code);
|
|
26
|
+
if (fixedCode) {
|
|
27
|
+
Object.values(fixedCode.modules).forEach(function (file) {
|
|
28
|
+
var _file$fpath;
|
|
29
|
+
files[file === null || file === void 0 ? void 0 : (_file$fpath = file.fpath) === null || _file$fpath === void 0 ? void 0 : _file$fpath.slice(1)] = {
|
|
30
|
+
isBinary: false,
|
|
31
|
+
content: file.code
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 入口文件需要顺便引入下样式
|
|
37
|
+
files["src/index.js"] = {
|
|
38
|
+
isBinary: false,
|
|
39
|
+
content: "\n // \u76EE\u524D\u9700\u8981\u5355\u72EC\u5F15\u5165\u4E0B\u6837\u5F0F\u6587\u4EF6\n import \"@alifd/next/dist/next.css\";\n import \"@alifd/pro-layout/dist/AlifdProLayout.css\";\n\n // \u5F15\u5165\u5165\u53E3\u6587\u4EF6\n import './app';\n"
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
files: files,
|
|
44
|
+
template: "create-react-app"
|
|
45
|
+
};
|
|
46
|
+
}, [code]);
|
|
47
|
+
var _useState = (0, _react.useState)({
|
|
48
|
+
parameters: parameters,
|
|
49
|
+
sandboxId: "",
|
|
50
|
+
isCreating: false,
|
|
51
|
+
hasError: false,
|
|
52
|
+
error: null
|
|
53
|
+
}),
|
|
54
|
+
state = _useState[0],
|
|
55
|
+
setState = _useState[1];
|
|
56
|
+
(0, _react.useEffect)(function () {
|
|
57
|
+
if (state.parameters !== parameters || state.sandboxId === "retry" || !state.sandboxId) {
|
|
58
|
+
var hasCanceled = false;
|
|
59
|
+
setState(function (prev) {
|
|
60
|
+
return (0, _extends2["default"])({}, prev, {
|
|
61
|
+
hasError: false,
|
|
62
|
+
code: code,
|
|
63
|
+
parameters: parameters,
|
|
64
|
+
isCreating: true
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
68
|
+
var sandboxId;
|
|
69
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
70
|
+
while (1) switch (_context.prev = _context.next) {
|
|
71
|
+
case 0:
|
|
72
|
+
_context.prev = 0;
|
|
73
|
+
_context.next = 3;
|
|
74
|
+
return createCodeSandbox(parameters);
|
|
75
|
+
case 3:
|
|
76
|
+
sandboxId = _context.sent;
|
|
77
|
+
if (!hasCanceled) {
|
|
78
|
+
setState(function (prev) {
|
|
79
|
+
return (0, _extends2["default"])({}, prev, {
|
|
80
|
+
hasError: false,
|
|
81
|
+
isCreating: false,
|
|
82
|
+
sandboxId: sandboxId
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
_context.next = 10;
|
|
87
|
+
break;
|
|
88
|
+
case 7:
|
|
89
|
+
_context.prev = 7;
|
|
90
|
+
_context.t0 = _context["catch"](0);
|
|
91
|
+
if (!hasCanceled) {
|
|
92
|
+
setState(function (prev) {
|
|
93
|
+
return (0, _extends2["default"])({}, prev, {
|
|
94
|
+
hasError: true,
|
|
95
|
+
error: _context.t0,
|
|
96
|
+
isCreating: false
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
case 10:
|
|
101
|
+
case "end":
|
|
102
|
+
return _context.stop();
|
|
103
|
+
}
|
|
104
|
+
}, _callee, null, [[0, 7]]);
|
|
105
|
+
}))();
|
|
106
|
+
return function () {
|
|
107
|
+
hasCanceled = true;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return function () {};
|
|
111
|
+
}, [parameters, state.sandboxId, state.parameters]);
|
|
112
|
+
var handleRetry = function handleRetry() {
|
|
113
|
+
setState(function (prev) {
|
|
114
|
+
return (0, _extends2["default"])({}, prev, {
|
|
115
|
+
hasError: false,
|
|
116
|
+
sandboxId: "retry"
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
121
|
+
className: "code-gen-plugin-code-sandbox-preview",
|
|
122
|
+
style: {
|
|
123
|
+
height: height
|
|
124
|
+
},
|
|
125
|
+
"data-code-sandbox-id": state.sandboxId
|
|
126
|
+
}, function () {
|
|
127
|
+
if (state.hasError) {
|
|
128
|
+
return /*#__PURE__*/_react["default"].createElement(_alert["default"], {
|
|
129
|
+
message: "\u751F\u6210 CodeSandbox \u9884\u89C8\u5E94\u7528\u5931\u8D25",
|
|
130
|
+
description: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("p", null, "\u8BE6\u7EC6\u9519\u8BEF\uFF1A", "" + (state.error || "网络开小差了")), /*#__PURE__*/_react["default"].createElement("p", null, /*#__PURE__*/_react["default"].createElement(_button["default"], {
|
|
131
|
+
onClick: handleRetry
|
|
132
|
+
}, "\u91CD\u65B0\u5C1D\u8BD5\u4E0B")))
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return state.sandboxId ? /*#__PURE__*/_react["default"].createElement("iframe", {
|
|
136
|
+
src: "https://codesandbox.io/embed/" + state.sandboxId + "?autoresize=1&fontsize=14&hidenavigation=1&theme=dark&view=preview",
|
|
137
|
+
title: "CodeSandbox Preview",
|
|
138
|
+
allow: "accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking",
|
|
139
|
+
sandbox: "allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
140
|
+
}) : /*#__PURE__*/_react["default"].createElement(_spin["default"], {
|
|
141
|
+
spinning: true,
|
|
142
|
+
tip: "\u6B63\u5728\u751F\u6210 CodeSandbox \u9884\u89C8\u5E94\u7528..."
|
|
143
|
+
});
|
|
144
|
+
}());
|
|
145
|
+
}
|
|
146
|
+
function createCodeSandbox(_x) {
|
|
147
|
+
return _createCodeSandbox.apply(this, arguments);
|
|
148
|
+
}
|
|
149
|
+
function _createCodeSandbox() {
|
|
150
|
+
_createCodeSandbox = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(parameters) {
|
|
151
|
+
var res, json, _ref3, sandbox_id;
|
|
152
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
153
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
154
|
+
case 0:
|
|
155
|
+
if (Object.entries((parameters === null || parameters === void 0 ? void 0 : parameters.files) || {}).length) {
|
|
156
|
+
_context2.next = 2;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
return _context2.abrupt("return", "");
|
|
160
|
+
case 2:
|
|
161
|
+
_context2.next = 4;
|
|
162
|
+
return fetch("https://codesandbox.io/api/v1/sandboxes/define?json=1", {
|
|
163
|
+
method: "POST",
|
|
164
|
+
headers: {
|
|
165
|
+
"Content-Type": "application/json",
|
|
166
|
+
Accept: "application/json"
|
|
167
|
+
},
|
|
168
|
+
body: JSON.stringify(parameters)
|
|
169
|
+
});
|
|
170
|
+
case 4:
|
|
171
|
+
res = _context2.sent;
|
|
172
|
+
if (res.ok) {
|
|
173
|
+
_context2.next = 7;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
throw new Error("\u521B\u5EFA CodeSandbox \u5931\u8D25\uFF0C\u9519\u8BEF\u7801\uFF1A" + res.status + " " + res.statusText);
|
|
177
|
+
case 7:
|
|
178
|
+
_context2.next = 9;
|
|
179
|
+
return res.json()["catch"](function (err) {
|
|
180
|
+
throw new Error("\u521B\u5EFA CodeSandbox \u5931\u8D25\uFF0C\u670D\u52A1\u5F02\u5E38(" + ((err === null || err === void 0 ? void 0 : err.message) || err || "未知异常") + ")");
|
|
181
|
+
});
|
|
182
|
+
case 9:
|
|
183
|
+
json = _context2.sent;
|
|
184
|
+
_ref3 = json || {}, sandbox_id = _ref3.sandbox_id;
|
|
185
|
+
if (!(!sandbox_id || typeof sandbox_id !== "string")) {
|
|
186
|
+
_context2.next = 13;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
throw new Error("\u521B\u5EFA CodeSandbox \u5931\u8D25\uFF0C\u670D\u52A1\u54CD\u5E94\u5F02\u5E38");
|
|
190
|
+
case 13:
|
|
191
|
+
return _context2.abrupt("return", sandbox_id);
|
|
192
|
+
case 14:
|
|
193
|
+
case "end":
|
|
194
|
+
return _context2.stop();
|
|
195
|
+
}
|
|
196
|
+
}, _callee2);
|
|
197
|
+
}));
|
|
198
|
+
return _createCodeSandbox.apply(this, arguments);
|
|
199
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.code-gen-plugin-code-sandbox-preview {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: row;
|
|
4
|
+
align-items: center;
|
|
5
|
+
align-content: center;
|
|
6
|
+
justify-content: center;
|
|
7
|
+
justify-items: center;
|
|
8
|
+
height: 100%;
|
|
9
|
+
|
|
10
|
+
iframe {
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 100%;
|
|
13
|
+
min-height: 300px;
|
|
14
|
+
border: 0;
|
|
15
|
+
border-radius: 0;
|
|
16
|
+
overflow: hidden;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { CodeModules } from "../../types";
|
|
3
|
+
import "./index.less";
|
|
4
|
+
interface FileTreeProps {
|
|
5
|
+
modules: CodeModules;
|
|
6
|
+
onSelect?(key: string): void;
|
|
7
|
+
selectedKeys?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare const FileTree: (props: FileTreeProps) => JSX.Element;
|
|
10
|
+
declare type TreeNode = {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
folder: boolean;
|
|
14
|
+
depth: number;
|
|
15
|
+
expanded: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function createFlattenTree(data: Record<string, {
|
|
18
|
+
fpath: string;
|
|
19
|
+
code: string;
|
|
20
|
+
}>, expandedKeys: string[]): TreeNode[];
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.FileTree = void 0;
|
|
6
|
+
exports.createFlattenTree = createFlattenTree;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactWindow = require("react-window");
|
|
9
|
+
var _reactVirtualizedAutoSizer = _interopRequireDefault(require("react-virtualized-auto-sizer"));
|
|
10
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
11
|
+
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
|
|
12
|
+
var _stringNaturalCompare = _interopRequireDefault(require("string-natural-compare"));
|
|
13
|
+
var _index = require("../file-type-icon/index");
|
|
14
|
+
require("./index.less");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
17
|
+
var FILE_TYPES_ICON_MAP = {
|
|
18
|
+
js: "js",
|
|
19
|
+
jsx: "jsx",
|
|
20
|
+
ts: "ts",
|
|
21
|
+
tsx: "ts",
|
|
22
|
+
json: "json",
|
|
23
|
+
scss: "scss",
|
|
24
|
+
css: "css",
|
|
25
|
+
less: "less",
|
|
26
|
+
tsconfig: "tsconfig",
|
|
27
|
+
html: "html"
|
|
28
|
+
};
|
|
29
|
+
function getFileIcon(file) {
|
|
30
|
+
var type = FILE_TYPES_ICON_MAP[(file || "").split(".").pop() || ""] || "text";
|
|
31
|
+
return /*#__PURE__*/_react["default"].createElement(_index.FileTypeIcon, {
|
|
32
|
+
type: type
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
var Row = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
36
|
+
var data = _ref.data,
|
|
37
|
+
index = _ref.index,
|
|
38
|
+
style = _ref.style;
|
|
39
|
+
var flattenedData = data.flattenedData,
|
|
40
|
+
onOpen = data.onOpen,
|
|
41
|
+
onSelect = data.onSelect,
|
|
42
|
+
selectedKeys = data.selectedKeys;
|
|
43
|
+
var node = flattenedData[index];
|
|
44
|
+
var left = node.depth * 20;
|
|
45
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
46
|
+
className: (0, _classnames["default"])("tree-node", {
|
|
47
|
+
"tree-node-selected": selectedKeys === null || selectedKeys === void 0 ? void 0 : selectedKeys.includes(node.id)
|
|
48
|
+
}),
|
|
49
|
+
style: style,
|
|
50
|
+
onClick: function onClick() {
|
|
51
|
+
return onOpen(node);
|
|
52
|
+
}
|
|
53
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
54
|
+
className: (0, _classnames["default"])("tree-item", {
|
|
55
|
+
"tree-folder": node.folder,
|
|
56
|
+
"tree-item-expanded": node.expanded,
|
|
57
|
+
"tree-item-open": !node.expanded
|
|
58
|
+
}),
|
|
59
|
+
onClick: function onClick(e) {
|
|
60
|
+
return onSelect(e, node);
|
|
61
|
+
},
|
|
62
|
+
style: {
|
|
63
|
+
left: left + "px",
|
|
64
|
+
width: "calc(100% - " + left + "px)"
|
|
65
|
+
}
|
|
66
|
+
}, !node.folder && getFileIcon(node.label), /*#__PURE__*/_react["default"].createElement("span", {
|
|
67
|
+
className: "label-name"
|
|
68
|
+
}, node.label)));
|
|
69
|
+
}, _reactWindow.areEqual);
|
|
70
|
+
var getItemData = (0, _memoizeOne["default"])(function (onOpen, onSelect, flattenedData, selectedKeys) {
|
|
71
|
+
return {
|
|
72
|
+
onOpen: onOpen,
|
|
73
|
+
onSelect: onSelect,
|
|
74
|
+
flattenedData: flattenedData,
|
|
75
|
+
selectedKeys: selectedKeys
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
var FileTree = exports.FileTree = function FileTree(props) {
|
|
79
|
+
var modules = props.modules,
|
|
80
|
+
_props$selectedKeys = props.selectedKeys,
|
|
81
|
+
selectedKeys = _props$selectedKeys === void 0 ? [] : _props$selectedKeys;
|
|
82
|
+
var _useState = (0, _react.useState)([]),
|
|
83
|
+
openedNodeIds = _useState[0],
|
|
84
|
+
setOpenedNodeIds = _useState[1];
|
|
85
|
+
var onOpen = function onOpen(node) {
|
|
86
|
+
if (!node.folder) return;
|
|
87
|
+
!node.expanded ? setOpenedNodeIds([].concat(openedNodeIds, [node.id])) : setOpenedNodeIds(openedNodeIds.filter(function (id) {
|
|
88
|
+
return id !== node.id;
|
|
89
|
+
}));
|
|
90
|
+
};
|
|
91
|
+
var onSelect = function onSelect(e, node) {
|
|
92
|
+
var _props$onSelect;
|
|
93
|
+
//e.stopPropagation();
|
|
94
|
+
if (node.folder) return;
|
|
95
|
+
(_props$onSelect = props.onSelect) === null || _props$onSelect === void 0 ? void 0 : _props$onSelect.call(props, node.id);
|
|
96
|
+
};
|
|
97
|
+
var flattenedData = createFlattenTree(modules, openedNodeIds);
|
|
98
|
+
var itemData = getItemData(onOpen, onSelect, flattenedData, selectedKeys);
|
|
99
|
+
return /*#__PURE__*/_react["default"].createElement(_reactVirtualizedAutoSizer["default"], null, function (_ref2) {
|
|
100
|
+
var height = _ref2.height,
|
|
101
|
+
width = _ref2.width;
|
|
102
|
+
return /*#__PURE__*/_react["default"].createElement(_reactWindow.FixedSizeList, {
|
|
103
|
+
className: "code-file-tree",
|
|
104
|
+
height: height,
|
|
105
|
+
itemCount: flattenedData.length,
|
|
106
|
+
itemSize: 22,
|
|
107
|
+
width: width,
|
|
108
|
+
itemKey: function itemKey(index) {
|
|
109
|
+
return flattenedData[index].id;
|
|
110
|
+
},
|
|
111
|
+
itemData: itemData
|
|
112
|
+
}, Row);
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
function createFlattenTree(data, expandedKeys) {
|
|
116
|
+
var flatTree = [];
|
|
117
|
+
var filePaths = Object.keys(data);
|
|
118
|
+
// console.log(JSON.parse(JSON.stringify(filePaths)))
|
|
119
|
+
// filePaths.sort((a, b) => {
|
|
120
|
+
// // 检查字符串a是否包含斜杠
|
|
121
|
+
// const hasSlashA = a.substring(1).lastIndexOf('/');
|
|
122
|
+
// // 检查字符串b是否包含斜杠
|
|
123
|
+
// const hasSlashB = b.substring(1).lastIndexOf('/');
|
|
124
|
+
// console.log('---a', hasSlashA)
|
|
125
|
+
// console.log('---b', hasSlashB)
|
|
126
|
+
// // 如果a包含斜杠,而b不包含,则a应该排在b之后
|
|
127
|
+
// if (hasSlashA > -1 && hasSlashB > -1) {
|
|
128
|
+
// return hasSlashB - hasSlashA;
|
|
129
|
+
// }
|
|
130
|
+
|
|
131
|
+
// return naturalCompare(a, b, {
|
|
132
|
+
// caseInsensitive: true,
|
|
133
|
+
// }); // 包含斜杠的字符串按字典顺序排序
|
|
134
|
+
// });
|
|
135
|
+
// console.log(filePaths)
|
|
136
|
+
filePaths.forEach(function (key) {
|
|
137
|
+
var parts = key.split("/");
|
|
138
|
+
var fileNames = [];
|
|
139
|
+
var _loop = function _loop() {
|
|
140
|
+
var path = parts.slice(0, i).join("/");
|
|
141
|
+
var expanded = expandedKeys.includes(path);
|
|
142
|
+
if (path && !flatTree.some(function (node) {
|
|
143
|
+
return node.id === path;
|
|
144
|
+
})) {
|
|
145
|
+
fileNames.push({
|
|
146
|
+
id: path,
|
|
147
|
+
label: parts[i - 1] || "/",
|
|
148
|
+
// 当前层的名称
|
|
149
|
+
folder: i < parts.length,
|
|
150
|
+
// 如果不是最后一层,则为文件夹
|
|
151
|
+
depth: i - 1,
|
|
152
|
+
// 层级深度,从 0 开始
|
|
153
|
+
expanded: expanded // 默认展开
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (expanded) return 1; // break
|
|
157
|
+
};
|
|
158
|
+
for (var i = 1; i <= parts.length; i++) {
|
|
159
|
+
if (_loop()) break;
|
|
160
|
+
}
|
|
161
|
+
// console.log('--fileNames', fileNames);
|
|
162
|
+
fileNames.sort(function (a, b) {
|
|
163
|
+
return (0, _stringNaturalCompare["default"])(a.id, b.id, {
|
|
164
|
+
caseInsensitive: true
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
flatTree.push.apply(flatTree, fileNames);
|
|
168
|
+
});
|
|
169
|
+
return flatTree;
|
|
170
|
+
}
|