@nookuio/iframe 0.9.6 → 0.9.7

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/editor.mjs CHANGED
@@ -1,95 +1 @@
1
- import { EDITOR_SOURCE_NAME, IFRAME_SOURCE_NAME } from "./constants.mjs";
2
- import { createClient } from "./createClient.mjs";
3
- import { stringify, parse } from "telejson";
4
- function deserialize(data) {
5
- const parsed = parse(data, { maxDepth: Infinity });
6
- const senitizeRefs = (obj) => {
7
- if (Array.isArray(obj)) {
8
- obj.forEach((item, index) => {
9
- obj[index] = senitizeRefs(item);
10
- });
11
- } else if (obj && typeof obj === "object") {
12
- if (obj.hasOwnProperty("__v_isRef")) {
13
- const newObj = {
14
- ...obj,
15
- __v_isRef: "true",
16
- // converted to string
17
- value: obj.hasOwnProperty("value") && obj.value !== void 0 ? obj.value : obj._value ?? obj._rawValue
18
- };
19
- return newObj;
20
- } else {
21
- Object.keys(obj).forEach((key) => {
22
- obj[key] = senitizeRefs(obj[key]);
23
- });
24
- }
25
- }
26
- return obj;
27
- };
28
- const d = senitizeRefs(parsed);
29
- return d;
30
- }
31
- export function createEditorClient(iframe) {
32
- let iframeElement;
33
- function getIframe() {
34
- if (!iframeElement || !iframeElement.isConnected) {
35
- iframeElement = typeof iframe === "string" ? document.querySelector(`#${iframe}`) : iframe;
36
- }
37
- return iframeElement;
38
- }
39
- const client = createClient(
40
- {},
41
- {
42
- handle(handler) {
43
- window.addEventListener("message", async (event) => {
44
- if (typeof event.data !== "object") return;
45
- if (event.data.source !== IFRAME_SOURCE_NAME || event.data.type === "event" || !event.data.request) return;
46
- const iframe2 = getIframe();
47
- if (!iframe2) return;
48
- const response = await handler(event.data.request);
49
- iframe2.contentWindow?.postMessage({ source: EDITOR_SOURCE_NAME, response }, "*");
50
- });
51
- },
52
- async invoke(request) {
53
- const iframe2 = getIframe();
54
- if (!iframe2)
55
- return {
56
- type: "response",
57
- id: request.id,
58
- key: request.key,
59
- result: void 0
60
- };
61
- return new Promise((resolve, reject) => {
62
- const timeout = setTimeout(() => {
63
- window.removeEventListener("message", messageHandler);
64
- reject(new Error("Request timed out"));
65
- }, 5e3);
66
- function messageHandler(event) {
67
- if (typeof event.data !== "object") return;
68
- if (event.data.source !== IFRAME_SOURCE_NAME || !event.data.response) return;
69
- if (event.data.response.id !== request.id) return;
70
- clearTimeout(timeout);
71
- window.removeEventListener("message", messageHandler);
72
- resolve(event.data.response);
73
- }
74
- iframe2.contentWindow?.postMessage({ source: EDITOR_SOURCE_NAME, request }, "*");
75
- window.addEventListener("message", messageHandler);
76
- });
77
- },
78
- emit(request) {
79
- const iframe2 = getIframe();
80
- if (!iframe2) return;
81
- iframe2.contentWindow?.postMessage({ source: EDITOR_SOURCE_NAME, type: "event", request }, "*");
82
- },
83
- handleEvent(handleRequest) {
84
- window.addEventListener("message", (event) => {
85
- if (typeof event.data !== "object") return;
86
- if (event.data.source !== IFRAME_SOURCE_NAME || event.data.type !== "event" || !event.data.request) return;
87
- handleRequest(event.data.request);
88
- });
89
- },
90
- deserialize,
91
- serialize: (v) => stringify(v, { maxDepth: Infinity })
92
- }
93
- );
94
- return client;
95
- }
1
+ import{EDITOR_SOURCE_NAME as f,IFRAME_SOURCE_NAME as u}from"./constants";import{createClient as E}from"./createClient";import{stringify as p,parse as l}from"telejson";function y(a){const n=l(a,{maxDepth:1/0}),r=e=>{if(Array.isArray(e))e.forEach((t,s)=>{e[s]=r(t)});else if(e&&typeof e=="object"){if(e.hasOwnProperty("__v_isRef"))return{...e,__v_isRef:"true",value:e.hasOwnProperty("value")&&e.value!==void 0?e.value:e._value??e._rawValue};Object.keys(e).forEach(t=>{e[t]=r(e[t])})}return e};return r(n)}export function createEditorClient(a){let n;function r(){return(!n||!n.isConnected)&&(n=typeof a=="string"?document.querySelector(`#${a}`):a),n}return E({},{handle(e){window.addEventListener("message",async t=>{if(typeof t.data!="object"||t.data.source!==u||t.data.type==="event"||!t.data.request)return;const s=r();if(!s)return;const o=await e(t.data.request);s.contentWindow?.postMessage({source:f,response:o},"*")})},async invoke(e){const t=r();return t?new Promise((s,o)=>{const c=setTimeout(()=>{window.removeEventListener("message",d),o(new Error("Request timed out"))},5e3);function d(i){typeof i.data=="object"&&(i.data.source!==u||!i.data.response||i.data.response.id===e.id&&(clearTimeout(c),window.removeEventListener("message",d),s(i.data.response)))}t.contentWindow?.postMessage({source:f,request:e},"*"),window.addEventListener("message",d)}):{type:"response",id:e.id,key:e.key,result:void 0}},emit(e){const t=r();t&&t.contentWindow?.postMessage({source:f,type:"event",request:e},"*")},handleEvent(e){window.addEventListener("message",t=>{typeof t.data=="object"&&(t.data.source!==u||t.data.type!=="event"||!t.data.request||e(t.data.request))})},deserialize:y,serialize:e=>p(e,{maxDepth:1/0})})}
package/dist/iframe.js CHANGED
@@ -7,244 +7,170 @@ exports.createVueIframeClient = createVueIframeClient;
7
7
  var _constants = require("./constants");
8
8
  var _createClient = require("./createClient");
9
9
  var _telejson = require("telejson");
10
- function getSelector(path, id) {
11
- return `[data-node-id="${id}"][data-node-path="${path}"]`;
10
+ function b(c, l) {
11
+ return `[data-node-id="${l}"][data-node-path="${c}"]`;
12
12
  }
13
- function getElementStyles(selector, withPadding) {
14
- const elements = document.querySelectorAll(selector);
15
- if (!elements?.length) return;
16
- const styles = Array.from(elements).map(element => {
17
- const clientRect = element.getBoundingClientRect();
18
- const position = {
19
- width: clientRect.width,
20
- height: clientRect.height,
21
- top: clientRect.top,
22
- left: clientRect.left
23
- };
24
- if (!withPadding) return position;
25
- const computedStyle = window.getComputedStyle(element) ?? {};
13
+ function h(c, l) {
14
+ const s = document.querySelectorAll(c);
15
+ if (!s?.length) return;
16
+ const d = Array.from(s).map(f => {
17
+ const u = f.getBoundingClientRect(),
18
+ g = {
19
+ width: u.width,
20
+ height: u.height,
21
+ top: u.top,
22
+ left: u.left
23
+ };
24
+ if (!l) return g;
25
+ const m = window.getComputedStyle(f) ?? {};
26
26
  return {
27
- ...position,
27
+ ...g,
28
28
  padding: {
29
- top: computedStyle.paddingTop,
30
- right: computedStyle.paddingRight,
31
- bottom: computedStyle.paddingBottom,
32
- left: computedStyle.paddingLeft
29
+ top: m.paddingTop,
30
+ right: m.paddingRight,
31
+ bottom: m.paddingBottom,
32
+ left: m.paddingLeft
33
33
  }
34
34
  };
35
35
  });
36
- if (!styles?.length) return;
37
- return styles.length === 1 ? styles[0] : styles;
36
+ if (d?.length) return d.length === 1 ? d[0] : d;
38
37
  }
39
- function createVueIframeClient(vueCtx, options) {
40
- const client = (0, _createClient.createClient)({
41
- ...vueCtx,
42
- async editText({
43
- path,
44
- id
45
- }) {
46
- if (!path || id === void 0) return;
47
- const selector = getSelector(path, id);
48
- const element = document.querySelector(selector);
49
- if (!element) return;
50
- element.style.outline = "none";
51
- element.setAttribute("spellcheck", "false");
52
- element.setAttribute("contenteditable", "true");
53
- const blurEvtHandler = event => {
54
- const elm = event.target;
55
- if (!elm) return;
56
- const content = elm.innerText;
57
- element.removeAttribute("contenteditable");
58
- client.emit("text-update", {
59
- path,
60
- id,
61
- content
62
- });
63
- element.removeEventListener("blur", blurEvtHandler);
64
- element.removeEventListener("keydown", keyDownEvtHandler);
65
- element.blur();
66
- };
67
- const keyDownEvtHandler = event => {
68
- if (event.key === "Enter") {
69
- event.stopPropagation();
70
- event.preventDefault();
71
- blurEvtHandler(event);
72
- }
73
- };
74
- element.addEventListener("keydown", keyDownEvtHandler);
75
- element.addEventListener("blur", blurEvtHandler);
76
- element.focus();
77
- },
78
- async getHoveredElement({
79
- path,
80
- id,
81
- x,
82
- y
83
- }) {
84
- if (!path) return;
85
- if (x !== void 0 && y !== void 0) {
86
- let element = document.elementFromPoint(x, y);
87
- if (!element) return;
88
- let elementPath = element.getAttribute("data-node-path");
89
- if (elementPath !== path) {
90
- if (!element.parentElement) return;
91
- while (element.parentElement && elementPath !== path) {
92
- element = element.parentElement;
93
- elementPath = element.getAttribute("data-node-path");
38
+ function createVueIframeClient(c, l) {
39
+ const s = (0, _createClient.createClient)({
40
+ ...c,
41
+ async editText({
42
+ path: e,
43
+ id: t
44
+ }) {
45
+ if (!e || t === void 0) return;
46
+ const i = b(e, t),
47
+ n = document.querySelector(i);
48
+ if (!n) return;
49
+ n.style.outline = "none", n.setAttribute("spellcheck", "false"), n.setAttribute("contenteditable", "true");
50
+ const o = a => {
51
+ const E = a.target;
52
+ if (!E) return;
53
+ const y = E.innerText;
54
+ n.removeAttribute("contenteditable"), s.emit("text-update", {
55
+ path: e,
56
+ id: t,
57
+ content: y
58
+ }), n.removeEventListener("blur", o), n.removeEventListener("keydown", r), n.blur();
59
+ },
60
+ r = a => {
61
+ a.key === "Enter" && (a.stopPropagation(), a.preventDefault(), o(a));
62
+ };
63
+ n.addEventListener("keydown", r), n.addEventListener("blur", o), n.focus();
64
+ },
65
+ async getHoveredElement({
66
+ path: e,
67
+ id: t,
68
+ x: i,
69
+ y: n
70
+ }) {
71
+ if (e) if (i !== void 0 && n !== void 0) {
72
+ let o = document.elementFromPoint(i, n);
73
+ if (!o) return;
74
+ let r = o.getAttribute("data-node-path");
75
+ if (r !== e) {
76
+ if (!o.parentElement) return;
77
+ for (; o.parentElement && r !== e;) o = o.parentElement, r = o.getAttribute("data-node-path");
94
78
  }
79
+ const a = o.getAttribute("data-node-id");
80
+ if (!a) return;
81
+ const E = b(e, a),
82
+ y = h(E, !1);
83
+ return y ? {
84
+ id: a,
85
+ path: e,
86
+ data: y
87
+ } : void 0;
88
+ } else {
89
+ const o = b(e, t),
90
+ r = h(o, !1);
91
+ return r ? {
92
+ id: t,
93
+ path: e,
94
+ data: r
95
+ } : void 0;
95
96
  }
96
- const elementId = element.getAttribute("data-node-id");
97
- if (!elementId) return;
98
- const selector = getSelector(path, elementId);
99
- const styles = getElementStyles(selector, false);
100
- if (!styles) return;
101
- return {
102
- id: elementId,
103
- path,
104
- data: styles
105
- };
106
- } else {
107
- const selector = getSelector(path, id);
108
- const styles = getElementStyles(selector, false);
109
- if (!styles) return;
110
- return {
111
- id,
112
- path,
113
- data: styles
97
+ },
98
+ async getPageHeight() {
99
+ return document.body.scrollHeight > 0 ? document.body.scrollHeight : document.documentElement.scrollHeight;
100
+ },
101
+ async getSelectedElement({
102
+ path: e,
103
+ id: t
104
+ }) {
105
+ const i = b(e, t),
106
+ n = h(i, !0);
107
+ if (n) return {
108
+ path: e,
109
+ id: t,
110
+ data: n
114
111
  };
112
+ },
113
+ toggleTheme(e) {
114
+ e === "dark" ? (document.documentElement.classList.remove("light"), document.documentElement.classList.add("dark")) : (document.documentElement.classList.remove("dark"), document.documentElement.classList.add("light"));
115
115
  }
116
- },
117
- async getPageHeight() {
118
- const height = document.body.scrollHeight > 0 ? document.body.scrollHeight : document.documentElement.scrollHeight;
119
- return height;
120
- },
121
- async getSelectedElement({
122
- path,
123
- id
124
- }) {
125
- const selector = getSelector(path, id);
126
- const styles = getElementStyles(selector, true);
127
- if (!styles) return;
128
- return {
129
- path,
130
- id,
131
- data: styles
132
- };
133
- },
134
- toggleTheme(theme) {
135
- if (theme === "dark") {
136
- document.documentElement.classList.remove("light");
137
- document.documentElement.classList.add("dark");
138
- } else {
139
- document.documentElement.classList.remove("dark");
140
- document.documentElement.classList.add("light");
141
- }
142
- }
143
- // updateElementClass({ className, id, path }) {
144
- // const selector = getSelector(path, id);
145
- // const elements = document.querySelectorAll(selector);
146
- // if (!elements?.length) return;
147
- // elements.forEach((elm) => (elm.className = className));
148
- // },
149
- // updateElementAttribute({ attribute, value, id, path }) {
150
- // const selector = getSelector(path, id);
151
- // const elements = document.querySelectorAll(selector);
152
- // if (!elements?.length) return;
153
- // elements.forEach((elm) => elm.setAttribute(attribute, value));
154
- // },
155
- // duplicateElement({ id, path }) {
156
- // const selector = getSelector(path, id);
157
- // const elements = document.querySelectorAll(selector);
158
- // if (!elements?.length) return;
159
- // elements.forEach((elm) => {
160
- // const clone = elm.cloneNode(true) as HTMLElement;
161
- // clone.setAttribute('data-node-id', String(Number(clone.getAttribute('data-node-id')!) + 1));
162
- // elm.parentElement?.insertBefore(clone, elm.nextSibling);
163
- // });
164
- // }
165
- }, {
166
- handle(handler) {
167
- window.addEventListener("message", async event => {
168
- if (typeof event.data !== "object") return;
169
- if (event.data.source !== _constants.EDITOR_SOURCE_NAME || event.data.type === "event" || !event.data.request) return;
170
- const response = await handler(event.data.request);
171
- window.parent.postMessage({
172
- source: _constants.IFRAME_SOURCE_NAME,
173
- response
174
- }, "*");
175
- });
176
- },
177
- invoke(request) {
178
- return new Promise((resolve, reject) => {
179
- const timeout = setTimeout(() => {
180
- window.removeEventListener("message", messageHandler);
181
- reject(new Error("Request timed out"));
182
- }, 5e3);
183
- function messageHandler(event) {
184
- if (typeof event.data !== "object") return;
185
- if (event.data.source !== _constants.EDITOR_SOURCE_NAME || !event.data.response) return;
186
- if (event.data.response.id !== request.id) return;
187
- clearTimeout(timeout);
188
- window.removeEventListener("message", messageHandler);
189
- resolve(event.data.response);
190
- }
116
+ }, {
117
+ handle(e) {
118
+ window.addEventListener("message", async t => {
119
+ if (typeof t.data != "object" || t.data.source !== _constants.EDITOR_SOURCE_NAME || t.data.type === "event" || !t.data.request) return;
120
+ const i = await e(t.data.request);
121
+ window.parent.postMessage({
122
+ source: _constants.IFRAME_SOURCE_NAME,
123
+ response: i
124
+ }, "*");
125
+ });
126
+ },
127
+ invoke(e) {
128
+ return new Promise((t, i) => {
129
+ const n = setTimeout(() => {
130
+ window.removeEventListener("message", o), i(new Error("Request timed out"));
131
+ }, 5e3);
132
+ function o(r) {
133
+ typeof r.data == "object" && (r.data.source !== _constants.EDITOR_SOURCE_NAME || !r.data.response || r.data.response.id === e.id && (clearTimeout(n), window.removeEventListener("message", o), t(r.data.response)));
134
+ }
135
+ window.parent.postMessage({
136
+ source: _constants.IFRAME_SOURCE_NAME,
137
+ request: e
138
+ }, "*"), window.addEventListener("message", o);
139
+ });
140
+ },
141
+ emit(e) {
191
142
  window.parent.postMessage({
192
143
  source: _constants.IFRAME_SOURCE_NAME,
193
- request
144
+ type: "event",
145
+ request: e
194
146
  }, "*");
195
- window.addEventListener("message", messageHandler);
196
- });
197
- },
198
- emit(request) {
199
- window.parent.postMessage({
200
- source: _constants.IFRAME_SOURCE_NAME,
201
- type: "event",
202
- request
203
- }, "*");
204
- },
205
- handleEvent(handleRequest) {
206
- window.addEventListener("message", event => {
207
- if (typeof event.data !== "object") return;
208
- if (event.data.source !== _constants.EDITOR_SOURCE_NAME || event.data.type !== "event" || !event.data.request) return;
209
- handleRequest(event.data.request);
210
- });
211
- },
212
- deserialize: v => (0, _telejson.parse)(v),
213
- serialize: v => (0, _telejson.stringify)(v, {
214
- maxDepth: Infinity
215
- })
216
- });
217
- const defaultConsoleLog = options?.disableDefaultConsole ? void 0 : console.log.bind(console);
218
- const defaultConsoleWarn = options?.disableDefaultConsole ? void 0 : console.warn.bind(console);
219
- const defaultConsoleError = options?.disableDefaultConsole ? void 0 : console.error.bind(console);
220
- const defaultConsoleInfo = options?.disableDefaultConsole ? void 0 : console.info.bind(console);
221
- console.log = (...args) => {
222
- client.emit("console", "log", args);
223
- defaultConsoleLog?.(...args);
224
- };
225
- console.warn = (...args) => {
226
- defaultConsoleWarn?.(...args);
227
- };
228
- console.error = (...args) => {
229
- client.emit("console", "error", args);
230
- defaultConsoleError?.(...args);
231
- };
232
- console.info = (...args) => {
233
- client.emit("console", "info", args);
234
- defaultConsoleInfo?.(...args);
235
- };
236
- window.addEventListener("resize", async () => client.emit("resize", await client.$context.getPageHeight()));
237
- const mutationObserver = new MutationObserver(async () => client.emit("resize", await client.$context.getPageHeight()));
238
- mutationObserver.observe(document.body, {
239
- childList: true,
240
- // observe direct children additions/removals
241
- subtree: true,
242
- // observe all descendants
243
- attributes: true,
244
- // observe attribute changes (like style, class)
245
- characterData: true
246
- // observe text changes
247
- });
248
- client.emit("ready");
249
- return client;
147
+ },
148
+ handleEvent(e) {
149
+ window.addEventListener("message", t => {
150
+ typeof t.data == "object" && (t.data.source !== _constants.EDITOR_SOURCE_NAME || t.data.type !== "event" || !t.data.request || e(t.data.request));
151
+ });
152
+ },
153
+ deserialize: e => (0, _telejson.parse)(e),
154
+ serialize: e => (0, _telejson.stringify)(e, {
155
+ maxDepth: 1 / 0
156
+ })
157
+ }),
158
+ d = l?.disableDefaultConsole ? void 0 : console.log.bind(console),
159
+ f = l?.disableDefaultConsole ? void 0 : console.warn.bind(console),
160
+ u = l?.disableDefaultConsole ? void 0 : console.error.bind(console),
161
+ g = l?.disableDefaultConsole ? void 0 : console.info.bind(console);
162
+ return console.log = (...e) => {
163
+ s.emit("console", "log", e), d?.(...e);
164
+ }, console.warn = (...e) => {
165
+ f?.(...e);
166
+ }, console.error = (...e) => {
167
+ s.emit("console", "error", e), u?.(...e);
168
+ }, console.info = (...e) => {
169
+ s.emit("console", "info", e), g?.(...e);
170
+ }, window.addEventListener("resize", async () => s.emit("resize", await s.$context.getPageHeight())), new MutationObserver(async () => s.emit("resize", await s.$context.getPageHeight())).observe(document.body, {
171
+ childList: !0,
172
+ subtree: !0,
173
+ attributes: !0,
174
+ characterData: !0
175
+ }), s.emit("ready"), s;
250
176
  }