# @accordproject/concertino 中文文档

规范地址：https://npmcn.com/package/%40accordproject/concertino/

版本：5\.2\.1
npm 元数据更新时间：2026-10-17T23:38:24.222Z
中文译文更新时间：2026-11-05T22:53:09.209Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40accordproject/concertino
原文对照：https://npmcn.com/package/%40accordproject/concertino/?lang=original
项目主页：https://github.com/accordproject/concerto
源码仓库：https://github.com/accordproject/concerto

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：2.8 MB，130 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=18
- 运行依赖：2 个
- 首次发布：2025-08-01T16:58:35.100Z
- 最新版本发布：2026-10-17T23:38:23.806Z
- 近 30 天下载量：10569（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：26（近 12 个月 19 个）

## 中文简介

Concerto 模型以对象为中心的序列化

## 安装

```sh
npm install @accordproject/concertino
```

也可以使用：`pnpm add @accordproject/concertino`、`yarn add @accordproject/concertino`、`bun add @accordproject/concertino`

## README

# Concertino - 一个轻量级 Concerto 格式转换器

Concertino是Concerto元模格式的一种轻量级变体,被优化为客户端应用程序,这些应用程序需要在不依赖完整Concerto SDK的情况下进行程序内向声明.

## 音乐会格式的好处

Concertino格式提供了几个优点:

-   平分结构:通过使继承等级非正常化,消费者不需要穿越等级来理解一个定义.
    
-   更明确的元数据:额外的元数据使它更清楚地说明应该如何解释属性.
    
-   准备消费:转换准备数据,以便工具和渲染器更容易地消费,而不需要额外处理.
    

## 特征

-   **完全解析后类型的引用**: 无模糊的简称
-   **平板声明**: 声明不嵌入模型,从而便于类型检索
-   **非正态属性**: 继承属性完全非正常化,并注明来源类型
-   **扩展继承链**:概念列出其完整的继承链,而不仅仅是直系父母
-   **Scalar 类型非正常化**: 为方便客户端应用程序
-   **通过默认严格模式**:命名空间总是被版本.
-   **对部分模型的支持** 允许客户端应用过滤模型,以定制有效载荷用于其使用案例.
-   **无损失转换** Concertino被设计为100%无损失的圆通转换与Concerto模型.

> 音乐会 (Metamodel) → Concertino → Concerto (Metamodel) (英语)

## 安装

```bash
npm install @accordproject/concertino
```

## 使用量

### 使用协奏曲类

[尝试在 Replit](https://replit.com/@mttrbrts/AccordProjectConcertino?v=1)

```javascript
const { ModelManager } = require('@accordproject/concerto-core');
const { ConcertinoConverter } = require('@accordproject/concertino');

// Prepare the Concerto model
const mm = new ModelManager();
mm.addModel(MODEL_FILE_CONTENTS);
const model = mm.getModelFile(MODEL_FILE_NAMESPACE).getAst();

// Initialize Concertino
const converter = new ConcertinoConverter();
const models = { models: [model] };

// Convert from Concerto metamodel to Concertino
const concertino = converter.fromConcertoMetamodel(models);
console.log('#### Concertino:')
console.log(JSON.stringify(concertino, null, 2));
console.log();

// Convert from Concertino back to Concerto metamodel
const metamodel = converter.toConcertoMetamodel(concertino);
console.log('#### Concerto AST (Full Metamodel Instance):')
console.log(JSON.stringify(metamodel, null, 2));
```

### 对照 Concertino 计划检查文档

`converter.isValid(concertino)` 检查文档与 `concertino.schema.json`,以及 `converter.getValidationErrors()` 返回上次检查(jav出错对象)出错,或 `null`。 。 。 .

计划检查是在构建时编译的,所以软件包不需要 `ajv` 也没有 `new Function` (严格的内容-安全政策是好的)。 要检查没有转换器的文档,请导入 `./schema` 子路径 :

```javascript
const { isValid, checkSchema } = require('@accordproject/concertino/schema');

isValid(concertino);     // true or false
checkSchema(concertino); // null, or the errors
```

`convertToConcertino` 财务报告和审定财务报表 `convertToMetamodel` 由他们自己放假进口 计划支票从捆绑.

## 模型大小

尽管元数据已经非正统化,但由于一种受宠若惊,字典式的设计以及去除类型歧视者(即"相克"),"相克"(Concerto AST)模型的JSON系列化在尺寸上往往要小于它们的"相克"等同. `$class` 属性).

预计大量使用遗产的模型将大于同等的Concerto AST.

请注意,在转换模型时,源 Concerto 模型中的命名空间应当被完全解决(包括用于本地类型引用).

## 示例音乐会 JSON 格式

以下是一个简单的 Concerto 模型如何在 Concertino 格式中体现的例子:

```json
{
  "declarations": {
    "readme@1.0.0.Address": {
      "properties": {
        "city": {
          "name": "city",
          "type": "String",
          "vocabulary": {
            "label": "City/Town",
          },
        },
        "country": {
          "name": "country",
          "type": "String",
        },
        "street": {
          "name": "street",
          "type": "String",
          "vocabulary": {
            "label": "Street Address",
          },
        },
        "zipCode": {
          "name": "zipCode",
          "type": "String",
        },
      },
      "type": "ConceptDeclaration",
      "vocabulary": {
        "label": "Physical Address",
      },
    },
    "readme@1.0.0.Email": {
      "regex": "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/",
      "type": "StringScalar",
    },
    "readme@1.0.0.Person": {
      "properties": {
        "address": {
          "isOptional": true,
          "name": "address",
          "type": "readme@1.0.0.Address",
          "vocabulary": {
            "label": "Mailing Address",
          },
        },
        "age": {
          "isOptional": true,
          "name": "age",
          "range": [
            0,
            null,
          ],
          "type": "Integer",
        },
        "email": {
          "isOptional": true,
          "metadata": {
            "sensitive": null,
          },
          "name": "email",
          "regex": "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/",
          "scalarType": "readme@1.0.0.Email",
          "type": "String",
        },
        "firstName": {
          "name": "firstName",
          "type": "String",
          "vocabulary": {
            "label": "Given Name",
          },
        },
        "lastName": {
          "name": "lastName",
          "type": "String",
          "vocabulary": {
            "label": "Family Name",
          },
        },
      },
      "type": "ConceptDeclaration",
      "vocabulary": {
        "additionalTerms": {
          "plural": "People",
        },
        "label": "Individual",
      },
    },
  },
  "metadata": {
    "concertinoVersion": "4.0.0-alpha.2",
    "models": {
      "org.example.models@1.0.0": {
        "concertoVersion": "1.0.0",
        "sourceUri": "org/example/models.cto",
        "decorators": [
          {
            "name": "license",
            "arguments": ["Apache-2.0"]
          }
        ]
      }
    }
  }
}
```

等同的 Concerto CTO 文件为:

```cs
@license("Apache-2.0")
namespace org.example.models@1.0.0

scalar Email extends String regex=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/

@Term("Individual")
@Term_plural("People")
concept Person {
  @Term("Given Name")
  o String firstName
  
  @Term("Family Name")
  o String lastName
  
  o Integer age optional range=[0, ]
  
  @sensitive
  o Email email optional 
  
  @Term("Mailing Address")
  o Address address optional
}

@Term("Physical Address")
concept Address {
  @Term("Street Address")
  o String street
  
  @Term("City/Town")
  o String city
  
  o String zipCode
  o String country
}
```

## 常见问题

### @accordproject/concertino 是什么？

Concerto 模型以对象为中心的序列化

### 如何安装 @accordproject/concertino？

在项目目录运行 npm install @accordproject/concertino，或使用 pnpm add / yarn add / bun add。

### @accordproject/concertino 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @accordproject/concertino 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @accordproject/concertino 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=18。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @accordproject/concertino 可以商用吗？

@accordproject/concertino 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @accordproject/concertino 的下载量有多少？

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

### @accordproject/concertino 还在维护吗？

最新版本 5\.2\.1 发布于 2026/10/18（19 天前）；至今共发布 26 个版本，其中过去 12 个月发布了 19 个；首次发布于 2025/08/02。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

