@nocobase/plugin-verification 1.7.0-beta.8 → 1.7.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/{providerTypes/index.d.ts → VerificationMenu.d.ts} +5 -4
- package/dist/client/cfedbdcfbe65d5f6.js +10 -0
- package/dist/client/d0b398212e5aa575.js +10 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +1 -1
- package/dist/client/locale/index.d.ts +1 -1
- package/dist/client/otp-verification/VerificationCode.d.ts +16 -0
- package/dist/client/otp-verification/sms/AdminSettingsForm.d.ts +12 -0
- package/dist/client/otp-verification/sms/BindForm.d.ts +11 -0
- package/dist/client/otp-verification/sms/VerificationForm.d.ts +11 -0
- package/dist/client/otp-verification/sms/index.d.ts +26 -0
- package/dist/client/otp-verification/sms/provider-manager.d.ts +19 -0
- package/dist/client/{VerificationProviders.d.ts → otp-verification/sms/providers/AliyunSettings.d.ts} +1 -1
- package/dist/{server/actions/index.d.ts → client/otp-verification/sms/providers/TencentSettings.d.ts} +2 -3
- package/dist/client/schemas/verificators.d.ts +66 -0
- package/dist/client/verification-manager/index.d.ts +32 -0
- package/dist/client/{ProviderOptions.d.ts → verificators/VerificatorSelect.d.ts} +1 -2
- package/dist/client/verificators/Verificators.d.ts +12 -0
- package/dist/client/verificators/verification-types.d.ts +24 -0
- package/dist/collections/verificators.d.ts +50 -0
- package/dist/collections/verificators.js +70 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.js +42 -0
- package/dist/externalVersion.js +13 -13
- package/dist/locale/en-US.json +17 -1
- package/dist/locale/zh-CN.json +19 -2
- package/dist/node_modules/@alicloud/dysmsapi20170525/package.json +1 -1
- package/dist/node_modules/@alicloud/openapi-client/package.json +1 -1
- package/dist/node_modules/@alicloud/tea-util/package.json +1 -1
- package/dist/node_modules/tencentcloud-sdk-nodejs/package.json +1 -1
- package/dist/server/Plugin.d.ts +5 -16
- package/dist/server/Plugin.js +57 -72
- package/dist/server/actions/verificators.d.ts +18 -0
- package/dist/server/actions/verificators.js +175 -0
- package/dist/server/{actions/verifications.d.ts → collections/otp-records.d.ts} +2 -2
- package/dist/server/collections/otp-records.js +75 -0
- package/dist/server/collections/users-verificators.d.ts +14 -0
- package/dist/server/collections/users-verificators.js +58 -0
- package/dist/server/collections/verificators.d.ts +10 -0
- package/dist/server/{actions/index.js → collections/verificators.js} +10 -19
- package/dist/server/constants.d.ts +0 -2
- package/dist/server/constants.js +2 -8
- package/dist/server/index.d.ts +5 -2
- package/dist/server/index.js +12 -5
- package/dist/server/migrations/20250111192640-providers2verificators.d.ts +14 -0
- package/dist/server/migrations/20250111192640-providers2verificators.js +83 -0
- package/dist/server/otp-verification/index.d.ts +25 -0
- package/dist/server/otp-verification/index.js +94 -0
- package/dist/server/otp-verification/sms/index.d.ts +37 -0
- package/dist/server/otp-verification/sms/index.js +87 -0
- package/dist/server/{providers/Provider.d.ts → otp-verification/sms/providers/index.d.ts} +2 -4
- package/dist/server/{providers/Provider.js → otp-verification/sms/providers/index.js} +8 -10
- package/dist/server/{providers → otp-verification/sms/providers}/sms-aliyun.d.ts +3 -3
- package/dist/server/{providers → otp-verification/sms/providers}/sms-aliyun.js +4 -4
- package/dist/server/{providers → otp-verification/sms/providers}/sms-tencent.d.ts +3 -3
- package/dist/server/{providers → otp-verification/sms/providers}/sms-tencent.js +4 -4
- package/dist/server/otp-verification/sms/resource/sms-otp-providers.d.ts +16 -0
- package/dist/server/otp-verification/sms/resource/sms-otp-providers.js +41 -0
- package/dist/server/otp-verification/sms/resource/sms-otp.d.ts +18 -0
- package/dist/server/otp-verification/sms/resource/sms-otp.js +141 -0
- package/dist/server/verification-manager.d.ts +68 -0
- package/dist/server/verification-manager.js +223 -0
- package/dist/server/verification.d.ts +70 -0
- package/dist/server/verification.js +70 -0
- package/package.json +8 -6
- package/dist/client/7551e1f2e04bca2f.js +0 -10
- package/dist/client/providerTypes/sms-aliyun.d.ts +0 -66
- package/dist/client/providerTypes/sms-tencent.d.ts +0 -66
- package/dist/server/actions/verifications.js +0 -146
- package/dist/server/providers/index.d.ts +0 -15
- package/dist/server/providers/index.js +0 -52
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var constants_exports = {};
|
|
28
|
+
__export(constants_exports, {
|
|
29
|
+
PROVIDER_TYPE_SMS_ALIYUN: () => PROVIDER_TYPE_SMS_ALIYUN,
|
|
30
|
+
PROVIDER_TYPE_SMS_TENCENT: () => PROVIDER_TYPE_SMS_TENCENT,
|
|
31
|
+
SMS_OTP_VERIFICATION_TYPE: () => SMS_OTP_VERIFICATION_TYPE
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(constants_exports);
|
|
34
|
+
const SMS_OTP_VERIFICATION_TYPE = "sms-otp";
|
|
35
|
+
const PROVIDER_TYPE_SMS_ALIYUN = "sms-aliyun";
|
|
36
|
+
const PROVIDER_TYPE_SMS_TENCENT = "sms-tencent";
|
|
37
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
38
|
+
0 && (module.exports = {
|
|
39
|
+
PROVIDER_TYPE_SMS_ALIYUN,
|
|
40
|
+
PROVIDER_TYPE_SMS_TENCENT,
|
|
41
|
+
SMS_OTP_VERIFICATION_TYPE
|
|
42
|
+
});
|
package/dist/externalVersion.js
CHANGED
|
@@ -8,19 +8,19 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
module.exports = {
|
|
11
|
-
"@
|
|
12
|
-
"@formily/core": "2.3.0",
|
|
13
|
-
"@formily/react": "2.3.0",
|
|
14
|
-
"ahooks": "3.7.8",
|
|
11
|
+
"@nocobase/client": "1.7.0-beta.9",
|
|
15
12
|
"react": "18.2.0",
|
|
16
|
-
"
|
|
17
|
-
"antd": "5.12.8",
|
|
18
|
-
"@nocobase/actions": "1.7.0-beta.8",
|
|
19
|
-
"@nocobase/database": "1.7.0-beta.8",
|
|
20
|
-
"@nocobase/resourcer": "1.7.0-beta.8",
|
|
21
|
-
"@nocobase/server": "1.7.0-beta.8",
|
|
22
|
-
"@nocobase/utils": "1.7.0-beta.8",
|
|
23
|
-
"react-i18next": "11.18.6",
|
|
13
|
+
"antd": "5.24.2",
|
|
24
14
|
"@formily/shared": "2.3.2",
|
|
25
|
-
"
|
|
15
|
+
"@formily/react": "2.3.0",
|
|
16
|
+
"@formily/core": "2.3.0",
|
|
17
|
+
"@nocobase/server": "1.7.0-beta.9",
|
|
18
|
+
"@nocobase/utils": "1.7.0-beta.9",
|
|
19
|
+
"@nocobase/actions": "1.7.0-beta.9",
|
|
20
|
+
"@nocobase/database": "1.7.0-beta.9",
|
|
21
|
+
"react-i18next": "11.18.6",
|
|
22
|
+
"react-router-dom": "6.28.1",
|
|
23
|
+
"@formily/antd-v5": "1.2.3",
|
|
24
|
+
"@ant-design/icons": "5.6.1",
|
|
25
|
+
"dayjs": "1.11.13"
|
|
26
26
|
};
|
package/dist/locale/en-US.json
CHANGED
|
@@ -18,5 +18,21 @@
|
|
|
18
18
|
"Not a valid cellphone number, please re-enter": "Not a valid cellphone number, please re-enter",
|
|
19
19
|
"Please don't retry in {{time}} seconds": "Please don't retry in {{time}} seconds",
|
|
20
20
|
"You are trying so frequently, please slow down": "You are trying so frequently, please slow down",
|
|
21
|
-
"Verification code is invalid": "Verification code is invalid"
|
|
21
|
+
"Verification code is invalid": "Verification code is invalid",
|
|
22
|
+
"SMS OTP": "SMS OTP",
|
|
23
|
+
"Get one-time codes sent to your phone via SMS to complete authentication requests.": "Get one-time codes sent to your phone via SMS to complete authentication requests.",
|
|
24
|
+
"Unbind": "Unbind",
|
|
25
|
+
"Bind": "Bind",
|
|
26
|
+
"Configured": "Configured",
|
|
27
|
+
"Unbind verificator": "Unbind verificator",
|
|
28
|
+
"Not configured": "Not configured",
|
|
29
|
+
"Unbound successfully": "Unbound successfully",
|
|
30
|
+
"Bound successfully": "Bound successfully",
|
|
31
|
+
"Verification type": "Verification type",
|
|
32
|
+
"Provider": "Provider",
|
|
33
|
+
"Verificator": "Verificator",
|
|
34
|
+
"Verificators": "Verificators",
|
|
35
|
+
"The following types of verificators are available:": "The following types of verifications are available: ",
|
|
36
|
+
"Go to": "Go to",
|
|
37
|
+
"create verificators": "create verificators"
|
|
22
38
|
}
|
package/dist/locale/zh-CN.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"Verification": "
|
|
2
|
+
"Verification": "验证",
|
|
3
3
|
"Verification providers": "验证码提供商",
|
|
4
4
|
"Provider type": "提供商类型",
|
|
5
5
|
"Aliyun SMS": "阿里云短信服务",
|
|
6
|
+
"Tencent SMS": "腾讯云短信服务",
|
|
6
7
|
"Access Key ID": "Access Key ID",
|
|
7
8
|
"Access Key Secret": "Access Key Secret",
|
|
8
9
|
"Endpoint": "接入点",
|
|
@@ -18,5 +19,21 @@
|
|
|
18
19
|
"Not a valid cellphone number, please re-enter": "不是有效的手机号,请重新输入",
|
|
19
20
|
"Please don't retry in {{time}} seconds": "请 {{time}} 秒后再试",
|
|
20
21
|
"You are trying so frequently, please slow down": "您的操作太频繁,请稍后再试",
|
|
21
|
-
"Verification code is invalid": "无效的验证码"
|
|
22
|
+
"Verification code is invalid": "无效的验证码",
|
|
23
|
+
"SMS OTP": "短信验证码",
|
|
24
|
+
"Get one-time codes sent to your phone via SMS to complete authentication requests.": "获取一次性短信验证码,以完成身份验证请求。",
|
|
25
|
+
"Unbind": "解绑",
|
|
26
|
+
"Bind": "绑定",
|
|
27
|
+
"Configured": "已配置",
|
|
28
|
+
"Unbind verificator": "解绑验证器",
|
|
29
|
+
"Not configured": "未配置",
|
|
30
|
+
"Unbound successfully": "解绑成功",
|
|
31
|
+
"Bound successfully": "绑定成功",
|
|
32
|
+
"Verification type": "验证类型",
|
|
33
|
+
"Provider": "服务商",
|
|
34
|
+
"Verificator": "验证器",
|
|
35
|
+
"Verificators": "验证器",
|
|
36
|
+
"The following types of verificators are available:": "以下类型的验证器可选:",
|
|
37
|
+
"Go to": "前往",
|
|
38
|
+
"create verificators": "创建验证器"
|
|
22
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@alicloud/dysmsapi20170525","version":"2.0.17","description":"","main":"dist/client.js","scripts":{"test":"mocha --reporter spec --timeout 3000 test/*.test.js","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"Alibaba Cloud SDK","license":"Apache-2.0","devDependencies":{"@types/node":"^12.12.26","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5"},"dependencies":{"@alicloud/tea-typescript":"^1.7.1","@alicloud/tea-util":"^1.4.4","@alicloud/openapi-client":"^0.4.1","@alicloud/endpoint-util":"^0.0.1","@alicloud/openapi-util":"^0.2.9"},"files":["dist","src"],"_lastModified":"2025-03-
|
|
1
|
+
{"name":"@alicloud/dysmsapi20170525","version":"2.0.17","description":"","main":"dist/client.js","scripts":{"test":"mocha --reporter spec --timeout 3000 test/*.test.js","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"Alibaba Cloud SDK","license":"Apache-2.0","devDependencies":{"@types/node":"^12.12.26","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5"},"dependencies":{"@alicloud/tea-typescript":"^1.7.1","@alicloud/tea-util":"^1.4.4","@alicloud/openapi-client":"^0.4.1","@alicloud/endpoint-util":"^0.0.1","@alicloud/openapi-util":"^0.2.9"},"files":["dist","src"],"_lastModified":"2025-03-25T05:46:28.590Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@alicloud/openapi-client","version":"0.4.12","description":"","main":"dist/client.js","scripts":{"test":"mocha -r ts-node/register -r source-map-support/register test/**/*.spec.ts --timeout=10000","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"","license":"ISC","devDependencies":{"@types/mocha":"^5.2.7","mocha":"^6.2.0","@types/node":"^12.12.26","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5","@alicloud/gateway-pop":"0.0.6"},"dependencies":{"@alicloud/tea-typescript":"^1.7.1","@alicloud/tea-util":"^1.4.9","@alicloud/credentials":"^2.3.1","@alicloud/openapi-util":"^0.3.2","@alicloud/gateway-spi":"^0.0.8","@alicloud/tea-xml":"0.0.3"},"files":["dist","src"],"repository":"git@github.com:aliyun/darabonba-openapi.git","_lastModified":"2025-03-
|
|
1
|
+
{"name":"@alicloud/openapi-client","version":"0.4.12","description":"","main":"dist/client.js","scripts":{"test":"mocha -r ts-node/register -r source-map-support/register test/**/*.spec.ts --timeout=10000","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"","license":"ISC","devDependencies":{"@types/mocha":"^5.2.7","mocha":"^6.2.0","@types/node":"^12.12.26","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5","@alicloud/gateway-pop":"0.0.6"},"dependencies":{"@alicloud/tea-typescript":"^1.7.1","@alicloud/tea-util":"^1.4.9","@alicloud/credentials":"^2.3.1","@alicloud/openapi-util":"^0.3.2","@alicloud/gateway-spi":"^0.0.8","@alicloud/tea-xml":"0.0.3"},"files":["dist","src"],"repository":"git@github.com:aliyun/darabonba-openapi.git","_lastModified":"2025-03-25T05:46:29.670Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@alicloud/tea-util","version":"1.4.4","description":"","main":"dist/client.js","scripts":{"test":"mocha -r ts-node/register -r source-map-support/register test/**/*.spec.ts","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"Jackson Tian","license":"Apache-2.0","devDependencies":{"@types/mocha":"^7.0.1","@types/node":"^12.12.26","mocha":"^7.0.1","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5"},"dependencies":{"@alicloud/tea-typescript":"^1.5.1","kitx":"^2.0.0"},"files":["dist","src"],"_lastModified":"2025-03-
|
|
1
|
+
{"name":"@alicloud/tea-util","version":"1.4.4","description":"","main":"dist/client.js","scripts":{"test":"mocha -r ts-node/register -r source-map-support/register test/**/*.spec.ts","test-cov":"nyc -e .ts -r=html -r=text -r=lcov npm run test","build":"tsc","prepublishOnly":"tsc"},"author":"Jackson Tian","license":"Apache-2.0","devDependencies":{"@types/mocha":"^7.0.1","@types/node":"^12.12.26","mocha":"^7.0.1","nyc":"^15.0.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"^3.7.5"},"dependencies":{"@alicloud/tea-typescript":"^1.5.1","kitx":"^2.0.0"},"files":["dist","src"],"_lastModified":"2025-03-25T05:46:29.946Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"tencentcloud-sdk-nodejs","version":"4.0.759","description":"腾讯云 API NODEJS SDK","main":"tencentcloud/index.js","scripts":{"test":"mocha -t 10000","build":"tsc","prettier":"prettier --config prettier.config.js --write 'src/**/*.{tsx,ts,jsx,js,css,json,vue}'"},"engines":{"node":">=10"},"keywords":["tencentcloudapi","tencentcloud","qcloud","sdk","js","nodejs"],"author":"tencentcloudapi","license":"Apache-2.0","dependencies":{"form-data":"^3.0.0","get-stream":"^6.0.0","https-proxy-agent":"^5.0.0","is-stream":"^2.0.0","json-bigint":"^1.0.0","node-fetch":"^2.2.0","tslib":"1.13.0"},"directories":{"example":"examples","lib":"lib"},"repository":{"type":"git","url":"https://github.com/tencentcloud/tencentcloud-sdk-nodejs"},"devDependencies":{"@types/form-data":"^2.5.0","@types/json-bigint":"^1.0.1","@types/node":"^14.0.26","@types/node-fetch":"^2.5.7","@typescript-eslint/eslint-plugin":"^2.34.0","@typescript-eslint/parser":"^2.34.0","babel-eslint":"^10.0.2","chai":"^4.2.0","eslint":"^6.8.0","eslint-plugin-react":"^7.17.0","mocha":"^8.1.1","prettier":"^2.3.0","ts-node":"^8.10.2","typescript":"^3.9.7"},"_lastModified":"2025-03-
|
|
1
|
+
{"name":"tencentcloud-sdk-nodejs","version":"4.0.759","description":"腾讯云 API NODEJS SDK","main":"tencentcloud/index.js","scripts":{"test":"mocha -t 10000","build":"tsc","prettier":"prettier --config prettier.config.js --write 'src/**/*.{tsx,ts,jsx,js,css,json,vue}'"},"engines":{"node":">=10"},"keywords":["tencentcloudapi","tencentcloud","qcloud","sdk","js","nodejs"],"author":"tencentcloudapi","license":"Apache-2.0","dependencies":{"form-data":"^3.0.0","get-stream":"^6.0.0","https-proxy-agent":"^5.0.0","is-stream":"^2.0.0","json-bigint":"^1.0.0","node-fetch":"^2.2.0","tslib":"1.13.0"},"directories":{"example":"examples","lib":"lib"},"repository":{"type":"git","url":"https://github.com/tencentcloud/tencentcloud-sdk-nodejs"},"devDependencies":{"@types/form-data":"^2.5.0","@types/json-bigint":"^1.0.1","@types/node":"^14.0.26","@types/node-fetch":"^2.5.7","@typescript-eslint/eslint-plugin":"^2.34.0","@typescript-eslint/parser":"^2.34.0","babel-eslint":"^10.0.2","chai":"^4.2.0","eslint":"^6.8.0","eslint-plugin-react":"^7.17.0","mocha":"^8.1.1","prettier":"^2.3.0","ts-node":"^8.10.2","typescript":"^3.9.7"},"_lastModified":"2025-03-25T05:46:38.222Z"}
|
package/dist/server/Plugin.d.ts
CHANGED
|
@@ -6,23 +6,12 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
import { Context } from '@nocobase/actions';
|
|
10
|
-
import { HandlerType } from '@nocobase/resourcer';
|
|
11
9
|
import { Plugin } from '@nocobase/server';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
export interface Interceptor {
|
|
15
|
-
manual?: boolean;
|
|
16
|
-
expiresIn?: number;
|
|
17
|
-
getReceiver(ctx: any): string;
|
|
18
|
-
getCode?(ctx: any): string;
|
|
19
|
-
validate?(ctx: Context, receiver: string): boolean | Promise<boolean>;
|
|
20
|
-
}
|
|
10
|
+
import { VerificationManager } from './verification-manager';
|
|
11
|
+
import { SMSOTPProviderManager } from './otp-verification/sms';
|
|
21
12
|
export default class PluginVerficationServer extends Plugin {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
intercept: HandlerType;
|
|
25
|
-
install(): Promise<void>;
|
|
13
|
+
verificationManager: VerificationManager;
|
|
14
|
+
smsOTPProviderManager: SMSOTPProviderManager;
|
|
26
15
|
load(): Promise<void>;
|
|
27
|
-
|
|
16
|
+
install(): Promise<void>;
|
|
28
17
|
}
|
package/dist/server/Plugin.js
CHANGED
|
@@ -39,55 +39,69 @@ __export(Plugin_exports, {
|
|
|
39
39
|
default: () => PluginVerficationServer
|
|
40
40
|
});
|
|
41
41
|
module.exports = __toCommonJS(Plugin_exports);
|
|
42
|
-
var import_path = __toESM(require("path"));
|
|
43
|
-
var import_database = require("@nocobase/database");
|
|
44
42
|
var import_server = require("@nocobase/server");
|
|
45
43
|
var import_utils = require("@nocobase/utils");
|
|
46
44
|
var import__ = require(".");
|
|
47
|
-
var
|
|
48
|
-
var
|
|
49
|
-
var
|
|
45
|
+
var import_constants = require("../constants");
|
|
46
|
+
var import_verification_manager = require("./verification-manager");
|
|
47
|
+
var import_sms = require("./otp-verification/sms");
|
|
48
|
+
var import_constants2 = require("../constants");
|
|
49
|
+
var import_verificators = __toESM(require("./actions/verificators"));
|
|
50
|
+
var import_sms_aliyun = __toESM(require("./otp-verification/sms/providers/sms-aliyun"));
|
|
51
|
+
var import_sms_tencent = __toESM(require("./otp-verification/sms/providers/sms-tencent"));
|
|
52
|
+
var import_sms_otp_providers = __toESM(require("./otp-verification/sms/resource/sms-otp-providers"));
|
|
53
|
+
var import_sms_otp = __toESM(require("./otp-verification/sms/resource/sms-otp"));
|
|
50
54
|
class PluginVerficationServer extends import_server.Plugin {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
55
|
+
verificationManager = new import_verification_manager.VerificationManager({ db: this.db });
|
|
56
|
+
smsOTPProviderManager = new import_sms.SMSOTPProviderManager();
|
|
57
|
+
async load() {
|
|
58
|
+
this.app.dataSourceManager.use(this.verificationManager.middleware());
|
|
59
|
+
this.app.resourceManager.define(import_sms_otp_providers.default);
|
|
60
|
+
this.app.resourceManager.define(import_sms_otp.default);
|
|
61
|
+
Object.entries(import_verificators.default).forEach(
|
|
62
|
+
([action, handler]) => this.app.resourceManager.registerActionHandler(`verificators:${action}`, handler)
|
|
63
|
+
);
|
|
64
|
+
this.app.acl.allow("verificators", "listByUser", "loggedIn");
|
|
65
|
+
this.app.acl.allow("verificators", "listForVerify", "loggedIn");
|
|
66
|
+
this.app.acl.allow("verificators", "bind", "loggedIn");
|
|
67
|
+
this.app.acl.allow("verificators", "unbind", "loggedIn");
|
|
68
|
+
this.app.acl.allow("smsOTP", "create", "loggedIn");
|
|
69
|
+
this.app.acl.allow("smsOTP", "publicCreate");
|
|
70
|
+
this.app.acl.registerSnippet({
|
|
71
|
+
name: `pm.${this.name}.verificators`,
|
|
72
|
+
actions: ["verificators:*", "smsOTPProviders:*"]
|
|
73
|
+
});
|
|
74
|
+
this.verificationManager.registerVerificationType(import_constants2.SMS_OTP_VERIFICATION_TYPE, {
|
|
75
|
+
title: (0, import_utils.tval)("SMS OTP", { ns: import__.namespace }),
|
|
76
|
+
description: (0, import_utils.tval)("Get one-time codes sent to your phone via SMS to complete authentication requests.", {
|
|
77
|
+
ns: import__.namespace
|
|
78
|
+
}),
|
|
79
|
+
bindingRequired: true,
|
|
80
|
+
verification: import_sms.SMSOTPVerification
|
|
81
|
+
});
|
|
82
|
+
this.verificationManager.addSceneRule(
|
|
83
|
+
(scene, verificationType) => ["auth-sms", "unbind-verificator"].includes(scene) && verificationType === import_constants2.SMS_OTP_VERIFICATION_TYPE
|
|
84
|
+
);
|
|
85
|
+
this.verificationManager.registerAction("verificators:bind", {
|
|
86
|
+
manual: true,
|
|
87
|
+
getBoundInfoFromCtx: (ctx) => {
|
|
88
|
+
return ctx.action.params.values || {};
|
|
75
89
|
}
|
|
76
90
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
+
this.verificationManager.registerScene("unbind-verificator", {
|
|
92
|
+
actions: {
|
|
93
|
+
"verificators:unbind": {}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
this.smsOTPProviderManager.registerProvider(import_constants.PROVIDER_TYPE_SMS_ALIYUN, {
|
|
97
|
+
title: (0, import_utils.tval)("Aliyun SMS", { ns: import__.namespace }),
|
|
98
|
+
provider: import_sms_aliyun.default
|
|
99
|
+
});
|
|
100
|
+
this.smsOTPProviderManager.registerProvider(import_constants.PROVIDER_TYPE_SMS_TENCENT, {
|
|
101
|
+
title: (0, import_utils.tval)("Tencent SMS", { ns: import__.namespace }),
|
|
102
|
+
provider: import_sms_tencent.default
|
|
103
|
+
});
|
|
104
|
+
}
|
|
91
105
|
async install() {
|
|
92
106
|
const {
|
|
93
107
|
DEFAULT_SMS_VERIFY_CODE_PROVIDER,
|
|
@@ -122,33 +136,4 @@ class PluginVerficationServer extends import_server.Plugin {
|
|
|
122
136
|
});
|
|
123
137
|
}
|
|
124
138
|
}
|
|
125
|
-
async load() {
|
|
126
|
-
const { app, db, options } = this;
|
|
127
|
-
await this.importCollections(import_path.default.resolve(__dirname, "collections"));
|
|
128
|
-
await (0, import_providers.default)(this);
|
|
129
|
-
(0, import_actions2.default)(this);
|
|
130
|
-
const self = this;
|
|
131
|
-
app.resourceManager.use(async function verificationIntercept(context, next) {
|
|
132
|
-
const { resourceName, actionName, values } = context.action.params;
|
|
133
|
-
const key = `${resourceName}:${actionName}`;
|
|
134
|
-
const interceptor = self.interceptors.get(key);
|
|
135
|
-
if (!interceptor || interceptor.manual) {
|
|
136
|
-
return next();
|
|
137
|
-
}
|
|
138
|
-
return self.intercept(context, next);
|
|
139
|
-
});
|
|
140
|
-
app.acl.allow("verifications", "create", "public");
|
|
141
|
-
this.app.acl.registerSnippet({
|
|
142
|
-
name: `pm.${this.name}.providers`,
|
|
143
|
-
actions: ["verifications_providers:*"]
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
async getDefault() {
|
|
147
|
-
const providerRepo = this.db.getRepository("verifications_providers");
|
|
148
|
-
return providerRepo.findOne({
|
|
149
|
-
filter: {
|
|
150
|
-
default: true
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
139
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { Context, Next } from '@nocobase/actions';
|
|
10
|
+
declare const _default: {
|
|
11
|
+
listTypes: (ctx: Context, next: Next) => Promise<void>;
|
|
12
|
+
listByScene: (ctx: Context, next: Next) => Promise<any>;
|
|
13
|
+
listByUser: (ctx: Context, next: Next) => Promise<void>;
|
|
14
|
+
listForVerify: (ctx: Context, next: Next) => Promise<any>;
|
|
15
|
+
bind: (ctx: Context, next: Next) => Promise<never>;
|
|
16
|
+
unbind: (ctx: Context, next: Next) => Promise<never>;
|
|
17
|
+
};
|
|
18
|
+
export default _default;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __create = Object.create;
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
13
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
15
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name in all)
|
|
18
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
var __copyProps = (to, from, except, desc) => {
|
|
21
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
22
|
+
for (let key of __getOwnPropNames(from))
|
|
23
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
24
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
29
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
30
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
31
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
32
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
33
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
34
|
+
mod
|
|
35
|
+
));
|
|
36
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
37
|
+
var verificators_exports = {};
|
|
38
|
+
__export(verificators_exports, {
|
|
39
|
+
default: () => verificators_default
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(verificators_exports);
|
|
42
|
+
var import_package = __toESM(require("../../../package.json"));
|
|
43
|
+
var verificators_default = {
|
|
44
|
+
listTypes: async (ctx, next) => {
|
|
45
|
+
const plugin = ctx.app.pm.get("verification");
|
|
46
|
+
ctx.body = plugin.verificationManager.listTypes();
|
|
47
|
+
await next();
|
|
48
|
+
},
|
|
49
|
+
listByScene: async (ctx, next) => {
|
|
50
|
+
const { scene } = ctx.action.params || {};
|
|
51
|
+
const plugin = ctx.app.pm.get("verification");
|
|
52
|
+
const verificationTypes = plugin.verificationManager.getVerificationTypesByScene(scene);
|
|
53
|
+
if (!verificationTypes.length) {
|
|
54
|
+
ctx.body = { verificators: [], availableTypes: [] };
|
|
55
|
+
return next();
|
|
56
|
+
}
|
|
57
|
+
const verificators = await ctx.db.getRepository("verificators").find({
|
|
58
|
+
filter: {
|
|
59
|
+
verificationType: verificationTypes.map((item) => item.type)
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
ctx.body = {
|
|
63
|
+
verificators: (verificators || []).map((item) => ({
|
|
64
|
+
name: item.name,
|
|
65
|
+
title: item.title
|
|
66
|
+
})),
|
|
67
|
+
availableTypes: verificationTypes.map((item) => ({
|
|
68
|
+
name: item.type,
|
|
69
|
+
title: item.title
|
|
70
|
+
}))
|
|
71
|
+
};
|
|
72
|
+
await next();
|
|
73
|
+
},
|
|
74
|
+
listByUser: async (ctx, next) => {
|
|
75
|
+
const plugin = ctx.app.pm.get("verification");
|
|
76
|
+
const verificationTypes = plugin.verificationManager.verificationTypes;
|
|
77
|
+
const bindingRequiredTypes = Array.from(verificationTypes.getEntities()).filter(([, options]) => options.bindingRequired).map(([type]) => type);
|
|
78
|
+
const verificators = await ctx.db.getRepository("verificators").find({
|
|
79
|
+
filter: {
|
|
80
|
+
verificationType: bindingRequiredTypes
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const result = [];
|
|
84
|
+
for (const verificator of verificators) {
|
|
85
|
+
try {
|
|
86
|
+
const verificationType = plugin.verificationManager.verificationTypes.get(verificator.verificationType);
|
|
87
|
+
const Verification = plugin.verificationManager.getVerification(verificator.verificationType);
|
|
88
|
+
const verification = new Verification({ ctx, verificator, options: verificator.options });
|
|
89
|
+
const boundInfo = await verification.getPublicBoundInfo(ctx.auth.user.id);
|
|
90
|
+
result.push({
|
|
91
|
+
...verificator.dataValues,
|
|
92
|
+
title: verificator.title || verificationType.title,
|
|
93
|
+
description: verificator.description || verificationType.description,
|
|
94
|
+
boundInfo
|
|
95
|
+
});
|
|
96
|
+
} catch (error) {
|
|
97
|
+
ctx.log.error(error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
ctx.body = result;
|
|
101
|
+
await next();
|
|
102
|
+
},
|
|
103
|
+
listForVerify: async (ctx, next) => {
|
|
104
|
+
const { scene } = ctx.action.params || {};
|
|
105
|
+
const plugin = ctx.app.pm.get("verification");
|
|
106
|
+
const verificationTypes = plugin.verificationManager.getVerificationTypesByScene(scene);
|
|
107
|
+
if (!verificationTypes.length) {
|
|
108
|
+
ctx.body = [];
|
|
109
|
+
return next();
|
|
110
|
+
}
|
|
111
|
+
const verificators = await ctx.db.getRepository("verificators").find({
|
|
112
|
+
filter: {
|
|
113
|
+
verificationType: verificationTypes.map((item) => item.type)
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
if (!verificators.length) {
|
|
117
|
+
ctx.body = [];
|
|
118
|
+
return next();
|
|
119
|
+
}
|
|
120
|
+
const result = [];
|
|
121
|
+
for (const verificator of verificators) {
|
|
122
|
+
const verificationType = plugin.verificationManager.verificationTypes.get(verificator.verificationType);
|
|
123
|
+
const Verification = plugin.verificationManager.getVerification(verificator.verificationType);
|
|
124
|
+
const verification = new Verification({ ctx, verificator, options: verificator.options });
|
|
125
|
+
const publicBoundInfo = await verification.getPublicBoundInfo(ctx.auth.user.id);
|
|
126
|
+
if (!(publicBoundInfo == null ? void 0 : publicBoundInfo.bound)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
result.push({
|
|
130
|
+
name: verificator.name,
|
|
131
|
+
title: verificator.title,
|
|
132
|
+
verificationType: verificator.verificationType,
|
|
133
|
+
verificationTypeTitle: verificationType == null ? void 0 : verificationType.title,
|
|
134
|
+
boundInfo: publicBoundInfo
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
ctx.body = result;
|
|
138
|
+
await next();
|
|
139
|
+
},
|
|
140
|
+
bind: async (ctx, next) => {
|
|
141
|
+
const { verificator: name } = ctx.action.params.values || {};
|
|
142
|
+
const user = ctx.auth.user;
|
|
143
|
+
const verificationPlugin = ctx.app.pm.get("verification");
|
|
144
|
+
const record = await verificationPlugin.verificationManager.getBoundRecord(user.id, name);
|
|
145
|
+
if (record) {
|
|
146
|
+
return ctx.throw(400, ctx.t("You have already bound this verificator", { ns: import_package.default.name }));
|
|
147
|
+
}
|
|
148
|
+
const verificator = await verificationPlugin.verificationManager.getVerificator(name);
|
|
149
|
+
if (!verificator) {
|
|
150
|
+
return ctx.throw(400, ctx.t("Invalid verificator"));
|
|
151
|
+
}
|
|
152
|
+
const Verification = verificationPlugin.verificationManager.getVerification(verificator.verificationType);
|
|
153
|
+
const verification = new Verification({ ctx, verificator, options: verificator.options });
|
|
154
|
+
const { uuid, meta } = await verification.bind(user.id);
|
|
155
|
+
await verificator.addUser(user.id, {
|
|
156
|
+
through: {
|
|
157
|
+
uuid,
|
|
158
|
+
meta
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
ctx.body = {};
|
|
162
|
+
await next();
|
|
163
|
+
},
|
|
164
|
+
unbind: async (ctx, next) => {
|
|
165
|
+
const { unbindVerificator: name } = ctx.action.params.values || {};
|
|
166
|
+
const user = ctx.auth.user;
|
|
167
|
+
const verificationPlugin = ctx.app.pm.get("verification");
|
|
168
|
+
const verificator = await verificationPlugin.verificationManager.getVerificator(name);
|
|
169
|
+
if (!verificator) {
|
|
170
|
+
return ctx.throw(400, ctx.t("Invalid verificator"));
|
|
171
|
+
}
|
|
172
|
+
await verificator.removeUser(user.id);
|
|
173
|
+
await next();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
export
|
|
9
|
+
declare const _default: import("@nocobase/database").CollectionOptions;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var otp_records_exports = {};
|
|
28
|
+
__export(otp_records_exports, {
|
|
29
|
+
default: () => otp_records_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(otp_records_exports);
|
|
32
|
+
var import_database = require("@nocobase/database");
|
|
33
|
+
var otp_records_default = (0, import_database.defineCollection)({
|
|
34
|
+
dumpRules: {
|
|
35
|
+
group: "log"
|
|
36
|
+
},
|
|
37
|
+
migrationRules: ["schema-only", "skip"],
|
|
38
|
+
name: "otpRecords",
|
|
39
|
+
shared: true,
|
|
40
|
+
fields: [
|
|
41
|
+
{
|
|
42
|
+
type: "uuid",
|
|
43
|
+
name: "id",
|
|
44
|
+
primaryKey: true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: "string",
|
|
48
|
+
name: "action"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: "string",
|
|
52
|
+
name: "receiver"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: "integer",
|
|
56
|
+
name: "status",
|
|
57
|
+
defaultValue: 0
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: "unixTimestamp",
|
|
61
|
+
name: "expiresAt",
|
|
62
|
+
accuracy: "millisecond"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
type: "string",
|
|
66
|
+
name: "code"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
type: "belongsTo",
|
|
70
|
+
name: "verificator",
|
|
71
|
+
target: "verificators",
|
|
72
|
+
targetKey: "name"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Collection for user information of extended authentication methods,
|
|
11
|
+
* such as saml, oicd, oauth, sms, etc.
|
|
12
|
+
*/
|
|
13
|
+
declare const _default: import("@nocobase/database").CollectionOptions;
|
|
14
|
+
export default _default;
|