@nocobase/plugin-api-keys 0.10.1-alpha.1

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 (73) hide show
  1. package/README.md +9 -0
  2. package/README.zh-CN.md +9 -0
  3. package/client.d.ts +4 -0
  4. package/client.js +30 -0
  5. package/docs/en-US/changelog.md +1 -0
  6. package/docs/en-US/index.md +9 -0
  7. package/docs/en-US/tabs.json +14 -0
  8. package/docs/en-US/usage.md +19 -0
  9. package/docs/zh-CN/changelog.md +1 -0
  10. package/docs/zh-CN/index.md +10 -0
  11. package/docs/zh-CN/tabs.json +14 -0
  12. package/docs/zh-CN/usage.md +19 -0
  13. package/lib/client/Configuration/ExpiresSelect.d.ts +3 -0
  14. package/lib/client/Configuration/ExpiresSelect.js +131 -0
  15. package/lib/client/Configuration/index.d.ts +2 -0
  16. package/lib/client/Configuration/index.js +47 -0
  17. package/lib/client/Configuration/roles.d.ts +3 -0
  18. package/lib/client/Configuration/roles.js +20 -0
  19. package/lib/client/Configuration/schema.d.ts +2 -0
  20. package/lib/client/Configuration/schema.js +319 -0
  21. package/lib/client/index.d.ts +3 -0
  22. package/lib/client/index.js +46 -0
  23. package/lib/client/locale/en-US.d.ts +2 -0
  24. package/lib/client/locale/en-US.js +9 -0
  25. package/lib/client/locale/index.d.ts +2 -0
  26. package/lib/client/locale/index.js +32 -0
  27. package/lib/client/locale/zh-CN.d.ts +19 -0
  28. package/lib/client/locale/zh-CN.js +26 -0
  29. package/lib/collections/api-keys.d.ts +3 -0
  30. package/lib/collections/api-keys.js +87 -0
  31. package/lib/collections/index.d.ts +1 -0
  32. package/lib/collections/index.js +13 -0
  33. package/lib/constants.d.ts +1 -0
  34. package/lib/constants.js +8 -0
  35. package/lib/index.d.ts +1 -0
  36. package/lib/index.js +13 -0
  37. package/lib/locale.d.ts +1 -0
  38. package/lib/locale.js +10 -0
  39. package/lib/server/actions/api-keys.d.ts +3 -0
  40. package/lib/server/actions/api-keys.js +71 -0
  41. package/lib/server/index.d.ts +1 -0
  42. package/lib/server/index.js +13 -0
  43. package/lib/server/locale/en-US.d.ts +2 -0
  44. package/lib/server/locale/en-US.js +8 -0
  45. package/lib/server/locale/index.d.ts +2 -0
  46. package/lib/server/locale/index.js +20 -0
  47. package/lib/server/locale/zh-CN.d.ts +4 -0
  48. package/lib/server/locale/zh-CN.js +10 -0
  49. package/lib/server/plugin.d.ts +10 -0
  50. package/lib/server/plugin.js +77 -0
  51. package/package.json +24 -0
  52. package/server.d.ts +4 -0
  53. package/server.js +30 -0
  54. package/src/client/Configuration/ExpiresSelect.tsx +80 -0
  55. package/src/client/Configuration/index.tsx +18 -0
  56. package/src/client/Configuration/roles.ts +9 -0
  57. package/src/client/Configuration/schema.tsx +264 -0
  58. package/src/client/index.tsx +29 -0
  59. package/src/client/locale/en-US.ts +3 -0
  60. package/src/client/locale/index.ts +13 -0
  61. package/src/client/locale/zh-CN.ts +21 -0
  62. package/src/collections/api-keys.ts +95 -0
  63. package/src/collections/index.ts +1 -0
  64. package/src/constants.ts +1 -0
  65. package/src/index.ts +1 -0
  66. package/src/locale.ts +5 -0
  67. package/src/server/__tests__/actions.test.ts +181 -0
  68. package/src/server/actions/api-keys.ts +49 -0
  69. package/src/server/index.ts +1 -0
  70. package/src/server/locale/en-US.ts +1 -0
  71. package/src/server/locale/index.ts +2 -0
  72. package/src/server/locale/zh-CN.ts +3 -0
  73. package/src/server/plugin.ts +53 -0
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # api-keys
2
+
3
+ English | [中文](./README.zh-CN.md)
4
+
5
+ ## 安装激活
6
+
7
+ 内置插件无需手动安装激活。
8
+
9
+ ## 使用方法
@@ -0,0 +1,9 @@
1
+ # api-keys
2
+
3
+ [English](./README.md) | 中文
4
+
5
+ ## 安装激活
6
+
7
+ 内置插件无需手动安装激活。
8
+
9
+ ## 使用方法
package/client.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ // @ts-nocheck
2
+ export * from './lib/client';
3
+ export { default } from './lib/client';
4
+
package/client.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
4
+
5
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
6
+
7
+ var _index = _interopRequireWildcard(require("./lib/client"));
8
+
9
+ Object.defineProperty(exports, "__esModule", {
10
+ value: true
11
+ });
12
+ var _exportNames = {};
13
+ Object.defineProperty(exports, "default", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _index.default;
17
+ }
18
+ });
19
+
20
+ Object.keys(_index).forEach(function (key) {
21
+ if (key === "default" || key === "__esModule") return;
22
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
23
+ if (key in exports && exports[key] === _index[key]) return;
24
+ Object.defineProperty(exports, key, {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _index[key];
28
+ }
29
+ });
30
+ });
@@ -0,0 +1 @@
1
+ # API keys Changelog
@@ -0,0 +1,9 @@
1
+ # API keys
2
+
3
+ ## Introduction
4
+
5
+ This plugin allows you to create and manage API keys. The generated API key can be used to access all `NocoBase` APIs.
6
+
7
+ ## Access Control
8
+
9
+ When creating an API key, you can bind it to a role, and the role's permissions will be the same as the Key's permissions.
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "title": "Introduction",
4
+ "path": "index"
5
+ },
6
+ {
7
+ "title": "Usage",
8
+ "path": "usage"
9
+ },
10
+ {
11
+ "title": "Changelog",
12
+ "path": "changelog"
13
+ }
14
+ ]
@@ -0,0 +1,19 @@
1
+ # API keys Usage
2
+
3
+ ## Creating an API key
4
+
5
+ After enabling the plugin, go to the API keys plugin management page, click `Add API key`, fill in the relevant information, and click Save to create an API key.
6
+
7
+ ## Using an API key
8
+
9
+ Add the `Authorization` field to the request header, with the value of `Bearer ${API_KEY}`, to access all `NocoBase` APIs using the API key.
10
+
11
+ Here's an example using cURL:
12
+
13
+ ```bash
14
+ curl '{domain}/api/roles:check' -H 'Authorization: Bearer {API key}'
15
+ ```
16
+
17
+ ## Deleting an API key
18
+
19
+ After deleting the API key, it will no longer be usable.
@@ -0,0 +1 @@
1
+ # API keys 更新日志
@@ -0,0 +1,10 @@
1
+ # API keys
2
+
3
+ ## 简介
4
+
5
+ 该插件允许你创建和管理 API keys,生成的 API key 可以用于访问 `NocoBase` 所有 API。
6
+
7
+
8
+ ## 权限控制
9
+
10
+ 创建 API key 时,可以为该 Key 绑定角色,角色的权限就是 Key 的权限。
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "title": "介绍",
4
+ "path": "index"
5
+ },
6
+ {
7
+ "title": "用法",
8
+ "path": "usage"
9
+ },
10
+ {
11
+ "title": "日志",
12
+ "path": "changelog"
13
+ }
14
+ ]
@@ -0,0 +1,19 @@
1
+ # API keys 使用方法
2
+
3
+ ## 创建 API key
4
+
5
+ 当你启用插件后,前往 API keys 的插件管理页面,点击 `添加 API key` 并填写相关信息,点击 `保存` 即可创建 API key。
6
+
7
+ ## 使用 API key
8
+
9
+ 在请求头中添加 `Authorization` 字段,值为 `Bearer ${API_KEY}`,即可使用 API key 访问 `NocoBase` 所有 API。
10
+
11
+ cURL 的例子如下
12
+
13
+ ```bash
14
+ curl '{domain}/api/roles:check' -H 'Authorization: Bearer {API key}'
15
+ ```
16
+
17
+ ## 删除 API key
18
+
19
+ 删除 API key 后,该 Key 将无法继续使用。
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const ExpiresSelect: React.ForwardRefExoticComponent<Pick<Partial<any>, string | number | symbol> & React.RefAttributes<unknown>>;
3
+ export { ExpiresSelect };
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ExpiresSelect = void 0;
7
+ function _css() {
8
+ const data = require("@emotion/css");
9
+ _css = function _css() {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ function _react() {
15
+ const data = require("@formily/react");
16
+ _react = function _react() {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _client() {
22
+ const data = require("@nocobase/client");
23
+ _client = function _client() {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _ahooks() {
29
+ const data = require("ahooks");
30
+ _ahooks = function _ahooks() {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _antd() {
36
+ const data = require("antd");
37
+ _antd = function _antd() {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
42
+ function _moment() {
43
+ const data = _interopRequireDefault(require("moment"));
44
+ _moment = function _moment() {
45
+ return data;
46
+ };
47
+ return data;
48
+ }
49
+ function _react2() {
50
+ const data = _interopRequireWildcard(require("react"));
51
+ _react2 = function _react2() {
52
+ return data;
53
+ };
54
+ return data;
55
+ }
56
+ var _locale = require("../locale");
57
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
58
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
59
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
60
+ 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; }
61
+ 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; }
62
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
63
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
64
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
65
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
66
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
67
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
68
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
69
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
70
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
71
+ const TOMORROW = (0, _moment().default)().add(1, 'days');
72
+ const spaceCSS = (0, _css().css)`
73
+ width: 100%;
74
+ & > .ant-space-item {
75
+ flex: 1;
76
+ }
77
+ `;
78
+ const InternalExpiresSelect = props => {
79
+ const onChange = props.onChange;
80
+ const _useBoolean = (0, _ahooks().useBoolean)(),
81
+ _useBoolean2 = _slicedToArray(_useBoolean, 2),
82
+ isCustom = _useBoolean2[0],
83
+ _useBoolean2$ = _useBoolean2[1],
84
+ toggleShowDatePicker = _useBoolean2$.toggle,
85
+ setFalse = _useBoolean2$.setFalse;
86
+ const onSelectChange = v => {
87
+ if (v === 'custom') {
88
+ onChange('1d');
89
+ return toggleShowDatePicker();
90
+ } else {
91
+ setFalse();
92
+ onChange(v);
93
+ }
94
+ };
95
+ const onDatePickerChange = v => {
96
+ v = v.milliseconds(0).second(0);
97
+ const NOW = (0, _moment().default)().milliseconds(0).seconds(0);
98
+ const value = `${v.diff(NOW, 'd')}d`;
99
+ onChange(value);
100
+ };
101
+ return _react2().default.createElement(_antd().Space, {
102
+ className: spaceCSS
103
+ }, _react2().default.createElement(_antd().Select, _objectSpread(_objectSpread({}, props), {}, {
104
+ value: isCustom ? 'custom' : props.value,
105
+ onChange: onSelectChange
106
+ })), isCustom ? _react2().default.createElement(_antd().DatePicker, {
107
+ disabledDate: time => {
108
+ return time.isSameOrBefore();
109
+ },
110
+ defaultValue: TOMORROW,
111
+ onChange: onDatePickerChange,
112
+ showToday: false,
113
+ allowClear: false
114
+ }) : null);
115
+ };
116
+ const ReadPretty = () => {
117
+ const _useRecord = (0, _client().useRecord)(),
118
+ expiresIn = _useRecord.expiresIn,
119
+ createdAt = _useRecord.createdAt;
120
+ const _useTranslation = (0, _locale.useTranslation)(),
121
+ t = _useTranslation.t;
122
+ const expiresDate = (0, _react2().useMemo)(() => {
123
+ if (expiresIn === 'never') return t('Never expires');
124
+ return (0, _moment().default)(createdAt).add((expiresIn === null || expiresIn === void 0 ? void 0 : expiresIn.replace('d', '')) || 0, 'days').format('YYYY-MM-DD HH:mm:ss');
125
+ }, [createdAt, expiresIn]);
126
+ return _react2().default.createElement(_antd().Typography.Text, null, expiresDate);
127
+ };
128
+ const ExpiresSelect = (0, _react().connect)(InternalExpiresSelect, (0, _react().mapProps)({
129
+ dataSource: 'options'
130
+ }), (0, _react().mapReadPretty)(ReadPretty));
131
+ exports.ExpiresSelect = ExpiresSelect;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const Configuration: () => React.JSX.Element;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Configuration = void 0;
7
+ function _react() {
8
+ const data = require("@formily/react");
9
+ _react = function _react() {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ function _client() {
15
+ const data = require("@nocobase/client");
16
+ _client = function _client() {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _react2() {
22
+ const data = _interopRequireDefault(require("react"));
23
+ _react2 = function _react2() {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ var _collections = require("../../collections");
29
+ var _ExpiresSelect = require("./ExpiresSelect");
30
+ var _schema = require("./schema");
31
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
+ const Configuration = () => {
33
+ const currentRoles = (0, _client().useCurrentRoles)();
34
+ return _react2().default.createElement(_client().CollectionManagerProvider, {
35
+ collections: [_collections.apiKeysCollection]
36
+ }, _react2().default.createElement(_client().SchemaComponentOptions, {
37
+ scope: {
38
+ currentRoles
39
+ },
40
+ components: {
41
+ ExpiresSelect: _ExpiresSelect.ExpiresSelect
42
+ }
43
+ }, _react2().default.createElement(_react().RecursionField, {
44
+ schema: _schema.configurationSchema
45
+ })));
46
+ };
47
+ exports.Configuration = Configuration;
@@ -0,0 +1,3 @@
1
+ export declare const useCurrentRolesProps: () => {
2
+ options: any;
3
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useCurrentRolesProps = void 0;
7
+ function _client() {
8
+ const data = require("@nocobase/client");
9
+ _client = function _client() {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ const useCurrentRolesProps = () => {
15
+ const options = (0, _client().useCurrentRoles)();
16
+ return {
17
+ options
18
+ };
19
+ };
20
+ exports.useCurrentRolesProps = useCurrentRolesProps;
@@ -0,0 +1,2 @@
1
+ import { ISchema } from '@formily/react';
2
+ export declare const configurationSchema: ISchema;