mirror of
https://code.castopod.org/adaures/castopod
synced 2025-04-19 13:01:19 +00:00
405 lines
9.9 KiB
JSON
405 lines
9.9 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "/schemas/manifest.json",
|
|
"title": "JSON schema for Castopod Plugins's manifest.json files",
|
|
"description": "The Castopod plugin manifest defines both metadata and behavior of a plugin",
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"description": "The plugin name, including 'vendor-name/' prefix",
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9]([_.-]?[a-z0-9]+)*$",
|
|
"examples": ["acme/hello-world"]
|
|
},
|
|
"version": {
|
|
"description": "The plugin's semantic version. See https://semver.org/",
|
|
"type": "string",
|
|
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
|
|
"examples": ["1.0.0"]
|
|
},
|
|
"description": {
|
|
"description": "This helps people discover your plugin as it's listed in repositories",
|
|
"type": "string"
|
|
},
|
|
"authors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/$defs/person"
|
|
}
|
|
},
|
|
"homepage": {
|
|
"description": "The URL to the plugin homepage",
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"license": {
|
|
"description": "You should specify a license for your plugin so that people know how they are permitted to use it, and any restrictions you're placing on it.",
|
|
"default": "UNLICENSED",
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"enum": [
|
|
"AGPL-3.0-only",
|
|
"AGPL-3.0-or-later",
|
|
"Apache-2.0",
|
|
"BSL-1.0",
|
|
"GPL-3.0-only",
|
|
"GPL-3.0-or-later",
|
|
"LGPL-3.0-only",
|
|
"LGPL-3.0-or-later",
|
|
"MIT",
|
|
"MPL-2.0",
|
|
"Unlicense",
|
|
"UNLICENSED"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"private": {
|
|
"type": "boolean",
|
|
"description": "If set to true, then repositories should refuse to publish it."
|
|
},
|
|
"keywords": {
|
|
"description": "This helps people discover your plugin as it's listed in repositories",
|
|
"type": "array",
|
|
"items": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"enum": [
|
|
"accessibility",
|
|
"analytics",
|
|
"monetization",
|
|
"podcasting2",
|
|
"privacy",
|
|
"productivity",
|
|
"seo"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
"minCastopodVersion": {
|
|
"description": "The minimal version of Castopod for which the plugin is compatible with.",
|
|
"type": "string",
|
|
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))?(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
|
|
"examples": ["2.0"]
|
|
},
|
|
"hooks": {
|
|
"description": "The hooks used by the plugin.",
|
|
"type": "array",
|
|
"items": {
|
|
"enum": [
|
|
"rssBeforeChannel",
|
|
"rssAfterChannel",
|
|
"rssBeforeItem",
|
|
"rssAfterItem",
|
|
"siteHead"
|
|
]
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
"settings": {
|
|
"type": "object",
|
|
"properties": {
|
|
"general": {
|
|
"$ref": "#/$defs/fields"
|
|
},
|
|
"podcast": {
|
|
"$ref": "#/$defs/fields"
|
|
},
|
|
"episode": {
|
|
"$ref": "#/$defs/fields"
|
|
}
|
|
}
|
|
},
|
|
"files": {
|
|
"description": "List of files to include in your plugin package. If you include a folder in the array, all files inside it will also be included.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"repository": {
|
|
"description": "Specify the place where your plugin code lives. This is helpful for people who want to contribute.",
|
|
"type": ["object", "string"],
|
|
"properties": {
|
|
"type": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"directory": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"required": ["name", "version"],
|
|
"additionalProperties": false,
|
|
"$defs": {
|
|
"person": {
|
|
"description": "A person who has been involved in creating or maintaining this plugin.",
|
|
"type": ["object", "string"],
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
}
|
|
},
|
|
"fields": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^[A-Za-z]+[\\w\\-\\:\\.]*$": { "$ref": "#/$defs/field" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"field": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"checkbox",
|
|
"datetime",
|
|
"email",
|
|
"group",
|
|
"html",
|
|
"markdown",
|
|
"number",
|
|
"radio-group",
|
|
"rss",
|
|
"select-multiple",
|
|
"select",
|
|
"text",
|
|
"textarea",
|
|
"toggler",
|
|
"url"
|
|
],
|
|
"default": "text"
|
|
},
|
|
"label": {
|
|
"type": "string"
|
|
},
|
|
"hint": {
|
|
"type": "string"
|
|
},
|
|
"helper": {
|
|
"type": "string"
|
|
},
|
|
"optional": {
|
|
"type": "boolean"
|
|
},
|
|
|
|
"validationRules": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"multiple": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": ["label"],
|
|
"unevaluatedProperties": false,
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/field-multiple-implies-options-is-required" },
|
|
{ "$ref": "#/$defs/require-fields-for-group-type" },
|
|
{ "$ref": "#/$defs/default-value-based-on-type" }
|
|
]
|
|
},
|
|
"option": {
|
|
"type": "object",
|
|
"properties": {
|
|
"label": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["label"],
|
|
"additionalProperties": false
|
|
},
|
|
"field-multiple-implies-options-is-required": {
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["radio-group", "select", "select-multiple"]
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"options": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^[A-Za-z0-9]+[\\w\\-\\:\\.]*$": { "$ref": "#/$defs/option" }
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"required": ["options"]
|
|
}
|
|
},
|
|
"require-fields-for-group-type": {
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "group"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"fields": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^[A-Za-z]+[\\w\\-\\:\\.]*$": { "$ref": "#/$defs/field" }
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"required": ["fields"]
|
|
}
|
|
},
|
|
"default-value-based-on-type": {
|
|
"allOf": [
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"html",
|
|
"markdown",
|
|
"radio-group",
|
|
"rss",
|
|
"select",
|
|
"text",
|
|
"textarea"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["checkbox", "toggler"]
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "boolean" }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "datetime"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "string", "format": "date-time" }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "email"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "string", "format": "email" }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "number"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "number" }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "select-multiple"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "url"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"defaultValue": { "type": "string", "format": "uri" }
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|