@ contember/bindx-生成器
Schema 生成器用于 @contember/bindx 与基于角色的ACL支持. 从 Contember 生成 TypeScript 类型和运行时间计划定义 Model.Schema 财务报告和审定财务报表 Acl.Schema。 。 。 .
安装
npm install @contember/bindx-generator @contember/schema @contember/schema-utils
使用量
基本一代(不含ACL)
import { generate } from '@contember/bindx-generator'
import { Model } from '@contember/schema'
const model: Model.Schema = {
enums: { /* ... */ },
entities: { /* ... */ }
}
const files = generate(model)
// Write files
for (const [filename, content] of Object.entries(files)) {
fs.writeFileSync(`./generated/${filename}`, content)
}
以作用为基础的ACL生成
import { generate } from '@contember/bindx-generator'
import { Model, Acl } from '@contember/schema'
const model: Model.Schema = { /* ... */ }
const acl: Acl.Schema = {
roles: {
public: {
stages: '*',
entities: {
Article: {
predicates: {},
operations: {
read: {
id: true,
title: true,
// Only public fields
}
}
}
},
variables: {}
},
editor: {
stages: '*',
entities: {
Article: {
predicates: {},
operations: {
read: {
id: true,
title: true,
content: true,
author: true,
// All fields accessible to editors
}
}
}
},
variables: {}
}
}
}
const files = generate(model, acl)
生成的文件
生成器产生5个文件 :
| 文件 | 说明 |
|---|---|
entities.ts | 类型脚本实体类型 columns, (中文(简体) ), hasOne, (中文(简体) ), hasMany 结构 |
names.ts | 查询架构的运行时计划名称( JSON) |
enums.ts | 类型 |
types.ts | 共享的策略界面定义 |
index.ts | 导出和预配置的绑定实例 |
示例输出
没有ACL
// entities.ts
export interface Article {
columns: {
id: string
title: string
content: string | null
}
hasOne: {
author: Author
}
hasMany: {
tags: Tag
}
}
// index.ts
export const { useEntity, useEntityList, Entity, createComponent } = createBindx<BindxSchema>(schemaNames)
基于作用的ACL
// entities.ts
export interface PublicArticle {
columns: {
id: string
title: string
}
hasOne: {}
hasMany: {}
}
export interface EditorArticle {
columns: {
id: string
title: string
content: string | null
}
hasOne: {
author: EditorAuthor
}
hasMany: {
tags: EditorTag
}
}
export interface RoleSchemas {
public: PublicSchema
editor: EditorSchema
}
// index.ts
export const {
roleSchemaRegistry,
RoleAwareProvider,
Entity,
HasRole,
useEntity,
useEntityList,
createComponent
} = createRoleAwareBindx<RoleSchemas>(roleSchemaDefinitions)
选项
export interface BindxGeneratorOptions {
/**
* Whether to flatten inherited roles.
* Default: true
*/
flattenInheritance?: boolean
/**
* Whether to treat predicate-based permissions as allowed.
* When true, any non-false permission allows access.
* When false, only explicit `true` permissions are allowed.
* Default: true
*/
allowPredicateAccess?: boolean
}
const files = generate(model, acl, {
flattenInheritance: true,
allowPredicateAccess: true
})
CLI 使用量
您可以创建一个脚本来生成计划 :
// scripts/generate-schema.ts
import { generate } from '@contember/bindx-generator'
import { Model, Acl } from '@contember/schema'
import { writeFile, mkdir } from 'fs/promises'
import { join } from 'path'
// Import your model and ACL
import { model, acl } from './your-schema'
async function main() {
const files = generate(model, acl)
const outputDir = './src/generated'
await mkdir(outputDir, { recursive: true })
for (const [filename, content] of Object.entries(files)) {
await writeFile(join(outputDir, filename), content)
}
console.log('✅ Schema generated')
}
main()
添加为 package.json数字 :
{
"scripts": {
"generate:schema": "tsx scripts/generate-schema.ts"
}
}
如何运作
ACL 过滤
生成器应用类似于 Contember 的 ACL 权限 IntrospectionSchemaFactory数字 :
- 实体过滤: 仅有实体
read包括业务 - 字段过滤: 只有有读权限的字段(
true或上游) - 关系过滤: 与无法进入的实体的关系被排除在外
- 角色继承: 继承角色的权限被合并
类型安全
生成类型完全类型安全 :
// Public role cannot access content field
<RoleAwareProvider roles={['public']}>
<Entity name="Article" id={id}>
{article => (
// ✅ OK
<div>{article.data.title}</div>
// ❌ Type error: 'content' doesn't exist on PublicArticle
<div>{article.data.content}</div>
)}
</Entity>
</RoleAwareProvider>
许可证
麻省理工学院