schema-dsl 2.3.0
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/.eslintignore +10 -0
- package/.eslintrc.json +27 -0
- package/.github/CODE_OF_CONDUCT.md +45 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +57 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
- package/.github/ISSUE_TEMPLATE/question.md +31 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +70 -0
- package/.github/SECURITY.md +184 -0
- package/.github/workflows/ci.yml +35 -0
- package/CHANGELOG.md +633 -0
- package/CONTRIBUTING.md +368 -0
- package/LICENSE +21 -0
- package/README.md +1122 -0
- package/STATUS.md +273 -0
- package/docs/FEATURE-INDEX.md +521 -0
- package/docs/INDEX.md +224 -0
- package/docs/api-reference.md +1098 -0
- package/docs/best-practices.md +672 -0
- package/docs/cache-manager.md +336 -0
- package/docs/design-philosophy.md +602 -0
- package/docs/dsl-syntax.md +654 -0
- package/docs/dynamic-locale.md +552 -0
- package/docs/error-handling.md +703 -0
- package/docs/export-guide.md +459 -0
- package/docs/faq.md +576 -0
- package/docs/frontend-i18n-guide.md +290 -0
- package/docs/i18n-user-guide.md +488 -0
- package/docs/label-vs-description.md +262 -0
- package/docs/markdown-exporter.md +398 -0
- package/docs/mongodb-exporter.md +279 -0
- package/docs/multi-type-support.md +319 -0
- package/docs/mysql-exporter.md +257 -0
- package/docs/plugin-system.md +542 -0
- package/docs/postgresql-exporter.md +290 -0
- package/docs/quick-start.md +761 -0
- package/docs/schema-helper.md +340 -0
- package/docs/schema-utils.md +492 -0
- package/docs/string-extensions.md +480 -0
- package/docs/troubleshooting.md +471 -0
- package/docs/type-converter.md +319 -0
- package/docs/type-reference.md +219 -0
- package/docs/validate.md +486 -0
- package/docs/validation-guide.md +484 -0
- package/examples/array-dsl-example.js +227 -0
- package/examples/custom-extension.js +85 -0
- package/examples/dsl-match-example.js +74 -0
- package/examples/dsl-style.js +118 -0
- package/examples/dynamic-locale-configuration.js +348 -0
- package/examples/dynamic-locale-example.js +287 -0
- package/examples/export-demo.js +130 -0
- package/examples/i18n-full-demo.js +310 -0
- package/examples/i18n-memory-safety.examples.js +268 -0
- package/examples/markdown-export.js +71 -0
- package/examples/middleware-usage.js +93 -0
- package/examples/password-reset/README.md +153 -0
- package/examples/password-reset/schema.js +26 -0
- package/examples/password-reset/test.js +101 -0
- package/examples/plugin-system.examples.js +205 -0
- package/examples/simple-example.js +122 -0
- package/examples/string-extensions.js +297 -0
- package/examples/user-registration/README.md +156 -0
- package/examples/user-registration/routes.js +92 -0
- package/examples/user-registration/schema.js +150 -0
- package/examples/user-registration/server.js +74 -0
- package/index.d.ts +1999 -0
- package/index.js +270 -0
- package/index.mjs +30 -0
- package/lib/adapters/DslAdapter.js +653 -0
- package/lib/adapters/index.js +20 -0
- package/lib/config/constants.js +286 -0
- package/lib/config/patterns/creditCard.js +9 -0
- package/lib/config/patterns/idCard.js +9 -0
- package/lib/config/patterns/index.js +8 -0
- package/lib/config/patterns/licensePlate.js +4 -0
- package/lib/config/patterns/passport.js +4 -0
- package/lib/config/patterns/phone.js +9 -0
- package/lib/config/patterns/postalCode.js +5 -0
- package/lib/core/CacheManager.js +376 -0
- package/lib/core/DslBuilder.js +740 -0
- package/lib/core/ErrorCodes.js +233 -0
- package/lib/core/ErrorFormatter.js +342 -0
- package/lib/core/JSONSchemaCore.js +347 -0
- package/lib/core/Locale.js +119 -0
- package/lib/core/MessageTemplate.js +89 -0
- package/lib/core/PluginManager.js +448 -0
- package/lib/core/StringExtensions.js +209 -0
- package/lib/core/Validator.js +316 -0
- package/lib/exporters/MarkdownExporter.js +420 -0
- package/lib/exporters/MongoDBExporter.js +162 -0
- package/lib/exporters/MySQLExporter.js +212 -0
- package/lib/exporters/PostgreSQLExporter.js +289 -0
- package/lib/exporters/index.js +24 -0
- package/lib/locales/en-US.js +65 -0
- package/lib/locales/es-ES.js +66 -0
- package/lib/locales/fr-FR.js +66 -0
- package/lib/locales/index.js +8 -0
- package/lib/locales/ja-JP.js +66 -0
- package/lib/locales/zh-CN.js +93 -0
- package/lib/utils/LRUCache.js +174 -0
- package/lib/utils/SchemaHelper.js +240 -0
- package/lib/utils/SchemaUtils.js +313 -0
- package/lib/utils/TypeConverter.js +245 -0
- package/lib/utils/index.js +13 -0
- package/lib/validators/CustomKeywords.js +203 -0
- package/lib/validators/index.js +11 -0
- package/package.json +70 -0
- package/plugins/custom-format.js +101 -0
- package/plugins/custom-validator.js +200 -0
package/.eslintignore
ADDED
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"env": {
|
|
3
|
+
"node": true,
|
|
4
|
+
"es2021": true,
|
|
5
|
+
"mocha": true
|
|
6
|
+
},
|
|
7
|
+
"extends": "eslint:recommended",
|
|
8
|
+
"parserOptions": {
|
|
9
|
+
"ecmaVersion": 12,
|
|
10
|
+
"sourceType": "module"
|
|
11
|
+
},
|
|
12
|
+
"rules": {
|
|
13
|
+
"semi": ["error", "always"],
|
|
14
|
+
"quotes": ["error", "single"],
|
|
15
|
+
"indent": ["error", 2],
|
|
16
|
+
"linebreak-style": ["error", "windows"],
|
|
17
|
+
"no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
|
|
18
|
+
"no-console": "off",
|
|
19
|
+
"comma-dangle": ["error", "never"],
|
|
20
|
+
"object-curly-spacing": ["error", "always"],
|
|
21
|
+
"arrow-spacing": "error",
|
|
22
|
+
"keyword-spacing": "error",
|
|
23
|
+
"space-before-blocks": "error",
|
|
24
|
+
"space-infix-ops": "error"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 贡献者行为准则
|
|
2
|
+
|
|
3
|
+
## 我们的承诺
|
|
4
|
+
|
|
5
|
+
为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺:无论年龄、体型、残疾、民族、性别认同和表达、经验水平、教育程度、社会经济地位、国籍、个人形象、种族、宗教或性取向如何,参与我们的项目和社区的每个人都能获得无骚扰的体验。
|
|
6
|
+
|
|
7
|
+
## 我们的标准
|
|
8
|
+
|
|
9
|
+
有助于创建积极环境的行为包括:
|
|
10
|
+
|
|
11
|
+
* 使用友好和包容的语言
|
|
12
|
+
* 尊重不同的观点和经验
|
|
13
|
+
* 优雅地接受建设性批评
|
|
14
|
+
* 关注对社区最有利的事情
|
|
15
|
+
* 对其他社区成员表示同理心
|
|
16
|
+
|
|
17
|
+
不可接受的行为包括:
|
|
18
|
+
|
|
19
|
+
* 使用性化的语言或图像,以及不受欢迎的性关注或性骚扰
|
|
20
|
+
* 恶意评论、侮辱/贬损性评论以及人身或政治攻击
|
|
21
|
+
* 公开或私下骚扰
|
|
22
|
+
* 未经明确许可,发布他人的私人信息,如物理地址或电子邮件地址
|
|
23
|
+
* 在专业环境中可能被合理认为不适当的其他行为
|
|
24
|
+
|
|
25
|
+
## 我们的责任
|
|
26
|
+
|
|
27
|
+
项目维护者有责任明确可接受行为的标准,并对任何不可接受的行为采取适当和公平的纠正措施。
|
|
28
|
+
|
|
29
|
+
项目维护者有权删除、编辑或拒绝与本行为准则不符的评论、提交、代码、wiki 编辑、问题和其他贡献,或暂时或永久禁止任何贡献者的其他行为,如果他们认为这些行为不适当、威胁、冒犯或有害。
|
|
30
|
+
|
|
31
|
+
## 范围
|
|
32
|
+
|
|
33
|
+
当个人代表项目或其社区时,本行为准则适用于项目空间和公共空间。代表项目或社区的示例包括使用官方项目电子邮件地址、通过官方社交媒体帐户发布信息,或在线上或线下活动中担任指定代表。项目的代表可以由项目维护者进一步定义和澄清。
|
|
34
|
+
|
|
35
|
+
## 执行
|
|
36
|
+
|
|
37
|
+
可以通过联系项目团队 rockyshi1993@gmail.com 报告滥用、骚扰或其他不可接受的行为。所有投诉都将被审查和调查,并将做出被认为必要和适当的回应。项目团队有义务对事件报告者保密。具体执行政策的更多细节可能会单独发布。
|
|
38
|
+
|
|
39
|
+
不善意遵守或执行行为准则的项目维护者可能会面临项目领导层其他成员确定的临时或永久后果。
|
|
40
|
+
|
|
41
|
+
## 归属
|
|
42
|
+
|
|
43
|
+
本行为准则改编自 [Contributor Covenant](https://www.contributor-covenant.org) 版本 2.0,可在 https://www.contributor-covenant.org/version/2/0/code_of_conduct.html 获得。
|
|
44
|
+
|
|
45
|
+
如有关于本行为准则的问题,请参阅 https://www.contributor-covenant.org/faq
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 🐛 Bug 报告
|
|
3
|
+
about: 报告一个问题帮助我们改进
|
|
4
|
+
title: '[BUG] '
|
|
5
|
+
labels: 'bug'
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🐛 Bug 描述
|
|
10
|
+
|
|
11
|
+
请清晰简洁地描述遇到的问题。
|
|
12
|
+
|
|
13
|
+
## 🔄 重现步骤
|
|
14
|
+
|
|
15
|
+
1. 执行 '...'
|
|
16
|
+
2. 调用 '....'
|
|
17
|
+
3. 看到错误 '....'
|
|
18
|
+
|
|
19
|
+
## ✅ 期望行为
|
|
20
|
+
|
|
21
|
+
描述你期望发生什么。
|
|
22
|
+
|
|
23
|
+
## ❌ 实际行为
|
|
24
|
+
|
|
25
|
+
描述实际发生了什么。
|
|
26
|
+
|
|
27
|
+
## 📝 代码示例
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
const { dsl, validate } = require('schema-dsl');
|
|
31
|
+
|
|
32
|
+
const schema = dsl({
|
|
33
|
+
// 你的 schema 定义
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const result = validate(schema, {
|
|
37
|
+
// 你的测试数据
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 🌍 环境信息
|
|
42
|
+
|
|
43
|
+
- **schema-dsl 版本**: [例如 v2.3.0]
|
|
44
|
+
- **Node.js 版本**: [例如 v18.0.0]
|
|
45
|
+
- **操作系统**: [例如 Windows 11 / macOS 14 / Ubuntu 22.04]
|
|
46
|
+
- **包管理器**: [npm / yarn / pnpm]
|
|
47
|
+
|
|
48
|
+
## 📎 附加信息
|
|
49
|
+
|
|
50
|
+
添加任何其他有助于解释问题的信息(截图、错误日志等)。
|
|
51
|
+
|
|
52
|
+
## ✔️ 检查清单
|
|
53
|
+
|
|
54
|
+
- [ ] 我已搜索现有 Issues,未发现重复问题
|
|
55
|
+
- [ ] 我已阅读 [文档](https://github.com/vextjs/schema-dsl#readme)
|
|
56
|
+
- [ ] 我已提供完整的重现步骤
|
|
57
|
+
- [ ] 我已提供环境信息
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: 📖 查看文档
|
|
4
|
+
url: https://github.com/vextjs/schema-dsl#readme
|
|
5
|
+
about: 查看完整文档和示例
|
|
6
|
+
- name: 💬 讨论区
|
|
7
|
+
url: https://github.com/vextjs/schema-dsl/discussions
|
|
8
|
+
about: 提问、分享想法或参与讨论
|
|
9
|
+
- name: 📝 常见问题
|
|
10
|
+
url: https://github.com/vextjs/schema-dsl/blob/main/docs/faq.md
|
|
11
|
+
about: 查看常见问题解答
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ✨ 功能请求
|
|
3
|
+
about: 建议新功能或改进
|
|
4
|
+
title: '[FEATURE] '
|
|
5
|
+
labels: 'enhancement'
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ✨ 功能描述
|
|
10
|
+
|
|
11
|
+
清晰简洁地描述你希望添加的功能。
|
|
12
|
+
|
|
13
|
+
## 🎯 使用场景
|
|
14
|
+
|
|
15
|
+
**遇到的问题**:
|
|
16
|
+
描述你遇到的问题或限制(例如:"我总是需要..."或"无法实现...")
|
|
17
|
+
|
|
18
|
+
**期望的解决方案**:
|
|
19
|
+
描述你希望如何解决这个问题。
|
|
20
|
+
|
|
21
|
+
## 💡 API 设计建议(可选)
|
|
22
|
+
|
|
23
|
+
如果可以,提供你期望的 API 设计:
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
const schema = dsl({
|
|
27
|
+
// 期望的用法示例
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 🔄 替代方案(可选)
|
|
32
|
+
|
|
33
|
+
描述你考虑过的其他替代方案或功能。
|
|
34
|
+
|
|
35
|
+
## 📚 参考资料(可选)
|
|
36
|
+
|
|
37
|
+
- 其他库的类似功能
|
|
38
|
+
- 相关文档或讨论链接
|
|
39
|
+
- 截图或示意图
|
|
40
|
+
|
|
41
|
+
## ✔️ 检查清单
|
|
42
|
+
|
|
43
|
+
- [ ] 我已搜索现有 Issues,未发现相同的功能请求
|
|
44
|
+
- [ ] 这个功能符合 SchemaIO 的设计理念(简洁、灵活、易用)
|
|
45
|
+
- [ ] 我愿意提交 PR 来实现这个功能(可选)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ❓ 问题咨询
|
|
3
|
+
about: 询问使用问题或获取帮助
|
|
4
|
+
title: '[QUESTION] '
|
|
5
|
+
labels: 'question'
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ❓ 你的问题
|
|
10
|
+
|
|
11
|
+
清晰描述你的问题。
|
|
12
|
+
|
|
13
|
+
## 🔍 你已经尝试过什么
|
|
14
|
+
|
|
15
|
+
- [ ] 我已查看 [文档](https://github.com/vextjs/schema-dsl#readme)
|
|
16
|
+
- [ ] 我已查看 [FAQ](https://github.com/vextjs/schema-dsl/blob/main/docs/faq.md)
|
|
17
|
+
- [ ] 我已搜索现有 Issues
|
|
18
|
+
|
|
19
|
+
## 📝 代码示例(可选)
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// 你当前的代码
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 🎯 你想实现什么
|
|
26
|
+
|
|
27
|
+
描述你的目标或期望的效果。
|
|
28
|
+
|
|
29
|
+
## 📚 相关文档
|
|
30
|
+
|
|
31
|
+
如果你参考了某些文档但仍有疑问,请提供链接。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Pull Request
|
|
2
|
+
|
|
3
|
+
## 📝 描述
|
|
4
|
+
|
|
5
|
+
请简要描述这个 PR 的目的和改动内容。
|
|
6
|
+
|
|
7
|
+
## 🔗 关联 Issue
|
|
8
|
+
|
|
9
|
+
关闭 #(issue编号)
|
|
10
|
+
|
|
11
|
+
## 🎯 改动类型
|
|
12
|
+
|
|
13
|
+
请勾选此 PR 的类型:
|
|
14
|
+
|
|
15
|
+
- [ ] 🐛 Bug 修复
|
|
16
|
+
- [ ] ✨ 新功能
|
|
17
|
+
- [ ] 📚 文档更新
|
|
18
|
+
- [ ] 🎨 代码风格/格式化
|
|
19
|
+
- [ ] ♻️ 重构
|
|
20
|
+
- [ ] ⚡ 性能优化
|
|
21
|
+
- [ ] ✅ 测试相关
|
|
22
|
+
- [ ] 🔧 构建/工具配置
|
|
23
|
+
|
|
24
|
+
## 💡 改动详情
|
|
25
|
+
|
|
26
|
+
### 主要改动
|
|
27
|
+
|
|
28
|
+
- 改动点 1
|
|
29
|
+
- 改动点 2
|
|
30
|
+
|
|
31
|
+
### 技术细节(可选)
|
|
32
|
+
|
|
33
|
+
描述技术实现细节。
|
|
34
|
+
|
|
35
|
+
## 🧪 测试
|
|
36
|
+
|
|
37
|
+
请描述你如何测试这些改动:
|
|
38
|
+
|
|
39
|
+
- [ ] 单元测试通过
|
|
40
|
+
- [ ] 集成测试通过
|
|
41
|
+
- [ ] 手动测试场景:
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
// 测试代码示例
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 📸 截图(如适用)
|
|
48
|
+
|
|
49
|
+
如果是 UI 相关或有视觉效果的改动,请提供截图。
|
|
50
|
+
|
|
51
|
+
## ✔️ 检查清单
|
|
52
|
+
|
|
53
|
+
在提交前请确认:
|
|
54
|
+
|
|
55
|
+
- [ ] 我的代码遵循项目的代码规范
|
|
56
|
+
- [ ] 我已进行自我审查
|
|
57
|
+
- [ ] 我已添加必要的注释(特别是复杂的逻辑)
|
|
58
|
+
- [ ] 我已更新相关文档
|
|
59
|
+
- [ ] 我的改动没有产生新的警告
|
|
60
|
+
- [ ] 我已添加测试证明我的修复有效或功能正常
|
|
61
|
+
- [ ] 新增和现有的单元测试都通过
|
|
62
|
+
- [ ] 我已更新 CHANGELOG.md(如适用)
|
|
63
|
+
|
|
64
|
+
## 🤔 其他信息
|
|
65
|
+
|
|
66
|
+
添加任何其他相关信息。
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
感谢你的贡献! ❤️
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# 安全政策
|
|
2
|
+
|
|
3
|
+
## 支持的版本
|
|
4
|
+
|
|
5
|
+
我们目前支持以下版本的安全更新:
|
|
6
|
+
|
|
7
|
+
| 版本 | 支持状态 |
|
|
8
|
+
| ------- | ------------------ |
|
|
9
|
+
| 2.3.x | :white_check_mark: |
|
|
10
|
+
| 2.2.x | :white_check_mark: |
|
|
11
|
+
| 2.1.x | :white_check_mark: |
|
|
12
|
+
| < 2.0 | :x: |
|
|
13
|
+
|
|
14
|
+
## 报告安全漏洞
|
|
15
|
+
|
|
16
|
+
我们非常重视 SchemaIO 的安全性。如果你发现了安全漏洞,请**不要**公开披露,而是通过以下方式报告:
|
|
17
|
+
|
|
18
|
+
### 报告渠道
|
|
19
|
+
|
|
20
|
+
**优先方式**:发送邮件至 **rockyshi1993@gmail.com**
|
|
21
|
+
|
|
22
|
+
邮件标题格式:`[SECURITY] SchemaIO - 简短描述`
|
|
23
|
+
|
|
24
|
+
### 应包含的信息
|
|
25
|
+
|
|
26
|
+
请在报告中包含以下信息:
|
|
27
|
+
|
|
28
|
+
1. **漏洞描述**:清晰描述安全问题
|
|
29
|
+
2. **影响范围**:受影响的版本
|
|
30
|
+
3. **重现步骤**:详细的重现步骤
|
|
31
|
+
4. **PoC 代码**:如果可能,提供概念验证代码
|
|
32
|
+
5. **潜在影响**:漏洞可能造成的影响
|
|
33
|
+
6. **建议修复**:如果有修复建议
|
|
34
|
+
|
|
35
|
+
### 报告模板
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
## 漏洞类型
|
|
39
|
+
[例如:注入攻击、拒绝服务、信息泄露]
|
|
40
|
+
|
|
41
|
+
## 影响版本
|
|
42
|
+
[例如:v2.0.0 - v2.3.0]
|
|
43
|
+
|
|
44
|
+
## 漏洞描述
|
|
45
|
+
[详细描述]
|
|
46
|
+
|
|
47
|
+
## 重现步骤
|
|
48
|
+
1. ...
|
|
49
|
+
2. ...
|
|
50
|
+
|
|
51
|
+
## PoC 代码
|
|
52
|
+
```javascript
|
|
53
|
+
// 你的 PoC 代码
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 潜在影响
|
|
57
|
+
[描述可能的影响]
|
|
58
|
+
|
|
59
|
+
## 建议修复
|
|
60
|
+
[如果有]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 响应时间
|
|
64
|
+
|
|
65
|
+
- **初步确认**:1-2 个工作日
|
|
66
|
+
- **漏洞评估**:3-5 个工作日
|
|
67
|
+
- **修复发布**:根据严重程度,7-30 天
|
|
68
|
+
|
|
69
|
+
### 严重程度分级
|
|
70
|
+
|
|
71
|
+
我们使用 CVSS 3.1 评分系统:
|
|
72
|
+
|
|
73
|
+
- **严重**(9.0-10.0):立即修复,< 7 天
|
|
74
|
+
- **高危**(7.0-8.9):优先修复,< 14 天
|
|
75
|
+
- **中危**(4.0-6.9):计划修复,< 30 天
|
|
76
|
+
- **低危**(0.1-3.9):常规修复,< 90 天
|
|
77
|
+
|
|
78
|
+
## 安全最佳实践
|
|
79
|
+
|
|
80
|
+
使用 SchemaIO 时,请遵循以下最佳实践:
|
|
81
|
+
|
|
82
|
+
### 1. 输入验证
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// ✅ 推荐:使用 SchemaIO 验证所有外部输入
|
|
86
|
+
const schema = dsl({
|
|
87
|
+
username: 'string:3-32!'.pattern(/^[a-zA-Z0-9_]+$/),
|
|
88
|
+
email: 'email!',
|
|
89
|
+
age: 'number:0-150'
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const result = validate(schema, userInput);
|
|
93
|
+
if (!result.valid) {
|
|
94
|
+
throw new Error('Invalid input');
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 2. 避免动态执行
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// ❌ 危险:不要从不可信源动态执行代码
|
|
102
|
+
const schemaStr = req.body.schema; // 来自用户输入
|
|
103
|
+
eval(schemaStr); // 危险!
|
|
104
|
+
|
|
105
|
+
// ✅ 安全:使用预定义的 Schema
|
|
106
|
+
const allowedSchemas = {
|
|
107
|
+
user: userSchema,
|
|
108
|
+
post: postSchema
|
|
109
|
+
};
|
|
110
|
+
const schema = allowedSchemas[req.body.schemaType];
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 3. 限制资源使用
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
// ✅ 推荐:限制数组大小,防止 DoS
|
|
117
|
+
const schema = dsl({
|
|
118
|
+
tags: 'array:1-100<string:1-50>' // 限制数组和元素大小
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 4. 保持更新
|
|
123
|
+
|
|
124
|
+
定期更新到最新版本以获得安全补丁:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npm update schema-dsl
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 5. 依赖审计
|
|
131
|
+
|
|
132
|
+
定期运行安全审计:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm audit
|
|
136
|
+
npm audit fix
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## 已知的安全问题
|
|
140
|
+
|
|
141
|
+
### 已修复的漏洞
|
|
142
|
+
|
|
143
|
+
目前没有已知的安全漏洞。
|
|
144
|
+
|
|
145
|
+
查看历史安全公告:[Security Advisories](https://github.com/vextjs/schema-dsl/security/advisories)
|
|
146
|
+
|
|
147
|
+
## 安全相关配置
|
|
148
|
+
|
|
149
|
+
### ReDoS 防护
|
|
150
|
+
|
|
151
|
+
SchemaIO 内置了对正则表达式拒绝服务(ReDoS)的防护:
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
// 内部会检测和缓存安全的正则表达式
|
|
155
|
+
const schema = dsl({
|
|
156
|
+
username: 'string'.pattern(/^[a-zA-Z0-9_]+$/)
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 自定义验证器安全
|
|
161
|
+
|
|
162
|
+
使用自定义验证器时注意:
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
// ⚠️ 注意:自定义验证器中的异步操作
|
|
166
|
+
const schema = dsl({
|
|
167
|
+
email: 'email!'.custom(async (value) => {
|
|
168
|
+
// 确保设置超时,防止挂起
|
|
169
|
+
const exists = await checkEmailExists(value, { timeout: 5000 });
|
|
170
|
+
if (exists) return '邮箱已被占用';
|
|
171
|
+
})
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 致谢
|
|
176
|
+
|
|
177
|
+
我们感谢所有负责任地披露安全问题的研究人员。
|
|
178
|
+
|
|
179
|
+
如果你报告了有效的安全漏洞,我们会在修复后的发布说明中致谢(除非你要求匿名)。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
**最后更新**:2025-12-29
|
|
184
|
+
**联系方式**:rockyshi1993@gmail.com
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main, master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
node-version: [14.x, 16.x, 18.x, 20.x]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v3
|
|
20
|
+
|
|
21
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
22
|
+
uses: actions/setup-node@v3
|
|
23
|
+
with:
|
|
24
|
+
node-version: ${{ matrix.node-version }}
|
|
25
|
+
cache: 'npm'
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: npm ci
|
|
29
|
+
|
|
30
|
+
- name: Run tests
|
|
31
|
+
run: npm test
|
|
32
|
+
|
|
33
|
+
- name: Run benchmarks
|
|
34
|
+
run: npm run test:benchmark
|
|
35
|
+
|