@lark-apaas/miaoda-inspector-jsx-runtime 0.1.0-alpha.2 → 0.1.0-alpha.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/dist/lib/MiaodaWrapper.js +198 -0
- package/dist/lib/index.js +25 -1
- package/dist/lib/jsx-dev-runtime.js +63 -21
- package/package.json +10 -11
- package/dist/lib/MiaodaWrapper.jsx +0 -158
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __spreadValues = (a, b) => {
|
|
13
|
+
for (var prop in b || (b = {}))
|
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
if (__getOwnPropSymbols)
|
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
+
if (__propIsEnum.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
+
var __objRest = (source, exclude) => {
|
|
25
|
+
var target = {};
|
|
26
|
+
for (var prop in source)
|
|
27
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
if (source != null && __getOwnPropSymbols)
|
|
30
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
31
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
32
|
+
target[prop] = source[prop];
|
|
33
|
+
}
|
|
34
|
+
return target;
|
|
35
|
+
};
|
|
36
|
+
var __export = (target, all) => {
|
|
37
|
+
for (var name in all)
|
|
38
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
39
|
+
};
|
|
40
|
+
var __copyProps = (to, from, except, desc) => {
|
|
41
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
42
|
+
for (let key of __getOwnPropNames(from))
|
|
43
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
44
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
45
|
+
}
|
|
46
|
+
return to;
|
|
47
|
+
};
|
|
48
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
49
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
50
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
51
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
52
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
53
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
54
|
+
mod
|
|
55
|
+
));
|
|
56
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
57
|
+
var MiaodaWrapper_exports = {};
|
|
58
|
+
__export(MiaodaWrapper_exports, {
|
|
59
|
+
default: () => MiaodaWrapper_default
|
|
60
|
+
});
|
|
61
|
+
module.exports = __toCommonJS(MiaodaWrapper_exports);
|
|
62
|
+
var import_react = __toESM(require("react"));
|
|
63
|
+
let uid = 1;
|
|
64
|
+
if (typeof window !== "undefined") {
|
|
65
|
+
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__ = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__ || {
|
|
66
|
+
__registry: /* @__PURE__ */ new Map(),
|
|
67
|
+
setProps(id, newProps) {
|
|
68
|
+
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
69
|
+
if (inst) inst.setProps(newProps);
|
|
70
|
+
else console.warn("[miaoda] no instance", id);
|
|
71
|
+
},
|
|
72
|
+
setIconProps(id, propName, newIconName) {
|
|
73
|
+
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
74
|
+
if (inst) inst.setIconProps(propName, newIconName);
|
|
75
|
+
else console.warn("[miaoda] no instance", id);
|
|
76
|
+
},
|
|
77
|
+
getProps(id) {
|
|
78
|
+
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
79
|
+
return inst ? inst.getProps() : null;
|
|
80
|
+
},
|
|
81
|
+
unmount(id) {
|
|
82
|
+
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
83
|
+
if (inst) inst.unmount();
|
|
84
|
+
else console.warn("[miaoda] no instance", id);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function useInstanceId(providedId) {
|
|
89
|
+
const idRef = (0, import_react.useRef)(providedId || `miaoda-${uid++}`);
|
|
90
|
+
return idRef.current;
|
|
91
|
+
}
|
|
92
|
+
const Icon = (0, import_react.forwardRef)(function Icon2(props, ref) {
|
|
93
|
+
const _a = props || {}, {
|
|
94
|
+
size = "1em",
|
|
95
|
+
wrapperProps,
|
|
96
|
+
name = "a-arrow-down"
|
|
97
|
+
} = _a, svgProps = __objRest(_a, [
|
|
98
|
+
"size",
|
|
99
|
+
"wrapperProps",
|
|
100
|
+
"name"
|
|
101
|
+
]);
|
|
102
|
+
const spanProps = __spreadProps(__spreadValues({
|
|
103
|
+
ref
|
|
104
|
+
}, wrapperProps || {}), {
|
|
105
|
+
className: `anticon${(wrapperProps == null ? void 0 : wrapperProps.className) ? ` ${wrapperProps.className}` : ""}`
|
|
106
|
+
});
|
|
107
|
+
const svg = import_react.default.createElement(
|
|
108
|
+
"svg",
|
|
109
|
+
__spreadValues({
|
|
110
|
+
width: size,
|
|
111
|
+
height: size,
|
|
112
|
+
viewBox: "0 0 24 24",
|
|
113
|
+
fill: "none",
|
|
114
|
+
stroke: "currentColor",
|
|
115
|
+
strokeWidth: "2",
|
|
116
|
+
strokeLinecap: "round",
|
|
117
|
+
strokeLinejoin: "round"
|
|
118
|
+
}, svgProps),
|
|
119
|
+
import_react.default.createElement("use", { xlinkHref: `#${name}` })
|
|
120
|
+
);
|
|
121
|
+
return import_react.default.createElement("span", spanProps, svg);
|
|
122
|
+
});
|
|
123
|
+
const MiaodaWrapper = (0, import_react.forwardRef)(function MiaodaWrapper2(props, forwardedRef) {
|
|
124
|
+
const _a = props, {
|
|
125
|
+
Comp: currentComp,
|
|
126
|
+
children,
|
|
127
|
+
"data-miaoda-id": providedId
|
|
128
|
+
} = _a, rest = __objRest(_a, [
|
|
129
|
+
"Comp",
|
|
130
|
+
"children",
|
|
131
|
+
"data-miaoda-id"
|
|
132
|
+
]);
|
|
133
|
+
const instanceId = useInstanceId(providedId);
|
|
134
|
+
const mountedRef = (0, import_react.useRef)(true);
|
|
135
|
+
const [injectedProps, setInjectedProps] = (0, import_react.useState)({});
|
|
136
|
+
const [iconPropsMap, setIconPropsMap] = (0, import_react.useState)({});
|
|
137
|
+
const originalProps = currentComp && currentComp.props || {};
|
|
138
|
+
(0, import_react.useEffect)(() => {
|
|
139
|
+
mountedRef.current = true;
|
|
140
|
+
const api = {
|
|
141
|
+
setProps: (p) => {
|
|
142
|
+
if (!mountedRef.current) return;
|
|
143
|
+
setInjectedProps((prev) => __spreadValues(__spreadValues({}, prev), p));
|
|
144
|
+
},
|
|
145
|
+
setIconProps: (propName, newIconName) => {
|
|
146
|
+
if (!mountedRef.current) return;
|
|
147
|
+
setIconPropsMap((prev) => __spreadProps(__spreadValues({}, prev), { [propName]: newIconName }));
|
|
148
|
+
},
|
|
149
|
+
getProps: () => __spreadValues(__spreadValues(__spreadValues({}, originalProps), rest), injectedProps),
|
|
150
|
+
unmount: () => {
|
|
151
|
+
mountedRef.current = false;
|
|
152
|
+
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.delete(instanceId);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.set(instanceId, api);
|
|
156
|
+
return () => {
|
|
157
|
+
mountedRef.current = false;
|
|
158
|
+
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.delete(instanceId);
|
|
159
|
+
};
|
|
160
|
+
}, [instanceId, rest]);
|
|
161
|
+
const mergedProps = Object.assign({}, originalProps, rest, injectedProps);
|
|
162
|
+
Object.keys(iconPropsMap).forEach((iconKey) => {
|
|
163
|
+
const newIconName = iconPropsMap[iconKey];
|
|
164
|
+
if (!newIconName) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
mergedProps[iconKey] = import_react.default.createElement(Icon, { name: newIconName });
|
|
168
|
+
});
|
|
169
|
+
let finalChildren = children;
|
|
170
|
+
if (typeof injectedProps.children === "string") {
|
|
171
|
+
finalChildren = injectedProps.children;
|
|
172
|
+
}
|
|
173
|
+
let rendered;
|
|
174
|
+
if (import_react.default.isValidElement(currentComp)) {
|
|
175
|
+
rendered = import_react.default.cloneElement(
|
|
176
|
+
currentComp,
|
|
177
|
+
Object.assign({}, mergedProps, { ref: forwardedRef }),
|
|
178
|
+
finalChildren
|
|
179
|
+
);
|
|
180
|
+
} else if (typeof currentComp === "function" || typeof currentComp === "object") {
|
|
181
|
+
rendered = import_react.default.createElement(
|
|
182
|
+
currentComp,
|
|
183
|
+
Object.assign({}, mergedProps, { ref: forwardedRef }),
|
|
184
|
+
finalChildren
|
|
185
|
+
);
|
|
186
|
+
} else {
|
|
187
|
+
rendered = finalChildren || null;
|
|
188
|
+
}
|
|
189
|
+
if (import_react.default.isValidElement(rendered)) {
|
|
190
|
+
return import_react.default.cloneElement(rendered, {
|
|
191
|
+
"data-miaoda-id": instanceId,
|
|
192
|
+
"data-miaoda-wrapped": "true",
|
|
193
|
+
ref: forwardedRef
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return rendered;
|
|
197
|
+
});
|
|
198
|
+
var MiaodaWrapper_default = MiaodaWrapper;
|
package/dist/lib/index.js
CHANGED
|
@@ -1 +1,25 @@
|
|
|
1
|
-
|
|
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
|
+
var index_exports = {};
|
|
19
|
+
__export(index_exports, {
|
|
20
|
+
Fragment: () => import_jsx_dev_runtime.Fragment,
|
|
21
|
+
jsxDEV: () => import_jsx_dev_runtime.jsxDEV,
|
|
22
|
+
jsxDEVs: () => import_jsx_dev_runtime.jsxDEVs
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(index_exports);
|
|
25
|
+
var import_jsx_dev_runtime = require("./jsx-dev-runtime");
|
|
@@ -1,29 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __spreadValues = (a, b) => {
|
|
13
|
+
for (var prop in b || (b = {}))
|
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
if (__getOwnPropSymbols)
|
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
+
if (__propIsEnum.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
+
var __export = (target, all) => {
|
|
25
|
+
for (var name in all)
|
|
26
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
27
|
+
};
|
|
28
|
+
var __copyProps = (to, from, except, desc) => {
|
|
29
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
30
|
+
for (let key of __getOwnPropNames(from))
|
|
31
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
32
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
33
|
+
}
|
|
34
|
+
return to;
|
|
35
|
+
};
|
|
36
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
37
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
38
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
39
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
40
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
41
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
42
|
+
mod
|
|
43
|
+
));
|
|
44
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
45
|
+
var jsx_dev_runtime_exports = {};
|
|
46
|
+
__export(jsx_dev_runtime_exports, {
|
|
47
|
+
Fragment: () => import_jsx_runtime.Fragment,
|
|
48
|
+
jsxDEV: () => jsxDEV,
|
|
49
|
+
jsxDEVs: () => jsxDEVs
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(jsx_dev_runtime_exports);
|
|
52
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
53
|
+
var import_MiaodaWrapper = __toESM(require("./MiaodaWrapper"));
|
|
54
|
+
function jsxDEV(type, props, key, isStaticChildren, source, self) {
|
|
55
|
+
if (props["data-miaoda-component-name"] === "Button" && props["data-miaoda-import-source"] === "antd") {
|
|
56
|
+
return (0, import_jsx_runtime.jsx)(
|
|
57
|
+
import_MiaodaWrapper.default,
|
|
58
|
+
__spreadProps(__spreadValues({}, props), {
|
|
59
|
+
Comp: type
|
|
60
|
+
}),
|
|
16
61
|
key,
|
|
17
62
|
false,
|
|
18
63
|
source,
|
|
19
64
|
self
|
|
20
65
|
);
|
|
21
66
|
}
|
|
22
|
-
return
|
|
67
|
+
return (0, import_jsx_runtime.jsx)(type, props, key, isStaticChildren, source, self);
|
|
23
68
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return jsxsDEVRuntime(type, props, key, _isStaticChildren, _source, _self);
|
|
69
|
+
function jsxDEVs(type, props, key, _isStaticChildren, _source, _self) {
|
|
70
|
+
return (0, import_jsx_runtime.jsxs)(type, props, key, _isStaticChildren, _source, _self);
|
|
27
71
|
}
|
|
28
|
-
|
|
29
|
-
export { Fragment };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/miaoda-inspector-jsx-runtime",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.3",
|
|
4
4
|
"description": "Custom JSX Runtime for Inspector",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/lib/index.js",
|
|
@@ -10,13 +10,6 @@
|
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
12
12
|
},
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "mkdir -p dist/lib && cp -r src/* dist/lib/",
|
|
15
|
-
"lint": "eslint . --quiet",
|
|
16
|
-
"test": "vitest",
|
|
17
|
-
"test:cov": "vitest run --coverage",
|
|
18
|
-
"test:update": "vitest run -u"
|
|
19
|
-
},
|
|
20
13
|
"dependencies": {},
|
|
21
14
|
"devDependencies": {
|
|
22
15
|
"@testing-library/react": "^12",
|
|
@@ -24,10 +17,16 @@
|
|
|
24
17
|
"@types/node": "^18.17.18",
|
|
25
18
|
"@types/react": "^17",
|
|
26
19
|
"eslint": "^8",
|
|
27
|
-
"react": "^18"
|
|
28
|
-
"typescript": "^4"
|
|
20
|
+
"react": "^18"
|
|
29
21
|
},
|
|
30
22
|
"peerDependencies": {
|
|
31
23
|
"react": "^18"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"lint": "eslint . --quiet",
|
|
28
|
+
"test": "vitest",
|
|
29
|
+
"test:cov": "vitest run --coverage",
|
|
30
|
+
"test:update": "vitest run -u"
|
|
32
31
|
}
|
|
33
|
-
}
|
|
32
|
+
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useState, forwardRef } from 'react';
|
|
2
|
-
|
|
3
|
-
let uid = 1;
|
|
4
|
-
|
|
5
|
-
// 初始化全局控制对象(只创建一次)
|
|
6
|
-
if (typeof window !== 'undefined') {
|
|
7
|
-
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__ = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__ || {
|
|
8
|
-
__registry: new Map(),
|
|
9
|
-
setProps(id, newProps) {
|
|
10
|
-
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
11
|
-
if (inst) inst.setProps(newProps);
|
|
12
|
-
else console.warn('[miaoda] no instance', id);
|
|
13
|
-
},
|
|
14
|
-
setIconProps(id, propName, newIconName) {
|
|
15
|
-
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
16
|
-
if (inst) inst.setIconProps(propName, newIconName);
|
|
17
|
-
else console.warn('[miaoda] no instance', id);
|
|
18
|
-
},
|
|
19
|
-
getProps(id) {
|
|
20
|
-
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
21
|
-
return inst ? inst.getProps() : null;
|
|
22
|
-
},
|
|
23
|
-
unmount(id) {
|
|
24
|
-
const inst = window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.get(id);
|
|
25
|
-
if (inst) inst.unmount();
|
|
26
|
-
else console.warn('[miaoda] no instance', id);
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 辅助:获得或生成实例 id
|
|
32
|
-
function useInstanceId(providedId) {
|
|
33
|
-
const idRef = useRef(providedId || `miaoda-${uid++}`);
|
|
34
|
-
return idRef.current;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 内联 Icon 组件(使用 React.createElement,而非 JSX)
|
|
38
|
-
const Icon = forwardRef(function Icon(props, ref) {
|
|
39
|
-
const { size = '1em', wrapperProps, name = 'a-arrow-down', ...svgProps } = props || {};
|
|
40
|
-
|
|
41
|
-
const spanProps = {
|
|
42
|
-
ref,
|
|
43
|
-
...(wrapperProps || {}),
|
|
44
|
-
className: `anticon${wrapperProps?.className ? ` ${wrapperProps.className}` : ''}`,
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const svg = React.createElement(
|
|
48
|
-
'svg',
|
|
49
|
-
{
|
|
50
|
-
width: size,
|
|
51
|
-
height: size,
|
|
52
|
-
viewBox: '0 0 24 24',
|
|
53
|
-
fill: 'none',
|
|
54
|
-
stroke: 'currentColor',
|
|
55
|
-
strokeWidth: '2',
|
|
56
|
-
strokeLinecap: 'round',
|
|
57
|
-
strokeLinejoin: 'round',
|
|
58
|
-
...svgProps,
|
|
59
|
-
},
|
|
60
|
-
React.createElement('use', { xlinkHref: `#${name}` })
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
return React.createElement('span', spanProps, svg);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
const MiaodaWrapper = forwardRef(function MiaodaWrapper(props, forwardedRef) {
|
|
67
|
-
const { Comp: currentComp, children, 'data-miaoda-id': providedId, ...rest } = props;
|
|
68
|
-
const instanceId = useInstanceId(providedId);
|
|
69
|
-
const mountedRef = useRef(true);
|
|
70
|
-
|
|
71
|
-
// injectedProps 存放通过 window.miaoda.setProps 注入的运行时 props
|
|
72
|
-
const [injectedProps, setInjectedProps] = useState({});
|
|
73
|
-
const [iconPropsMap, setIconPropsMap] = useState({});
|
|
74
|
-
|
|
75
|
-
// helper: 得到原始 element 的 props(若 currentComp 是 React element)
|
|
76
|
-
const originalProps = (currentComp && currentComp.props) || {};
|
|
77
|
-
|
|
78
|
-
// 注册到 window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry
|
|
79
|
-
useEffect(() => {
|
|
80
|
-
mountedRef.current = true;
|
|
81
|
-
|
|
82
|
-
const api = {
|
|
83
|
-
setProps: (p) => {
|
|
84
|
-
if (!mountedRef.current) return;
|
|
85
|
-
// 合并并触发渲染
|
|
86
|
-
setInjectedProps((prev) => ({ ...prev, ...p }));
|
|
87
|
-
},
|
|
88
|
-
setIconProps: (propName, newIconName) => {
|
|
89
|
-
if (!mountedRef.current) return;
|
|
90
|
-
setIconPropsMap((prev) => ({ ...prev, [propName]: newIconName }));
|
|
91
|
-
},
|
|
92
|
-
getProps: () => ({ ...originalProps, ...rest, ...injectedProps }),
|
|
93
|
-
unmount: () => {
|
|
94
|
-
mountedRef.current = false;
|
|
95
|
-
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.delete(instanceId);
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.set(instanceId, api);
|
|
100
|
-
return () => {
|
|
101
|
-
mountedRef.current = false;
|
|
102
|
-
window.__MIAODA_DEVTOOLS_GLOBAL_HOOK__.__registry.delete(instanceId);
|
|
103
|
-
};
|
|
104
|
-
// 注意:不要把 injectedProps, originalProps 放到依赖里以免频繁重新注册
|
|
105
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps, @grncdr/react-hooks/exhaustive-deps
|
|
106
|
-
}, [instanceId, rest]);
|
|
107
|
-
|
|
108
|
-
// 合并 props:原始 props -> wrapper rest props -> injectedProps(优先级后者高)
|
|
109
|
-
const mergedProps = Object.assign({}, originalProps, rest, injectedProps);
|
|
110
|
-
|
|
111
|
-
// 针对每个 icon prop 直接注入 Icon(即使原本没有 icon 也可生效)
|
|
112
|
-
Object.keys(iconPropsMap).forEach((iconKey) => {
|
|
113
|
-
const newIconName = iconPropsMap[iconKey];
|
|
114
|
-
if (!newIconName) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
mergedProps[iconKey] = React.createElement(Icon, { name: newIconName });
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// 处理 children 优先级:
|
|
121
|
-
// 1. 如果 injectedProps.children 是字符串 -> 覆盖渲染
|
|
122
|
-
// 2. 否则 fallback 到 children
|
|
123
|
-
let finalChildren = children;
|
|
124
|
-
if (typeof injectedProps.children === 'string') {
|
|
125
|
-
finalChildren = injectedProps.children;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// 如果 currentComp 是有效 element,clone 并注入 mergedProps + ref
|
|
129
|
-
let rendered;
|
|
130
|
-
if (React.isValidElement(currentComp)) {
|
|
131
|
-
rendered = React.cloneElement(
|
|
132
|
-
currentComp,
|
|
133
|
-
Object.assign({}, mergedProps, { ref: forwardedRef }),
|
|
134
|
-
finalChildren
|
|
135
|
-
);
|
|
136
|
-
} else if (typeof currentComp === 'function' || typeof currentComp === 'object') {
|
|
137
|
-
rendered = React.createElement(
|
|
138
|
-
currentComp,
|
|
139
|
-
Object.assign({}, mergedProps, { ref: forwardedRef }),
|
|
140
|
-
finalChildren
|
|
141
|
-
);
|
|
142
|
-
} else {
|
|
143
|
-
rendered = finalChildren || null;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// 返回带标识属性的 element
|
|
147
|
-
if (React.isValidElement(rendered)) {
|
|
148
|
-
return React.cloneElement(rendered, {
|
|
149
|
-
'data-miaoda-id': instanceId,
|
|
150
|
-
'data-miaoda-wrapped': 'true',
|
|
151
|
-
ref: forwardedRef,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return rendered;
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
export default MiaodaWrapper;
|