{
	"$schema": "http://json-schema.org/draft-07/schema#",
	"type": "object",
	"properties": {
		"meta": {
			"description": "Optional metadata to include in the manifest file.",
			"type": "object",
			"properties": {
				"authors": {
					"description": "The names of the authors of this registry.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"bugs": {
					"description": "Where users should report bugs.",
					"type": "string"
				},
				"description": {
					"description": "A description of the registry.",
					"type": "string"
				},
				"homepage": {
					"description": "The URL to the registry homepage.",
					"type": "string",
					"format": "uri"
				},
				"repository": {
					"description": "The source repository for the registry. (Omit this if you are distributing from a git repository)",
					"type": "string",
					"format": "uri"
				},
				"tags": {
					"description": "Keywords that describe your registry.",
					"type": "array",
					"items": {
						"type": "string"
					}
				}
			}
		},
		"peerDependencies": {
			"description": "A list of dependencies that are not installed by blocks or config files but are required for your registry to function in users projects.",
			"type": "object",
			"additionalProperties": {
				"oneOf": [
					{
						"type": "string",
						"description": "The version or version range that is supported by your registry."
					},
					{
						"type": "object",
						"properties": {
							"version": {
								"type": "string",
								"description": "The version or version range that is supported by your registry."
							},
							"message": {
								"type": "string",
								"description": "A message displayed to users when installing with an incompatible peer dependency."
							}
						},
						"required": ["version", "message"],
						"additionalProperties": false
					}
				]
			}
		},
		"configFiles": {
			"description": "Any config files that should be included when initializing the registry.",
			"type": "array",
			"items": {
				"type": "object",
				"properties": {
					"name": {
						"description": "Name of the config file.",
						"type": "string"
					},
					"path": {
						"description": "Path where the config file lives.",
						"type": "string"
					},
					"expectedPath": {
						"description": "Path to default to searching in the users project.",
						"type": "string"
					},
					"optional": {
						"description": "Config file is optional and the user will be prompted accordingly.",
						"type": "boolean",
						"default": false
					}
				},
				"required": ["name", "path"]
			}
		},
		"dirs": {
			"description": "Directories that contain the categories you want to build into the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"outputDir": {
			"description": "The directory to output the registry to. (Copies ngm-dev-cli-manifest.json + all required files)",
			"type": "string"
		},
		"includeBlocks": {
			"description": "The names of the blocks that should be included in the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"includeCategories": {
			"description": "The names of the categories that should be included in the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"excludeBlocks": {
			"description": "The names of the blocks that should not be included in the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"excludeCategories": {
			"description": "The names of the categories that should not be included in the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"listBlocks": {
			"description": "List only the blocks with these names.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"listCategories": {
			"description": "List only the categories with these names.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"doNotListBlocks": {
			"description": "Do not list the blocks with these names.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"doNotListCategories": {
			"description": "Do not list the categories with these names.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"excludeDeps": {
			"description": "Remote dependencies that should not be added to the manifest.",
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"allowSubdirectories": {
			"description": "Allow subdirectories to be built.",
			"type": "boolean",
			"default": false
		},
		"preview": {
			"description": "Display a preview of the blocks list.",
			"type": "boolean",
			"default": false
		},
		"rules": {
			"description": "Configure rules when checking manifest after build.",
			"type": "object",
			"properties": {
				"no-category-index-file-dependency": {
					"description": "Disallow depending on the index file of a category.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				},
				"no-unpinned-dependency": {
					"description": "Require all dependencies to have a pinned version.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				},
				"require-local-dependency-exists": {
					"description": "Require all local dependencies to exist.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "error"
				},
				"max-local-dependencies": {
					"description": "Enforces a limit on the amount of local dependencies a block can have.",
					"type": "array",
					"items": [
						{
							"type": "string",
							"enum": ["error", "warn", "off"],
							"default": "warn"
						},
						{
							"description": "Max local dependencies",
							"type": "number",
							"default": 10
						}
					],
					"default": ["warn", 10]
				},
				"no-circular-dependency": {
					"description": "Disallow circular dependencies.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "error"
				},
				"no-unused-block": {
					"description": "Disallow unused blocks. (Not listed and not a dependency of another block)",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				},
				"no-framework-dependency": {
					"description": "Disallow frameworks (Svelte, Vue, React, etc.) as dependencies.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				},
				"require-config-file-exists": {
					"description": "Require all of the paths listed in `configFiles` to exist.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "error"
				},
				"no-config-file-framework-dependency": {
					"description": "Disallow frameworks (Svelte, Vue, React, etc.) as dependencies of config files.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				},
				"no-config-file-unpinned-dependency": {
					"description": "Require all dependencies of config files to have a pinned version.",
					"type": "string",
					"enum": ["error", "warn", "off"],
					"default": "warn"
				}
			},
			"default": {
				"no-category-index-file-dependency": "warn",
				"no-unpinned-dependency": "warn",
				"require-local-dependency-exists": "error",
				"max-local-dependencies": ["warn", 10],
				"no-circular-dependency": "error",
				"no-unused-block": "warn",
				"no-framework-dependency": "warn",
				"require-config-file-exists": "error",
				"no-config-file-framework-dependency": "warn",
				"no-config-file-unpinned-dependency": "warn"
			}
		}
	},
	"required": ["dirs"]
}
