📌

kintoneアプリのフィールド設定をgit管理するためのCLIツールを作りました。

に公開

はじめに

ある日、私はあるプロジェクトで大量のkintoneアプリを作成することになりました。普通に片手で足りないくらいの数のアプリに両手で足りないくらいのフィールドがあるようなアプリ群だったので、「これを全部自力でぽちぽちするんか...?」と途方に暮れていました。

しかし実は面白い裏技がありました。

https://cybozu.dev/ja/kintone/docs/rest-api/apps/add-app/

https://cybozu.dev/ja/kintone/docs/rest-api/apps/form/add-form-fields/

https://cybozu.dev/ja/kintone/docs/rest-api/apps/settings/deploy-app-settings/

なんと上記3つのAPIを叩くことで、JSONで設定したアプリ設定をそのままkintoneアプリ化することができるのです。こら、ぽちぽちするほうが楽とか言うな。

もちろん更新する方法もあります。

https://cybozu.dev/ja/kintone/docs/rest-api/apps/form/get-form-fields/

https://cybozu.dev/ja/kintone/docs/rest-api/apps/form/update-form-fields/

これらを用いることで、kintoneアプリのフィールド設定をJSONで作ったりJSONで書き出し、編集し、デプロイや適用をすることができます。

JSONになるということは、githubで管理を行うことができるということです。アプリ群のバージョン管理等も行うことができるわけですね。ノーコードツール万歳!

というわけで、kintoneにもInfrastructure as Codeのようなアプローチが可能になるようなAPIがすでに整備されていました。

kintone-effect-schema

まぁJSONで管理してもいいんですけど、実は以前に私はkitnone-effect-schemaというライブラリを出しておりまして、追加機能としてkintone form apiのJSONをEffectTSのSchemaとしてTypeScriptコードにする機能を用意してあります。

https://www.npmjs.com/package/kintone-effect-schema

https://github.com/Kensei-Kimoto/kintone-effect-schema

つまり、以下のような流れが可能になります。

kintone
↓ ↑
JSON
↓ ↑
EffectTS Schema (TypeScript)

これにより、TypeScriptで補完を効かせながら、文法チェックを行いながらkintone設定を書くことができ、そのままgithubで管理をすることができます。便利!

今回作ったもの

というわけで今回作ったものがこちら。

https://www.npmjs.com/package/kintone-as-code

https://github.com/Kensei-Kimoto

EffectTSのSchemaの形式でkintoneフィールドの設定ファイルを書いたり、逆にkintoneアプリからEffectTSのSchemaの形式でフィールド設定を書き出したりして、Schemaファイルを編集して再適用したり新しくアプリを作ったりできるCLIツールです。

import { defineAppSchema, getAppId } from 'kintone-as-code';
import type { 
  SingleLineTextFieldProperties,
  NumberFieldProperties,
  SubtableFieldProperties 
} from 'kintone-effect-schema';

// Individual field definitions with complete type information
export const companyNameField: SingleLineTextFieldProperties = {
  type: "SINGLE_LINE_TEXT",
  code: "会社名",
  label: "会社名",
  required: true,
  unique: true,
  maxLength: "100"
};

export const revenueField: NumberFieldProperties = {
  type: "NUMBER",
  code: "売上高",
  label: "年間売上高",
  unit: "円",
  unitPosition: "AFTER"
};

// Subtable with nested fields
export const productsField: SubtableFieldProperties = {
  type: "SUBTABLE",
  code: "products",
  fields: {
    productName: {
      type: "SINGLE_LINE_TEXT",
      code: "productName",
      label: "商品名",
      required: true
    },
    price: {
      type: "NUMBER",
      code: "price",
      label: "単価",
      unit: "円"
    }
  }
};

// App fields configuration
export const appFieldsConfig = {
  properties: {
    会社名: companyNameField,
    売上高: revenueField,
    products: productsField
  }
};

// App schema definition
export default defineAppSchema({
  appId: getAppId('KINTONE_CUSTOMER_APP_ID'),
  name: 'Customer Management',
  description: 'Customer information management app',
  fieldsConfig: appFieldsConfig
});

こんな感じで定義して、applyコマンドで適用します。

kintone-as-code apply [options]

Options:
  --app-id <id>    App ID to update (required)
  --schema <path>  Path to schema file (required)
  --env <env>      Environment name

詳しくは日本語版READMEを読んで欲しいです。

https://github.com/Kensei-Kimoto/kintone-as-code/blob/main/README.ja.md

眠い目を擦って作っているので、ちょっと僕自身疑問に思う点がないでもないですが、おいおい修正していきます。

終わりに

先週の火曜日にkintone-effect-schemaでライブラリ開発デビューをして、そのまま金曜日に2つ目のライブラリを出したその次の月曜である今日また一つライブラリを出せたことを嬉しく思います。

kintone-effect-schemaもkintone-functional-queryもweekly downloadsが最初の1週間で200を越えて、多くの方に注目していただいていることをとても嬉しく感じています。

https://www.npmjs.com/package/kintone-effect-schema

https://www.npmjs.com/package/kintone-functional-query

https://www.npmjs.com/package/kintone-as-code

どれもまだ全然荒すぎて実用性で言えば厳しいとは思うんですが、突飛なアイデアを一応実現可能だと示せた点はとても頑張ったなと思っています。

今後磨き上げていくので、よかったらさまざまな形で応援していただけると嬉しいです。

Discussion