{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/commandbox-box-json/latest.json",
  "title": "Package Manifest",
  "description": "Configuration file for a CFML package",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/Ortus-Solutions/vscode-commandbox/master/resources/schemas/box.schema.json",
    "sourceSha256": "55e699abfe66ad5141d0da385f67c88141443a0038b5784e6a88e7d1b8b29d23"
  },
  "type": "object",
  "properties": {
    "name": {
      "title": "Name",
      "description": "The name of the package",
      "type": "string",
      "default": ""
    },
    "slug": {
      "title": "Slug",
      "description": "ForgeBox unique slug",
      "type": "string",
      "pattern": "^[\\w@-]*$",
      "maxLength": 250,
      "default": ""
    },
    "version": {
      "title": "Version",
      "description": "Semantic version of your package",
      "type": "string",
      "default": ""
    },
    "author": {
      "title": "Author",
      "description": "Author of this package",
      "type": "string",
      "default": ""
    },
    "location": {
      "title": "Location",
      "description": "Location of where to download the package. Overrides ForgeBox location",
      "type": "string",
      "default": ""
    },
    "directory": {
      "title": "Directory",
      "description": "Install directory where this package should be placed once installed. If not defined, it installs were the CommandBox command was executed.",
      "type": "string",
      "default": ""
    },
    "createPackageDirectory": {
      "title": "Create Package Directory",
      "description": "This determines if the container directory will contain a sub-directory according to the package slug name. The default is true",
      "type": "boolean",
      "default": true
    },
    "packageDirectory": {
      "title": "Package Directory",
      "description": "This name will be used for the package sub-directory instead of the slug name",
      "type": "string",
      "default": ""
    },
    "homepage": {
      "title": "Homepage",
      "description": "Project homepage URL",
      "type": "string",
      "format": "uri"
    },
    "documentation": {
      "title": "Documentation",
      "description": "Documentation URL",
      "type": "string",
      "format": "uri"
    },
    "repository": {
      "title": "Repository",
      "description": "Source repository",
      "type": "object",
      "properties": {
        "type": {
          "title": "Repository Type",
          "description": "The version control system. Popular examples are git, svn, or mercurial",
          "type": "string",
          "default": ""
        },
        "url": {
          "title": "Repository URL",
          "description": "The URL at which the repository resides",
          "type": "string",
          "format": "uri"
        }
      }
    },
    "bugs": {
      "title": "Bugs",
      "description": "Bug issue management URL",
      "type": "string",
      "format": "uri"
    },
    "shortDescription": {
      "title": "Short Description",
      "description": "ForgeBox short description",
      "type": "string",
      "default": ""
    },
    "description": {
      "title": "Description",
      "description": "ForgeBox big description. If not set, it can be taken from a Readme.md, Readme, or Readme.txt",
      "type": "string",
      "default": ""
    },
    "instructions": {
      "title": "Instructions",
      "description": "Install instructions. If not set, it can be taken from a instructions.md, instructions, or instructions.txt",
      "type": "string",
      "default": ""
    },
    "changelog": {
      "title": "Change Log",
      "description": "Change log. If not set, it can be taken from a changelog.md, changelog, or changelog.txt",
      "type": "string",
      "default": ""
    },
    "type": {
      "title": "Type",
      "description": "ForgeBox contribution type",
      "type": "string",
      "enum": [
        "caching",
        "cf-engines",
        "cfbuilder-extensions",
        "cfwheels-plugins",
        "cms",
        "commandbox-commands",
        "commandbox-modules",
        "commandbox-recipes",
        "contentbox-modules",
        "contentbox-themes",
        "contentbox-widgets",
        "demos",
        "di",
        "interceptors",
        "logging",
        "lucee-extensions",
        "messaging-queues",
        "modules",
        "mvc",
        "nosql",
        "plugins",
        "preside-extensions",
        "preside-skeletons",
        "projects",
        "testing",
        "wirebox-aspects",
        "wirebox-listeners"
      ]
    },
    "keywords": {
      "title": "Keywords",
      "description": "ForgeBox keywords",
      "type": [
        "array",
        "string"
      ],
      "items": {
        "title": "Keyword",
        "description": "ForgeBox keyword",
        "type": "string"
      },
      "default": []
    },
    "private": {
      "title": "Private",
      "description": "Designates the package as a private ForgeBox package. Private packages are not publicly accessible, but still offer all the benefits of ForgeBox.",
      "type": "boolean",
      "default": false
    },
    "engines": {
      "title": "Engines",
      "description": "CFML engines the package supports",
      "type": "array",
      "items": {
        "$ref": "#/$defs/engine"
      },
      "default": []
    },
    "defaultEngine": {
      "description": "The name of the default CFML engine for the `start` command to use.",
      "type": "string"
    },
    "defaultPort": {
      "description": "Deprecated. The HTTP port the server will be started on when you use the start command. Use `port` in `server.json` instead.",
      "type": "number"
    },
    "projectURL": {
      "title": "Project URL",
      "description": "Default project URL if not using CommandBox start server commands",
      "type": "string",
      "format": "uri"
    },
    "license": {
      "title": "Licenses",
      "description": "List of licenses the package can have",
      "type": "array",
      "items": {
        "title": "License",
        "description": "A license the package can have",
        "type": "object",
        "properties": {
          "type": {
            "title": "License Type",
            "description": "The license type. For example, MIT.",
            "type": "string",
            "default": ""
          },
          "url": {
            "title": "License URL",
            "description": "The URL at which the license resides",
            "type": "string",
            "format": "uri"
          }
        }
      },
      "default": []
    },
    "contributors": {
      "title": "Contributors",
      "description": "Contributors to the package",
      "type": "array",
      "items": {
        "$ref": "#/$defs/person"
      },
      "default": []
    },
    "dependencies": {
      "$ref": "#/$defs/dependency"
    },
    "devDependencies": {
      "$ref": "#/$defs/dependency"
    },
    "installPaths": {
      "title": "Install Paths",
      "description": "Tracks install locations so uninstall can work. The key is the package name/slug and the value is the path",
      "type": "object",
      "default": {},
      "additionalProperties": {
        "type": "string"
      }
    },
    "scripts": {
      "title": "Scripts",
      "description": "Set of script commands that correspond to the interception points in CommandBox or arbitrary names that can be run with the `run-script` command",
      "type": "object",
      "properties": {
        "preInstall": {
          "description": "Run BEFORE the package is installed",
          "type": "string"
        },
        "onInstall": {
          "description": "Run WHILE the package is installed",
          "type": "string"
        },
        "postInstall": {
          "description": "Run AFTER the package is installed",
          "type": "string"
        },
        "preUninstall": {
          "description": "Run BEFORE the package is uninstalled",
          "type": "string"
        },
        "postUninstall": {
          "description": "Run AFTER the package is uninstalled",
          "type": "string"
        },
        "preVersion": {
          "description": "Run BEFORE bump the package version",
          "type": "string"
        },
        "postVersion": {
          "description": "Run AFTER bump the package version, but BEFORE Git repo is tagged",
          "type": "string"
        },
        "onRelease": {
          "description": "Run AFTER bump the package version and AFTER Git repo is tagged",
          "type": "string"
        },
        "prePublish": {
          "description": "Run BEFORE the package is published",
          "type": "string"
        },
        "postPublish": {
          "description": "Run AFTER the package is published",
          "type": "string"
        }
      },
      "default": {},
      "additionalProperties": {
        "type": "string"
      }
    },
    "ignore": {
      "title": "Ignore",
      "description": "List of file globs to ignore when installing the package similar to .gitignore patterns",
      "type": "array",
      "items": {
        "description": "Ignore glob pattern",
        "type": "string"
      },
      "default": []
    },
    "testbox": {
      "title": "TestBox",
      "description": "TestBox integration",
      "type": "object",
      "properties": {
        "runner": {
          "title": "TestBox Runner",
          "description": "The URI location of the test runner for an app or several with slug names",
          "type": [
            "string",
            "array"
          ],
          "items": {
            "description": "The runner URIs mapped to slug names",
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "format": "uri"
        },
        "labels": {
          "title": "Labels List",
          "description": "A list of labels to only include when running the tests",
          "type": [
            "string",
            "array"
          ],
          "items": {
            "description": "A label a spec must have to be ran",
            "type": "string"
          }
        },
        "excludes": {
          "title": "Exclude List",
          "description": "A list of labels to exclude when running the tests",
          "type": [
            "string",
            "array"
          ],
          "items": {
            "description": "A label to be excluded from the test run",
            "type": "string"
          }
        }
      }
    },
    "cfmigrations": {
      "title": "CF Migrations",
      "description": "Configuration object for CF Migration database settings.",
      "type": "object",
      "properties": {
        "migrationsDirectory": {
          "title": "Migrations Directory",
          "description": "Location of generated migration files that migration commands will use.",
          "type": "string"
        },
        "schema": {
          "title": "Database Schema",
          "type": "string"
        },
        "connectionInfo": {
          "title": "Migrations Directory",
          "description": "Location of generated migration files that migration commands will use.",
          "type": "object",
          "properties": {
            "password": {
              "title": "Database Password",
              "type": "string"
            },
            "connectionString": {
              "title": "Database Connection String",
              "type": "string"
            },
            "class": {
              "title": "Database class",
              "type": "string"
            },
            "username": {
              "title": "Database Username",
              "type": "string"
            }
          }
        },
        "defaultGrammar": {
          "title": "Default Grammar",
          "description": "Name of the qb service to use for grammar.",
          "type": "string",
          "enum": [
            "AutoDiscover@qb",
            "BaseGrammar@qb",
            "MySQLGrammar@qb",
            "OracleGrammar@qb",
            "PostgresGrammar@qb",
            "SqlServerGrammar@qb"
          ]
        }
      }
    }
  },
  "$defs": {
    "engine": {
      "description": "CFML engine the package supports",
      "type": "object",
      "properties": {
        "type": {
          "title": "Engine Type",
          "description": "The name of the engine",
          "type": "string",
          "enum": [
            "railo",
            "lucee",
            "adobe"
          ]
        },
        "version": {
          "title": "Engine Version",
          "description": "The semantic version of the engine that is supported",
          "type": "string",
          "default": ""
        }
      }
    },
    "dependency": {
      "title": "Dependency",
      "description": "Dependencies are specified with a package name/slug to version range, local file path, URL, or Git/SVN endpoint. The version range is a string which has one or more space-separated descriptors.",
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "person": {
      "description": "A person who has been involved in creating or maintaining this package",
      "type": [
        "object",
        "string"
      ],
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "description": "Name of the person",
          "type": "string"
        },
        "url": {
          "description": "URL for the person",
          "type": "string",
          "format": "uri"
        },
        "email": {
          "description": "Email address of the person",
          "type": "string",
          "format": "email"
        }
      }
    }
  }
}
