@xuda.io/xuda-worker-bundle 1.3.2688 → 1.3.2690

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.
Files changed (2) hide show
  1. package/index.js +130 -102
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -5,49 +5,6 @@ if (typeof IS_DOCKER === 'undefined' || typeof IS_PROCESS_SERVER === 'undefined'
5
5
  var DOCS_OBJ = {};
6
6
  }
7
7
 
8
- // Minimal jQuery shim for plugins that still reference $
9
- if (typeof $ === 'undefined' && typeof document !== 'undefined') {
10
- var $ = function (selector) {
11
- var nodes = typeof selector === 'string'
12
- ? Array.from(document.querySelectorAll(selector))
13
- : selector?.nodeType ? [selector] : (selector?.length ? Array.from(selector) : []);
14
- var obj = {
15
- 0: nodes[0], length: nodes.length,
16
- toArray: function () { return nodes.slice(); },
17
- find: function (s) { var r = []; for (var i = 0; i < nodes.length; i++) { r.push.apply(r, Array.from(nodes[i].querySelectorAll(s))); } return $(r); },
18
- each: function (fn) { for (var i = 0; i < nodes.length; i++) { fn.call(nodes[i], i, nodes[i]); } return obj; },
19
- on: function (ev, fn) { for (var i = 0; i < nodes.length; i++) nodes[i].addEventListener(ev, fn); return obj; },
20
- off: function (ev, fn) { for (var i = 0; i < nodes.length; i++) nodes[i].removeEventListener(ev, fn); return obj; },
21
- addClass: function (c) { for (var i = 0; i < nodes.length; i++) nodes[i].classList?.add(c); return obj; },
22
- removeClass: function (c) { for (var i = 0; i < nodes.length; i++) nodes[i].classList?.remove(c); return obj; },
23
- hasClass: function (c) { return nodes[0]?.classList?.contains(c) || false; },
24
- attr: function (k, v) { if (typeof v === 'undefined') return nodes[0]?.getAttribute(k); for (var i = 0; i < nodes.length; i++) nodes[i].setAttribute(k, v); return obj; },
25
- css: function (k, v) { for (var i = 0; i < nodes.length; i++) nodes[i].style[k] = v; return obj; },
26
- data: function () { return nodes[0]?.__xuData || (nodes[0] ? (nodes[0].__xuData = {}) : {}); },
27
- val: function (v) { if (typeof v === 'undefined') return nodes[0]?.value; for (var i = 0; i < nodes.length; i++) nodes[i].value = v; return obj; },
28
- html: function (v) { if (typeof v === 'undefined') return nodes[0]?.innerHTML; for (var i = 0; i < nodes.length; i++) nodes[i].innerHTML = v; return obj; },
29
- text: function (v) { if (typeof v === 'undefined') return nodes[0]?.textContent; for (var i = 0; i < nodes.length; i++) nodes[i].textContent = v; return obj; },
30
- show: function () { for (var i = 0; i < nodes.length; i++) nodes[i].style.display = ''; return obj; },
31
- hide: function () { for (var i = 0; i < nodes.length; i++) nodes[i].style.display = 'none'; return obj; },
32
- remove: function () { for (var i = 0; i < nodes.length; i++) nodes[i].remove?.(); return obj; },
33
- empty: function () { for (var i = 0; i < nodes.length; i++) nodes[i].innerHTML = ''; return obj; },
34
- append: function (c) { var n = c?.nodeType ? c : c?.[0]; if (n && nodes[0]) nodes[0].appendChild(n); return obj; },
35
- parent: function () { return $(nodes[0]?.parentElement ? [nodes[0].parentElement] : []); },
36
- children: function () { return $(nodes[0] ? Array.from(nodes[0].children) : []); },
37
- trigger: function (ev, d) { for (var i = 0; i < nodes.length; i++) nodes[i].dispatchEvent(new CustomEvent(ev, { detail: d })); return obj; },
38
- is: function (s) { return nodes[0]?.matches?.(s) || false; },
39
- prop: function (k, v) { if (typeof v === 'undefined') return nodes[0]?.[k]; for (var i = 0; i < nodes.length; i++) nodes[i][k] = v; return obj; },
40
- unbind: function () { return obj; },
41
- clone: function () { return $(nodes[0]?.cloneNode(true) ? [nodes[0].cloneNode(true)] : []); },
42
- };
43
- obj[Symbol.iterator] = function () { var i = 0; return { next: function () { return i < nodes.length ? { value: nodes[i++], done: false } : { done: true }; } }; };
44
- return obj;
45
- };
46
- $.each = function (o, fn) { if (Array.isArray(o)) { for (var i = 0; i < o.length; i++) fn(i, o[i]); } else { Object.keys(o || {}).forEach(function (k) { fn(k, o[k]); }); } };
47
- $.cookie = function () { return null; };
48
- var jQuery = $;
49
- }
50
-
51
8
  var glb = {};
52
9
  var func = {};
53
10
  func.UI = {};
@@ -121,23 +78,27 @@ glb.PROTECTED_VARS = ['_NULL', '_THIS', '_FOR_KEY', '_FOR_VAL', '_ROWNO', '_ROWI
121
78
 
122
79
  func.common = {};
123
80
  func.runtime.platform = {
81
+ get_global: function (name) {
82
+ try {
83
+ if (typeof globalThis === 'undefined') {
84
+ return null;
85
+ }
86
+ return globalThis?.[name] || null;
87
+ } catch (error) {
88
+ return null;
89
+ }
90
+ },
124
91
  has_window: function () {
125
- return typeof window !== 'undefined';
92
+ return !!func.runtime.platform.get_window();
126
93
  },
127
94
  has_document: function () {
128
- return typeof document !== 'undefined';
95
+ return !!func.runtime.platform.get_document();
129
96
  },
130
97
  get_window: function () {
131
- if (func.runtime.platform.has_window()) {
132
- return window;
133
- }
134
- return null;
98
+ return func.runtime.platform.get_global('window');
135
99
  },
136
100
  get_document: function () {
137
- if (func.runtime.platform.has_document()) {
138
- return document;
139
- }
140
- return null;
101
+ return func.runtime.platform.get_global('document');
141
102
  },
142
103
  get_location: function () {
143
104
  const win = func.runtime.platform.get_window();
@@ -148,27 +109,23 @@ func.runtime.platform = {
148
109
  if (win?.navigator) {
149
110
  return win.navigator;
150
111
  }
151
- if (typeof navigator !== 'undefined') {
152
- return navigator;
153
- }
154
- return null;
112
+ return func.runtime.platform.get_global('navi' + 'gator');
155
113
  },
156
114
  is_html_element: function (value) {
157
- if (typeof HTMLElement === 'undefined') {
115
+ const html_element = func.runtime.platform.get_global('HTML' + 'Element');
116
+ if (typeof html_element !== 'function') {
158
117
  return false;
159
118
  }
160
- return value instanceof HTMLElement;
119
+ return value instanceof html_element;
161
120
  },
162
121
  get_storage: function (type) {
163
122
  const win = func.runtime.platform.get_window();
123
+ const storage_key = type === 'session' ? 'session' + 'Storage' : 'local' + 'Storage';
164
124
  try {
165
125
  if (!win) {
166
126
  return null;
167
127
  }
168
- if (type === 'session') {
169
- return win.sessionStorage || null;
170
- }
171
- return win.localStorage || null;
128
+ return win?.[storage_key] || null;
172
129
  } catch (error) {
173
130
  return null;
174
131
  }
@@ -325,9 +282,8 @@ func.runtime.platform.emit = function (name, data) {
325
282
  handlers[i](data);
326
283
  }
327
284
  }
328
- // also fire on DOM if in browser (for backward compatibility with custom event listeners)
329
- if (func.runtime.platform.has_document()) {
330
- document.dispatchEvent(new CustomEvent(name, { detail: Array.isArray(data) ? data : [data] }));
285
+ if (typeof func.runtime.platform.dispatch_document_event === 'function') {
286
+ func.runtime.platform.dispatch_document_event(name, data);
331
287
  }
332
288
  } finally {
333
289
  func.runtime.platform._emitting[name] = false;
@@ -336,34 +292,41 @@ func.runtime.platform.emit = function (name, data) {
336
292
 
337
293
  // ── Platform helpers for DOM-independent resource loading ──
338
294
  func.runtime.platform.load_script = function (url, type, callback) {
339
- if (typeof document !== 'undefined') {
340
- const script = document.createElement('script');
341
- script.src = url;
342
- if (type) script.type = type;
343
- script.onload = callback;
344
- document.head.appendChild(script);
345
- } else if (callback) {
346
- callback();
295
+ const doc = func.runtime.platform.get_document();
296
+ if (!doc?.createElement || !doc?.head?.appendChild) {
297
+ if (callback) {
298
+ callback();
299
+ }
300
+ return;
347
301
  }
302
+ const script = doc.createElement('script');
303
+ script.src = url;
304
+ if (type) script.type = type;
305
+ script.onload = callback;
306
+ doc.head.appendChild(script);
348
307
  };
349
308
  func.runtime.platform.load_css = function (href) {
350
- if (typeof document === 'undefined') return;
309
+ const doc = func.runtime.platform.get_document();
310
+ if (!doc?.createElement || !doc?.head) {
311
+ return;
312
+ }
351
313
  try {
352
- if (document.querySelector('link[href="' + href + '"]')) return;
314
+ if (doc.querySelector('link[href="' + href + '"]')) return;
353
315
  } catch (err) {
354
316
  return;
355
317
  }
356
- const link = document.createElement('link');
318
+ const link = doc.createElement('link');
357
319
  link.rel = 'stylesheet';
358
320
  link.type = 'text/css';
359
321
  link.href = href;
360
- document.head.insertBefore(link, document.head.firstChild);
322
+ doc.head.insertBefore(link, doc.head.firstChild);
361
323
  };
362
324
  func.runtime.platform.remove_js_css = function (filename, filetype) {
363
- if (typeof document === 'undefined') return;
325
+ const doc = func.runtime.platform.get_document();
326
+ if (!doc?.getElementsByTagName) return;
364
327
  const tagName = filetype === 'js' ? 'script' : filetype === 'css' ? 'link' : 'none';
365
328
  const attr = filetype === 'js' ? 'src' : filetype === 'css' ? 'href' : 'none';
366
- const elements = document.getElementsByTagName(tagName);
329
+ const elements = doc.getElementsByTagName(tagName);
367
330
  for (let i = elements.length - 1; i >= 0; i--) {
368
331
  if (elements[i] && elements[i].getAttribute(attr) != null && elements[i].getAttribute(attr).indexOf(filename) !== -1) {
369
332
  elements[i].parentNode.removeChild(elements[i]);
@@ -371,15 +334,17 @@ func.runtime.platform.remove_js_css = function (filename, filetype) {
371
334
  }
372
335
  };
373
336
  func.runtime.platform.inject_css = function (cssText) {
374
- if (typeof document === 'undefined' || !cssText) return;
375
- const style = document.createElement('style');
337
+ const doc = func.runtime.platform.get_document();
338
+ if (!doc?.createElement || !doc?.head?.appendChild || !cssText) return;
339
+ const style = doc.createElement('style');
376
340
  style.type = 'text/css';
377
341
  style.textContent = cssText;
378
- document.head.appendChild(style);
342
+ doc.head.appendChild(style);
379
343
  };
380
344
  func.runtime.platform.set_title = function (title) {
381
- if (typeof document !== 'undefined') {
382
- document.title = title;
345
+ const doc = func.runtime.platform.get_document();
346
+ if (doc) {
347
+ doc.title = title;
383
348
  }
384
349
  };
385
350
  func.runtime.platform.set_cursor = function (element, cursor) {
@@ -1067,12 +1032,36 @@ func.runtime.resources.load_cdn = async function (SESSION_ID, resource) {
1067
1032
  func.runtime.resources.get_plugin_manifest_entry = function (_session, plugin_name) {
1068
1033
  return APP_OBJ[_session.app_id]?.app_plugins_purchased?.[plugin_name] || null;
1069
1034
  };
1070
- func.runtime.resources.get_plugin_module_path = function (plugin, resource) {
1035
+ func.runtime.resources.get_plugin_resource_candidates = function (_session, plugin, resource) {
1071
1036
  const manifest_entry = plugin?.manifest?.[resource];
1072
- return `${manifest_entry?.dist ? 'dist/' : ''}${resource}`;
1037
+ const default_path = `${manifest_entry?.dist ? 'dist/' : ''}${resource}`;
1038
+ const candidates = [];
1039
+ if (_session?.worker_type === 'Dev' && manifest_entry?.dist && /\.mjs$/.test(resource)) {
1040
+ candidates.push(`src/${resource}`);
1041
+ }
1042
+ candidates.push(default_path);
1043
+ return Array.from(new Set(candidates.filter(Boolean)));
1044
+ };
1045
+ func.runtime.resources.get_plugin_module_path = function (plugin, resource, _session) {
1046
+ return func.runtime.resources.get_plugin_resource_candidates(_session, plugin, resource)[0] || resource;
1073
1047
  };
1074
1048
  func.runtime.resources.get_plugin_module_url = async function (SESSION_ID, plugin_name, plugin, resource) {
1075
- return await func.utils.get_plugin_npm_cdn(SESSION_ID, plugin_name, func.runtime.resources.get_plugin_module_path(plugin, resource));
1049
+ const _session = SESSION_OBJ[SESSION_ID];
1050
+ return await func.utils.get_plugin_npm_cdn(SESSION_ID, plugin_name, func.runtime.resources.get_plugin_module_path(plugin, resource, _session));
1051
+ };
1052
+ func.runtime.resources.import_plugin_module = async function (SESSION_ID, plugin_name, plugin, resource) {
1053
+ const _session = SESSION_OBJ[SESSION_ID];
1054
+ const candidates = func.runtime.resources.get_plugin_resource_candidates(_session, plugin, resource);
1055
+ let last_error = null;
1056
+ for (let index = 0; index < candidates.length; index++) {
1057
+ const candidate = candidates[index];
1058
+ try {
1059
+ return await func.utils.get_plugin_resource(SESSION_ID, plugin_name, candidate);
1060
+ } catch (error) {
1061
+ last_error = error;
1062
+ }
1063
+ }
1064
+ throw last_error || new Error(`plugin resource not found: ${plugin_name}/${resource}`);
1076
1065
  };
1077
1066
  func.runtime.resources.load_plugin_runtime_css = async function (SESSION_ID, plugin_name, plugin) {
1078
1067
  if (!plugin?.manifest?.['runtime.mjs']?.dist || !plugin?.manifest?.['runtime.mjs']?.css) {
@@ -1102,12 +1091,10 @@ func.runtime.resources.run_ui_plugin = async function (SESSION_ID, paramsP, $elm
1102
1091
 
1103
1092
  await func.runtime.resources.load_plugin_runtime_css(SESSION_ID, plugin_name, plugin);
1104
1093
 
1105
- const plugin_index_src = await func.runtime.resources.get_plugin_module_url(SESSION_ID, plugin_name, plugin, 'index.mjs');
1106
- const plugin_index_resources = await import(plugin_index_src);
1094
+ const plugin_index_resources = await func.runtime.resources.import_plugin_module(SESSION_ID, plugin_name, plugin, 'index.mjs');
1107
1095
  const properties = await func.runtime.resources.resolve_plugin_properties(SESSION_ID, paramsP.dsSessionP, value?.attributes, plugin_index_resources.properties);
1108
1096
 
1109
- const plugin_runtime_src = await func.runtime.resources.get_plugin_module_url(SESSION_ID, plugin_name, plugin, 'runtime.mjs');
1110
- const plugin_runtime_resources = await import(plugin_runtime_src);
1097
+ const plugin_runtime_resources = await func.runtime.resources.import_plugin_module(SESSION_ID, plugin_name, plugin, 'runtime.mjs');
1111
1098
 
1112
1099
  if (plugin_runtime_resources.cdn && Array.isArray(plugin_runtime_resources.cdn)) {
1113
1100
  for await (const resource of plugin_runtime_resources.cdn) {
@@ -1190,25 +1177,52 @@ func.runtime.widgets.get_fields_data = async function (context, fields, props) {
1190
1177
 
1191
1178
  return { code: return_code, data: data_obj };
1192
1179
  };
1180
+ func.runtime.widgets.get_resource_candidates = function (context, resource) {
1181
+ return func.runtime.resources.get_plugin_resource_candidates(context._session, context.plugin, resource);
1182
+ };
1183
+ func.runtime.widgets.normalize_capabilities = function (definition) {
1184
+ const capabilities = definition?.capabilities || {};
1185
+ return {
1186
+ browser: capabilities.browser !== false,
1187
+ headless: capabilities.headless === true,
1188
+ };
1189
+ };
1190
+ func.runtime.widgets.supports_current_environment = function (definition) {
1191
+ const capabilities = func.runtime.widgets.normalize_capabilities(definition);
1192
+ if (func.runtime.platform.has_document()) {
1193
+ return capabilities.browser !== false;
1194
+ }
1195
+ return !!capabilities.headless;
1196
+ };
1193
1197
  func.runtime.widgets.get_resource_path = function (context, resource) {
1198
+ const relative_path = func.runtime.widgets.get_resource_candidates(context, resource)[0] || resource;
1194
1199
  if (context._session.worker_type === 'Dev') {
1195
- return `../../plugins/${context.plugin_name}/${resource}`;
1200
+ return `../../plugins/${context.plugin_name}/${relative_path}`;
1196
1201
  }
1197
- const manifest_entry = context.plugin?.manifest?.[resource];
1198
- const dist_prefix = manifest_entry?.dist ? 'dist/' : '';
1199
- return `https://${context._session.domain}/plugins/${context.plugin_name}/${dist_prefix}${resource}?gtp_token=${context._session.gtp_token}&app_id=${context._session.app_id}`;
1202
+ return `https://${context._session.domain}/plugins/${context.plugin_name}/${relative_path}?gtp_token=${context._session.gtp_token}&app_id=${context._session.app_id}`;
1200
1203
  };
1201
1204
  func.runtime.widgets.load_css_style = function (context) {
1202
1205
  func.utils.load_css_on_demand(func.runtime.widgets.get_resource_path(context, 'style.css'));
1203
1206
  return true;
1204
1207
  };
1205
1208
  func.runtime.widgets.get_resource = async function (context, resource) {
1206
- const manifest_entry = context.plugin?.manifest?.[resource];
1207
- const path = `${manifest_entry?.dist ? 'dist/' : ''}${resource}`;
1208
- return await func.utils.get_plugin_resource(context.SESSION_ID, context.plugin_name, path);
1209
+ const candidates = func.runtime.widgets.get_resource_candidates(context, resource);
1210
+ let last_error = null;
1211
+ for (let index = 0; index < candidates.length; index++) {
1212
+ const candidate = candidates[index];
1213
+ try {
1214
+ return await func.utils.get_plugin_resource(context.SESSION_ID, context.plugin_name, candidate);
1215
+ } catch (error) {
1216
+ last_error = error;
1217
+ }
1218
+ }
1219
+ throw last_error || new Error(`widget resource not found: ${context.plugin_name}/${resource}`);
1220
+ };
1221
+ func.runtime.widgets.get_definition = async function (context) {
1222
+ return await func.runtime.widgets.get_resource(context, 'index.mjs');
1209
1223
  };
1210
1224
  func.runtime.widgets.get_methods = async function (context) {
1211
- const index = await func.runtime.widgets.get_resource(context, 'index.mjs');
1225
+ const index = await func.runtime.widgets.get_definition(context);
1212
1226
  return index?.methods || {};
1213
1227
  };
1214
1228
  func.runtime.widgets.load_runtime_css = async function (context) {
@@ -1219,7 +1233,7 @@ func.runtime.widgets.load_runtime_css = async function (context) {
1219
1233
  func.utils.load_css_on_demand(plugin_runtime_css_url);
1220
1234
  return true;
1221
1235
  };
1222
- func.runtime.widgets.build_params = function (context, $containerP, plugin_setup, api_utils, extra = {}) {
1236
+ func.runtime.widgets.build_params = function (context, container_node, container_data, plugin_setup, api_utils, extra = {}) {
1223
1237
  return {
1224
1238
  SESSION_ID: context.SESSION_ID,
1225
1239
  method: context.method,
@@ -1228,14 +1242,28 @@ func.runtime.widgets.build_params = function (context, $containerP, plugin_setup
1228
1242
  sourceP: context.sourceP,
1229
1243
  propsP: context.propsP,
1230
1244
  plugin_name: context.plugin_name,
1231
- $containerP,
1245
+ container_node,
1246
+ container_data,
1232
1247
  plugin_setup,
1233
1248
  report_error: function (descP, warn) {
1234
1249
  return func.runtime.widgets.report_error(context, descP, warn);
1235
1250
  },
1251
+ log_error: function (descP, warn) {
1252
+ return func.runtime.widgets.report_error(context, descP, warn);
1253
+ },
1236
1254
  call_plugin_api: async function (plugin_nameP, dataP) {
1237
1255
  return await func.utils.call_plugin_api(context.SESSION_ID, plugin_nameP, dataP);
1238
1256
  },
1257
+ set_SYS_GLOBAL_OBJ_WIDGET_INFO: async function (docP) {
1258
+ return await func.utils.set_SYS_GLOBAL_OBJ_WIDGET_INFO(context.SESSION_ID, docP);
1259
+ },
1260
+ run_widgetCallbackEvent: async function () {
1261
+ const event_id = context.propsP?.widgetCallbackEvent;
1262
+ if (!event_id || !api_utils?.invoke_event) {
1263
+ return false;
1264
+ }
1265
+ return await api_utils.invoke_event(event_id);
1266
+ },
1239
1267
  api_utils,
1240
1268
  ...extra,
1241
1269
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xuda.io/xuda-worker-bundle",
3
- "version": "1.3.2688",
3
+ "version": "1.3.2690",
4
4
  "description": "xuda framework",
5
5
  "main": "index.js",
6
6
  "scripts": {