@abtnode/ux 1.8.26 → 1.8.28

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 (88) hide show
  1. package/lib/actions.js +109 -0
  2. package/lib/blocklet/actions.js +437 -0
  3. package/lib/blocklet/audit-logs.js +194 -0
  4. package/lib/blocklet/avatar.js +96 -0
  5. package/lib/blocklet/blocklet-source.js +56 -0
  6. package/lib/blocklet/component/configuration.js +124 -0
  7. package/lib/blocklet/component/delete.js +115 -0
  8. package/lib/blocklet/component/environment.js +277 -0
  9. package/lib/blocklet/component/index.js +742 -0
  10. package/lib/blocklet/component/setting.js +135 -0
  11. package/lib/blocklet/configuration.js +463 -0
  12. package/lib/blocklet/disk-info.js +89 -0
  13. package/lib/blocklet/icons.js +26 -0
  14. package/lib/blocklet/log.js +55 -0
  15. package/lib/blocklet/mode.js +33 -0
  16. package/lib/blocklet/overview.js +184 -0
  17. package/lib/blocklet/runtime-info.js +85 -0
  18. package/lib/blocklet/status.js +103 -0
  19. package/lib/blocklet/util.js +119 -0
  20. package/lib/blocklet/version.js +178 -0
  21. package/lib/card-selector.js +9 -22
  22. package/lib/click-to-copy.js +36 -0
  23. package/lib/confirm.js +149 -0
  24. package/lib/contexts/audit-log.js +141 -0
  25. package/lib/contexts/deleting-blocklets.js +78 -0
  26. package/lib/contexts/node.js +28 -0
  27. package/lib/contexts/session.js +20 -0
  28. package/lib/contexts/team.js +19 -0
  29. package/lib/did-address.js +75 -0
  30. package/lib/dot.js +18 -0
  31. package/lib/form/form-text-input.js +12 -38
  32. package/lib/form/form-wrapper.js +0 -7
  33. package/lib/form/required.js +0 -6
  34. package/lib/hooks/mobile-width.js +19 -0
  35. package/lib/hooks/use-passport-id.js +0 -5
  36. package/lib/icons/long-arrow.svg +5 -0
  37. package/lib/index.js +0 -3
  38. package/lib/invitation/invitation-app.js +3 -21
  39. package/lib/invitation/invitation-passport.js +2 -16
  40. package/lib/invitation/invitation-receive.js +2 -19
  41. package/lib/invitation/invitation-user.js +0 -16
  42. package/lib/invitation/invitation.js +0 -23
  43. package/lib/issue-passport.js +2 -31
  44. package/lib/launch-blocklet/content-layout.js +3 -19
  45. package/lib/launch-blocklet/page-header.js +0 -9
  46. package/lib/layout/addon.js +0 -24
  47. package/lib/locales/en.js +1046 -38
  48. package/lib/locales/index.js +0 -3
  49. package/lib/locales/zh.js +1049 -36
  50. package/lib/logs/clock.js +19 -0
  51. package/lib/logs/log-terminal.js +172 -0
  52. package/lib/lost-passport.js +6 -51
  53. package/lib/nav-logo.js +12 -33
  54. package/lib/passport-tag.js +41 -0
  55. package/lib/permission.js +68 -0
  56. package/lib/relative-time.js +61 -0
  57. package/lib/schema-form/color-input.js +2 -15
  58. package/lib/schema-form/common-prop-types.js +0 -3
  59. package/lib/schema-form/index.js +8 -45
  60. package/lib/schema-form/passport-input.js +6 -24
  61. package/lib/schema-form/text-input.js +9 -26
  62. package/lib/table-icons.js +42 -0
  63. package/lib/table.js +13 -0
  64. package/lib/tag.js +35 -0
  65. package/lib/team/members/actions.js +99 -0
  66. package/lib/team/members/index.js +476 -0
  67. package/lib/team/members/invitations.js +196 -0
  68. package/lib/team/members/invite-member.js +212 -0
  69. package/lib/team/members/issue-passport.js +155 -0
  70. package/lib/team/members/member.js +294 -0
  71. package/lib/team/members/passport-issuances.js +154 -0
  72. package/lib/team/members/passports.js +329 -0
  73. package/lib/team/members/toggle-user-approval.js +128 -0
  74. package/lib/team/members/transfer-node.js +262 -0
  75. package/lib/team/members/util.js +20 -0
  76. package/lib/team/passports/detail.js +261 -0
  77. package/lib/team/passports/index.js +220 -0
  78. package/lib/team/passports/mutate-role.js +204 -0
  79. package/lib/team/passports/trusted-issuer.js +295 -0
  80. package/lib/team/passports/trusted-issuers.js +238 -0
  81. package/lib/team/search-input.js +36 -0
  82. package/lib/team/styles/dialog.js +13 -0
  83. package/lib/team/styles/list-header.js +13 -0
  84. package/lib/toast.js +4 -19
  85. package/lib/util/index.js +504 -38
  86. package/lib/who-can-access/config.js +0 -6
  87. package/lib/wrap-locale.js +0 -7
  88. package/package.json +43 -20
package/lib/util/index.js CHANGED
@@ -3,135 +3,144 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.checkIsWildcardDomain = exports.checkInputByType = exports.appendParams = exports.BlockletAdminRoles = exports.APP_PREFIX = void 0;
7
+ exports.deepDecodeURIComponent = deepDecodeURIComponent;
8
+ exports.extractStatusUrlFromNextWorkflow = extractStatusUrlFromNextWorkflow;
6
9
  exports.formatDateTime = formatDateTime;
10
+ exports.formatError = exports.formatDiskSize = void 0;
11
+ exports.formatFactoryPrice = formatFactoryPrice;
12
+ exports.formatRegistryScreenshotPath = exports.formatRegistryLogoPath = exports.formatPerson = exports.formatLocale = void 0;
13
+ exports.formatTime = formatTime;
14
+ exports.formatTimeFromNow = formatTimeFromNow;
15
+ exports.formatTimestamp = formatTimestamp;
16
+ exports.formatToDate = formatToDate;
17
+ exports.formatToDatetime = formatToDatetime;
18
+ exports.formatUrl = void 0;
7
19
  exports.getAccessUrl = getAccessUrl;
20
+ exports.getAccessibleUrl = void 0;
21
+ exports.getAsset = getAsset;
22
+ exports.getAssetExpiration = getAssetExpiration;
23
+ exports.getBlockletLogoUrl = void 0;
24
+ exports.getBlockletMetaUrl = getBlockletMetaUrl;
25
+ exports.getEndPoint = exports.getBlockletUrlParams = exports.getBlockletServices = void 0;
8
26
  exports.getExplorerLink = getExplorerLink;
27
+ exports.getPathPrefix = exports.getIssuePassportLink = exports.getInviteLink = void 0;
28
+ exports.getRelativeTime = getRelativeTime;
29
+ exports.getWebWalletUrl = getWebWalletUrl;
30
+ exports.isNewRegistryUrl = exports.isInstalling = exports.isInProgress = exports.isDownloading = exports.isChrome = exports.isCertificateMatch = exports.isBlockletDev = void 0;
31
+ exports.isProtectedRole = isProtectedRole;
32
+ exports.isUrlAccessible = exports.isSafari = void 0;
33
+ exports.isValidClusterSize = isValidClusterSize;
34
+ exports.parseQuery = void 0;
9
35
  exports.patchJsxToLocale = patchJsxToLocale;
36
+ exports.shouldCheckDomainStatus = void 0;
10
37
  exports.sleep = sleep;
11
- exports.validateDomain = void 0;
12
-
38
+ exports.validateDomain = exports.stringSortHandlerAsc = void 0;
13
39
  var _constant = require("@abtnode/constant");
14
-
15
40
  var _dayjs = _interopRequireDefault(require("dayjs"));
16
-
41
+ require("moment/locale/zh-cn");
42
+ var _querystring = _interopRequireDefault(require("querystring"));
43
+ var _isUrl = _interopRequireDefault(require("is-url"));
44
+ var _moment = _interopRequireDefault(require("moment"));
45
+ var _humanizeUrl = _interopRequireDefault(require("humanize-url"));
46
+ var _filesize = _interopRequireDefault(require("filesize"));
47
+ var _urlJoin = _interopRequireDefault(require("url-join"));
48
+ var _get = _interopRequireDefault(require("lodash/get"));
49
+ var _last = _interopRequireDefault(require("lodash/last"));
50
+ var _trimEnd = _interopRequireDefault(require("lodash/trimEnd"));
51
+ var _constant2 = require("@blocklet/constant");
52
+ var _urlEvaluation = require("@abtnode/util/lib/url-evaluation");
53
+ var _checkAccessibleBrowser = _interopRequireDefault(require("@abtnode/util/lib/url-evaluation/check-accessible-browser"));
54
+ var _axios = _interopRequireDefault(require("@abtnode/util/lib/axios"));
55
+ var _window$env;
17
56
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
-
19
57
  function sleep(t) {
20
58
  // eslint-disable-next-line no-promise-executor-return
21
59
  return new Promise(resolve => setTimeout(resolve, t));
22
60
  }
23
-
24
61
  const validateDomain = function validateDomain(domain) {
25
62
  let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
26
-
27
63
  if (!domain) {
28
64
  return {
29
65
  en: 'Site domain cannot be empty',
30
66
  zh: '站点域名不能为空'
31
67
  }[locale];
32
68
  }
33
-
34
69
  if (domain.endsWith(_constant.DEFAULT_IP_DOMAIN_SUFFIX)) {
35
70
  return {
36
71
  en: "Site domain cannot include ".concat(_constant.DEFAULT_IP_DOMAIN_SUFFIX),
37
72
  zh: "\u7AD9\u70B9\u57DF\u540D\u4E0D\u80FD\u5305\u542B ".concat(_constant.DEFAULT_IP_DOMAIN_SUFFIX)
38
73
  }[locale];
39
74
  }
40
-
41
75
  return null;
42
76
  };
77
+
43
78
  /**
44
79
  * get access url
45
80
  * auto fix http/https, port, query
46
81
  * docker friendly
47
82
  */
48
-
49
-
50
83
  exports.validateDomain = validateDomain;
51
-
52
84
  function getAccessUrl(hostname) {
53
85
  let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
54
86
  let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
55
-
56
87
  if (!hostname) {
57
88
  return '';
58
89
  }
59
-
60
90
  let protocol = 'http';
61
-
62
91
  if (window.location.protocol === 'https:') {
63
92
  if (hostname.endsWith(_constant.DEFAULT_IP_DOMAIN_SUFFIX)) {
64
93
  protocol = 'https';
65
94
  }
66
-
67
95
  if (hostname.endsWith(_constant.DEFAULT_DID_DOMAIN)) {
68
96
  protocol = 'https';
69
97
  }
70
98
  }
71
-
72
99
  let port = '';
73
100
  const browserPort = Number(window.location.port);
74
-
75
101
  if (process.env.NODE_ENV !== 'development' && browserPort && ![80, 443].includes(browserPort)) {
76
102
  port = ":".concat(browserPort);
77
103
  }
78
-
79
104
  const urlObj = new URL("".concat(protocol, "://").concat(hostname).concat(port));
80
105
  urlObj.pathname = path;
81
106
  const url = urlObj.href.replace(/\/$/, '');
82
-
83
107
  if (!params || !Object.keys(params)) {
84
108
  return url;
85
109
  }
86
-
87
110
  const searchParams = new URLSearchParams();
88
111
  Object.keys(params).forEach(key => {
89
112
  searchParams.append(key, params[key]);
90
113
  });
91
114
  return "".concat(url, "?").concat(searchParams.toString());
92
115
  }
93
-
94
- function formatDateTime(date) {
95
- return (0, _dayjs.default)(date).format('YYYY-MM-DD HH:mm');
96
- }
97
-
98
116
  function getExplorerLink(chainHost, did, type) {
99
117
  if (!chainHost) return undefined;
100
-
101
118
  try {
102
119
  const chainUrl = new URL(chainHost);
103
-
104
120
  switch (type) {
105
121
  case 'account':
106
122
  chainUrl.pathname = "/explorer/accounts/".concat(did);
107
123
  break;
108
-
109
124
  case 'tx':
110
125
  chainUrl.pathname = "/explorer/txs/".concat(did);
111
126
  break;
112
-
113
127
  case 'token':
114
128
  chainUrl.pathname = "/explorer/tokens/".concat(did);
115
129
  break;
116
-
117
130
  case 'factory':
118
131
  chainUrl.pathname = "/explorer/factories/".concat(did);
119
132
  break;
120
-
121
133
  case 'bridge':
122
134
  chainUrl.pathname = "/explorer/bridges/".concat(did);
123
135
  break;
124
-
125
136
  default:
126
137
  chainUrl.pathname = '/';
127
138
  }
128
-
129
139
  return chainUrl.href;
130
140
  } catch (_unused) {
131
141
  return undefined;
132
142
  }
133
143
  }
134
-
135
144
  function patchJsxToLocale(rawStr) {
136
145
  let replaceMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
137
146
  return rawStr.split(/{{|}}/).map(item => {
@@ -139,10 +148,467 @@ function patchJsxToLocale(rawStr) {
139
148
  if (replaceMap[item] instanceof Function) {
140
149
  return replaceMap[item]();
141
150
  }
142
-
143
151
  return replaceMap[item];
144
152
  }
145
-
146
153
  return item;
147
154
  }).filter(Boolean);
148
- }
155
+ }
156
+ function formatTimestamp(ts) {
157
+ if (!ts) {
158
+ return '-';
159
+ }
160
+ let date;
161
+ if (Number(ts).toString() === ts) {
162
+ date = new Date();
163
+ date.setTime(ts);
164
+ } else {
165
+ date = new Date(ts);
166
+ }
167
+ return date.toLocaleString();
168
+ }
169
+ function formatToDate(date) {
170
+ if (!date) {
171
+ return '-';
172
+ }
173
+ return (0, _moment.default)(date).format('ll');
174
+ }
175
+ function formatToDatetime(date) {
176
+ if (!date) {
177
+ return '-';
178
+ }
179
+ return (0, _moment.default)(date).format('lll');
180
+ }
181
+ function formatTimeFromNow(date) {
182
+ if (!date) {
183
+ return '-';
184
+ }
185
+ const startDate = (0, _moment.default)(date);
186
+ const endDate = (0, _moment.default)();
187
+ const diffDay = endDate.diff(startDate, 'day');
188
+ return diffDay > 3 ? formatToDate(date) : startDate.fromNow();
189
+ }
190
+ function formatTime(date) {
191
+ let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'lll';
192
+ if (!date) {
193
+ return '-';
194
+ }
195
+ return (0, _moment.default)(date).format(format);
196
+ }
197
+ function formatDateTime(date) {
198
+ return (0, _dayjs.default)(date).format('YYYY-MM-DD HH:mm');
199
+ }
200
+ const formatError = error => {
201
+ if (Array.isArray(error.errors)) {
202
+ return error.errors.map(x => x.message).join('\n');
203
+ }
204
+ return error.message;
205
+ };
206
+ exports.formatError = formatError;
207
+ const formatLocale = function formatLocale() {
208
+ let locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en';
209
+ if (locale === 'zh') {
210
+ return 'zh_CN';
211
+ }
212
+ return locale;
213
+ };
214
+ exports.formatLocale = formatLocale;
215
+ const parseQuery = str => str.replace(/^\?/, '').split('&').map(x => x.split('=')).filter(_ref => {
216
+ let [key] = _ref;
217
+ return !!key;
218
+ }).reduce((memo, x) => {
219
+ const key = x[0];
220
+ const value = decodeURIComponent(x[1]) || true;
221
+ memo[key] = value;
222
+ return memo;
223
+ }, {});
224
+
225
+ // Append any query string url to api requests
226
+ exports.parseQuery = parseQuery;
227
+ const appendParams = function appendParams(url) {
228
+ let extraParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
229
+ const [pathname, query = ''] = url.split('?');
230
+ const oldParams = parseQuery(query);
231
+ const params = Object.assign({}, oldParams, extraParams);
232
+ return "".concat(pathname, "?").concat(_querystring.default.stringify(params));
233
+ };
234
+ exports.appendParams = appendParams;
235
+ const isInProgress = status => ['waiting', 'downloading', 'starting', 'installing', 'stopping', 'upgrading', 'restarting', 'deleting'].includes(status);
236
+ exports.isInProgress = isInProgress;
237
+ const isInstalling = status => ['waiting', 'downloading', 'installing', 'upgrading'].includes(status);
238
+ exports.isInstalling = isInstalling;
239
+ const isDownloading = status => ['waiting', 'downloading'].includes(status);
240
+ exports.isDownloading = isDownloading;
241
+ const formatDiskSize = function formatDiskSize(size) {
242
+ let serverPlatform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
243
+ const base = serverPlatform === 'linux' ? 2 : 10;
244
+ return (0, _filesize.default)(size, {
245
+ base,
246
+ round: 2
247
+ });
248
+ };
249
+ exports.formatDiskSize = formatDiskSize;
250
+ const checkInputByType = (type, value) => {
251
+ const typesMap = {
252
+ url: _isUrl.default
253
+ };
254
+ if (!type) {
255
+ return true;
256
+ }
257
+ if (typesMap[type]) {
258
+ return typesMap[type](value);
259
+ }
260
+ return false;
261
+ };
262
+ exports.checkInputByType = checkInputByType;
263
+ const formatUrl = url => (0, _humanizeUrl.default)(url.split('?').shift());
264
+ exports.formatUrl = formatUrl;
265
+ const formatPerson = person => {
266
+ if (!person) {
267
+ return '-';
268
+ }
269
+ if (typeof person === 'string') {
270
+ return person;
271
+ }
272
+ const name = person.name || '';
273
+ const u = person.url || person.web;
274
+ const url = u ? " (".concat(u, ")") : '';
275
+ const e = person.email || person.mail;
276
+ const email = e ? " <".concat(e, ">") : '';
277
+ return name + email + url;
278
+ };
279
+ exports.formatPerson = formatPerson;
280
+ const getBlockletServices = blocklet => {
281
+ const services = [];
282
+ const interfaces = (blocklet.meta.interfaces || []).filter(x => x.type === _constant2.BLOCKLET_INTERFACE_TYPE_SERVICE);
283
+ interfaces.forEach(x => {
284
+ services.push({
285
+ name: x.name,
286
+ protocol: x.protocol,
287
+ port: Number(x.port.external),
288
+ upstreamPort: Number(blocklet.ports[x.port.internal])
289
+ });
290
+ });
291
+ return services;
292
+ };
293
+ exports.getBlockletServices = getBlockletServices;
294
+ const shouldCheckDomainStatus = domain => domain &&
295
+ // eslint-disable-line
296
+ ![_constant.DOMAIN_FOR_IP_SITE, _constant.DOMAIN_FOR_IP_SITE_REGEXP, _constant.DOMAIN_FOR_DEFAULT_SITE, _constant.DOMAIN_FOR_INTERNAL_SITE].includes(domain);
297
+ exports.shouldCheckDomainStatus = shouldCheckDomainStatus;
298
+ const checkIsWildcardDomain = url => {
299
+ try {
300
+ if (!url) {
301
+ return false;
302
+ }
303
+ const tempUrl = url.startsWith('http') ? url : "http://".concat(url);
304
+ const urlObj = new window.URL(tempUrl);
305
+ return decodeURIComponent(urlObj.host).split('.').some(x => x === '*');
306
+ } catch (error) {
307
+ console.error(url, error);
308
+ return false;
309
+ }
310
+ };
311
+ exports.checkIsWildcardDomain = checkIsWildcardDomain;
312
+ const stringSortHandlerAsc = function stringSortHandlerAsc() {
313
+ let strA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
314
+ let strB = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
315
+ if (strA > strB) {
316
+ return 1;
317
+ }
318
+ if (strB > strA) {
319
+ return -1;
320
+ }
321
+ return 0;
322
+ };
323
+ exports.stringSortHandlerAsc = stringSortHandlerAsc;
324
+ const getEndPoint = nodeInfo => {
325
+ const {
326
+ routing
327
+ } = nodeInfo;
328
+ const {
329
+ protocol,
330
+ hostname,
331
+ origin,
332
+ port
333
+ } = window.location;
334
+ let endpoint = "".concat(origin).concat(routing.adminPath);
335
+ if (process.env.NODE_ENV === 'development') {
336
+ endpoint = "".concat(protocol, "//").concat(hostname, ":").concat(port);
337
+ }
338
+ return endpoint;
339
+ };
340
+ exports.getEndPoint = getEndPoint;
341
+ const getInviteLink = _ref2 => {
342
+ let {
343
+ inviteId,
344
+ endpoint
345
+ } = _ref2;
346
+ if (!endpoint) {
347
+ return '';
348
+ }
349
+ const u = new URL(endpoint);
350
+ u.pathname = (0, _urlJoin.default)(u.pathname, _constant.WELLKNOWN_SERVICE_PATH_PREFIX, 'invite');
351
+ u.searchParams.set('inviteId', inviteId);
352
+ return u.href;
353
+ };
354
+ exports.getInviteLink = getInviteLink;
355
+ const getIssuePassportLink = _ref3 => {
356
+ let {
357
+ id,
358
+ endpoint
359
+ } = _ref3;
360
+ if (!endpoint) {
361
+ return '';
362
+ }
363
+ const u = new URL(endpoint);
364
+ u.pathname = (0, _urlJoin.default)(u.pathname, _constant.WELLKNOWN_SERVICE_PATH_PREFIX, 'issue-passport');
365
+ u.searchParams.set('id', id);
366
+ return u.href;
367
+ };
368
+ exports.getIssuePassportLink = getIssuePassportLink;
369
+ const formatRegistryScreenshotPath = (did, asset) => {
370
+ if (asset.startsWith('/assets')) {
371
+ return asset;
372
+ }
373
+ return "/assets/".concat(did, "/screenshots/").concat(asset);
374
+ };
375
+ exports.formatRegistryScreenshotPath = formatRegistryScreenshotPath;
376
+ const formatRegistryLogoPath = (did, asset) => {
377
+ if (asset.startsWith('/assets')) {
378
+ return asset;
379
+ }
380
+ return "/assets/".concat(did, "/").concat(asset);
381
+ };
382
+ exports.formatRegistryLogoPath = formatRegistryLogoPath;
383
+ function getWebWalletUrl(info) {
384
+ try {
385
+ const url = window.localStorage.getItem('wallet_url');
386
+ if (url) {
387
+ return url;
388
+ }
389
+ } catch (err) {
390
+ // Do nothing
391
+ }
392
+ return info && info.webWalletUrl ? info.webWalletUrl : '';
393
+ }
394
+ function isValidClusterSize(data) {
395
+ const {
396
+ value,
397
+ cpuCores
398
+ } = data;
399
+ if (!value) {
400
+ return '';
401
+ }
402
+ const v = Number(value);
403
+ if (Number.isNaN(v)) {
404
+ return 'Cluster size should be a number';
405
+ }
406
+ if (!Number.isInteger(v)) {
407
+ return 'Cluster size should be integer';
408
+ }
409
+ if (v <= 0 || v > cpuCores) {
410
+ return "Cluster size should between 1 to ".concat(cpuCores);
411
+ }
412
+ return '';
413
+ }
414
+ function isProtectedRole(role) {
415
+ return Object.values(_constant.ROLES).includes(role);
416
+ }
417
+ function formatFactoryPrice(blocklet) {
418
+ var _blocklet$payment;
419
+ if (!(blocklet !== null && blocklet !== void 0 && blocklet.payment)) {
420
+ return [];
421
+ }
422
+ const list = (((_blocklet$payment = blocklet.payment) === null || _blocklet$payment === void 0 ? void 0 : _blocklet$payment.price) || []).map(item => ({
423
+ name: item.symbol,
424
+ value: item.value
425
+ }));
426
+ return list;
427
+ }
428
+ const getBlockletLogoUrl = _ref4 => {
429
+ let {
430
+ did,
431
+ baseUrl,
432
+ logoPath
433
+ } = _ref4;
434
+ if (baseUrl.startsWith('http') && logoPath) {
435
+ return (0, _urlJoin.default)(baseUrl, formatRegistryLogoPath(did, logoPath));
436
+ }
437
+ const prefix = window.env.apiPrefix || '/';
438
+ let apiPrefix = prefix.replace(/^\/+/, '').replace(/\/+$/, '');
439
+ if (apiPrefix) {
440
+ apiPrefix = "/".concat(apiPrefix);
441
+ }
442
+ return (0, _urlJoin.default)(apiPrefix, "/blocklet/logo/".concat(did));
443
+ };
444
+ exports.getBlockletLogoUrl = getBlockletLogoUrl;
445
+ const getPathPrefix = () => window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';
446
+ exports.getPathPrefix = getPathPrefix;
447
+ const isUrlAccessible = async url => (0, _checkAccessibleBrowser.default)((0, _urlJoin.default)(new URL(url).origin, _constant.WELLKNOWN_PING_PREFIX));
448
+ exports.isUrlAccessible = isUrlAccessible;
449
+ const getAccessibleUrl = async urls => {
450
+ try {
451
+ const res = await (0, _urlEvaluation.evaluateURLs)(urls);
452
+ return res[0].url;
453
+ } catch (error) {
454
+ console.warn('get accessible url failed');
455
+ return '';
456
+ }
457
+ };
458
+
459
+ /**
460
+ * 检查证书是否与 blocklet 匹配
461
+ * @param {string[]} blockletUrls - 通过 blocklet#interfaces#url 获取到的一组 url
462
+ * @param {object[]} matchedSites - 通过 certificate#matchedSites 获取到的一组 site
463
+ * @returns {boolean} - 匹配则返回 true
464
+ */
465
+ exports.getAccessibleUrl = getAccessibleUrl;
466
+ const isCertificateMatch = function isCertificateMatch() {
467
+ let blockletUrls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
468
+ let matchedSites = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
469
+ try {
470
+ return matchedSites.map(item => item.domain).some(domain => {
471
+ return blockletUrls.some(blockletUrl => {
472
+ const url = new window.URL(blockletUrl);
473
+ return url.hostname === domain;
474
+ });
475
+ });
476
+ } catch (e) {
477
+ console.warn('domain match failed');
478
+ return false;
479
+ }
480
+ };
481
+ exports.isCertificateMatch = isCertificateMatch;
482
+ const getBlockletUrlParams = (blocklet, locale) => (blocklet || {}).status === 'running' ? {
483
+ locale
484
+ } : {
485
+ locale,
486
+ __start__: 1
487
+ };
488
+
489
+ /**
490
+ * 判断是否在safari浏览器中
491
+ * 不传的ua情况下,使用当前页面的ua
492
+ * chrome浏览器的ua也会带有 Safari 字样,所以要排除 Chrome 字符串
493
+ * iPhone 设备下,所有浏览器都是 safari 的 webkit
494
+ * @param {String} ua userAgent 字符串
495
+ * @returns bool
496
+ */
497
+ exports.getBlockletUrlParams = getBlockletUrlParams;
498
+ const isSafari = function isSafari() {
499
+ let ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator.userAgent;
500
+ return ua.includes('iPhone') || ua.includes('Safari') && !ua.includes('Chrome');
501
+ };
502
+ exports.isSafari = isSafari;
503
+ const isChrome = function isChrome() {
504
+ let ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator.userAgent;
505
+ return ua.includes('Chrome');
506
+ };
507
+
508
+ /**
509
+ *
510
+ * @export
511
+ * @param {string} url
512
+ * @return {string}
513
+ */
514
+ exports.isChrome = isChrome;
515
+ function deepDecodeURIComponent(url) {
516
+ let lastDecodeUrl = decodeURIComponent(url);
517
+ while (lastDecodeUrl !== decodeURIComponent(lastDecodeUrl)) {
518
+ lastDecodeUrl = decodeURIComponent(lastDecodeUrl);
519
+ }
520
+ return lastDecodeUrl;
521
+ }
522
+
523
+ /**
524
+ *
525
+ * @description 已知nextWorkflow的地址,提取它的statusUrl和token
526
+ * @export
527
+ * @param {string} nextWorkflow
528
+ * @returns {{
529
+ * statusUrl: string;
530
+ * token: string;
531
+ * }}
532
+ */
533
+ function extractStatusUrlFromNextWorkflow(nextWorkflow) {
534
+ const nextWorkflowURL = new URL(deepDecodeURIComponent(nextWorkflow)).searchParams.get('url');
535
+ return {
536
+ statusUrl: nextWorkflowURL.replace('/auth?', '/status?'),
537
+ token: new URL(nextWorkflowURL).searchParams.get('_t_')
538
+ };
539
+ }
540
+ function getBlockletMetaUrl(registry, did) {
541
+ return (0, _urlJoin.default)(registry, "/api/blocklets/".concat(did, "/blocklet.json?source=webapp"));
542
+ }
543
+ async function getAsset(chainHost, address) {
544
+ const result = await _axios.default.post((0, _urlJoin.default)(chainHost, '/api/gql/'), JSON.stringify({
545
+ query: "{\n getAssetState(address: \"".concat(address, "\") {\n state {\n address\n data {\n typeUrl\n value\n }\n issuer\n owner\n parent\n }\n }\n }")
546
+ }), {
547
+ headers: {
548
+ 'Content-Type': 'application/json',
549
+ Accept: 'application/json'
550
+ },
551
+ timeout: 60 * 1000
552
+ });
553
+ const state = (0, _get.default)(result.data, 'data.getAssetState.state');
554
+ if (state && state.data.typeUrl === 'json') {
555
+ state.data.value = JSON.parse(state.data.value);
556
+ }
557
+ return state;
558
+ }
559
+ async function getAssetExpiration(chainHost, address) {
560
+ const asset = await getAsset(chainHost, address);
561
+ return (0, _last.default)((0, _get.default)(asset, 'data.value.expirationDate', []));
562
+ }
563
+ function getRelativeTime(datetime) {
564
+ let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
565
+ return (0, _moment.default)(datetime).locale(formatLocale(locale)).fromNow().toString();
566
+ }
567
+
568
+ /**
569
+ * 检查url是否 未添加到 store registryList 中
570
+ * @param {string} url - 需要检查的url
571
+ * @param {object[]} blockletRegistryList - 后端的store registryList, 一般是 info.blockletRegistryList
572
+ * @returns {Object.freeze({
573
+ * isNew: boolean;
574
+ * decoded: string;
575
+ * })} - 返回判断是否是新的url和解码后的url
576
+ */
577
+ const isNewRegistryUrl = (url, blockletRegistryList) => {
578
+ if (typeof url === 'string') {
579
+ let decoded = decodeURIComponent(url === null || url === void 0 ? void 0 : url.trim());
580
+ const regex = /^https?:\/\//;
581
+ if (!regex.test(decoded)) {
582
+ decoded = "https://".concat(decoded);
583
+ }
584
+ decoded = (0, _trimEnd.default)(decoded, '/');
585
+
586
+ // validate
587
+ try {
588
+ new URL(decoded); // eslint-disable-line no-new
589
+ } catch (_unused2) {
590
+ throw new Error('Invalid Blocklet Store URL');
591
+ }
592
+ if (blockletRegistryList !== null && blockletRegistryList !== void 0 && blockletRegistryList.some(item => [url, decoded].includes(item.url))) {
593
+ return {
594
+ isNew: false,
595
+ decoded
596
+ };
597
+ }
598
+ return {
599
+ isNew: true,
600
+ decoded
601
+ };
602
+ }
603
+ return {
604
+ isNew: false,
605
+ decoded: ''
606
+ };
607
+ };
608
+ exports.isNewRegistryUrl = isNewRegistryUrl;
609
+ const isBlockletDev = blocklet => blocklet.mode === _constant2.BLOCKLET_MODES.DEVELOPMENT;
610
+ exports.isBlockletDev = isBlockletDev;
611
+ const APP_PREFIX = ((_window$env = window.env) === null || _window$env === void 0 ? void 0 : _window$env.groupPathPrefix) || '/';
612
+ exports.APP_PREFIX = APP_PREFIX;
613
+ const BlockletAdminRoles = [_constant.ROLES.ADMIN, _constant.ROLES.OWNER];
614
+ exports.BlockletAdminRoles = BlockletAdminRoles;
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _Lock = _interopRequireDefault(require("@mui/icons-material/Lock"));
9
-
10
8
  var _ContactMail = _interopRequireDefault(require("@mui/icons-material/ContactMail"));
11
-
12
9
  var _Group = _interopRequireDefault(require("@mui/icons-material/Group"));
13
-
14
10
  var _constant = require("@abtnode/constant");
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
12
  var _default = [{
19
13
  value: _constant.WHO_CAN_ACCESS.OWNER,
20
14
  icon: _Lock.default,
@@ -4,19 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = wrapLocale;
7
-
8
7
  var _context = require("@arcblock/ux/lib/Locale/context");
9
-
10
8
  var _locales = require("./locales");
11
-
12
9
  var _jsxRuntime = require("react/jsx-runtime");
13
-
14
10
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
-
16
11
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17
-
18
12
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
-
20
13
  function wrapLocale(Component) {
21
14
  return function LocaleWrapper(props) {
22
15
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_context.LocaleProvider, {