@contember/bindx-generator

中文文档
0.1.61发布于 2026/11/05MITES Module构建来源已验证近 30 天下载 6823

@ contember/ bindx 的 Schema 生成器, 有基于角色的 ACL 支持

中文使用文档
文档目录12 节
  1. 安装
  2. 使用量
  3. 基本一代(不含ACL)
  4. 以作用为基础的ACL生成
  5. 生成的文件
  6. 示例输出
  7. 选项
  8. CLI 使用量
  9. 如何运作
  10. ACL 过滤
  11. 类型安全
  12. 许可证

@ 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数字 :

  1. 实体过滤: 仅有实体 read 包括业务
  2. 字段过滤: 只有有读权限的字段(true 或上游)
  3. 关系过滤: 与无法进入的实体的关系被排除在外
  4. 角色继承: 继承角色的权限被合并

类型安全

生成类型完全类型安全 :

// 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>

许可证

麻省理工学院

版本与发布记录

@contember/bindx-generator 共发布 56 个版本,首次发布于 2026/03/23;过去 12 个月发布了 56 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.61latest2026/11/055 天前
0.1.602026/11/046 天前
0.1.592026/11/037 天前
0.1.572026/10/3110 天前
0.1.562026/10/3011 天前
0.1.552026/10/3011 天前

关于 @contember/bindx-generator 的常见问题

@contember/bindx-generator 是什么?

@ contember/ bindx 的 Schema 生成器, 有基于角色的 ACL 支持

如何安装 @contember/bindx-generator?

在项目目录运行 npm install @contember/bindx-generator,或使用 pnpm add / yarn add / bun add。

@contember/bindx-generator 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/contember__bindx-generator 是否存在。

@contember/bindx-generator 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@contember/bindx-generator 可以商用吗?

@contember/bindx-generator 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@contember/bindx-generator 的下载量有多少?

根据 npm 官方下载统计,@contember/bindx-generator 在 2026/10/11 – 2026/11/09 这 30 天内被下载 6,823 次,日均约 227 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@contember/bindx-generator 还在维护吗?

最新版本 0.1.61 发布于 2026/11/05(5 天前);至今共发布 56 个版本,其中过去 12 个月发布了 56 个;首次发布于 2026/03/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。