@contember/bindx-generator

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

Schema generator for @contember/bindx with role-based ACL support

原始使用文档
文档目录12 节
  1. Installation
  2. Usage
  3. Basic Generation (Without ACL)
  4. Generation with Role-Based ACL
  5. Generated Files
  6. Example Output
  7. Options
  8. CLI Usage
  9. How It Works
  10. ACL Filtering
  11. Type Safety
  12. License

@contember/bindx-generator

Schema generator for @contember/bindx with role-based ACL support. Generates TypeScript types and runtime schema definitions from Contember Model.Schema and Acl.Schema.

Installation

npm install @contember/bindx-generator @contember/schema @contember/schema-utils

Usage

Basic Generation (Without 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)
}

Generation with Role-Based 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)

Generated Files

The generator produces 5 files:

FileDescription
entities.tsTypeScript entity types with columns, hasOne, hasMany structure
names.tsRuntime schema names (JSON) for query building
enums.tsTypeScript enum types
types.tsShared schema interface definitions
index.tsExports and pre-configured bindx instance

Example Output

Without 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)

With Role-Based 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)

Options

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 Usage

You can create a script to generate schemas:

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

Add to package.json:

{
  "scripts": {
    "generate:schema": "tsx scripts/generate-schema.ts"
  }
}

How It Works

ACL Filtering

The generator applies ACL permissions similar to Contember's IntrospectionSchemaFactory:

  1. Entity Filtering: Only entities with read operations are included
  2. Field Filtering: Only fields with read permissions (true or predicates) are included
  3. Relation Filtering: Relations to inaccessible entities are excluded
  4. Role Inheritance: Permissions from inherited roles are merged

Type Safety

Generated types are fully type-safe:

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

License

MIT

版本与发布记录

@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 是什么?

Schema generator for @contember/bindx with role-based ACL support

如何安装 @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 和提交记录判断。