@abtnode/ux 1.8.33 → 1.8.35
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/lib/blocklet/component/environment.js +1 -1
- package/lib/blocklet/component/index.js +61 -31
- package/lib/blocklet/component/line.js +28 -0
- package/lib/blocklet/component/setting.js +1 -1
- package/lib/blocklet/configuration.js +180 -13
- package/lib/blocklet/overview.js +127 -10
- package/lib/blocklet/router/action/add-domain-alias.js +171 -0
- package/lib/blocklet/router/action/add-rule.js +196 -0
- package/lib/blocklet/router/action/config-routing-rule.js +125 -0
- package/lib/blocklet/router/action/delete-domain-alias.js +107 -0
- package/lib/blocklet/router/action/delete-rule.js +114 -0
- package/lib/blocklet/router/action/update-rule.js +195 -0
- package/lib/blocklet/router/domain-actions.js +71 -0
- package/lib/blocklet/router/domain-status.js +96 -0
- package/lib/blocklet/router/rule-actions.js +75 -0
- package/lib/blocklet/router/rule-list.js +179 -0
- package/lib/blocklet/router/util.js +146 -0
- package/lib/blocklet/types.js +25 -0
- package/lib/blocklet/util.js +105 -9
- package/lib/blocklet/version.js +1 -1
- package/lib/certificate.js +110 -0
- package/lib/contexts/blocklet.js +19 -0
- package/lib/delete-confirm.js +125 -0
- package/lib/form/form-text-input.js +9 -2
- package/lib/hooks/blocklet.js +171 -0
- package/lib/hooks/url-evaluation.js +157 -0
- package/lib/hooks/use-subscription.js +28 -0
- package/lib/layout/addon.js +17 -17
- package/lib/layout/feedback.js +57 -0
- package/lib/locales/en.js +6 -2
- package/lib/locales/zh.js +6 -2
- package/lib/schema-form/index.js +9 -4
- package/lib/schema-form/text-input.js +1 -1
- package/lib/team/members/index.js +23 -11
- package/lib/team/members/member.js +3 -0
- package/lib/team/passports/color.js +131 -0
- package/lib/team/passports/index.js +32 -20
- package/lib/util/index.js +70 -5
- package/package.json +12 -12
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = RuleListWithPermission;
|
|
7
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
8
|
+
var _isUrl = _interopRequireDefault(require("is-url"));
|
|
9
|
+
var _useTheme = _interopRequireDefault(require("@mui/material/styles/useTheme"));
|
|
10
|
+
var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
|
|
11
|
+
var _Box = _interopRequireDefault(require("@mui/material/Box"));
|
|
12
|
+
var _Link = _interopRequireDefault(require("@mui/material/Link"));
|
|
13
|
+
var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
|
|
14
|
+
var _Avatar = _interopRequireDefault(require("@mui/material/Avatar"));
|
|
15
|
+
var _LockIcon = _interopRequireDefault(require("@arcblock/icons/lib/LockIcon"));
|
|
16
|
+
var _context = require("@arcblock/ux/lib/Locale/context");
|
|
17
|
+
var _constant = require("@abtnode/constant");
|
|
18
|
+
var _util = require("../../util");
|
|
19
|
+
var _blocklet = require("../../contexts/blocklet");
|
|
20
|
+
var _node = require("../../contexts/node");
|
|
21
|
+
var _permission = require("../../permission");
|
|
22
|
+
var _line = _interopRequireDefault(require("../component/line"));
|
|
23
|
+
var _ruleActions = _interopRequireDefault(require("./rule-actions"));
|
|
24
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
25
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
|
+
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; }
|
|
27
|
+
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; }
|
|
28
|
+
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; }
|
|
29
|
+
function RedirectRule(_ref) {
|
|
30
|
+
let {
|
|
31
|
+
domain,
|
|
32
|
+
isHttps,
|
|
33
|
+
toUrl
|
|
34
|
+
} = _ref;
|
|
35
|
+
const scheme = isHttps ? 'https' : 'http';
|
|
36
|
+
let tmpToUrl = toUrl;
|
|
37
|
+
if (!(0, _isUrl.default)(tmpToUrl)) {
|
|
38
|
+
tmpToUrl = "".concat(scheme, "://").concat(domain).concat(toUrl);
|
|
39
|
+
}
|
|
40
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
|
|
41
|
+
href: tmpToUrl,
|
|
42
|
+
target: "_blank",
|
|
43
|
+
style: {
|
|
44
|
+
fontSize: 14
|
|
45
|
+
},
|
|
46
|
+
underline: "hover",
|
|
47
|
+
children: toUrl
|
|
48
|
+
}, tmpToUrl);
|
|
49
|
+
}
|
|
50
|
+
RedirectRule.propTypes = {
|
|
51
|
+
domain: _propTypes.default.string.isRequired,
|
|
52
|
+
toUrl: _propTypes.default.string.isRequired,
|
|
53
|
+
isHttps: _propTypes.default.bool
|
|
54
|
+
};
|
|
55
|
+
RedirectRule.defaultProps = {
|
|
56
|
+
isHttps: false
|
|
57
|
+
};
|
|
58
|
+
function RuleList(_ref2) {
|
|
59
|
+
let {
|
|
60
|
+
hasPermission
|
|
61
|
+
} = _ref2;
|
|
62
|
+
const {
|
|
63
|
+
t,
|
|
64
|
+
locale
|
|
65
|
+
} = (0, _context.useLocaleContext)();
|
|
66
|
+
const theme = (0, _useTheme.default)();
|
|
67
|
+
const {
|
|
68
|
+
blocklet,
|
|
69
|
+
recommendedDomain: domain
|
|
70
|
+
} = (0, _blocklet.useBlockletContext)();
|
|
71
|
+
const rules = blocklet.site.rules.filter(rule => rule.to.did !== blocklet.meta.did).filter(rule => rule.to.type !== _constant.ROUTING_RULE_TYPES.BLOCKLET);
|
|
72
|
+
return rules.map(rule => {
|
|
73
|
+
let avatarName = '';
|
|
74
|
+
if (rule.to.type === _constant.ROUTING_RULE_TYPES.NONE) {
|
|
75
|
+
avatarName = '404';
|
|
76
|
+
} else if (rule.to.type === _constant.ROUTING_RULE_TYPES.REDIRECT) {
|
|
77
|
+
avatarName = rule.to.redirectCode;
|
|
78
|
+
}
|
|
79
|
+
const action = rule.isProtected ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
|
|
80
|
+
title: t('blocklet.router.urlLockTooltip'),
|
|
81
|
+
placement: "top",
|
|
82
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
|
|
83
|
+
disabled: true,
|
|
84
|
+
size: "large",
|
|
85
|
+
style: {
|
|
86
|
+
pointerEvents: 'auto',
|
|
87
|
+
// padding replace to margin, fix the tooltip position
|
|
88
|
+
paddingTop: 0,
|
|
89
|
+
paddingBottom: 0,
|
|
90
|
+
margin: '12px 0'
|
|
91
|
+
},
|
|
92
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LockIcon.default, {
|
|
93
|
+
style: {
|
|
94
|
+
fill: theme.palette.text.disabled
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
})
|
|
98
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ruleActions.default, _objectSpread({}, rule));
|
|
99
|
+
return [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
|
|
100
|
+
display: "flex",
|
|
101
|
+
py: 2,
|
|
102
|
+
className: "component-item",
|
|
103
|
+
justifyContent: "space-between",
|
|
104
|
+
alignItems: "center",
|
|
105
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
|
|
106
|
+
width: {
|
|
107
|
+
xs: 300,
|
|
108
|
+
md: 400
|
|
109
|
+
},
|
|
110
|
+
display: "flex",
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
|
|
113
|
+
width: 28
|
|
114
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Avatar.default, {
|
|
115
|
+
children: avatarName
|
|
116
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
|
|
117
|
+
ml: "16px",
|
|
118
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
|
|
119
|
+
style: {
|
|
120
|
+
color: '#222',
|
|
121
|
+
fontSize: 18
|
|
122
|
+
},
|
|
123
|
+
children: [rule.to.type === _constant.ROUTING_RULE_TYPES.NONE && t('common.page404'), rule.to.type === _constant.ROUTING_RULE_TYPES.REDIRECT && t('common.redirect')]
|
|
124
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
|
|
125
|
+
display: "flex",
|
|
126
|
+
alignItems: "center",
|
|
127
|
+
children: rule.to.type === _constant.ROUTING_RULE_TYPES.REDIRECT && /*#__PURE__*/(0, _jsxRuntime.jsx)(RedirectRule, {
|
|
128
|
+
domain: domain,
|
|
129
|
+
toUrl: rule.to.url
|
|
130
|
+
})
|
|
131
|
+
})]
|
|
132
|
+
})]
|
|
133
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
|
|
134
|
+
px: 2,
|
|
135
|
+
sx: {
|
|
136
|
+
display: {
|
|
137
|
+
xs: 'none',
|
|
138
|
+
md: 'flex'
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
alignItems: "center",
|
|
142
|
+
flexGrow: "1",
|
|
143
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
|
|
144
|
+
href: (0, _util.getAccessUrl)(domain, rule.from.pathPrefix, (0, _util.getBlockletUrlParams)(blocklet, locale)),
|
|
145
|
+
target: "_blank",
|
|
146
|
+
style: {
|
|
147
|
+
fontSize: 18
|
|
148
|
+
},
|
|
149
|
+
underline: "hover",
|
|
150
|
+
children: rule.from.pathPrefix
|
|
151
|
+
})
|
|
152
|
+
}, rule.from.pathPrefix), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
|
|
153
|
+
children: hasPermission && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
154
|
+
style: {
|
|
155
|
+
textAlign: 'right'
|
|
156
|
+
},
|
|
157
|
+
children: action
|
|
158
|
+
})
|
|
159
|
+
}, "actions")]
|
|
160
|
+
}, "group-not-gateway-box"), /*#__PURE__*/(0, _jsxRuntime.jsx)(_line.default, {})];
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
RuleList.propTypes = {
|
|
164
|
+
hasPermission: _propTypes.default.bool
|
|
165
|
+
};
|
|
166
|
+
RuleList.defaultProps = {
|
|
167
|
+
hasPermission: false
|
|
168
|
+
};
|
|
169
|
+
const RuleListInDaemon = (0, _permission.withPermission)(RuleList, 'mutate_blockets');
|
|
170
|
+
const RuleListInService = (0, _permission.withPermission)(RuleList, '', _util.BlockletAdminRoles);
|
|
171
|
+
function RuleListWithPermission(props) {
|
|
172
|
+
const {
|
|
173
|
+
inService
|
|
174
|
+
} = (0, _node.useNodeContext)();
|
|
175
|
+
if (inService) {
|
|
176
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(RuleListInService, _objectSpread({}, props));
|
|
177
|
+
}
|
|
178
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(RuleListInDaemon, _objectSpread({}, props));
|
|
179
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateSite = exports.validateRule = exports.validatePathPrefix = exports.validateDomain = exports.isSpecialDomain = exports.getInitialBlockletDid = void 0;
|
|
7
|
+
var _constant = require("@abtnode/constant");
|
|
8
|
+
var _isPathPrefixEqual = _interopRequireDefault(require("@abtnode/util/lib/is-path-prefix-equal"));
|
|
9
|
+
var _constant2 = require("@blocklet/constant");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
/* eslint-disable import/prefer-default-export */
|
|
12
|
+
|
|
13
|
+
const validateRuleByServiceType = (params, localeContext) => {
|
|
14
|
+
if (params.type === _constant.ROUTING_RULE_TYPES.REDIRECT) {
|
|
15
|
+
if (!params.url) {
|
|
16
|
+
return new Error("".concat(localeContext('router.validation.redirectUrlRequired')));
|
|
17
|
+
}
|
|
18
|
+
if (!params.redirectCode) {
|
|
19
|
+
return new Error("redirect ".concat(localeContext('router.validation.redirectCodeRequired')));
|
|
20
|
+
}
|
|
21
|
+
} else if (params.type === _constant.ROUTING_RULE_TYPES.BLOCKLET) {
|
|
22
|
+
if (!params.did) {
|
|
23
|
+
return new Error(localeContext('router.validation.didRequired'));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
};
|
|
28
|
+
const validateDomain = (domain, localeContext) => {
|
|
29
|
+
if (!domain) {
|
|
30
|
+
return localeContext('router.domain.validate.emptyTip');
|
|
31
|
+
}
|
|
32
|
+
if (domain.endsWith(_constant.DEFAULT_IP_DOMAIN_SUFFIX)) {
|
|
33
|
+
return localeContext('router.domain.validate.suffixTip', {
|
|
34
|
+
suffix: _constant.DEFAULT_IP_DOMAIN_SUFFIX
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* form validator of add site(add domain)
|
|
42
|
+
* @param {Object} params form params
|
|
43
|
+
* @param {Function} localeContext error message
|
|
44
|
+
*/
|
|
45
|
+
exports.validateDomain = validateDomain;
|
|
46
|
+
const validateSite = (params, localeContext) => {
|
|
47
|
+
const validateResult = validateRuleByServiceType(params, localeContext);
|
|
48
|
+
if (validateResult) {
|
|
49
|
+
return validateResult;
|
|
50
|
+
}
|
|
51
|
+
const errMsg = validateDomain(params.domain, localeContext);
|
|
52
|
+
if (errMsg) {
|
|
53
|
+
return new Error(errMsg);
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* form validator of add_rule and update_rule
|
|
60
|
+
* @param {Object} params form params
|
|
61
|
+
* @param {Function} localeContext error message
|
|
62
|
+
*/
|
|
63
|
+
exports.validateSite = validateSite;
|
|
64
|
+
const validateRule = (params, localeContext) => {
|
|
65
|
+
const validateResult = validateRuleByServiceType(params, localeContext);
|
|
66
|
+
if (validateResult) {
|
|
67
|
+
return validateResult;
|
|
68
|
+
}
|
|
69
|
+
if (!params.pathPrefix.length) {
|
|
70
|
+
return new Error(localeContext('router.validation.pathPrefixCannotBeEmpty'));
|
|
71
|
+
}
|
|
72
|
+
if (params.pathPrefix.length > 150) {
|
|
73
|
+
return new Error(localeContext('router.validation.pathPrefixTooLong', {
|
|
74
|
+
length: 150
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
};
|
|
79
|
+
exports.validateRule = validateRule;
|
|
80
|
+
const validatePathPrefix = _ref => {
|
|
81
|
+
let {
|
|
82
|
+
params,
|
|
83
|
+
blocklets,
|
|
84
|
+
blocklet: curBlocklet,
|
|
85
|
+
locale = 'en'
|
|
86
|
+
} = _ref;
|
|
87
|
+
// validate children
|
|
88
|
+
if (curBlocklet) {
|
|
89
|
+
let exist = (curBlocklet.children || []).find(x => (0, _isPathPrefixEqual.default)(x.mountPoint, params.pathPrefix));
|
|
90
|
+
if (curBlocklet.meta.group !== 'gateway' && params.pathPrefix === '/') {
|
|
91
|
+
exist = '/';
|
|
92
|
+
}
|
|
93
|
+
if (exist) {
|
|
94
|
+
return {
|
|
95
|
+
zh: "\u6302\u8F7D\u70B9 ".concat(params.pathPrefix, " \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u5176\u4ED6\u6302\u8F7D\u70B9"),
|
|
96
|
+
en: "The mount point ".concat(params.pathPrefix, " already exist, please use another mount point")
|
|
97
|
+
}[locale];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const blocklet = blocklets.find(item => item.meta.did === params.did);
|
|
101
|
+
if (!blocklet) {
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
const selected = blocklet.meta.interfaces.find(x => x.type === 'web');
|
|
105
|
+
if (!selected) {
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
if (selected.prefix !== _constant2.BLOCKLET_DYNAMIC_PATH_PREFIX && params.pathPrefix !== selected.prefix) {
|
|
109
|
+
return {
|
|
110
|
+
zh: "\u8BE5 blocklet \u53EA\u80FD\u6302\u8F7D\u5728 ".concat(selected.prefix),
|
|
111
|
+
en: "This blocklet can only be mounted on ".concat(selected.prefix)
|
|
112
|
+
}[locale];
|
|
113
|
+
}
|
|
114
|
+
return '';
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* get initial blocklet did when add rule / update rule / add domain
|
|
119
|
+
* @param {array} blocklets
|
|
120
|
+
*/
|
|
121
|
+
exports.validatePathPrefix = validatePathPrefix;
|
|
122
|
+
const getInitialBlockletDid = blocklets => {
|
|
123
|
+
if (blocklets.length === 0) {
|
|
124
|
+
return '';
|
|
125
|
+
}
|
|
126
|
+
const {
|
|
127
|
+
searchParams
|
|
128
|
+
} = new URL(window.location.href);
|
|
129
|
+
const fromDid = searchParams.get('fromDid');
|
|
130
|
+
if (fromDid) {
|
|
131
|
+
const blocklet = blocklets.find(x => x.meta.did === fromDid);
|
|
132
|
+
if (blocklet) {
|
|
133
|
+
return blocklet.meta.did;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return blocklets[0].meta.did;
|
|
137
|
+
};
|
|
138
|
+
exports.getInitialBlockletDid = getInitialBlockletDid;
|
|
139
|
+
const isSpecialDomain = name => {
|
|
140
|
+
const specialDomains = [_constant.DOMAIN_FOR_IP_SITE_REGEXP, _constant.DOMAIN_FOR_DEFAULT_SITE, _constant.DOMAIN_FOR_IP_SITE];
|
|
141
|
+
if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {
|
|
142
|
+
specialDomains.push(window.location.hostname);
|
|
143
|
+
}
|
|
144
|
+
return specialDomains.includes(name);
|
|
145
|
+
};
|
|
146
|
+
exports.isSpecialDomain = isSpecialDomain;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DomainType = void 0;
|
|
7
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
10
|
+
const DomainType = _propTypes.default.shape({
|
|
11
|
+
href: _propTypes.default.string,
|
|
12
|
+
accessibility: _propTypes.default.shape({
|
|
13
|
+
loading: _propTypes.default.bool,
|
|
14
|
+
accessible: _propTypes.default.bool
|
|
15
|
+
}),
|
|
16
|
+
domainStatus: _propTypes.default.shape({
|
|
17
|
+
isHttps: _propTypes.default.bool,
|
|
18
|
+
matchedCert: _propTypes.default.object
|
|
19
|
+
}),
|
|
20
|
+
dns: _propTypes.default.shape({
|
|
21
|
+
resolved: _propTypes.default.bool,
|
|
22
|
+
ip: _propTypes.default.string
|
|
23
|
+
})
|
|
24
|
+
});
|
|
25
|
+
exports.DomainType = DomainType;
|
package/lib/blocklet/util.js
CHANGED
|
@@ -4,18 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.downloadExportedSource = downloadExportedSource;
|
|
7
|
+
exports.fixBlocklet = exports.ensureDomainAliases = void 0;
|
|
7
8
|
exports.genExportedMeta = genExportedMeta;
|
|
8
9
|
exports.getLaunchURL = exports.getLaunchAgreementUrl = void 0;
|
|
9
10
|
exports.getNameByTitle = getNameByTitle;
|
|
10
11
|
exports.getServerUrl = void 0;
|
|
11
12
|
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
13
|
+
var _pick = _interopRequireDefault(require("lodash/pick"));
|
|
12
14
|
var _pickBy = _interopRequireDefault(require("lodash/pickBy"));
|
|
15
|
+
var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
|
|
13
16
|
var _jszip = _interopRequireDefault(require("jszip"));
|
|
14
17
|
var _jsYaml = _interopRequireDefault(require("js-yaml"));
|
|
15
18
|
var _fileSaver = _interopRequireDefault(require("file-saver"));
|
|
16
19
|
var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
17
|
-
var _did = _interopRequireDefault(require("@blocklet/meta/lib/did"));
|
|
18
20
|
var _didMotif = require("@arcblock/did-motif");
|
|
21
|
+
var _normalizePathPrefix = _interopRequireDefault(require("@abtnode/util/lib/normalize-path-prefix"));
|
|
22
|
+
var _did = _interopRequireDefault(require("@blocklet/meta/lib/did"));
|
|
23
|
+
var _util = require("@blocklet/meta/lib/util");
|
|
24
|
+
var _constant = require("@abtnode/constant");
|
|
19
25
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
26
|
const base64ToArrayBuffer = base64 => {
|
|
21
27
|
const bufStr = window.atob(base64);
|
|
@@ -27,7 +33,7 @@ const base64ToArrayBuffer = base64 => {
|
|
|
27
33
|
};
|
|
28
34
|
const getLogo = did => {
|
|
29
35
|
const url = (0, _didMotif.toDataURL)(did, {
|
|
30
|
-
size:
|
|
36
|
+
size: 256
|
|
31
37
|
});
|
|
32
38
|
const base64 = url.replace(/^[^,]*,/, '');
|
|
33
39
|
return base64ToArrayBuffer(base64);
|
|
@@ -36,19 +42,23 @@ function getNameByTitle(title) {
|
|
|
36
42
|
return title.replace(/[\s/@_]/g, '-').replace(/[^a-zA-Z0-9_-]/g, '').replace(/(^[-\s]+)|([-\s]+$)/g, '').toLowerCase();
|
|
37
43
|
}
|
|
38
44
|
function genExportedMeta(name, blocklet) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
meta
|
|
45
|
+
let meta = (0, _pick.default)((0, _cloneDeep.default)(blocklet.meta), ['title', 'description', 'group', 'version', 'capabilities', 'interfaces', 'requirements']);
|
|
46
|
+
|
|
47
|
+
// filter null or undefined
|
|
48
|
+
meta = (0, _pickBy.default)(meta, x => x !== null);
|
|
49
|
+
meta.requirements = (0, _pickBy.default)(meta.requirements, x => !!x);
|
|
43
50
|
meta.interfaces.forEach(x => {
|
|
44
|
-
// filter null or undefined
|
|
45
51
|
if (!x.services) {
|
|
46
52
|
delete x.services;
|
|
47
53
|
}
|
|
48
54
|
});
|
|
55
|
+
meta.name = name;
|
|
56
|
+
meta.did = (0, _did.default)(name);
|
|
57
|
+
meta.logo = 'logo.png';
|
|
58
|
+
meta.components = [];
|
|
49
59
|
blocklet.children.forEach(child => {
|
|
50
60
|
if (child.dynamic && child.bundleSource) {
|
|
51
|
-
meta.
|
|
61
|
+
meta.components.push({
|
|
52
62
|
name: child.meta.name,
|
|
53
63
|
source: child.bundleSource,
|
|
54
64
|
title: child.meta.title,
|
|
@@ -122,4 +132,90 @@ const getLaunchAgreementUrl = (meta, info) => {
|
|
|
122
132
|
url.searchParams.set('from', window.location.href);
|
|
123
133
|
return url.href;
|
|
124
134
|
};
|
|
125
|
-
exports.getLaunchAgreementUrl = getLaunchAgreementUrl;
|
|
135
|
+
exports.getLaunchAgreementUrl = getLaunchAgreementUrl;
|
|
136
|
+
const ensureDomainAliases = async function ensureDomainAliases(domainAliases) {
|
|
137
|
+
let {
|
|
138
|
+
getIP
|
|
139
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
140
|
+
if (!domainAliases || !domainAliases.length) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
if (!getIP) {
|
|
144
|
+
return domainAliases;
|
|
145
|
+
}
|
|
146
|
+
if (!domainAliases.some(x => x.value.includes(_constant.SLOT_FOR_IP_DNS_SITE))) {
|
|
147
|
+
return domainAliases;
|
|
148
|
+
}
|
|
149
|
+
const ip = await getIP();
|
|
150
|
+
if (!ip) {
|
|
151
|
+
return domainAliases;
|
|
152
|
+
}
|
|
153
|
+
return domainAliases.map(x => {
|
|
154
|
+
try {
|
|
155
|
+
x.value = (0, _util.replaceSlotToIp)(x.value, ip);
|
|
156
|
+
return x;
|
|
157
|
+
} catch (_unused) {
|
|
158
|
+
return x;
|
|
159
|
+
}
|
|
160
|
+
}).filter(Boolean);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @param {object} blocklet
|
|
165
|
+
* @param {{
|
|
166
|
+
* fixRuntime:boolean|string // true, 'merge-old'
|
|
167
|
+
* oldBlocklet: object
|
|
168
|
+
* getIP: function
|
|
169
|
+
* }}
|
|
170
|
+
*/
|
|
171
|
+
exports.ensureDomainAliases = ensureDomainAliases;
|
|
172
|
+
const fixBlocklet = async function fixBlocklet(blocklet) {
|
|
173
|
+
let {
|
|
174
|
+
fixRuntime = true,
|
|
175
|
+
oldBlocklet,
|
|
176
|
+
getIP
|
|
177
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
178
|
+
if (!blocklet.site) {
|
|
179
|
+
blocklet.site = {
|
|
180
|
+
domainAliases: [],
|
|
181
|
+
rules: []
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
blocklet.site.rules.forEach(rule => {
|
|
185
|
+
rule.from.pathPrefix = (0, _normalizePathPrefix.default)(rule.from.pathPrefix || '/');
|
|
186
|
+
});
|
|
187
|
+
blocklet.site.rules = (0, _sortBy.default)(blocklet.site.rules, i => i.from.pathPrefix);
|
|
188
|
+
if (fixRuntime === true) {
|
|
189
|
+
blocklet.site.domainAliases = await ensureDomainAliases(blocklet.site.domainAliases, {
|
|
190
|
+
getIP
|
|
191
|
+
});
|
|
192
|
+
(0, _util.forEachBlockletSync)(blocklet, b => {
|
|
193
|
+
if (b.runtimeInfo) {
|
|
194
|
+
b.runtimeInfo.startAt = new Date() - b.runtimeInfo.uptime;
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
} else if (fixRuntime === 'merge-old' && oldBlocklet) {
|
|
198
|
+
blocklet.site.domainAliases = oldBlocklet.site.domainAliases;
|
|
199
|
+
const oldComponents = {};
|
|
200
|
+
(0, _util.forEachBlockletSync)(oldBlocklet, (component, _ref) => {
|
|
201
|
+
let {
|
|
202
|
+
id
|
|
203
|
+
} = _ref;
|
|
204
|
+
oldComponents[id] = component;
|
|
205
|
+
});
|
|
206
|
+
(0, _util.forEachBlockletSync)(blocklet, (component, _ref2) => {
|
|
207
|
+
let {
|
|
208
|
+
id
|
|
209
|
+
} = _ref2;
|
|
210
|
+
const oldComponent = oldComponents[id];
|
|
211
|
+
if (oldComponent) {
|
|
212
|
+
component.runtimeInfo = oldComponent.runtimeInfo;
|
|
213
|
+
component.diskInfo = oldComponent.diskInfo;
|
|
214
|
+
component.engine = oldComponent.engine;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
} else {
|
|
218
|
+
blocklet.site.domainAliases = [];
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
exports.fixBlocklet = fixBlocklet;
|
package/lib/blocklet/version.js
CHANGED
|
@@ -165,7 +165,7 @@ Version.defaultProps = {
|
|
|
165
165
|
checkUpgrade: true,
|
|
166
166
|
hasPermission: false
|
|
167
167
|
};
|
|
168
|
-
const BlockletVersionInDaemon = (0, _permission.withPermission)(Version, '
|
|
168
|
+
const BlockletVersionInDaemon = (0, _permission.withPermission)(Version, 'mutate_blockets');
|
|
169
169
|
const BlockletVersionInService = (0, _permission.withPermission)(Version, '', _util2.BlockletAdminRoles);
|
|
170
170
|
function BlockletVersion(props) {
|
|
171
171
|
const {
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = Certificate;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _get = _interopRequireDefault(require("lodash/get"));
|
|
10
|
+
var _Https = _interopRequireDefault(require("@mui/icons-material/Https"));
|
|
11
|
+
var _Popover = _interopRequireDefault(require("@mui/material/Popover"));
|
|
12
|
+
var _Card = _interopRequireDefault(require("@mui/material/Card"));
|
|
13
|
+
var _CardContent = _interopRequireDefault(require("@mui/material/CardContent"));
|
|
14
|
+
var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
|
|
15
|
+
var _context = require("@arcblock/ux/lib/Locale/context");
|
|
16
|
+
var _util = require("./util");
|
|
17
|
+
var _node = require("./contexts/node");
|
|
18
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
19
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
+
function Certificate(_ref) {
|
|
21
|
+
let {
|
|
22
|
+
certificate
|
|
23
|
+
} = _ref;
|
|
24
|
+
const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
|
|
25
|
+
const node = (0, _node.useNodeContext)();
|
|
26
|
+
const {
|
|
27
|
+
t
|
|
28
|
+
} = (0, _context.useLocaleContext)();
|
|
29
|
+
const handlePopoverOpen = event => {
|
|
30
|
+
setAnchorEl(event.currentTarget);
|
|
31
|
+
};
|
|
32
|
+
const handlePopoverClose = () => {
|
|
33
|
+
setAnchorEl(null);
|
|
34
|
+
};
|
|
35
|
+
const open = Boolean(anchorEl);
|
|
36
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
37
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Https.default, {
|
|
38
|
+
"aria-owns": open ? 'mouse-over-popover' : undefined,
|
|
39
|
+
onMouseEnter: handlePopoverOpen,
|
|
40
|
+
onMouseLeave: handlePopoverClose,
|
|
41
|
+
style: {
|
|
42
|
+
color: '#44cdc6',
|
|
43
|
+
fontSize: 20,
|
|
44
|
+
marginLeft: 8,
|
|
45
|
+
cursor: 'pointer'
|
|
46
|
+
}
|
|
47
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Popover.default, {
|
|
48
|
+
id: "mouse-over-popover",
|
|
49
|
+
style: {
|
|
50
|
+
pointerEvents: 'none'
|
|
51
|
+
},
|
|
52
|
+
open: open,
|
|
53
|
+
anchorEl: anchorEl,
|
|
54
|
+
anchorOrigin: {
|
|
55
|
+
vertical: 'bottom',
|
|
56
|
+
horizontal: 'left'
|
|
57
|
+
},
|
|
58
|
+
transformOrigin: {
|
|
59
|
+
vertical: 'top',
|
|
60
|
+
horizontal: 'left'
|
|
61
|
+
},
|
|
62
|
+
onClose: handlePopoverClose,
|
|
63
|
+
disableRestoreFocus: true,
|
|
64
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Card.default, {
|
|
65
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CardContent.default, {
|
|
66
|
+
style: {
|
|
67
|
+
display: 'flex'
|
|
68
|
+
},
|
|
69
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
70
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
|
|
71
|
+
src: "".concat(node.prefix, "/https-certificate-icon.png"),
|
|
72
|
+
alt: "certificate icon",
|
|
73
|
+
style: {
|
|
74
|
+
maxHeight: '100%',
|
|
75
|
+
maxWidth: '100%'
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
|
|
79
|
+
component: "div",
|
|
80
|
+
style: {
|
|
81
|
+
marginLeft: '16px'
|
|
82
|
+
},
|
|
83
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
84
|
+
component: "div",
|
|
85
|
+
style: {
|
|
86
|
+
fontWeight: 'bold'
|
|
87
|
+
},
|
|
88
|
+
children: certificate.domain
|
|
89
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
90
|
+
component: "div",
|
|
91
|
+
children: "".concat(t('common.issuer'), ": ").concat((0, _get.default)(certificate, 'issuer.commonName', ''))
|
|
92
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
93
|
+
component: "div",
|
|
94
|
+
children: "".concat(t('router.cert.issuedOn'), ": ").concat((0, _util.formatToDate)(certificate.validFrom))
|
|
95
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
96
|
+
component: "div",
|
|
97
|
+
children: "".concat(t('router.cert.expiryOn'), ": ").concat((0, _util.formatToDate)(certificate.validTo))
|
|
98
|
+
})]
|
|
99
|
+
})]
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
})]
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
Certificate.propTypes = {
|
|
106
|
+
certificate: _propTypes.default.object
|
|
107
|
+
};
|
|
108
|
+
Certificate.defaultProps = {
|
|
109
|
+
certificate: {}
|
|
110
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BlockletProvider = exports.BlockletContext = exports.BlockletConsumer = void 0;
|
|
7
|
+
exports.useBlockletContext = useBlockletContext;
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
const BlockletContext = /*#__PURE__*/(0, _react.createContext)({});
|
|
10
|
+
exports.BlockletContext = BlockletContext;
|
|
11
|
+
const {
|
|
12
|
+
Provider,
|
|
13
|
+
Consumer
|
|
14
|
+
} = BlockletContext;
|
|
15
|
+
exports.BlockletConsumer = Consumer;
|
|
16
|
+
exports.BlockletProvider = Provider;
|
|
17
|
+
function useBlockletContext() {
|
|
18
|
+
return (0, _react.useContext)(BlockletContext);
|
|
19
|
+
}
|