From d480ef908cf845f19d11c7b566e00d4564b1c9fc Mon Sep 17 00:00:00 2001 From: cobalt <61329810+cobaltt7@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:31:37 -0500 Subject: [PATCH 1/5] Remove `addonPreview`/`presetPreview` enums --- 1/1.23.json | 1067 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1067 insertions(+) create mode 100644 1/1.23.json diff --git a/1/1.23.json b/1/1.23.json new file mode 100644 index 0000000..7a42569 --- /dev/null +++ b/1/1.23.json @@ -0,0 +1,1067 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/ScratchAddons/manifest-schema/master/1/1.22.json", + "title": "Scratch Addons addon manifest", + "description": "The manifest that describes an addon.", + "type": "object", + "definitions": { + "cssManipulator": { + "description": "The value manipulator.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "settingValue" + }, + "settingId": { + "type": "string", + "description": "The setting ID to reference." + } + }, + "required": ["settingId"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "ternary" + }, + "source": { + "description": "The source to manipulate.", + "$ref": "#/definitions/cssManipulator" + }, + "true": { + "description": "The value in case the source is truthy.", + "anyOf": [ + { + "$ref": "#/definitions/cssManipulator" + }, + { + "type": "null" + } + ] + }, + "false": { + "description": "The value in case the source is falsy.", + "anyOf": [ + { + "$ref": "#/definitions/cssManipulator" + }, + { + "type": "null" + } + ] + } + }, + "required": ["source", "true", "false"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "textColor" + }, + "source": { + "description": "The source to manipulate.", + "$ref": "#/definitions/cssManipulator" + }, + "threshold": { + "$ref": "#/definitions/cssManipulator" + }, + "black": { + "description": "The value for black text.", + "$ref": "#/definitions/cssManipulator" + }, + "white": { + "description": "The value for white text.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": ["source"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "multiply" + }, + "source": { + "description": "The source to manipulate.", + "$ref": "#/definitions/cssManipulator" + }, + "r": { + "type": "number", + "description": "The red value of the color.", + "default": 1, + "minimum": 0 + }, + "g": { + "type": "number", + "description": "The green value of the color.", + "default": 1, + "minimum": 0 + }, + "b": { + "type": "number", + "description": "The blue value of the color.", + "default": 1, + "minimum": 0 + }, + "a": { + "type": "number", + "description": "The alpha/opacity value of the color.", + "default": 1, + "minimum": 0 + } + }, + "required": ["source"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "brighten" + }, + "source": { + "description": "The source to manipulate.", + "$ref": "#/definitions/cssManipulator" + }, + "r": { + "type": "number", + "description": "The red value of the color.", + "default": 1, + "minimum": 0 + }, + "g": { + "type": "number", + "description": "The green value of the color.", + "default": 1, + "minimum": 0 + }, + "b": { + "type": "number", + "description": "The blue value of the color.", + "default": 1, + "minimum": 0 + }, + "a": { + "type": "number", + "description": "The alpha/opacity value of the color.", + "default": 1, + "minimum": 0 + } + }, + "required": ["source"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "alphaBlend" + }, + "opaqueSource": { + "description": "The source that provides opaque color.", + "$ref": "#/definitions/cssManipulator" + }, + "transparentSource": { + "description": "The source that provides transparent color.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": ["opaqueSource", "transparentSource"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "recolorFilter" + }, + "source": { + "description": "The source that provides the color.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": ["source"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "makeHsv" + }, + "h": { + "description": "The source that provides hue.", + "$ref": "#/definitions/cssManipulator" + }, + "s": { + "description": "The source that provides saturation.", + "$ref": "#/definitions/cssManipulator" + }, + "v": { + "description": "The source that provides value.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": ["h", "s", "v"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "map" + }, + "source": { + "description": "The source that provides the color.", + "$ref": "#/definitions/cssManipulator" + }, + "options": { + "type": "object", + "description": "The possible options.", + "minProperties": 1, + "patternProperties": { + ".*": { + "$ref": "#/definitions/cssManipulator" + } + } + }, + "default": { + "description": "The default, in case the source does not map to any options.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": ["source", "options"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of the manipulator.", + "const": "alphaThreshold" + }, + "source": { + "description": "The source that provides the color.", + "$ref": "#/definitions/cssManipulator" + }, + "threshold": { + "description": "The alpha threshold for using opaque color.", + "$ref": "#/definitions/cssManipulator" + }, + "opaque": { + "description": "The opaque color.", + "$ref": "#/definitions/cssManipulator" + }, + "transparent": { + "description": "The transparent color.", + "$ref": "#/definitions/cssManipulator" + } + }, + "required": [ + "source", + "opaque", + "transparent" + ] + } + ] + }, + "matches": { + "oneOf": [ + { + "type": "string", + "description": "A match rule for any URL on Scratch origin. The script will execute in all pages.", + "const": "*" + }, + { + "type": "string", + "description": "A RegEx match rule. Patterns starting with https will be treated as an absolute RegEx pattern, and patterns that don't start will be treated as an relative RegEx pattern.", + "pattern": "^\\^" + }, + { + "type": "array", + "description": "An array that contains match rules. The script will execute if it matches any of the rules.", + "items": { + "oneOf": [ + { + "type": "string", + "description": "A RegEx match rule. Patterns starting with https will be treated as an absolute RegEx pattern, and patterns that don't start will be treated as an relative RegEx pattern.", + "pattern": "^\\^" + }, + { + "type": "string", + "description": "A match rule shortcut.", + "enum": ["projects", + "projectEmbeds", "studios", "studioComments", "profiles", "topics", "newPostScreens", "editingScreens", "forums", "scratchWWWNoProject"] + }, + { + "type": "string", + "description": "A match rule shortcut matcher.", + "enum": ["isNotScratchWWW"] + }, + { + "type": "string", + "description": "A URL match rule.", + "pattern": "^https://", "$comment": "TODO: Clarify this. This seemed only for absolute patterns. Is the relative is on the top?" + } + ] + }, + "minItems": 1 + } + ] + }, + "if": { + "type": "object", + "properties": { + "settings": { + "type": "object", + "minProperties": 1 + }, + "addonEnabled": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + ] + } + } + }, + "serializedTableNestableSetting": { + "type": ["boolean", "number", "string"] + }, + "serializedTableNestableSettings": { + "type": "object", + "patternProperties": { + ".": { + "$ref": "#/definitions/serializedTableNestableSetting" + } + }, + "minProperties": 1 + }, + "tableNestableSettings": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the setting.", + "minLength": 1 + }, + "description": { + "type": "string", + "description": "The description of the setting shown in a tooltip.", + "minLength": 1 + }, + "id": { + "type": "string", + "description": "The identifier of the setting to get the specified value from your code.", + "minLength": 1 + }, + "type": { + "type": "string", + "description": "The type of the setting", + "enum": ["boolean", "positive_integer", "string", "select", "color", "integer", "untranslated"], + "minLength": 1 + }, + "default": { + "type": ["boolean", "integer", "string"], + "description": "The default value of the setting." + }, + "potentialValues": {}, + "min": {}, + "max": {}, + "allowTransparency": {}, + "if": { + "$ref": "#/definitions/if" + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "select" + } + } + }, + "then": { + "properties": { + "potentialValues": { + "type": "array", + "description": "The potential values for the select setting.", + "items": { + "type": ["string", "object"], + "description": "A potential value for the select setting.", + "allOf": [ + { + "if": { + "type": "string" + }, + "then": { + "minLength": 1 + } + }, + { + "if": { + "type": "object" + }, + "then": { + "properties": { + "name": { + "type": "string", + "description": "The name of the potential value.", + "minLength": 1 + }, + "id": { + "type": "string", + "description": "The identifier of the potential value.", + "minLength": 1 + } + } + } + } + ] + }, + "minItems": 1 + }, + "default": { + "type": "string" + } + }, + "required": ["potentialValues"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "boolean" + } + } + }, + "then": { + "properties": { + "default": { + "type": "boolean" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "positive_integer" + } + } + }, + "then": { + "properties": { + "default": { + "type": "integer", + "minimum": 0 + } + } + } + }, + { + "if": { + "properties": { + "type": { + "enum": ["string", "untranslated"] + } + } + }, + "then": { + "properties": { + "default": { + "type": "string" + }, + "min": { + "type": "integer", + "description": "The minimum length of the string." + }, + "max": { + "type": "integer", + "description": "The maximum length of the string." + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "color" + } + } + }, + "then": { + "properties": { + "default": { + "type": "string", + "pattern": "^#([0-9a-fA-F]{2}){1,4}$" + }, + "allowTransparency": { + "type": "boolean", + "description": "Determines whether the transparency/opacity/alpha value can be changed when choosing a color" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "color" + }, + "allowTransparency": { + "const": false + } + } + }, + "then": { + "properties": { + "default": { + "type": "string", + "pattern": "^#([0-9a-fA-F]{2}){1,3}$" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "integer" + } + } + }, + "then": { + "properties": { + "default": { + "type": "integer" + }, + "min": { + "type": "integer", + "description": "The minimum value of the integer." + }, + "max": { + "type": "integer", + "description": "The maximum value of the integer." + } + } + } + } + ], + "required": ["name", "id", "type", "default"], + "additionalProperties": false + } + }, + "properties": { + "$schema": { + "type": "string", + "description": "The URL to the schema." + }, + "name": { + "type": "string", + "description": "The name of the addon. Don't make it too long.", + "minLength": 1 + }, + "description": { + "type": "string", + "description": "The description of the addons. Any credits and attributions also belong here.", + "minLength": 1 + }, + "tags": { + "type": "array", + "description": "Tags which are used for filtering and badges on the Scratch Addons settings page.", + "items": { + "type": "string", + "description": "A tag.", + "enum": [ + "community", + "editor", + "player", + "popup", + "theme", + "beta", + "danger", + "recommended", + "featured", + "forums", + "easterEgg", + "codeEditor", + "costumeEditor", + "editorMenuBar", + "projectPage", + "profiles", + "studios", + "comments" + ] + }, + "contains": { + "enum": [ + "community", + "editor", + "player", + "popup" + ] + }, + "minItems": 1 + }, + "permissions": { + "type": "array", + "description": "You can specify permissions by providing a \"permissions\" array.", + "items": { + "type": "string", + "description": "A permission.", + "enum": ["notifications", "clipboardWrite"] + }, + "minItems": 1 + }, + "userscripts": { + "type": "array", + "description": "You can add userscripts by providing a \"userscripts\" array.\nUnlike persistent scripts, this is an array of objects, not strings.\nEach object must specify the url to the userscript through the \"url\" property, and provide an array of URL matches.", + "items": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The path to the userscript.", + "pattern": "\\.js$" + }, + "matches": { + "$ref": "#/definitions/matches" + }, + "runAtComplete": { + "type": "boolean", + "description": "Determines whether the addon should be run after the document is complete loading." + }, + "if": { + "$ref": "#/definitions/if" + } + }, + "required": ["url", "matches"], + "additionalProperties": false + }, + "minItems": 1 + }, + "userstyles": { + "type": "array", + "description": "Similarly to userscripts, you can specify a \"userstyles\" array.\nEach object must specify the url to the stylesheet through the \"url\" property, and provide an array of URL matches.", + "items": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The path to the userstyle.", + "pattern": "\\.css$" + }, + "matches": { + "$ref": "#/definitions/matches" + }, + "if": { + "$ref": "#/definitions/if" + } + }, + "required": ["url", "matches"], + "additionalProperties": false + }, + "minItems": 1 + }, + "settings": { + "type": "array", + "description": "The \"settings\" object allow the addon's users to specify settings in Scratch Addons' settings panel. Inside your persistent scripts and userscripts, you can then access those settings with the \"addon.settings\" API.\nSpecify an \"settings\" property and provide an array of setting objects.", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/tableNestableSettings" + }, + { + "type": "object", + "description": "A table setting.", + "properties": { + "name": { + "type": "string", + "description": "The name of the setting.", + "minLength": 1 + }, + "id": { + "type": "string", + "description": "The identifier of the setting to get the specified value from your code.", + "minLength": 1 + }, + "type": { + "type": "string", + "const": "table" + }, + "default": { + "type": "array", + "description": "The array that contains default table items.", + "items": { + "$ref": "#/definitions/serializedTableNestableSettings" + } + }, + "if": { + "$ref": "#/definitions/if" + }, + "row": { + "type": "array", + "description": "The rows of the table. The ordering is used in default and presets.", + "items": { + "$ref": "#/definitions/tableNestableSettings" + }, + "minItems": 1 + }, + "presets": { + "type": "array", + "description": "The table presets.", + "items": { + "type": "object", + "description": "The table preset.", + "properties": { + "name": { + "type": "string" + }, + "values": { + "$ref": "#/definitions/serializedTableNestableSettings" + } + }, + "additionalProperties": false, + "required": ["name", "values"] + } + } + }, + "additionalProperties": false, + "required": ["name", "id", "type", "row"] + } + ] + }, + "minItems": 1 + }, + "credits": { + "type": "array", + "description": "An array containing credits to the authors/contributors of the addon.", + "items": { + "type": "object", + "description": "A credited author/contributor.", + "properties": { + "name": { + "type": "string", + "description": "The name of the credited person.", + "minLength": 1 + }, + "link": { + "type": "string", + "description": "The link relevant to the credit.", + "pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$" + }, + "id": { + "type": "string", + "description": "The ID for the credit. Required if note is in use." + }, + "note": { + "type": "string", + "description": "The note for the credit." + } + }, + "allOf": [ + { + "if": { + "required": ["note"] + }, + "then": { + "required": ["id"] + } + } + ], + "required": ["name"], + "additionalProperties": false + }, + "minItems": 1 + }, + "enabledByDefault": { + "type": "boolean", + "description": "You can provide the \"enabledByDefault\" property and set it to true. Its default value is false.\nKeep in mind, few addons will be enabled by default. If you want your addon to be enabled by default, please open a discussion issue.", + "default": false + }, + "presets": { + "type": "array", + "description": "An array containing presets for settings.", + "items": { + "type": "object", + "description": "A preset.", + "properties": { + "name": { + "type": "string", + "description": "The name of the preset.", + "minLength": 1 + }, + "id": { + "type": "string", + "description": "The identifier of the preset.", + "minLength": 1 + }, + "description": { + "type": "string", + "description": "The description of the preset.", + "minLength": 1 + }, + "values": { + "type": "object", + "description": "An object containing preset values of the settings.", + "patternProperties": { + ".*": { + "description": "The preset value of the setting.", + "anyOf": [ + { + "$ref": "#/definitions/serializedTableNestableSetting" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/serializedTableNestableSettings" + }, + "minItems": 1 + } + ] + } + }, + "minProperties": 1 + } + }, + "required": ["name", "id", "values"], + "additionalProperties": false + }, + "minItems": 1 + }, + "libraries": { + "type": "array", + "description": "An array of libraries that the addon uses", + "items": { + "type": "string", + "description": "A library identifier.", + "minLength": 1 + }, + "minItems": 1 + }, + "info": { + "type": "array", + "description": "An array of additional information (e.g. warnings, notices) about the addon.", + "items": { + "type": "object", + "description": "Information about the addon.", + "properties": { + "type": { + "type": "string", + "description": "Type of the information.", + "enum": ["warning", "notice", "info"], + "minLength": 1 + }, + "id": { + "type": "string", + "description": "ID of the information.", + "minLength": 1 + }, + "text": { + "type": "string", + "description": "Text of the information.", + "minLength": 1 + } + }, + "required": ["id", "text"], + "additionalProperties": false + }, + "minItems": 1 + }, + "popup": { + "items": { + "type": "object", + "description": "An object for the popup.", + "properties": { + "icon": { + "type": "string", + "description": "The path to the popup icon.", + "minLength": 1 + }, + "name": { + "type": "string", + "description": "The name of the popup.", + "minLength": 1 + }, + "fullscreen": { + "type": "boolean", + "description": "Determines whether to show the fullscreen button.", + "default": false + }, + "html": { + "type": "string", + "description": "The filename of the popup page.", + "minLength": 1 + }, + "script": { + "type": "string", + "description": "The filename of the popup script.", + "minLength": 1 + } + }, + "minItems": 1, + "required": ["icon", "name", "html", "script"] + } + }, + "dynamicDisable": { + "type": "boolean", + "description": "Determines whether the addon's scripts should be considered disabled when disabled as the page is running.", + "default": false + }, + "dynamicEnable": { + "type": "boolean", + "description": "Determines whether the addon's scripts should be considered enabled when enabled as the page is running.", + "default": false + }, + "injectAsStyleElt": { + "type": "boolean", + "description": "Determines whether the addon's userstyles should be injected as style elements rather than link elements.", + "default": false + }, + "updateUserstylesOnSettingsChange": { + "type": "boolean", + "description": "Determines whether the addon's userstyles should be removed and rematched to the new settings.", + "default": false + }, + "customCssVariables": { + "type": "array", + "description": "An array of CSS variables the addon defines.", + "items": { + "type": "object", + "description": "A CSS variable.", + "properties": { + "name": { + "type": "string", + "description": "The name of the CSS variable.", + "minLength": 1, + "pattern": "^[\\w-]+$" + }, + "value": { + "$ref": "#/definitions/cssManipulator" + }, + "dropNull": { + "type": "boolean", + "description": "Whether to drop the variable entirely when it evaluates to null." + } + }, + "required": ["name", "value"] + } + }, + "versionAdded": { + "type": "string", + "description": "The version that introduced the addon.", + "pattern": "^1\\.\\d+\\.\\d+$" + }, + "addonPreview": { + "type": "object", + "description": "The preview used for the addon.", + "properties": { + "type": { + "type": "string", + "description": "The type of the preview." + } + }, + "required": ["type"], + "additionalProperties": false + }, + "presetPreview": { + "type": "object", + "description": "The preview used for presets.", + "properties": { + "type": { + "type": "string", + "description": "The type of the preview." + }, + "colors": {} + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "palette" + } + } + }, + "then": { + "properties": { + "colors": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + ], + "required": ["type"], + "additionalProperties": false + }, + "latestUpdate": { + "type": "object", + "description": "The information about the latest update.", + "properties": { + "version": { + "type": "string", + "description": "The version of the update." + }, + "isMajor": { + "type": "boolean", + "description": "Whether to list the addon on \"Featured new addons and updates\"." + }, + "temporaryNotice": { + "type": "string", + "description": "The notice describing the update." + }, + "newSettings": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The array of new setting IDs." + } + }, + "additionalProperties": false, + "required": ["version"] + } + }, + "required": ["name", "description", "tags", "versionAdded"], + "additionalProperties": false +} From 5390167a60ae5d9a8677d42d47de1a6ae6558eaf Mon Sep 17 00:00:00 2001 From: cobalt <61329810+cobaltt7@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:33:33 -0500 Subject: [PATCH 2/5] Update 1/1.23.json --- 1/1.23.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1/1.23.json b/1/1.23.json index 7a42569..0391108 100644 --- a/1/1.23.json +++ b/1/1.23.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/ScratchAddons/manifest-schema/master/1/1.22.json", + "$id": "https://raw.githubusercontent.com/ScratchAddons/manifest-schema/master/1/1.23.json", "title": "Scratch Addons addon manifest", "description": "The manifest that describes an addon.", "type": "object", From 15bba44fbabcce1a936b0be1467d4d7ac6240e52 Mon Sep 17 00:00:00 2001 From: Samq64 <81489795+Samq64@users.noreply.github.com> Date: Fri, 2 May 2025 18:01:40 -0400 Subject: [PATCH 3/5] Boolean addonPreview, Re-add presetPreview validation --- 1/1.23.json | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/1/1.23.json b/1/1.23.json index 0391108..053f8d4 100644 --- a/1/1.23.json +++ b/1/1.23.json @@ -989,16 +989,9 @@ "pattern": "^1\\.\\d+\\.\\d+$" }, "addonPreview": { - "type": "object", - "description": "The preview used for the addon.", - "properties": { - "type": { - "type": "string", - "description": "The type of the preview." - } - }, - "required": ["type"], - "additionalProperties": false + "type": "boolean", + "description": "Whether the addon has a preview.", + "default": false }, "presetPreview": { "type": "object", @@ -1006,7 +999,8 @@ "properties": { "type": { "type": "string", - "description": "The type of the preview." + "description": "The type of the preview.", + "enum": ["palette", "stage-monitor-preset"] }, "colors": {} }, From a8199e80f4e18b81443cfab6dbd765f7d671decc Mon Sep 17 00:00:00 2001 From: Samq64 <81489795+Samq64@users.noreply.github.com> Date: Fri, 2 May 2025 18:33:29 -0400 Subject: [PATCH 4/5] Add relatedAddons, remove popup script/html --- 1/1.23.json | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/1/1.23.json b/1/1.23.json index 053f8d4..e0ed719 100644 --- a/1/1.23.json +++ b/1/1.23.json @@ -923,20 +923,10 @@ "type": "boolean", "description": "Determines whether to show the fullscreen button.", "default": false - }, - "html": { - "type": "string", - "description": "The filename of the popup page.", - "minLength": 1 - }, - "script": { - "type": "string", - "description": "The filename of the popup script.", - "minLength": 1 } }, "minItems": 1, - "required": ["icon", "name", "html", "script"] + "required": ["icon", "name"] } }, "dynamicDisable": { @@ -1054,6 +1044,15 @@ }, "additionalProperties": false, "required": ["version"] + }, + "relatedAddons": { + "type": "array", + "description": "The list of related addons.", + "items": { + "type": "string", + "description": "An addon ID.", + "pattern": "^[a-z0-9-]+$" + } } }, "required": ["name", "description", "tags", "versionAdded"], From e74537b474fe0d672cfea00359bd727bff04adbf Mon Sep 17 00:00:00 2001 From: Samq64 <81489795+Samq64@users.noreply.github.com> Date: Fri, 2 May 2025 19:03:32 -0400 Subject: [PATCH 5/5] Better relatedAddons description --- 1/1.23.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1/1.23.json b/1/1.23.json index e0ed719..5f5c794 100644 --- a/1/1.23.json +++ b/1/1.23.json @@ -1047,7 +1047,7 @@ }, "relatedAddons": { "type": "array", - "description": "The list of related addons.", + "description": "The list of related addons displayed on the settings page.", "items": { "type": "string", "description": "An addon ID.",