{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://api-evangelist.com/nestjs/json-schema/nest-cli-config.json",
  "title": "NestJS CLI Configuration (nest-cli.json)",
  "description": "JSON Schema for the nest-cli.json configuration file used by the NestJS CLI for project management, compilation, and monorepo/workspace settings.",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string",
      "description": "JSON Schema reference"
    },
    "collection": {
      "type": "string",
      "default": "@nestjs/schematics",
      "description": "Schematics collection to use for generating components"
    },
    "sourceRoot": {
      "type": "string",
      "default": "src",
      "description": "Root directory for source files"
    },
    "root": {
      "type": "string",
      "default": "",
      "description": "Root directory of the project (monorepo)"
    },
    "entryFile": {
      "type": "string",
      "default": "main",
      "description": "Entry file name (without extension)"
    },
    "monorepo": {
      "type": "boolean",
      "default": false,
      "description": "Whether this is a monorepo workspace"
    },
    "language": {
      "type": "string",
      "enum": ["ts", "js"],
      "default": "ts",
      "description": "Programming language"
    },
    "compilerOptions": {
      "type": "object",
      "description": "Compiler settings for nest build",
      "properties": {
        "tsConfigPath": {
          "type": "string",
          "default": "tsconfig.build.json",
          "description": "Path to TypeScript configuration"
        },
        "webpack": {
          "type": "boolean",
          "default": false,
          "description": "Use webpack for compilation"
        },
        "webpackConfigPath": {
          "type": "string",
          "default": "webpack.config.js",
          "description": "Path to webpack configuration"
        },
        "plugins": {
          "type": "array",
          "description": "NestJS CLI plugins (e.g., @nestjs/swagger)",
          "items": {
            "oneOf": [
              {
                "type": "string",
                "description": "Plugin package name"
              },
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Plugin package name"
                  },
                  "options": {
                    "type": "object",
                    "description": "Plugin-specific options",
                    "properties": {
                      "dtoFileNameSuffix": {
                        "type": "array",
                        "items": { "type": "string" },
                        "default": [".dto.ts", ".entity.ts"],
                        "description": "DTO file name suffixes for Swagger plugin"
                      },
                      "controllerFileNameSuffix": {
                        "type": "string",
                        "default": ".controller.ts"
                      },
                      "classValidatorShim": {
                        "type": "boolean",
                        "default": true
                      },
                      "dtoKeyOfComment": {
                        "type": "string",
                        "default": "description"
                      },
                      "controllerKeyOfComment": {
                        "type": "string",
                        "default": "description"
                      },
                      "introspectComments": {
                        "type": "boolean",
                        "default": false
                      }
                    },
                    "additionalProperties": true
                  }
                },
                "required": ["name"]
              }
            ]
          }
        },
        "assets": {
          "type": "array",
          "description": "Non-TypeScript assets to distribute",
          "items": {
            "oneOf": [
              {
                "type": "string",
                "description": "Glob pattern for assets"
              },
              {
                "type": "object",
                "properties": {
                  "include": {
                    "type": "string",
                    "description": "Glob pattern"
                  },
                  "exclude": {
                    "type": "string",
                    "description": "Exclusion glob pattern"
                  },
                  "outDir": {
                    "type": "string",
                    "description": "Output directory"
                  },
                  "watchAssets": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": ["include"]
              }
            ]
          }
        },
        "watchAssets": {
          "type": "boolean",
          "default": false,
          "description": "Watch non-TS assets in watch mode"
        },
        "deleteOutDir": {
          "type": "boolean",
          "default": false,
          "description": "Delete output directory before build"
        },
        "builder": {
          "type": "string",
          "enum": ["tsc", "webpack", "swc"],
          "default": "tsc",
          "description": "Builder to use for compilation"
        },
        "typeCheck": {
          "type": "boolean",
          "default": false,
          "description": "Enable type checking (when using SWC builder)"
        }
      }
    },
    "generateOptions": {
      "type": "object",
      "description": "Default options for nest generate command",
      "properties": {
        "spec": {
          "type": "boolean",
          "default": true,
          "description": "Generate spec/test files"
        },
        "flat": {
          "type": "boolean",
          "default": false,
          "description": "Generate without subdirectory"
        },
        "baseDir": {
          "type": "string",
          "description": "Base directory for generating"
        }
      }
    },
    "projects": {
      "type": "object",
      "description": "Projects in a monorepo workspace",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": ["application", "library"],
            "description": "Project type"
          },
          "root": {
            "type": "string",
            "description": "Project root directory"
          },
          "entryFile": {
            "type": "string",
            "default": "main",
            "description": "Entry file for the project"
          },
          "sourceRoot": {
            "type": "string",
            "description": "Source root for the project"
          },
          "compilerOptions": {
            "type": "object",
            "properties": {
              "tsConfigPath": { "type": "string" },
              "webpack": { "type": "boolean" }
            }
          }
        },
        "required": ["type", "root", "sourceRoot"]
      }
    }
  },
  "additionalProperties": true
}
