このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで分かること

  • マニフェスト(emdash-plugin.jsonc)の役割と、識別情報・バージョン・パッケージのプロフィールのフィールド
  • 信頼にかかわる宣言(capabilitiesallowedHostsstorage)と、管理画面のページ・ウィジェットの宣言
  • リリース用のフィールド、公開者の固定(publisher)、マニフェストの検証方法
難易度
上級
読む時間
6分
このページの目次

すべてのサンドボックス型プラグインは、ルートディレクトリに emdash-plugin.jsonc ファイルを持ちます。プラグインがnpmパッケージでもある場合、このファイルは package.json と同じ場所に置きます。マニフェスト(manifest)は、プラグインを識別し、必要なアクセスとストレージを宣言し、プラグインレジストリの掲載情報とリリースのための情報を提供します。プラグインCLIは、検証、ビルド、バンドル、公開、自動リリースの準備のときにこのファイルを読み込みます。

このファイルはJSON with Comments(JSONC)形式のため、コメントと末尾のカンマを書けます。emdash-plugin init が作成した $schema プロパティは残しておきます。エディターは生成されたスキーマを入力補完に使い、完全な検証は emdash-plugin validate が担当します。

次の例には、すべてのフィールドのグループが入っています。

emdash-plugin.jsonc
{
	"$schema": "./node_modules/@emdash-cms/plugin-cli/schemas/emdash-plugin.schema.json",

	"slug": "gallery",
	"publisher": "did:plc:abc123def456",

	"license": "MIT",
	"author": { "name": "Jane Doe", "url": "https://example.com" },
	"security": { "email": "security@example.com" },
	"name": "Gallery",
	"description": "Image galleries for EmDash content.",
	"keywords": ["gallery", "images"],
	"sections": {
		"installation": { "file": "./docs/installation.md" },
		"faq": { "file": "./docs/faq.md" },
	},

	"capabilities": ["content:read"],
	"allowedHosts": [],
	"storage": {
		"galleries": { "indexes": ["contentId"] },
	},

	"admin": {
		"pages": [{ "path": "/gallery", "label": "Gallery", "icon": "image" }],
	},

	"repo": "https://github.com/example/plugin-gallery",
	"release": {
		"requires": { "env:emdash": ">=0.37.0" },
		"artifacts": {
			"icon": { "file": "./images/icon.png" },
			"screenshots": [{ "file": "./images/editor.png", "lang": "en" }],
		},
	},
}

識別情報とバージョン

フィールド 必須 ルール
slug はい 英小文字で始まり、以降は英小文字、数字、-_ を使います。最大64文字です。
publisher はい AtmosphereアカウントのDIDまたはハンドルです。ハンドルは所有者が変わることがあるため、DIDを推奨します。
version 場合による ビルドメタデータを含まないSemver 2.0です。package.json でバージョンを指定する場合は省略します。

publisherとslugが、プラグインレジストリの中でパッケージを識別します。slugはプラグインのルートのURLにも使われるため、npmのパッケージ名とは別のものです。たとえば @example/plugin-gallery というパッケージには、gallery を使います。

バージョンの値を1つに保つ

ビルドは、versionpackage.json#version を突き合わせます。

  • 両方のファイルでバージョンを指定している場合、値が一致している必要があります。
  • 一方のファイルだけで指定している場合、ビルドはその値を使います。
  • どちらのファイルでも指定していない場合、ビルドは失敗します。

npmパッケージの場合は、バージョンを package.json に書き、マニフェストからは省略します。package.json を持たない、プラグインレジストリ専用のプラグインでは、マニフェストに version を指定する必要があります。

パッケージのプロフィール

パッケージのプロフィールは、リリースをまたいで表示される、変わらない情報を提供します。

フィールド 必須 ルール
license はい 空でないSPDX式で、256文字以内です。
author または authors はい どちらか一方の形式を使います。authorname と、省略可能な url または email を持ちます。authors は1〜32件を受け付けます。
security または securityContacts はい どちらか一方の形式を使います。各連絡先には emailurl、またはその両方が必要です。リストは1〜8件を受け付けます。
name いいえ 表示名で、1,024文字以内です。省略した場合はslugが使われます。
description いいえ 短い説明で、1,024文字以内です。一覧で切り詰めずに済むよう、プラグインレジストリの慣例である140書記素(grapheme)前後にします。
keywords いいえ 空でない文字列を5つまで指定できます。それぞれ128文字以内です。
sections いいえ descriptioninstallationfaqchangelogsecurity の、CommonMarkで書いた長文のセクションです。

各セクションは、インラインの文字列か、マニフェストからの相対パスでのファイル参照で書きます。

emdash-plugin.jsonc
"sections": {
	"description": "A longer description written in CommonMark.",
	"installation": { "file": "./docs/installation.md" },
	"security": { "file": "./SECURITY.md" },
}

解決後の各セクションは、20,000バイトかつ2,000書記素までです。ファイル参照はマニフェストのディレクトリの中にとどまる必要があります。絶対パスと、ディレクトリの外に出る .. のパスは拒否されます。

publish は、最初のリリースでパッケージのプロフィールを作成します。以降のリリースでは、プロフィールのフィールドは置き換えられません。公開済みのプロフィールは emdash-plugin update-package で編集します。このコマンドは、既定では変更内容をプレビューするだけで、--yes を付けたときだけ書き込みます。

信頼に関する取り決め

信頼に関する取り決め(trust contract)は、capabilitiesallowedHostsstorage で構成されます。これらのフィールドは、プラグインが何にアクセスできるか、プラグインがどのコレクションを作成して所有するかを運営者に伝えます。

次の宣言は、コンテンツの読み取りを許可し、1つのAPIとそのサブドメインへのリクエストを許可し、ストレージのコレクションを1つ作成します。

emdash-plugin.jsonc
"capabilities": ["content:read", "network:request"],
"allowedHosts": ["api.example.com", "*.cdn.example.com"],
"storage": {
	"events": {
		"indexes": ["savedAt", ["collection", "savedAt"]],
		"uniqueIndexes": ["eventId"],
	},
}

権限とホスト

3つのフィールドの既定値はすべて空です。雛形は、空の値を明示的に書き込みます。これによって、レビューする人が、プラグインが追加のアクセスもコレクションも求めていないことを確認できます。

network:request には、allowedHosts にホスト名だけの値が少なくとも1つ必要です。network:request:unrestricted は、意図的にすべての公開ホストを許可するため、空のリストが必要です。すべての権限(Capability)、その影響、ホストのパターン、実行時の強制については、権限(Capabilities)とセキュリティが正式なリファレンスです。

ストレージ

storage の各キーは、プラグインが所有するコレクションを1つ指定します。その indexesuniqueIndexes によって、プラグインがどのフィールドで絞り込みや並べ替えをできるかが決まります。コレクション名、インデックスの設計、検索、ページ分割は、ストレージで説明しています。

インストール済みのサイトは以前の宣言に同意しているため、信頼に関する取り決めを少しでも変える場合は、プラグインの新しいバージョンが必要です。取り決めの範囲を広げる場合は、メジャーバージョンを上げます。

本サイトの補足 やさしい解説

公式の対応表では、WordPressのプラグインにあたるのがEmDashのプラグインです。サンドボックス型プラグインは、マニフェストの capabilities(使う権限)、allowedHosts(通信してよい外部のホスト)、storage(プラグインが所有するコレクション)で、何にアクセスできるかを宣言します。インストール済みのサイトはこの宣言に同意しているため、宣言を変えるときは新しいバージョンとして出し直し、範囲を広げる場合はメジャーバージョンを上げます。

管理画面のページとウィジェット

サンドボックス型プラグインは、管理画面のページとダッシュボードのウィジェットをBlock Kitで描画します。マニフェストでは、それらを表示する場所を宣言します。

emdash-plugin.jsonc
"admin": {
	"pages": [{ "path": "/settings", "label": "Settings", "icon": "settings" }],
	"widgets": [{ "id": "recent-events", "title": "Recent events", "size": "half" }],
}

ページのパスは / で始まり、英字、数字、/_- を使います。ウィジェットのIDには、プラグインのslugと同じ英小文字の識別子の文字を使います。ウィジェットのサイズは fullhalfthird のどれかです。

ページまたはウィジェットを宣言したプラグインは、src/plugin.tsadmin という名前のルートを定義する必要があります。このルートがないと、EmDashがBlock Kitのレスポンスのために呼び出す先がなくなるため、バンドルのチェックが失敗します。

リリース用のフィールド

release は、特定のバージョンについて記述します。トップレベルの repo のURLは、リリースの記録に書き込まれます。また、自動リリースの設定で、パッケージのプロフィールをGitHubのリポジトリに結び付けるためにも使われます。

フィールド 用途
repo ソースリポジトリのHTTPSのURLです。自動リリースの設定には、正規の公開GitHubリポジトリのURLが必要です。
release.requires ホストの要件です。キーは env:<name> またはパッケージのDIDで、値はsemverの範囲です。
release.artifacts.icon リリースのアイコンとして表示する画像です。
release.artifacts.banner リリースの掲載ページのバナー画像です。
release.artifacts.screenshots 順序付きのスクリーンショットのギャラリーで、8件まで指定できます。

env:emdashenv:astro で、そのリリースをインストールできるEmDashとAstroのバージョンの範囲を指定します。

emdash-plugin.jsonc
"release": {
	"requires": {
		"env:emdash": ">=0.37.0",
		"env:astro": ">=5.0.0 <7.0.0",
	},
}

EmDashは、インストールの前にこれらの要件を確認します。無効な範囲を書くとマニフェストの検証が失敗し、互換性のないリリースはインストールされません。

成果物(artifacts)のファイルパスはマニフェストからの相対パスで、マニフェストのディレクトリの中にとどまる必要があります。PNG、JPEG、WebPに対応しています。各ファイルは1 MiBまで、縦横どちらも8,192ピクセルまでです。省略可能な lang プロパティには、BCP 47の言語タグで、ローカライズした画像の言語を指定します。公開時、これらのファイルはプラグインのバンドルとは別にアップロードされ、実測した形式、寸法、チェックサム、パーソナルデータサーバー(PDS)のblobの参照が記録されます。

公開者の固定

publisher は、誤って別のAtmosphereアカウントから公開してしまうことを防ぎます。アカウントのDIDを使います。

emdash-plugin.jsonc
"publisher": "did:plc:abc123def456", // jane.example.com

公開や自動リリースの準備の前に、CLIはマニフェストのpublisherと、現在のセッションを比較します。ハンドルの場合は、比較のために現在のDIDに解決されます。一致しない場合は MANIFEST_PUBLISHER_MISMATCH で失敗します。これを無視するフラグはありません。

別のセッションが有効になっている場合は、emdash-plugin whoami を実行してから、固定したアカウントに切り替えます。

emdash-plugin switch did:plc:abc123def456

マニフェストのpublisherは、パッケージを別のアカウントに移管するときだけ変更します。

本サイトの補足 やさしい解説

Atmosphereアカウントには、jane.example.com のような読みやすいハンドルと、did:plc:… で始まる変わらないID(DID)があります。ハンドルは持ち主が変わることがあるため、publisher にはDIDを書いておくと、公開するアカウントを取り違えても公開前に止まります。止まったときは emdash-plugin whoami で今のアカウントを確かめ、emdash-plugin switch で切り替えます。

マニフェストを検証する

ビルドや公開の前に、マニフェストを検証します。

emdash-plugin validate

別のマニフェストを検証するには、ファイルまたはディレクトリを渡します。

emdash-plugin validate ./packages/plugin-gallery

検証はオフラインで動きます。重複したプロパティ、未知のフィールド、無効な値、同時に使えない形式、そして allowedHosts のリストが空なのに network:request を指定している場合のような、フィールドをまたぐエラーを報告します。

ビルドのコマンドはプラグインCLIを、リリースの流れはバンドルと公開を参照します。