@schema-element-editor/host-sdk 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.
@@ -0,0 +1,41 @@
1
+ import {
2
+ createSchemaElementEditorBridge
3
+ } from "./chunk-FG4Q5PL6.js";
4
+
5
+ // src/react.ts
6
+ import { useEffect, useRef, useMemo, useCallback } from "react";
7
+ function useSchemaElementEditor(config) {
8
+ const { getSchema, updateSchema, renderPreview, sourceConfig, messageTypes, enabled } = config;
9
+ const configRef = useRef({ getSchema, updateSchema, renderPreview });
10
+ const bridgeRef = useRef(null);
11
+ useEffect(() => {
12
+ configRef.current = { getSchema, updateSchema, renderPreview };
13
+ }, [getSchema, updateSchema, renderPreview]);
14
+ useEffect(() => {
15
+ if (enabled === false) {
16
+ return;
17
+ }
18
+ const proxyConfig = {
19
+ getSchema: (params) => configRef.current.getSchema(params),
20
+ updateSchema: (schema, params) => configRef.current.updateSchema(schema, params),
21
+ renderPreview: configRef.current.renderPreview ? (schema, containerId) => configRef.current.renderPreview?.(schema, containerId) : void 0,
22
+ sourceConfig,
23
+ messageTypes
24
+ };
25
+ const bridge = createSchemaElementEditorBridge(proxyConfig);
26
+ bridgeRef.current = bridge;
27
+ return () => {
28
+ bridge.cleanup();
29
+ bridgeRef.current = null;
30
+ };
31
+ }, [enabled, configRef, sourceConfig, messageTypes]);
32
+ const push = useCallback((params, data) => {
33
+ bridgeRef.current?.recording.push(params, data);
34
+ }, []);
35
+ const recording = useMemo(() => ({ push }), [push]);
36
+ return { recording };
37
+ }
38
+
39
+ export {
40
+ useSchemaElementEditor
41
+ };
@@ -0,0 +1,173 @@
1
+ // src/core.ts
2
+ var DEFAULT_SOURCE_CONFIG = {
3
+ contentSource: "schema-editor-content",
4
+ hostSource: "schema-editor-host"
5
+ };
6
+ var DEFAULT_MESSAGE_TYPES = {
7
+ getSchema: "GET_SCHEMA",
8
+ updateSchema: "UPDATE_SCHEMA",
9
+ checkPreview: "CHECK_PREVIEW",
10
+ renderPreview: "RENDER_PREVIEW",
11
+ cleanupPreview: "CLEANUP_PREVIEW",
12
+ // 录制模式相关
13
+ startRecording: "START_RECORDING",
14
+ stopRecording: "STOP_RECORDING",
15
+ schemaPush: "SCHEMA_PUSH"
16
+ };
17
+ function createSchemaElementEditorBridge(config) {
18
+ const { getSchema, updateSchema, renderPreview, sourceConfig, messageTypes } = config;
19
+ const mergedSourceConfig = {
20
+ ...DEFAULT_SOURCE_CONFIG,
21
+ ...sourceConfig
22
+ };
23
+ const mergedMessageTypes = {
24
+ ...DEFAULT_MESSAGE_TYPES,
25
+ ...messageTypes
26
+ };
27
+ let previewCleanupFn = null;
28
+ const recordingParams = /* @__PURE__ */ new Set();
29
+ const currentConfig = { getSchema, updateSchema, renderPreview };
30
+ const sendResponse = (requestId, result) => {
31
+ const message = {
32
+ source: mergedSourceConfig.hostSource,
33
+ requestId,
34
+ ...result
35
+ };
36
+ const isInIframe = window !== window.top;
37
+ const targetWindow = isInIframe ? window.parent : window;
38
+ targetWindow.postMessage(message, "*");
39
+ };
40
+ const pushSchema = (params, data) => {
41
+ if (!recordingParams.has(params)) {
42
+ return;
43
+ }
44
+ const message = {
45
+ source: mergedSourceConfig.hostSource,
46
+ type: mergedMessageTypes.schemaPush,
47
+ payload: {
48
+ success: true,
49
+ data,
50
+ params
51
+ }
52
+ };
53
+ const isInIframe = window !== window.top;
54
+ const targetWindow = isInIframe ? window.parent : window;
55
+ targetWindow.postMessage(message, "*");
56
+ };
57
+ const handleMessage = (event) => {
58
+ const isFromSelf = event.source === window;
59
+ const isFromParent = window !== window.top && event.source === window.parent;
60
+ if (!isFromSelf && !isFromParent) return;
61
+ if (!event.data || event.data.source !== mergedSourceConfig.contentSource) return;
62
+ const { type, payload, requestId } = event.data;
63
+ if (!requestId) return;
64
+ const { getSchema: getSchema2, updateSchema: updateSchema2, renderPreview: renderPreview2 } = currentConfig;
65
+ let result;
66
+ switch (type) {
67
+ case mergedMessageTypes.getSchema: {
68
+ const params = String(payload?.params ?? "");
69
+ try {
70
+ const data = getSchema2(params);
71
+ result = { success: true, data };
72
+ } catch (error) {
73
+ result = {
74
+ success: false,
75
+ error: error instanceof Error ? error.message : "\u83B7\u53D6 Schema \u5931\u8D25"
76
+ };
77
+ }
78
+ break;
79
+ }
80
+ case mergedMessageTypes.updateSchema: {
81
+ const schema = payload?.schema;
82
+ const params = String(payload?.params ?? "");
83
+ try {
84
+ const success = updateSchema2(schema, params);
85
+ result = { success };
86
+ } catch (error) {
87
+ result = {
88
+ success: false,
89
+ error: error instanceof Error ? error.message : "\u66F4\u65B0 Schema \u5931\u8D25"
90
+ };
91
+ }
92
+ break;
93
+ }
94
+ case mergedMessageTypes.checkPreview: {
95
+ result = { exists: typeof renderPreview2 === "function" };
96
+ break;
97
+ }
98
+ case mergedMessageTypes.renderPreview: {
99
+ if (typeof renderPreview2 !== "function") {
100
+ result = { success: false, error: "\u9884\u89C8\u529F\u80FD\u672A\u914D\u7F6E" };
101
+ break;
102
+ }
103
+ const schema = payload?.schema;
104
+ const containerId = String(payload?.containerId ?? "");
105
+ try {
106
+ if (previewCleanupFn) {
107
+ previewCleanupFn();
108
+ previewCleanupFn = null;
109
+ }
110
+ const cleanup = renderPreview2(schema, containerId);
111
+ if (typeof cleanup === "function") {
112
+ previewCleanupFn = cleanup;
113
+ }
114
+ result = { success: true };
115
+ } catch (error) {
116
+ result = {
117
+ success: false,
118
+ error: error instanceof Error ? error.message : "\u6E32\u67D3\u9884\u89C8\u5931\u8D25"
119
+ };
120
+ }
121
+ break;
122
+ }
123
+ case mergedMessageTypes.cleanupPreview: {
124
+ try {
125
+ if (previewCleanupFn) {
126
+ previewCleanupFn();
127
+ previewCleanupFn = null;
128
+ }
129
+ result = { success: true };
130
+ } catch (error) {
131
+ result = {
132
+ success: false,
133
+ error: error instanceof Error ? error.message : "\u6E05\u7406\u9884\u89C8\u5931\u8D25"
134
+ };
135
+ }
136
+ break;
137
+ }
138
+ case mergedMessageTypes.startRecording: {
139
+ const params = String(payload?.params ?? "");
140
+ recordingParams.add(params);
141
+ result = { success: true };
142
+ break;
143
+ }
144
+ case mergedMessageTypes.stopRecording: {
145
+ const params = String(payload?.params ?? "");
146
+ recordingParams.delete(params);
147
+ result = { success: true };
148
+ break;
149
+ }
150
+ default:
151
+ return;
152
+ }
153
+ sendResponse(requestId, result);
154
+ };
155
+ window.addEventListener("message", handleMessage);
156
+ return {
157
+ cleanup: () => {
158
+ window.removeEventListener("message", handleMessage);
159
+ if (previewCleanupFn) {
160
+ previewCleanupFn();
161
+ previewCleanupFn = null;
162
+ }
163
+ recordingParams.clear();
164
+ },
165
+ recording: {
166
+ push: pushSchema
167
+ }
168
+ };
169
+ }
170
+
171
+ export {
172
+ createSchemaElementEditorBridge
173
+ };
@@ -0,0 +1,175 @@
1
+ // src/core.ts
2
+ var DEFAULT_SOURCE_CONFIG = {
3
+ contentSource: "schema-element-editor-content",
4
+ hostSource: "schema-element-editor-host"
5
+ };
6
+ var DEFAULT_MESSAGE_TYPES = {
7
+ getSchema: "GET_SCHEMA",
8
+ updateSchema: "UPDATE_SCHEMA",
9
+ checkPreview: "CHECK_PREVIEW",
10
+ renderPreview: "RENDER_PREVIEW",
11
+ cleanupPreview: "CLEANUP_PREVIEW",
12
+ // 录制模式相关
13
+ startRecording: "START_RECORDING",
14
+ stopRecording: "STOP_RECORDING",
15
+ schemaPush: "SCHEMA_PUSH"
16
+ };
17
+ function createSchemaElementEditorBridge(config) {
18
+ const { getSchema, updateSchema, renderPreview, sourceConfig, messageTypes } = config;
19
+ const mergedSourceConfig = {
20
+ ...DEFAULT_SOURCE_CONFIG,
21
+ ...sourceConfig
22
+ };
23
+ const mergedMessageTypes = {
24
+ ...DEFAULT_MESSAGE_TYPES,
25
+ ...messageTypes
26
+ };
27
+ let previewCleanupFn = null;
28
+ const recordingParams = /* @__PURE__ */ new Set();
29
+ const currentConfig = { getSchema, updateSchema, renderPreview };
30
+ const sendResponse = (requestId, result) => {
31
+ const message = {
32
+ source: mergedSourceConfig.hostSource,
33
+ requestId,
34
+ ...result
35
+ };
36
+ const isInIframe = window !== window.top;
37
+ const targetWindow = isInIframe ? window.parent : window;
38
+ targetWindow.postMessage(message, "*");
39
+ };
40
+ const pushSchema = (params, data) => {
41
+ if (!recordingParams.has(params)) {
42
+ return;
43
+ }
44
+ const message = {
45
+ source: mergedSourceConfig.hostSource,
46
+ type: mergedMessageTypes.schemaPush,
47
+ payload: {
48
+ success: true,
49
+ data,
50
+ params
51
+ }
52
+ };
53
+ const isInIframe = window !== window.top;
54
+ const targetWindow = isInIframe ? window.parent : window;
55
+ targetWindow.postMessage(message, "*");
56
+ };
57
+ const handleMessage = (event) => {
58
+ const isFromSelf = event.source === window;
59
+ const isFromParent = window !== window.top && event.source === window.parent;
60
+ if (!isFromSelf && !isFromParent) return;
61
+ if (!event.data || event.data.source !== mergedSourceConfig.contentSource) return;
62
+ const { type, payload, requestId } = event.data;
63
+ if (!requestId) return;
64
+ const { getSchema: getSchema2, updateSchema: updateSchema2, renderPreview: renderPreview2 } = currentConfig;
65
+ let result;
66
+ switch (type) {
67
+ case mergedMessageTypes.getSchema: {
68
+ const params = String(payload?.params ?? "");
69
+ try {
70
+ const data = getSchema2(params);
71
+ result = { success: true, data };
72
+ } catch (error) {
73
+ result = {
74
+ success: false,
75
+ error: error instanceof Error ? error.message : "\u83B7\u53D6 Schema \u5931\u8D25"
76
+ };
77
+ }
78
+ break;
79
+ }
80
+ case mergedMessageTypes.updateSchema: {
81
+ const schema = payload?.schema;
82
+ const params = String(payload?.params ?? "");
83
+ try {
84
+ const success = updateSchema2(schema, params);
85
+ result = { success };
86
+ } catch (error) {
87
+ result = {
88
+ success: false,
89
+ error: error instanceof Error ? error.message : "\u66F4\u65B0 Schema \u5931\u8D25"
90
+ };
91
+ }
92
+ break;
93
+ }
94
+ case mergedMessageTypes.checkPreview: {
95
+ result = { exists: typeof renderPreview2 === "function" };
96
+ break;
97
+ }
98
+ case mergedMessageTypes.renderPreview: {
99
+ if (typeof renderPreview2 !== "function") {
100
+ result = { success: false, error: "\u9884\u89C8\u529F\u80FD\u672A\u914D\u7F6E" };
101
+ break;
102
+ }
103
+ const schema = payload?.schema;
104
+ const containerId = String(payload?.containerId ?? "");
105
+ try {
106
+ if (previewCleanupFn) {
107
+ previewCleanupFn();
108
+ previewCleanupFn = null;
109
+ }
110
+ const cleanup = renderPreview2(schema, containerId);
111
+ if (typeof cleanup === "function") {
112
+ previewCleanupFn = cleanup;
113
+ }
114
+ result = { success: true };
115
+ } catch (error) {
116
+ result = {
117
+ success: false,
118
+ error: error instanceof Error ? error.message : "\u6E32\u67D3\u9884\u89C8\u5931\u8D25"
119
+ };
120
+ }
121
+ break;
122
+ }
123
+ case mergedMessageTypes.cleanupPreview: {
124
+ try {
125
+ if (previewCleanupFn) {
126
+ previewCleanupFn();
127
+ previewCleanupFn = null;
128
+ }
129
+ result = { success: true };
130
+ } catch (error) {
131
+ result = {
132
+ success: false,
133
+ error: error instanceof Error ? error.message : "\u6E05\u7406\u9884\u89C8\u5931\u8D25"
134
+ };
135
+ }
136
+ break;
137
+ }
138
+ case mergedMessageTypes.startRecording: {
139
+ const params = String(payload?.params ?? "");
140
+ recordingParams.add(params);
141
+ result = { success: true };
142
+ break;
143
+ }
144
+ case mergedMessageTypes.stopRecording: {
145
+ const params = String(payload?.params ?? "");
146
+ recordingParams.delete(params);
147
+ result = { success: true };
148
+ break;
149
+ }
150
+ default:
151
+ return;
152
+ }
153
+ sendResponse(requestId, result);
154
+ };
155
+ window.addEventListener("message", handleMessage);
156
+ return {
157
+ cleanup: () => {
158
+ window.removeEventListener("message", handleMessage);
159
+ if (previewCleanupFn) {
160
+ previewCleanupFn();
161
+ previewCleanupFn = null;
162
+ }
163
+ recordingParams.clear();
164
+ },
165
+ recording: {
166
+ push: pushSchema
167
+ }
168
+ };
169
+ }
170
+ var createSchemaEditorBridge = createSchemaElementEditorBridge;
171
+
172
+ export {
173
+ createSchemaElementEditorBridge,
174
+ createSchemaEditorBridge
175
+ };
@@ -0,0 +1,175 @@
1
+ // src/core.ts
2
+ var DEFAULT_SOURCE_CONFIG = {
3
+ contentSource: "schema-element-editor-content",
4
+ hostSource: "schema-element-editor-host"
5
+ };
6
+ var DEFAULT_MESSAGE_TYPES = {
7
+ getSchema: "GET_SCHEMA",
8
+ updateSchema: "UPDATE_SCHEMA",
9
+ checkPreview: "CHECK_PREVIEW",
10
+ renderPreview: "RENDER_PREVIEW",
11
+ cleanupPreview: "CLEANUP_PREVIEW",
12
+ // 录制模式相关
13
+ startRecording: "START_RECORDING",
14
+ stopRecording: "STOP_RECORDING",
15
+ schemaPush: "SCHEMA_PUSH"
16
+ };
17
+ var createSchemaEditorBridge = createSchemaElementEditorBridge;
18
+ function createSchemaElementEditorBridge(config) {
19
+ const { getSchema, updateSchema, renderPreview, sourceConfig, messageTypes } = config;
20
+ const mergedSourceConfig = {
21
+ ...DEFAULT_SOURCE_CONFIG,
22
+ ...sourceConfig
23
+ };
24
+ const mergedMessageTypes = {
25
+ ...DEFAULT_MESSAGE_TYPES,
26
+ ...messageTypes
27
+ };
28
+ let previewCleanupFn = null;
29
+ const recordingParams = /* @__PURE__ */ new Set();
30
+ const currentConfig = { getSchema, updateSchema, renderPreview };
31
+ const sendResponse = (requestId, result) => {
32
+ const message = {
33
+ source: mergedSourceConfig.hostSource,
34
+ requestId,
35
+ ...result
36
+ };
37
+ const isInIframe = window !== window.top;
38
+ const targetWindow = isInIframe ? window.parent : window;
39
+ targetWindow.postMessage(message, "*");
40
+ };
41
+ const pushSchema = (params, data) => {
42
+ if (!recordingParams.has(params)) {
43
+ return;
44
+ }
45
+ const message = {
46
+ source: mergedSourceConfig.hostSource,
47
+ type: mergedMessageTypes.schemaPush,
48
+ payload: {
49
+ success: true,
50
+ data,
51
+ params
52
+ }
53
+ };
54
+ const isInIframe = window !== window.top;
55
+ const targetWindow = isInIframe ? window.parent : window;
56
+ targetWindow.postMessage(message, "*");
57
+ };
58
+ const handleMessage = (event) => {
59
+ const isFromSelf = event.source === window;
60
+ const isFromParent = window !== window.top && event.source === window.parent;
61
+ if (!isFromSelf && !isFromParent) return;
62
+ if (!event.data || event.data.source !== mergedSourceConfig.contentSource) return;
63
+ const { type, payload, requestId } = event.data;
64
+ if (!requestId) return;
65
+ const { getSchema: getSchema2, updateSchema: updateSchema2, renderPreview: renderPreview2 } = currentConfig;
66
+ let result;
67
+ switch (type) {
68
+ case mergedMessageTypes.getSchema: {
69
+ const params = String(payload?.params ?? "");
70
+ try {
71
+ const data = getSchema2(params);
72
+ result = { success: true, data };
73
+ } catch (error) {
74
+ result = {
75
+ success: false,
76
+ error: error instanceof Error ? error.message : "\u83B7\u53D6 Schema \u5931\u8D25"
77
+ };
78
+ }
79
+ break;
80
+ }
81
+ case mergedMessageTypes.updateSchema: {
82
+ const schema = payload?.schema;
83
+ const params = String(payload?.params ?? "");
84
+ try {
85
+ const success = updateSchema2(schema, params);
86
+ result = { success };
87
+ } catch (error) {
88
+ result = {
89
+ success: false,
90
+ error: error instanceof Error ? error.message : "\u66F4\u65B0 Schema \u5931\u8D25"
91
+ };
92
+ }
93
+ break;
94
+ }
95
+ case mergedMessageTypes.checkPreview: {
96
+ result = { exists: typeof renderPreview2 === "function" };
97
+ break;
98
+ }
99
+ case mergedMessageTypes.renderPreview: {
100
+ if (typeof renderPreview2 !== "function") {
101
+ result = { success: false, error: "\u9884\u89C8\u529F\u80FD\u672A\u914D\u7F6E" };
102
+ break;
103
+ }
104
+ const schema = payload?.schema;
105
+ const containerId = String(payload?.containerId ?? "");
106
+ try {
107
+ if (previewCleanupFn) {
108
+ previewCleanupFn();
109
+ previewCleanupFn = null;
110
+ }
111
+ const cleanup = renderPreview2(schema, containerId);
112
+ if (typeof cleanup === "function") {
113
+ previewCleanupFn = cleanup;
114
+ }
115
+ result = { success: true };
116
+ } catch (error) {
117
+ result = {
118
+ success: false,
119
+ error: error instanceof Error ? error.message : "\u6E32\u67D3\u9884\u89C8\u5931\u8D25"
120
+ };
121
+ }
122
+ break;
123
+ }
124
+ case mergedMessageTypes.cleanupPreview: {
125
+ try {
126
+ if (previewCleanupFn) {
127
+ previewCleanupFn();
128
+ previewCleanupFn = null;
129
+ }
130
+ result = { success: true };
131
+ } catch (error) {
132
+ result = {
133
+ success: false,
134
+ error: error instanceof Error ? error.message : "\u6E05\u7406\u9884\u89C8\u5931\u8D25"
135
+ };
136
+ }
137
+ break;
138
+ }
139
+ case mergedMessageTypes.startRecording: {
140
+ const params = String(payload?.params ?? "");
141
+ recordingParams.add(params);
142
+ result = { success: true };
143
+ break;
144
+ }
145
+ case mergedMessageTypes.stopRecording: {
146
+ const params = String(payload?.params ?? "");
147
+ recordingParams.delete(params);
148
+ result = { success: true };
149
+ break;
150
+ }
151
+ default:
152
+ return;
153
+ }
154
+ sendResponse(requestId, result);
155
+ };
156
+ window.addEventListener("message", handleMessage);
157
+ return {
158
+ cleanup: () => {
159
+ window.removeEventListener("message", handleMessage);
160
+ if (previewCleanupFn) {
161
+ previewCleanupFn();
162
+ previewCleanupFn = null;
163
+ }
164
+ recordingParams.clear();
165
+ },
166
+ recording: {
167
+ push: pushSchema
168
+ }
169
+ };
170
+ }
171
+
172
+ export {
173
+ createSchemaEditorBridge,
174
+ createSchemaElementEditorBridge
175
+ };