#schema #jddf #generate #data #structs #cli #typescript

app jddf-codegen

从JDDF模式生成代码

2个版本

0.1.1 2019年9月11日
0.1.0 2019年9月11日

#1758开发工具

每月 21 次下载

MIT 许可协议

15KB
267 代码行

jddf-codegen

jddf-codegen 是一个命令行工具,可以从 JDDF 模式生成数据结构(例如结构体、类、接口等)。

使用方法

本节描述了如何针对每种语言使用 jddf-codegen

TypeScript

您可以使用 jddf-codegen 自动从您的 JDDF 模式生成 TypeScript interface。这样,您就可以基于与您的其他代码库相同的真相源编写类型安全的代码了!

要在 TypeScript 代码库中使用 jddf-codegen,建议您从 package.json 脚本调用 jddf-codegen。例如,假设您的代码库像这样钩子

my-sweet-package        // the root of your package
├── package.json        // you'll invoke jddf-codegen in here
├── message.jddf.json   // your JDDF schema
└── src                 // where you put your TypeScript code
    ├── index.ts        // where you'll import the generated code from
    └── message         // a directory for containing generated code
        └── index.ts    // jddf-codegen will generate this file

在这个例子中,您的模式在 message.jddf.json 中。让我们假设它包含以下内容

{
  "definitions": {
    "user": {
      "properties": {
        "id": { "type": "string" },
        "name": { "type": "string" }
      }
    }
  },
  "properties": {
    "messageId": { "type": "string" },
    "timestamp": { "type": "timestamp" },
    "details": {
      "discriminator": {
        "tag": "type",
        "mapping": {
          "user_created": {
            "properties": {
              "user": { "ref": "user" }
            }
          },
          "user_deleted": {
            "properties": {
              "userId": { "type": "string" }
            }
          }
        }
      }
    }
  }
}

然后您可以从 package.json 中的脚本调用 jddf-codegen,如下所示

{
  "scripts": {
    "jddf-codegen": "jddf-codegen --ts-out=src/message -- message.jddf.json"
  }
}

这将生成如下所示的代码

export interface User {
  id: string;
  name: string;
}

export interface AnalyticsDetailsUserDeleted {
  type: "user_deleted";
  userId: string;
}

export interface AnalyticsDetailsUserCreated {
  type: "user_created";
  user: User;
}

export interface Analytics {
  messageId: string;
  timestamp: string;
  details: AnalyticsDetailsUserDeleted | AnalyticsDetailsUserCreated;
}

因此,您可以从手写的代码中这样导入

import { Analytics } from "./message";

// If you happen to know that `data` is JSON valid against a JDDF schema, then
// you can safely cast it into Analytics. And then you can enjoy type-safe and
// auto-completed code!
const data = JSON.parse(...);
const analyticsEvent = data as Analytics;

// This is type-checked now:
switch (analyticsEvent.details.type) {
  case "user_deleted":
    console.log("user deleted", analyticsEvent.details.userId);
  case "user_created":
    console.log("user created", analyticsEvent.details.user.id);
}

依赖关系

~2.3–3.5MB
~63K SLoC